spiiin: (Default)
Есть ли такие типы программ, за написание которых разработчик, по вашему мнению, должен отправиться в ад, ну или хотя бы в чистилище? Не конкретные программы, которые вам не нравятся, а именно области, которых "хорошему" разработчику лучше даже не касаться, чтобы не марать руки и карму.

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

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

Наоборот, к областям, однозначно хорошим, отнёс бы разработку игр (хотя, конечно, за качество и модели монетизации иногда хочется отрывать руки), и всё, связанное с наукой.
Tags:
spiiin: (Default)
...объявляется финансово провалившимся. Официально :)

Через недельку заканчивается подписка от Apple, за год приложение "продалось" около 100 раз, бесплатная версия была скачана около 300 раз.
Сделал его полностью бесплатным. Может, когда-нибудь запилю андроид-версию.




Однако, с нефинансовой стороны, всё вполне удовлетворительно.

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

- Был стимул начитаться статей по геймдизайну, способам программной генерации контента, монетизации (ничего из этого я не использовал в игре, потому что изучал всё уже после того, как занимался игрой).

- Разработчик игр и так зачастую мультифункциональный комбайн (занимается вообще всем), непонятно, как при этом можно ещё и вести блоги о разработке и писать в социальные сети. Не знаю, как инди-разработчики ухитряются, например, помимо разработки, снимать качественные ролики для кикстартера с рассказами о своих приключениях. Я бы на это явно выделял отдельного человека.
- Собственно, вволю наигрался с пластилином (ролик Cube for Valentine's Day).

- Более чётко представляю себе круг проектов, которыми мне было бы интересно заняться в настоящий момент. Из связанного с играми было бы интересно:

1. Поработать программистом 3d-графики (одна из немногих неосвоенных мной нормально областей в геймдеве, требует хорошего знания математики, железа видеокарт и художественного вкуса одновременно :( ).
2. Заняться плагинами для 3d-редакторов, движков или другим middleware (недавно открыл для себя Python и MEL для Maya).
3. Поучаствовать в каком-нибудь конкурсе или хакатоне по играм (тут желательно с командой и с заявкой на хороший приз).
Tags:
spiiin: (Default)
Интересная глава из книги. Собственно, как блоки являются строительным элементов в 2d-уровнях, так и 3d-блоки (выровненные по сетке) зачастую являются составным элементом 3d-уровней.

http://level-design.ru/pro-ld-book-index/03-modular-level-design/
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)
Уже не очень новые, но очень смешные (только для программистов) тексты Джеймса Микенса

Переводы на русский язык парочки, больше не нашёл:
Стражи ночи
Это наш мир
spiiin: (2D)
Ни разу не оформлял документацию для своих программ (не считая "документации" к учебным программам в универе). Ну, большая часть мелких программ и скриптов в ней и не нуждалась - запускай и готово. В играх же, которыми я в основном и занимался, документацию чаще всего и не делают совсем. Часто даже для внутренних продуктов, вроде упаковщиков данных или мелких редакторов данных, хорошо ещё, если ключи командной строки все задокументированы, а не по коду надо их назначения угадывать.

Ещё кто-нибудь из знакомых есть такие?
Tags:
spiiin: (2D)
Закончил две главы приключений Робикса – обучалки программированию для детей для iOS.

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

Промо-ролик второй главы:

Бесплатная версия без рекламы и смс.
Tags:
spiiin: (2D)

Друзья, нужна ваша помощь!
Я почти доделал игру для AppStore, и мне необходимо её протестировать.
Если у вас есть iPhone или iPad и вы любите играть в игры, напишите мне.
P.S. Особо приветствуются те, кто может дать протестировать игру детям 11-13 лет.

Промо-ролик игры:


Игра – головоломка с элементами обучения программированию для детей.
Tags:
spiiin: (2D)
Программисты в душе бывают строителями и ломателями.

Строитель читает инструкцию, как строить, и строит по ней не спеша, из года в год, оттачивая мастерство строить по инструкции. Новые идеи и парадигмы так осваивать труднее, потому что он пытается строить из новых кирпичей старые конструкции как привык, ему сложнее переучиться, потому что надо изучить новую инструкцию с нуля. Из плюсов мышления строителя – он работает быстрее и надёжнее, каждое новое здание у него предсказуемо похоже на то, что было в плане, и скорее всего лучше предыдущего, потому что после 10 раз у него получается лучше, чем после 1, а после 100, лучше, чем после 10.

Ломатель смотрит на вещи по другому, он читает инструкцию, и видит в ней не только что можно делать, но и что нельзя. Поэтому он учится и тому и другому, что медленнее, чем учиться только строить. Но благодаря этим знаниям он смотрит на здание по другому, он видит, что в нём неправильно, и может либо отбросить ненужные конструкции (сказать автору плана - это нафиг не нужно, без этого будет дешевле и лучше), тогда его все любят и уважают. Но чаще бывает по другому, он видит, что здание держится на одном кирпичике. Он говорит автору плана – смотри, здесь косяк, если выдернуть один кирпич, то всё здание навернётся. За такое ломателя никто не любит – план переделывать долго и дорого, и чаще всего кирпичик подпирают костылями и продолжают строить новые дома по старым планам.

Строители улучшаются, оттачивая скорость возведения одинаковых зданий (в десять раз больше домиков за месяц – в десять раз больше денег), ломатели – строя такие здания, для которых ещё нет чётких планов и инструкций (отгрохал не церквушку, а монументальный собор – респект тебе и уважуха в веках).
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)
На случай, если разошлись контрольные суммы:
http://techblog.moudrick.net/2012/02/subversion-17-file-folders-manipulation.html
Неочевидное решение, если не знать, что "под капотом".
Tags:
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)

