fxposter

19 октября 2015, Dnepropetrovsk, Ukraine

# Понедельник 112 твитов

Всем привет! Эту неделю с вами проведу я, @fxposter

8:08

Меня зовут Паша, живу в Днепропетровске, работаю devops-ом в израильской компании Wix.com

8:08

Пишу на руби уже около 7 лет, последние 4 из которых связанны с руби значительно больше чем с рельсами :)

8:08

Люблю все что связано с многопоточностью, распределенными системами, языками программирования и хорошим кодом

8:08

Также иногда выступаю на конференциях и по мере сил стараюсь организовывать митапы у нас в Днепре

8:09

А поговорим мы на этой неделе о всем что связанно с devops, докером, распределенными системами...

8:09

… и тем, как это все выглядит с точки зрения простого рубиста :)

8:09

Начнем с начала - кто тут читал The Phoenix Project? :)

8:10

Кто не в курсе что это такое - amazon.com/The-Phoenix-Pr…, увлекательное художественное чтиво о том, как не ладят админы с остальным миром :)

8:12

Кстати говоря, уже есть и перевод ozon.ru/context/detail…

8:24
@rubyunderhood думал ты про эликсир
8:29

.@kelyar про эликсир мы тоже поговорим, но попозже :)

8:30

Так вот, через всю книгу там проходит идея процесса "change management", т.е. согласования того, какие изменения происходят в системе…

8:33

… например - что именно и когда вы будете деплоить, какие бд нужно обновить и когда и т.д.

8:33

В связи с этим возникает вопрос - как вы относитесь к необходимости подобного процесса? и как это устроено у вас в компаниях?)

8:35
@rubyunderhood wix на Rails? Что еще в стэке и технологиях есть?
8:44

.@mpak999 нет, я бы сказал СОВСЕМ нет :) есть у нас много чего, но основной бекенд - Scala, остатки Java

8:45

.@mpak999 ну и по мелочи - Ruby, Python, Erlang (по-моему), Go, был проект на Clojure ЕМНИП :)

8:47

.@mpak999 при этом все что связано с руби - это Chef или мелкие (и иногда совсем не мелкие) внутренние сервисы на руби, рельсах/синатре

8:52

Если уж появился вопрос про мою работу - у нас куча всего открытого лежит на github.com/wix

8:54

Из того, с чем я сталкивался - github.com/wix/react-temp… angular-like шаблоны для React.js…

8:56

github.com/wix/accord - библиотека валидаций для Scala

8:56

github.com/wix/future-per… - несколько удобных фич для фьючеров в Scala

8:56
@rubyunderhood не плохой зоопарк :) тяжко переключаться между языками и технологиями?
9:10

.@mpak999 как правило разные команды пишут разные сервисы на разных языках/технологиях

9:11

.@mpak999 я в основном пишу на руби, редко на go, хочу еще clojure и elixir в продакшен :)

9:12

Вообще работа в большой IT компании заставляет тебя по-другому посмотреть на разные вещи.

9:33

Например на то, что если у вас есть проблемы со скейлингом - всегда можно добавить пару-тройку серверов...

9:33

... правда только если они stateless :)

9:33

На то, что фронтенд и бекенд - это скорее все же не одно приложение и возможно не стоит их хранить вместе.

9:33

На то, что "одна огромная база данных с большим количеством таблиц" на все случаи жизни - это не всегда хороший вариант.

9:34

На то, что репликация бд - это не просто "читать из бд с другого сервера".

9:34

На то, что multi-datacenter деплой не очень совместим с дефолтными в рельсах "автоинкрементными интами". :)

9:34

.@dcromster в моем случая - продуктовая компания, >500 разработчиков в нескольких локациях

9:35
@rubyunderhood как кстати Elixir? нет чувства незавершенности и боязни, что не взлетит технология?
9:46

.@mpak999 учитывая довольно хорошее взаимодействие между эликсиром и эрлангом,наличие книг про elixir и elixircon-думаю с ним все будет ок

9:48

.@mpak999 более того, лично мне кажется, что эликсир в итоге станет более популярным, чем сам эрланг. хотя эрлангисты со мной не согласны :)

9:49

devblog.avdi.org/2015/10/12/i-h… у очень известного рубиста Авди Гримма теперь есть еще и рассылка :)

10:15

А если вы все еще не знаете, кто это - то настоятельно рекомендую зайти на rubytapas.com, посмотреть пару эпизодов и подписаться

10:16

Чтобы тви не простаивал зря - а кто был на Еуруко вчера-позавчера? Расскажите, как оно было, а я поретвичу :)

12:16

BTW, если кто еще не смотрел - видео со Strangeloop уже давно в онлайне - youtube.com/channel/UC_QIf…

12:18

Особенно рекоммендую youtube.com/watch?v=ZGIAyp… про coordination, crdt, и распределенные системы…

12:19

… и youtube.com/watch?v=27ynM2… про то, как Netflix видит service discovery у себя в будущем (поподробнее здесь - github.com/Netflix/eureka…)

12:21
@rubyunderhood было хорошо, интересные доклады, четкая организация
12:46

.@damirca а какие доклады больше всего понравились?

12:46
@rubyunderhood доклад от @rrrene про инлайн документацию, доклад от девопса @Shopify про reliable systems
12:50
@rubyunderhood Зальцбург прекрасен. Было штуки три хороших доклада.
12:50
@rubyunderhood афтепати вообще збс
12:52
@rubyunderhood Про resiliency в shopify норм самый был. Хотя ничего нового
12:55

Как всегда почти в тему - а посоветуйте интересные подкасты послушать. Можно о руби, можно нет. Можно на англ.

13:02

От себя порекоммендую blog.cognitect.com/cognicast/, который раньше назывался Think Relevance

13:02

BTW, периодически дослушиваю некоторые старые эпизоды и жалею, что не слушал их раньше и не знал о том, как развивается их компания…

13:03

BTW, если у кого-нибудь есть вопросы про докер, шеф или какие-нибудь еще ops-ориентированные вещи - не стесняйтесь спрашивать.

14:13
@rubyunderhood почему не ансибл? #простите
14:17

