Fork me on GitHub
#clojure-russia
<
2016-01-31
>
artemyarulin04:01:02

никто не игрался с datascript? Читал тут пару раз что мол с ом-некст ну и вообще для кейсов когда single application state object datascript прям цветет и пахнет, особенно когда приложение сложное. Не могу понять профита чота пока

rm05:01:21

я принес себе датаскрипт, брат жив. Профит: Есть датаскриптовая база, в ней некая вытащенная из sql информация. И вот я ее один раз вытащил, в ds положил, и разными запросами отображаю в разных частях и на разных роутах. Тут тебе и single source of truth (не надо два раза тащить одну и ту же инфу), и удобное вытаскивания данных в нужной форме.

rm05:01:10

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)))))

rm05:01:33

еще можно запрос из кусочков собирать. Мне не нравится, как у меня сейчас, но например:

(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)))

artemyarulin05:01:26

хм. А база в пямяти да? Могу я сериализовать и сохранить например на local storage?

rm05:01:00

в памяти, да. Не скажу про локалсторадж, у меня там хранить бессмысленно. Но не знаю, что тебе может помешать, сериализуется оно хорошо. Там по сути {:datoms [[entity attr value] ...]}

artemyarulin05:01:34

надо подумать. У ом-некст просто свой язык запросов, у датаскрипт свой, не могу понять профит итоговый

artemyarulin05:01:33

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

rm05:01:41

пожалуйста

artemyarulin05:01:55

вчера просто случайно видел что один из бывших девов circleCI frontend, который по сути архитектуру сделал всю грил что ом-некст + датаскрипт прям няша из няш

artemyarulin05:01:25

@rm: А ты на фронте чего используешь? реагент,ом, свое?

artemyarulin05:01:36

в связке с датаскриптом я имею ввиду

rm05:01:44

реагент, он как-то просто пошел

rm05:01:52

может сейчас бы и ом просто пошел, но полгода назад я чота написал на нем сто строк кода и запутался

artemyarulin05:01:54

дада, он сложен по началу, предыдущий ом грят темже страдал

rm05:01:09

да, я не на нексте писал еще

artemyarulin05:01:06

оо, хм, кажется начинаю вкуривать уже. При обычном ом-нексте когда один атом для всего стейта приложения чтобы сделать большие изменения надо иногда писать ипические swap! которые кучу всего меняют, при датаскрипте это будет нормальные запросы

artemyarulin05:01:17

+ которая опять же можно собирать из более мелких

artemyarulin05:01:50

т.е. опять заместо императивного (swap!) - декларативное (запросы), опа, опа, это я люблю, хм

rm05:01:23

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

artemyarulin05:01:03

но датаскприт умеет изменения в том числе ведь да?

artemyarulin05:01:50

оо, “я все понял”(с) - я все еще не решил какую БД брать для CLJS on mobile, чтоб еще и кроссплатформенно было - возьму datascript и все буду держать в пямяти, 100% кроссплатформенность, запросики, макс у меня будет 10метров база, при запуске буду десериализовать с диска просто, все пучком

rm05:01:41

конечно умеет, иначе какая это бд

rm05:01:36

Прямо с гитхабовского ридми:

(d/transact! conn [ { :db/id -1
                        :name  "Maksim"
                        :age   45
                        :aka   ["Maks Otto von Stirlitz", "Jack Ryan"] } ])

rm05:01:05

artemyarulin: cljs on mobile -- жизнеспособно вообще?

rm05:01:25

вернее, я ничего не понимаю. Вроде на андроиде кастрированная джава, на ios вообще какое-то исчадие сотоны, как туда js попал?

artemyarulin05:01:11

@rm: Более чем - с приходом React Native все зацвело и пахнет. JS попал на iOS начиная с iOS7(или может 8 ) когда аппла добавила JavaScriptCore - по сути интерпретатор JS и няшным апи. Ну а далее счас почти нету ни одной платформы которая бы не умела JS (== CLJS)

rm05:01:51

ну круто

rm05:01:03

скоро на мобильниках будет жизнь

artemyarulin05:01:07

я счас делаю новый продукт дак с самого начала - кложура на беке, CLJS для Browser/Android/iOS и win/linux/osx через Electron

