Пітон

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

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

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

import os
from time import gmtime, strftime
import subprocess
import zipfile

mysql_user = 'root'
mysql_pwd = '12345'
mysql_db = 'super_puper_db'
dump_dir = 'c:\\temp\\'

dump_file = "mysqldump-" + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
dump_file_zip = dump_file+'.zip'
dump_file += '.sql'

subprocess.call("mysqldump --user " + mysql_user + " --password=" + mysql_pwd + " --force --flush-privileges --compress --comments " + mysql_db + " > " + dump_dir + dump_file, shell=True)

zf = zipfile.ZipFile(dump_dir+dump_file_zip, 'w', allowZip64=True)
zf.write(dump_dir+dump_file, dump_file, zipfile.ZIP_DEFLATED)
zf.close()

os.remove(dump_dir+dump_file)
Posted by admin

Цей простий алгоритм штучного інтелекту знав ще зі школи. Про нього було написано в якійсь радянській книжечці типу "Наука і Техніка". Тож після десятирічь забуття, про нього згадав після наступної статті на Хабрі - http://habrahabr.ru/blogs/artificial_intelligence/84125/ (раджу прочитати зараз).

Позавчора ввечері потратив аж півгодинки свого часу і в результаті вийшов скриптик на пітоні з 75 строчок(хоча сам алгоритм гри лише 30 строчок), що реалізує цей алгоритм. Що найдивовижніше - це те що воно ще й працювало )

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

Self-Education Python Script from presidentua on Vimeo.

Continue reading...
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

Захотілося мені, щоб на сайті відображалався номер ревізії меркуріала, на основі якої зроблений 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 Wave. Саме цю "чудову" штуку вони охрестили вбивцею почти, чатів, форумів і всього-всього іншого - я навіть дивуюсь, чому не сказали що Вейв вб'є весь інтернет. Хоча якщо подивитись детальніше, то вони зробили аналог IRC, що працює в Вебі і має прикольний API - ото й все. Немає в ньому нічого нового, нічого революційного. Хоча це не значить, що Вейв поганий... Він прикольний - якщо його правильно використовувати. І про саме правильно використання поговоримо...

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

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

Continue reading...
Posted by spirit

Для конвеєрного взлому сайтів потрібно подивитися відео:

Демонстрация работы скриптов. Хакер #5 from presidentua on Vimeo.

І скачати скрипти.

Детальний опис розробки цих скриптів опублікований в 5-тому випуску Хакер за 2009 рік, і на цьому блозі за місяц я також опублікую.

 
 
 

Contacts

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

Creative Commons License