spiiin: (Default)
Небольшая, но полезная функция для поиска наибольшего по площади прямоугольника одного цвета на Python. Всякие OpenCV, Python Image Library, Plotlib и Jupyter Python просто чтобы показать, как конвертировать картинку в матрицу и обратно.

https://github.com/spiiin/FindMaxFilledRectangle/blob/master/example.ipynb


spiiin: (Default)
(Лично мне на политику жж, вообще говоря, пофиг, просто захотел почистить список друзей от мёртвых журналов, сообществ, а также от тех, кто переехал в dreamwidth, чтобы 2 раза их не читать, а через RSS-агрегатор это сделать намного удобней, другого способа получить последие несколько записей из каждого журнала/сообщества я не нашёл).

Но если вы из "переехавших", но хотите читать ленту друзей в живом журнале, вам может пригодиться.

RSS я не пользовался со времён закрытия Google Reader'а, лень было подбирать другую программу. Сейчас взял Inoreader, на первый взгляд он хорош.

Сам ЖЖ утверждает, что экспорт всей ленты друзей доступен только пользователям с подключенным пакетом "профессиональный". Не знаю, что это значит, но по ссылке http://www.livejournal.com/tools/opml.bml?user=<USERNAME> можно скачать файл со списком всех лент друзей в формате opml, который можно импортировать в любую программу по чтению RSS.

Единственное, что мне не понравилось, что в качестве названий блогов жж выдаёт название журнала, в котором большинство пользователей пишут шутки, афоризмы и прочие малопонятные для распознавания журнала вещи, поэтому я прогнал этот файл через такой python-скрипт, который заменяет название журнала на ник пользователя, по которому намного проще узнать журнал:

with open("lj.ompl") as f:
    ll = f.readlines()
 
for l in ll:
  if l.startswith("<outline"):
    for m in re.finditer('<outline text="(?P<t1>.*?)" xmlUrl="http://(?P<t2>[a-zA-Z0-9_\-]+).livejournal.com/data/rss" />', l):
      g1 = m.group('t1')
      g2 = m.group('t2')
      ans.append (l.replace(g1, g2))
 
 with open("lj_fixed.ompl") as f:
    f.writelines(ans)



Tags:
spiiin: (totoro)
Как в python собрать функцию, которая после вызова pickle.loads совершит любое действие.

Программирование с помощью виртуальной машины pickle:
http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf

Сериализация функции:
https://www.cs.uic.edu/~s/musings/pickle/

Выполнение кода и открытие сокета с remote shell:
https://blog.nelhage.com/2011/03/exploiting-pickle/
Tags:
spiiin: (totoro)
https://www.root-me.org/en/Challenges/App-Script/

Отличные челленджи на поиск уязвимостей в скриптах на различных языках – достаточно сложные (решения минимум в 2-3 этапа), требуют знаний в нескольких областях одновременно, не все решения запалены в интернете. Обнаружил, что знаю Python достаточно, чтобы почти полностью самому в них разобраться. Прошёл все пять:

В принципе, и так известно, что не надо совать в eval и pickle.loads ничего, что пришло от пользователя, но после выполнения таких заданий понятно, что не надо так делать СОВСЕМ (даже максимально отфильтровав ввод), потому что даже с очень сильными ограничениями пользователя, он всё равно сможет запустить любой код, который ему захочется.
Tags:
spiiin: (totoro)
Нашёл замечательную библиотеку Selenium по управлению браузерами, как headless (Phantom-JS/HTMLUnit), так и "настоящими" (Firefox/Chrome/IE/Safari и ещё десяток third-party драйверов для браузеров на любой вкус) локально или удалённо.

Позволяет "нажимать" на элементы, ожидать результатов асинхронных запросов по условию, выполнять JavaScript в контексте DOM-страницы и вообще почти любые фишки, которые умеет браузер.

Когда-то юзал для выполнения простых JavaScript на странице Greasemonkey, а для парсинга сайтов mechanize (уже мертва, приходится дописывать нужные фичи самому), теперь с этим проектом можно пойти намного дальше и наавтоматизировать всякого на Python или C# (а также Ruby, Java или JavaScript).
Tags:
spiiin: (totoro)
В Python else можно использовать не только как альтернативную ветку для if, но как альтернативную ветку для циклов for/while (выполнится в случае, если цикл не прерывался с помощью break), и как альтернативную ветку для try/except (выполнится в случае, когда исключений не было).

