програмування

Posted by admin

Моя стаття з січневого випуску Хакера про wave. Хоча зараз ажіотаж трішки з Хвилі зійшов, але гадаю цей сервій ще буде розвиватися.

Ручной Wave Робот

Написание робота на Python'е для Google Wave

"Ладно, я построю свой собственный модуль с блек-джеком и шлюхами. Вообще-то, к черту модуль и блек-джека"... Какие хорошие советы могут давать роботы. Посему в статье построим и себе маленького робота, ну хотя бы лишь для Google Wave.

Google Wave получил хороший пиар, и думаю в сим мире не сыскать того, кто не слышал о нем (не считая, соседа Толика, который в запое;)). Хотя этот пиар может даже немножко повредил Волне, поскольку привозносил сие творение как убийца почты, форумов, и чуть ли не всего интернета. Как для меня же, Волна это достаточно классно сделанная IRC с кульным API. С помощью которого мы можем создавать любые гаджеты и, что более интересно, любых роботов, которые могут расширять возможности Wave под любые нужды. И наличие этого API поднимает планку Волне очень высоко. Так что с нашей стороны было бы огромнейшей ошибкой не рассказать тебе о программировании Волны. А мы же почти идеальны и не допускаем ошибок ;)

Continue reading...
Posted by admin

Вибачаюсь, вибачаюсь, вибачаюсь (.

В недавній статті щодо штучного інтелекту я зробив маленьку помилку в прогі, яка давала змогу мені вигравати. Бага була в тому що він не навчався на помилка, а лише навчався на перемегах, що було не досить ефективно. Тож тепер можу вам показати скриптик, який майже НЕПЕРЕМОЖНИЙ!

Оце кусок який відповідає за логіку:

class Game(object):
    memory = one_game = {}

    def __init__(self, sticks_count):
        self.sticks_count = sticks_count
        for _ in xrange(self.sticks_count+1):
            self.memory[_] = {1:1, 2:1, 3:1}

    def finish_lose(self):
        self.memory[ min(self.one_game) ][self.one_game[ min(self.one_game) ]] -= 1

    def one_move(self, stick):
        ch = []
        for i in self.memory[stick]:
            for _ in xrange(self.memory[stick][i]):
               ch.append(i)
        if not ch:
            return 1
        self.one_game[stick] = random.choice( ch )
        return self.one_game[stick]
Continue reading...
Posted by admin

Ви напевно знаєте такий тип змінних як static, які містяться в функціях і їхнє значення зберігається між викликами функцій. Якщо згадувати пенсіонера С, то приклад буде такий:

function example1(void) {
   static int A = 1;
   A++;
   print('A = '+A);
}
example1();
>> A = 2
example1();
>> A = 3
example1();
>> A = 4

Думаю цей код працювати не буде через моє незнання С, але суть показує. І повертаючись до мого любимого Python'а - в ньому таких статичних методів в функціях немає, і замість того треба юзати класи:

class S(object):
    a = 1
def example2():
    S.a += 1
    print "a = "%(S.a)
example2()
>> a = 2
example2()
>> a = 3
example2()
>> a = 4

Я постійно використовую таку функціональність, але незнав до недавнього часу особливість, що варта була декількох годин відладки коду. Отже, хай ви класи і їхні властивості будете використовувати як "ключ"(флажок) для неповторення функціоналу. Наприклад так:

class S(object):
    was_run_example2 = False
def example2()
    if not S.was_run_example2:
        print "PRINT ONLY ONE"

example2()
>> PRINT ONLY ONE
example2()
example2()
example2()

Тепер ми прийшли до суті, мій модуль для логування в Пітоні використовує приблизно таку систему(хоча код набагато там кращий:) ), щоб налаштовувати логування лише раз. Але нещодавно виявилось, що почали дублюватися логи, тобто якимось чином ця система не працювала і код налаштування логування викликався 2 рази. Довго я не міг зрозуміти навіть приблизну причину, і тестував все методом "наукового тика" - постійно коментуючи різні участки кода і дивлячись чи було дублювання чи ні. Нарешті виявилось, що якщо цю функцію інклудити по різному в Пітоні, то для Пітона це буде два різні файли і різні обьєкти з різними значеннями полів обьєкту:

include example2
from utils include example2
from project.utils include example2

Звичайно в одному файлі так не напишете, але якщо це багатомодульна система, то досить легко завантажити в якийсь момент її по іншому і в результаті з'явиться помилка яку не так і легко знайти.

