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

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


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
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, которая умеет подстраивать цвет лампочек под цвет картинки на экране либо под звук с колонок по нескольким алгоритмам. Получается что-то вроде такого:

Первые пробы на Мортал Комбате показали, что иногда лампы живут собственной жизнью, но в основном подсвечивают фон и яркие выстрелы бойцов. Но главный их эффект в этой игре — они на порядок усиливают эффект добиваний, теперь при успешном фаталити не только экран, но и вся комната окрашивается в зловещий красный цвет.
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)

spiiin: (2D)
Как-то попросили помочь с транскрибированием нескольких десятков часов аудио в текст. Бесплатных программ с поддержкой требуемого языка не нашлось, поэтому полез искать, как это сделать быстро и просто. Обнаружил несколько веб-сервисов, предлагающих распознавание звука в текст, каждый из которых использовал Web-Speech API (поддерживается только в браузере Chrome):
Демка использования Web Speech Api от гугла
Демка ограничена 5 минутами распознавания за раз, а найденные сервисы почему-то периодически роняли браузер, из-за чего использовать их несколько часов подряд было невозможно, поэтому я решил модифицировать демку под свои нужды (после окончания распознавания автоматически запускать его снова).
  recognition.onend = function() {
    final_transcript += interim_transcript;
    interim_transcript = "";
    if (isRestart) {
      setTimeout(letStart, 2000);
    }
  };
 
  recognition.onresult = function(event) {
    interim_transcript = "";
    for (var i = event.resultIndex; i < event.results.length; ++i) {
      if (event.results[i].isFinal) {
        final_transcript += event.results[i][0].transcript;
      } else {
        interim_transcript += event.results[i][0].transcript;
      }
    }
    final_span.innerHTML = final_transcript;
    interim_span.innerHTML = interim_transcript;
    window.scrollTo(0,document.body.scrollHeight);
  };


Следующая проблема - распознавание голоса идёт с микрофона, а надо было распознавать звук из файла. Она решилась установкой драйвера Virtual Audio Cable (Инструкция по настройке), который перенаправляет звук с динамиков на виртуальный микрофон.

Последние штрихи в настройке - использование Web Speech Api требует веб-сервера для запуска, так что пришлось установить Apache и настроить на нём доступ через https (это нужно, чтобы браузер не запрашивал разрешение на доступ к микрофону перед каждым запуском распознавания). Бонусом получилось распределить распознавание между двумя домашними компьютерами.

Для управления процессом я поставил на них Team Viewer, чтобы раз в полчаса заходить с телефона на оба компьютера и проверять, всё ли идёт как надо. Вдобавок обнаружил его приятную особенность - аудиодрайвер передачи звука глушит обычный вывод звука на динамики, но Team Viewer позволяет прослушать звук с компьютера, так что возможно на слух проверить качество распознавания. Которое, кстати, оказалось довольно высоким (около 90%), так что для финальной обработки достаточно было только исправить мелкие ошибки распознавания и расставить знаки препинания.

Так за вечер у меня получился маленький уютный домашний сервер для транскрибирования.
Tags:
spiiin: (Default)
xcrun -sdk iphoneos lipo -info $(FILENAME)
(В отличие от вызова lipo на маке, корректно показывает архитектуру arm64)


//
xcrun -sdk iphoneos lipo -create $(FILENAME1) $(FILENAME2)-output 
$(OUT_FILENAME)
(Создать бинарник с несколькими архитектурами из отдельных бинарников)
Tags:
spiiin: (Default)
Забыл зарядить камеру GoPro, и во время съемки она вырубилась. В результате получилась испорченная файловая система на флешке (флешка отображалась под windows как чистая).
Видео было жалко, поэтому решил попробовать восстановить. Понадобился ноут с кардридером (чтобы карточка отображалась как съёмный диск), и софтина для восстановления удалённых файлов. Из опробованных на практике лучше всего себя показала HetManRecovery (fat32 разновидность), обнаружившая все файлы.

После этого оказалось, что полученные видео не проигрываются ни одним плейером - длина видео отображается правильно, но изображение и звук отсутствует. Беглым поиском в интернете нашёл отличную утилиту для финализации видео - recover_mp4_to_h264.
Инструкция по использованию на странице утилиты - берём хотя бы один хороший файл, снятый камерой (в том же разрешении, что и повреждённые), выдираем из него заголовки, дальше пытаемся перекодировать (хотя бы частично целые) битые файлы, получаем видео в формате h264 и звуковую дорожку aac.
В конце снова кладём видео- и звуковую дорожки в контейнер mp4 с помощью утилиты yamb.

