Fork me on GitHub
#clojure-russia
<
2015-12-10
>
thickprogrammer00:12:12

ладно, уже не надо ) - пока нахаркодил так (String. (b64/encode (.bytes body)) "UTF-8")

kxepal02:12:53

> application/x-javascript зачем? он 10 лет как application/javascript

Ivan Fedorov07:12:36

artemyarulin: Да, точно. Этого я тоже не делал, не знал что так можно было, как говорится в анекдоте)) Спасибо большое.

prepor09:12:41

> т.е. это реально хаскель + лисп, прм как доктор прописал :)) artemyarulin: ну какой к черту хаскель, вы чего? )

artemyarulin09:12:09

стрелочки и ничего не понятно. Один в один прям с хаскелем simple_smile

larhat10:12:48

что-то, кстати, сходу не нашлось на лямбда-зе-ультимейт обсуждения шеня — интересно было б почитать яйцеголовых про sequent calculus и то как его в яп засунули

artemyarulin10:12:30

я много раз натыкался на этот лямбда-зе-ультимейт, но из-за такой верстки у меня глаза вытекают. Там стоящий контент?

larhat10:12:18

ну если интересует Prog Lang Theory и всякое рядом, то по-моему стоящий, и лента и форум. в последнее время мне кажется активность чуть уменьшилась, ну так везде такое — в твиторы и слаки переползают поди %)

artemyarulin10:12:15

ок, спасибо

turtle11:12:09

ognivo: я на подпроекты делю обычно.

turtle11:12:23

Кложурианцы, есть вопрос следующего характера.

turtle11:12:10

К примеру, есть либа А, которая ссылается на либу Б версии 1. И есть либа С, которая ссылается на либу Б версии 2. Либы Б по апи, скажем так, не сильно по апи совместимы и вообще, но неймспейсы у них одни.

turtle11:12:33

Так вот, как заюзать либу А и либу С, одновременно, не получив попаболь?

turtle11:12:40

Есть какое-нибудь решение для кложуры?

turtle11:12:35

Т.е. нужно загрузить две версии либы Б одновременно и параллельно.

artemyarulin11:12:42

подождать пару лет когда JVM станет поддерживать модули

turtle11:12:13

Ну так для jvm есть сейчас OSGi, которая эти проблемы решает.

artemyarulin11:12:15

оу уже? У меня знания jvm ограничены да

shinych11:12:44

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

shinych11:12:27

чувак из counterclockwise кое-как привернул кложу к osgi, но общей проблемы это не решит

turtle12:12:41

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

turtle12:12:49

В общем, нет ничего такого сейчас?

turtle12:12:53

Только это хотел узнать. simple_smile

shinych12:12:24

ну как устроены потроха кложи, это вообще никак не делается (и судя по тогдашней реакции rich вряд ли сделается)

prepor12:12:14

shinych: а при чем тут потроха кложи? у нее свой класслоадер, но никто же не мешает его не использовать, а сделать свой.

shinych12:12:48

boot pods это и делает, видимо?

shinych12:12:03

https://github.com/aav/clojure.osgi вот коллега Алексей пару лет назад кложу к osgi прикручивал

Kira Sotnikov12:12:59

turtle: взять сорцы либы, и седом поменять неймспейсы )

prepor12:12:33

shinych: вопрос в том зачем что-то прикручивать к osgi

prepor12:12:50

это ж невероятно тупая спека / реализация

turtle12:12:05

propan: посмотрел Pods. И не понял.

turtle12:12:18

lowl4tency: так не всегда есть такая возможность. simple_smile

turtle12:12:32

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

turtle12:12:04

prepor: тебе было, на самом деле. simple_smile В общем посмотрел бегло, вроде не то.

turtle12:12:30

Как бы туп OSGi ни был, но это пока единственно, что для явы есть в этом ключе.

prepor13:12:29

turtle: ок, давай формализуй требования. что делает OSGi, что не может pods / shimdandy?

prepor13:12:39

вообще на сколько я понимаю это задача не решается нормально, в том числе OSGi

prepor13:12:45

единственное реальное применени OSGi которое я видел это аппликейшен сервера, где сервер и приложения работают полностью с разными кодобазами со своими класслоадерами. turtle как ты OSGi решишь описанную тобой задачу?

turtle13:12:51

Так в OSGi же не иерархический класслоадер. И грузит он их независимо. Так и решу.

