• 03Feb

    blackCube
    Народ кубиками торгует, видать отходим мы от кризиса:
    Инструмент для убийства и обмана продаёт с аукциона сам себя
    999 чёрных кубов пытают тайной любопытных

    а так-же “Ничего” за $6,28

    Rating 3.00 out of 5
    [?]
  • 27Dec

    Я тут немного эксперементирую с GreenSock и готовлю новые интерфейсы для GFW – вот что пока получается

    Правда из библиоетчки я взял только эффекты ScrollRectPlugin и SetSizePlugin

    Rating 3.00 out of 5
    [?]
  • 21Oct

    http://shell.appspot.com/
    http://lotrepls.appspot.com/

    Rating 3.00 out of 5
    [?]
  • 08Oct

    linux

    bsd

    microsoft

    Это тематические поиски от гуглы. И я просто не смог удержатся, да простит меня дядюшка Гейтс.

    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 13Sep

    Развел небольшой холивар на своем любимом блоге.

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 26May

    obhod_vracheiпоявилась свободная минутка, решил сделать обход джанго блогов.

    И вот некоторые интересные ссылки.

    Виджет на морде. Александр Кошелев рассказывает о создании Яндекс Афиши. Как по мне, то вдохновляет.

    стать я по старее, но примерно про тоже и с той же целью.

    Куда все идут. Иван Сагалаев. Рассказывает о другом яндекс сервисе.

    К слову о предудущей моей статье.

    Global Interpreter Lock: факты и мифы

    И три небольших статьи Александра о наследовании.

    И на последок не джанго JavaScript language advanced Tips & Tricks

    Rating 3.00 out of 5
    [?]

    Tags: , , , , ,

  • 24May

    togetherЯ хотел бы кратко рассказать о некоторых базовых модулях python, предназначенных для работы с потоками, процессами, сокетами, пайпами и тому подобное.

    Потоки.

    В одно процессе может одновременно работать несколько потоков. Для организации доступа нескольких потков к одним данным python использует global interpreter lock.

    1. import threading  #higher-level interface
    2. import time, random
    3. class Counter:
    4.    def __init__(self):
    5.        self.lock = threading.Lock()
    6.  # создается объект блокировки данных
    7.        self.value = 0
    8.    def increment(self):
    9.        self.lock.acquire() # блокировка
    10.        self.value = value = self.value + 1 # изменение каких либо данных
    11.        self.lock.release()  # разблокировка
    12.        return value
    13. counter = Counter()
    14. class Worker(threading.Thread): #класс потока
    15.    def run(self): # этот метод выполняется во время работы потока
    16.        for i in range(10):
    17.          # изменение общих данных внутри потока
    18.           value = counter.increment()
    19.           time.sleep(random.randint(10, 100) / 1000.0)
    20.           print self.getName(), "– task", i, "finished", value
    21.  
    22. for i in range(10):
    23.    Worker().start() # start a worker

    Команда

    Иногда просто надо из вашей программы запустить внешнюю команду. Для этого есть модуль commands (unix only)

    1. import commands
    2. stat, output = commands.getstatusoutput("ls -lR")
    3.  # вызываем внешнюю команду. Получаем результат и статус
    4. print "status", "=>", stat
    5. print "output", "=>", len(output), "bytes"

    Pipe.

    Именованый канал. Служит для взаимодействиями между процессами. На основе этого класса можно построить конвейер взаимодействия.

    1. import pipes
    2. t = pipes.Template() # создаем объект пайпа
    3. t.append("sort", "—-")
    4. # добавляем в конец процесс sort .
    5. # "–" – означает, что используется стандартный вход или выход.
    6. t.append("uniq", "—-") # и еще один
    7. t.copy("out.txt", "")
    8. # входные данные берем из файла out.txt и отправляем в STDOUT

    STDIN и STDOUT внешних комманд

    Модуль popen2 позволяет работать с STDOUT и STDIN внешних процессов, как к обыкновенными файл хэндлами.

    1. import popen2
    2. fin, fout = popen2.popen2("sort") # запускаем внешний процесс и получаем доступы к хендлам
    3. fout.write("foo\n") # записываем в процесс
    4. fout.write("bar\n")
    5. fout.close() # закрываем
    6. print fin.readline(), # считываем строки
    7. print fin.readline(), #
    8. fin.close()

    popen3 работает также как и popen2, только возвращает еще и хэндл STDERR

    Сигналы

    Процессы могут получать внешние сигналы, и необходимо иметь возможность их обрабатывать. Ниже пример того, как приложение посылает сигнал самому себе.

    1. import signal
    2. import time
    3. def handler(signo, frame): # пишим обработчик сигнала ALRM
    4.    print "got signal", signo
    5. signal.signal(signal.SIGALRM, handler) #
    6.  
    7. signal.alarm(2) # послать самому себе сигнал ALRM через 2 сек
    8. now = time.time()
    9. time.sleep(400)
    10. print "slept for", time.time() – now, "seconds" #  узнать, сколько я спал

    Ниже пример того, как приложение посылает сигнал самому себе.

    Сокеты

    Это программный интерфейс, для обмена сообщениями между процессами. Ниже пример создания файлового сокет сервера

    1. import SocketServer
    2. import os
    3.  
    4. class MyHandler(SocketServer.StreamRequestHandler):
    5. # Класс, который будет обрабатывать запросы клиентов
    6.     def handle(self):
    7.         data = self.request.recv(1000000) # Получение данных от клиента
    8.         print 'Data:'+data
    9.         self.request.send('And you') # Отправка данных клиенту
    10.  
    11. sock_path = '/tmp/unix_socket_server'
    12. if os.path.exists(sock_path): # Если файл уже существует, то удоляем его перед стартом сервера
    13.     os.remove(sock_path)
    14. server = SocketServer.UnixStreamServer(sock_path,MyHandler) # Создаем объект сервера
    15. server.serve_forever() # запускаем его

    И клиента:

    1. import socket;
    2. sock_path = '/tmp/unix_socket_server'
    3. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) # создание объекта клиента
    4. server.connect(sock_path) # присоединяемся к указаному сокету
    5. server.send('Hi!') # Отправляем данные
    6. print 'GET:'+server.recv(10000) # Получаем данные.

    Помимо файлового сокет сервера можно создавать TCP сервер. Где для взаимодействия используется не файловый сокет а протокол TCP/IP. Что дает возможность взаимодействовать не только локальным процессам.

    Код сервера:

    1. import SocketServer
    2.  
    3. class MyTCPHandler(SocketServer.StreamRequestHandler):
    4.     def handle(self):
    5.         data = self.request.recv(1000000)
    6.         print 'Data:'+data
    7.         self.request.send('And you')
    8.  
    9.  
    10. HOST, PORT = "localhost", 9999
    11. server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    12. server.serve_forever()

    Проверить его работу можно просто написав в командной сроке

    1. telnet 127.0.0.1 9999

    после открытия соединение, все что вы будите писать, будет отправлятся на этот сервер по нажатию кнопки Enter.

    Но это можно делать и программно. Ниже приведен код клиента:

    1. import socket
    2. import sys
    3.  
    4. HOST, PORT = "localhost", 9999
    5.  
    6. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    7. sock.connect((HOST, PORT))
    8.  
    9. sock.send("HI")
    10. print 'GET:'+sock.recv(1024)
    11. sock.close()

    Как вы уже заметили, в коде эти два сервера отличаются сроками создания объекта сервера и клиента.

    Также для написаниея клиента можно использовать модуль telnetlib. Не думаю, что стоит тут что либо комментировать.

    1. import telnetlib
    2. tl = telnetlib.Telnet('127.0.0.1',9999)
    3. tl.write('HI')
    4. print tl.read_all()

    Для написание более сложных механизмов взаимодействия используйте Twisted. Это уже более сложная событийная модель на Python. Но перед тем как его использовать убедитесь, что это не будет стрельба из пушки по воробьям.

    Надеюсь, что эта была вам интересна и полезна. А мне интересно прочитать ваше мнение, ваши примеры и трюки. А возможно я что то забыл упомянуть по теме?

    Rating 3.00 out of 5
    [?]

    Tags: , , , , , , , ,

  • 16Apr

    elite-board Давно хотел переделать сайт своего отца, выдалась свободная минутка и… Это первый мой Django проект, увидевший мир.www.elite-board.net.ua доска объявлений. Ну и пока неделя работы, полет нормальный. Единственное, дизайн, рисовать я не умею, так что особо не стебайтесь, но критику в любом случае выслушать готов.

    Что внутри:

    • I18N — но этим уже никого не напугаешь
    • openid авторизация — почти самописная. Это помимо базовой.

    • Поиск — django-sphinx.
    • Вложеная навигация по тегам.
    • Автодогрузка объявлений при переходе в конец страницы.
    • предпросмотр заотаченых к объявлению картинок

    • Ну и контроль ошибок и CSV логи. Если на сайте происходит сбой, пользователю предлагают самому дополнить информацию о том, как он её получил.

    Хочу услышать вашу критику.

    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 10Apr

    patient-monitoring-connectivityПосмотрел его доклад, впечатлился, решил вынести некоторые сноски.

    Сравнение большого числа баз данных

    Системы мониторинга и анализа:

    Contrib/pgbanch
    – простая программа для запуска benchmark тестов PostgreSQL
    Cacti(www.cacti.net)/Nagious (www.nagios.org) – системы мониторинга различных параметров системы
    Bonnie++(sourceforge.net/projects/bonnie) тестирование винта и файловой системы
    pgFouine(pgfouine.projects.postgresql.org) – анализатор логов. Написан на пхп

    Статьи

    PostgreSQL Hardware Performance Tuning
    Performance Tuning
    Настройка производительности
    Инструкция по оптимизации
    GUCs: A Three Hour Tour

    Также упоминался connection pooler from Skype pgBouncer

    Если у кого то есть еще интересные ссылки по теме, то кидайте, буду только рад. Спасибо.

    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 30Mar

    ocherednoj-super-bordak_13224_s__1Первое, что меня смутило при работе с БД в питоне — это невозможность вернуть результаты в виде хеша, только массив строк и столбцов. И это не поддерживается в DB API принципиально

    Note that the reason for not extending the DB API specification
    to also support dictionary return values for the .fetch*()
    methods is that this approach has several drawbacks:

    * Some databases don’t support case-sensitive column names or
    auto-convert them to all lowercase or all uppercase
    characters.

    * Columns in the result set which are generated by the query
    (e.g. using SQL functions) don’t map to table column names
    and databases usually generate names for these columns in a
    very database specific way.

    As a result, accessing the columns through dictionary keys
    varies between databases and makes writing portable code
    impossible.

    Но есть у курсора свойство .description которое можно использовать для получения массива столбцов и преобразование результатов в хеш.

    1. def fetchdictall(cursor):
    2.     desc = cursor.description
    3.     dlen = len(desc)
    4.     ret = []
    5.     for item in cursor.fetchall():
    6.         onerow = {}
    7.         for field,i in zip(desc,range(dlen)):
    8.             onerow[field[0]] = item[i]
    9.         ret.append(onerow)
    10.     return ret
    11. def executedict(cursor,*arg):
    12.     cursor.execute(*arg)
    13.     return fetchdictall(cursor)

    Но у драйвера для постгриса есть уже встроено решение:

    1. #!/usr/bin/python
    2. import psycopg2,psycopg2.extras
    3. dbc = psycopg2.connect("user=oduvan password='gr1v1ca5a' dbname=oduvan")
    4. dbc.set_isolation_level(1)
    5. cursor = dbc.cursor(cursor_factory=psycopg2.extras.DictCursor)
    6. dbc.set_client_encoding('UNICODE')
    7. cursor.execute('select * from "t1"')
    8. ret = cursor.fetchall();
    9. print ret[0]['name']

    Статьи по теме:

    http://www.devx.com/opensource/Article/29071/0/page/1

    file:///usr/share/doc/python-psycopg2/doc/extensions.rst.gz

    http://www.python.org/dev/peps/pep-0249/

    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

« Previous Entries   

Recent Comments

  • Every body remembers that modern life seems to be not very c...
  • Alexander, спасибо, интересная трактовка. Но целью статьи бы...
  • "И всегда выходит так, что супер силы, супер сразу — это суп...
  • Так, на вскидку - Лукъяненко пишет в жанре фантастика....
  • Не выдержала моя душа, вот по поводу идиотизма которого тебе...