Fork me on GitHub
#clojure-russia
<
2016-11-08
>
be903:11:11

если писать на Clojure на Фортране, а на руби на руби, то всё понятно 🙂

seryh04:11:55

8 тыщ строк, это же мелкий проект совсем

misha06:11:41

@seryh ну как сказать, "мелкий", у меня, к примеру, дофигища всего на сервере, веб юае и в айос аппликейшене, и 8к до сих пор нет в сумме. И это с учетом того, что там тыщ 5 почти - реактовские компоненты – самый loc-прожорливый код. Я бы это всё и в 30 kloc питона не вписал бы, наверное

misha06:11:48

а в джаве 30к одних только геттеров было бы kappa

seryh06:11:07

у меня в одном старом проекте только на фронте (backbonejs) 51k строк. и это новосибирский провинциальный сайтик. но все канеш относительно.

seryh06:11:11

в любом случае интересно будет послушать почему они на руби переехать решили. последние года два о руби много критики слышал. странное решение так то

misha06:11:32

ты ж жс и кложа локи не ровняй

seryh07:11:33

близится вот рефакторинг этого легаси. думаю на clojurescript с реагентом переехать все это дело

misha07:11:02

перепишешь за 2-3 страницы kappa

artemyarulin07:11:27

может народ не сумели найти - ну или первый прототип всегда же Г выходит, язык не важен 🙂

rmuslimov07:11:37

51k это что то не то

a.espolov07:11:42

@misha: не приходилось решать задачу бекграунд сервисов(ios,andoid) для react native?

rmuslimov07:11:55

это ты наверное накопипастил чего нибудь

seryh07:11:20

@laseray 5 лет костылей под постоянно меняющиеся бизнес процессы. и реализацию хотелок под каждого партнера

seryh07:11:36

упс промахнулся

misha07:11:56

@a.espolov это каких? "альт-табнуться", и чтоб работало? пока нет

a.espolov07:11:54

@misha да к примеру геолокация и работа со звонками

misha07:11:57

вангую, что нужно написать нативный модуль "просто"

a.espolov07:11:38

а как в нем работать со стораджем который cljsrn app юзает?

misha07:11:56

ну смотря что за сторадж

misha07:11:50

ты ж можешь поднять вторую жс машину, и так же ходить в асинк-сторадж

misha07:11:45

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

misha07:11:16

у меня в нативном модуле в отдельной жс машине живет датаскрипт, который с сервером синкается

artemyarulin07:11:53

ты прям JavaScriptCore поднимал еще один или RCTBridge создал еще один @misha ?

misha07:11:03

и по карявому асинк апи в него ходит основной РН тред

misha07:11:16

еще 1 jscore, да

misha07:11:33

ща гляну

artemyarulin07:11:04

т.е. там чисто datascript у тебя получается, без RN?

misha07:11:02

#import "DatascriptServer.h"
@implementation DatascriptServer

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD( execute:(NSString *)cljsFnName
                  callback:(RCTResponseSenderBlock)callback)
{...}

RCT_EXPORT_METHOD(executeWithArgs:(NSString *)cljsFnName
                             args:(NSString *)arg
                         callback:(RCTResponseSenderBlock)callback)
{...}

misha07:11:39

остальное - чисто заинитить жскор и датаскрипт в нем, + восстановить базу из файла/с сервера

misha07:11:50

но я не знаю ответить "да" или "нет" на твой вопрос kappa

misha07:11:46

#import <JavaScriptCore/JSContext.h>
#import <JavaScriptCore/JSValue.h>
#import "RCTBridgeModule.h"

@interface DatascriptServer : NSObject <RCTBridgeModule>

@property (atomic, strong) dispatch_queue_t interopQ;
@property (atomic, strong) dispatch_queue_t persistQ;
@property (atomic, strong) NSString *storageFilePath;
@property (atomic, strong) JSContext *context;
@property (atomic, strong) JSValue *ns;

- (instancetype)init;

@end

artemyarulin07:11:51

заопенсорси и я сам потом отвечу!:)

misha07:11:20

дохачу сначала, потом заопенсоршу opieop

misha07:11:10

пока что - очень карявое апи. хочу как-то кошерно (кошернее) сделать, а потом показывать.

misha07:11:31

а без апи - там ниче такого нет, всё вон наверху накопипащено

artemyarulin07:11:02

и чо как в итоге перформанс? не зря все это? Идея то классная как можно куски которые жрут много ускорить

misha07:11:43

сделать жскор, прочитать в нем отдельно скомпиленый cljs файл с базой, и парой функций, и заинитить в AppDelegate.m

misha07:11:50

ваще незря

misha07:11:02

ну оверхед в дев-моде 50мс на поход туда-назад между жс-корами

misha07:11:41

но в сумме с перелистыванием страниц на юае - ваще годится

misha07:11:05

апи: string fn-name ;; которая определена в отдельном .cljs файле базы, типа pull-many string fn-args ;; запакованные транзитом аргументы

artemyarulin07:11:54

а на ведроиде ты не смотрел апи? там тоже свой жскор?

misha07:11:21

ну и слой утилитных функций на "клинте", поверх промисов