turtle13:12:03

Вообще, если писать не лень, это я и на обычной яве решу своим класслоадером.

turtle13:12:21

prepor: что делает pods я вообще сходу не понял.

prepor13:12:35

> Так в OSGi же не иерархический класслоадер. И грузит он их независимо. Так и решу. грузит он их независимо в разные бандлы. как при этом использовать либу А и С совместно?

prepor13:12:41

> Так в OSGi же не иерархический класслоадер а что это?

prepor13:12:53

> prepor: что делает pods я вообще сходу не понял. загружает жарки в изолированные окружения. как можно понять что делает этот интерпрайзный буллшит osgi и не понять эту страничку в вики? создаешь под "(make-pod {:dependencies [[foo/bar "1.2.3"]]})", потом дергаешь функции в скоупе этого пода: (.invoke pod ^String f args*)

wwall13:12:22

как заставить сделать gc систему? работаю в емаксе, к сложуре цепляюсь через cider и где-то через два-три часа начинает подтормаживать все. Выходить и снова заходить уже задолбало

wwall13:12:36

может есть какое заклинание?

prepor13:12:27

wwall: лучше подключись к своему реплу jmc и посмотри что там происходит. там и кнопка gc будет

wwall13:12:18

jmc - это что?

shinych13:12:13

OSGi это костыль, да и толком он эту проблему не решает, да (ключевое слово package uses conflict)

shinych13:12:34

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

niquola13:12:35

Пропатчить отставшего! Osgi жуть еклипсовская.

niquola13:12:16

Она им нужна была чтобы плагины на горячее загружать.

prepor13:12:24

wwall: прога такая. думаю тебе просто нужно набрать jmc в терминале )

wwall13:12:54

я под виндой

shinych13:12:27

@nicola что толком всё равно не работает и не применяется - эклипс сам рекомендует рестарт после каждого апдейта. а оверхед на эту херь немыслимый. вот в идее чуваки правильно не стали этим заморачиваться

vadim-tt13:12:57

профайлинг для джавы - Java Mission Control (JMC) http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jmc.html

shinych13:12:29

osgi это кормушка для всяких там энтрерпрайз архитекторов “наконец-то мы можем контроллировать беду с версиями в java”, ага simple_smile

shinych13:12:02

правда там есть нормальная концепция subsystems

prepor14:12:15

wwall: ололо. и под виндой нет jmc?

vadim-tt14:12:51

есть конечно и под виндой

wwall14:12:54

нарыл. просто не туда смотрел. перепутал машинки

turtle14:12:22

prepor: значит, страничка в вики так представлена. simple_smile Смотрятся многообещающие твои примеры. Нужно будет попробовать.

turtle14:12:48

Под osgi так же и сделаю, если либа уже OSGi, она загрузит депенденсю к себе только.

turtle14:12:04

Если же не OSGi, будет сложнее, да. Нужно будет ещё оборачивалку писать.

aav14:12:17

ну, не стоит забывать что osgi - это не только про загрузку классов, но еще и сервисная модель

aav14:12:27

у меня сейчас в одном из проектов порядка пары сотен бандлов, в зависимости от “версии” продукта по разному деплоящихся. с механизмом “патчей и кастомизацей” для отдельных инсталляций/клиентов. но чтобы это прилично работало - требуется довольно много дисциплины и усилий.

turtle15:12:22

Вот почему-то в этой сервисной модели обязательно получится пара сотен бандлов. simple_smile

invizz15:12:14

Cursive зарелизился)

turtle15:12:46

Что-то знакомое. Это не плагин к эклипсу?

invizz15:12:42

к IntelliJ Idea

abtv16:12:31

Они его хотят еще и как отдельную IDE выпустить на базе Idea. Думаю так проще продвигать, поскольку плагин платный.

chort40916:12:29

@abtv: его довольно долго пилил один человек, не имеющий никакого отношения к Idea. сам плагин весьма хорош. Разрабатываю только под ним

razum2um18:12:16

shinych: turtle: объясните на пальцах что делает osgi (т.е. чтото с класслоадерами, но что) и причем тут то, что кложура статическая?

shinych18:12:03

в osgi у каждого джара (bundle) в системе есть свой класслоадер, который по манифесту бандла знает, откуда (из каких других бандлов) грузить зависимости, вот в принципе и вся наука. на второй вопрос квалифицированно @aav ответить может

