Немытченко http://nemytchenko.ru/blog/ <small> ((https://twitter.com/inem твиттер)) | ((http://t.nemytchenko.ru старый блог)) | ((http://instagram.com/inem инстаграм)) </small> E2 (v3074; Aegea) Основные идеи из доклада «Отвечаем на архитектурные вопросы при помощи ООП в картинках»http://nemytchenko.ru/blog/all/doklad-oop-v-kartinkah/http://nemytchenko.ru/blog/all/doklad-oop-v-kartinkah/http://nemytchenko.ru/blog/all/doklad-oop-v-kartinkah/<p>Отстрелялся на RubyRussia с докладом. Народ местами хихикал, местами ржал :)</p> <p>Началось все с безобидной идеи изображать объекты в виде чувачков с ручками, где ручки — это методы за которые можно подергать:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/6974F5D6-C59F-411E-BD1C-BF3750739F54-2.png" width="2048" height="1536" alt="little dudes" /> </div> <p>В первой части мы развиваем эту идею, и разбираемся как тогда будет выглядеть передача аргументов, возврат значений, приватные методы. Внезапно понимаем что всякие анти-паттерны становятся неплохо так наглядными:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/antipatterns-examples.png" width="766" height="385" alt="Anti-patterns examples" /> </div> <p>Отдельно хотелось бы выделить руки-базуки, на которые как-то не шибко принято обращать внимание, но тут аналогия становится настолько наглядной что ее невозможно игнорировать! :)</p> <p>Дальше мы используем получившиеся правила, чтобы изобразить более сложные концепции: полиморфизм и Dependency Injection.</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/Screenshot_2019-10-09-12.56.31_XysNqw.png" width="482" height="311" alt="Полиморфизм" /> <div class="e2-text-caption">Полиморфизм — это просто тот же набор рук с тем же кол-вом пальцев!</div> </div> <p>В последней части доклада я применяю получившийся визуальный язык чтобы проследить изменения в реальном коде в динамике. Внезапно получается очень наглядно:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/Screenshot_2019-10-09-12.59.38_jjwB4k.png" width="598" height="336" alt="Diff" /> <div class="e2-text-caption">Нет, плагина для CI который бы визуализировал диффы таким образом еще нет. Можете написать!</div> </div> <p>Посмотрите доклад, короче :)</p> <div class="e2-text-video"> <iframe src="https://www.youtube.com/embed/NnQCzhZBN0Y" frameborder="0" allowfullscreen></iframe></div> <p>Есть еще слайды отдельно:</p> <script async class="speakerdeck-embed" data-id="ca1783ad4dda4ec78c7f11d25a3698f0" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script> <p>Шутки шутками, но мне кажется что у этой идеи большой потенциал, и я собираюсь еще поработать над ней.</p> Wed, 09 Oct 2019 13:07:26 +0200Как запускать программы в макоси по расписаниюhttp://nemytchenko.ru/blog/all/kak-zapuskat-programmy-v-makosi-po-raspisaniyu/http://nemytchenko.ru/blog/all/kak-zapuskat-programmy-v-makosi-po-raspisaniyu/http://nemytchenko.ru/blog/all/kak-zapuskat-programmy-v-makosi-po-raspisaniyu/<p>Чтобы вкладка в браузере открывалась с какой-то периодичностью, есть <a href="http://www.tabsnooze.com/">Tabsnooze</a>. Я им активно пользуюсь:</p> <ul> <li>Просмотр отчетов Welltory — ежедневно</li> <li>Страница с расписанием бассейна — пару раз в неделю</li> <li>Отчеты Rescuetime, Rss Reader — еженедельно</li> <li>Страница Telenor чтобы скачать счета за мобильную свзяь — ежемесячно</li> </ul> <p>А нынче решил почаще практиковать фрирайтинг, и задумался а как сделать так чтобы ежедневно по утрам сам собой запускался Flowstate.</p> <p>Оказалось, способ есть, хоть и немного хитрожопый. Во встроенном маковском календаре есть возможность поменять алерт у события на кастомный:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/aSr3B41.png" width="968" height="780" alt="" /> </div> <p>После выбора ’Other’ выбираешь любую прогу из Applications, и он её запускает по расписанию. На здоровье!</p> Thu, 28 Mar 2019 17:30:53 +0200Мэйлчимп надоелhttp://nemytchenko.ru/blog/all/mailchimp/http://nemytchenko.ru/blog/all/mailchimp/http://nemytchenko.ru/blog/all/mailchimp/<h2>Про рассылки</h2> <p>Я фанат рассылочного формата. Мне очень вкатывает формат Ильяхова, норм пошел <a href="http://www.niceandeasy.me/xxx">курс о внимании к себе</a>. Толкового программиста я сделал тоже в формате рассылки. И сейчас думаю даже вместо книжки, Painless Rails сделать в рассылочном формате.</p> <h2>Про подсветку кода</h2> <p>Короче, долго ли коротко ли, заряжал тут свой мини-курс <a href="https://railshurts.com/rails-pitfalls">Rails Pitfalls</a> в мэйлчимп, и весь прямо извелся оттого, что нормально не мог вставить блоки кода. Посмотрел как делают другие в своем инбоксе — увидел что либо код без подсветки и отступов, либо прямо скриншотами фигачат в письмо.</p> <p>В итоге взял <a href="https://carbon.now.sh">Carbon</a> и нагенерил красивых картинок на полмегабайта, что для письма так-то по честному перебор. Плюс на мобиле мелко слишком.</p> <p>Совсем уже было расстроился. Но решил гуглить до победного. Нагуглить полезных ссылок про мэйлчимп — отдельный челлендж. Первые пять страниц выдачи забиты полумаркетинговыми материалами самого мэйлчимпа. В итоге все-таки накопалась <a href="https://templates.mailchimp.com/resources/inline-css/">тулза самого мэйлчимпа</a> и <a href="https://tohtml.com/ruby/">еще одну</a> посоветовали в тви.</p> <p>В общем все вроде просто, но если делать вид что ты блондин и пользоваться дефолтными мэйлчимпными инструментами, то получается только фигня и ненависть.</p> <h2>Про автоматические кампании</h2> <p>Вообще говоря, я видимо разбалован терраформом, из-за чего отношение к гуевым инструментам у меня теперь супер-критическое. Мне хочется накидать кампанию в YAML-файле, заготовить шаблонов с контентом, и чтобы апишкой это куданть засосалось само, само там все отправило как надо и когда надо, и отдавало бы назад статистику через вебхуки.</p> <p>В этом смысле Мэйлчимп — это просто какой-то динозавр. У них половина функционала через API вообще не доступна, вторая половина очень куцая. Вебхуков кот наплакал — о том чтобы узнать кто у тебя там отвалился речь не идет вообще — добро пожаловать в гуй, и ковыряйся там.</p> <p>В плане богатости вебхуками меня порадовал SparkPost, но там конечно никаких кампаний нет из коробки. Щас пробуем на нем сделать прототипчик, чтобы понять какие сложности возникнут, если делать это все кодом.</p> <p>Мне кажется мир ждет своего DNSimple/Now.sh/Terraform только для рассылок. Ну или я чего-то еще сильно не понимаю в email-маркетинге.</p> Sun, 30 Sep 2018 11:49:23 +0200С днем рождения меня!http://nemytchenko.ru/blog/all/happy-37/http://nemytchenko.ru/blog/all/happy-37/http://nemytchenko.ru/blog/all/happy-37/<p>Если кто-то скажет что на дворе не 37-ой год, я теперь имею право не согласиться — у меня как раз он самый. Щас будет минутка саморефлексии, а потом я расскажу как вы можете меня поздравить, если словами выразить свою радость за меня у вас не получается :)</p> <h2>Рефлексия</h2> <p>Так вышло что в найме я работал мало, все больше был какой-то полуфриланс, так и не переросший ни во что серьезное, не смотря на попытки. Какое-то время меня мотало из стороны в сторону, когда хватался за одно, бросал на пол пути, и брался за второе.</p> <p>Последние полтора года у меня происходит медленный и болезненный переход от разбрасывания камней в сторону их собирания. Главные изменения всегда происходят в голове, и на это уходит время. Так или иначе, в этом стал ощущаться некоторый прогресс, и это радует.</p> <h2>Проекты</h2> <p>Наделана куча всего:</p> <ul> <li>Книга про Rails — <a href="https://Railshurts.com">Painless Rails</a> — $29</li> <li>Курс по GitLab CI — <a href="https://gitlab-ci.rocks/">GitLab CI rocks</a> — $39</li> </ul> <ul> <li>Утилита для macOS — <a href="https://productivitymode.com/1activity">1Activity</a> — $15</li> <li>Курс-Рассылка <a href="http://smartprogrammer.ru">Толковый программист</a> — бесплатно</li> <li>Курс <a href="https://broductivity.carrd.co/">по бродуктивности</a> :) — бесплатно</li> <li><a href="https://github.com/inem/hamdown">Hamdown</a> = Haml + Markdown — пока в стадии proposal</li> </ul> <ul> <li><a href="http://strftime.guru">strftime.guru</a> — определялка формата для <b>strftime</b> — бесплатно</li> <li><a href="http://tabsqueeze.com">TabSqueeze</a> — замена хром-экстешну OneTab — бесплатно</li> </ul> <p>Про все то же самое, но поподробнее↓</p> <h2>Главное:</h2> <ul> <li><a href="https://Railshurts.com">Книжка Painless Rails</a> — о том как фигачить на рельсах без боли. Самый главный мой текущий проект. Пишется на английском по мотивам подхода к рельсоразработке Кирилла Мокевнина — одного из самых крутых программистов и учителей в рунете. Хоть рельсы в 2018 — это уже не хайп, но в рельсосообществе до сих пор не решена проблема единого годного подхода к разработке на Рельсах. Всех колбасит, все страдают, но продолжают жрать кактус, потому-что лучше рельс все-равно ничего нет ? Этот подход решает кучу рельсопроблем, и если у вас <s>пригорает</s> побаливает, то это то что доктор прописал.</li> <li><a href="https://gitlab-ci.rocks/">Курс по GitLab CI</a>. Если вы все еще думаете, что GitLab — это такой аналог гитхаба или битбакета, то у меня нет слов для того чтобы выразить как сильно вы ошибаетесь. Гитлаб — это нечто гораздо более мощное. Через несколько лет он просто сметет всех и станет новым стандартом. Если хотите оседлать следующий большой тренд, то лучше начинать тратить время (и деньги) на его изучение сейчас. Курс делался в полуcекретном режиме силами меня и моей жены(иллюстрации). В комплекте идет и <a href="https://gitlabfan.com">Gitlab Fan</a>. Как доведу Painless Rails до ума, буду добавлять уроки к этому курсу, благо материала навалом.</li> </ul> <h2>Второстепенное:</h2> <ul> <li><a href="https://productivitymode.com/1activity">1Activity</a> — утилита для macOS, помогающая справиться с бардаком в папке Downloads. GUI-часть запрограммирована Иваном Новохатским, за что ему огромное спасибо. Пока проект на паузе,</li> <li><a href="http://smartprogrammer.ru">Толковый программист</a> — (пока бесплатная) рассылка для начинающих программистов чтобы меньше тупить.</li> <li><a href="https://broductivity.carrd.co/">Курс по бродуктивности</a> — Почти серьезный мини-курс про эффективную работу с браузером.</li> <li><a href="https://github.com/inem/hamdown">Hamdown</a> — идея скрестить Haml и Markdown. Если бы такая штука была готова, удалось сделать работу над курсами и книжкой чуточку эффективней. Надеюсь запилить в ближайшие полгода.</li> </ul> <h2>Лучшие проекты сделанные в рамках стажировки:</h2> <ul> <li><a href="http://strftime.guru">strftime.guru</a> — Лучшая в своем роде тулза для угадывания формата <b>strftime</b> по образцу типа «17 December 2016, 14:44» — сделан совместно с Кириллом Звоновым</li> <li><a href="http://tabsqueeze.com">TabSqueeze</a> — Экстеншн для Хрома как OneTab, только лучше — сделан совместно с Максимом Топчу</li> </ul> <p>Если ничего из этого списка не пришлось по душе, сгоняйте посмотрите видосов <a href="https://www.youtube.com/channel/UCDPdTky4sQtQEwOLAe5v-NA">Хорошего программиста</a> на ютубе, или пройдите пару курсов <a href="https://hexlet.io">на Хекслете</a>. С обоими проектами я сильно дружу и всем заинтересованным их сильно рекомендую.</p> <p>До связи!</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/Artboard.jpg" width="780" height="780" alt="" /> </div> Thu, 20 Sep 2018 10:55:32 +0200Релиз 1Активити 0.5http://nemytchenko.ru/blog/all/1activity-0-5/http://nemytchenko.ru/blog/all/1activity-0-5/http://nemytchenko.ru/blog/all/1activity-0-5/<p>Не хотели заставлять вас часто скачивать апдэйты, поэтому не релизили так часто как хотелось бы, и накопилась куча улучшений.</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/1Activity-5.0-2.png" width="720" height="604" alt="" /> </div> <p>1) Самое главное — теперь можно будет релизиться часто, потому что впилили автообновление и кнопку «Check for updates».</p> <p>2) Еще из важного — отказались от <a href="https://github.com/julienXX/terminal-notifier">terminal-notifier</a>, и сделали нативные нотификации. Ну и да, они, кажется, отваливались в паре мест — теперь все должно работать.</p> <p>3) Нашли прекрасное. Как оказалось, макось в именах файлов буквы с умляутами и прочими закорючками раскладывает на составляющие перед сохранением:</p> <pre class="e2-text-code"><code>2.4.0 :008 &gt; &quot;сайт&quot;.chars =&gt; [&quot;с&quot;, &quot;а&quot;, &quot;и&quot;, &quot;̆&quot;, &quot;т&quot;]</code></pre><p>Называется это «unicode canonical decomposition». И, естественно никакой греп по нормальной букве «Й» с такой строкой уже не сработает. Вроде как это не баг, а фича, но воркэраунд пришлось для этого написать. Теперь все работает как надо.</p> <p>4) Открутили поллинг при обновлении названия активности в менюбаре (не спрашивайте), и впилили смену через AppleScript. Теперь гораздо меньше нагружает процессор, хотя и раньше было меньше одного процента CPU.</p> <p>5) Раньше между переключениями активностей была короткая задержка около секунды, и из-за этого если вы сразу после переключения пытались открыть текущую активность в файндере, это могло не сработать с первой попытки. Сейчас все переключается мгновенно.</p> <p>6) Добавлен сбор статистики, из которой мы будем потом рисовать красивые графики с кол-вом переключений в день и количеством активных проектов. Собираются только цифры.</p> <p>7) Переименование последнего файла в текущей активности стало чуть поумнее. Если файл с таким именем уже есть, программа создаст копию вида «file (1).md» вместо того чтобы просто перезаписать его. Чтобы перезаписать, используйте Shift+Enter</p> <p>8) Добавили в dmg-образ кнопку для тулбара в файндере. По клику перенесет вас в текущую активность</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-06-07-15-40-49-507.png" width="800" height="89" alt="" /> </div> <p>Инструкции по установке в самой dmg-шке:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-06-07-15-48-36-748.png" width="566" height="372" alt="" /> </div> <p>Буду рад вашим багрепортам и фичереквестам в <a href="https://t.me/joinchat/AAAAAELFRJWO7YtlyfQ8pA">телеграм-канале</a>. Там же можно попросить демо-версию приложения, если вдруг надо.</p> <p>P.S. Если вы не в теме, что такое 1Активити, прочитайте <a href="http://nemytchenko.ru/blog/all/1activity-release/">первый релизный пост</a> или полистайте <a href="http://nemytchenko.ru/1activity">сайтик</a></p> <h2>Купить программу:</h2> <script src="https://gumroad.com/js/gumroad.js"></script> <p><a class="gumroad-button" href="https://gum.co/1Activity?wanted=true" target="_blank" data-gumroad-single-product="true">Купить 1Activity</a></p> <h2>Подписаться на обновления:</h2> <script type="text/javascript" src="//static.mailerlite.com/data/webforms/391994/i9y7p3.js?v6"></script> Wed, 07 Jun 2017 16:10:44 +0200Как я держу ум и рабочее пространство на компе в порядке. Часть 2http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke-2/http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke-2/http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke-2/<p>Первая часть цикла: <a href="http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke/">Про миллиарды вкладок в браузере — «закрыть нельзя оставить»</a></p> <h2>Как бороться со свалкой файлов, нужна ли идеальная структура и жизненный цикл проектов</h2> <p>Когда основной вид деятельности — программирование, то все достаточно просто. У тебя есть папка с проектами в которых ты участвуешь, система контроля версий, и трекер задач. Можно даже не выходить из терминала.</p> <p>Когда начинаешь заниматься еще чем-то, то этот красивый идеальный мирок приходится покинуть. Вот примеры активностей, по которым, хочешь-не хочешь, а скопится пачка файлов:</p> <ul> <li>・Планирование поездки в другой город/страну</li> <li>・Получение визы</li> <li>・Подготовка доклада</li> <li>・Написание статьи</li> <li>・Запись вебинара/подкаста</li> <li>・Согласование дизайна</li> </ul> <h2>Если не париться</h2> <p>Когда занимаешься всем этим одновременно(а часто так и бывает), и не задумываешься о том куда что сохранять, то через время станет очень сложно находить конкретные файлы в тот момент когда они так нужны. Часть валяется в ~/Downloads, часть в ~/Documents, а часть, того и гляди, вообще в ~/Desktop.</p> <p>Чтобы такого не происходило, начинаешь все сохранять в Downloads, раз из интернета уже и так все туда валится. Проблемы:</p> <ul> <li>— файлы от разных дел валяются в перемешку</li> <li>— в какой-то момент файлов становится невыносимо много</li> </ul> <p>Тщательно это все сортировать не у всех хватает терпения. У меня содержимое Downloads раз в квартал отправлялось целиком в архив, куда-нибудь на внешний диск или, позднее, в облако.</p> <h2>«Идеальная структура»</h2> <p>После очередной чистки возникают порывы нарулить идеальную структуру папок на будущее.</p> <p>Проблема в том что если у вас не два проекта, которыми вы занимаетесь всю жизнь, а побольше, плюс достаточно спонтанно возникают дополнительные активности, то и структура постоянно будет устаревать.</p> <p>А значит либо придется подтачивать структуру на ходу(отвлекаясь), либо валить все в Downloads и так-же потом это все сортировать после рефакторинга структуры(скажем, раз в неделю).</p> <p>Ну и да, каждый раз указывать в браузере куда сохранять файл — мучительно.</p> <h2>Автоматизация</h2> <p>Очевидно, я не первый кто столкнулся с этой проблемой. Я хочу выделить два подхода к решению проблемы завалов файлов а автоматическом режиме:</p> <ol> <li>С помощью <a href="https://www.noodlesoft.com/">Hazel</a>: <ul> <li>・С ней проблема такая же, как и с идеальной структурой — правила постоянно нужно уточнять и дорабатывать.</li> <li>・Плюс на него нельзя положиться целиком: PDF — это электронная книжка, счет за гостиницу, или слайды с конференции?</li> </ul> </li> <li>Автоматическое копирование раз в день/неделю содержимого Downloads в Archive/2017-05-24-Downloads. <ul> <li>・Непонятно какую проблему это решает.</li> <li>・Старые файлы находить в таком раскладе, пожалуй, даже сложнее.</li> </ol> <p>Да и мы же не за «Downloads Zero» боремся, в конце концов. Важно следующее на мой взгляд:</p> <ol> <li>Чтобы было легко найти то что в работе</li> <li>Чтобы не приходилось долго копаться, когда надо найти что-то в архиве</li> <li>Чтобы как можно меньше мороки в виде ручного перекладывания файлов</li> </ol> <p>Получается, что все перечисленные способы решения поверхностны, и не решают проблему так как хочется.</p> <h2>1Activity в помощь</h2> <p>Я задумался что может быть наши изначальные установки устарели. Я имею в виду в первую очередь идею о единой папке загрузок.</p> <p>Как результат этого переосмысления родилась <a href="http://nemytchenko.ru/1Activity">1Activity</a>. С ней ты задаешь рабочий контекст, и все связанные с ним файлы автоматически попадают из браузера туда.</p> <p>Главный вопрос, который возникает — на какие части нарезать слона?<br /> Вначале я создавал по активности на каждый проект, не важно долгосрочный он или краткосрочный.</p> <p>С таким подходом в папках долгосрочных проектов со временем образовывается свое гетто — филиал старого доброго Downloads. Творческий беспорядок — это классно, но до определенного размера.</p> <h2>Размер «активностей»</h2> <p>Первым шагом к стройной системе оказалось понимание правильного размера активности:</p> <div class="e2-text-table"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td><b>Слишком крупно:</b></td> <td><b>Идеально:</b></td> </tr> <tr> <td style="text-align: left">Блог</td> <td style="text-align: left">Пост про поиск идеальной структуры папок</td> </tr> <tr> <td style="text-align: left">1Activity</td> <td style="text-align: left">Релиз 1Activity 0.4.1</td> </tr> <tr> <td style="text-align: left">Курс Толковый программист</td> <td style="text-align: left">Шестой выпуск толкового программиста</td> </tr> </table> </div> <p>Активности я теперь создаю, условно говоря, на тикет/майлстоун/подпроект, а не на проект целиком.</p> <h2>Жизненный цикл активностей и проектов.</h2> <p>Из-за неясности с размером, и жизенный цикл был так себе: Все завершенные активности раз в квартал отправлялись в подпапку вида 2017-Winter в Архив: <b>Activities → Archive/2017-Winter</b></p> <p>Проблемы две:</p> <ol> <li>Та же что и с автоматической очисткой Downloads — название квартала в имени папки не очень помогает найти искомое в нужный момент.</li> <li>«Длинные» проекты продолжали висеть в Activities, и накапливать файлы. Привет, гетто.</li> </ol> <p>В итоге я пришел к трехступенчатому жизненному циклу: <b>Activities → Structure → Past</b></p> <p>Получается градация по трем степеням актуальности:</p> <p><b>Activities</b> — задачи над которыми я работаю прямо сейчас</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-05-24-11-11-40-374.png" width="283" height="113" alt="" /> </div> <p><b>Structure</b> — долгосрочные проекты в процессе</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-05-24-11-10-11-330_1.png" width="346" height="153" alt="" /> </div> <p><b>Past</b> — архив законченного</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-05-24-09-57-05-708.png" width="191" height="63" alt="" /> </div> <p>Иногда остаются активности-сироты, типа «Поездка в Черногорию летом». Они из Activities переедут прямиком в Past, когда станут неактуальны.</p> <h2>Автоматизация наносит ответный удар</h2> <p>Заметили в названиях активностей квадратные скобки? Так я помечаю к какому проекту относятся текущие задачи/активности.</p> <p>И это же то самое место в котором автоматизация в стиле Hazel начинает иметь смысл. Если проект закончен и не открывался больше недели, то можно перенести его в соответствующую папку в Structure:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/-2017-05-24-10-52-16-950.png" width="795" height="622" alt="" /> </div> <p>Но не то что бы без этого нельзя было обойтись. Раз в неделю прибрать закончившиеся активности можно и руками. Вряд ли их будет больше трех-пяти.</p> <h2>Подытожим</h2> <p>Не знаю насколько универсальной получится эта система. Все-таки у каждого немного своя специфика. В любом случае важно задуматься о следующем:</p> <ol> <li>Как вы «режете слона на куски». Не слишком ли мелко? Не слишком ли крупно?</li> <li>Каков жизненный цикл ваших проектов? Отображает ли его структура папок?</li> <li>Не переборщили ли вы с автоматизацией и поиском идеальной структуры? Потенциально это может съедать не меньше времени чем ручная сортировка.</li> </ol> <p>Кто хочет обсудить или поделиться своей структурой, <a href="https://t.me/joinchat/AAAAAELFRJWO7YtlyfQ8pA">айда в телеграм</a></p> <p>P.S. Самые внимательные должны были заинтересоваться меткой <span style="background-color:#D5D5D5;border-radius: 50%;width:12px;height:12px;display:inline-block;position:relative;top:6px;"> </span> Finished на скриншоте. Метками я помечаю статус проекта. Про это будет следующая статья.</p> <p>P.P.S. Если вы не в теме, что такое 1Активити, прочитайте <a href="http://nemytchenko.ru/blog/all/1activity-release/">первый релизный пост</a> или полистайте <a href="http://nemytchenko.ru/1activity">сайтик</a>.</p> <h2>Где купить</h2> <p>Купить программу можно здесь:</p> <script src="https://gumroad.com/js/gumroad.js"></script> <p><a class="gumroad-button" href="https://gum.co/1Activity?wanted=true" target="_blank" data-gumroad-single-product="true">Купить 1Activity</a></p> <h2>Будем на связи</h2> <p>Если на такой серьезный шаг вы еще не готовы, подпишитесь на новости о программе. В ближайшее время напишу несколько статей о том как 1Activity помогает быть более продуктивным, и подписавшиеся получат статьи по почте.</p> <script type="text/javascript" src="//static.mailerlite.com/data/webforms/391994/i9y7p3.js?v6"></script> Wed, 24 May 2017 12:48:02 +0200Ленивый сокращатель ссылокhttp://nemytchenko.ru/blog/all/lazy-link-shortener/http://nemytchenko.ru/blog/all/lazy-link-shortener/http://nemytchenko.ru/blog/all/lazy-link-shortener/<p>Есть такой гем <a href="https://github.com/laurilehmijoki/s3_website">s3_website</a>. Он помимо того что умеет заливать файлы на S3, позволяет в yaml-конфиге указывать редиректы с одних урлов на другие.</p> <p>Я эту особенность нежно полюбил, и активно использовал в своих докладах — даешь красивую ссылку вида «inem.at/leanpoker», которая приредиректит тебя куда надо. Плюс, естественно, это добавляет гибкости — в любой момент можешь пойти и поменять «адрес назначения», если вдруг нашел более подходящую для объяснения предмета ссылку.</p> <p>Вот так выглядит кусок конфига:</p> <pre><pre class="e2-text-code"><code>redirects: skillgrid: http://t.nemytchenko.ru/skillgrid leanpoker: http://t.nemytchenko.ru/leanpoker railsclub: http://s3.inem.at/share/railsclub2015.pdf railshurts: http://railshurts.com</code></pre></pre> <p>Год назад я перенес репу на ГитЛаб, и придумал в CI проверять ссылки на работоспособность с помощью <a href="https://github.com/dkhamsing/awesome_bot">awesome_bot</a>:</p> <pre><pre class="e2-text-code"><code>awesome_bot s3_website.yml --allow-redirect --allow-dupe</code></pre></pre> <p>Эта штука меня пару раз спасла от показывания битой ссылки на публику.</p> <p>В общем все было бы круто, но в какой-то момент я решил прикрутить CDN к своему сайтику, и внезапно выяснилось, что за CDN эта крутая фича у Амазона тупо не работает.</p> <p>Соответственно, и все мои «короткие ссылки» сейчас тоже не работают, но это сейчас уже и не настолько актуально, благо с докладами я сейчас выступаю гораздо реже.</p> <p>Те не менее, у меня осталось ощущение обиды на ситуацию, и в какой-то момент мозг придумал решение.</p> <h2>Решение</h2> <p>Скрипт работающий по принципу «Static Site Generator». Редиректы, как и с s3_website прописываем в yaml-файл(можно даже синтаксис оставить), а скрипт генерит кучу почти пустых html-файлов, у которых внутри прописан редирект на нужный сайт.</p> <ol> <li>Файлы эти заливаются на какой угодно хостинг, и выполняют свою функцию, редиректя посетителей куда надо.</li> <li>Решение платформонезависимо. Не зависит ни от какой фичи S3 или другой платформы. Можно переносить с хостинга на хостинг или с одного сайта на другой.</li> <li>Если файлы продолбались, их всегда можно перегенерить из конфига, который лежит в репозитории</li> <li>По желанию к этому можно припилить трэкинг количества нажатий, посылая перед редиректом запросы на какой-нибудь нехитрый бэкенд.</li> </ol> <p><span id="implementation"/></p> <h2>Реализация</h2> <p>Запилить реализацию оказалось делом 30 минут, большую часть из которых я разбирался как же работать со строками в баше. Короче вот: <a href="https://github.com/inem/redirects-generator.">https://github.com/inem/redirects-generator.</a> Работает.</p> <h2>Side notes</h2> <ol> <li>Выяснилось что хостить на S3 такое не получится, так как урлы будут либо `aaa.html`, либо `aaa/`, что для сокращалки урлов как-то не очень</li> <li>Зато отыскался способ надурить амазоновский CDN, чтобы S3-шные редиректы продолжали работать: надо когда создаешь origin, не использовать автокомплит, а просто прописать бакет в формате `bucketname.s3.amazonaws.com`.</li> </ol> <p>Короче, решил в итоге и изначальную задачу, и в общем виде под любую платформу. Пригодится.</p> Tue, 16 May 2017 07:22:24 +0200Обновили 1Активити до 0.4.1http://nemytchenko.ru/blog/all/1activity-0-4-1/http://nemytchenko.ru/blog/all/1activity-0-4-1/http://nemytchenko.ru/blog/all/1activity-0-4-1/<p>Добавили возможность навигации по активностям с помощью комбинаций клавиш Ctrl+J/K (привет, vim!) и Ctrl+P/N (привет, emacs!).</p> <p>Забавно, но это были одни из первых фичереквестов.</p> <p>Вторая фишка — алиасы активностей, чтобы экономить место в менюбаре. Если создать активность вида «Очень {важная активность} и очень длинная!» или «Чуть менее важная но тоже длинная { %#», то в менюбаре отобразятся «важная активность» и «%#» соответственно.</p> <p>Длинные имена иногда важно иметь, чтобы легче было искать по ключевым словам. Теперь можно не жертвовать ценным местом в менюбаре, и одновременно иметь длинные названия активностей.</p> <p>P.S. Если вы не в теме, что такое 1Активити, прочитайте <a href="http://nemytchenko.ru/blog/all/1activity-release/">первый релизный пост</a> или полистайте <a href="http://nemytchenko.ru/1activity">сайтик</a></p> <h2>Где купить</h2> <p>Купить программу можно здесь:</p> <script src="https://gumroad.com/js/gumroad.js"></script> <p><a class="gumroad-button" href="https://gum.co/1Activity?wanted=true" target="_blank" data-gumroad-single-product="true">Купить 1Activity</a></p> <h2>Будем на связи</h2> <p>Если на такой серьезный шаг вы еще не готовы, подпишитесь на новости о программе. В ближайшее время напишу несколько статей о том как 1Activity помогает быть более продуктивным, и подписавшиеся получат статьи по почте.</p> <script type="text/javascript" src="//static.mailerlite.com/data/webforms/391994/i9y7p3.js?v6"></script> Thu, 04 May 2017 21:51:37 +0200Первый публичный релиз 1Activityhttp://nemytchenko.ru/blog/all/1activity-release/http://nemytchenko.ru/blog/all/1activity-release/http://nemytchenko.ru/blog/all/1activity-release/<p>Привет. Собираюсь релизить 1Activity. Для меня это big deal, поэтому я решил написать по этому поводу отдельный пост.</p> <h2>Почему это важно для меня</h2> <p>Я давно хотел научиться приносить пользу людям не просто в качестве наемного работника, а в качестве автора продукта, облегчающего жизнь людей.</p> <p>Идее продукта в её первой инкарнации уже, блин, 7 лет. Первый раз я поделился ей со спецом по UX из Microsoft <a href="https://twitter.com/wasbuxton"> Биллом Бакстоном</a> на 404fest в 2010 году. Вот что у меня осталось с тех пор:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/361588_127775.jpg" width="612" height="612" alt="" /> <div class="e2-text-caption">Это, кстати, один из моих <a href="https://www.instagram.com/p/BYR0/">первых постов в Инстаграмме</a> :)</div> </div> <h2>Идея</h2> <p>Суть идеи проста: чтобы в каждый момент времени система знала над каким проектом вы работаете, и все с чем вы работаете, попадало в папку проекта автоматически.</p> <p>О чем идет речь:</p> <ul> <li>загрузки</li> <li>скриншоты</li> <li>списки задач, заметки</li> <li>документы, таблицы</li> <li>презентации, картинки</li> </ul> <p>В общем всё подряд, будь то сырье, черновики, или итоговые результаты работы над проектом.</p> <h2>Прототип</h2> <p>Год назад мне пришла в голову идея что вместо того чтобы решать проблему глобально(на уровне операционной системы), можно для начала решить её хотя бы для папки Downloads.</p> <p>Работающий прототип получилось написать за пару вечеров. Первая версия с графическим интерфейсом родилась через месяц.</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/gif.gif" width="805" height="448" alt="" /> <div class="e2-text-caption">Внешний вид почти с первых версий почти не поменялся</div> </div> <h2>Испытания боем длиной в год</h2> <p>Потом я попал в ГитЛаб, и доработку программы пришлось отложить.<br /> Тем не менее я ей пользовался постоянно в течение года, и вы не представляете, насколько она меня иногда выручала. Огромное количество point-and-click и drag-and-drop сценариев превратились для меня в набор шорткатов на клавиатуре, и это спасло мою концентрацию в ситуациях когда, например, надо было сделать презентацию с нуля за пару дней до выступления.</p> <p>Сейчас у меня снова появилось свободное время, появился партнер по разработке, и у программы сегодня первый релиз. Ура!</p> <h2>Принцип работы</h2> <p>Принцип прост. Пожалуй даже примитивен. Чтобы файлы загружались всегда в текущий проект, нужно:</p> <ol> <li>Браузерам в качестве папки загрузки подсунуть симлинк на папку текущего проекта.</li> <li>При смене проекта менять то куда указывает симлинк.</li> </ol> <p>Любой программист сможет разобраться, как это сделать, максимум, за пару часов. Но понятно, что чтобы сделать из этого приятный и полноценный инструмент, придется попотеть. Чем собственно последние пару месяцев мы в неспешном режиме и занимались.</p> <h2>Не только загрузки</h2> <p>Самое смешное, что дополнительные штуки типа делалки скриншотов в текущий проект сделать оказалось очень легко, и этот функционал в программе тоже присутствует.<br /> Полный список того что можно сделать:</p> <ul> <li>Сделать скриншот (области или окна)</li> <li>Сохранить адрес текущего сайта в Хроме или Сафари</li> <li>Оставить текстовую заметку</li> <li>Сохранить текст из буфера обмена</li> <li>Переименовать последний файл<br /> Все это вызывается по хоткеям, и результат попадает в папку текущей активности.</li> </ul> <h2>Где посмотреть</h2> <p>Посмотреть можно здесь: <a href="http://nemytchenko.ru/1activity/">http://nemytchenko.ru/1activity/</a><br /> Гифки там немного устаревшие, но тем не менее суть объясняют достаточно наглядно.</p> <h2>Сценарии использования</h2> <p>Раз мне повезло этим подходом пользоваться год, надо рассказать где меня это больше всего выручало.</p> <h3>1) Планирование поездок.</h3> <ul> <li>Ищешь жилье в новом городе — можно накидать понравившихся ссылок в виде файлов в папку активности</li> <li>Купил билет — PDF-ка с подтверждением падает куда надо.</li> <li>Хозяин квартиры прислал подробности как доехать — копируешь текст и сохраняешь буфер обмена в виде текстового файла</li> <li>Нашел месторасположение на карте — на лету сделал скриншот</li> </ul> <p>Все это (сюрприз!) синхронизируется с дропбоксом, и потом доступно на мобилке. До свидания, Эверноут!</p> <h3>2) Исследование по заданной теме</h3> <p>Скриншоты с сайтов, куски текста, ссылки, электорнные книги — все валится в одно место само собой.<br /> Вообще часто бывает, что исследование новой темы выливается в десятки вкладок в браузере. Как я из десятков ссылок делаю одну — <a href="http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke/">рассказал в отдельной статье</a>.</p> <h3>3) Поготовка презентаций и статей</h3> <p>Картинки в Кейноут все равно приходится перетаскивать мышкой, но но крайней мере я знаю что все картинки будут лежать в одной папке</p> <h2>Где купить</h2> <p>Купить программу можно здесь:</p> <script src="https://gumroad.com/js/gumroad.js"></script> <p><a class="gumroad-button" href="https://gum.co/1Activity?wanted=true" target="_blank" data-gumroad-single-product="true">Купить 1Activity</a></p> <h2>Будем на связи</h2> <p>Если на такой серьезный шаг вы еще не готовы, подпишитесь на новости о программе. В ближайшее время напишу несколько статей о том как 1Activity помогает быть более продуктивным, и подписавшиеся получат статьи по почте.</p> <script type="text/javascript" src="//static.mailerlite.com/data/webforms/391994/i9y7p3.js?v6"></script> Fri, 28 Apr 2017 09:04:44 +0200Как я держу ум и рабочее пространство на компе в порядке. Часть 1http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke/http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke/http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke/<h2>Про миллиарды вкладок в браузере — «закрыть нельзя оставить».</h2> <h2>Мы не умеем концентрироваться на одной задаче подолгу. Предлагаю сдаться.</h2> <p>Мы любим переключаться между задачами. Сколько не пихай в себя Голдрата, все равно заниматься долго одной задачей скучно.</p> <p>Некоторые гордятся тем что они умеют подчинять себя дисциплине, и поэтому такой проблемы у них нет. Можно им позавидовать. А можно и не завидовать, ведь это в каком-то смысле насилие над собой.</p> <p>Иногда мозгу нужно переключиться. Что делаете вы? Кончено же, подчиняетесь. Хоп! — новая вкладка в браузере, и пошло-поехало.</p> <p>Например, сегодня я искал интересные проекты для своего агенства на Upwork, чуть-чуть зазевался, и вот у меня открыто 15 новых вкладок в браузере, потому что я уже учу Clojure.</p> <p>Clojure классная, но всю за раз точно не выучить. Через пару часов мозг закипает и просит чего-нибудь полегче.</p> <p>Оставить вкладки открытыми — Дорофеев заругает, ведь каждая вкладка — это все равно что элемент неразобранного инбокса — будет мозолить вам глаз и отъедать внимание. А еще системные ресурсы компа отъедаются. И это у меня не единственная пачка вкладок. В параллели открыт вагон других не менее важных и не менее интересных вещей.</p> <p>Сконцентрироваться на новой задаче в таком окружении интересных вещей получается с трудом.</p> <p>Закрывать вкладки жалко. Можно скрыть с глаз долой, но системные ресурсы все равно расходуются, да и проблема не решается, а только откладывается.</p> <h2>Как я решаю проблему</h2> <ol> <li>Задаю текущий проект в 1Activity.</li> <li>С помощью Tab Scissors выгрызаю все вкладки в хроме по текущей теме в новое окно</li> <li>Жму на иконку OneTab.</li> <li>Кликаю на “Share as webpage” на последней партии ссылок</li> <li>Жму на иконку “Save webloc”, файл со ссылкой на страницу сохраняется в папку текущего проекта.</li> <li>Закрываю вкладки OneTab.</li> <li>Переключаюсь в 1Activity на другой проект</li> <li>Открываю каталог проекта в Finder на предмет оставшихся там с предыдущего подхода ссылок.</li> </ol> <p>Результат:</p> <ul> <li>Чистый браузер</li> <li>Чистый от чувства вины мозг</li> <li>Ссылки не потеряны, а лежат в папке проекта</li> <li>Папка проекта создалась на лету, мне не пришлось отвлекаться на это</li> </ul> <p>Вот смотрите, я решил разобрать еще часть бардака, и записал для вас гифку. Я гуглил про то как попасть в Toptal, уперся в прохождение тестов по алгоритмам на Сodility, помучился с ними немного, и забил. Вкладки тем не менее терять не хочется. Решил отложить их до лучших времен. Вот как это выглядит:</p> <div class="e2-text-picture"> <img src="http://nemytchenko.ru/blog/pictures/toptal.gif" width="1399" height="841" alt="" /> </div> <p>Часть происходящего выглядит как магия. Это от того, что многое запускается хоткеями.</p> <h2>Где брать добро</h2> <p>Плагины для хрома бесплатны:</p> <ul> <li><a href="https://www.one-tab.com">OneTab</a></li> <li><a href="https://chrome.google.com/webstore/detail/tab-scissors/cdochbecpfdpjobpgnacnbepkgcfhoek?hl=en">Tabs scissors</a></li> <li><a href="https://chrome.google.com/webstore/detail/display-anchors/poahndpaaanbpbeafbkploiobpiiieko?hl=en">Display #Anchors</a></li> <li><a href="https://chrome.google.com/webstore/detail/link-saver-for-os-x/flifbephgobhcmbpmgncpngibdcfkagc">Link Saver</a></li> </ul> <h2>1Activity</h2> <p>Ну а <a href="https://gum.co/kbjlc">1Activity</a> — это мой тайный план по обогащению. Программа была достаточно готова уже год назад, но я изменил ей с Гитлабом, и теперь вот отдаю долги. Купить программу можно здесь:</p> <script src="https://gumroad.com/js/gumroad.js"></script> <p><a class="gumroad-button" href="https://gum.co/1Activity?wanted=true" target="_blank" data-gumroad-single-product="true">Купить 1Activity</a></p> <h2>Будем на связи</h2> <p>Если на такой серьезный шаг вы еще не готовы, подпишитесь на новости о программе. В ближайшее время будет еще несколько статей о том как 1Activity помогает быть более продуктивным, и подписавшиеся получат статьи по почте.</p> <script type="text/javascript" src="//static.mailerlite.com/data/webforms/391994/i9y7p3.js?v6"></script> <h2>Бонус</h2> <p>Чуть не забыл. Display Anchors хорош когда вы читаете какую-нибудь длинную книжку типа Brave Clojure, и вам нужно сохранить ссылку в webloc на текущее место в книге.</p> <p>В HTML-разметке как правило есть якоря, но глазом их никак не увидеть. Обычно я лезу в девелоперский режим и выискиваю якорь там, но это не удобно и долго. Display Anchors делает якоря видимыми — можно кликнуть на ближайший, после этого Link Saver сохранит ссылку прямо на этот якорь, и можно будет начать с того места где закончил.</p> <p>UPD:</p> <h2>Стоит ли городить огород?</h2> <p>В твиттере справедливо заметили, что это выглядит как слишком много возни для такой незначительной задачи. Можно просто ткнуть на «Bookmark all tabs» и успокоиться.</p> <p>Для меня такой подход перестал работать лет 10 назад, после того как скопилось слишком много ссылок.<br /> Закладки — еще одна сущность, с которой надо разбираться, и наводить там порядок. С файлами дело иметь привычнее. Особенно когда все по папкам проектов раскидываются автоматически не только ссылки, но и любые закачки, а так же заметки и скриншоты.</p> <p>Согласен, что после этого поста осталась недосказанность:</p> <ul> <li>непонятно что именно такого важного делает 1Activity</li> <li>как потом разбираться с папками проектов на компе</li> </ul> <p>Это окей :)<br /> Тема обширная — раскрою её полнее в следующих постах.</p> <p>UPD2: Следующий пост: <a href="http://nemytchenko.ru/blog/all/kak-ya-derzhu-um-i-rabochee-prostranstvo-na-kompe-v-poryadke-2/">Как бороться со свалкой файлов, нужна ли идеальная структура и жизненный цикл проектов</a></p> Tue, 04 Apr 2017 19:27:14 +0200