artemyarulin05:01:16

one language to rule them all simple_smile

rm05:01:22

охренеть

rm05:01:53

ну правда электрон -- костыль

rm05:01:43

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

artemyarulin06:01:47

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

artemyarulin06:01:59

не вижу особой разницы. На мобильных там да, не нативное сразу видно

rm06:01:55

нативно был бы qml, наверное

rm06:01:18

где-то я видел гифку или видео, где кто-то и туда сунул cljs

artemyarulin06:01:41

омг) Хотя почему нет да

rm06:01:36

https://www.youtube.com/watch?v=E6DUvw41lbI аж два года назад. Сейчас если заняться, должно сильно лучше даже быть

artemyarulin06:01:34

ха, неа, куте я еще не потяну simple_smile

alwx09:01:03

У электрона сильно больше фич, чем просто "вкладка браузера в приложении". Я недавно контрибьютил в https://github.com/niftylettuce/frappe, так там вообще нет вкладки браузера, но зато неплохо демонстрируется API electron'а для, скажем, создания иконки в menu bar OS X, создания контекстного меню, глобальных шорткатов, сервиса для отслеживания включения и отключения девайсов. В общем, полагаю, что на Electron сейчас можно почти что угодно написать, а нативные контролы в эпоху веба на десктопе не особо-то и нужны. С учетом того, насколько просто и быстро это делается, я бы всерьез задумался насчет написания чего угодно на Electron'е вместо нативных приложений. Не говоря уж о том, что если можно писать на JS, то значит можно и на CLJS

alwx09:01:12

