<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Dmitry Podgorniy, posts tagged: проект выходного дня</title>
<link>https://blog.dmitrypodgorniy.com/tags/proekt-vyhodnogo-dnya/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Правильный alfred workflow для перевода ru-en и en-ru</title>
<guid isPermaLink="true">https://blog.dmitrypodgorniy.com/all/pravilny-alfred-workflow-dlya-perevoda-ru-en-i-en-ru/</guid>
<link>https://blog.dmitrypodgorniy.com/all/pravilny-alfred-workflow-dlya-perevoda-ru-en-i-en-ru/</link>
<comments>https://blog.dmitrypodgorniy.com/all/pravilny-alfred-workflow-dlya-perevoda-ru-en-i-en-ru/</comments>
<description>&lt;p&gt;Результат: &lt;a href="https://github.com/podgorniy/alfred-translate"&gt;https://github.com/podgorniy/alfred-translate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Заметил, что пользуюсь переводом, чтобы придумать корректное название переменной, или понять английское слово. Процесс выглядит так: открываю браузер, открываю страницу перевода, вбиваю текст, выделяю перевод, копирую, вставляю. Многовато телодвижений, несмотря на то, что все действия отлажены. К тому же гугловый переводчик, которым периодически пользуюсь, не умеет автоматически понимать язык с которого переводить, а это означает еще несколько движений, чтобы настроить направление перевода (чтобы в следующий раз снова менять настройки). Яндекс перевод в этом плане умнее.&lt;/p&gt;
&lt;p&gt;При попытке упростить этот процесс, нашлись только варианты workflow, в которых авторы предлагают вводить направление перевода вручную. Получается многословно, да и неудобно, например как &lt;a href="https://github.com/thomashempel/AlfredGoogleTranslateWorkflow"&gt;этом случае&lt;/a&gt;. В идеале workflow должен сам понимать с какого языка переводить. С немецким, французским, английским этого достичь не так просто, а вот для пары русский-английский – пара пустяков.&lt;/p&gt;
&lt;p&gt;Идеальный вид:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.dmitrypodgorniy.com/pictures/alfred-translate-in-action.png.png" width="638" height="319" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В качестве сервиса перевода используется &lt;a href="http://api.yandex.ru/dictionary/doc/dg/reference/lookup.xml"&gt;API Яндекс словарей&lt;/a&gt;. Альфред писать расширения на ряде языков, где ноды, к сожалению нет. Наверняка ноду можно к нему прикрутить, но это бы усложнило жизнь потенциальным пользователям расширения (не я один могу страдать от реализаций существующих workflow). Среди языков – bash, applescript, php, python, perl, ruby. Выбор пал на python, заодно подучил его.&lt;/p&gt;
&lt;p&gt;Из интересных решений – API словаря требует явно указать направление перевода (en-ru, ru-en), поэтому нужно отличать на уровне workflow язык ввода: латинские буквы – значит en, иначе – ru.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;UPD&lt;/b&gt;&lt;br /&gt;
Забыл описать как им пользоваться. Можно переводить текст из самого окошка альфреда, ключевое слово – “t”. После “t” пишешь слово, что нужно перевести, и получаешь список вариантов. Плюс можно используя глобальный шоткат ctrl+shift+t перевести любое выделенное слово (без необходимости копировать). При выборе одного из вариантов перевода по enter, текст перевода копируется в буфер обмена.&lt;/p&gt;
</description>
<pubDate>Thu, 09 Jan 2014 08:06:31 +0200</pubDate>
</item>

