Fork me on GitHub
#clojure-russia
<
2016-02-15
>
artemyarulin06:02:22

@prepor: Да ну брось давай - под реплом я имею ввиду возможность выбрать любой s-exp и его заэвалить, это тока лиспы умееют. Всякие swift playground это интересно на поиграться, никто 100% кода в нем не пишет, а отличии от той же кложуры где я неделями из репл сессии не выхожу. @abtv: Да у нас мало чо рассказывать, я собрал докер - они выложили. Меня вон тут зачморили в прошлый раз что это даже не девопс simple_smile

abtv06:02:47

Думаю, чем проще - тем лучше, а как назвать - дело второе.

abtv06:02:10

А у тебя образ докера пересобирается триггером на git push и после тестирования на CI? @artemyarulin

artemyarulin07:02:06

@abtv: у нас все на Buck, поэтому микросервис выглядит вот так:

clj_module(name = 'brand',
           src = 'server.clj',
           main = 'unity.brand.server',
           tests = 'server_test.clj',
           deps = '[org.clojure/data.json "0.2.6"]',
           modules = ['//lib/io/http/aleph:server',
                      '//lib/io/http/aleph:client',
                      '//lib/service/ad/brand/ssp:thirdpresense',
                      '//lib/iokov:iokov'])

docker(name = 'brand',
       src = ['$(location :brand_release)'],
       image_id_cmd = 'echo -n “:" && git log --format="%H" -n 1')
если изменится исходники сервиса или исходники любой зависимостей - то Buck пересоберет сервис на CI машине и соберет Docker контейнер с ID = текущему комиту. Далее скрипт на 2 строчи смотрит все докер контейнеры тока-что собранные и деплоит уже на стейджинг/прод

artemyarulin07:02:18

а ну тесты конечно да. Весь сприпт CI на баке по сути buck build “//…” && buck test “//…. && deploy.sh”, типа найти все таргеты и забилди и протести и задеплой чо обновилось

abtv07:02:02

А почему в src только один файл, а не каталог и в тестах тоже? Он не из project.clj собирает? @artemyarulin

artemyarulin07:02:02

в этом и идея - модуль это как минимум один сорс файл плюс опционально тест + опционально зависимости от других модулей. Все лежит рядом, ничего лишнего, project.clj генерится уже сам при запуске тестов

artemyarulin07:02:33

чтобы создать новую либу/сервис - мне нужно echo clj_module(‘example’) > BUCK && echo “(ns company.example)” > example.clj

niquola07:02:02

@abtv давайте попробуем

niquola07:02:32

@prepor много где - громковато сказано ;)

niquola07:02:55

Сегодня? Я попробую - я тут в Будапеште оказался ;)

niquola07:02:18

Давайте тему выбирать или героя ;)

abtv07:02:26

Артём, ты много про Buck постил в Твиттер, я за этим следил simple_smile может расскажешь подробнее на митапе что это и почему это удобно? Ну и про грабли там, может какие. @artemyarulin

a.espolov07:02:49

я правильно понимаю, что Вы коллеги поголовно юзаете docker?

rm07:02:44

мы юзаем обычные виртуалки и дженкинс

rm07:02:55

а еще у нас есть свой админ и я ничего в этом не понимаю

abtv07:02:28

У меня пока нет докера

artemyarulin07:02:33

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

a.espolov08:02:54

ваще без палева докер разворачивать на проде?

prepor09:02:13

> @prepor много где - громковато сказано 😉 ну негромко. из популярных и актуальных это агда, галина, фстар, идрис, еще десяток. просто они из академической среды не выходят, о чем и речь

prepor09:02:01

> Да ну брось давай - под реплом я имею ввиду возможность выбрать любой s-exp и его заэвалить, это тока лиспы умееют. Всякие swift playground это интересно на поиграться, никто 100% кода в нем не пишет, а отличии от той же кложуры где я неделями из репл сессии не выхожу. "взять любой сексп" и "писать 100 процентов кода" это немного разные вещи. в окамлике можно загрузить в репл текущий проект и дернуть любую его часть. как и написать его полностью в репле никто не мешает.

artemyarulin09:02:26

@prepor: Хм, надо посмотреть этот окамл. Скептически отношусь к нему, но надо самому посмотреть

artemyarulin09:02:15

http://blog.acolyer.org/2016/02/05/is-sound-gradual-typing-dead/

