This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2015-12-10
Channels
- # admin-announcements (32)
- # announcements (4)
- # aws (25)
- # beginners (296)
- # boot (1)
- # cider (87)
- # clara (16)
- # cljs-dev (7)
- # cljsrn (41)
- # clojure (121)
- # clojure-art (26)
- # clojure-japan (4)
- # clojure-miami (190)
- # clojure-russia (168)
- # clojure-sg (3)
- # clojure-sweden (13)
- # clojurescript (138)
- # clojurex (7)
- # cursive (98)
- # data-science (2)
- # datomic (129)
- # devcards (10)
- # editors (5)
- # funcool (1)
- # hoplon (31)
- # jobs (1)
- # ldnclj (4)
- # lein-figwheel (3)
- # off-topic (2)
- # om (213)
- # onyx (33)
- # parinfer (7)
- # portland-or (1)
- # re-frame (19)
- # reagent (2)
- # ring-swagger (27)
- # slack-help (3)
ладно, уже не надо ) - пока нахаркодил так (String. (b64/encode (.bytes body)) "UTF-8")
artemyarulin: Да, точно. Этого я тоже не делал, не знал что так можно было, как говорится в анекдоте)) Спасибо большое.
> т.е. это реально хаскель + лисп, прм как доктор прописал :)) artemyarulin: ну какой к черту хаскель, вы чего? )
стрелочки и ничего не понятно. Один в один прям с хаскелем
что-то, кстати, сходу не нашлось на лямбда-зе-ультимейт обсуждения шеня — интересно было б почитать яйцеголовых про sequent calculus и то как его в яп засунули
я много раз натыкался на этот лямбда-зе-ультимейт, но из-за такой верстки у меня глаза вытекают. Там стоящий контент?
ну если интересует Prog Lang Theory и всякое рядом, то по-моему стоящий, и лента и форум. в последнее время мне кажется активность чуть уменьшилась, ну так везде такое — в твиторы и слаки переползают поди %)
ок, спасибо
К примеру, есть либа А, которая ссылается на либу Б версии 1. И есть либа С, которая ссылается на либу Б версии 2. Либы Б по апи, скажем так, не сильно по апи совместимы и вообще, но неймспейсы у них одни.
подождать пару лет когда JVM станет поддерживать модули
оу уже? У меня знания jvm ограничены да
osgi с кложей не совместимо из-за мега статичности кложуриного ядра. пару лет назад была попытка убедить хики сделать иначе, но он был твёрд )
чувак из counterclockwise кое-как привернул кложу к osgi, но общей проблемы это не решит
Да мне не обязательно OSGi конкретно, пусть сама кложа научится грузить в разные одинаковые неймспейсы.
ну как устроены потроха кложи, это вообще никак не делается (и судя по тогдашней реакции вряд ли сделается)
shinych: а при чем тут потроха кложи? у нее свой класслоадер, но никто же не мешает его не использовать, а сделать свой.
https://github.com/aav/clojure.osgi вот коллега Алексей пару лет назад кложу к osgi прикручивал
turtle: взять сорцы либы, и седом поменять неймспейсы )
turtle: ок, давай формализуй требования. что делает OSGi, что не может pods / shimdandy?
единственное реальное применени OSGi которое я видел это аппликейшен сервера, где сервер и приложения работают полностью с разными кодобазами со своими класслоадерами. turtle как ты OSGi решишь описанную тобой задачу?
> Так в OSGi же не иерархический класслоадер. И грузит он их независимо. Так и решу. грузит он их независимо в разные бандлы. как при этом использовать либу А и С совместно?
> prepor: что делает pods я вообще сходу не понял. загружает жарки в изолированные окружения. как можно понять что делает этот интерпрайзный буллшит osgi и не понять эту страничку в вики? создаешь под "(make-pod {:dependencies [[foo/bar "1.2.3"]]})", потом дергаешь функции в скоупе этого пода: (.invoke pod ^String f args*)
как заставить сделать gc систему? работаю в емаксе, к сложуре цепляюсь через cider и где-то через два-три часа начинает подтормаживать все. Выходить и снова заходить уже задолбало
wwall: лучше подключись к своему реплу jmc и посмотри что там происходит. там и кнопка gc будет
OSGi это костыль, да и толком он эту проблему не решает, да (ключевое слово package uses conflict)
а привинтить захотелось как из практических соображений (в нашем энтерпрайзе всё на osgi - и сервера и клиенты), так и из любви к искусству. но быстро поняли, что ну его нафик
@nicola что толком всё равно не работает и не применяется - эклипс сам рекомендует рестарт после каждого апдейта. а оверхед на эту херь немыслимый. вот в идее чуваки правильно не стали этим заморачиваться
профайлинг для джавы - Java Mission Control (JMC) http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jmc.html
osgi это кормушка для всяких там энтрерпрайз архитекторов “наконец-то мы можем контроллировать беду с версиями в java”, ага
wwall: http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html вроде не пишут что линукс / os x онли
prepor: значит, страничка в вики так представлена. Смотрятся многообещающие твои примеры. Нужно будет попробовать.
ну, не стоит забывать что osgi - это не только про загрузку классов, но еще и сервисная модель
у меня сейчас в одном из проектов порядка пары сотен бандлов, в зависимости от “версии” продукта по разному деплоящихся. с механизмом “патчей и кастомизацей” для отдельных инсталляций/клиентов. но чтобы это прилично работало - требуется довольно много дисциплины и усилий.
Они его хотят еще и как отдельную IDE выпустить на базе Idea. Думаю так проще продвигать, поскольку плагин платный.
@abtv: его довольно долго пилил один человек, не имеющий никакого отношения к Idea. сам плагин весьма хорош. Разрабатываю только под ним
shinych: turtle: объясните на пальцах что делает osgi (т.е. чтото с класслоадерами, но что) и причем тут то, что кложура статическая?
в osgi у каждого джара (bundle) в системе есть свой класслоадер, который по манифесту бандла знает, откуда (из каких других бандлов) грузить зависимости, вот в принципе и вся наука. на второй вопрос квалифицированно @aav ответить может
@razum2um: OSGI появился в недрах проекта eclipse как механизм горячей подгрузки и выгрузки плагинов. В java под каждый classloader создается свое относительно изолированное пространство (точнее там получается иерархия http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html) - по сути возможность хостить на jvm несколько приложений, вгружать их и выгружать - и даже гарантировать их определенную безопасность и изолированность.
@nicola: ну вот эту совсем базу я представляю, я спрашивал больше о механике (как оно работает) и что мешает “притащить"
все построенно как раз на возможности определить свой classloader и загрузить модуль через него
классы порожденные определенным classloader - за остальными обращаются в начале к нему
podы в bootе так же сделаны - https://github.com/boot-clj/boot/blob/master/boot/pod/src/boot/pod.clj#L36
угу, но это все еще не то мои познания о класслоадере где-то на уровне вот этого ответа http://stackoverflow.com/a/7473707
это может пригодиться если захочеться сторонний код загружать в приложение - для безопасности
но согласись, от того, что либа С заброшена или не может обновить зависимость В, делать сервис как то стремно
я и говорю, если она тебе нужна - иди и пропатч устаревшую либу - иначе будет камень на шее
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.
@nicola "OSGI появился в недрах проекта eclipse" - это не так, эклипс сел на эту спецификацию (есть такой osgi консорциум) и сделал свою имплементацию (equinox). Во всем этом была сильно замешана фирма ibm и какое-то время и спецификация и эклипс довольно бодро развивались. Сейчас osgi тусовка вернулась к изначальной теме, для чего osgi и был когда-то задуман: IoT (тогда правда термина этого ещё не было) - иметь в девайсах понятную среду, в которой можно деплоить джарчики. Ну и да, в довесок к изолированному класслоадингу там еще много чего.
Ну может оно как-то вместе рождалось, да. Но к моменту внедрения осги в эклипс спецификация была уже в версии 4.0 (early draft)
хотя смотрю на wiki вроде OSGI на пол года раньше появился - правда под другим именем
кстати, это интересно как заsandboxить clojure code - дать пользователю программировать твое приложение - но безопасно?
@nicola нет, osgi возник существенно раньше, и совсем из другой тусовки (телекомщики). эклипс не был основан на osgi, кажется до версии 2.0
о, @aav а можешь ответить на вопрос выше, что не так со статическим ядром и проч. хитрости? в каком статусе то что на гитхабе?
ну главная проблема, что нельзя создать несколько “инстансов” кложурового рантайма в рамках одного jvm. а, соответственно, возникает проблема с изоляцией. в идеале, я бы хотел иметь два сервиса, реализованных на clojure, при том, что они совершенно не пересекаются по своему состоянию, неймспейсам и прочим
ну а там выйдет сделать два сервиса, так, что у реализации каждого будет свой автономный набор неймспейсов?
ну потому что (по крайней мере 4-5 лет назад) все состояние кложурового рантайма было сделано в виде статических мемберов их внутренних классов
единственный путь, был создавать кучу класслоадеров, каждый из которых грузил бы весь clojure заново
так и делают кажется https://github.com/flatland/classlojure
ну те можно две clojure запустить - но два изолированных сервиса на одной clojure нельзя
@nicola самое чистое - в каждый бандл класть отельно clojure.jar и ничего наружу кложурового не выпускать
наверно это и нормально - всеже clojure больше на хитрое приложение похоже, чем на модульный runtime
т.е. если в бандле b1 был определен namespace a.b.c, но не прописан в экспорте - то никакие другие бандлы его видет не могли
на этом всем сооружении работал один относительно крупный серверный проект, и ccw - эклипсный плагин для кложура, на кложуре и написано
а что считать состоянием clojure - namespaces, thread pool...? сам RT получается статический и в нем куча добра - а можно было бы чтобы RT был инстансом?
т.е. если в b1 писалось (require ‘a.b.c) и при этом a.b.c не этим b1 не был заимпортирован - прилетал exception
Вообще кстати прикольная wiki - http://dev.clojure.org/display/design/Why+Feature+X+Was+Declined
а кому тут osgi хочется? должна быть ОЧЕНЬ серьезная причина чтобы за него браться просто так - не советую
ну если все настолько большое - то я бы, может уже на несколько jvm разделял и через какой-то внешний брокер общался
расскажите, вы по всяким map> и map< в core.async не скучаете, после того как их в пользу трансдьюсеров задепрекейтили?
а есть причины? Трансдьюсеры классные, плюс в языке очень хорошо поддерживаются (comp (map f1) (filter f2))
хотя я core.async без трансдюсеров совсем немного юзал, буквально пару месяцев во время изучения и прототипов на кложуре
аа, ну это наживное. Мне нравиться идея что сегодня у меня синхронно все, но данные проходят через трансдюсер. Завтра я могу перевести это все на core.async, но продолжить использовать тот-же трансдюсер