Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3492 posts.

Python для новичков » Помощь с UI » Июль 26, 2015 14:24:57

Добрый день.
Прошу подсказать как я могу вернуть path с функции которая открывает файловый браузер в PYQT
и использовать его в переменной.
функция:
def pushButton_Clicked():
data_dir = QtGui.QFileDialog.getOpenFileName()
ui.textEdit_2.setText(("Файн выбран - "+ data_dir) )
листенер:
QtCore.QObject.connect(ui.pushButton_chose_fifle, QtCore.SIGNAL("clicked()"),pushButton_Clicked)

Обсуждение новостей » Правила раздела » Июль 23, 2015 10:24:07

В дополнении к уже существующим общим правилам поведения на форуме добавляются правила конкретно этого раздела:
* при создании топика темой должна быть оригинальное название статьи/материала
* ссылка на источник новости/статьи обязательна и должна указываться в начале сообщения
* крайне желательно вести обсуждение в рамках темы топика

Python для новичков » Версия питона в Wing ide на ubuntu » Июль 21, 2015 10:54:33

Всем привет. Как можно поменять версию питона в wing ide на ubuntu?

Python для новичков » Телеграм бот и асинхронность » Июль 19, 2015 18:32:07

пытаюсь создать, для начала чтоб размять мозги, бота в телеграме,
нашел на гитхабе апи, пытаюсь разобратся как оно работает
в начале объявляется обычный класс бота, а в конце, с 427 строки, “асинхронный”
так вот, правильно ли я понимаю, что он каждый раз новый создает тред, при вызове любого метода, что под декоратором, асинхронность в плате того что задачи выполняются независимо друг от друга выполняется, но это не есть асинхронность в чистом виде..
в таком случае не будет ли это слишком затратно?
вот код апи

GUI » Python 3 + PyGObject Как графически отобразить процесс инициализации класса » Июль 18, 2015 16:46:17

Есть основной класс окна, возможно ли отобразить процесс инициализации этого окна (класса) в другом не модальном окне в виде прогресса т.е. все что есть в
def __init__(self):
Отобразить прогресбаром в другом окне?
Надеюсь понятно изложил вопрос)

Думаю, что гдето рядом, но…
import time
import threading
from gi.repository import Gtk, GLib, GObject
class ProgressBarWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ProgressWin")
        self.set_border_width(20)
        self.connect("delete-event", self.del_progress, 1)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)
        self.progressbar = Gtk.ProgressBar()
        vbox.pack_start(self.progressbar, True, True, 0)
        self.show_all()
        threading.Thread(target=Gtk.main).start()
    def del_progress(self, *args):
        if args[2] == 1:
            self.destroy()
    def on_activity(self, *args):
        self.progressbar.set_fraction(args[0])
class TopWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="TopWin")
        self.s = ProgressBarWindow()
        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.20)
        self.connect("delete-event", self.close_main_window, 2)
        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.40)
        self.set_border_width(5)
        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.60)
        self.set_default_size(200, 150)
        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 0.80)
        self.spinner = Gtk.Spinner()
        self.spinner.start()
        time.sleep(1)
        GLib.idle_add(self.s.on_activity, 1.00)
        self.add(self.spinner)
        self.show_all()
        self.s.destroy()
    def close_main_window(self, *args):
        if args[2] == 2:
            Gtk.main_quit()
GObject.threads_init()
TopWindow()

Web » PhantomJS не загружает страницы через прокси. » Июль 16, 2015 09:58:47

Пытаюсь загрузить страницу через прокси сервер, имеем вот такой код:

options = []
options.append('--proxy=54.173.0.135:3128')
options.append('--proxy-type=http')
options.append('--load-images=false')
options.append('--ignore-ssl-errors=true')
browser = webdriver.PhantomJS('phantomjs',service_args=options)
browser.get('https://ya.ru/')
print browser.current_url
#about:blank
По инструкции подключаю прокси, но страница не загружается (( , пробовал менять глобальную переменную export https_proxy=http://129.156.243.243:3128 но результаттакойже. Но если с этим прокси подгрузить например драйвер фаерфокса

myProxy = "182.74.40.46:8080"
proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': myProxy,
    'ftpProxy': myProxy,
    'sslProxy': myProxy,
    'noProxy': ''
    })