Есть же вон Git Kraken (http://www.gitkraken.com/), написанный целиком на электроне. Мне не нравится его внешний вид, да и вообще к тулам для визуального общения с Git'ом я отношусь довольно прохладно, но сам факт simple_smile

maxp09:01:18

Уважаемые, внезапный вопрос - а чем вы & < > в cljs'е искейпите?

maxp09:01:18

Ну то есть, когда к вам приходит строка невесть откуда, а вам ее надо в виде текста в html вставить.

alwx09:01:36

@maxp если я правильно понял проблему, то вот тут есть решение: https://clojuredocs.org/clojure.string/escape

alwx09:01:10

первый же пример это как раз про escape <, > и & simple_smile

maxp09:01:31

я на самом деле на нем же и остановился,

maxp09:01:16

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

maxp09:01:27

Например, раньше у меня работало аналогичное на replace() и пачке регексов, но string/escape немного быстрее работает.

potapenko17:01:52

@alwx: смотрю используешь react-native-store - вопрос, в чем профит по сравнению с обычной сериaлизацией и помещением в AsyncStore? react-native-store хранит страницы js-ные, чистые, все равно потом в clojure конвертировать нужно? А тот же поиск организовать легче на чистой clojure? Думаю сделать большую локальную базу и думаю про производительность….

potapenko17:01:49

хотя сериализция ведь тоже в json….тогда действительно особо смысла придумывать что-то смысла нет.

potapenko17:01:12

но мне кажется поиск по объектам на clojure должен быть быстрее.

artemyarulin17:01:20

@potapenko: Тоже задаюсь счас этим вопросом, не смотрел в сторону datascript?

potapenko17:01:40

ага, тоже думаю

potapenko17:01:50

там ведь реализация на clojure.

artemyarulin17:01:06

clojureScript ага

artemyarulin17:01:20

т.е. вся база в памяти + сериализация на диск

potapenko17:01:23

но все же там имутабельность, ленивость итд

potapenko17:01:44

датаскрипт думаю более правильный выбор

potapenko17:01:50

но лень изучать simple_smile

potapenko17:01:55

но чую - нужно

artemyarulin17:01:12

я просто ом-некст использую, дак там тупо атом + свой язык запросов, почти тоже самое выхожит

potapenko17:01:57

ну да, думаю профит в том что datomic потом будет понятнее.

potapenko17:01:07

мы ж full-stack simple_smile

potapenko17:01:13

написал тут маленьгую либу по стилям в RN. как напишу доки - выложу

artemyarulin17:01:36

@potapenko: у тебя на беке кста какая база?

potapenko17:01:41

несколько проектов с ней делал, как-то привык.

potapenko17:01:59

у тебя?

artemyarulin17:01:11

пока без, все на клиенте

artemyarulin17:01:26

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

potapenko17:01:34

korma понравилась, думаю может на postgres чего сделать.

artemyarulin17:01:00

неа, чота от SQL я устал simple_smile

potapenko17:01:13

миграции, фиграции

potapenko17:01:44

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

artemyarulin17:01:59

у меня до этого в приложении на IOS было SQLite, ничо так, работает шустро

alwx17:01:03

@potapenko: так ведь react-native-store и есть обертка над реактовским AsyncStorage. да, я думаю, правильным решением будет попробовать прикрутить ко всему этому datascript, но это много работы требует. пока было проще прикрутить react-native-store, поскольку он довольно простой и неплохо для мобилок подходит (имхо, вопрос производительности в случае с запуском одной копии приложения на одном девайсе особо остро не стоит, к тому же БД в мобилках обычно применяется всего лишь как кэш данных, полученных сетевым запросом)

alwx17:01:34

а datomic на бэкэнде никто не использует? simple_smile

potapenko17:01:26

Ну да, я вот исходники посмотрел как они хранят и делают фильтры и как-то не впечатлился.

potapenko17:01:40

datomic - думаю пощупать в ближайшее время.

potapenko17:01:02

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

alwx17:01:50

ну не, у них по-прежнему платно, правда, год-полтора назад они сделали-таки Datomic Pro Starter

alwx17:01:29

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

alwx17:01:36

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

alwx17:01:46

как и нравится datascript сейчас

potapenko17:01:52

у меня на сервере все пока хорошо, сильно не требуется, но вот думаю сделать offline базу, есть сумашедшая мысль дропать в json mongo и хранить это дело в git, и подгружать изменения как diff simple_smile Хочу для туризма сделать, когда пользователи много времени проводят без интернета.

potapenko17:01:31

а datascript - ага, нужно использовать, выглядит здорово.

potapenko17:01:52

Новосибирского производства, что тоже приятно.

artemyarulin17:01:14

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

artemyarulin17:01:48

есть кая-то либа и для этого, которая позволяет update-in! красиво писать, забыл уже

artemyarulin17:01:10

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

potapenko17:01:56

Устал наверное, ты вообще ранний товарищ, я засыпал как обычно в 7, а ты тут как тут, мысли про datomic сыплешь. Финляндия?

potapenko17:01:58

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

artemyarulin17:01:06

я по воскресеньям в 5 встаю и работаю до 14

potapenko17:01:21

здорово. у меня из за зимы сдвинулся график.

alwx17:01:47

ну, атом это атом, а datascript это фактически полноценная БД с entities, индексами и отношениями между entities

alwx17:01:03

кстати, пользуясь случаем порекомендую Clojure Applied — очень крутая книга из недавно выпущенных про Clojure. довольно много нюансов и много про применение Clojure в реальных приложениях. по крайней мере, явно одна из лучших книг, что я читал о Clojure https://pragprog.com/book/vmclojeco/clojure-applied

niquola18:01:31

А у меня не пошла :( треть прочитал - скучно стало

artemyarulin18:01:07

о, я думал я один такой, еле осилил до конца

alwx18:01:16

почему так? неужели стало настолько очевидно все?)

niquola18:01:09

Не то чтоб очевидно, но не однозначно и не убедительно

niquola18:01:25

Как будто парни из себя выжимали, вобщем, без вдохновения

misha21:01:35

@artemyarulin: датаскрипт ништяк, когда у тебя многоуровневая one-to-many структура данных. с ним гораздо проще и "плоско" эти данные менять и читать. в то же время с атомом ты встреваешь на бесконечные (swap! state update-in [...] f) и (-> @state (get-in [...]) (select-keys [...]))

misha21:01:38

и либо у тебя везде оно в инлайнах шумит, либо миллион одинаковых-но-несовсем функций доступа/изменений данных

misha21:01:53

а когда приходит время на сервер отправить пачку изменений - с датаскриптом проще сделать дельту изменений, из-за того, что всё хранится (условно) в векторах [id key value transaction-id].

misha21:01:59

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

misha21:01:36

а если у тебя весь стэйт – 3-5 значений, то конечно лучше/проще атом.