niquola18:12:12

@razum2um: OSGI появился в недрах проекта eclipse как механизм горячей подгрузки и выгрузки плагинов. В java под каждый classloader создается свое относительно изолированное пространство (точнее там получается иерархия http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html) - по сути возможность хостить на jvm несколько приложений, вгружать их и выгружать - и даже гарантировать их определенную безопасность и изолированность.

razum2um18:12:31

@nicola: ну вот эту совсем базу я представляю, я спрашивал больше о механике (как оно работает) и что мешает “притащить"

niquola18:12:38

все построенно как раз на возможности определить свой classloader и загрузить модуль через него

niquola18:12:12

классы порожденные определенным classloader - за остальными обращаются в начале к нему

niquola18:12:40

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

niquola18:12:53

и подсунуть тебе другую версию библиотеки

razum2um18:12:50

угу, но это все еще не то simple_smile мои познания о класслоадере где-то на уровне вот этого ответа http://stackoverflow.com/a/7473707

niquola18:12:24

напиши свой класслоадер и поймешь simple_smile

razum2um18:12:34

мда, наверное

razum2um18:12:56

кстати, у кого была такая необходимость тут?

niquola18:12:14

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

niquola18:12:37

а так это жуткое месиво - проще на микросервисы разбить simple_smile

razum2um18:12:26

но согласись, от того, что либа С заброшена или не может обновить зависимость В, делать сервис как то стремно

niquola18:12:49

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

niquola18:12:56

At run time, a class or interface is determined not by its name alone, but by a pair: its binary name (§4.2.1) and its defining class loader. Each such class or interface belongs to a single run-time package. The run-time package of a class or interface is determined by the package name and defining class loader of the class or interface.

The Java Virtual Machine uses one of three procedures to create class or interface C denoted by N:

If N denotes a nonarray class or an interface, one of the two following methods is used to load and thereby create C:

If D was defined by the bootstrap class loader, then the bootstrap class loader initiates loading of C (§5.3.1).

If D was defined by a user-defined class loader, then that same user-defined class loader initiates loading of C (§5.3.2).

Otherwise N denotes an array class. An array class is created directly by the Java Virtual Machine (§5.3.3), not by a class loader. However, the defining class loader of D is used in the process of creating array class C.

shinych19:12:41

@nicola "OSGI появился в недрах проекта eclipse" - это не так, эклипс сел на эту спецификацию (есть такой osgi консорциум) и сделал свою имплементацию (equinox). Во всем этом была сильно замешана фирма ibm и какое-то время и спецификация и эклипс довольно бодро развивались. Сейчас osgi тусовка вернулась к изначальной теме, для чего osgi и был когда-то задуман: IoT (тогда правда термина этого ещё не было) - иметь в девайсах понятную среду, в которой можно деплоить джарчики. Ну и да, в довесок к изолированному класслоадингу там еще много чего.

niquola19:12:12

так eclipse из ibm и вышел simple_smile

niquola19:12:43

я просто на eclipse RCP писал

shinych19:12:08

Ну да. Когда-то даже было кульно это все)

niquola19:12:30

мне кажеться там в обратном порядке - equinox -> OSGI spec

niquola19:12:49

с теми же чуваками в комитете

shinych19:12:00

Ну может оно как-то вместе рождалось, да. Но к моменту внедрения осги в эклипс спецификация была уже в версии 4.0 (early draft)

niquola19:12:10

хотя смотрю на wiki вроде OSGI на пол года раньше появился - правда под другим именем

niquola19:12:10

кстати, это интересно как заsandboxить clojure code - дать пользователю программировать твое приложение - но безопасно?

aav19:12:04

@nicola нет, osgi возник существенно раньше, и совсем из другой тусовки (телекомщики). эклипс не был основан на osgi, кажется до версии 2.0

razum2um19:12:10

о, @aav а можешь ответить на вопрос выше, что не так со статическим ядром и проч. хитрости? в каком статусе то что на гитхабе?

niquola19:12:55

ага, я уже понял simple_smile

aav19:12:37

ну главная проблема, что нельзя создать несколько “инстансов” кложурового рантайма в рамках одного jvm. а, соответственно, возникает проблема с изоляцией. в идеале, я бы хотел иметь два сервиса, реализованных на clojure, при том, что они совершенно не пересекаются по своему состоянию, неймспейсам и прочим