С помощью такого способа удалось восстановить процентов 30 от всех потерянных файлов.
Tags:
spiiin: (Default)
#include <CoreFoundation/CoreFoundation.h>
extern "C" void NSLog(CFStringRef format, ...);
NSLog(CFSTR("%d"), 42);  


Ну и линкеру -framework Foundation
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)
Есть такие задачи, для которых нормальных бесплатных программ нету, и разработчики продают свои творения за $x9.99, либо показывают тонну рекламы, либо и то и другое. Как, например, пакетная конвертация видео для psp.
А можно просто взять кодек FFMpeg и делать так:

для кодирования с помощью xvid
ffmpeg -i %1 -acodec aac -vcodec libxvid -f psp -s 320x240 -r 29.97
-b 768k -ar 24000 -ab 64k -strict experimental %2.mp4

для кодирования с помощью h.264
ffmpeg -y -i %1 -s 320x240 -r 25 -an -pass 1 -vcodec libx264
 -b 1400k -bt 2000k -flags +loop -cmp +chroma -partitions
 +parti4x4+partp8x8+partb8x8 -refs 2 -me_method umh -me_range 17
 -subq 1 -trellis 0 -coder 1 -bf 7 -b_strategy 1 -threads 0 -g 300
 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qcomp 0.6
 -qmin 10 -qmax 51 -qdiff 4 %2.mp4
ffmpeg -y -i %1 -s 320x240 -r 25 -acodec aac -ab 160k -ar 48000
 -pass 2 -vcodec libx264 -b 1400k -bt 2000k -flags +loop 
-flags2 +mixed_refs+wpred-fastpskip -cmp +chroma 
-partitions +parti4x4+partp8x8+partb8x8 -level 30 
-refs 2 -me_method umh -me_range 17 -subq 7 -trellis 2
 -coder 1 -bf 7 -b_strategy 1 -threads 0 -g 300 
-keyint_min 25 -sc_threshold 40 -i_qfactor 0.71
 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -strict experimental %2.mp4
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:\\")
spiiin: (Default)
Дописал парсер севастопольского городского форума для просеивания тонн объявлений о сдаче жилья.

(!) Если кто объяснит, как можно организовать весь процесс проще или правильнее, буду только рад.
Парсинг и разбор сделал на Python, дальше инфа кладется в MongoDB, откуда считывается и отображается на форму WinForms с кнопочками и на C# анализируется и фильтруется. WinForms, потому что WPF напугал огромным объемом документации. Думаю о том, чтобы вместо формы отображать исходную страницу в браузере и вырезать ненужные строки / дорисовывать свои столбы на JS.

Дальше просто описание парсера. )
Tags:
Mar. 23rd, 2011 12:57 am

Totoro

spiiin: (Default)
Добрее мультика не видел еще.
Большой, толстый котобус
ffmpeg
imagemagick
ffmpeg.exe -vcodec mpeg4 -i totoro.avi -ss 1:20:05 -vframes 96 -v 0 movie%%03d.png
for %%x in (*.png) do convert.exe %%x -resize 75%% %%~nx.jpg
convert *.jpg kotobus.gif
spiiin: (Default)
Надоело при работе переключаться между клавиатурой и мышью компа и ноута. Теперь юзаю программу Synergy, простую и удобную до безобразия. Принцип действия - при достижении края одного экрана, курсор мыши "перепрыгивает" на соседний, и события от клавиатуры и мышки начинают по сети отправляться другой системе. Поддерживается до 15 мониторов, есть версии под Windows, Linux и Macos. В качестве бонуса также передается соседней машине текст из буфера обмена.
Tags:
spiiin: (2D)
В коммандных файлах windows можно делать списки из нескольких строк с помощью символа "^":
set m=^
1 ^
2 ^
3
for %%f in (%m%) do ^
echo %%f
Tags:
Mar. 14th, 2010 01:40 pm

Utel

spiiin: (Default)
Настроил себе 3G-интернет от Укртелекома. Сам удивился, как просто все получилось, до этого любые действия по коннекту телефона и компьютера требовали шаманства и плясок с бубном.
А тут - после включения карточки в телефон сразу пришли настройки, а на компьютере Виста, как оказалось, уже сама установила драйвера для модема телефона. Осталось только найти строку инициализации (AT+CGDCONT=1,"IP","3g.utel.ua") и номер дозвона (*99#) и вуаля:
Tags:
spiiin: (Default)
Запись из архива

Скрипт на питоне, который умеет выкачивать все картинки из альбома Вконтакте

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

Для работы нужен Python , аккаунт вконтакте и прямые руки.

Выглядит вот так -


Скрипт валяется  тут

Profile

spiiin: (Default)
spiiin

September 2017

S M T W T F S
     1 2
34 567 89
101112131415 16
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2017 05:46 pm
Powered by Dreamwidth Studios