.@inem очень много готового кода у нас, мы дружим с руби, нас устраивает pull model, хотя иногда кое-где хочется push.

14:18

.@inem а в чем у тебя проблемы с шефом?)

14:20
@rubyunderhood слишком много новых концепций на ровном месте.
согласен, что если все уже нарулено на шефе, дергаться смысла нет
16:35

.@inem ну оно все не просто так, например зависимости ресурсов через subscribes/notifies - это очень полезно в некоторых случаях

16:36

.@inem в остальном - большинство (но не все) рецептов/плейбуков/etc можно заменить простыми, короткими баш-файлами

16:37
@rubyunderhood давай про докер затрём, я его использую для CI, точнее @droneio берёт любой docker образ и выполняет тесты внутри него.
16:57
@rubyunderhood то есть, у меня уже есть окружение из нескольких контейнеров для запуска тестов, теперь хочу деплоить всё это дело? куда, как
16:57

.@lisovskyvlad все очень зависит от того, что ты хочешь и сколько денег можешь вложить

16:57

.@lisovskyvlad есть PAAS-ы, самые крупные: Amazon ECS, Google Container Engine, Joyent Triton

16:59

.@lisovskyvlad если деплоить на свои сервисы - то начиная от docker run ручками, заканчивая kubernetes/mesos+aurora и с dokku посредине

17:00

.@lisovskyvlad можно также деплоить шефом через chef-docker или что-то самописное. я завтра скомпоную список нюансов,которые стоит учитывать

17:03

Как-то первый день прошел почти без руби. Исправляюсь - здесь я рассказываю как все печально в рельсах (ну, почти) youtube.com/watch?v=Is90za…

17:05
@rubyunderhood Какие книги/курсы/и тд советуете для новичков, как лучше учить и тд?
17:12

.@pinyslutty ну я в отличии от @kirshatrov считаю, что начинать нужно не с изучения руби, а с теории ООП и организации кода :)

17:18
@rubyunderhood Ruby5, Bike Shed от ThoughtBot
17:19

По запросам читателей - мой (неполный) список рекомендованной литературы для программистов:

17:24

1. Design Patterns - не с целью использовать, а для понятия принципов

17:24

2. PoEAA - вот тут уже пользы будет побольше

17:24

3. Clean Code - с некоторые концепциями не согласен, но прочесть стоит

17:24

4. Working Effectively With Legacy Code - по названию понятно, зачем оно нужно :)

17:24

Параллельно стоит читать что-то про руби/рельсы:

17:25

1. railstutorial.org - сам не читал, но слышал много хорошего

17:25

2. Agile Web Development with Rails - я читал, но давно и скорее всего RailsTutorial будет полезнее сейчас

17:25

Дальше моя серия PragProg:

17:25

3. The RSpec Book

17:25

4. Rails Test Prescriptions

17:25

5. Crafting Rails Applications - особенно рекоммендую, сейчас вышла версия для Rails 4

17:26

6. Continuous Testing

17:26

7. Rails View

17:26

А, ну и еще ОБЯЗАТЕЛЬНОЕ дополнение к первому списку - Growing Object-Oriented Software, Guided by Tests

17:29

Также обязательны к просмотрю все видео Рича Хикки: changelog.com/rich-hickeys-g… (это не все, но многие)

17:31

После всего этого балагана "The Joy Of Clojure" тоже пошла хорошо :)

17:32
@rubyunderhood @pinyslutty @kirshatrov теория без понимания проблемы бесполезно
17:34

.@ptico @pinyslutty @kirshatrov когда я PoEAA Фаулера читал - я руби не знал :)

17:34

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

17:35

И да, со времен универа я пописал на PHP, C++, Java, VBScript, Python - в том числе и для продакшена

17:39
@rubyunderhood @pinyslutty @kirshatrov т.е. пока говна не пожуешь, тебе фаулер покажется бесполезным
17:39
@ptico @rubyunderhood @pinyslutty @kirshatrov согласен,новичку теория сто раз не сдалась.Важнее получить базис практики и на него уже теорию
17:41

.@ptico @anton_davydov ну тут я не согласен. главное думать что ты пишешь и размышлять о том, чего ты НЕ СМОЖЕШЬ сделать со своим кодом.

17:42

.@ptico @anton_davydov и после таких размышлений тебе самому захочется узнать как сделать код более податливым к дальнейшим изменениям

17:43

.@ptico @anton_davydov если желание размышлять есть - тебе теория будет полезна сразу. если нет - то тут мало что поможет, ИМХО

17:44
@rubyunderhood @ptico ок, заставь прочитать новичка (который даже языка не знает) банду четырех, а потом смотри как он тебе ооп писать будет
17:52

.@anton_davydov @ptico ну цели учить не-программистов у меня особо никогда не было

17:53
@rubyunderhood @ptico это был простой пример того, что не вся теория может быть воспринята без практики до этого
17:54

.@anton_davydov @ptico BTW, слушая многие собеседования (не руби) я вижу, что многие работающие программисты знают меньше чем пятикурсники

17:55

.@anton_davydov @ptico обратный пример - сколько ты можешь доверить человеку, сделавшему блог на рельсах по примеру? :)

17:56
@rubyunderhood @ptico так ты ищешь разработчика с опытом или знанием? то,что пятикурсники что-то знают - не делает их крутыми программистами
17:57

.@anton_davydov @ptico проблема в том,что эти "программисты" понятия не имеют как их код реально работает,в отличии от умных пятикурсников

17:57

Еще одна причина,по которой я люблю рекомендовать теорию и фундаментальные вещи-они будут вам помогать значительно дольше чем знание рельсов

18:00
@rubyunderhood @ptico больше, чем упоротому олимпиаднику, который реализует все алгоритмы сам (тебе потом разгребать же все это)
18:01
@rubyunderhood @ptico а умные пятикурсники "все знают" и пишут код как хз что + их не переучить обычно(как я знаю)
18:01

.@anton_davydov @ptico я не говорил об упоротых олимпиадниках. хотя они как правило очень ок. :) про остальное спорить бесполезно

18:03

.@anton_davydov @ptico у меня видать какие-то неправильные пятикурсники (такие каким был я, например) :)

