python

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 spirit

Захотілося мені, щоб на сайті відображалався номер ревізії меркуріала, на основі якої зроблений deploy(перенесення скриптів на сервер).

Спочатку думав навісити хук до меркуріала, але вирішив піти легшим шляхом, як завжди. ;))). І переписав мій скрипт для деплою. Отож раніше мій скрипт(deploy.bat) для деплою був наступний:

rmdir /S /Q temp
mkdir temp

cd temp
hg clone d:\avcheck
... тут викликаються ще декілька пітоновський скриптів
... результат закидається на сервер
Тож щоб дістати номер ревізії додав такі рядки:
cd ..
hg log --limit 1 >  ./deploy/temp/rev.txt
cd deploy
які дістають опис останньої ревізії і зберігають його в файл deploy/temp/rev.txt

Далі в deploy.bat додав, щоб в кінці запускався пітоновський скрипт, що парсить файл rev.txt, дістає номер ревізії і зберігає його в Джанговський конфіг:

import re

with open('./temp/rev.txt', 'r') as fr:
    rev = fr.readline().split(':')[1].strip()
    if int(rev) < 0:
        print "error rev"
        exit

with open('./temp/avcheck/avcheck/settings.py', 'r+') as fs:
    file_origin = fs.read()
    fs.seek(0)
    fs.write(file_origin)
    file_new = re.sub("REVISION_NUMBER = \d*", "REVISION_NUMBER = "+rev, file_origin)
    fs.write(file_new)
Тепер в мене завжди на сайті показується внизу номер ревізії ;)
Posted by spirit
Перша моя стаття з циклу про програмування Google, що була опублікована в журналі Хакер. Тут як завжди повна версія з помилками ;)

Наша "Империя зла"

Учимся покорять Google с использованием Python

Многие называют Google "корпорацией зла", хотя я и не вижу в ней ничего плохого, но если народ называет, так тому и быть. И для превращения Google действительно в "зло" научимся использовать его сервисы для своих ооочень благородных хакерских дел.

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

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

Тож маємо задачу, яка складається з 2-м частин. По-перше, нам потрібно в ДіректАдміні створити бекап. А по-друге, нам потрібно цей бекап по ФТП забрати на комп. І між ціми двома операціями потрібно зачекати хвилин з 30. Хоча зазвичай досить і 5 хвилин, але хай буде трішки більше.

import time

make_backup()
time.sleep(60*30)# = 30m
get_backup()
Continue reading...
Posted by spirit

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

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


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

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

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

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

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

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...
Posted by spirit

Вранці мене не може розбудити ні будільник, ні телефон, але нащастя може розбудити музика на ноуті. Спочатку я довгий час для цього в музикальному плеєрі AIMPi щовечора ставив таймер включення на 5-ту годину, але це ж яка трата часу постійно його вмикати ;). Далі налаштував влаштований в віндовс Task Scheduler на вмикання плеєра. Це працювало, хоча був один ньанс. Представте в 5 годин ранку під вухом на максимальній гучності починає грати плеєр... так не довго всі нерви попалити.

Отож вирішив зробити так, щоб гучність потрішку збільшувалася і звичайно ж мені в цьому допоможе Пітон. Спочатку знайшов гарний модуль для управління вінампом(http://www.shalabh.com/software/about_winamp_py.html), а потім написав такий скрипт:

import time
import os

import winamp

print 'Good Morning'

print '# start playing'
os.startfile(r'D:\musik\Futurama\futurama.PLC')
time.sleep(3)

w = winamp.winamp()
for i in xrange(0,255,5):
    print '# set volume on %s' % i
    w.setVolume(i)
    time.sleep(5)

Де спочатку запускаю плейліст, далі чекаю 3 секунди, щоб вінамп встиг завантажитися, і нарешті в циклі потроху збільшую звук. Цей скрипт поставлений на Task на ранок.

Ось така простенька річ дарує мені добрий ранок ;)

Posted by spirit

