This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-01-31
Channels
- # aatree (1)
- # admin-announcements (3)
- # aws (3)
- # beginners (36)
- # boot (227)
- # cljsrn (27)
- # clojure (57)
- # clojure-czech (6)
- # clojure-miami (8)
- # clojure-poland (17)
- # clojure-russia (113)
- # clojurescript (9)
- # community-development (1)
- # core-async (11)
- # core-matrix (2)
- # core-typed (3)
- # cursive (3)
- # datomic (5)
- # editors (40)
- # emacs (6)
- # heroku (1)
- # hoplon (50)
- # incanter (1)
- # ldnclj (4)
- # luminus (3)
- # mount (1)
- # om (132)
- # onyx (5)
- # proton (3)
- # re-frame (5)
- # spacemacs (1)
- # testing (12)
- # yada (6)
никто не игрался с datascript? Читал тут пару раз что мол с ом-некст ну и вообще для кейсов когда single application state object datascript прям цветет и пахнет, особенно когда приложение сложное. Не могу понять профита чота пока
я принес себе датаскрипт, брат жив. Профит: Есть датаскриптовая база, в ней некая вытащенная из sql информация. И вот я ее один раз вытащил, в ds положил, и разными запросами отображаю в разных частях и на разных роутах. Тут тебе и single source of truth (не надо два раза тащить одну и ту же инфу), и удобное вытаскивания данных в нужной форме.
artemyarulin: например:
(def select-videos-q '[:find ?video-id ?video-name
:where [?e :video-id ?video-id]
[?e :video-name ?video-name]
[?e :studio_id ?studio-id]])
;...
(defn links-stat-for-video [links video-id]
(let [ls (ds/q '[:find ?video-id ?e ?status
:in $ ?video-id
:where [?e :video-id ?video-id]
[?e :status ?status]]
links video-id)]
(into {} (map (fn [[k v]] [(keyword k) (count v)]) (group-by last ls)))))
еще можно запрос из кусочков собирать. Мне не нравится, как у меня сейчас, но например:
(def studio-pages-stat-where
'[:where [?e :studio_id ?studio-id]
[?e :name ?name]
[?e :total_links ?total-links]
[?e :total_scans ?total-scans]
[?e :takedown_not_started ?takedown-not-started]
[?e :completed ?completed]
[?e :licensed ?licensed]
[?e :processing ?processing]])
(def studio-pages-stat-q
(into '[]
(concat
'[:find ?total-links ?total-scans ?takedown-not-started ?completed ?licensed ?processing ?studio-id ?name
:in $ ?studio-id]
studio-pages-stat-where)))
(def overall-pages-stat-q
(into '[]
(concat
'[:find (sum ?total-links)
(sum ?total-scans)
(sum ?takedown-not-started)
(sum ?completed)
(sum ?licensed)
(sum ?processing)]
studio-pages-stat-where)))
хм. А база в пямяти да? Могу я сериализовать и сохранить например на local storage?
в памяти, да. Не скажу про локалсторадж, у меня там хранить бессмысленно. Но не знаю, что тебе может помешать, сериализуется оно хорошо. Там по сути {:datoms [[entity attr value] ...]}
надо подумать. У ом-некст просто свой язык запросов, у датаскрипт свой, не могу понять профит итоговый
а неа, там же один вроде язык, хм. Спрошу в канале ома тада еще, спасибо в любом случае
вчера просто случайно видел что один из бывших девов circleCI frontend, который по сути архитектуру сделал всю грил что ом-некст + датаскрипт прям няша из няш
@rm: А ты на фронте чего используешь? реагент,ом, свое?
в связке с датаскриптом я имею ввиду
может сейчас бы и ом просто пошел, но полгода назад я чота написал на нем сто строк кода и запутался
дада, он сложен по началу, предыдущий ом грят темже страдал
оо, хм, кажется начинаю вкуривать уже. При обычном ом-нексте когда один атом для всего стейта приложения чтобы сделать большие изменения надо иногда писать ипические swap! которые кучу всего меняют, при датаскрипте это будет нормальные запросы
+ которая опять же можно собирать из более мелких
т.е. опять заместо императивного (swap!) - декларативное (запросы), опа, опа, это я люблю, хм
хехе, у меня сам юзер особо ничего изменить не может, даже не думал в эту сторону. Только когда с сервера данные подтягиваются, пишешь with-db и радуешься
но датаскприт умеет изменения в том числе ведь да?
оо, “я все понял”(с) - я все еще не решил какую БД брать для CLJS on mobile, чтоб еще и кроссплатформенно было - возьму datascript и все буду держать в пямяти, 100% кроссплатформенность, запросики, макс у меня будет 10метров база, при запуске буду десериализовать с диска просто, все пучком
Прямо с гитхабовского ридми:
(d/transact! conn [ { :db/id -1
:name "Maksim"
:age 45
:aka ["Maks Otto von Stirlitz", "Jack Ryan"] } ])
вернее, я ничего не понимаю. Вроде на андроиде кастрированная джава, на ios вообще какое-то исчадие сотоны, как туда js попал?
@rm: Более чем - с приходом React Native все зацвело и пахнет. JS попал на iOS начиная с iOS7(или может 8 ) когда аппла добавила JavaScriptCore - по сути интерпретатор JS и няшным апи. Ну а далее счас почти нету ни одной платформы которая бы не умела JS (== CLJS)
я счас делаю новый продукт дак с самого начала - кложура на беке, CLJS для Browser/Android/iOS и win/linux/osx через Electron
one language to rule them all
ну на десктопе не так заметно все это, вот я счас прям пишу это сообщение в клиента слаки который электрон
не вижу особой разницы. На мобильных там да, не нативное сразу видно
омг) Хотя почему нет да
https://www.youtube.com/watch?v=E6DUvw41lbI аж два года назад. Сейчас если заняться, должно сильно лучше даже быть
ха, неа, куте я еще не потяну
У электрона сильно больше фич, чем просто "вкладка браузера в приложении". Я недавно контрибьютил в https://github.com/niftylettuce/frappe, так там вообще нет вкладки браузера, но зато неплохо демонстрируется API electron'а для, скажем, создания иконки в menu bar OS X, создания контекстного меню, глобальных шорткатов, сервиса для отслеживания включения и отключения девайсов. В общем, полагаю, что на Electron сейчас можно почти что угодно написать, а нативные контролы в эпоху веба на десктопе не особо-то и нужны. С учетом того, насколько просто и быстро это делается, я бы всерьез задумался насчет написания чего угодно на Electron'е вместо нативных приложений. Не говоря уж о том, что если можно писать на JS, то значит можно и на CLJS
Есть же вон Git Kraken (http://www.gitkraken.com/), написанный целиком на электроне. Мне не нравится его внешний вид, да и вообще к тулам для визуального общения с Git'ом я отношусь довольно прохладно, но сам факт
Ну то есть, когда к вам приходит строка невесть откуда, а вам ее надо в виде текста в html вставить.
@maxp если я правильно понял проблему, то вот тут есть решение: https://clojuredocs.org/clojure.string/escape
Например, раньше у меня работало аналогичное на replace() и пачке регексов, но string/escape немного быстрее работает.
@alwx: смотрю используешь react-native-store - вопрос, в чем профит по сравнению с обычной сериaлизацией и помещением в AsyncStore? react-native-store хранит страницы js-ные, чистые, все равно потом в clojure конвертировать нужно? А тот же поиск организовать легче на чистой clojure? Думаю сделать большую локальную базу и думаю про производительность….
хотя сериализция ведь тоже в json….тогда действительно особо смысла придумывать что-то смысла нет.
@potapenko: Тоже задаюсь счас этим вопросом, не смотрел в сторону datascript?
clojureScript ага
т.е. вся база в памяти + сериализация на диск
я просто ом-некст использую, дак там тупо атом + свой язык запросов, почти тоже самое выхожит
@potapenko: у тебя на беке кста какая база?
пока без, все на клиенте
для нового продукта придется наверно, вот думаю чтоб взять
неа, чота от SQL я устал
у меня до этого в приложении на IOS было SQLite, ничо так, работает шустро
@potapenko: так ведь react-native-store и есть обертка над реактовским AsyncStorage. да, я думаю, правильным решением будет попробовать прикрутить ко всему этому datascript, но это много работы требует. пока было проще прикрутить react-native-store, поскольку он довольно простой и неплохо для мобилок подходит (имхо, вопрос производительности в случае с запуском одной копии приложения на одном девайсе особо остро не стоит, к тому же БД в мобилках обычно применяется всего лишь как кэш данных, полученных сетевым запросом)
Ну да, я вот исходники посмотрел как они хранят и делают фильтры и как-то не впечатлился.
интерес угас полгода назад когда узнал что там денег хотят. недавно зашел - уже про деньги не увидел.
ну не, у них по-прежнему платно, правда, год-полтора назад они сделали-таки Datomic Pro Starter
я когда последний раз писал на датомике, пользовался выигранным в кложуркапе Pro, но, к сожалению, там был всего год и мы в итоге так и не смогли никакой продукт создать, то есть по сути этот год потратили ни на что, а жаль
у меня на сервере все пока хорошо, сильно не требуется, но вот думаю сделать offline базу, есть сумашедшая мысль дропать в json mongo и хранить это дело в git, и подгружать изменения как diff Хочу для туризма сделать, когда пользователи много времени проводят без интернета.
а чем в итоге отличается оно от обычно атома то? чота понять не могу, разве что декларативными запросами?
есть кая-то либа и для этого, которая позволяет update-in! красиво писать, забыл уже
с утра вроде понял зачем этот датаскрипт, а счас опять забыл
Устал наверное, ты вообще ранний товарищ, я засыпал как обычно в 7, а ты тут как тут, мысли про datomic сыплешь. Финляндия?
я по воскресеньям в 5 встаю и работаю до 14
ну, атом это атом, а datascript это фактически полноценная БД с entities, индексами и отношениями между entities
кстати, пользуясь случаем порекомендую Clojure Applied — очень крутая книга из недавно выпущенных про Clojure. довольно много нюансов и много про применение Clojure в реальных приложениях. по крайней мере, явно одна из лучших книг, что я читал о Clojure https://pragprog.com/book/vmclojeco/clojure-applied
о, я думал я один такой, еле осилил до конца
@artemyarulin: датаскрипт ништяк, когда у тебя многоуровневая one-to-many структура данных. с ним гораздо проще и "плоско" эти данные менять и читать. в то же время с атомом ты встреваешь на бесконечные (swap! state update-in [...] f)
и (-> @state (get-in [...]) (select-keys [...]))
и либо у тебя везде оно в инлайнах шумит, либо миллион одинаковых-но-несовсем функций доступа/изменений данных
а когда приходит время на сервер отправить пачку изменений - с датаскриптом проще сделать дельту изменений, из-за того, что всё хранится (условно) в векторах [id key value transaction-id]
.