Пример из документации
Tags:
spiiin: (2D)
Четверо программистов собрались, чтобы сделать библиотеку для визуализации BigData в браузере VisPy. По описанию, это должно быть удобное средство высокоуровнего описания сцены, но при беглом изучении мне показалось, что на текущей стадии разработки их обёртка над OpenGL под названием gloo не такая уж high-level – для её использования нужно иметь те же знания, что и при использовании OpenGL, понимать, что такое буферы данных, вершинные аттрибуты и переменные, а также фигачить шейдеры вовсю. За счёт этого её можно использовать в качестве обучения OpenGL и экспериментов с шейдерами.
Пример ноутбука с использованием VisPy, вывод осуществляется с помощью WebGL. Библиотека может использовать в качестве бекэнда не только WebGL, но и PyQT, PiSide, Pyglet и другие, но мне показался интересным вывод графики прямо страницу в ноутбуке Jupyter.
Получается примерно такая анимированная картинка:
Tags:
spiiin: (2D)
Ссылки на тему L-систем:

Теория и примеры
Введение доступным языком
http://mech.math.msu.su/~shvetz/54/inf/perl-problems/chLSystems.xhtml
Пара коллецкий с формулами
http://fractalworld.xaoc.ru/L-system_collection
http://dmitriyku.narod.ru/html/gallery_lfr.htm
Модули черепашьей графики для Python и Jupyter (годятся для отрисовки несложных итераций)
https://docs.python.org/2/library/turtle.html
https://github.com/takluyver/mobilechelonian
Ссылки и книга Algoritmic Beauty of Plants
http://algorithmicbotany.org/
Статьи про генерацию моделей на Python
http://prideout.net/blog/?p=72

Софт
L-Studio Генератор на "черепашьем" языке с большим количеством примеров генерации растений. Легко подставлять обычные формулы из примеров
FractInt Старая известная программа под DOS, поддерживает генерацию разными способами, в том числе и через L-системы.
Context Free 2D генератор систем на основе Shape-грамматики (вроде так называется, задаются правила генерации на основе других правил и примитивов).
Structure Synth 3D генератор на языке EisenScript с поддержкой разных фич, вроде интерпретатора JavaScript и встроенного рейтрейсера.
Tags:
spiiin: (2D)
Так как оживить IronPython для работы с Jupyter у меня не получилось (pyzmq собрать под него целый квест с кучей патчей, получилось только пересобрать своими силами IronClad и через него запустить IPython, чтобы выводить данные в Visio, как здесь), то вместо него научился пользоваться Python.NET, который позволяет загружать .NET-сборки в обычный Python и вызывать методы из них, что, собственно, мне  и требовалось.

На всём этом собрал примерчик, как загрузить готовый конфиг для CadEditor'а и отрендерить графику уровней Чёрного Плаща прямо в браузере:
http://nbviewer.jupyter.org/github/spiiin/CadEditor/blob/master/JupyterCadEditor/CadEditor-example-dwd.ipynb
spiiin: (2D)
Хочется его в Jupyter запихать и заниматься исследованием содержимого сборок.
В Microsoft на него уже забили и пилят ноутбуки на обычном python-е. Ещё есть странный Calico, в котором есть привязка дотнета к jupyter'у, и ноутбуки на IronPython под Mono и всё это для программирования роботов из браузера, из которого остались только плагина для проверки синтаксиса, а сам проект трансформировался в Calysto, который уже без IronPython, зато с метакернелом, через который подключены Closure, Prolog и другая лабуда.
Tags:
Feb. 17th, 2016 10:49 pm

Milight

spiiin: (2D)
Лампочки для дистанционного управления через интернет через WiFi — неотъемлемый компонент умного дома в моём понимании. Если компьютер в состоянии принести пиво из холодильника, приготовить чай, изменить температуру с минимальными усилиями, то твой достаточно дом умён. Пока что есть хотя бы лампочки. В отличие от от Philips Hue, которые стоят не-Hue-во, комплект из 4-х RGBW Milight-лампочек, пульта управления и Wi-Fi приёмника можно приобрести за 50-60$. Есть белые лампочки, в которых изменяется только яркость освещения, но мне, как фанату цветного освещения, больше понравились лампы с заявленными 24 миллионами цветов, некоторые из которых ещё и флюрные.

На лампочках есть несколько простых программ смены цветов, в стиле новогодних гирлянд, но возможно программировать их и самому.
Минус — закрытый протокол лампочек, в отличие от филипсовских, у которых торчит API для программиста. Но народные умельцы разобрали его, и можно хоть написать свою библиотеку, хоть воспользоваться одной из нескольких уже готовых, например, этой. Код, как обычно на Python, выглядит просто:
import milight
#соединяемся с WiFi-контроллером лампочек
controller = milight.MiLight({'host': '10.10.100.254', 'port': 8899}, wait_duration=0)
#включаем первую лампочку
controller.send(light.on(1))
#меняем цвет 1-й включенной лампочки на красный
controller.send(light.color(milight.color_from_rgb(0xff, 0x00, 0x00), 1))