The short version is that the authors conducted a series of performance tests as they gradually changed programs from fully untyped to fully typed. What they found is that gradual typing introduces very high overheads, and that it’s hard for maintenance programmers to predict what the performance impact of gradual typing will be (e.g. in some cases, performance degraded by over 100x). All experiments were run on TypedRacket, so we have to distinguish between the characteristics of this one implementation vs. the idea of gradual typing in general, but even so the work throws up some serious questions for research into practical gradual typing to address
эх

be910:02:31

не очень понятно, в каких случаях при добавлении информации о типах производительность падает в 100 раз

artemyarulin10:02:54

дак это gradual typing - который на границе с другим языком (как я понимаю в рантайме работает)

be910:02:32

> Gradual type systems allow programmers to add type information to software systems in dynamically typed languages on an incremental basis. … The gradual-typing thesis states that a maintenance programmer ought to be able to augment an existing untyped code base with types in order to benefit from their software engineering advantages, and to ensure that future programmers will continue to receive those benefits.

be910:02:55

ну т.е. берём и потихоньку добавляем инфу о типах. вот и интересно, в каких ситуациях возникнет 100-кратное торможение

dottedmag10:02:30

Добавляем информацию о типах и включаем runtime-проверку инвариантов. Внезапно, производительность падает.

dottedmag10:02:39

Какой глубокий вывод.

be910:02:55

ну не в 100 раз же simple_smile

dottedmag10:02:14

Если добавить тип в функцию, которая вызывается из внутреннего цикла, то вообще ужас будет.

be910:02:18

хотя как написать инвариант...

dottedmag10:02:25

Хотя как типы расставлять.

dottedmag10:02:11

Ясен пень, типы надо вешать от интерфейса внутрь реализации, чтобы валидация была минимальной.

dottedmag10:02:28

А если потроха оттипизировать, да ещё кусками, а не все, то, конечно, оверхед будет жуткий.

prepor10:02:26

нужно прочитать полностью, но по паре абзацев это бред

abtv10:02:41

Ну так что насчёт сегодня собраться и пообщаться? Есть кто-нибудь, кто готов про деплой рассказать или ещё что-нибудь интересное? Артем подготовит доклад в другой раз, так что нужен спикер, кто хочет?))

prepor10:02:06

Gradual typing как он есть в тайпед рекете или коре тайпед НИЧЕГО не добавляет в рантайм, т.е. каких либо изменений в скорости работы скомпилированной программы вообще быть не может

dottedmag10:02:50

"Typed Racket checks all functions and other values that pass from a typed module to untyped module or vice versa with contracts."

fxposter10:02:45

@prepor: я был на ECOOP в прошлом году, там как раз была презентация о typed racket и о его оверхедах в OO-ориентированных программах

fxposter10:02:32

самые плохие случаи - это регулярные коллы из typed в untyped и обратно

dottedmag10:02:32

Можно взять массив из миллиона элементов и гонять его из типизированного кода в нетипизированный и обратно. Каждый вызов будет тормозить =)

fxposter10:02:28

т.е. если у тебя какой-нибудь typed reduce, который внутри в коллбеке вызывает untyped step function

fxposter10:02:24

а для того чтобы поддерживать инварианты при работе с обьектами нужно не только “чеки” делать, но и враппить обьекты, чтобы гарантировать, что они обеспечивают нужные протоколы

fxposter10:02:59

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

dottedmag11:02:13

@fxposter: А это как?

prepor11:02:59

ага, в тайпед рекете оверхед есть ТОЛЬКО при взаимодействии typed и untyped

dottedmag11:02:06

"First-class classes", ахаха.

fxposter11:02:58

As mentioned in section 2.1, Typed Racket compiles types for module exports and imports into Racket’s contracts so that untyped modules cannot violate the type invariants. For plain values, a contract just checks that the value conforms to the type. For higher-order values, e.g., objects and classes, the contract system wraps the value with a proxy value—called chaperones [45] in Racket—that interposes on all accesses and method calls

fxposter11:02:03

вкратце

dottedmag11:02:27

@fxposter: Мне интересно, где эти тысячи врапперов на одном объекте появляются.

fxposter11:02:27

(typed-reduce (fn [acc e] (some-untyped-call acc e)) typed-initial long-list-of-typed-values)

dottedmag11:02:56

@fxposter: Это проверка на каждом вызове, про неё всё понятно.

fxposter11:02:59

some-untyped-call возвращает нечто непонятного типа, что нужно враппить, чтобы инварианты оставались

