This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-02-05
Channels
- # aatree (2)
- # admin-announcements (15)
- # announcements (2)
- # aws (8)
- # beginners (160)
- # boot (290)
- # braid-chat (28)
- # cider (8)
- # clara (1)
- # cljsrn (3)
- # clojure (154)
- # clojure-czech (7)
- # clojure-russia (162)
- # clojurebridge (2)
- # clojurescript (128)
- # cursive (29)
- # datomic (30)
- # emacs (7)
- # events (1)
- # hoplon (5)
- # jobs (1)
- # ldnclj (7)
- # leiningen (3)
- # off-topic (11)
- # om (82)
- # onyx (68)
- # overtone (1)
- # parinfer (57)
- # portland-or (1)
- # proton (18)
- # re-frame (8)
- # reagent (32)
- # ring-swagger (3)
- # yada (5)
artemyarulin: если в результате алгоритма у тебя для каждой вершины получается хеш с остальными вершинами, то тебе ничего не стоит проверить как то, что путь до какой-то вершины есть, так и то, что его нет
но так да, я помню мы на лекции по логическому погромированию как раз такую задачу про пути решали
@rm @misha @abtv @turtle всем спасибо за комментарии, классно когда есть такая площадка где можно обсудить такие темы Думаю пока сделаю PoC на простых графах + алгоритм Дейкстры (ну или какой еще) на достижимость. Когда насобираю данных и пойму лучше стандартные ошибки - то попробую уже перевести на core.logic. Еще кстати вопрос - кто-нить делал с ним что-нить?
Дядя, у тебя же конечный, не цикличный граф? Тебе просто топологически отсортировать нужно и все.
ребята, у меня видимо детский вопрос - а отчего может быть что lein repl
работает успешно, а lein uberjar
летит в тан-тарары со следующим трейсом:
Caused by: java.lang.ClassNotFoundException: com.stuartsierra.component.Lifecycle
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
….
причем и кода почти никакого нет, просто темплейт с ring-jetty-component
+ jarohen/phoenix
попробуй в неймспес с компонентами добавить gen-class (https://gist.github.com/jalehman/10494205), я правда с компонентом не работаю, так что не точно
@prepor: Ушел гуглить, спасибо 😳
@andfadeev: я в какой-то момент успел везде засунуть component
, как-то не помогает
выложил весь проект из нескольких строк https://gist.github.com/rmuslimov/b8fff1f70e2fbb5f8bbf
спасибо, что потратили на меня время - буду внимательнее в следующий раз его добавлять
ага, открыл уже эту же статью на вики
спасибо
я уже тут спрашивал, но может ты @prepor знаешь: на графах же мне не выразить что a -> b c -> d b + d -> z т.е. только когда оба b и d достигнуты, а не один из них? или может другая какая абстракция есть для этого кроме графов?
типа стейт машина, но правила чутка сложнее могут быть
ну пусть у каждой ноды будет {:required-activations #{:b :d}, :activations (atom #{}) :dependants #{:x}}
каждая нода при выполнении добавляет активации в dependants. если :activations становится суперсетом :required-activations, то оно тоже активируется. required-activations и dependants вычисляются как раз в момент сортировки.
ага, во, спасибо за новый термины -ушел гуглить их
ну дам лучше сильно не углубляться, а то не вылезешь ) для того что ты описал достаточно вот такой простой структурки и все это в 20 строк кода делается
ага, но все равно мат часть чутка подтяну
спасибо)
вообще, на кложе есть реализация rule engine https://github.com/rbrush/clara-rules
но оно для более сложных кейсов, чем нужно тебе, на сколько я понимаю. там rete network внутри
оспади, скок новых слов:)
ок, почитаю все равно, спасибо
вообще часто вижу темин экспертные системы - это прям AI? Стоит почитать про это?
в повседневной жизни можно че применить оттуда?
спроси @nicola, вроде он пишет. Но это не аи (потому что аи не существует), а в зависимости от хитровыдуманности может быть от пачки ифов до обученной нейросети
ну почти ai ладно
> вообще часто вижу темин экспертные системы - это прям AI? Это AI в тех терминах под которым его понимали в 80-х, 90-х )
Светлоликого нашего Хики в списке есть несколько книг по тематике http://www.amazon.com/Clojure-Bookshelf/lm/R3LG3ZBZS4GCTH
@artemyarulin: когда много правил, они часто противоречивы (ибо достаточно просты, чтобы выразить что-то сложное). Лет 5 назад я не смог реализовать парсер фактов для русского языка чисто на правилах, приходилось искать и другие способы. Я использовал стеммер Яндекса для морфологического анализа, а сверху этого построил правила для синтаксического анализа и извлечения фактов. Очень часто там срабатывало несколько правил и была неоднозначность. Я дописал еще несколько правил-эвристик (т.е. у меня была иерархия правил), но до нормального извлечения фактов было очень далеко. Проект был исследовательский.
морфоанализатор -> синтаксический анализатор -> извлекатель фактов (этапы 2 и 3 содержали разный набор правил)
масштабно
@artemyarulin задача оч похожа на типичную для logical programming (core.logic)
@nicola: дада, мы пришли к этому вчера, подсказали добрые люди
@abtv: А правила противоречивы - логически просто? или ошибки в коде?
т.е. не решить их в итоге никак?
моя проблема была в том, что 1 этап может зависеть от 3 этапа, т.е. например, часть речи можно определить только на этапе семантического анализа
Если пространство решений велико - есть солверы - у нас про них Дима Грошев на fprog. рассказывал
@nicola: солверы это чо?
термин такой?
я это извлечение фактов писал один, слишком сложно для одного человека. в т.ч. я писал и правила. хорошо, хоть mystem был с контекстом все очень сложно, по-идее там многопроходный алгоритм должен быть
@larhat: спасибо
я описывал факт как <subject, verb-class, objects>, где subject - это набора правил для подлежащего, verb-class - набор правил для сказуемого (есть несколько типов сказуемого) и objects - объект, на который направлено действие (тоже набор правил). Они распадались на свои правила. Думаю, что анализ естественного языка - слишком сложная область просто. Для чего-то другого это можно сделать с гораздо меньшими усилиями.
оспади куда я полез
да скорее всего дадут набор атомов и скажут что делов на 5 минут
всем спасибо, ушел гуглить:)
а вот если я хочу поиграться с либой в репле, мне обязательно нужно новый project.clj создавать, добавлять депенденси туда, репл пере-запускать? Ничо нету попроще?
> задача оч похожа на типичную для logical programming (core.logic) это обратная core.logic задача
> А правила противоречивы - логически просто? или ошибки в коде? в рул енжинах каждое срабатывание может привести к срабатыниваю нескольких "продакшенов". что с этим делать решается каждая система по-своему, в зависимости от решаемой задачи
обратная всмысле она не решается с помощью core.logic?
ну вот скажите тогда хоть - тяжело начать с этим core.logic? я в своем время загорелся, месяц смотрел видео всякие, казалось бы понял - но как начал делать хелло ворлд у меня мозг взорвался и я начал заниматься другим
есть вот такая статья https://adambard.com/blog/clojure-sql-libs-compared/
со статьей одна беда: «I should note that I’ve never used any of these, just java.jdbc, so this is all first impressions.»
ну у меня для мелкого проекта корма норм была, но если делать чтото крупнее то я бы всеже наверное взял honeysql
кстати, как православно протаскивать db-conn в ring хандлеры? корма какой-то свой пул соединений разводит, а в honeysql и прочих как?
> есть вот такая статья https://adambard.com/blog/clojure-sql-libs-compared/ долб писал какой-то. даже тупо фактические ошибки есть "Suricatta is a combination jdbc helper (providing some nice refinements over jdbc’s api) and Korma-esque query DSL. Here’s what the latter looks like:"
> кстати, как православно протаскивать db-conn в ring хандлеры? корма какой-то свой пул соединений разводит, а в honeysql и прочих как? никак, он sql формирует, что б его в базу скармливать есть например jdbc. глобальное состояние иметь с пулом почти всегда плохо
ну suricatta можно по разному юзать You can build queries with suricatta and execute them with clojure.jdbc. You can use suricatta for executing queries with string-based sql. You can combine the suricatta library with clojure.jdbc. And obviously, you can forget jdbc and use suricatta for both purposes, building and/or executing queries.
> вопрос сводится к тому, как jdbc-соединение протаскивать mount, component, буквально вчера обсуждали
> ну suricatta можно по разному юзать упс, кажись я долбж все же. не очень понял отношения jooq с jdbc и суриката с ними обоими
> чем это будет отличаться от глобального состояния? много чем. эксплицитным определением зависимостей, автоматического и правильного порядка старта / стопа, понятным механизмом DI, например
кстати, @niwinz > using core.async channels as response but since the version 0.4.0 it is removed because core.async is not a proper abstraction for represent a promise. почему? в последнем core.async даже прям отдельный promise-chan появился
core.async channels does not have the notion of error and futures work much better in that place
niwinz: я использую простое соглашение: если в канал пришел Throwable, то это ошибка, думаю в библиотеках это тоже можно использовать. Но в целом проблема есть, конечно. Зато core.async очень хорош для api к курсорам.
indeed, is just to much opinionated in my opinion, so I prefer leave this from the official api and allow to the user build as it needs in the application...
@prepor: do you remember our chat about http2? I have read about it, and my suspicion about its (no) beneffits in local (low-latency) networks are mostly true.
Я тоже ) Я почитал спеку хттп2 и оно ОЧЕНЬ сложное и все что там усложнено не имеет отношения к low latency сетям
I really want do my own benchmarks, but is prettly clear (this is not the first article).
So the best usage of http2 is have a nginx/haproxy/whatever for serve content over http2 but communicate with http1 in local network nginx<->backend
лично я для себя вообще другой план составил ) бекенды общаются по zmq, а балансер умеет принимать запросы как по zmq-протоколу, так и по хттп и передавать их дальше в zmq-бекенд
протобуфы гоняешь?
и вся логика сбора статистики и трейсинга сосредоточена в балансере. тут бонус в том, что zmq-протокол (zmtp) очень тупой и его легко релизовать. особенно это релевантно для языков где нет нормального хттп-сервера и его сложно реализовать, например ocaml
в окамле, как и в руби, питоне, сейчас есть gil, значит для того что бы загрузить все ядра нужно поднимать несколько процессов. обычно это решается мастер-процессом с listen и форканьем accept-процессов. но это тоже не самая простая модель в реализации. а с zmq-балансером я могу просто стартануть n-инстансов и каждый из них подключится к балансеру сам.
@prepor: my concern about zmq is how it plays with async io? I mean, in an example: I have catacumba as async http frontend but I want to build my backend services and communicate them with zmq. It there a simple way to use zmq in "async" way from async http frontend?
Кину с умным видом ссылку и промолчу: https://github.com/lynaghk/zmq-async
Please, share
in contrast to the REQ/REP that is strictly sync (you can't send multiple REQ and later receive the REP...)
@niwinz: zmq можно разделить на две части: - Библиотеку libzmq, которая реализует довольно много своих асбтракций, поднимает io-треды, в которых читает/пишет во внешний мир, принимает соединения, реконнектится и т.д., реализует zmq-сокеты разных типов, у каждого из которых есть свой буфер. Т.е. допустим send в zmq-сокет необязательно блокирующая операция, если в буфере есть место, то данные просто туда добавятся, а реальная отправка произойдет асинхронно в тред-пуле. Тоже самое с recv, только в обратную сторону. Самое стремное, что zmq-сокеты не тредсейфны. Но есть так называемые inproc сокеты, которые работают инмемори в рамках zmq-контекста. Т.е. libzmq-путь сделать то, что тебе нужно, это поднять zmq-proxy-queue (http://api.zeromq.org/4-0:zmq-proxy), который с одной стороны будет торчать наружу, а с другой в inproc-сокет. И реализовать ивентлуп, который бы читал / писал из этого инпрок сокета ответы / запросы. Я бы не назвал это "простым способом" - Вторая часть это простейший бинарный протокол zmtp (http://rfc.zeromq.org/spec:15), который можно использовать напрямую и есть имплементации для, например, jvm (https://github.com/spotify/netty-zmtp). Тут ты уже сам полностью волен сделать нужную тебе логику со знакомыми интерфейсами. И это будет полностью совместимо с libzmq, которая может работать с другой стороны (в бекенде)
> I can send multiple REQ-like requests and later receive them as them are ready да, но ты должен обработать это в неком ивентлупе и отроутить куда надо
+ повторюсь, zmq-сокеты не тредсейфны, т.е. в dealer-сокет нельзя писать параллельно из разных тредов, например
libzmq для jvm реализовано в двух вариантах: jzmq (jni вокруг сишной libzmq) и jeromq(native java). у них одинаковый интерфейс и они swappable
Для инфраструктурных вещей (бекенд http балансера) я бы, наверно, взял netty-zmtp и сделал все поверх него. Это даст больше контроля и позволит все сделать так как надо с полностью асинхронным io. При этом бекенды можно будет писать с libzmq на любом языке в несколько строк и достаточно эффективно.
@niwinz: В клиенте для руби я использую просто req-сокет. Для кложи написал обертку реализующую примерно то, о чем я писал с интерфейсом в core.async (https://github.com/prepor/clojure-lucky-client/blob/master/src/lucky_client/reactor.clj), как я и говорил, у меня не получилось "легко". Ну и это очень похоже на то, что делает zmq-async. С этим я могу писать сервер как:
(let [[backend-stopper requests] (backend/create *reactor* [""])]
(async/go-loop []
(when-let [[answer method body] (async/<! requests)]
(async/>! answer body)
(recur))))
И клиент как:
(let [client (client/create *reactor* [""])]
(async/<! (client/request client "ping" "Hey, whatzuuup?")))
Мы долгое время жили со стандартным libzmq-proxy-queue в качестве балансера, вот сейчас написал / пишу свое, там так https://github.com/prepor/lucky/blob/master/src/lucky/backend.go#L151 (имлементация протокола весьма простая https://github.com/prepor/go-zmtp/blob/master/zmtp.go).
Бэкенд при этом будет выглядеть на питоне например так:
import zmq
ctx = zmq.Context()
s = ctx.socket(zmq.REP)
s.connect("")
while True:
req = s.recv_multipart()
s.send("reply!")