Если же не хочется писать свой код, можно воспользоваться какой-нибудь готовой программой, лучшая из опробованных — Milight Controller, которая умеет подстраивать цвет лампочек под цвет картинки на экране либо под звук с колонок по нескольким алгоритмам. Получается что-то вроде такого:

Первые пробы на Мортал Комбате показали, что иногда лампы живут собственной жизнью, но в основном подсвечивают фон и яркие выстрелы бойцов. Но главный их эффект в этой игре — они на порядок усиливают эффект добиваний, теперь при успешном фаталити не только экран, но и вся комната окрашивается в зловещий красный цвет.
spiiin: (2D)
Приделал поддержку socks-прокси для библиотеки mechanize:
https://github.com/spiiin/mechanize

Ссылки:
http://stackoverflow.com/questions/14449974/using-tor-as-a-socks5-proxy-with-python-urllib2-or-mechanize - как использовать один прокси для всех запросов.
http://stackoverflow.com/questions/12601316/how-to-make-python-requests-work-via-socks-proxy - как использовать socks-прокси для библиотеки requests.
http://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy-with-urllib2 - способ использовать несколько socks-прокси для библиотеки urllib2.
https://github.com/Anorov/PySocks/blob/master/sockshandler.py - способ использовать socks-прокси для https-запросов (не забыть зашифровать данные с помощью tls-сокетов, иначе большинство сайтов перенаправляет https-запрос на обычный http).

Поправил пару известных багов:
https://bugs.python.org/issue7291 - авторазицинные данные отправляются на прокси, а не на запрашиваемый сайт.
https://bugs.launchpad.net/ubuntu/+source/python-httplib2/+bug/1043326 - ответом может быть не только обычная строка, но и юникодная
Tags:
Oct. 14th, 2015 09:36 pm

Fab

spiiin: (2D)
Года 4 назад начал использовать Synergy (программу для расшаривания клавиатуры, мышки и буфера обмена между компьютерами), но только сейчас понял, что меня в ней раздражает отсутствие возможности копировать файлы напрямую между компьютерами, в связи с чем решил разобраться, как это сделать получше.

Собственно, можно просто использовать протокол SCP - на одной из машин включается удалённый вход, на другую ставится клиент (вроде Putty) и после соединения файлы копируются через командную строку.

Если же файлы перебрасываются регулярно и по похожему сценарию, можно автоматизировать их передачу с помощью библиотек для работы с SSH в языках программирования, например, Paramiko в Python.

Следующий шаг для повышения удобства - абстрагирование от работы с протоколом и использование утилиты для упрощённого вызова фич SSH, для чего используется Fab, библиотека и утилита для удалённого вызова команд, надстройка над Paramico.

Основные команды (отсюда):

  1. run (fabric.operations.run)

  2. sudo (fabric.operations.sudo)

  3. local (fabric.operations.local)

  4. get (fabric.operations.get)

  5. put (fabric.operations.put)

  6. prompt (fabric.operations.prompt)

  7. reboot (fabric.operations.reboot)


  1. cd (fabric.context_managers.cd)

  2. lcd (fabric.context_managers.lcd)

  3. path (fabric.context_managers.path)

  4. settings (fabric.context_managers.settings)

  5. prefix (fabric.context_managers.prefix)

Mar. 15th, 2013 03:45 am

Nes-Disasm

spiiin: (2D)
- берем таблицу кодов ассемблера 6502

- сохраняем плагином scrapBook или чем-нибудь удобным нужные таблицы.

- пишем парсер таблиц
class Opcode:
 def __init__(self, name, stringFormat, hexCode, length):
  self.name = name
  self.stringFormat = stringFormat
  self.hexCode = hexCode
  self.length = length
 
def parseOpcode(lines):
 name = lines[0]
 ind = 1
 while lines[ind] != "" and ind < len(lines):
  ind+=1
 strings = lines[1:ind]
 lines = lines[ind+1:]
 return (name, strings), lines
 
def parseFormatString(fs):
 opf1 = fs[14:28]
 hex1 = fs[29:31]
 len1 = fs[33]
 return (opf1,hex1,len1)  
 
path1 = os.path.expanduser("opcodes_table.txt", "rt")
with open(path1,"rt") as f:
 lines = f.readlines()
