Яндекс.Метрика
    Поиск по тегу

    Python


    Найдено: 26 записей

    Песочница

    Мини web-краулер. Качаем книгу из интернета

    Преамбула

    Поскольку большинство книг я читаю с наладонника, книги нужно где-то качать. Большинство интересующих меня книг можно найти в сетевых библиотеках в формате txt, html, fb2 или другом текстовом. Бывают случаи, когда книга разделена на несколько страниц и лежит на каком-нибудь сайте, где возможность скачать целиком не предусмотрена. В этом случае можно сохранить каждую html страницу вручную, но такой способ имеет два важных недостатка. Во-первых, если книга разделена на 15-20 страниц, сохранение вручную займёт много времени и будет раздражать. Во-вторых, вместе с текстом книги мы получим кучу всякого мусора — текст, не относящийся к книге, таблицы, скрипты, ссылки на другие сайты и прочую муть.

    Чтобы упростить себе жизнь, мы напишем программу, которая скачает книгу для нас. Из сказанного выше следует, что нам нужна программа, которая: а) скачает в нужном порядке все страницы, по которым разбросана книга; б) с каждой страницы возьмёт только тест и ничего лишнего и в) сохранит весь текст книги в одном html-файле.

    В качестве примера мы возьмём книгу Владимира Плунгяна «Почему языки такие разные. Популярная лингвистика». Я нашёл только одну сетевую бибилотеку, где её можно скачать в текстовом формате, да и там требуется регистрация, поэтому мы скачаем её по указанной ссылке с помощью программы, о которой речь пойдёт дальше. Для написания программы мы используем язык программирования Python. Я использовал Python версии 2.6. Эту или более новую версию можно скачать бесплатно на официальном сайте.

    Песочница

    Гракон — гражданский контроль за выборами

    Привет Хабровчане!

    Какими бы не были ваши политические взгляды (многих уже тошнит от слова «политик»), мало кто сейчас может оставаться равнодушным к тому, что происходит у нас в стране. Каждому из нас, независимо от того, за кого мы будем голосовать, важно, чтобы выборы были максимально честными. Понимая это, пару месяцев назад мы начали писать сайт, который поможет скоординировать наблюдателей, юристов для контроля за выборами — grakon.org.

    Реклама

    Старый добрый чат

    Когда то давно был расцвет чатов, почти каждый город/провайдер имел свой чат, времена прошли а воспоминания остались.
    Изучая Tornado(неблокируемый веб-сервер/фреймворк) решил отдать должное прошлому и написал чат для своей малой родины, провинциального городка.
    Приглашаю всех желающих испытать ностальгию и заодно помочь мне его протестировать.

    Войти туда можно по гостевому логину, через вконтакте или зарегестрировашись.
    На данный момент не работает возможность заполнять профили и нет защиты от флуда;)

    Когда закончу разработку выложу в open-source, может кому и пригодится.
    russa-chat.ru

    График нагрузки можно наблюдать тут russa-chat.ru/stats

    Всем спасибо за тест, максимальная нагрузка была в 32 клиента онлайн. Ничего не упало, все отлично работало.
    Всплыло пару багов, буду править.

    В чате несколько раз спрашивали исходники, кому надо пишите в личку.

    Ни о чём

    Я хочу работать в Google! Телефонное интервью (часть 2)

    Сегодня мы будет обсуждать технические аспекты и реализацию задач на Python и C/C++, которыми нас будет закидывать инженер из Google. Начнём с самых тривиальных проблем с последующим нарастанием сложности. Параллельно обратим внимание о чём стоит упомянуть во время интервью и где не попасть в ловушку.

    Программирование

    Скрипт для PlanetLab. Удаление и добаление Nodes

    Так как недавно пришлось вникать в тонкости пользования PlanetLab, я решила поделиться примером скрипта на автоматическое добавление-удаление нодов. Возможно, это в будущем сократит кому-нибудь время.

    image

    Опишу вкратце, о чем идет речь. 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

    Питон

    Первые шаги в программирование на Python

    Пару месяцев назад взялся я за изучение Python. Прочитав про используемые структуры, работу со строками, генераторы, основы ООП, размышлял какую полезную программу написать, что бы это все применить на реальной задаче.
    По счастливому стечению обстоятельств ко мне обратились знакомые с просьбой скачать мультфильм «Чудеса на виражах».

    Песочница

    Автоматическое тестирование в PHP

    Работа по TDD имеет очевидные преимущества: у разработчика всегда есть чётко описанная в виде теста цель, и он сразу узнает, когда она будет достигнута.
    Тем не менее, есть и некоторые издержки: необходимо постоянно запускать один и тот же тест при изменениях в нем или в соответствующем классе, чтобы не пропустить тот самый момент истины. Вроде бы не такая уж и большая проблема, но постоянное переключение в консоль для проверки сделанных изменений на работоспособность, да и вообще помнить о необходимости этих манипуляций — лишнее рассеивание внимания.

    Далее о том, как все это дело автоматизировать.

    Песочница

    Удаленная поддержка компьютера на Linux OS

    Настройка IPv6-туннеля за симметричным NAT и удаленного управления через VNC


    Не так давно я искал решение для удаленного администрирования системой на Linux. Основная проблема в том, что подключен к интернету через провайдеров, использующих симметричный NAT. То есть из internet машины не доступны. Если поискать, то можно найти некоторые программы для удаленного администрирования, но как правило они немало стоят. Опишу, как можно сделать доступ снаружи без таких программ с помощью IPv6-туннеля через gogonet и VNC.

    Ни о чём

    Большие крестики-нолики

    Пробовал Google App Engine и решил написать крестики нолики, но не простые.

    Ни о чём

    DNS-хостинг Яндекса vs Динамический IP

    В сентябре прошлого 2010 года компания Яндекс открыла для публичного использования DNS-хостинг в рамках Почты для доменов. Радости пользователей не было предела, топик был встречен массой положительных комментариев, а Яндекс был объявлен корпорацией добра.

    К сожалению администрирование DNS-записей было предусмотрено только через web-интерфейс. API для администрирования предусмотрено не было, до сих пор не появилось, и возможно еще долго не появится. Этот факт опечалил многих владельцев доменов с динамическим IP не меньше, чем перевод отличного бесплатного сервиса free.editdns.net на платную основу (для custom доменов), в связи с покупкой последнего компанией DynDNS.

    Убедившись, что чуда не случилось, я взял в руки Python напильник с целью исправить эту несправедливость…

    Ни о чём

    Наивный Байесовский классификатор в 25 строк кода

    Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.

    И так, для примера возьму задачу определения пола по имени. Конечно, чтобы определить пол можно создать большой список имен с метками пола. Но этот список в любом случае будет неполон. Для того чтобы решить эту проблему, можно «натренировать» модель по маркированным именам.
    Если интересует, прошу .

    Немного теории


    Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:

    image

    Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:

    image

    Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:

    image

    Знаменатель нас не интересует. Числитель же можно переписать так.

    image

    Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:

    image

    Финальная формула примет вид:

    image

    Т.е. все что нужно сделать, это вычислить вероятности 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%. Это не блестящий результат, но для многих задач вполне достаточно.

    humour

    Змеиные яйца (Python easter eggs)

    На днях, изучая внутренности Python наткнулся на пасхальное яйцо «barry_as_FLAFL» в модуле __future__. Повспоминал, погуглил и решил собрать небольшую коллекцию всех известных мне пасхальных яиц и шуток в Python.
    Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
    image

    humour

    Змеиные яйца (Python easter eggs)

    На днях, изучая внутренности Python наткнулся на пасхальное яйцо «barry_as_FLAFL» в модуле __future__. Повспоминал, погуглил и решил собрать небольшую коллекцию всех известных мне пасхальных яиц и шуток в Python.
    Ну, во первых, грех не привести здесь всем известный «Дзен Питона»:
    image

    humour

    Эволюция Python-программиста

    Начинающий


    1. def factorial(x):
    2.     if x == 0:
    3.         return 1
    4.     else:
    5.         return x * factorial(x - 1)
    6. print factorial(6)


    Программирующий уже год (Ранее изучавший Pascal)


    1. def factorial(x):
    2.     result = 1
    3.     i = 2
    4.     while i <= x:
    5.         result = result * i
    6.         i = i + 1
    7.     return result
    8. print factorial(6)

    humour

    Какой язык учить?

    Хочешь программировать на выразительном и мощном языке: Python
    Нужно по-быстрому веб-сайт: PHP
    Желаешь в тусовку зовущих себя «рок-звездами» программирования: Ruby
    Реально нужно научиться программировать: C
    Ищешь просветления: Scheme
    Уйти в хандру: SQL
    Потерять одну хромосому: Microsoft Visual Basic
    Для получения постоянной, заурядной, но хорошо оплачиваемой работы по созданию финансовых приложений в офисной загородке под лампами дневного света: Java
    Тоже самое, но с аббревиатурами и списком сертификатов в своей подписи: C#
    Получить волшебное ощущение детского изумления, которое сложно отличить от мании величия: Objective C

    оригинал (en)

    Реклама

    Веб-Преферанс. Месяц спустя

    Месяц назад, мы уже писали про старт нового проекта клуба интеллектуальных игр «Трельяж». Сервис успешно выдержал хабраэффект, благодаря которому пришла тысяча игроков, и выдвинула множество предложений по улучшению и развитию проекта. Все они были услышаны, и многие из них реализованы.
    image

    За последний месяц на сервере было сделано: 22 обновления, зарегистрировалось 1043 игрока, сыграно более 500 игр, закрыто более 100 тикетов в багтрекере.

    Реклама

    Веб-Преферанс на Python

    Не первое десятилетие продолжается спор между архитекторами настольных приложений на предмет, какой же подход, statefull или stateless, более предпочтителен, и в каких случаях.
    Сейчас мы наблюдаем определенный тренд сдачи позиций апологетами statefull. Не в последнюю очередь в этом виноват даже не столько web, сколько банальный HTTP, вполне заслуженно занявший нишу «универсального протокола для всего». Причем возможность передачи Cookie весьма слабо влияет на его насквозь stateless природу.

    Но что HTTP может нам предложить, в случае необходимости создания интерактивного приложения на вебе? Для того чтобы достичь «реактивности» оффлайнового statefull приложения, классического варианта с постоянным опросом состояния сервера короткими AJAX запросами по таймеру явно недостаточно. HTML5 несет нам технологию WebSockets, призванную решить эту проблему. Но ведь нужно чтобы работало «здесь и сейчас» на всех браузерах выпущенных в текущем тысячелетии.

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

    Итак, знакомьтесь. Клуб интеллектуальных игр «Трельяж»
    trellis-club.com

    Трельяж

    Питон

    Интеграция shared hosting и SVN

    Этот скрипт более исследовательский, чем предназначен для серьезных групп разработчиков. Создавался мною чтобы изучить python получше. Но тем не менее, я успешно пользуюсь им более полугода.

    Данная статья для тех разработчиков, которые ведут некоторый проект в SVN, имея удаленный сервер, доступ к которому есть по ftp и ssh, но устанавливать на который ничего нельзя.

    схема деплоя

    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))


    «По-моему забавно и вызывает некоторое чувство гордости за свой локалхостовый хттп сервер, который смотрит в сеть.»

    Звуки, используемые скриптом, класть в одну директорию со скриптом