webdriver.Firefox(proxy=proxy)
То все начинает работать и открываться, подскажите как открыть страницу через прокси в PhantomJS

Флейм » Требуется Python программист » Июль 15, 2015 09:44:49

Для удаленной работы с индонезийской компанией требуется программист для разработки сайт с точным функционалом как edx.org.
Extending Open edx
https://github.com/edx/edx-platform/wiki/Five-ways-to-extend-edX
Theme
https://github.com/Stanford-Online/edx-theme
https://github.com/IONISx/edx-theme/

Требование: Знание Python, работа от 2 лет.

Пишите в скайп julia-235

Python для экспертов » Python прокси на Twisted. Как реализовать таблицу маршрутизации? » Июль 13, 2015 17:13:25

Из доки код прокси выглядит очень простым:
from twisted.internet import reactor
from twisted.web import proxy, server

site = server.Site(proxy.ReverseProxyResource('www.yahoo.com', 80, ''))
reactor.listenTCP(8080, site)
reactor.run()
но стоит копнуть дальше - дружелюбность доки резко прекращяется.

У меня есть некий динамический список хостов, куда надо проксировать запросы.
Есть некоторые правила, которые формируют таблицу маршрутизации.
Я хочу при запросе на твистед, формировать список хостов, брать один из них и проксировать туда.
Можно ли это сделать из коробки? Или нужно вручную выбор хоста, делать запрос через AsyncHTTPClient куда надо и возвращать данные обратно?

Python для новичков » Изменение языка в gettext » Июль 11, 2015 18:44:52

Делаю приложение на wxPython, в интерфейсе есть выбор языка, только вот как изменить его в gettext?
Инсталирую обычно:
gettext.install('myapp', './locale', unicode=True)

1)Как изменить язык на ходу?
2)Как изменить язык при инициализации?

Django » Загрузка файлов » Июль 8, 2015 22:33:52

Привет, возник следующий вопрос, как будет выполняться загрузка файлов с помощью джанги если например одновременно несколько пользователей будут загружать файлы на сервер? Если файлы будут большого объема, будет ли один пользователь дожидаться окончание загрузки файла другого пользователя?

Как я понимаю тут больше вопрос к вэб серверу, который будет использоваться.
Используется apache2. В настройках проекта прописанна следующая настройка:

WSGIDaemonProcess file_site.ru user=www-data maximum-requests=200 threads=5 display-name=%{GROUP}

GUI » PyQt5. Как открыть новое окно по нажатию на кнопку в тулбаре. » Июль 8, 2015 13:40:37

