Python
Найдено: 26 записей
Песочница →
Мини web-краулер. Качаем книгу из интернета
Преамбула
Поскольку большинство книг я читаю с наладонника, книги нужно где-то качать. Большинство интересующих меня книг можно найти в сетевых библиотеках в формате txt, html, fb2 или другом текстовом. Бывают случаи, когда книга разделена на несколько страниц и лежит на каком-нибудь сайте, где возможность скачать целиком не предусмотрена. В этом случае можно сохранить каждую html страницу вручную, но такой способ имеет два важных недостатка. Во-первых, если книга разделена на 15-20 страниц, сохранение вручную займёт много времени и будет раздражать. Во-вторых, вместе с текстом книги мы получим кучу всякого мусора — текст, не относящийся к книге, таблицы, скрипты, ссылки на другие сайты и прочую муть.
Чтобы упростить себе жизнь, мы напишем программу, которая скачает книгу для нас. Из сказанного выше следует, что нам нужна программа, которая: а) скачает в нужном порядке все страницы, по которым разбросана книга; б) с каждой страницы возьмёт только тест и ничего лишнего и в) сохранит весь текст книги в одном html-файле.
В качестве примера мы возьмём книгу Владимира Плунгяна «Почему языки такие разные. Популярная лингвистика». Я нашёл только одну сетевую бибилотеку, где её можно скачать в текстовом формате, да и там требуется регистрация, поэтому мы скачаем её по указанной ссылке с помощью программы, о которой речь пойдёт дальше. Для написания программы мы используем язык программирования Python. Я использовал Python версии 2.6. Эту или более новую версию можно скачать бесплатно на официальном сайте.
Поскольку большинство книг я читаю с наладонника, книги нужно где-то качать. Большинство интересующих меня книг можно найти в сетевых библиотеках в формате txt, html, fb2 или другом текстовом. Бывают случаи, когда книга разделена на несколько страниц и лежит на каком-нибудь сайте, где возможность скачать целиком не предусмотрена. В этом случае можно сохранить каждую html страницу вручную, но такой способ имеет два важных недостатка. Во-первых, если книга разделена на 15-20 страниц, сохранение вручную займёт много времени и будет раздражать. Во-вторых, вместе с текстом книги мы получим кучу всякого мусора — текст, не относящийся к книге, таблицы, скрипты, ссылки на другие сайты и прочую муть.
Чтобы упростить себе жизнь, мы напишем программу, которая скачает книгу для нас. Из сказанного выше следует, что нам нужна программа, которая: а) скачает в нужном порядке все страницы, по которым разбросана книга; б) с каждой страницы возьмёт только тест и ничего лишнего и в) сохранит весь текст книги в одном html-файле.
В качестве примера мы возьмём книгу Владимира Плунгяна «Почему языки такие разные. Популярная лингвистика». Я нашёл только одну сетевую бибилотеку, где её можно скачать в текстовом формате, да и там требуется регистрация, поэтому мы скачаем её по указанной ссылке с помощью программы, о которой речь пойдёт дальше. Для написания программы мы используем язык программирования Python. Я использовал Python версии 2.6. Эту или более новую версию можно скачать бесплатно на официальном сайте.
10.03.2012 01:36+0400
Песочница →
Гракон — гражданский контроль за выборами
Привет Хабровчане!
Какими бы не были ваши политические взгляды (многих уже тошнит от слова «политик»), мало кто сейчас может оставаться равнодушным к тому, что происходит у нас в стране. Каждому из нас, независимо от того, за кого мы будем голосовать, важно, чтобы выборы были максимально честными. Понимая это, пару месяцев назад мы начали писать сайт, который поможет скоординировать наблюдателей, юристов для контроля за выборами — grakon.org.
Какими бы не были ваши политические взгляды (многих уже тошнит от слова «политик»), мало кто сейчас может оставаться равнодушным к тому, что происходит у нас в стране. Каждому из нас, независимо от того, за кого мы будем голосовать, важно, чтобы выборы были максимально честными. Понимая это, пару месяцев назад мы начали писать сайт, который поможет скоординировать наблюдателей, юристов для контроля за выборами — grakon.org.
21.02.2012 18:59+0400
Реклама →
Старый добрый чат
Когда то давно был расцвет чатов, почти каждый город/провайдер имел свой чат, времена прошли а воспоминания остались.
Изучая Tornado(неблокируемый веб-сервер/фреймворк) решил отдать должное прошлому и написал чат для своей малой родины, провинциального городка.
Приглашаю всех желающих испытать ностальгию и заодно помочь мне его протестировать.
Войти туда можно по гостевому логину, через вконтакте или зарегестрировашись.
На данный момент не работает возможность заполнять профили и нет защиты от флуда;)
Когда закончу разработку выложу в open-source, может кому и пригодится.
russa-chat.ru
График нагрузки можно наблюдать тут russa-chat.ru/stats
Всем спасибо за тест, максимальная нагрузка была в 32 клиента онлайн. Ничего не упало, все отлично работало.
Всплыло пару багов, буду править.
В чате несколько раз спрашивали исходники, кому надо пишите в личку.
Изучая Tornado(неблокируемый веб-сервер/фреймворк) решил отдать должное прошлому и написал чат для своей малой родины, провинциального городка.
Приглашаю всех желающих испытать ностальгию и заодно помочь мне его протестировать.
Войти туда можно по гостевому логину, через вконтакте или зарегестрировашись.
На данный момент не работает возможность заполнять профили и нет защиты от флуда;)
Когда закончу разработку выложу в open-source, может кому и пригодится.
russa-chat.ru
График нагрузки можно наблюдать тут russa-chat.ru/stats
Всем спасибо за тест, максимальная нагрузка была в 32 клиента онлайн. Ничего не упало, все отлично работало.
Всплыло пару багов, буду править.
В чате несколько раз спрашивали исходники, кому надо пишите в личку.
15.02.2012 22:24+0400
Ни о чём →
Я хочу работать в Google! Телефонное интервью (часть 2)
Сегодня мы будет обсуждать технические аспекты и реализацию задач на Python и C/C++, которыми нас будет закидывать инженер из Google. Начнём с самых тривиальных проблем с последующим нарастанием сложности. Параллельно обратим внимание о чём стоит упомянуть во время интервью и где не попасть в ловушку.
07.02.2012 03:14+0400
Программирование →
Скрипт для PlanetLab. Удаление и добаление Nodes
Так как недавно пришлось вникать в тонкости пользования PlanetLab, я решила поделиться примером скрипта на автоматическое добавление-удаление нодов. Возможно, это в будущем сократит кому-нибудь время.
Опишу вкратце, о чем идет речь. PlanetLab – это сеть, широко используемая для тестирования новых сетевых сервисов или модификации уже существующих. Узлы PlanetLab (их около 1024-х) распределены в различных странах и доступ к ним получают только сотрудники тех учреждений, которые содержат у себя узлы PlanetLab. Более подробная статья о PlanetLab есть здесь.
Если вы занимаетесь разработкой распределенных приложений, без PlanetLab обойтись будет сложно. При тестировании распределенного приложения, Вам скорее всего придется иметь дело с большим количеством узлов (Nodes). Проблема состоит в том, что в PlanetLab ноды часто уходят в оффлайн. Соответственно, эти ноды нужно удалить из своего аккаунта (slice) и подключить взамен них новые. Это, безусловно, возможно сделать и через веб-интерфейс руками. Однако, процесс это муторный, поэтому луче всего использовать скрипт. Таким скриптом я и хочу в Вами поделиться. Написан он на питоне.
Описение всех методов API PlanetLab можно найти по адресу www.planet-lab.eu/doc/api. Сам скрипт постаралась снабдить достаточным колчеством комментариев, чтобы было понятно что происходит.
#!/usr/bin/env python
import xmlrpclib
import sys
plc_host = 'www.planet-lab.eu'
auth =
{ 'AuthMethod': 'gpg',
'name': 'your user name',
'signature': 'GnuPG signature',
}
slice_name = 'tudresdenple_backup'
api_url = «%s:443/PLCAPI/»%plc_host
#api_url = «%s/PLCAPI/»%plc_host
plc_api = xmlrpclib.ServerProxy(api_url,allow_none=True)
#get list of all nodes
print «Getting list of all attached to your slice nodes:»
nodes = plc_api.GetNodes(auth, {}, ['node_id', 'hostname', 'boot_state'])
#get ids of the nodes that already are added to you slice
attached_nodes_ids = plc_api.GetSlices(auth, [ slice_name ], ['node_ids'])[0]['node_ids']
#obtain nodes hostnames, which will look like {'hostname': ''}
attached_nodes = plc_api.GetNodes(auth, attached_nodes_ids, ['hostname', 'boot_state'])
#extract hostname only
have_nodes = []
for node in attached_nodes:
have_nodes.append(node['hostname'])
for node in have_nodes:
print node
#Filter all your nodes that are not in the boot state and therefor have to be deleted
print «Searching for non-boot nodes attached to you slice:»
to_delete = []
for node_record in attached_nodes:
if node_record['boot_state'] != 'boot':
to_delete.append(node_record['hostname'])
for node_record in to_delete:
print node_record
#delete those nodes
num_of_deleted = len(to_delete)
if num_of_deleted > 0:
success = plc_api.DeleteSliceFromNodes(auth, slice_name, to_delete)
if success == 1:
print «Successfullly detached non-booted nodes»
else:
print «Deleting of the non-booted nodes has failed!»
sys.exit()
else:
print «Nothing to delete or add»
sys.exit()
#add exactly the same number of new now, as the number of deleted ones
print «Adding new booted nodes»
to_add = []
for node_record in nodes:
if num_of_deleted > 0:
num_of_deleted -= num_of_deleted
else:
break
if (node_record['hostname'] not in have_nodes) and node_record['boot_state'] == 'boot':
to_add.append( node_record['hostname'] )
if len(to_add) > 0:
success = plc_api.AddSliceToNodes(auth, slice_name, to_add)
if success == 1:
print «Successfullly attached new nbooted nodes»
else:
print «Addint of the booted nodes has failed!»
sys.exit()
print «The following nodes were added:»
for node_record in to_add:
print node_record
Опишу вкратце, о чем идет речь. PlanetLab – это сеть, широко используемая для тестирования новых сетевых сервисов или модификации уже существующих. Узлы PlanetLab (их около 1024-х) распределены в различных странах и доступ к ним получают только сотрудники тех учреждений, которые содержат у себя узлы PlanetLab. Более подробная статья о PlanetLab есть здесь.
Если вы занимаетесь разработкой распределенных приложений, без PlanetLab обойтись будет сложно. При тестировании распределенного приложения, Вам скорее всего придется иметь дело с большим количеством узлов (Nodes). Проблема состоит в том, что в PlanetLab ноды часто уходят в оффлайн. Соответственно, эти ноды нужно удалить из своего аккаунта (slice) и подключить взамен них новые. Это, безусловно, возможно сделать и через веб-интерфейс руками. Однако, процесс это муторный, поэтому луче всего использовать скрипт. Таким скриптом я и хочу в Вами поделиться. Написан он на питоне.
Описение всех методов API PlanetLab можно найти по адресу www.planet-lab.eu/doc/api. Сам скрипт постаралась снабдить достаточным колчеством комментариев, чтобы было понятно что происходит.
#!/usr/bin/env python
import xmlrpclib
import sys
plc_host = 'www.planet-lab.eu'
auth =
{ 'AuthMethod': 'gpg',
'name': 'your user name',
'signature': 'GnuPG signature',
}
slice_name = 'tudresdenple_backup'
api_url = «%s:443/PLCAPI/»%plc_host
#api_url = «%s/PLCAPI/»%plc_host
plc_api = xmlrpclib.ServerProxy(api_url,allow_none=True)
#get list of all nodes
print «Getting list of all attached to your slice nodes:»
nodes = plc_api.GetNodes(auth, {}, ['node_id', 'hostname', 'boot_state'])
#get ids of the nodes that already are added to you slice
attached_nodes_ids = plc_api.GetSlices(auth, [ slice_name ], ['node_ids'])[0]['node_ids']
#obtain nodes hostnames, which will look like {'hostname': ''}
attached_nodes = plc_api.GetNodes(auth, attached_nodes_ids, ['hostname', 'boot_state'])
#extract hostname only
have_nodes = []
for node in attached_nodes:
have_nodes.append(node['hostname'])
for node in have_nodes:
print node
#Filter all your nodes that are not in the boot state and therefor have to be deleted
print «Searching for non-boot nodes attached to you slice:»
to_delete = []
for node_record in attached_nodes:
if node_record['boot_state'] != 'boot':
to_delete.append(node_record['hostname'])
for node_record in to_delete:
print node_record
#delete those nodes
num_of_deleted = len(to_delete)
if num_of_deleted > 0:
success = plc_api.DeleteSliceFromNodes(auth, slice_name, to_delete)
if success == 1:
print «Successfullly detached non-booted nodes»
else:
print «Deleting of the non-booted nodes has failed!»
sys.exit()
else:
print «Nothing to delete or add»
sys.exit()
#add exactly the same number of new now, as the number of deleted ones
print «Adding new booted nodes»
to_add = []
for node_record in nodes:
if num_of_deleted > 0:
num_of_deleted -= num_of_deleted
else:
break
if (node_record['hostname'] not in have_nodes) and node_record['boot_state'] == 'boot':
to_add.append( node_record['hostname'] )
if len(to_add) > 0:
success = plc_api.AddSliceToNodes(auth, slice_name, to_add)
if success == 1:
print «Successfullly attached new nbooted nodes»
else:
print «Addint of the booted nodes has failed!»
sys.exit()
print «The following nodes were added:»
for node_record in to_add:
print node_record
28.01.2012 05:02+0400
Питон →
Первые шаги в программирование на Python
Пару месяцев назад взялся я за изучение Python. Прочитав про используемые структуры, работу со строками, генераторы, основы ООП, размышлял какую полезную программу написать, что бы это все применить на реальной задаче.
По счастливому стечению обстоятельств ко мне обратились знакомые с просьбой скачать мультфильм «Чудеса на виражах».
По счастливому стечению обстоятельств ко мне обратились знакомые с просьбой скачать мультфильм «Чудеса на виражах».
21.12.2011 21:11+0400
Песочница →
Автоматическое тестирование в PHP
Работа по TDD имеет очевидные преимущества: у разработчика всегда есть чётко описанная в виде теста цель, и он сразу узнает, когда она будет достигнута.
Тем не менее, есть и некоторые издержки: необходимо постоянно запускать один и тот же тест при изменениях в нем или в соответствующем классе, чтобы не пропустить тот самый момент истины. Вроде бы не такая уж и большая проблема, но постоянное переключение в консоль для проверки сделанных изменений на работоспособность, да и вообще помнить о необходимости этих манипуляций — лишнее рассеивание внимания.
Далее о том, как все это дело автоматизировать.
Тем не менее, есть и некоторые издержки: необходимо постоянно запускать один и тот же тест при изменениях в нем или в соответствующем классе, чтобы не пропустить тот самый момент истины. Вроде бы не такая уж и большая проблема, но постоянное переключение в консоль для проверки сделанных изменений на работоспособность, да и вообще помнить о необходимости этих манипуляций — лишнее рассеивание внимания.
Далее о том, как все это дело автоматизировать.
08.11.2011 05:30+0400
Песочница →
Удаленная поддержка компьютера на Linux OS
Настройка IPv6-туннеля за симметричным NAT и удаленного управления через VNC
Не так давно я искал решение для удаленного администрирования системой на Linux. Основная проблема в том, что подключен к интернету через провайдеров, использующих симметричный NAT. То есть из internet машины не доступны. Если поискать, то можно найти некоторые программы для удаленного администрирования, но как правило они немало стоят. Опишу, как можно сделать доступ снаружи без таких программ с помощью IPv6-туннеля через gogonet и VNC.
31.08.2011 11:58+0400
Ни о чём →
Большие крестики-нолики
29.07.2011 17:57+0400
Ни о чём →
DNS-хостинг Яндекса vs Динамический IP
В сентябре прошлого 2010 года компания Яндекс открыла для публичного использования DNS-хостинг в рамках Почты для доменов. Радости пользователей не было предела, топик был встречен массой положительных комментариев, а Яндекс был объявлен корпорацией добра.
К сожалению администрирование DNS-записей было предусмотрено только через web-интерфейс. API для администрирования предусмотрено не было, до сих пор не появилось, и возможно еще долго не появится. Этот факт опечалил многих владельцев доменов с динамическим IP не меньше, чем перевод отличного бесплатного сервиса free.editdns.net на платную основу (для custom доменов), в связи с покупкой последнего компанией DynDNS.
Убедившись, что чуда не случилось, я взял в рукиPython напильник с целью исправить эту несправедливость…
К сожалению администрирование DNS-записей было предусмотрено только через web-интерфейс. API для администрирования предусмотрено не было, до сих пор не появилось, и возможно еще долго не появится. Этот факт опечалил многих владельцев доменов с динамическим IP не меньше, чем перевод отличного бесплатного сервиса free.editdns.net на платную основу (для custom доменов), в связи с покупкой последнего компанией DynDNS.
Убедившись, что чуда не случилось, я взял в руки
28.06.2011 12:34+0400
Ни о чём →
Наивный Байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.
И так, для примера возьму задачу определения пола по имени. Конечно, чтобы определить пол можно создать большой список имен с метками пола. Но этот список в любом случае будет неполон. Для того чтобы решить эту проблему, можно «натренировать» модель по маркированным именам.
Если интересует, прошу .
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
Чтобы натренировать протестировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом.
Файл 'names.txt' можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
Я протестировал классификатор на части исходного корпуса с именами. Точность составила 96%. Это не блестящий результат, но для многих задач вполне достаточно.
И так, для примера возьму задачу определения пола по имени. Конечно, чтобы определить пол можно создать большой список имен с метками пола. Но этот список в любом случае будет неполон. Для того чтобы решить эту проблему, можно «натренировать» модель по маркированным именам.
Если интересует, прошу .
Немного теории
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Код
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
from __future__ import division
from collections import defaultdict
from math import log
def train(samples):
classes, freq = defaultdict(lambda:0), defaultdict(lambda:0)
for feats, label in samples:
classes[label] += 1 # count classes frequencies
for feat in feats:
freq[label, feat] += 1 # count features frequencies
for label, feat in freq: # normalize features frequencies
freq[label, feat] /= classes[label]
for c in classes: # normalize classes frequencies
classes[c] /= len(samples)
return classes, freq # return P© and P(O|C)
def classify(classifier, feats):
classes, prob = classifier
return min(classes.keys(), # calculate argmin(-log(C|O))
key = lambda cl: -log(classes[cl]) + \
sum(-log(prob.get((cl,feat), 10**(-7))) for feat in feats))
Чтобы натренировать протестировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом.
def get_features(sample): return (sample[-1],) # get last letter
samples = (line.decode('utf-8').split() for line in open('names.txt'))
features = [(get_features(feat), label) for feat, label in samples]
classifier = train(features)
print 'gender: ', classify(classifier, get_features(u'Аглафья'))
Файл 'names.txt' можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
def get_features(sample): return (
'll: %s' % sample[-1], # get last letter
'fl: %s' % sample[1], # get first letter
'sl: %s' % sample[0], # get second letter
)
Тесты
Я протестировал классификатор на части исходного корпуса с именами. Точность составила 96%. Это не блестящий результат, но для многих задач вполне достаточно.
30.05.2011 01:33+0400
humour →
Змеиные яйца (Python easter eggs)
На днях, изучая внутренности Python наткнулся на пасхальное яйцо «barry_as_FLAFL» в модуле __future__. Повспоминал, погуглил и решил собрать небольшую коллекцию всех известных мне пасхальных яиц и шуток в Python.
Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
22.03.2011 11:15+0300
humour →
Змеиные яйца (Python easter eggs)
На днях, изучая внутренности Python наткнулся на пасхальное яйцо «barry_as_FLAFL» в модуле __future__. Повспоминал, погуглил и решил собрать небольшую коллекцию всех известных мне пасхальных яиц и шуток в Python.
Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
22.03.2011 11:15+0300
humour →
Эволюция Python-программиста
Начинающий
- def factorial(x):
- if x == 0:
- return 1
- else:
- return x * factorial(x - 1)
- print factorial(6)
Программирующий уже год (Ранее изучавший Pascal)
- def factorial(x):
- result = 1
- i = 2
- while i <= x:
- result = result * i
- i = i + 1
- return result
- print factorial(6)
21.01.2011 18:38+0300
humour →
Какой язык учить?
Хочешь программировать на выразительном и мощном языке: Python
Нужно по-быстрому веб-сайт: PHP
Желаешь в тусовку зовущих себя «рок-звездами» программирования: Ruby
Реально нужно научиться программировать: C
Ищешь просветления: Scheme
Уйти в хандру: SQL
Потерять одну хромосому: Microsoft Visual Basic
Для получения постоянной, заурядной, но хорошо оплачиваемой работы по созданию финансовых приложений в офисной загородке под лампами дневного света: Java
Тоже самое, но с аббревиатурами и списком сертификатов в своей подписи: C#
Получить волшебное ощущение детского изумления, которое сложно отличить от мании величия: Objective C
оригинал (en)
Нужно по-быстрому веб-сайт: PHP
Желаешь в тусовку зовущих себя «рок-звездами» программирования: Ruby
Реально нужно научиться программировать: C
Ищешь просветления: Scheme
Уйти в хандру: SQL
Потерять одну хромосому: Microsoft Visual Basic
Для получения постоянной, заурядной, но хорошо оплачиваемой работы по созданию финансовых приложений в офисной загородке под лампами дневного света: Java
Тоже самое, но с аббревиатурами и списком сертификатов в своей подписи: C#
Получить волшебное ощущение детского изумления, которое сложно отличить от мании величия: Objective C
оригинал (en)
07.05.2010 13:21+0400
Реклама →
Веб-Преферанс. Месяц спустя
Месяц назад, мы уже писали про старт нового проекта клуба интеллектуальных игр «Трельяж». Сервис успешно выдержал хабраэффект, благодаря которому пришла тысяча игроков, и выдвинула множество предложений по улучшению и развитию проекта. Все они были услышаны, и многие из них реализованы.
За последний месяц на сервере было сделано: 22 обновления, зарегистрировалось 1043 игрока, сыграно более 500 игр, закрыто более 100 тикетов в багтрекере.
За последний месяц на сервере было сделано: 22 обновления, зарегистрировалось 1043 игрока, сыграно более 500 игр, закрыто более 100 тикетов в багтрекере.
18.03.2010 15:16+0300
Реклама →
Веб-Преферанс на Python
Не первое десятилетие продолжается спор между архитекторами настольных приложений на предмет, какой же подход, statefull или stateless, более предпочтителен, и в каких случаях.
Сейчас мы наблюдаем определенный тренд сдачи позиций апологетами statefull. Не в последнюю очередь в этом виноват даже не столько web, сколько банальный HTTP, вполне заслуженно занявший нишу «универсального протокола для всего». Причем возможность передачи Cookie весьма слабо влияет на его насквозь stateless природу.
Но что HTTP может нам предложить, в случае необходимости создания интерактивного приложения на вебе? Для того чтобы достичь «реактивности» оффлайнового statefull приложения, классического варианта с постоянным опросом состояния сервера короткими AJAX запросами по таймеру явно недостаточно. HTML5 несет нам технологию WebSockets, призванную решить эту проблему. Но ведь нужно чтобы работало «здесь и сейчас» на всех браузерах выпущенных в текущем тысячелетии.
На помощь приходит технология Comet, при помощи которой мы предприняли попытку реализовать браузерный русский преферанс с мгновенной реакцией на события.
Итак, знакомьтесь. Клуб интеллектуальных игр «Трельяж»
trellis-club.com
Сейчас мы наблюдаем определенный тренд сдачи позиций апологетами statefull. Не в последнюю очередь в этом виноват даже не столько web, сколько банальный HTTP, вполне заслуженно занявший нишу «универсального протокола для всего». Причем возможность передачи Cookie весьма слабо влияет на его насквозь stateless природу.
Но что HTTP может нам предложить, в случае необходимости создания интерактивного приложения на вебе? Для того чтобы достичь «реактивности» оффлайнового statefull приложения, классического варианта с постоянным опросом состояния сервера короткими AJAX запросами по таймеру явно недостаточно. HTML5 несет нам технологию WebSockets, призванную решить эту проблему. Но ведь нужно чтобы работало «здесь и сейчас» на всех браузерах выпущенных в текущем тысячелетии.
На помощь приходит технология Comet, при помощи которой мы предприняли попытку реализовать браузерный русский преферанс с мгновенной реакцией на события.
Итак, знакомьтесь. Клуб интеллектуальных игр «Трельяж»
trellis-club.com
16.02.2010 15:34+0300
Питон →
Интеграция shared hosting и SVN
Этот скрипт более исследовательский, чем предназначен для серьезных групп разработчиков. Создавался мною чтобы изучить python получше. Но тем не менее, я успешно пользуюсь им более полугода.
Данная статья для тех разработчиков, которые ведут некоторый проект в SVN, имея удаленный сервер, доступ к которому есть по ftp и ssh, но устанавливать на который ничего нельзя.
Данная статья для тех разработчиков, которые ведут некоторый проект в SVN, имея удаленный сервер, доступ к которому есть по ftp и ssh, но устанавливать на который ничего нельзя.
01.12.2009 16:43+0300
humour →
Маленькие радости админа локалхоста
Внезапно D_E_N_I_S_K_A сочинил простой скрипт на питоне, который делает «выстрел» на каждое обращение к страницам (читая access.log), и попросил меня запостить его
«По-моему забавно и вызывает некоторое чувство гордости за свой локалхостовый хттп сервер, который смотрит в сеть.»
Звуки, используемые скриптом, класть в одну директорию со скриптом
#!/usr/bin/env python import popen2, random f_in, f_out = popen2.popen2("tail -f -n 0 /var/log/lighttpd/access.log") while True: line = f_in.readline() popen2.popen2("aplay bang_%i.wav" % random.randint(1,6))
«По-моему забавно и вызывает некоторое чувство гордости за свой локалхостовый хттп сервер, который смотрит в сеть.»
Звуки, используемые скриптом, класть в одну директорию со скриптом
14.07.2009 21:48+0400