18:05

Теория vs практика - это неважно, вот что важно pic.twitter.com/eztjQbW6A2

18:06
@anton_davydov @rubyunderhood @ptico Я считаю, что лучше всего сначала практика, потом теория. Теория без практики пользы не принесет.
18:52
@anton_davydov @rubyunderhood @ptico А практика без теории может в конечном итоге принести проблемы.
18:52

.@suxxes @anton_davydov @ptico @Xedin вот я с своей жизни сталкиваюсь плохим кодом плохого практика, чем чересчур хорошего теоретика ;)

18:54

# Вторник 61 твит

Starting to feel justified in my criticisms of goroutine design by the crazy prevalence of goroutine leaks.

Отличный тред про дизайн горутин и смежные вещи twitter.com/mentalguy/stat…

6:07

letsencrypt.org/2015/10/19/let… Мы все стали на один шажок ближе к бесплатному, автоматизированному и открытому TLS!

6:31

Тем, кому хочется немного поломать голову (и поупражняться в знании руби) посвящается: gist.github.com/fxposter/1682f…

10:22
@rubyunderhood люди добрые, кто работал с alchemy-cms и что думаете на счет него?
11:20

.@ajieks совсем не сталкивался, так что ничего не скажу :(

11:33
@rubyunderhood предложили заказ по переделке сайта универа, смотрю что нынче в области CMS у Ruby, чтобы прикинуть, стоит ли связываться
11:48

.@ajieks скажу честно - ни разу не сталкивался с CMS на рельсах. Когда занимался чисто рельсами - популярным был RefineryCMS....

11:49

.@ajieks похоже сейчас ничего не изменилось

11:49
@ajieks @rubyunderhood если организация не может заплатить за нормальный проект – не связывайтесь.
11:54

.@igor_alexandrov @ajieks поддержу. особенно неприятно будет потратить свое время и нервы на "поддержку" потом.

11:55

Вчера прозвучал вопрос о том, как готовить докер. Обо всем не расскажу, но пару шишек мы с ним уже набили.

11:57

Итак, первое и самое неприятное - github.com/docker/docker/…. Залипает все что связано с докером, а точнее с network namespace.

11:58

Лечится пока что только ребутом сервера и проблема где-то внутри ядра и чинить никто не хочет, т.к. стабильно воспроизвести проблематично.

11:59

Автоматическое лечение - как только `dmesg -l emerg | grep 'waiting for lo to become free.'` начинает что-то выдавать - сразу в ребут.

12:00

Ставите докер - не забывайте ротейтить его логфайлы. Если у вас используется шеф вместе с докером - gist.github.com/fxposter/53388…

12:05

…если же нет - по gist-у понятно, как настроить логротейт ручками

12:05

Третье - докер - это не серебряная пуля. Совсем совсем. Ну ни капельки. Если вы пришли к микросервисам - пока у вас не будет мониторинга…

12:07

… лоад-балансировки, автоматического деплоймента, service discovery - докер вам может только помочь "немного поиграться"

12:08

… конечно, если вы не используете hosted-решения или какой-нибудь kubernetes (который еще на продакшене завести надо)

12:09

12factor.net прекрасен, но не всегда реально вынести весь конфиг в ENV-переменные, как рекомендуют они и докер.

12:11

Также не всегда достаточно иметь "один stdout" для всех логов.

12:12

Но как только вы начинаете делать конфиг-файлы и лог-файлы - сразу встает вопрос о необходимости откуда-то брать подключаемые VOLUMES

12:13

И менеджить UID/GUD-ы в них. Например - приложение создало лог-файл на подключемом диске. Приложение бежит не под рутом (т.к. это плохо)

12:16

Нужно понимать что если вы измените base image для вышего контейнера, или просто поставите перед созданием вашего юзера в докерфайле…

12:16

… какое-нибудь пакет - он может создать дополнительного юзера, который может сместить UID для юзера под которым запускается приложение.

12:17

И после обновления на новую версию оно не запустится потому что не сможет писать в логи

12:18

Аналогичная проблема возможна с правами на конфиг-файлы

12:18

Далее следует возможная проблема с зомби-процессами: blog.phusion.nl/2015/01/20/doc… (да да, это те же чуваки, которые делали REE и Passenger)

12:22

… которую ребята предлагают решать так: blog.phusion.nl/2015/01/20/bas….

12:23

Но вместо кастомного скрипта на питоне мне больше нравится вариант с S6 на C: blog.tutum.co/2014/12/02/doc… и blog.tutum.co/2015/05/20/s6-…

12:24

Теперь непосредственно к рельсам. С их упаковкой в докер контейнер есть одна маленькая проблема. Она называется Asset Pipeline

12:27

и заключается она в том, что запросы на js,css и остальную статику будут идти сквозь ваше приложение.подробнее тут - devcenter.heroku.com/articles/rails…

12:30

Хероку предлагает использовать Rack::Cache (будет быстрее, но все равно руби будет участвовать в запросе) или CDN

12:32

В идеале было бы неплохо проксировать трафик на приложение через какой-нибудь локальный nginx, задеплоенный рядом как отдельный контейнер

12:33

Но вариант проще - просто засунуть nginx внутрь своего контейнера с приложением

12:34

github.com/fxposter/s6-ng… на текущий момент я деплою рельсы в докере примерно вот так

12:49

А теперь пойду поем

12:52
@rubyunderhood а в чем смысл? Какую проблему вы решаете при помощи докера
14:34

.@achempion будущее развитие платформы, унификация деплоя различных типов приложений, возможная миграция на kubernetes, etc…

14:34

.@achempion в каком плане более конкретно?) есть приложения на java/scala/node/ruby/go, хочется их деплоить (и мониторить) одними средствами

14:39

.@achempion если смотреть с точки зрения руби - иметь всегда рабочий билд вместе с нативными экстеншенами

14:39
@rubyunderhood у вас, как я понимаю, 1 большой сервер с множеством разных стеков и вы решаете проблему изоляции процессов друг от друга
14:46

.@achempion сотни серверов и сотни сервисов на них. изоляция - это плюс, но не основная вещь.