Помогите мне, пожалуйста, я хочу чтобы по нажатию на кнопку в тулбаре открывалось новое окно в котором я расположу какую-либо информацию. Вот то что я уже написал. Пока кнопка выполняет функцию выхода.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        exitAction = QAction(QIcon('RM.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Python для новичков » Штриховка в AutoCAD » Июль 7, 2015 12:34:32

Уважаемые коллеги! В наличии следующий код:
    from comtypes.client import *
    from comtypes.automation import *
    def connect_acad(self):
        errcode = 0
        try:
            self.acad = GetActiveObject("AutoCAD.Application")
        except:
            errcode = 1
        if errcode == 0:
            try:
                self.dwg = self.acad.ActiveDocument
            except:
                errcode = 2
        if errcode == 0:
            self.mspace = self.dwg.ModelSpace
        return errcode
    def mark_point(self, xy, num, lay):
        
        def point(*args):
            lst = [0.]*3
            if len(args) < 3:
                lst[0:2] = [float(x) for x in args[0:2]]
            else:
                lst = [float(x) for x in args[0:3]]
            return VARIANT(array("d",lst))
        
        txthght = 1.0
        txtshft = 0.3
        crclrd = 0.3
        p1 = point(xy[0], xy[1])
        ent = self.mspace.AddCircle(p1, crclrd)
        ent.Layer = lay
        #htch = self.mspace.AddHatch(0, 'SOLID', False)
        #htch.AppendOuterLoop(array("i", [ent,]))
        #htch.Evaluate()
        #htch.Layer = lay
        p1 = point(xy[0]+txtshft, xy[1]+txtshft)
        sh = len(num)
        if (len(self.nprefix) > 0) and (len(num.replace(self.nprefix, '')) > 3):
            sh = sh // 2
        th = string.Template('\H'+str(txthght)+';$n')
        ent = self.mspace.AddMText(p1, sh, th.substitute(n=num))
        ent.LineSpacingFactor = 0.7
        ent.Layer = lay
(Привожу сильно в сокращении - только то, что касается вопроса. Если вдруг кому интересно - полный код здесь: https://github.com/nsedenkov/py_acadcoord/blob/master/acadcoord.py) Вопрос в следующем: закоментаренные строки в функции mark_point - это попытка заштриховать окружность, создаваемую выше методом AddCircle. Сам объект “штриховка” (Hatch) создается, однако чтобы его отобразить, нужно задать внешнюю границу методом AppendOuterLoop, аргументом которого должен быть массив графических примитивов AutoCAD в обертке VARIANT (подобно тому, который возвращает функция point - с той лишь разницей, что point возвращает массив из 2 или 3 чисел float). Вот собственно и вопрос: может кто знает, как передать в метод com-интерфейса массив графических примитивов (собственно, примитив будет один - та самая окружность, которая на данном этапе висит в переменной ent)? Заранее признателен за любой совет.

Python для новичков » Вставка изображений. PIL(Pillow) » Июль 5, 2015 13:12:51

Добрый день. Играюсь с данной библиотекой и возникла “загвоздка”, не получается переместить вставляемое изображение, пишет несоответствие размеров.
Traceback (most recent call last):
  File "C:/Python34/constest/createImage.py", line 34, in <module>
    imageCreator("id_111_33333.png", 123)
  File "C:/Python34/constest/createImage.py", line 12, in imageCreator
    image.paste(qr_image, (1,0,x,y))
  File "C:\Python34\lib\site-packages\PIL\Image.py", line 1351, in paste
    self.im.paste(im, box)
ValueError: images do not match
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from PIL import ImageOps
def imageCreator(link, ident):
    size = width, height = 39, 43
    image = Image.new("1", size, "#ccc")
    qr_image = Image.open(link, 'r')
    x, y = qr_image.size
    
    image.paste(qr_image, (0,0,x,y))
    id_size = len(str(ident))
    
    if id_size:
        null = str()
        
        while id_size != 7:
            id_size +=1
            null += '0'
        ident = str(null) + str(ident)
    # draw image
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("tahoma.ttf", 9)
    draw.text((3, 33), ident, "#000", font=font)
    final_image = ImageOps.expand(image, border=1, fill='black')
    final_image.save("file.png")
    final_image.show()
imageCreator("id_111_33333.png", 123)
Пробую:
 image.paste(qr_image, (1,0,x,y))
Облазил забугорные форумы и ответники, не нашел как обойти этот, возможно “косяк” библиотеки. Спасибо.

Центр помощи » Вероятностное программирование. Апостериорные распределения вероятностей » Июль 5, 2015 13:07:42

Условие задачи:

Написанная программа:
# -*- coding: utf-8 -*-
from IPython.core.pylabtools import figsize
import numpy as np
import pymc as pm
from matplotlib import pyplot as plt
from matplotlib import rc
font = {'family': 'Verdana', 'weight': 'normal'}
rc('font', **font)
figsize(10, 5)
data = np.genfromtxt("v15.csv", skip_header = 1, dtype = int, delimiter=";")
data = data[np.argsort(data[:, 0])]
data = [d[1:] for d in data]
number_of_players = len(data)
number_of_checkpoints = len(data[0])
difficulty_checkpoint = pm.Uniform("dc", lower = 0, upper = 1, size = number_of_checkpoints)
skill_player = pm.Uniform("sp", lower = 0, upper = 1, size = number_of_players)
out = []
for i in range(number_of_players):
    out.append([0] * number_of_checkpoints)
@pm.deterministic
def theta(dc = difficulty_checkpoint, sp = skill_player):
#    out = np.zeros(number_of_checkpoints)
#    out = [d*s for s in sp for d in dc]
    for i in range(number_of_players):
        for j in range(number_of_checkpoints):
            out[i][j] = sp[i] * dc[j]
    return out
checkpoint1 = 0
checkpoint2 = 19
@pm.deterministic
def delta(dc = difficulty_checkpoint):
    return dc[checkpoint1] - dc[checkpoint2]
    
observation_player = np.arange(number_of_players * number_of_checkpoints)\
                        .reshape(number_of_players, number_of_checkpoints)
for i in range(number_of_players):
    for j in range(number_of_checkpoints):
        observation_player[i][j] = pm.Bernoulli("obs",
                                                p = theta[i][j],
                                                value = data[i][j],
                                                observed = True)
model = pm.Model([difficulty_checkpoint, skill_player, observation_player, delta])
mcmc = pm.MCMC(model)
mcmc.sample(5000, 100)
dc_samples = mcmc.trace("dc")[:]
sp_samples = mcmc.trace("sp")[:]
delta_samples = mcmc.trace("delta")[:]
print("\nВероятность, что КП_1 ЛЕГЧЕ КП_2: %.3f" % (delta_samples < 0).mean())
print("Вероятность, что КП_1 СЛОЖНЕЕ КП_2: %.3f" % (delta_samples > 0).mean())
plt.figure()
figsize(10, 6)
ax = plt.subplot(311)
ax.set_autoscaley_on(False)
for i in range(number_of_checkpoints):
    plt.hist(dc_samples.T[i], histtype='stepfilled', bins=30, alpha=0.33, normed=True)
    plt.legend(loc="upper right")
    plt.title(r"""Апостериорные распределения параметров""")
    plt.xlim([0, 1])
    plt.ylim([0, 10])
    plt.xlabel("Что это?")
plt.figure()
figsize(10, 6)
ax = plt.subplot(312)
ax.set_autoscaley_on(False)
for i in range(number_of_players):
    plt.hist(sp_samples.T[i], histtype='stepfilled', bins=30, alpha=0.33, normed=True)
    plt.legend(loc="upper right")
    plt.title(r"""Апостериорные распределения параметров""")
    plt.xlim([0, 1])
    plt.ylim([0, 10])
    plt.xlabel("А Что это?")
plt.figure()
figsize(10, 6)
ax = plt.subplot(313)
ax.set_autoscaley_on(False)
plt.hist(delta_samples, histtype='stepfilled', bins=30, alpha=0.85,
         label="Апостериорное распределение delta", color="#7A00A6", normed=True)
plt.ylim(0, 10)

Уровень сложности пар КП видно, непосредственно, из графика апост. распр. которую выводит программа.
Вопрос состоит в том, что непонятно, где и как привести примеры КП с примерно одинаковой и разной сложностями

Django » Архитектура WEB Приложения » Июль 4, 2015 17:13:17

Добрый день, собираюсь делать вэб приложение. В вкратце приложение будет таким:
1. Слушать TCP порт, на который будут приходить сообщения от некоторых устройств (какие именно устройства значение не имеет).
2. И собственно вэб морду через которую пользователи могут просматривать обработанные данные от тех сообщений.

Планирую использовать джангу, соответственно все модели, обработчики отображений будут джанговскими. Для “прослушки” TCP порта планирую использовать Tornado (дабы был ассинхронный вэб сервер) и сам сервис с торнадо планирую запускать через команду manage.py, чтобы можно было пользоваться общими моделями.

Надеюсь понятно изложил свою мысл) Или такая система уж сильный оверхед получается?

Python для новичков » python uinput » Июль 3, 2015 15:27:00

Не понимаю как работает библиотека, поиски ответов в гугле ничего не дали, примеры клавиатуры и мышки работают как надо, а вот джойстик не хочет нормально.
Если закоментировать uinput.ABS_X,uinput.ABS_Y и в events и в for цикле, то ничего не будет вообще срабатывать А так срабатывает SELECT,START,BTN1,BTN2,BTN JOYSTICK(только в конце как 4я кнопка)
Помогите пожалуйста разобраться в uinput`е.
import uinput,time
def main():
    events = (
        uinput.BTN_SELECT,
        uinput.BTN_START,
        uinput.BTN_1,        
        uinput.BTN_2,
        uinput.BTN_JOYSTICK,
        uinput.ABS_X,
        uinput.ABS_Y,
        )
    device = uinput.Device(events)
    for i in range(2):
        device.emit(uinput.ABS_X, 50, syn=False)
        device.emit(uinput.ABS_Y, 50)      
        device.emit_click(uinput.BTN_JOYSTICK,1)
        print("BTN_JOYSTICK")
        time.sleep(2)
        device.emit(uinput.BTN_JOYSTICK, 0)
        device.emit(uinput.BTN_JOYSTICK, 1)
        print("BTN_SELECT")
        time.sleep(2)
        device.emit(uinput.BTN_SELECT, 0)
        device.emit(uinput.BTN_SELECT, 1)
        print("BTN_START")		
        time.sleep(2)
        device.emit(uinput.BTN_START, 0)
        device.emit(uinput.BTN_START, 1)
        print("BTN_1")
        time.sleep(2)
        device.emit(uinput.BTN_1, 0)
        device.emit(uinput.BTN_1, 1)
        print("BTN_2")
        time.sleep(2)
        #device.emit_click(uinput.BTN_JOYSTICK)
        device.emit(uinput.BTN_2, 0)
        device.emit(uinput.BTN_2, 1)
        print("BTN_JOYSTICK")
        time.sleep(2)		
        device.emit(uinput.BTN_JOYSTICK, 0)
        device.emit(uinput.BTN_JOYSTICK, 1)
        print("END")
        time.sleep(5)
if __name__ == "__main__":
    time.sleep(4)
    main()

Django » А если появится третья модель?  » Июль 2, 2015 23:43:12


Приветствую всех!!!

from django.db import models
class Author(models.Model):
   name = models.CharField(max_length=100)
class Book(models.Model):
   author = models.ForeignKey(Author)
   title = models.CharField(max_length=100)
from django.contrib import admin
class BookInline(admin.TabularInline):
    model = Book
class AuthorAdmin(admin.ModelAdmin):
    inlines = [
        BookInline,
    ]

Инлайн будет работать только для двух моделей не более? Что делать если связанных ForeignKey моделей 3, как добавляя автора на его странице, привязать издательство из станичники редактирования модели издательство?

Центр помощи » Подскажите со скриптом » Июнь 30, 2015 19:42:01

Нужно чтоб при запуске скрипта можно было через $ прописывать домен

Введите ex: mail.domain.com
Введите ex: smtp.domain.com
Введите ex: domain.com

import socket
# Default timeout
socket.setdefaulttimeout(2.5)
class SMTPConnectionFailed(Exception):
    pass
class SMTPServer(object):
    def __init__(self, server_name, port=587, message='ehlo localhost\r\n', ipv6=False):
        self.server = server_name
        self.port = port
        self.ipv6 = ipv6
        self._tried_connection = False
        self._connection_results = None
        self._ehlo_port = None
        self._ehlo_response = None
        self._conversation = None
        self._message = message
        self._socket = None
        self._connected = False
    def get_ip_version(self):
        if self.ipv6:
            return "IPv6"
        else:
            return "IPv4"
    ip_version = property(get_ip_version)
    def get_socket(self):
        if self._socket:
            return self._socket
        else:
            if self.ipv6:
                self._socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
            else:
                self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            return self._socket
    sock = property(get_socket)
    def get_max_message_size(self):
      try:
          size_option = filter(lambda x: x.split(" ")[0] == "250-SIZE",self.ehlo_options)[0]
          splitter = "250-SIZE"
      except IndexError:
          try:
              size_option = filter(lambda x: x.split("250 SIZE")[0] == "",self.ehlo_options)[0]
              splitter = "250 SIZE"
          except IndexError:
              return 0
      size_bytes = size_option.split(splitter)[1]
      return long(size_bytes)/1024.0/1024.0
    server_max_message_size = property(get_max_message_size)
    def get_server_supports_tls(self):
      return "250-STARTTLS" in self.ehlo_options
    server_supports_tls = property(get_server_supports_tls)
    def parse_ehlo(self):
      if not self._ehlo_response:
        self._ehlo_response = self.get_ehlo()
      return filter(lambda x: x[:3] == '250',self._ehlo_response.split("\r\n"))
    ehlo_options = property(parse_ehlo)
    def get_ehlo(self):
      if not self._connected:
        self.connect()
      try:
        self.sock.send(self._message)
        return self.sock.recv(1024)
      except Exception, e:
        print str(e)
        return "ehlo failed."
    ehlo = property(get_ehlo)
    def is_open_relay(self):
      if not self._conversation:
        self._conversation = self.have_relay_conversation()
      relay_results = filter(lambda x: x.replace("-", " ").lower().find('250 ok') != -1,
                             self._conversation.split("\r\n"))[1:]
      self.close()
      if len(relay_results) > 0:
        return True
      return False
    open_relay = property(is_open_relay)
    def have_relay_conversation(self):
      if not self._connected:
          self.connect()
      self._conversation = True
      self.sock.send(self._message)
      self.sock.send("mail from: axdjdiai@akxkskd.com\n")
      self.sock.send("rcpt to: aserjslkejrlskj@laslkjelrkjlekj.com\n")
      return self.sock.recv(1024)
    def connect(self):
        if not self._connected:
            try:
              self.sock.connect((self.server, self.port))
              self._connection_results = {'connected':True, 'message':unicode(self.sock.recv(1024))}
              self._ehlo_port          = self.port
              self._connected = True
            except socket.error:
              self._connection_results = {'connected':False, 'message':u'Connection failed'}
              self._socket = None
              raise(SMTPConnectionFailed('Connection failed'))
        return self._connection_results
    def close(self):
        self.sock.send("quit")
        self._socket = None
        self._connected = False
        return True
    def get_results(self):
        self.connect()
        self.close()
        return self._connection_results
    results = property(get_results)
if __name__ == "__main__":
  server_list = [{'server_name': 'mail.fentyplacecar.ru','port': 25, 'try_v6': False},
                 {'server_name': 'smtp.fentyplacecar.ru','port': 587, 'try_v6': False},
                 {'server_name': 'fentyplacecar.ru', 'port': 25, 'try_v6': True}]
  for server in server_list:
    print("Attepmting to connect to %s on port %d" % (server['server_name'],server['port']))
    s = SMTPServer(server['server_name'], server['port'], ipv6=server['try_v6'])
    try:
        print("Open relay? %s" % s.open_relay)
        print("EHLO options: %s" % ",\n".join(s.ehlo_options))
        print("TLS Supported? %s" % s.server_supports_tls)
        print("Max message size: %d MB" % s.server_max_message_size)
        print s.results, "\n"
    except SMTPConnectionFailed as error:
        print("""Error connection failed.  This means that the server is down, or your ISP does not allow you to
                 connect to other SMTP servers on the specified port (%d) (over %s)""" % (s.port, s.ip_version))

Python проекты » Ищу стажировку на Python  » Июнь 29, 2015 09:49:34

Здравствуйте. Почитал некоторое количество тем и увидел что есть люди готовые предложить работу над проектами. Собственно ищу таких людей.

О себе:
Зовут Александр 25 лет.
Изучаю в данный момент Python. Немного знаком с JS, HTML, CSS.
Базовое знакомство с Selenium WebDriver.
Есть аккаунт на Github имя пользователя OstrikovAleksandr. Там есть пример моей работы.
Под наставничеством опытного программиста готов изучить любой язык программирования.
Готов работать удалено по 5-8 часов в день практически без выходных. А самое главное бесплатно.

Если вы готовы взять начинающего программиста для помощи над вашими проектами то я готов быть этим человеком. Мне нужен практический опыт.

Skype: D1NER0