Надіюсь що ви не будете наступати на ці граблі, як я наступив )

Posted by admin

Перед тим як зайти в глибоке святкування Нового Року вирішив написати два поста, один технічний, а інший про результати 2009 року. Тож щодо технічного, то одна з найважливішої функції в будь-якій системі - є її моніторинг - можливість бачити що де й як проходить, чи бувають помилки і якщо так, то де саме. Поскільки я програмую на Пітоні й Джанго, то мова буде саме про цею парочку.

Отще в Пітоні є чудернатський модуль logging, що дає можливість логувати різні за типом події. Найпростіша робота з ним це:

import logging
logging.info('info message')
logging.error('error messaqge')

Найпростіший спосіб, але я його не юзаю, бо не дуже прикольно працювати зі стандартним потоком повідомлень, а краще юзати окремий, щоб чужі модуля не могли до нього нічого писати:

import logging
log = logging.getLogger('log')
log.error('error messaqge')

Тепер в нас є власний потік повідомленнів, але крім того що він є, його треба й виводити кудись, зберігати, то для цього на нього навішуються різні обробники. Ось наприклад навісим, що все виводилось в консоль:

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
stream_handler.setLevel(logging.DEBUG)

log.addHandler(stream_handler)
Continue reading...
Posted by spirit

Я низько кланяюсь Гугловським маркетологам. Це ж нада було звичайну річ так круто пропіарить. Так голосно кричати про Google Wave. Саме цю "чудову" штуку вони охрестили вбивцею почти, чатів, форумів і всього-всього іншого - я навіть дивуюсь, чому не сказали що Вейв вб'є весь інтернет. Хоча якщо подивитись детальніше, то вони зробили аналог IRC, що працює в Вебі і має прикольний API - ото й все. Немає в ньому нічого нового, нічого революційного. Хоча це не значить, що Вейв поганий... Він прикольний - якщо його правильно використовувати. І про саме правильно використання поговоримо...

Нашій групі Ukrainian Security Community(UASC) постійно доводиться обговорювати різні цікаві штучки, і спочатку для таких конференцій використовували IRC, потім Скайп, а зараз зупинилися саме на Вейві. Бо для обговорень в малому колі людей - Вейв поки що кращий. Раніше в нас кожного тижня був черговий, що приймав всю почтову кореспондецію і вирішував всі питання з нею пов'язані. Але зараз це в минулому - з Вейвом за декілька годин був накиданий робот, що приймає пошту і публікує її на Вейві, де вже ми разом можемо її обговорити. Це набагато класніше.

Логіка роботи Робота наступна:

Continue reading...

Cron для Drupal

29 Oct 2009
Posted by spirit

На Друпалі є така фішка як cron.php. Тобто файлик, що при своєму запускі виконує різні маленькі але обовязкові функцій - чищення логу, індексація сторінок для пошуку, перевірка оновлення і інше.

Тож цей файл бажано періодично запускати. Для автоматизація цього процесу накидав маленький скриптик на Python:

sites = (
    'http://screencast.org.ua/cron.php',
    'http://tutamc.com/cron.php'
)

from twill.commands import *

for site in sites:
    go(site)

Скрипт поставив в Віндовсі на виконання кожної ночі і тепер знаю, що все добре індексується.

Хоча це трішки змешена копія - насправді в мене ще є код який в випадку помилок - текст помилок зберігає до спеціального лог-файлу. Далі вже я періодично переглядаю цей файлик і дивлюся чи добре відпрацювали скрипти. Але про логування є багато інфи, тож це виділимо на окремий пост.

Posted by spirit

За сьогодні це 3-тій пост в блог. Трохи забагато ;). Але річ в тім, що завтра їду в Ялту на наукову конференцію, та й буду там пропадати десь з тиждень. Тому зараз опублікую багатенько, що вам було що читати в мою відсутність. Хоча ВайФай в мене буде, тому на декілька хвилин в день сможу бувати в інтернеті, то може ще й буду щось публікувати з Ялти.

Отже, ще одна стаття з 8-мого випуска журнала Хакер. І як завжди тут повний оригінал зі всіми помилками, що є невідємною частиною мого стилю ;)


Методы не стандартного использования socks-сервера