14:47
@rubyunderhood можешь дать пример когда это не работает? Ведь зачастую поток принимает умный агрегатор.
17:03

.@d1b java logback настроенный чтобы генерировать 5 разных логов для разных данных.

17:03
Тем, кому хочется немного поломать голову (и поупражняться в знании руби) посвящается: gist.github.com/fxposter/1682f…

Ну что, у кого-нибудь получилось? :)
twitter.com/rubyunderhood/…

17:06
@rubyunderhood оспаади! Что там решать? api.instance_exec(&block)
17:11

.@ptico хех, а ты попробуй

17:11

Эта задачка имеет реальное применение,когда в шефе хочется построить свою библиотеку с блекджеком, но доступ к ресурсам шефа все равно нужен

17:21
@rubyunderhood В общем, если все таки eval, то так будет работать: gist.github.com/scaint/88b4590…
19:56

.@scaint молодец! А вот и пример где это может реально использоваться (лямбда должна выполнятся внутри chef context) gist.github.com/fxposter/c2ec2…

19:58

.@ipronix эммм… БИТРИКС? coub.com/view/8orbm

20:01
@ipronix @rubyunderhood да @backendsecret на этой неделе какой-то лютый тролль.
20:07

.@as_Crazy @ipronix @backendsecret прости, но язык в котором родились rspec и cucumber, а также рельсы...

20:50

.@as_Crazy @ipronix @backendsecret ... которые продвинули тестирование и удобство разработки в массы...

20:51

.@as_Crazy @ipronix @backendsecret ...в то время как многие пхпшники до сих пор не знают что такое TDD и как всё-таки работает HTTP и phpfpm

20:53

.@backendsecret @as_Crazy @ipronix я помню, как развивался Spring MVC взяв в себя все лучшее из рельс.

20:55

.@backendsecret @as_Crazy @ipronix а стандарты это местами тоже плохо - ужасно тормозят развитие. Пока их напишут, реализации сделают.

20:57

На сегодня все. Всем спокойной ночи! :)

20:58

# Среда 41 твит

.@rubyunderhood @scaint тот случай когда "простота хуже воровства", за это chef и не любят
6:38

.@d1b @scaint Юзай баш :)

6:38

Продолжая вчерашний холивар (и нарываясь на то, что меня попрут отсюда :)) - экосистема руби действительно не идеальная и…

6:43

… многие известные рубисты уже ушли из нее на что-то по их мнению более перспективное - Челимски (rspec) - на кложуру, Валим - на эликсир

6:44

… кто-то переходит на Go и Rust. Вы сами вольны выбирать - копаться в говне или делать что-то стоящее. ;)

6:46

Это просто один из инструментов, который решает некоторые задачи и иногда решает их очень хорошо. Серебряной пули нет. Ну или я не нашел :(

6:47
@rubyunderhood судя по blog.davidchelimsky.net Челимски на кложуру перешел, т.к. на новом месте была только она, в итоге втянулся
7:24

.@ajieks по-моему нельзя идти в Cognitect надеясь на то, что ты будешь работать с руби :)

7:24
@rubyunderhood необходимы Ruby курсы в Полтаве... Помогите чем можете...
7:25
@rubyunderhood haskell решит все проблемы!
7:26

.@Shiroginne да, конечно xkcd.com/1312/

7:27
@rubyunderhood @rainrb самый полезный человек в руби сообществе пишет не на руби, а на си. а те кто ушли, особенно валим, не сильно нужны.
11:59

.@ipronix @rainrb ну ОЧЕНЬ спорно. C нужно для экстеншенов и самого руби, что в какой-то степени влияет на экосистему,но не главная ее часть

12:01

.@mpak999 то, что действительно шарящие люди уходят из комьюнити - это плохо для комьюнити

13:19
@rubyunderhood шарящие молча работают и делают проекты, компьюнити - это тусовка для хипстеров и девочек
13:20

.@mpak999 лол, а благодаря чему ты языки учишь? откуда появляются гемы, документация, примеры использования? фреймворки, апп сервера?

13:20

.@mpak999 или ты пишешь на голом руби, вычитываешь из сокета данные и парсишь сам HTTP?

13:21
@mpak999 @rubyunderhood мне кажется, что одни ушли – придут другие. Нормальная ротация. Свежий взгляд, так сказать.
13:21

.@igor_alexandrov @mpak999 вероятно вы не следите за clojure/elixir/go комьюнити. очень многие из тех кто был вначале пути с руби - ушли.

13:22

.@igor_alexandrov @mpak999 и не факт что пришедшие смогут их заменить

13:23

.@mpak999 через 5 лет такого "движения вперед" ты поймешь что безнадежно отстал :)

13:24
@rubyunderhood не совсем, со стороны выглядит как паника, хотя в языки приходили и уходили,это молоток, взял один, взял другой, сделал дело.
13:28
@rubyunderhood если как бы за 5 лет, ты не выучил еще 2-3х языков или технологий - то ты отстал в любом язык, что кложа, что питон, что руби
13:30

.@mpak999 пик популярности руби пройден уже значительно больше 5 лет назад, и многие, кто привели руби к ТОЙ популярности уже не здесь :)

13:35

.@mpak999 и да - нет никакой паники, просто констатация фактов :)

13:36

.@mpak999 лишний хайп - это быстрое развитие. "просто работа" - это аналог того что происходит с java (не jvm).

13:39
@rubyunderhood фактически если рубя сейчас резко загнётся то собсно того что уже есть с головой хватает :) @mpak999
13:41

.@POS_troi @mpak999 время не стоит на месте, объемы данных растут, необходимость обрабатывать все больше вещей параллельно - тоже.

13:41

Какие-то у меня мрачноватые перспективы прослеживаются :) Поэтому вернемся непосредственно к руби - а чего вам в руби не хватает сейчас?

13:42

В языке, экосистеме, гемах?

13:42

.@mpak999 нода может себе это позволить просто потому что аналога js на фронтенде нет, а эти люди еще и бекенд хотят :-D

13:43
@rubyunderhood нормальных тредов в mri :)
13:45

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

13:46

