fxposter

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

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

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

11:08

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

11:08

Пишу на руби уже около 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

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

11:30

Так вот, через всю книгу там проходит идея процесса "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

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

12:11

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

12:12

Вообще работа в большой 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:49

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

13:15

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

13:16

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

15:16

BTW, если кто еще не смотрел - видео со 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

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

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

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

16:02

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

16:02

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

16:03

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

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

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

17:18

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

17:20
@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 от ThoughtBot
20:19

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

20:24

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

20:24

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

20:24

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

20:24

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

20:24

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

20:25

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

20:25

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

20:25

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

20:25

3. The RSpec Book

20:25

4. Rails Test Prescriptions

20:25

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

20:26

6. Continuous Testing

20:26

7. 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

21:06
@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:07

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

9:31

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

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

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

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

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

14:49

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

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:09

12factor.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:34

github.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

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

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

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

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

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

20:11

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

20:21
StrangeLoop 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

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

9:38

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

9:43

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

9:44

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

9:46

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

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

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

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

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

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

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

16:20

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

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

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

16:22

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

16:23

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

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

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

16:35

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

16:36

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

16:39
@rubyunderhood фактически если рубя сейчас резко загнётся то собсно того что уже есть с головой хватает :) @mpak999
16: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:59

github.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-spring
16:01

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

16:01

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

16:04

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

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

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

16:05

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

16:45

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

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

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

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

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

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

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

16:50

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

16:51

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

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

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

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

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

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

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

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

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

16:59
@rubyunderhood @aablayev если не ошибаюсь на EM, тоже использую Thin когда надо SSE (особенно в связке с Sinatra) или WS
17: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

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

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

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

17:09

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

17:10

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

17:11

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

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

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

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

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

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

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

17:15

.@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

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

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

.@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

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

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

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

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:24
github.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/CDVwRPe8fu
11:50

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

13:47

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

15:57

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

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

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

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

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

19:21

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

21:49
@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:10

blog.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

gist.github.com

other