lines = [x.strip() for x in lines]
 
opcodeRecs = []
while len(lines)>0:
 rec, lines = parseOpcode(lines)
 opcodeRecs.append(rec)
 
opcodes = []
for opcodeRec in opcodeRecs:
 name, strings = opcodeRec
 for string in strings:
   format, hex, len = parseFormatString(string)
   format = format.strip()
   hex = int(hex,16)
   len = int(len)
   opcodes.append(Opcode(name,format,hex,len))
 
def appendSpecial(opcodes):   
  opcodes.append(Opcode("BMI", "BMI addr+%X", 0x30, 2)) #<= 7 строк, правим руками
  opcodes.append(Opcode("BVC", "BVC addr+%X", 0x50, 2))
  opcodes.append(Opcode("BVS", "BVS addr+%X", 0x70, 2))
  opcodes.append(Opcode("BCC", "BCC addr+%X", 0x90, 2))
  opcodes.append(Opcode("BCS", "BVC addr+%X", 0xB0, 2))
  opcodes.append(Opcode("BNE", "BVS addr+%X", 0xD0, 2))
  opcodes.append(Opcode("BEQ", "BCC addr+%X", 0xF0, 2))
  opcodes.append(Opcode("CLC", "CLC", 0x18, 1))        # сделано плагинами TextFX в notepad++
  opcodes.append(Opcode("SEC", "SEC", 0x38, 1))
  opcodes.append(Opcode("CLI", "CLI", 0x58, 1))
  opcodes.append(Opcode("SEI", "SEI", 0x78, 1))
  opcodes.append(Opcode("CLV", "CLV", 0xB8, 1))
  opcodes.append(Opcode("CLD", "CLD", 0xD8, 1))
  opcodes.append(Opcode("SED", "SED", 0xF8, 1))
  opcodes.append(Opcode("TAX", "TAX", 0xAA, 1))
  opcodes.append(Opcode("TXA", "TXA", 0x8A, 1))
  opcodes.append(Opcode("DEX", "DEX", 0xEA, 1))
  opcodes.append(Opcode("INX", "INX", 0xE8, 1))
  opcodes.append(Opcode("TAY", "TAY", 0xA8, 1))
  opcodes.append(Opcode("TYA", "TYA", 0x98, 1))
  opcodes.append(Opcode("DEY", "DEY", 0x88, 1))
  opcodes.append(Opcode("INY", "INY", 0xC8, 1))
  opcodes.append(Opcode("TXS", "TXS", 0x9A, 1))
  opcodes.append(Opcode("TSX", "TSX", 0xBA, 1))
  opcodes.append(Opcode("PHA", "PHA", 0x48, 1))
  opcodes.append(Opcode("PLA", "PLA", 0x68, 1))
  opcodes.append(Opcode("PHP", "PHP", 0x08, 1))
  opcodes.append(Opcode("PLP", "PLP", 0x28, 1))
  opcodes.append(Opcode("LUA", "LUA #%X", 0x3A, 2)) #свой особый оп-код для похаченного эмулятора
 
appendSpecial(opcodes)
 
for opcode in opcodes:
 opcode.stringFormat = opcode.stringFormat.replace("4400","%X%X").replace("44","%X").replace("5597","%X%X")
 
opcodeDict = {} 
for x in xrange(256):
 opcodeDict[x] = ("XXX", 1) 
for opcode in opcodes:
 opcodeDict[opcode.hexCode] = (opcode.stringFormat, opcode.length)
 
pyFileBegin = "nes_opcodes = [n"
pyFileTempl = "  (%-16s,%d),       #%Xn"
pyFileEnd    = "]"
 
def makePyFile(fname):
  with open(fname, "wt") as f:
    f.write(pyFileBegin)
    for x in xrange(256):
      ops, opd = opcodeDict[x]
      f.write(pyFileTempl%(ops,opd,x))
    f.write(pyFileEnd)
 
path2 = "c:/users/spin/desktop/nes_opcodes.py" #сохраняем результат в файл
makePyFile(path2)
 
#функция дизассемблирования
from nes_opcodes import *
 
class ParseException(Exception):
  pass
 
def disasm(bytecode_):
  bytecode = bytecode_[:]
  while len(bytecode)>0:
    instr = bytecode[0]
    instrFormat, instrLen = nes_opcodes[instr]
    if instrLen > len(bytecode):
      raise ParseException("Invalid instruction %X : %s"%(instr,instrFormat))
    string = ""
    if instrLen == 1:
      string = instrFormat
    elif instrLen == 2:
      string = instrFormat%bytecode[1]
    else:
      string = instrFormat%(bytecode[2], bytecode[1])
    bytecode = bytecode[instrLen:]
    yield (string,instrLen)