И хоть какую-нибудь memory model для многопоточного программирования, раз уж у нас все на mutable state построено :)

13:47
@rubyunderhood модели акторов в языке, необязательной типизации, байт-кода
13:48

.@svenyurgensson поясни про необязательную типизацию, ты хочешь проверок в рантайме?

13:48
@rubyunderhood нет, просто когда надо скорость работы/удобство - (x: Int, y: String), если важно утипизация - то как сейчас
13:51
@rubyunderhood А вообще очень нравится Crystal, наблюдаю и жду когда они допилят корутины/каналы (или было бы лучше - акторы) и тогда можно
13:51

.@svenyurgensson почему я спрашиваю - частичная типизация без проверок в runtime невозможна, а они в некоторых случаях дают сильный оверхед

13:53

.@svenyurgensson можно почитать про gradual typing в typed clojure и typed racket (ccs.neu.edu/racket/pubs/ec…)

13:53

# Четверг 96 твитов

@backendsecret @rubyunderhood вы используете какую-нибудь систему для хранения\структурирования знаний? (например, блокнот, майндмапы)
8:57

.@nick_jastix @backendsecret именно для хранения - к сожалению (или к счастью) - только мой мозг :)

8:58

.@nick_jastix @backendsecret для структурирования, обдумывания, планирования - блокнот с ручкой и whiteboard, если ты не один работаешь

8:59

github.com/docker-library… We recommend tini. It … does only the necessary parts of reaping and signal forwarding.

Ух ты.

9:12
@nick_jastix @backendsecret @rubyunderhood использую закрытую вики
9:20

@tomstuart: Well, this is a bit gross isn’t it. github.com/ruby/ruby/comm…” Wow! Hello, CoffeeScript!

10:56

Всем привет. Каких-то конкретных тем для обсуждения у меня на сегодня нет, поэтому принимаю предложения и вопросы.

10:58

Хотя нет, есть идея! За все время существования @rubyunderhood тут были ссылки только на 1 шаблонный гемфайл (от @rainrb).

11:09

Неужели больше никто не хочет показать свой начальный гемфайл или application template? Давайте, друзья, сделаем другим полезно!

11:09

Вот, например, мой дефолтный темплейт, который потихоньку дорабатывается уже больше 3х лет - gist.github.com/fxposter/9133b…

11:19
@rubyunderhood rails new APP_NAME -d postgresql --skip-sprockets --skip-javascript --skip-turbolinks --skip-test-unit --skip-spring
13:01

.@vassilevsky а гемы потом всегда ручками? :(

13:01

.@mr_The да, есть такое. честно говоря - никогда не юзал. а какие комбинации используешь?

13:04

.@vassilevsky а тесты? :)

13:05
@rubyunderhood да. Только то, что необходимо.

Фавориты: unicorn, config, bcrypt, multi_json, jbuilder, httparty, annotate, airbrussh.

13:05

А кто какие апп сервера сейчас использует и почему? Вот я вижу два человека юзают пуму и юникорн - а почему не passenger, например?

13:45

Thin уже полумертвый похоже :(

13:46
@rubyunderhood юзаем пуму, пассенджер и thin. На разных проектах, ессно :)
13:48

.@aablayev а зачем такой зоопарк?

13:48
@rubyunderhood пассажир и юникор слишком медленные и слишом много кушают ресурсов. Поэтому пума.
13:48

.@mr_The ну если не считать многопоточности пумы - то они все будут примерно одинаковые, по идее. плюс-минус.

13:50
@rubyunderhood puma конечно же, самая быстрая + памяти есть мало. passenger юзал раньше, но при большом кол-ве воркеров он жрет всю RAM :(
13:50

А кто-то вообще когда-то с многопоточностью в руби работал? Если да - чем именно занимались.

13:50

.@bytecheg плюс пассажира - если задеплоено несколько приложений на сервере - он автоматом умеет между ними распределять ресурсы.

13:51

.@bytecheg для кого-то это может быть минусом :)

13:51
@rubyunderhood В основном - пума. Пассенжер - на одном проекте "для посмотреть". Thin - на двух ради websocket-rails.
13:56

.@aablayev эммм, а как websocket-rails вообще работает? Любой task.save, Task.create в итоге повесит весь eventloop.

13:57
@rubyunderhood на одном из проектов бенчмаркал - пума немного выигрывала у юникорна по рпм и сильно выигрывала по потребляемым ресурсам.
13:57

.@mr_The ты сравнивал потоки с процессами или все-таки форкающуюся пуму с threads 1,1?

13:57
@rubyunderhood у меня одно приложение, это не актуально :) + я юзал 4ый пассажир, в 5ом может все стало значительно лучше :)
13:58
@rubyunderhood планируется перетаскивание RoR проекта на амазон. Есть какие-то подводные камни? есть ли смысл отказываться от passenger?
13:59

.@railsme из датацентра или с хероку/другого PAAS?

13:59
@rubyunderhood В одном проекте юзаем passenger, но в основном везде unicorn.
13:59

.@scaint а почему не "рекоммендуемую" пуму?

13:59
@rubyunderhood @aablayev если не ошибаюсь на EM, тоже использую Thin когда надо SSE (особенно в связке с Sinatra) или WS
14:01

.@ajieks @aablayev не совсем понял ответ. но любая AR операция связанная с бд повесит eventloop.

14:01
@rubyunderhood @mr_The а смысл сравнивать c threads 1,1 ? :) имхо бенчмарки проводить надо так же, как в бою. а плюсы пумы как раз в тредах
14:02

.@bytecheg @mr_The для чистоты эксперимента. в бою 16 тредов могут большую часть времени простаивать, рендеринг часто - это >50% запроса

14:03
@rubyunderhood @ajieks в бд нет обращений. просто получить массив объектов на вход и потоками гадить в апи.
14:05

.@aablayev @ajieks а зачем потоками, если есть EM уже?)

14:05
@rubyunderhood дц. вот именно и вопрос назрел, размещать на инстанс или Elastic Beanstalk?
14:08

.@railsme с EB у меня опыта нет. Но я так понимаю, что это тот же EC2, только с предустановленными вещами для определенного env-а.

14:09