dottedmag11:02:37

А! Т.е. в (some-untyped-call) обёртка не снимается, а по покиданию её добавляется ещё одна.

fxposter11:02:46

увы 😞

artemyarulin11:02:40

> ТОЛЬКО при взаимодействии typed и untyped дак в этом как раз смысл этой работы - что если будешь добавлять типы постепенно то по началу будет все лагать. Но чем дальше и чем больше типов укажешь - тем быстрее будет работать.

be911:02:41

круто

be911:02:07

@artemyarulin: если только оно не начнёт лагать ТАК, что выкинешь всё нафиг 😄

be911:02:29

момент абстиненции нужно пройти

artemyarulin11:02:10

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

artemyarulin11:02:14

на hacker news автор Typed Racket сказал что об этом в курсе, многое можно пофиксить и ускорить чтоб хоть не в 100 раз было, но медленней будет в любом случае

be911:02:46

как я понял, добавление информации о типах — это не путь к статическому связыванию (которое быстрее динамического). это путь в свою сторону, где становится безопаснее, но медленнее

artemyarulin11:02:34

т.е. грубо говоря я могу добиться того же самого через (defn f [in] {:pre (func? in)} …) ?

be911:02:44

похоже, что так

dottedmag11:02:31

@be9: Неправда.

dottedmag11:02:54

@be9: Проблема только на стыке

artemyarulin11:02:24

@dottedmag: Ничо не понял. Этот gradual typing он все таки runtime или compile time?

be911:02:25

мы говорим сейчас о typed racket?

dottedmag11:02:45

runtime на стыке, compile time внутри типизированного кода

dottedmag11:02:35

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

artemyarulin11:02:51

а как надо?

dottedmag11:02:42

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

artemyarulin11:02:13

и тогда будет все пучком? К core.typed это относится или там другое пока?

dottedmag11:02:14

Самая главная задача -- не допускать передачи большого количества данных в направлении untyped->typed, и это вполне себе читается из кода.

dottedmag11:02:30

Это про Typed Racket. Сейчас освежу про core.typed.

artemyarulin11:02:39

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

dottedmag11:02:07

Есть места, где эта информация очевидно полезна и не вредна.

dottedmag11:02:22

Например, разнообразные фасады.

dottedmag11:02:27

Или API библиотек.

dottedmag11:02:40

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

fxposter11:02:21

> как я понял, добавление информации о типах — это не путь к статическому связыванию (которое быстрее динамического). это путь в свою сторону, где становится безопаснее, но медленнее @be9: оно не медленнее. оно может быть быстрее (если будет поддержка рантайма, или компилятор сможет оптимизировать и сгенерировать лучший код), но в целом будет примерно так же

fxposter11:02:34

т.е. это как сделать ВСЕ в core.typed

fxposter11:02:40

оно не будет медленнее

fxposter11:02:42

оно будет так же

dottedmag11:02:46

@artemyarulin: Всё просто: когда добавляешь тип, то можно себе представить так, что добавляешь внутрь функции assert на инвариант.

artemyarulin11:02:08

@dottedmag: А как тебе вообще TypedRacket? Используешь часто по сравнению с обычным Racket? Дает профит это?

dottedmag11:02:25

И тогда понятнее становится: "ага, я только что добавил assert, который считает NP-полную задачу, и я вызываю его 1mln раз в секунду. Что-то не то"

dottedmag11:02:05

@artemyarulin: Выглядит приятненько, но я на racket практически не писал.

artemyarulin11:02:02

хм, ну ок. Будем надеятся допилят gradual typing для clojure когда-нить

artemyarulin11:02:27

или уже допилили, я чота не понял статус когда смотрел в репо

prepor12:02:07

> В core.typed, как я вижу, врапперы применяются в обе стороны, так что там нужно избегать передачи большого количества данных в обе стороны. где ты это видишь?

prepor12:02:41

хотя наверное ты прав, на границах вставляются ассерты

prepor12:02:00

или это просто планы, а работает оно сейчас не так )

prepor12:02:53

во, нашел )

prepor12:02:59

собственно папира

prepor12:02:04

33 страница

prepor12:02:09

Along with a full static type system, Typed Racket also uses runtime contracts to enforce type invariants at runtime at the interface with untyped code [THF08]. Utilising runtime contracts to aid type checking is outside the scope of this project, but would be considered desirable and accessible future work.

prepor12:02:39