<item>
<title>Игра жизнь на javascript</title>
<guid isPermaLink="true">https://blog.dmitrypodgorniy.com/all/igra-zhizn-na-javascript/</guid>
<link>https://blog.dmitrypodgorniy.com/all/igra-zhizn-na-javascript/</link>
<comments>https://blog.dmitrypodgorniy.com/all/igra-zhizn-na-javascript/</comments>
<description>&lt;p&gt;Модель, показывающая возможность появления стабильных структур при простых начальных правилах в условиях замкнутой среды. &lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;Вики в помощь&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/projects/conways-game-of-life/run.html"&gt;Результат&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Игра состоит в том, что вселенная – поле из клеточек, имеет заполненные (живые) и пустые клетки (мертвые). Каждую итерацию клетка может “ожить”, “умереть”, или “продолжить жить” в зависимости от состояния ближних клеток (восемь штук в разных направлениях)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eсли рядом с метвой есть 3 живых, то клетка “оживает”.&lt;/li&gt;
&lt;li&gt;Eсли рядом с живой есть 2-3 живых, клетка продолжает жить.&lt;/li&gt;
&lt;li&gt;Eсли рядом с живой 1 или больше 3 живых, клетка “умирает”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;При таких простых условиях появляются стабильные структуры (пульсары), структуры, двигающиеся по вселенно, структуры порождающие другие структуры. Чем не модель зарождения жизни.&lt;/p&gt;
&lt;p&gt;Вселенная может быть замкнутой поверхностью, когда правый край – продолжение левого, а верх – продолжение низа. Такой подход используется в реализации. Для хранения вселенной используется одномерный массив в ущерб простоте доступа к соседним элементам клетки. В будущем планируется переход на  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays"&gt;типизированный массив&lt;/a&gt; для скоростных оптимизаций. Поэтому проще в первой реализации описать формулы доступа к соседним клеткам через индекс клетки и ширину и высоту вселенной.&lt;/p&gt;
&lt;p&gt;Формулы доступа к соседним клеткам писались вручную для каждого соседа, с учетом “сворачивания” вселенной. Код неоптимизирован. Например, если рядом с живой клеткой уже есть 4 живых, она в любом случае умрет, и не имеет смысла продолжать искать живых соседей у нее. Но скорее всего его оптимизация принесет больше проблем с усложнением кода, чем решит вопросов производительности.&lt;/p&gt;
&lt;p&gt;По хорошему, формулы вычисления индекса соседних клеток надо было бы прогнать через юниттесты. Но лень сделала свое дело. К тому же опыт работы с канвасом показывает, что частые действия лучше не выносить в методы. Для отладки использовался консоль лог индекса элемента и индекс его верхнего левого соседа, например, а корректность проверяется по начерченной таблице на листике.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.dmitrypodgorniy.com/pictures/conway-tests.jpg" width="640" height="480" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Второй этап проверки – запустить &lt;a href="http://en.wikipedia.org/wiki/File:Game_of_life_animated_glider.gif"&gt;шагающую структурку&lt;/a&gt;, и убедиться, что она не ломается.&lt;/p&gt;
&lt;p&gt;Производительность первого вариант желает лучшего как в плане математики, так и в плане FPS (более менее смотрится поле 320 x 240, увеличение ведет у проседанию FPS – ов на моем ноуте).&lt;/p&gt;
&lt;p&gt;Интересно выглядит лесенка javascript heap в вебинспекторе&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.dmitrypodgorniy.com/pictures/conways-js-heap.png" width="1125" height="64" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Все из-за того, что на каждую итерацию создается новый массив. Возможно копирование массива можно будет избежать, используя несколько &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView"&gt;arrayBufferView&lt;/a&gt; для типизированного массива..&lt;/p&gt;
&lt;p&gt;Список возможных оптимизаций. Хороший повод потрогать новые технологии, кстати.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вынести математику в webworker. Иметь запас вычисленных состояний поля на несколько итераций вперед&lt;/li&gt;
&lt;li&gt;Использовать типизированный массив.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://asmjs.org"&gt;asm.js&lt;/a&gt;. Для меня было странным не найти компилятора из js в asm.js. Поищу еще, но я был уверен, что такой существует.&lt;/li&gt;
&lt;li&gt;Не перерисовывать те области канваса, которые не требуют перерисовки.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Этого эксперимента не было, если бы ему не предшествовали &lt;a href="/blog/pro-zarozhdenie-zhizni-na-zemle/"&gt;размышления о жизни&lt;/a&gt;.&lt;/p&gt;
</description>
<pubDate>Thu, 19 Dec 2013 15:53:41 +0200</pubDate>
</item>


</channel>
</rss>