.@railsme вообще смотря на какие инстансы деплоить - там может быть медленный IO.

14:10

.@railsme и учтите, что амазон не отвечает за то, что ваши инстансы вдруг перестанут отвечать на ВСЕ, правда такое очень давно у нас было.

14:11

.@railsme если есть люди знакомые с шефом - у амазона есть aws.amazon.com/opsworks/

14:13
@rubyunderhood @aablayev в этом плане да, тут согласен. Но если используется Thin, то нужно отдавать себе отчет о возможных проблемах...
14:13
@rubyunderhood кстати, спроси у ленты: кто-то вообще использует турболинки? Кого не спрошу - все говорят, что первым делом их отключают.
14:13

.@mr_The я всегда отключаю!

14:13
@rubyunderhood @aablayev AR выкидываем и работаем напрямую, гугланул github.com/royaltm/ruby-e… , можно локов избежать.
14:13

.@ajieks @aablayev можно, но с коллбеками намучаешься :)

14:14
@rubyunderhood @railsme там Load Balancer, cli тулза, скрипты которые ранятса при старте, контроль задеплоиных версий и еще кучу плюшек.
14:14
@rubyunderhood chef рубисту не помеха 😸
14:14

.@mr_The по-моему турболинкс нравятся только DHH, но все стесняются ему об этом сказать

14:15

.@railsme @ajieks нужно понимать просто что AWS сам по себе недешевый, если тебе не нужно много машин, которые ты будешь автоскейлить

14:16

.@railsme @ajieks а так там набор сервисов очень большой - ELB, RDB, S3, очереди, opsworks, тот же скейлинг

14:17
@rubyunderhood @mr_The паттерсон не постеснялся назвать его Turbo Lynx 🙀
14:18
@rubyunderhood @railsme это все понятно, последнее время часто работаю с azure, функционал эквивалентный в целом с AWS, но под другим соусом
14:19

.@ajieks @railsme они все стремятся примерно к одному и тому же функционалу. Google Cloud Platform туда же.

14:20
@rubyunderhood @railsme @ajieks Automatic Load-based Scaling очень крутая штука, недо держать поднятыми все время кучу инстансов
14:20

А Joyent Triton кто-то в реальности пробовал может? Очень интересно - как оно.

14:21

После такого потока ответов могу сказать, что GIL рубистам не помеха!

14:34
@rubyunderhood в общем, продублирую свой рельсовый gist.github.com/Ptico/cd61a062…
15:07

.@ptico ассеты совсем отдельно?

15:07
@rubyunderhood да, gulp, autoprefixer, babel, csso, uglify и пр. удобней напрямую юзать
18:34
Господа и дамы в @rubyunderhood, @backendsecret, @jsunderhood, если жена спросила "Научи меня программированию, хочу как ты". Что делать? RT
18:36

.@gruz0 @backendsecret @jsunderhood поставить себе цель сделать что-то простое. посадить рядом программиста, пусть подсказывает что делать…

18:37
По запросам читателей - мой (неполный) список рекомендованной литературы для программистов:

@gruz0 @backendsecret @jsunderhood но не прямо, а намеками, по чуть-чуть. Параллельно список литературы - twitter.com/rubyunderhood/….

18:39

@gruz0 @backendsecret @jsunderhood но я перед этим учился в универе на программиста, так что об этом тоже можно задуматься ;)

18:39
@mr_The @rubyunderhood мы в гитлаб используем.
18:41
@rubyunderhood однозначно пума, мало ест и нету проблем с рестартом как у юникорна
18:41
@rubyunderhood раньше пассенжер, потом юникорн, сейчас пума
18:41

Окей, по пуме - вы юзаете треды, процессы или всегда и то и другое?

18:42

Планы на завтра - расскажу о rocker и как сделать ваши докер-образы чуточку меньше (примерно в 3 раза с 850-900mb до 250-300mb). Stay tuned.

18:43

Как всегда напоминаю, что вы можете предлагать темы и задавать вопросы :)

18:44
@rubyunderhood че почитать начинающим лента подскажет?
18:44
@gruz0 @backendsecret @jsunderhood но не прямо, а намеками, по чуть-чуть. Параллельно список литературы - twitter.com/rubyunderhood/….

.@kaliha вот буквально 10 минут назад было - twitter.com/rubyunderhood/…

18:45
@dzaporozhets @rubyunderhood @mr_The а у вас нет проблем, что иногда js не подгружается?
18:47

.@anton_davydov @dzaporozhets @mr_The о, это страшное слово - "иногда"! хуже только "а у меня работает"!

18:47

.@anton_davydov @dzaporozhets @mr_The Простите :)

18:47
@rubyunderhood ну вот там или по основам программирования или рельсы уже. А именно уйти в руби, не только для рельс но и для CLI например?
18:48

.@kaliha Я очень быстро привыкаю к языкам и их семантике, так что чисто по руби книг не читал. Многие советуют The Well-Grounded Rubyist.

18:49
@Semenov пик популярности Java пройден в 2005 году, но каждый год Java-девов все больше @mpak999 @dzaporozhets @anton_davydov @rubyunderhood
18:51

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov Ладно,на самом деле я не рассматриваю это как "был хайп,а теперь можно работать"

18:52

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov руби-экосистема была лично для меня местом где можно быстро выучить много нового

18:54

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov … и полезного на практике.

18:54

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov и многое из этого позже почерпнули другие языки - тот же PHP и Java.

18:55

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov сейчас этот "центр идей и прогресса" находится вне руби, лично мое ИМХО

18:56

.@listochkin @Semenov @mpak999 @dzaporozhets @anton_davydov И да, меня щас могут выгнать из @rubyunderhood :)

18:56
@rubyunderhood @listochkin @Semenov @dzaporozhets @anton_davydov вот я тоже подумал, зачем ты тогда здесь-то нужен?!
18:57

.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov призвать людей делать экосистему быстрее, лучше и доступнее. не только рубишную!

18:58

.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov а где я тут кого-то поливал? действия - я делаю доклады, организовываю митапы

19:02

.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov а мне еще нужно работать и уделять время жене :)

19:03