- получаем тупой, но работающий дизассемблер 6502 в 120 строк за 20 минут
Tags:
Mar. 26th, 2012 10:34 pm

C# + PIL

spiiin: (Default)
Взять IronPython 2.6, PIL и модуль Ironclad для импорта библиотек от обычного питона в iron-версию.
Пишут, что Ironclad не поддерживает PIL, но у меня нормально интерпретируется.

//При загрузке создать картинку скриптом:
  1. const string IronPythonPath = "C:\\Program Files (x86)\\IronPython 2.6\\Lib";
  2. const string PythonPath = "C:\\Python26\\Lib\\site-packages";
  3. const int width = 64;
  4. const int height = 64;
  5. private void Form1_Load(object sender, EventArgs e)
  6. {
  7. try
  8. {
  9. ScriptEngine engine = Python.CreateEngine();
  10. //add path to PIL and Ironclad libraries
  11. var modulesPath = engine.GetSearchPaths();
  12. modulesPath.Add(IronPythonPath);
  13. modulesPath.Add(PythonPath);
  14. engine.SetSearchPaths(modulesPath);
  15. //send variables to script
  16. var scope = engine.CreateScope();
  17. scope.SetVariable("width", width);
  18. scope.SetVariable("height", height);
  19. //exec
  20. var res = engine.ExecuteFile("test.py", scope);
  21. string result = res.GetVariable<String>("result");
  22. //convert image data from string to bytes and make bitmap
  23. byte[] data = Encoding.ASCII.GetBytes(result);
  24. unsafe
  25. {
  26. fixed (byte* ptr = data)
  27. {
  28. Bitmap b = new Bitmap(width, height, width*3, System.Drawing.Imaging.PixelFormat.Format24bppRgb, new IntPtr(ptr));
  29. pictureBox1.Image = b;
  30. }
  31. }
  32. }
  33. catch (Exception ex)
  34. {
  35. MessageBox.Show(ex.ToString());
  36. }
  37. }
//Рисование
  1. import ironclad
  2. from PIL import Image, ImageDraw
  3. img = Image.new("RGB", (width,height));
  4. d = ImageDraw.Draw(img)
  5. d.ellipse([(0,0),(width,height)], fill = (0,255,0))
  6. result = img.tostring();
Код далеко не оптимальный, но рабочий ^_^
spiiin: (Default)
Первый раз серьезно помог профайлер.
Вместо основного алгоритма, который хотел разгонять, поускорял всё остальное.
Удивился, что тормозят засунутые в цикл лямбда-функции в фильтрах типа:
for elements in allElementsSet:
  elements = filter(lambda element: element not in exceptList, elements)

Если вынести лямбду за пределы цикла или в отдельное определение, получается быстрее
Tags:
spiiin: (Default)
  1. # возвращает функцию, которая принимает произвольное число аргументов и делает системный вызов attr с этими аргументами
  2. def func (attr):
  3. def f (*args):
  4. return os.system(" ".join((attr,)+ args))
  5. return f
  6.  
  7. #класс, для которого задается метакласс, с перегруженным методом получения неопределенного аттрибута класса.
  8. class cmd(object):
  9. class __metaclass__(type):
  10. def __getattr__(cls, attr):return func(attr)
  11.  
  12. #класс с перегруженными методами класса
  13. >>> cmd.notepad()
  14. 0
  15. >>> cmd.cp("c:\\test.txt", "c:\\test2.txt")
  16. 0
  17. >>> cmd.rm("c:\\test2.txt")
  18. 0
  19. >>> cmd.echo("hello", "&", "pause")
  20. 0
  21. >>> cmd.format("C:\\")
Jan. 14th, 2011 12:21 am

twi2vk

spiiin: (Default)
Я снова есть в твиттере.
Там как и раньше, всякие ссылки, какие-то цитаты и непонятные чатеги со знакомыми.

Под катом куски скрипта на питоне для репоста твитов вконтакт.
Read more... )
Tags:
May. 19th, 2010 06:12 pm

PyBrewery

spiiin: (Default)
Либа для контроля за пивоварней на питоне.
http://code.google.com/p/pybrewery/

Tags:

Profile

spiiin: (Default)
spiiin

July 2017

S M T W T F S
      1
2345 678
9101112131415
16171819202122
23242526272829
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 06:33 am
Powered by Dreamwidth Studios