spiiin: (2D)
http://www.kegel.com/mangle.html
Помогает разобраться в том, почему предварительно скомпилированная библиотека не линкуется к другому коду.
Tags:
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)
Мой товарищ вконтакте устроил опрос:

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

Мне тут понадобилось разобраться с Open API вконтакте, решил в качестве тестовой задачки проанализировать данные этого опроса (с разрешения автора), чтобы оставить в нём мнение только жителей Крыма - разделить тех, кто проголосовал "Я не из Крыма, мне интересны результаты опроса" на 2 группы - выделить среди проголосовавших тех, кто на самом деле не из Крыма ("Воздержался") и сложить с остальными категориями.

Под катом код, ниже результаты.
Read more... )

Результаты (взяты только жители Крыма):

1. Мне стало жить лучше                           - 45 (30,2%) (7 вычеркнуты)
2. Мне стало жить хуже                            - 30 (20,1%)
3. Существенно не изменилась                      - 36 (24,1%) (3 вычеркнуты)
4. Я уехал (-а) на ПМЖ за пределы Крыма           - 33 (22,1%)
5. Я переехал (-а) жить в Крым меньше года назад  - 0  (0,0%)
6. Я из Крыма, мне интересны результаты опроса    - 5  (3,3%)



Меня больше всего огорчает 22,1% (каждый пятый) уехавшей молодёжи. Выборка, конечно, из тех, кто часто путешествует, но среди знакомых it-шников, субъективно, всё ещё хуже.
spiiin: (totoro)
...иногда перестают работать при копировании их с винды на мак, из-за того, что портятся концы строк в текстовых файлах:
-bash: ./PostprocessBuildPlayer_Tapjoy: /usr/bin/perl^M: bad interpreter: No such file or directory

Из самой юнити это никак не диагностируется :(
Tags:
spiiin: (totoro)
Постучался ко мне в аську как-то небезызвестный в ромхакерской тусовке Dr Mefisto, с просьбой объяснить, как устроены некоторые штуки в CadEditor'е. Выяснилось, что он разбирает сеговскую игру Thunder Force 3, и хочет портировать редактор для использования его в своих целях. Я согласился и после нескольких дней общения и его интенсивной работы редактор был готов, кроме последней фичи - запаковки измененных данных об уровнях обратно в ROM.

Игровые данные хранятся в запакованном виде, игра использует 2 алгоритма сжатия - обычный RLE и "алгоритм Иванаги" - смесь версии адаптивного алгоритма Хоффмана с алгоритмом LZ77, похожего на алгоритм Deflate (инфа о сжатии от OOStyx) ).
у Mefisto был исходник сжатия этим алгоритмом на С,  он убедился, что полученный архиватор разжимает игровые данные, но не может сжать их обратно в таком же виде. Тогда он переписал исходник построчно на паскале - архиватор заработал как надо. Для редактора он ещё раз переписал код построчно на C# – и архиватор снова перестал работать.

Тут феноменом заинтересовался и я. Можно было предположить, что C#-версия не работает из-за неверного приоритета операторов, неправильной размерности или же оттого, что где-то не случается задуманный overflow там где он должен быть из-за того, что для арифметических операций короткие типы конвертируются в int.
Также скорее всего сишный код мог не работать оттого, что собирался новым C++ компилятором - от этого, например, int мог стать 4х-байтным там, где задумывался 2х-байтным, а char, наоборот, уменьшиться от размеров целого до 1 байта. Так что я прочитал статью от одного из авторов алгоритма, и нашёл в сети бинарники архиваторов lha под win32, lharc и две версии уже собранной утилиты lzhuff под dos. При этом узнал, что существуют хранилища старых программ, требующие денег за доступ.

Дальше с помощью правильной версии разжималки были получены тестовые данные, чтобы можно было в dosbox'е запустить откопанные программы 20-летней давности.
Результат - в режиме совместимости со старыми версиями (опция архиваторов -o. случайно заметил, что полученные архивы можно открыть winrar'ом, завидная совместимость) получились архивы, которые дают такой же 1-й блок файла, 0x180 байт или около того, а дальше начинаются отличия от эталонных данных из игры.  Однако получить данные, идентичные запакованным, так и не получилось.

В этот момень Mefisto написал, что он переписал модуль компрессии в Delphi на dll и вызвал из программы на C# методы из дельфийской библиотеки, с единственным из всех рабочим кодом запаковки, и я свернул свои эксперименты. Возможно, разработчики игры просто допустили в реализации алгоритма ошибку с переполнением, которая случайно повторилась в коде на паскале.

А мораль истории в том, что работающая программа всегда состоит из набора ошибок, которые компенсируют друг друга.
Tags:

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:44 pm
Powered by Dreamwidth Studios