.@mpak999 @listochkin @Semenov @dzaporozhets @anton_davydov чем я, пожалуй, и займусь

19:05

# Пятница 55 твитов

@rubyunderhood Только passenger. Юникорн и пуму надо готовить и там меньше настроек и мониторинга. Для стартапов ок, для банка нет :)
8:30

.@knopkodav очень интересно. по ощущениям - наоборот. или вы юзаете платный и union station?

8:31
@rubyunderhood на данный момент - только puma. По ощущениям, ест меньше RAM. Но thin пока не пробовал.
8:31
@mr_The @rubyunderhood ок, я использую, но пока только на маленьких проектах. А какие альтернативы turbolinks, кроме pajax?
8:32

.@xvonabur @mr_The вопрос в том - нужны ли альтернативы вообще?

8:32
@rubyunderhood puma, иногда unicorn. в зависимости от типа проложения. у пумы с тредами бывают проблемки, но она удобнее в поддержке.
8:32

.@merqlove а поподробнее о "проблемках"?

8:32

.@xvonabur @mr_The на практике - если в приложении почти нет js - оно не помогает, а если его много - слишком часто мешает.

8:37

.@knopkodav так а чем лучше? zero time deploy как у юникорна/пумы нет. тредов как у пумы бесплатно нет.

8:54
@rubyunderhood твиттер слишком мал, но если коротко, то радует, что не надо писать кучу скриптов для запуска/деплоя/супервайзинга и т.п.
9:06

.@knopkodav для пумы будет 1 простой systemd файл :)

9:07
@rubyunderhood да, но разница между нами — вы мыслите как программист, а я мыслю как избежать программирования
9:12

.@knopkodav я считаю, что если есть возможность контролировать что-то кодом, который юзают миллионы человек - то лучше делать это.

9:12

.@knopkodav чем юзать самописный, местами крешащийся, код пассажира :)

9:13
@rubyunderhood используете ли для коммуникации Telegram? Сегодня натолкнулся на integram.org занятный сервис.
10:21

.@ajieks у нас платформы менялись примерно так - hangouts -> skype -> hipchat -> hipchat + telegram, другие комманды еще slack юзают.

10:22

Итак, как вчера и обещал - рассказываю про rocker.

13:04

Рокер - это такая надстройка на docker cli, которая умеет парсить рокерфайлы - github.com/grammarly/rock…

13:05

Рокерфайл - это, в свою очередь, такой докерфайл с расширенным синтаксисом - github.com/grammarly/rock…

13:06

Заранее хочу сказать, что к разработчикам (@Grammarly) я не имею никакого отношения, просто вещь действительно удобная.

13:07

Так вот, сегодня мы займемся уменьшением размеров ваших рубишных образов и для этого мы будем использовать команды EXPORT и IMPORT

13:08

Зачем вообще уменьшать размер докер образов, учитывая, что они layered и базовые образы вы скачиваете реально только один раз?

13:09

Ну во первых - ради интереса, делают же на rust (mainisusuallyafunction.blogspot.com/2015/01/151-by…) и nim (hookrace.net/blog/nim-binar…) "минимальные" бинарники

13:11

Во вторых - если серверов много, то качать в первый раз все равно приходится немало - образ ruby:2.2.3 весит 718MB на текущий момент

13:13

Ну и в третьих - зачем вообще с собой таскать ненужное?

13:14

Принцип ужатия докер-образов для руби очень простой - избавится от лишних нативных библиотек и их хедеров/etc…

13:15

…и избавиться от гемов, которые вам в продакшене не нужны (как правило, это все то, что находится в :development и :test группах в гемфайле)

13:16

… в моем случае - это еще группа :assets, которую я "возвращаю" даже на rails 4 и выше.

13:17

Для таких лентяев, как я, ребята из докера сделали не только обычные образы с руби, но еще и их slim-версии (ruby:2.2.3-slim - 275.3MB).

13:19

Основная разница - slim базируется на голом образе debian:jessie (github.com/docker-library…), а обычная версия - на buildpack-debs:jessie…

13:21

github.com/docker-library…. Второй образ включает в себя кучу dev-версий различных библиотек.

13:22

Основная проблема заключается в том, что использовать slim просто так сложно, т.к. ни nokogiri, ни даже json гем вы туда не поставите

13:22

… т.к. не найдете нативных библиотек, которые им нужны (и их хедеров).

13:23

И тут на помощь приходит rockerfile с несколькими FROM-ами (github.com/grammarly/rock…) и IMPORT/EXPORT доступными между несколькими образами

13:24
github.com/fxposter/s6-ng… на текущий момент я деплою рельсы в докере примерно вот так

Разберем, как это делается на моем же примере с s6/nginx/docker (twitter.com/rubyunderhood/…): github.com/fxposter/s6-ng…

13:26

Сначала мы используем дефолтный образ руби, устанавливаем только гемы, нужные для продакшена и экспортируем их - github.com/fxposter/s6-ng…

13:27

После этого нам нужно удалить конфиги бандлера и установить гемы заново, только теперь вместе с группой :assets - github.com/fxposter/s6-ng…

13:28

Затем мы прекомпилируем ассеты и также экспортируем их: github.com/fxposter/s6-ng…

13:29

К этому моменту мы имеем 2 директории в экспорте - ассеты и установленные гемы со скомпиленными экстеншенами.

13:30

Начинаем билдить конечный продакшен образ из ruby:slim - github.com/fxposter/s6-ng…

13:30

Повторяем все то, что есть в стандартном Dockerfile (устанавливаем nginx и s6) - github.com/fxposter/s6-ng…

13:31

Импортируем гемы, которые мы экспортировали на предыдущем шаге (и на всякий случай делаем bundle install) - github.com/fxposter/s6-ng…

13:32

Прогоняем хитрую, но очень полезную команду - github.com/fxposter/s6-ng…

13:33

Если вы в приложении используете mysql и вы попытаетесь с этим файлом сбилдить приложение, то вы получите ошибку - gist.github.com/fxposter/78a08…

13:34

Она означает, что некоторые экстеншены, которые были скомпилированы в первом шаге, зависят от некоторых библиотек динамически.

13:35