misha07:11:30

не, ведроид не смотрел вообще пока что

misha07:11:14

у меня и так ласты склеиваются по всему стеку раздупляться. да и ведра потестировать нет opieop

artemyarulin07:11:00

о да, зато фуллстек 🙂

misha07:11:58

(def ReactNative (js/require "react-native"))
(def ^:private NativeModules (.-NativeModules ReactNative))
(def ^:private DSS (.-DatascriptServer NativeModules))

(defn- callback [on-success on-error]
  (fn [err result]
    (let [e (or on-error   js/console.error)
          s (or on-success js/console.log)]
      (if err
        (e err)
        (s (t/from-string result))))))

(defn- execute [on-success on-error fn-name & args]
  (if (nil? args)
    (.execute         DSS fn-name (callback on-success on-error))
    (.executeWithArgs DSS fn-name (transit/to-string args) (callback on-success on-error))))

misha07:11:09

типа того

misha07:11:54

кароче там стыдобы много, но идея такая: - дс в отдельном жс-коре, с парой функций-обертов вокруг дс апи (q, pull, pull-many, etc.) - вызов ф-й через реактовское асин-апи - запаковка/распаковка аргументов транзитом

artemyarulin07:11:22

а чо транзит?

misha07:11:23

а чо б и не транзит? kappa

a.espolov07:11:25

@misha я правильно понял у тебя все таки есть сервис(тот который с беком общается)?

misha07:11:28

еще синхронизация с сервером не дописана/отлажена/оттещена, потому "нет"

a.espolov07:11:41

“ты ж можешь поднять вторую жс машину, и так же ходить в асинк-сторадж”

misha07:11:46

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

a.espolov07:11:52

я так понял у тебя так

a.espolov07:11:03

а у тебя код под рукой?

a.espolov07:11:14

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

a.espolov07:11:23

свернув апу на мобиле

misha07:11:40

неа, не под рукой, и сервер не билдится давненько kappa

misha07:11:14

вообще, это уже не территория cljs

misha07:11:32

и я даже не уверен, что всё еще территория RN

misha07:11:04

@artemyarulin так а как без транзита? тебе ж надо передать аргументы из одного жскора в другой. edn будет медленнее, особенно для упаковки результатов pull-many

artemyarulin07:11:41

да я хз, edn/транзиты/жсоны, 100500 вариантов нынче - вот интересно просто почему транзит. Я если честно путаюсь уже в них

a.espolov07:11:40

@artemyarulin так вроде ж не сложно

artemyarulin07:11:52

@a.espolov Единственное что могу сказать про бекграунд - RN работает, дергать его можно, я это делаю через свою обертку https://github.com/artemyarulin/react-native-eval

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if ([providerClassName isEqualToString:@"EWSProvider"])
    {
        ExecutorHandler executor = [JSEnvironment executorWithBridge:[JSEnvironment bridgeWithURL:[JSLoader mostRecentAppURL]]];
        executor(@"window.wmr.ews_mail_checker.checkMail",
                 @[providerSettings[@"ewsURL"],
                   account.login,
                   account.password,
                   @(0)],
                 ^(NSString* error, NSDictionary* resp) {
       // handle new mail
}
}

artemyarulin07:11:38

но это опять же тебе нужно смотреть - какого рода ты хочешь background жобу делать. Геолокейшен там одно, background fetch там другое

a.espolov07:11:42

@artemyarulin так бекграунд живет этот пока приложение свернуто?

misha07:11:54

ну edn - вялый на фоне транзита, json - вообще kappa

artemyarulin07:11:29

ага https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html ну оно конечно не живет в бекграунде, иОС типа умный и запускает твой коллбек раз в N минут

artemyarulin07:11:01

в среднем раз в пол часа я бы сказал. На ведроиде хз - вроде можно сервис сделать чтоб 100% времени висел и жрал батарейку 🙂

a.espolov07:11:19

да-да все так

misha07:11:23

(void (^)(UIBackgroundFetchResult)) dafuq

artemyarulin07:11:50

на свифте норм, глаза не вытекают 🙂

misha08:11:31

(^) - оберег "на 6-digits зп"

artemyarulin08:11:32

I like this one. Very elegant сука не могу каждый раз ржу 😄 Простите

savelichalex08:11:51

ну так в этом вроде и есть преимущество RN перед похожими инструментами, всегда можешь спустится в нативку и делать там что хочешь)

misha08:11:12

даже не знаю, что больнее: количество строк в ответах, или горизонтальные скроллы в них

a.espolov08:11:18

@savelichalex а где нельзя спуститься до нативки?

savelichalex08:11:33

phonegap, cordova

savelichalex08:11:56

native script еще

a.espolov08:11:32

на сколько я помню phonegap, cordova это одно и тоже и там можно из js дергать нативный код и из нативного js

a.espolov08:11:10

только это все вебвью дает(

turtle12:11:53

Cordova это обопенсурсенный phonegap. И что-то в них грустно всё.

artemyarulin13:11:34

а чо кста кто-нить слыхал про native script? Даже полу-метрвый фонган/кордова упоминается чаще