aav19:12:23

что-то мен подсказывает что там этого тоже не выйдет

niquola19:12:48

а почему нельзя? детальней

aav19:12:13

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

aav19:12:12

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

aav19:12:42

osgi в большой степени история про изоляцию (ну на сколько это возможно в рамках jvm)

aav19:12:46

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

niquola19:12:11

trapperkeeper есть ощущение вообще не изолирует - try/catchем наверное simple_smile

niquola19:12:52

я про то почему нельзя две clojure в один jvm?

aav19:12:11

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

aav19:12:42

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

razum2um19:12:02

так и делают кажется https://github.com/flatland/classlojure

aav19:12:03

это, наверное, можно сделать, но не очень вписывается в osgi

niquola19:12:15

ну те можно две clojure запустить - но два изолированных сервиса на одной clojure нельзя

razum2um19:12:25

видимо да

aav19:12:15

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

aav19:12:27

работать будет, но как-то жутковато

niquola19:12:23

наверно это и нормально - всеже clojure больше на хитрое приложение похоже, чем на модульный runtime

niquola19:12:31

но все равно интересно simple_smile

aav19:12:32

ну именно

aav19:12:56

я рича пытался уговорить (на irc было дело) но он как-то не очень оценил мой план. simple_smile

niquola20:12:16

а есть история?

aav20:12:23

не знаю...

aav20:12:27

может где и етсь

aav20:12:55

то что сейчас лежит в clojure.osgi скорее всего не работает с нынешней версией кложура

aav20:12:25

там путем дикого хакерства (и специфики equinox) чего-то достичь удалось

aav20:12:47

инстанс был один, но по крайней мере ограничения import/export в osgi работали

aav20:12:30

т.е. если в бандле b1 был определен namespace a.b.c, но не прописан в экспорте - то никакие другие бандлы его видет не могли

aav20:12:36

ну и наоборот с импортом

aav20:12:18

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

aav20:12:23

написанный

aav20:12:04

как сейчас ccw устроен я не знаю

niquola20:12:24

а что считать состоянием clojure - namespaces, thread pool...? сам RT получается статический и в нем куча добра - а можно было бы чтобы RT был инстансом?

aav20:12:29

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

aav20:12:49

а сам RT был один на все

aav20:12:34

т.е. если в b1 писалось (require ‘a.b.c) и при этом a.b.c не этим b1 не был заимпортирован - прилетал exception

aav20:12:54

не смотря на то, что в RT a.b.c уже давно и успешно был загружен

niquola20:12:23

а как Рич аргументировал не помнишь?

aav20:12:21

ну как-то очень радикально

aav20:12:28

вроде “какое нафиг osgi"

aav20:12:36

ну и, вообщем, был прав

niquola20:12:18

Вообще кстати прикольная wiki - http://dev.clojure.org/display/design/Why+Feature+X+Was+Declined

niquola20:12:31

я ее как-то упустил

aav20:12:17

да, это давно было

aav20:12:29

где-то еще и был и список отказанных идей

aav20:12:49

вообщем давно это все было simple_smile

aav20:12:28

а кому тут osgi хочется? должна быть ОЧЕНЬ серьезная причина чтобы за него браться simple_smile просто так - не советую simple_smile

niquola20:12:14

промелькнула идея спастись от dependency hellа при помощи classloader hella simple_smile

aav20:12:55

ну если все настолько большое - то я бы, может уже на несколько jvm разделял и через какой-то внешний брокер общался

aav20:12:26

ну или, можно попробовать osgi+subsystems

aav20:12:41

с отдельным clojure RT на subsystem

aav20:12:51

но что-то мне подсказывает что вы этого не хотите simple_smile

aav20:12:09

расскажите, вы по всяким map> и map< в core.async не скучаете, после того как их в пользу трансдьюсеров задепрекейтили?

artemyarulin20:12:11

а есть причины? Трансдьюсеры классные, плюс в языке очень хорошо поддерживаются (comp (map f1) (filter f2))

artemyarulin20:12:45

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

aav20:12:16

ну как-то вот не привычно

artemyarulin20:12:20

аа, ну это наживное. Мне нравиться идея что сегодня у меня синхронно все, но данные проходят через трансдюсер. Завтра я могу перевести это все на core.async, но продолжить использовать тот-же трансдюсер