В моем случае это libmysqlclient.so.18 и для того, чтобы мой образ реально был рабочим мне нужно будет установить эту библиотеку

13:36

Это можно сделать примерно так - github.com/fxposter/s6-ng…

13:36

В общем - эта команда гарантирует, что у вас не будет ситуации, что какой-то гем был динамически слинкован с библиотекой, которой в slim нет

13:38

Ассеты тоже импортируем - github.com/fxposter/s6-ng…

13:39

Ну и напоследок - опционально тегируем полученный образ, т.к. rocker build на текущий момент не поддеживает опцию -t при билде

13:40

В итоге: на довольно простом приложении получаем уменьшение размера образа более чем в 2 раза: 852.9MB -> 357.4MB.

13:41

Как можно еще уменьшить размер: удалять кеши бандлера и рубигемов, переехать с стандартного дебиана на какой-нибудь Alpine Linux или busybox

13:43

Меня же и то что получается в итоге вполне устраивает. :)

13:44

Все ссылки на Rockerfile валидны для этого коммита github.com/fxposter/s6-ng…. Спасибо, @listochkin

14:07
@rubyunderhood В старых версиях частенько встречались фэйлы, особенно с хот релоад. + не любое сочетание треды:воркеры работает и сейчас.
17:12

# Суббота 32 твита

Да ладно, сварю я сам себе ужин… :: pic.twitter.com/CDVwRPe8fu
8:50

Веб девелоперам - если ваш запрос на сервере выполняется 10сек, вы дернули апишку и через 1ске сделали ctrl-с - что произойдет на сервере?:)

10:47

Еще задачка - у вас есть POST /posts, который создает посты. Обычно он отвечает за 1сек, ваш клиентский таймаут 10сек.

12:57

… что вы можете сказать о стейте сервера (ну и бд) после того, как у вас все же отвалился запрос по таймауту?

12:58
@rubyunderhood Запрос будет крутиться дальше, если конечно не отслеживать состояние клиентского сокета.
14:04

.@scaint Правильно, к сожалению многие программисты этого не знают и не понимают :(

14:44
@rubyunderhood @scaint а знание и понимание предполагает какую-то обработку таких кейсов?
16:21

.@killthekitten @scaint помогает пониманию того, что у тебя на продакшене происходит

16:21

.@pzskc383 @fxposter очень безопасно :)

18:49
@rubyunderhood что за "эти вещи", которые важны?

*не придираюсь, просто, кажется, ты рассуждаешь в контексте своих проблем, не очевидно*

18:49

.@killthekitten если ты делаешь ajax-запрос и он таймаутится - то ты НЕ МОЖЕШЬ сказать юзеру, что "все плохо, но попытайся заново"

18:50

.@killthekitten более того - ты не можешь автоматически повторять запрос в надежде, что он сработает :)

18:51

.@killthekitten аналогично, если ты с сервера обращаешься к внешнему сервису и вылетаешь по таймауту-ты должен явно прокинуть таймаут дальше

18:52

.@killthekitten иначе есть вероятность, что ты потом будешь делать такой же запрос потом, а сервис будет уже в неконсистентном состоянии

18:53

.@killthekitten а еще нужно понимать, что если вы делаете запрос - то "плохие ситуации" могут включать в себя:

18:54

.@killthekitten запрос

18:55

.@killthekitten и с "клиента" ты не сможешь определить что случилось :)

18:56
… что вы можете сказать о стейте сервера (ну и бд) после того, как у вас все же отвалился запрос по таймауту?

.@killthekitten именно поэтому правильный ответ на twitter.com/rubyunderhood/… - "ничего, пока сервер заново не станет отвечать" :)

18:57
@rubyunderhood а как предложишь обрабатывать запросы к внешним сервисам, которые отправляются after_commit?
18:58

.@killthekitten если запросы, которые делаешь - не idempotent - молиться :) иначе - очередь с at least once delivery :)

18:59

Чуток про распределенные системы: the-paper-trail.org/blog/distribut…, dancres.github.io/Pages/ и christophermeiklejohn.com/distributed/sy… :)

19:03

Если вкратце - то любые запросы (tcp, http, …) могут не дойти:

19:04

В связи с этим стоит мыслить о любых ваших запросах куда-либо как о данных, передающихся по кабелю, который В ЛЮБОЙ МОМЕНТ могут перерезать

19:05

Аналогично - любому серверу, который обрабатывает запрос, может в ЛЮБОЙ момент выдернуть кабель питания

19:06

Вот в таком мире мы на самом деле живем :) и пытаемся строить над этим абстракции.

19:07

Разумеется, вы не будете везде и всегда пытаться обрабатывать ВСЕ плохие варианты развития событий…

19:09

… хотя иногда наверное это и стоит делать (например, когда от этого зависят жизни людей).

19:09

Но такое отношение к продакшену иногда очень помогает понять, ОТКУДА появились такие странные данные в бд, и КУДА делись логи запросов :)

19:10

blog.jruby.org/2015/10/perfor… @headius приготовил очередные улучшения производительности в @jruby 9.0.3.0!

19:41
@rubyunderhood есть ещё такие аспекты speakerdeck.com/sirupsen/euruk…
19:54

.@d1b ну это про hardware failures, которые локальные, не совсем по этой теме. Но слайды крутые, уверен доклад тоже был хороший.

19:54

# Воскресенье 5 твитов

vimeo.com/132194544 - о том, что вообще такое микросервисы, как мы к ним пришли и как их можно делать. Очень хороший доклад.

15:12
@rubyunderhood @headius @jruby ага, только рельсы на нем все равно медленнее в 2 раза, чем на MRI :(
15:16
@bytecheg @rubyunderhood @jruby I don't think that is strictly true. ActiveRecord may be slower but apps using Sequel and Rails are fast.
15:16

Подходит к концу моя неделя на @rubyunderhood. С вами был @fxposter. Если у вас остались вопросы - пишите туда. Всем спасибо! :)

18:48

Напоследок немножко рекламы - мы проводим в Днепропетровске митапы по самым разным технологиям - приходите! meetup.com/Wix-Ukraine-Me…

18:50

github.com

gist.github.com

other