так что это планы и мечты, в рантайм коре.тайпед ничего не добавляет )

dottedmag14:02:53

Так это 2012

prepor15:02:45

и в 2013/14/15 что-то поменялось? покажи линк плз

prepor15:02:50

а может и поменялось!

prepor15:02:06

никакого описания блин, долько по коду и лазить )

dottedmag16:02:07

Надо код читать, да :)

dottedmag16:02:37

Вот свежая бумажка, написанная по результатам собирания бабла: http://frenchy64.github.io/papers/submitted-popl16-typed-clojure-draft.pdf

dottedmag16:02:53

5.2, "Typed-untyped interoperation". Ничего там не вставляется.

prepor17:02:37

ну у них там в коммитах есть всякое вроде по теме

prepor17:02:59

но я хз вообще, а разобраться во всем этом надо иметь веское основание )

fxposter19:02:13

а тут кто-то core.typed реально юзает в проектах?

prepor19:02:09

мы тут видишь даже не можем разобраться что оно делает!

rmuslimov19:02:18

Коллеги, у нас тут разгорелась дискуссия, про то как сложно нанимать сотрудников на новую технологию (в данном случае тот же clojurescript). Собственно две позиции: A. Технология новая, пул разработчиков маленький, вопросов на стаковерлоу мало - вообщем все плохо и не стоит B. Напротив, так как технология новая - увлеченных ею специалистов больше чем вакансий, и собственно нужно топить Какую позицию заняли бы Вы? Как product manager, человек который практически смотрит на вещи с двумя целями - донести продукт, и иметь здоровую сильную команду, способную развивать продукт. Извините, если это разожжет холивар. Спасибо!

Kira Sotnikov19:02:52

rmuslimov: я бы отталкивался от самого проекта

Kira Sotnikov19:02:17

и вообще искал бы людей не на конкретную технологию, а ребят способных быстро освоиться

rmuslimov19:02:03

технология она как религия - ее не так часто хотят люди менять

Kira Sotnikov19:02:43

ну это зависит уже от конкретного человека

Kira Sotnikov19:02:55

кому-то нравится каждый день делать одно и тоже, а кто-то не может сидеть на месте

Kira Sotnikov19:02:18

rmuslimov: но ты должен понимать, что тебе придется учить людей

rmuslimov19:02:21

а что касается проекта, то нет больших преимуществ для использования cljs вместо js - проект можно сделать на разных технологиях - получить примерно одно и то же

Kira Sotnikov19:02:31

у нас СТО проводит воркшопы и тд

Kira Sotnikov19:02:01

rmuslimov: ну например проект на сто к линий кода, и что-то менять в нем адская боль

Kira Sotnikov19:02:18

или наоборот, проект настолько простой, что все выкинуть и переписать займет выходные

Kira Sotnikov19:02:31

или архитектурно просто постепенно заменить все

rmuslimov19:02:13

спасибо за ответ, но собственно вопрос был в другом - как отвечать на вопрос - “не будет ли нам сложно нанимать людей если мы выберем cljs?”

Kira Sotnikov19:02:28

rmuslimov: если будете искать людей на технологию то будет сложно

Kira Sotnikov19:02:32

если особенно нет ремоута

Kira Sotnikov19:02:47

Мне тут недавно рассказали поучительную историю, как парень нанялся голанг программистом

Kira Sotnikov19:02:04

Если интересно то расскажу )

Kira Sotnikov19:02:07

а то многобукв

rmuslimov19:02:47

мне интересно услышать - может быть зашли гистом если уже совсем много букв

rmuslimov19:02:53

ну или так

Kira Sotnikov19:02:49

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

Kira Sotnikov19:02:19

тут короче если проблема с кадрами, то брать джавистов рубистов и учить их кложе

Kira Sotnikov19:02:27

иначе не взлетит мне кажется

rmuslimov19:02:51

так остался на джаве писать?

dottedmag19:02:28

@rmuslimov: Если задрать зарплату в полтора раза выше рынка и нанимать удалёнщиков, то не будет.

dottedmag19:02:27

Придётся попотеть, отсеивая шлак, зато в результате получится норм.

dottedmag19:02:12

Пойдём в #C0EA48FGA

rmuslimov19:02:38

да, я не заметил тот канал

rmuslimov19:02:50

перешли, спасибо

andre20:02:29

хенгаута не будет сегодня?

niquola20:02:15

У меня тут инет плохой, могу стартануть и выйду