from ][akep #127


Юзаем библиотеку PyGame на примере игры "Лестница"

Игры - одно с лучших изобретений человечества. В них все мечты сбываются, в них мы рыцари, короли, боги! За десятки лет существования игр сценаристы придумали для нас множество миров, но порой так хочется создать что-то свое, тот мир, где будут царить только твои правила. В рамках этой статьи я постараюсь научить тебя использовать волшебную палочку для создания игр - PyGame.

Год назад я познакомился с PyGame и влюбился в него с первых строк документации. Сразу же я вспоминал все свои мучения, связанные с программированием на С++ в связке с DirectX, вспоминал как все жутко тормозило, и я мучился над оптимизацией… а оно все равно тормозило. Вспоминал, как для элементарных вещей нужно было писать десятки строк.

PyGame же берет все заботы на себя, нам остается лишь написать саму игру, а не думать, к примеру, как правильно загрузить картинку... А если ты не собираешься писать игры, то можешь заюзать PyGame для создания оригинальных интерфейсов в своих прогах или визуализации какой-либо информации.

PyGame - это кроссплатформенный набор модулей, построенный поверх SDL библиотеки и предназначенный для написания видеоигр. Он включает в себя библиотеки для работы с графикой и звуком, реализованные с использованием язык Python. Автор этого чуда - Pete Shinners.

Но чтобы все сказанное о PyGame не было лишь теорией, разберем написание простой игры "Лестница". Выбор игры был обусловлен редактором рубрики, который прямо сказал, что или я напишу про эту игру, или он не отдаст мне ящик минералки, который он проспорил мне на последней "научной конференции" в баре. Однако, наша "Лестница" уже не будет текстовой игрушкой. У нас будет хакерский Колобок, который должен будет пройти снизу вверх по лестницам к двери. А сверху вниз будут падать камни, так и норовящие подвергнуть нашего Колобка кровавому прессингу. Сперва я хотел рассказать тебе о каждой строчке с этой игре, но, к сожалению, игруха получилась аж на 300 строчек кода, поэтому я буду рассказывать основные моменты, которые позволят тебе понять принципы работы с PyGame, а полный код игры будет ждать тебя на диске.

Continue reading...
Posted by spirit

Сьогодні порівняємо швидкість розробки між ZF і Django на прикладі невеликого блогу. Представимо, що нам потрібно зробити блог, де були б записи, розділення на стріки і теги.

Розпочнем з ZF:

  1. Спочатку ми б створили в базі таблиці, при чому для тегів прийшлося б додаткову таблицю створювати, щоб був зв'язок багато-до-багатьох. А ще б створили таблицю для авторізації.
  2. Після цього розпочали писати б моделі, які містили б інформацію про зв'язки між таблицями.
  3. Далі пишем код для авторизації.
  4. Пишемо код форми для створення постів.
  5. Пишем код що буде формувати вивід на головній сторінці.
  6. Пишем код для перегляду постів посторінково(pagination).
  7. Пишемо код для перегляду кожного поста окремо.
  8. Пишем код для тегів, тобто їх парсинг, занесення в базу, відображення хмарки тегів.
Ви помітили, що постійно нам потрібно щось писати, робити вручну все. На ZF надзвичайно важко робити модулі, які б з легкістю можна добавляти в аплікейшн. На Django ж це все по іншому, там ми беремо готові компоненти і поєднуємо їх. А коли компонента немає, то пишемо самі, але один раз, далі будемо його з легкістю використовувати.
Але давайте подивимося, як вищеперечислені пункти ми б робили на Django
  1. Створюємо лише одну модель, де все опишем. Ніяких таблиць вручну не створюємо, додаткової таблиці не потрібно. Для поля з Тегом нам потрібно лише вказати, що це буде поле з тегом і все. Робота по створенню ції моделі займе лише декілька хвилин.
  2. ... це все зробили в пункті 1.
  3. Для авторизації використовуємо влаштований модуль, тому цей этап знову займає 0 хвилин.
  4. Для створення постів потрібно створити лише один файл з 3 строчками. 1 хв.
  5. Вивід на головній сторінці пишеться за декілька хвилин разом з сторікновістю(pagination), буде строчок 5 займати.
  6. це вже написали вище в п.5.
  7. Для окремого перегляду використовуємо стандартний views. Тому все це займає одну строчку і час 30 с.
  8. Для тегів вже все написано ;). 0 с.
Час на створення блогу хвилин 10 і це максимум(звичайно без дизайну). В найближчий час зніму окремий скрінкаст, щоб довести це.
 
 
 

Contacts

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

Creative Commons License