# Понедельник 112 твитов
Пишу на руби уже около 7 лет, последние 4 из которых связанны с руби значительно больше чем с рельсами :)
11:08Люблю все что связано с многопоточностью, распределенными системами, языками программирования и хорошим кодом
11:08Также иногда выступаю на конференциях и по мере сил стараюсь организовывать митапы у нас в Днепре
11:09А поговорим мы на этой неделе о всем что связанно с devops, докером, распределенными системами...
11:09… и тем, как это все выглядит с точки зрения простого рубиста :)
11:09Начнем с начала - кто тут читал The Phoenix Project? :)
11:10Кто не в курсе что это такое - amazon.com/The-Phoenix-Pr…, увлекательное художественное чтиво о том, как не ладят админы с остальным миром :)
11:12Кстати говоря, уже есть и перевод ozon.ru/context/detail…
11:24@rubyunderhood думал ты про эликсир11:29
Так вот, через всю книгу там проходит идея процесса "change management", т.е. согласования того, какие изменения происходят в системе…
11:33… например - что именно и когда вы будете деплоить, какие бд нужно обновить и когда и т.д.
11:33В связи с этим возникает вопрос - как вы относитесь к необходимости подобного процесса? и как это устроено у вас в компаниях?)
11:35@rubyunderhood wix на Rails? Что еще в стэке и технологиях есть?11:44
.@mpak999 нет, я бы сказал СОВСЕМ нет :) есть у нас много чего, но основной бекенд - Scala, остатки Java
11:45.@mpak999 ну и по мелочи - Ruby, Python, Erlang (по-моему), Go, был проект на Clojure ЕМНИП :)
11:47.@mpak999 при этом все что связано с руби - это Chef или мелкие (и иногда совсем не мелкие) внутренние сервисы на руби, рельсах/синатре
11:52Если уж появился вопрос про мою работу - у нас куча всего открытого лежит на github.com/wix
11:54Из того, с чем я сталкивался - github.com/wix/react-temp… angular-like шаблоны для React.js…
11:56… github.com/wix/accord - библиотека валидаций для Scala
11:56… github.com/wix/future-per… - несколько удобных фич для фьючеров в Scala
11:56@rubyunderhood не плохой зоопарк :) тяжко переключаться между языками и технологиями?12:10
Вообще работа в большой IT компании заставляет тебя по-другому посмотреть на разные вещи.
12:33Например на то, что если у вас есть проблемы со скейлингом - всегда можно добавить пару-тройку серверов...
12:33... правда только если они stateless :)
12:33На то, что фронтенд и бекенд - это скорее все же не одно приложение и возможно не стоит их хранить вместе.
12:33На то, что "одна огромная база данных с большим количеством таблиц" на все случаи жизни - это не всегда хороший вариант.
12:34На то, что репликация бд - это не просто "читать из бд с другого сервера".
12:34На то, что multi-datacenter деплой не очень совместим с дефолтными в рельсах "автоинкрементными интами". :)
12:34.@dcromster в моем случая - продуктовая компания, >500 разработчиков в нескольких локациях
12:35@rubyunderhood как кстати Elixir? нет чувства незавершенности и боязни, что не взлетит технология?12:46
.@mpak999 учитывая довольно хорошее взаимодействие между эликсиром и эрлангом,наличие книг про elixir и elixircon-думаю с ним все будет ок
12:48.@mpak999 более того, лично мне кажется, что эликсир в итоге станет более популярным, чем сам эрланг. хотя эрлангисты со мной не согласны :)
12:49devblog.avdi.org/2015/10/12/i-h… у очень известного рубиста Авди Гримма теперь есть еще и рассылка :)
13:15А если вы все еще не знаете, кто это - то настоятельно рекомендую зайти на rubytapas.com, посмотреть пару эпизодов и подписаться
13:16Чтобы тви не простаивал зря - а кто был на Еуруко вчера-позавчера? Расскажите, как оно было, а я поретвичу :)
15:16BTW, если кто еще не смотрел - видео со Strangeloop уже давно в онлайне - youtube.com/channel/UC_QIf…
15:18Особенно рекоммендую youtube.com/watch?v=ZGIAyp… про coordination, crdt, и распределенные системы…
15:19… и youtube.com/watch?v=27ynM2… про то, как Netflix видит service discovery у себя в будущем (поподробнее здесь - github.com/Netflix/eureka…)
15:21@rubyunderhood было хорошо, интересные доклады, четкая организация15:46
@rubyunderhood доклад от @rrrene про инлайн документацию, доклад от девопса @Shopify про reliable systems15:50
@rubyunderhood Зальцбург прекрасен. Было штуки три хороших доклада.15:50
@rubyunderhood афтепати вообще збс15:52
@rubyunderhood Про resiliency в shopify норм самый был. Хотя ничего нового15:55
Как всегда почти в тему - а посоветуйте интересные подкасты послушать. Можно о руби, можно нет. Можно на англ.
16:02От себя порекоммендую blog.cognitect.com/cognicast/, который раньше назывался Think Relevance
16:02BTW, периодически дослушиваю некоторые старые эпизоды и жалею, что не слушал их раньше и не знал о том, как развивается их компания…
16:03BTW, если у кого-нибудь есть вопросы про докер, шеф или какие-нибудь еще ops-ориентированные вещи - не стесняйтесь спрашивать.
17:13@rubyunderhood почему не ансибл? #простите17:17
.@inem очень много готового кода у нас, мы дружим с руби, нас устраивает pull model, хотя иногда кое-где хочется push.
17:18@rubyunderhood слишком много новых концепций на ровном месте.19:35
согласен, что если все уже нарулено на шефе, дергаться смысла нет
.@inem ну оно все не просто так, например зависимости ресурсов через subscribes/notifies - это очень полезно в некоторых случаях
19:36.@inem в остальном - большинство (но не все) рецептов/плейбуков/etc можно заменить простыми, короткими баш-файлами
19:37@rubyunderhood давай про докер затрём, я его использую для CI, точнее @droneio берёт любой docker образ и выполняет тесты внутри него.19:57
@rubyunderhood то есть, у меня уже есть окружение из нескольких контейнеров для запуска тестов, теперь хочу деплоить всё это дело? куда, как19:57
.@lisovskyvlad все очень зависит от того, что ты хочешь и сколько денег можешь вложить
19:57.@lisovskyvlad есть PAAS-ы, самые крупные: Amazon ECS, Google Container Engine, Joyent Triton
19:59.@lisovskyvlad если деплоить на свои сервисы - то начиная от docker run ручками, заканчивая kubernetes/mesos+aurora и с dokku посредине
20:00.@lisovskyvlad можно также деплоить шефом через chef-docker или что-то самописное. я завтра скомпоную список нюансов,которые стоит учитывать
20:03Как-то первый день прошел почти без руби. Исправляюсь - здесь я рассказываю как все печально в рельсах (ну, почти) youtube.com/watch?v=Is90za…
20:05@rubyunderhood Какие книги/курсы/и тд советуете для новичков, как лучше учить и тд?20:12
.@pinyslutty ну я в отличии от @kirshatrov считаю, что начинать нужно не с изучения руби, а с теории ООП и организации кода :)
20:18@rubyunderhood Ruby5, Bike Shed от ThoughtBot20:19
По запросам читателей - мой (неполный) список рекомендованной литературы для программистов:
20:241. Design Patterns - не с целью использовать, а для понятия принципов
20:242. PoEAA - вот тут уже пользы будет побольше
20:243. Clean Code - с некоторые концепциями не согласен, но прочесть стоит
20:244. Working Effectively With Legacy Code - по названию понятно, зачем оно нужно :)
20:24Параллельно стоит читать что-то про руби/рельсы:
20:251. railstutorial.org - сам не читал, но слышал много хорошего
20:252. Agile Web Development with Rails - я читал, но давно и скорее всего RailsTutorial будет полезнее сейчас
20:25Дальше моя серия PragProg:
20:253. The RSpec Book
20:254. Rails Test Prescriptions
20:255. Crafting Rails Applications - особенно рекоммендую, сейчас вышла версия для Rails 4
20:266. Continuous Testing
20:267. Rails View
20:26А, ну и еще ОБЯЗАТЕЛЬНОЕ дополнение к первому списку - Growing Object-Oriented Software, Guided by Tests
20:29Также обязательны к просмотрю все видео Рича Хикки: changelog.com/rich-hickeys-g… (это не все, но многие)
20:31После всего этого балагана "The Joy Of Clojure" тоже пошла хорошо :)
20:32@rubyunderhood @pinyslutty @kirshatrov теория без понимания проблемы бесполезно20:34
.@ptico @pinyslutty @kirshatrov когда я PoEAA Фаулера читал - я руби не знал :)
20:34Да, я кажется забыл написать - я учился на Примате со специальностью "Программное обеспечение" и многие книги (не руби) читал еще тогда
20:35И да, со времен универа я пописал на PHP, C++, Java, VBScript, Python - в том числе и для продакшена
20:39@rubyunderhood @pinyslutty @kirshatrov т.е. пока говна не пожуешь, тебе фаулер покажется бесполезным20:39
@ptico @rubyunderhood @pinyslutty @kirshatrov согласен,новичку теория сто раз не сдалась.Важнее получить базис практики и на него уже теорию20:41
.@ptico @anton_davydov ну тут я не согласен. главное думать что ты пишешь и размышлять о том, чего ты НЕ СМОЖЕШЬ сделать со своим кодом.
20:42.@ptico @anton_davydov и после таких размышлений тебе самому захочется узнать как сделать код более податливым к дальнейшим изменениям
20:43.@ptico @anton_davydov если желание размышлять есть - тебе теория будет полезна сразу. если нет - то тут мало что поможет, ИМХО
20:44@rubyunderhood @ptico ок, заставь прочитать новичка (который даже языка не знает) банду четырех, а потом смотри как он тебе ооп писать будет20:52
.@anton_davydov @ptico ну цели учить не-программистов у меня особо никогда не было
20:53@rubyunderhood @ptico это был простой пример того, что не вся теория может быть воспринята без практики до этого20:54
.@anton_davydov @ptico BTW, слушая многие собеседования (не руби) я вижу, что многие работающие программисты знают меньше чем пятикурсники
20:55.@anton_davydov @ptico обратный пример - сколько ты можешь доверить человеку, сделавшему блог на рельсах по примеру? :)
20:56@rubyunderhood @ptico так ты ищешь разработчика с опытом или знанием? то,что пятикурсники что-то знают - не делает их крутыми программистами20:57
.@anton_davydov @ptico проблема в том,что эти "программисты" понятия не имеют как их код реально работает,в отличии от умных пятикурсников
20:57Еще одна причина,по которой я люблю рекомендовать теорию и фундаментальные вещи-они будут вам помогать значительно дольше чем знание рельсов
21:00@rubyunderhood @ptico больше, чем упоротому олимпиаднику, который реализует все алгоритмы сам (тебе потом разгребать же все это)21:01
@rubyunderhood @ptico а умные пятикурсники "все знают" и пишут код как хз что + их не переучить обычно(как я знаю)21:01
.@anton_davydov @ptico я не говорил об упоротых олимпиадниках. хотя они как правило очень ок. :) про остальное спорить бесполезно
21:03.@anton_davydov @ptico у меня видать какие-то неправильные пятикурсники (такие каким был я, например) :)
21:05Теория vs практика - это неважно, вот что важно pic.twitter.com/eztjQbW6A2
@anton_davydov @rubyunderhood @ptico Я считаю, что лучше всего сначала практика, потом теория. Теория без практики пользы не принесет.21:52
@anton_davydov @rubyunderhood @ptico А практика без теории может в конечном итоге принести проблемы.21:52
.@suxxes @anton_davydov @ptico @Xedin вот я с своей жизни сталкиваюсь плохим кодом плохого практика, чем чересчур хорошего теоретика ;)
21:54# Вторник 61 твит
Starting to feel justified in my criticisms of goroutine design by the crazy prevalence of goroutine leaks.
Отличный тред про дизайн горутин и смежные вещи twitter.com/mentalguy/stat…
9:07letsencrypt.org/2015/10/19/let… Мы все стали на один шажок ближе к бесплатному, автоматизированному и открытому TLS!
9:31Тем, кому хочется немного поломать голову (и поупражняться в знании руби) посвящается: gist.github.com/fxposter/1682f…
13:22@rubyunderhood люди добрые, кто работал с alchemy-cms и что думаете на счет него?14:20
@rubyunderhood предложили заказ по переделке сайта универа, смотрю что нынче в области CMS у Ruby, чтобы прикинуть, стоит ли связываться14:48
.@ajieks скажу честно - ни разу не сталкивался с CMS на рельсах. Когда занимался чисто рельсами - популярным был RefineryCMS....
14:49@ajieks @rubyunderhood если организация не может заплатить за нормальный проект – не связывайтесь.14:54
.@igor_alexandrov @ajieks поддержу. особенно неприятно будет потратить свое время и нервы на "поддержку" потом.
14:55Вчера прозвучал вопрос о том, как готовить докер. Обо всем не расскажу, но пару шишек мы с ним уже набили.
14:57Итак, первое и самое неприятное - github.com/docker/docker/…. Залипает все что связано с докером, а точнее с network namespace.
14:58Лечится пока что только ребутом сервера и проблема где-то внутри ядра и чинить никто не хочет, т.к. стабильно воспроизвести проблематично.
14:59Автоматическое лечение - как только `dmesg -l emerg | grep 'waiting for lo to become free.'` начинает что-то выдавать - сразу в ребут.
15:00Ставите докер - не забывайте ротейтить его логфайлы. Если у вас используется шеф вместе с докером - gist.github.com/fxposter/53388…
15:05…если же нет - по gist-у понятно, как настроить логротейт ручками
15:05Третье - докер - это не серебряная пуля. Совсем совсем. Ну ни капельки. Если вы пришли к микросервисам - пока у вас не будет мониторинга…
15:07… лоад-балансировки, автоматического деплоймента, service discovery - докер вам может только помочь "немного поиграться"
15:08… конечно, если вы не используете hosted-решения или какой-нибудь kubernetes (который еще на продакшене завести надо)
15:0912factor.net прекрасен, но не всегда реально вынести весь конфиг в ENV-переменные, как рекомендуют они и докер.
15:11Также не всегда достаточно иметь "один stdout" для всех логов.
15:12Но как только вы начинаете делать конфиг-файлы и лог-файлы - сразу встает вопрос о необходимости откуда-то брать подключаемые VOLUMES
15:13И менеджить UID/GUD-ы в них. Например - приложение создало лог-файл на подключемом диске. Приложение бежит не под рутом (т.к. это плохо)
15:16Нужно понимать что если вы измените base image для вышего контейнера, или просто поставите перед созданием вашего юзера в докерфайле…
15:16… какое-нибудь пакет - он может создать дополнительного юзера, который может сместить UID для юзера под которым запускается приложение.
15:17И после обновления на новую версию оно не запустится потому что не сможет писать в логи
15:18Аналогичная проблема возможна с правами на конфиг-файлы
15:18Далее следует возможная проблема с зомби-процессами: blog.phusion.nl/2015/01/20/doc… (да да, это те же чуваки, которые делали REE и Passenger)
15:22… которую ребята предлагают решать так: blog.phusion.nl/2015/01/20/bas….
15:23Но вместо кастомного скрипта на питоне мне больше нравится вариант с S6 на C: blog.tutum.co/2014/12/02/doc… и blog.tutum.co/2015/05/20/s6-…
15:24Теперь непосредственно к рельсам. С их упаковкой в докер контейнер есть одна маленькая проблема. Она называется Asset Pipeline
15:27и заключается она в том, что запросы на js,css и остальную статику будут идти сквозь ваше приложение.подробнее тут - devcenter.heroku.com/articles/rails…
15:30Хероку предлагает использовать Rack::Cache (будет быстрее, но все равно руби будет участвовать в запросе) или CDN
15:32В идеале было бы неплохо проксировать трафик на приложение через какой-нибудь локальный nginx, задеплоенный рядом как отдельный контейнер
15:33Но вариант проще - просто засунуть nginx внутрь своего контейнера с приложением
15:34github.com/fxposter/s6-ng… на текущий момент я деплою рельсы в докере примерно вот так
15:49А теперь пойду поем
15:52@rubyunderhood а в чем смысл? Какую проблему вы решаете при помощи докера17:34
.@achempion будущее развитие платформы, унификация деплоя различных типов приложений, возможная миграция на kubernetes, etc…
17:34.@achempion в каком плане более конкретно?) есть приложения на java/scala/node/ruby/go, хочется их деплоить (и мониторить) одними средствами
17:39.@achempion если смотреть с точки зрения руби - иметь всегда рабочий билд вместе с нативными экстеншенами
17:39@rubyunderhood у вас, как я понимаю, 1 большой сервер с множеством разных стеков и вы решаете проблему изоляции процессов друг от друга17:46
.@achempion сотни серверов и сотни сервисов на них. изоляция - это плюс, но не основная вещь.
17:47@rubyunderhood можешь дать пример когда это не работает? Ведь зачастую поток принимает умный агрегатор.20:03
Тем, кому хочется немного поломать голову (и поупражняться в знании руби) посвящается: gist.github.com/fxposter/1682f…
Ну что, у кого-нибудь получилось? :)
twitter.com/rubyunderhood/…
@rubyunderhood оспаади! Что там решать? api.instance_exec(&block)20:11
Эта задачка имеет реальное применение,когда в шефе хочется построить свою библиотеку с блекджеком, но доступ к ресурсам шефа все равно нужен
20:21StrangeLoop After @strangeloop_stl, my take on some of the best distributed systems & database talks this year: medium.com/@oceankidbilly…20:39
@rubyunderhood В общем, если все таки eval, то так будет работать: gist.github.com/scaint/88b4590…22:56
.@scaint молодец! А вот и пример где это может реально использоваться (лямбда должна выполнятся внутри chef context) gist.github.com/fxposter/c2ec2…
22:58.@ipronix эммм… БИТРИКС? coub.com/view/8orbm
23:01@ipronix @rubyunderhood да @backendsecret на этой неделе какой-то лютый тролль.23:07
.@as_Crazy @ipronix @backendsecret прости, но язык в котором родились rspec и cucumber, а также рельсы...
23:50.@as_Crazy @ipronix @backendsecret ... которые продвинули тестирование и удобство разработки в массы...
23:51.@as_Crazy @ipronix @backendsecret ...в то время как многие пхпшники до сих пор не знают что такое TDD и как всё-таки работает HTTP и phpfpm
23:53.@backendsecret @as_Crazy @ipronix я помню, как развивался Spring MVC взяв в себя все лучшее из рельс.
23:55.@backendsecret @as_Crazy @ipronix а стандарты это местами тоже плохо - ужасно тормозят развитие. Пока их напишут, реализации сделают.
23:57На сегодня все. Всем спокойной ночи! :)
23:58# Среда 41 твит
.@rubyunderhood @scaint тот случай когда "простота хуже воровства", за это chef и не любят9:38
Продолжая вчерашний холивар (и нарываясь на то, что меня попрут отсюда :)) - экосистема руби действительно не идеальная и…
9:43… многие известные рубисты уже ушли из нее на что-то по их мнению более перспективное - Челимски (rspec) - на кложуру, Валим - на эликсир
9:44… кто-то переходит на Go и Rust. Вы сами вольны выбирать - копаться в говне или делать что-то стоящее. ;)
9:46Это просто один из инструментов, который решает некоторые задачи и иногда решает их очень хорошо. Серебряной пули нет. Ну или я не нашел :(
9:47@rubyunderhood судя по blog.davidchelimsky.net Челимски на кложуру перешел, т.к. на новом месте была только она, в итоге втянулся10:24
@rubyunderhood необходимы Ruby курсы в Полтаве... Помогите чем можете...10:25
@rubyunderhood haskell решит все проблемы!10:26
.@Shiroginne да, конечно xkcd.com/1312/
10:27@rubyunderhood @rainrb самый полезный человек в руби сообществе пишет не на руби, а на си. а те кто ушли, особенно валим, не сильно нужны.14:59
.@ipronix @rainrb ну ОЧЕНЬ спорно. C нужно для экстеншенов и самого руби, что в какой-то степени влияет на экосистему,но не главная ее часть
15:01@rubyunderhood шарящие молча работают и делают проекты, компьюнити - это тусовка для хипстеров и девочек16:20
.@mpak999 лол, а благодаря чему ты языки учишь? откуда появляются гемы, документация, примеры использования? фреймворки, апп сервера?
16:20@mpak999 @rubyunderhood мне кажется, что одни ушли – придут другие. Нормальная ротация. Свежий взгляд, так сказать.16:21
.@igor_alexandrov @mpak999 вероятно вы не следите за clojure/elixir/go комьюнити. очень многие из тех кто был вначале пути с руби - ушли.
16:22.@igor_alexandrov @mpak999 и не факт что пришедшие смогут их заменить
16:23@rubyunderhood не совсем, со стороны выглядит как паника, хотя в языки приходили и уходили,это молоток, взял один, взял другой, сделал дело.16:28
@rubyunderhood если как бы за 5 лет, ты не выучил еще 2-3х языков или технологий - то ты отстал в любом язык, что кложа, что питон, что руби16:30
.@mpak999 пик популярности руби пройден уже значительно больше 5 лет назад, и многие, кто привели руби к ТОЙ популярности уже не здесь :)
16:35.@mpak999 лишний хайп - это быстрое развитие. "просто работа" - это аналог того что происходит с java (не jvm).
16:39@rubyunderhood фактически если рубя сейчас резко загнётся то собсно того что уже есть с головой хватает :) @mpak99916:41
.@POS_troi @mpak999 время не стоит на месте, объемы данных растут, необходимость обрабатывать все больше вещей параллельно - тоже.
16:41Какие-то у меня мрачноватые перспективы прослеживаются :) Поэтому вернемся непосредственно к руби - а чего вам в руби не хватает сейчас?
16:42В языке, экосистеме, гемах?
16:42.@mpak999 нода может себе это позволить просто потому что аналога js на фронтенде нет, а эти люди еще и бекенд хотят :-D
16:43@rubyunderhood нормальных тредов в mri :)16:45
Я бы вот очень хотел иметь интерфейсы (опциональные, естественно) и статическую возможность их проверки.
16:46И хоть какую-нибудь memory model для многопоточного программирования, раз уж у нас все на mutable state построено :)
16:47@rubyunderhood модели акторов в языке, необязательной типизации, байт-кода16:48
.@svenyurgensson поясни про необязательную типизацию, ты хочешь проверок в рантайме?
16:48@rubyunderhood нет, просто когда надо скорость работы/удобство - (x: Int, y: String), если важно утипизация - то как сейчас16:51
@rubyunderhood А вообще очень нравится Crystal, наблюдаю и жду когда они допилят корутины/каналы (или было бы лучше - акторы) и тогда можно16:51
.@svenyurgensson почему я спрашиваю - частичная типизация без проверок в runtime невозможна, а они в некоторых случаях дают сильный оверхед
16:53.@svenyurgensson можно почитать про gradual typing в typed clojure и typed racket (ccs.neu.edu/racket/pubs/ec…)
16:53# Четверг 96 твитов
@backendsecret @rubyunderhood вы используете какую-нибудь систему для хранения\структурирования знаний? (например, блокнот, майндмапы)11:57
.@nick_jastix @backendsecret именно для хранения - к сожалению (или к счастью) - только мой мозг :)
11:58.@nick_jastix @backendsecret для структурирования, обдумывания, планирования - блокнот с ручкой и whiteboard, если ты не один работаешь
11:59github.com/docker-library… We recommend tini. It … does only the necessary parts of reaping and signal forwarding.
Ух ты.
12:12@nick_jastix @backendsecret @rubyunderhood использую закрытую вики12:20
“@tomstuart: Well, this is a bit gross isn’t it. github.com/ruby/ruby/comm…” Wow! Hello, CoffeeScript!
13:56Всем привет. Каких-то конкретных тем для обсуждения у меня на сегодня нет, поэтому принимаю предложения и вопросы.
13:58Хотя нет, есть идея! За все время существования @rubyunderhood тут были ссылки только на 1 шаблонный гемфайл (от @rainrb).
14:09Неужели больше никто не хочет показать свой начальный гемфайл или application template? Давайте, друзья, сделаем другим полезно!
14:09Вот, например, мой дефолтный темплейт, который потихоньку дорабатывается уже больше 3х лет - gist.github.com/fxposter/9133b…
14:19@rubyunderhood rails new APP_NAME -d postgresql --skip-sprockets --skip-javascript --skip-turbolinks --skip-test-unit --skip-spring16:01
.@vassilevsky а гемы потом всегда ручками? :(
16:01.@vassilevsky а тесты? :)
16:05@rubyunderhood да. Только то, что необходимо.16:05Фавориты: unicorn, config, bcrypt, multi_json, jbuilder, httparty, annotate, airbrussh.
А кто какие апп сервера сейчас использует и почему? Вот я вижу два человека юзают пуму и юникорн - а почему не passenger, например?
16:45Thin уже полумертвый похоже :(
16:46@rubyunderhood юзаем пуму, пассенджер и thin. На разных проектах, ессно :)16:48
@rubyunderhood пассажир и юникор слишком медленные и слишом много кушают ресурсов. Поэтому пума.16:48
.@mr_The ну если не считать многопоточности пумы - то они все будут примерно одинаковые, по идее. плюс-минус.
16:50@rubyunderhood puma конечно же, самая быстрая + памяти есть мало. passenger юзал раньше, но при большом кол-ве воркеров он жрет всю RAM :(16:50
А кто-то вообще когда-то с многопоточностью в руби работал? Если да - чем именно занимались.
16:50.@bytecheg плюс пассажира - если задеплоено несколько приложений на сервере - он автоматом умеет между ними распределять ресурсы.
16:51@rubyunderhood В основном - пума. Пассенжер - на одном проекте "для посмотреть". Thin - на двух ради websocket-rails.16:56
.@aablayev эммм, а как websocket-rails вообще работает? Любой task.save, Task.create в итоге повесит весь eventloop.
16:57@rubyunderhood на одном из проектов бенчмаркал - пума немного выигрывала у юникорна по рпм и сильно выигрывала по потребляемым ресурсам.16:57
@rubyunderhood у меня одно приложение, это не актуально :) + я юзал 4ый пассажир, в 5ом может все стало значительно лучше :)16:58
@rubyunderhood планируется перетаскивание RoR проекта на амазон. Есть какие-то подводные камни? есть ли смысл отказываться от passenger?16:59
@rubyunderhood В одном проекте юзаем passenger, но в основном везде unicorn.16:59
@rubyunderhood @aablayev если не ошибаюсь на EM, тоже использую Thin когда надо SSE (особенно в связке с Sinatra) или WS17:01
.@ajieks @aablayev не совсем понял ответ. но любая AR операция связанная с бд повесит eventloop.
17:01@rubyunderhood @mr_The а смысл сравнивать c threads 1,1 ? :) имхо бенчмарки проводить надо так же, как в бою. а плюсы пумы как раз в тредах17:02
.@bytecheg @mr_The для чистоты эксперимента. в бою 16 тредов могут большую часть времени простаивать, рендеринг часто - это >50% запроса
17:03@rubyunderhood @ajieks в бд нет обращений. просто получить массив объектов на вход и потоками гадить в апи.17:05
@rubyunderhood дц. вот именно и вопрос назрел, размещать на инстанс или Elastic Beanstalk?17:08
.@railsme с EB у меня опыта нет. Но я так понимаю, что это тот же EC2, только с предустановленными вещами для определенного env-а.
17:09.@railsme и учтите, что амазон не отвечает за то, что ваши инстансы вдруг перестанут отвечать на ВСЕ, правда такое очень давно у нас было.
17:11.@railsme если есть люди знакомые с шефом - у амазона есть aws.amazon.com/opsworks/
17:13@rubyunderhood @aablayev в этом плане да, тут согласен. Но если используется Thin, то нужно отдавать себе отчет о возможных проблемах...17:13
@rubyunderhood кстати, спроси у ленты: кто-то вообще использует турболинки? Кого не спрошу - все говорят, что первым делом их отключают.17:13
@rubyunderhood @aablayev AR выкидываем и работаем напрямую, гугланул github.com/royaltm/ruby-e… , можно локов избежать.17:13
@rubyunderhood @railsme там Load Balancer, cli тулза, скрипты которые ранятса при старте, контроль задеплоиных версий и еще кучу плюшек.17:14
@rubyunderhood chef рубисту не помеха 😸17:14
.@railsme @ajieks нужно понимать просто что AWS сам по себе недешевый, если тебе не нужно много машин, которые ты будешь автоскейлить
17:16.@railsme @ajieks а так там набор сервисов очень большой - ELB, RDB, S3, очереди, opsworks, тот же скейлинг
17:17@rubyunderhood @mr_The паттерсон не постеснялся назвать его Turbo Lynx 🙀17:18
@rubyunderhood @railsme это все понятно, последнее время часто работаю с azure, функционал эквивалентный в целом с AWS, но под другим соусом17:19
.@ajieks @railsme они все стремятся примерно к одному и тому же функционалу. Google Cloud Platform туда же.
17:20@rubyunderhood @railsme @ajieks Automatic Load-based Scaling очень крутая штука, недо держать поднятыми все время кучу инстансов17:20
А Joyent Triton кто-то в реальности пробовал может? Очень интересно - как оно.
17:21После такого потока ответов могу сказать, что GIL рубистам не помеха!
17:34@rubyunderhood в общем, продублирую свой рельсовый gist.github.com/Ptico/cd61a062…18:07
@rubyunderhood да, gulp, autoprefixer, babel, csso, uglify и пр. удобней напрямую юзать21:34
Господа и дамы в @rubyunderhood, @backendsecret, @jsunderhood, если жена спросила "Научи меня программированию, хочу как ты". Что делать? RT21:36
.@gruz0 @backendsecret @jsunderhood поставить себе цель сделать что-то простое. посадить рядом программиста, пусть подсказывает что делать…
21:37По запросам читателей - мой (неполный) список рекомендованной литературы для программистов:
…@gruz0 @backendsecret @jsunderhood но не прямо, а намеками, по чуть-чуть. Параллельно список литературы - twitter.com/rubyunderhood/….
21:39…@gruz0 @backendsecret @jsunderhood но я перед этим учился в универе на программиста, так что об этом тоже можно задуматься ;)
21:39@mr_The @rubyunderhood мы в гитлаб используем.21:41
@rubyunderhood однозначно пума, мало ест и нету проблем с рестартом как у юникорна21:41
@rubyunderhood раньше пассенжер, потом юникорн, сейчас пума21:41
Окей, по пуме - вы юзаете треды, процессы или всегда и то и другое?
21:42Планы на завтра - расскажу о rocker и как сделать ваши докер-образы чуточку меньше (примерно в 3 раза с 850-900mb до 250-300mb). Stay tuned.
21:43Как всегда напоминаю, что вы можете предлагать темы и задавать вопросы :)
21:44@rubyunderhood че почитать начинающим лента подскажет?21:44
…@gruz0 @backendsecret @jsunderhood но не прямо, а намеками, по чуть-чуть. Параллельно список литературы - twitter.com/rubyunderhood/….
.@kaliha вот буквально 10 минут назад было - twitter.com/rubyunderhood/…
21:45@dzaporozhets @rubyunderhood @mr_The а у вас нет проблем, что иногда js не подгружается?21:47
.@anton_davydov @dzaporozhets @mr_The о, это страшное слово - "иногда"! хуже только "а у меня работает"!
21:47.@anton_davydov @dzaporozhets @mr_The Простите :)
21:47@rubyunderhood ну вот там или по основам программирования или рельсы уже. А именно уйти в руби, не только для рельс но и для CLI например?21:48
.@kaliha Я очень быстро привыкаю к языкам и их семантике, так что чисто по руби книг не читал. Многие советуют The Well-Grounded Rubyist.
21:49@Semenov пик популярности Java пройден в 2005 году, но каждый год Java-девов все больше @mpak999 @dzaporozhets @anton_davydov @rubyunderhood21:51
.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov А рубистов? :)
21:51.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov Ладно,на самом деле я не рассматриваю это как "был хайп,а теперь можно работать"
21:52.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov руби-экосистема была лично для меня местом где можно быстро выучить много нового
21:54.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov … и полезного на практике.
21:54.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov и многое из этого позже почерпнули другие языки - тот же PHP и Java.
21:55.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov сейчас этот "центр идей и прогресса" находится вне руби, лично мое ИМХО
21:56.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov И да, меня щас могут выгнать из @rubyunderhood :)
21:56@rubyunderhood @listochkin @Semenov @dzaporozhets @anton_davydov вот я тоже подумал, зачем ты тогда здесь-то нужен?!21:57
.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov призвать людей делать экосистему быстрее, лучше и доступнее. не только рубишную!
21:58.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov а где я тут кого-то поливал? действия - я делаю доклады, организовываю митапы
22:02.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov а мне еще нужно работать и уделять время жене :)
22:03О вечном - arstechnica.com/security/2015/…
22:04.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov чем я, пожалуй, и займусь
22:05# Пятница 55 твитов
@rubyunderhood Только passenger. Юникорн и пуму надо готовить и там меньше настроек и мониторинга. Для стартапов ок, для банка нет :)11:30
.@knopkodav очень интересно. по ощущениям - наоборот. или вы юзаете платный и union station?
11:31@rubyunderhood на данный момент - только puma. По ощущениям, ест меньше RAM. Но thin пока не пробовал.11:31
@mr_The @rubyunderhood ок, я использую, но пока только на маленьких проектах. А какие альтернативы turbolinks, кроме pajax?11:32
@rubyunderhood puma, иногда unicorn. в зависимости от типа проложения. у пумы с тредами бывают проблемки, но она удобнее в поддержке.11:32
.@xvonabur @mr_The на практике - если в приложении почти нет js - оно не помогает, а если его много - слишком часто мешает.
11:37.@knopkodav так а чем лучше? zero time deploy как у юникорна/пумы нет. тредов как у пумы бесплатно нет.
11:54@rubyunderhood твиттер слишком мал, но если коротко, то радует, что не надо писать кучу скриптов для запуска/деплоя/супервайзинга и т.п.12:06
.@knopkodav для пумы будет 1 простой systemd файл :)
12:07@rubyunderhood да, но разница между нами — вы мыслите как программист, а я мыслю как избежать программирования12:12
.@knopkodav я считаю, что если есть возможность контролировать что-то кодом, который юзают миллионы человек - то лучше делать это.
12:12.@knopkodav чем юзать самописный, местами крешащийся, код пассажира :)
12:13@rubyunderhood используете ли для коммуникации Telegram? Сегодня натолкнулся на integram.org занятный сервис.13:21
.@ajieks у нас платформы менялись примерно так - hangouts -> skype -> hipchat -> hipchat + telegram, другие комманды еще slack юзают.
13:22Итак, как вчера и обещал - рассказываю про rocker.
16:04Рокер - это такая надстройка на docker cli, которая умеет парсить рокерфайлы - github.com/grammarly/rock…
16:05Рокерфайл - это, в свою очередь, такой докерфайл с расширенным синтаксисом - github.com/grammarly/rock…
16:06Заранее хочу сказать, что к разработчикам (@Grammarly) я не имею никакого отношения, просто вещь действительно удобная.
16:07Так вот, сегодня мы займемся уменьшением размеров ваших рубишных образов и для этого мы будем использовать команды EXPORT и IMPORT
16:08Зачем вообще уменьшать размер докер образов, учитывая, что они layered и базовые образы вы скачиваете реально только один раз?
16:09Ну во первых - ради интереса, делают же на rust (mainisusuallyafunction.blogspot.com/2015/01/151-by…) и nim (hookrace.net/blog/nim-binar…) "минимальные" бинарники
16:11Во вторых - если серверов много, то качать в первый раз все равно приходится немало - образ ruby:2.2.3 весит 718MB на текущий момент
16:13Ну и в третьих - зачем вообще с собой таскать ненужное?
16:14Принцип ужатия докер-образов для руби очень простой - избавится от лишних нативных библиотек и их хедеров/etc…
16:15…и избавиться от гемов, которые вам в продакшене не нужны (как правило, это все то, что находится в :development и :test группах в гемфайле)
16:16… в моем случае - это еще группа :assets, которую я "возвращаю" даже на rails 4 и выше.
16:17Для таких лентяев, как я, ребята из докера сделали не только обычные образы с руби, но еще и их slim-версии (ruby:2.2.3-slim - 275.3MB).
16:19Основная разница - slim базируется на голом образе debian:jessie (github.com/docker-library…), а обычная версия - на buildpack-debs:jessie…
16:21… github.com/docker-library…. Второй образ включает в себя кучу dev-версий различных библиотек.
16:22Основная проблема заключается в том, что использовать slim просто так сложно, т.к. ни nokogiri, ни даже json гем вы туда не поставите
16:22… т.к. не найдете нативных библиотек, которые им нужны (и их хедеров).
16:23И тут на помощь приходит rockerfile с несколькими FROM-ами (github.com/grammarly/rock…) и IMPORT/EXPORT доступными между несколькими образами
16:24github.com/fxposter/s6-ng… на текущий момент я деплою рельсы в докере примерно вот так
Разберем, как это делается на моем же примере с s6/nginx/docker (twitter.com/rubyunderhood/…): github.com/fxposter/s6-ng…
16:26Сначала мы используем дефолтный образ руби, устанавливаем только гемы, нужные для продакшена и экспортируем их - github.com/fxposter/s6-ng…
16:27После этого нам нужно удалить конфиги бандлера и установить гемы заново, только теперь вместе с группой :assets - github.com/fxposter/s6-ng…
16:28Затем мы прекомпилируем ассеты и также экспортируем их: github.com/fxposter/s6-ng…
16:29К этому моменту мы имеем 2 директории в экспорте - ассеты и установленные гемы со скомпиленными экстеншенами.
16:30Начинаем билдить конечный продакшен образ из ruby:slim - github.com/fxposter/s6-ng…
16:30Повторяем все то, что есть в стандартном Dockerfile (устанавливаем nginx и s6) - github.com/fxposter/s6-ng…
16:31Импортируем гемы, которые мы экспортировали на предыдущем шаге (и на всякий случай делаем bundle install) - github.com/fxposter/s6-ng…
16:32Прогоняем хитрую, но очень полезную команду - github.com/fxposter/s6-ng…
16:33Если вы в приложении используете mysql и вы попытаетесь с этим файлом сбилдить приложение, то вы получите ошибку - gist.github.com/fxposter/78a08…
16:34Она означает, что некоторые экстеншены, которые были скомпилированы в первом шаге, зависят от некоторых библиотек динамически.
16:35В моем случае это libmysqlclient.so.18 и для того, чтобы мой образ реально был рабочим мне нужно будет установить эту библиотеку
16:36Это можно сделать примерно так - github.com/fxposter/s6-ng…
16:36В общем - эта команда гарантирует, что у вас не будет ситуации, что какой-то гем был динамически слинкован с библиотекой, которой в slim нет
16:38Ассеты тоже импортируем - github.com/fxposter/s6-ng…
16:39Ну и напоследок - опционально тегируем полученный образ, т.к. rocker build на текущий момент не поддеживает опцию -t при билде
16:40В итоге: на довольно простом приложении получаем уменьшение размера образа более чем в 2 раза: 852.9MB -> 357.4MB.
16:41Как можно еще уменьшить размер: удалять кеши бандлера и рубигемов, переехать с стандартного дебиана на какой-нибудь Alpine Linux или busybox
16:43Меня же и то что получается в итоге вполне устраивает. :)
16:44Все ссылки на Rockerfile валидны для этого коммита github.com/fxposter/s6-ng…. Спасибо, @listochkin
17:07@rubyunderhood В старых версиях частенько встречались фэйлы, особенно с хот релоад. + не любое сочетание треды:воркеры работает и сейчас.20:12
# Суббота 32 твита
Да ладно, сварю я сам себе ужин… :: pic.twitter.com/CDVwRPe8fu11:50![]()
Веб девелоперам - если ваш запрос на сервере выполняется 10сек, вы дернули апишку и через 1ске сделали ctrl-с - что произойдет на сервере?:)
13:47Еще задачка - у вас есть POST /posts, который создает посты. Обычно он отвечает за 1сек, ваш клиентский таймаут 10сек.
15:57… что вы можете сказать о стейте сервера (ну и бд) после того, как у вас все же отвалился запрос по таймауту?
15:58@rubyunderhood Запрос будет крутиться дальше, если конечно не отслеживать состояние клиентского сокета.17:04
@rubyunderhood @scaint а знание и понимание предполагает какую-то обработку таких кейсов?19:21
.@killthekitten @scaint помогает пониманию того, что у тебя на продакшене происходит
19:21@rubyunderhood @fxposter php.net/manual/en/func… извините.21:48
@rubyunderhood что за "эти вещи", которые важны?21:49*не придираюсь, просто, кажется, ты рассуждаешь в контексте своих проблем, не очевидно*
.@killthekitten если ты делаешь ajax-запрос и он таймаутится - то ты НЕ МОЖЕШЬ сказать юзеру, что "все плохо, но попытайся заново"
21:50.@killthekitten более того - ты не можешь автоматически повторять запрос в надежде, что он сработает :)
21:51.@killthekitten аналогично, если ты с сервера обращаешься к внешнему сервису и вылетаешь по таймауту-ты должен явно прокинуть таймаут дальше
21:52.@killthekitten иначе есть вероятность, что ты потом будешь делать такой же запрос потом, а сервис будет уже в неконсистентном состоянии
21:53.@killthekitten а еще нужно понимать, что если вы делаете запрос - то "плохие ситуации" могут включать в себя:
21:54.@killthekitten запрос
21:55.@killthekitten и с "клиента" ты не сможешь определить что случилось :)
21:56… что вы можете сказать о стейте сервера (ну и бд) после того, как у вас все же отвалился запрос по таймауту?
.@killthekitten именно поэтому правильный ответ на twitter.com/rubyunderhood/… - "ничего, пока сервер заново не станет отвечать" :)
21:57@rubyunderhood а как предложишь обрабатывать запросы к внешним сервисам, которые отправляются after_commit?21:58
.@killthekitten если запросы, которые делаешь - не idempotent - молиться :) иначе - очередь с at least once delivery :)
21:59Чуток про распределенные системы: the-paper-trail.org/blog/distribut…, dancres.github.io/Pages/ и christophermeiklejohn.com/distributed/sy… :)
22:03Если вкратце - то любые запросы (tcp, http, …) могут не дойти:
22:04В связи с этим стоит мыслить о любых ваших запросах куда-либо как о данных, передающихся по кабелю, который В ЛЮБОЙ МОМЕНТ могут перерезать
22:05Аналогично - любому серверу, который обрабатывает запрос, может в ЛЮБОЙ момент выдернуть кабель питания
22:06Вот в таком мире мы на самом деле живем :) и пытаемся строить над этим абстракции.
22:07Разумеется, вы не будете везде и всегда пытаться обрабатывать ВСЕ плохие варианты развития событий…
22:09… хотя иногда наверное это и стоит делать (например, когда от этого зависят жизни людей).
22:09Но такое отношение к продакшену иногда очень помогает понять, ОТКУДА появились такие странные данные в бд, и КУДА делись логи запросов :)
22:10blog.jruby.org/2015/10/perfor… @headius приготовил очередные улучшения производительности в @jruby 9.0.3.0!
22:41@rubyunderhood есть ещё такие аспекты speakerdeck.com/sirupsen/euruk…22:54
.@d1b ну это про hardware failures, которые локальные, не совсем по этой теме. Но слайды крутые, уверен доклад тоже был хороший.
22:54# Воскресенье 5 твитов
vimeo.com/132194544 - о том, что вообще такое микросервисы, как мы к ним пришли и как их можно делать. Очень хороший доклад.
18:12@rubyunderhood @headius @jruby ага, только рельсы на нем все равно медленнее в 2 раза, чем на MRI :(18:16
@bytecheg @rubyunderhood @jruby I don't think that is strictly true. ActiveRecord may be slower but apps using Sequel and Rails are fast.18:16
Подходит к концу моя неделя на @rubyunderhood. С вами был @fxposter. Если у вас остались вопросы - пишите туда. Всем спасибо! :)
21:48Напоследок немножко рекламы - мы проводим в Днепропетровске митапы по самым разным технологиям - приходите! meetup.com/Wix-Ukraine-Me…
21:50# Ссылки
github.com
- https://github.com/wix
- https://github.com/wix/react-templates
- https://github.com/wix/accord
- https://github.com/wix/future-perfect
- https://github.com/Netflix/eureka/wiki#eureka-20-work-in-progress
- https://github.com/docker/docker/issues/5618
- https://github.com/fxposter/s6-nginx-ruby
- https://github.com/docker-library/official-images#init
- https://github.com/ruby/ruby/commit/a356fe1#diff-ff4e2dc4962dc25a1512353299992c8dR23
- https://github.com/royaltm/ruby-em-pg-client
- https://github.com/grammarly/rocker
- https://github.com/grammarly/rocker#rockerfile
- https://github.com/docker-library/ruby/blob/4cba299a609debea1b81a8da9844e6d27fba5229/2.2/slim/Dockerfile#L1
- https://github.com/docker-library/ruby/blob/0cdec78d89e33750a4b796bd2c748f0d5a1ae654/2.2/Dockerfile#L1
- https://github.com/grammarly/rocker#from
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L8-L11
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L13-L14
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L16-L19
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L21
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L27-L67
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L69-L72
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L73
- https://github.com/fxposter/s6-nginx-ruby/blob/master/Rockerfile#L23-L25
- https://github.com/fxposter/s6-nginx-ruby/blob/ab7ab615109825230530f555ba893b778b468434/Rockerfile
gist.github.com
- https://gist.github.com/fxposter/1682f9b667274dc4690d
- https://gist.github.com/fxposter/5338807f96a14f3babeb
- https://gist.github.com/scaint/88b45903b00b7c5865ca
- https://gist.github.com/fxposter/c2ec29a813f0a8b56a1f
- https://gist.github.com/fxposter/9133bc62642c75c33189
- https://gist.github.com/Ptico/cd61a0628bec90ee6139
- https://gist.github.com/fxposter/78a088533b0cee1ccb11
other
- http://wix.com/
- http://www.amazon.com/The-Phoenix-Project-Helping-Business/dp/0988262592
- http://www.ozon.ru/context/detail/id/32211144/
- http://devblog.avdi.org/2015/10/12/i-have-a-newsletter-you-could-subscribe-maybe/
- http://www.rubytapas.com/
- https://www.youtube.com/channel/UC_QIfHvN9auy2CoOdSfMWDw/videos
- https://www.youtube.com/watch?v=ZGIAypUUwoQ
- https://www.youtube.com/watch?v=27ynM2tbNXM
- https://www.youtube.com/watch?v=Is90zavhL9A
- http://blog.cognitect.com/cognicast/
- http://atp.fm/
- https://www.railstutorial.org/
- http://changelog.com/rich-hickeys-greatest-hits/
- https://letsencrypt.org/2015/10/19/lets-encrypt-is-trusted.html
- http://12factor.net/
- https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/
- https://blog.phusion.nl/2015/01/20/baseimage-docker-fat-containers-treating-containers-vms/
- http://blog.tutum.co/2014/12/02/docker-and-s6-my-new-favorite-process-supervisor/
- http://blog.tutum.co/2015/05/20/s6-made-easy-with-the-s6-overlay/
- https://devcenter.heroku.com/articles/rails-asset-pipeline#asset-caching
- https://medium.com/@oceankidbilly/strangeloop-after-strangeloop-3941b9ed6773#.xwfz5hjl6
- https://coub.com/view/8orbm
- http://blog.davidchelimsky.net/
- https://xkcd.com/1312/
- http://www.ccs.neu.edu/racket/pubs/ecoop2015-takikawa-et-al.pdf
- http://www.railscomposer.com/
- https://aws.amazon.com/opsworks/
- http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using_cluster_computing.html
- http://arstechnica.com/security/2015/10/new-attacks-on-network-time-protocol-can-defeat-https-and-create-chaos/
- https://integram.org/
- http://mainisusuallyafunction.blogspot.com/2015/01/151-byte-static-linux-binary-in-rust.html
- http://hookrace.net/blog/nim-binary-size/
- http://php.net/manual/en/function.ignore-user-abort.php
- http://the-paper-trail.org/blog/distributed-systems-theory-for-the-distributed-systems-engineer/
- http://dancres.github.io/Pages/
- http://christophermeiklejohn.com/distributed/systems/2013/07/12/readings-in-distributed-systems.html
- http://blog.jruby.org/2015/10/performance_improvements_in_jruby_9030/
- https://speakerdeck.com/sirupsen/euruko-2015-super-reliable-software?slide=14
- https://vimeo.com/132194544
- http://www.meetup.com/Wix-Ukraine-Meetup-Group/