Хакер от обычного человека отличается способом мышления - у нас мозги "направлены" в иную сторону. Хакеры это не нормальные люди. И я горжусь, когда меня кто-то так называет. Давайте используем эту способность и попробуем посмотреть не нормальным взглядом на socks-сервер.

Для обычного человека socks-сервер - это штука, что позволяет менять IP. Но, эта вещичка хранит в себе еще много секретов, ведь через нее проходит трафик. А это позволяет слушать трафик, легко его изменять, и этим добавлять функционал к любым программам. Рассмотрим парочку примеров, что можно сделать с socks-сервером.

Вариант 1. Прокачаем браузер

После появления браузера Google Chrome я почти полностью перешел на него, и не жалею. Но столкнулся с его ограниченным функционалом и отсутствием плагинов. Исходя из этого, он теоретически для хакинга не подходит. И тут на помощь придет Чип и Дейл локальный socks-сервер, через который можно направлять весь трафик Chrome'a. Это нам дает возможность безгранично увеличить функциональность браузера. Например, изменять заголовки http-запросов и в том числе user-agent на маленький шел, что часто используется при локальных инклудах. Или можно показывать кукисы, параметры, что передавались скрипту, а также их в каком-то автоматическом режиме модифицировать для каких-то действий. Плюс можно б указать сохранять все ресурсы, что загружает браузер, и если немного изменять http-формы, то получиться автоматический создатель фейков. Развивать эту тему можно еще очень много, и конечном итоге реализовать навороченный хак-socks-сервер.

Continue reading...

OpenTest2

12 Sep 2009
Posted by spirit

Вже більше року минуло з того часу як я влився в команду розробників системи тестування знань OpenTest2. За цей час зробили надзвичайно багато в системі... І вже на по початку 2009 року перевели систему в режим бета і розпочали потрішку збільшувати використання системи в ХІРЕ. А зараз вже система повністю протестована, і все тестування знать в ХІРЕ і ще багатьох Університетах України і не тільки проходить на OpenTest2. А на даний момент працюємо над сайтом opentest.com.ua і вже за тиждень система буде передана широкому загалу.

Хоча я й прийшов коли вже більша частина була реалізована, але все одно для мене OpenTest2 надзвичайно важлива система, бо це перша система над якою я працював і якою користуються тисячі людей.

Так що якщо вам потрібно тестувати когось, то рекомендую звернути увагу саме на OpenTest2 і я б замітив той ньюанс що по можливостях, по внутрішніх алгоритмах вирахування балів, в світі система унікальна і однозначно краща!

Доречі безпека системи - це моя відповідальність. І якщо ви щось найдете, то з мене піца!

Posted by spirit

Коли виникають великі навантаження на базу данних то ставлять більший сервер, потім ставлять два крутих сервера, далі може ще трішки їх додають, але чим далі - тим все складніше, бо маштабування в звичайних базах данних майже відсутнє. І сьогодні хочу розповісти про key-value бази даних і про приклад їх використання на прикладі блогу зробленого в Django і в якості бази даних використовую Redis. Але зараз вже 6-та година ранку і писати мені лінь, тому дальше буде скрінкаст:

Django and Redis from presidentua on Vimeo.

А знявши скрінкаст побачив, що трішки ранковий голос мене підкачав та й занадто тихо говорю, тому потрібно б розповісти і словами.

Отдже Redis це представник key-value бази даних, тобто такої бази де немає sql, а є лише дві команди set і get, тобто по суті звичайний масив, але через таку простоту база даних працює надзвичайно швидко і дуже легко маштабується і нові сервера доставляються за декілька хвилин. Хоча ці ж обмеження заставляють думати над архітектурою БД набагато більше чим зі звичайною.

Continue reading...
Posted by spirit

Сегодня продолжим знакомство с Django и наконец то рассмотрим базовый кирпич, а именно приложение(application) на примере создания приложения contact, для отсылки каких-то сообщений администрации. Причем напомню что этот цикл практический, в нем я почти не рассказываю почему, лишь говорю как, потому что я все равно не напишу лучше чем в документации: http://docs.djangoproject.com/en/dev/

Разработка каждого приложения начинается с команды:

manage.py startapp contact
Где contact - названия приложения. В результате будет создана папка contact со следующими файлами:
- models.py
- views.py
- __init___.py
Continue reading...
 
 
 

Contacts

Роман Хоменко aka PresidentUA
mail/jabber: spirt40@gmail.com

Creative Commons License