Fork me on GitHub
#clojure-russia
<
2015-08-25
>
maxp11:08:09

какое-то у нас затишье здесь...

maxp11:08:34

видимо все заняты и работают в поте лица.

maxp11:08:00

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

maxp11:08:02

зато 4fun

mihailt11:08:26

блин замучился с ресурсами в project.clj

:resource-path “resources”
в коде
(def service-account-key (->> "android-service-account.p12" io/resource io/file))
lein run, lein repl работает, uberjar кричит что файла нет, в если открыть jar то он там лежит что же за беда такая 😞

maxp12:08:55

а если просто в рантайме (prn io/resource "...") позвать, то что печатает?

maxp12:08:31

скобочку забыл

maxp12:08:51

If you need to slurp a file from a JAR file, don't call io/file on the result of calling io/resource, or you will get an exception that says the resource is "not a file". Instead, call slurp directly on the result of io/resource.

invizz12:08:43

https://clojurians.slack.com/archives/clojure-russia/p1440505591000009 а потом над нами все смеются 😃

maxp12:08:44

мне посрать - дол$##$%# в интернете всегда сильно больше, надо вспринимать как данность

maxp12:08:28

тут выше я еще одну букву забыл - тоже замечательный повод поржать, почему нет...

mihailt12:08:24

@maxp:

=> (prn (io/resource "android-service-account.p12"))
#object[java.net.URL 0x26b25514 "file:/Users/mihailt/Documents/fc/srv/resources/android-service-account.p12"]
nil
=> (prn (io/file (io/resource "android-service-account.p12")))
#object[java.io.File 0x16fe7f40 "/Users/mihailt/Documents/fc/srv/resources/android-service-account.p12"]
nil

mihailt12:08:24

slurp не делаю, я файл через интероп потом пользую

maxp12:08:24

есть вречатление, что у тебя def имя файла раскрывает на момент компиляции

maxp12:08:18

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

maxp12:08:28

ну там в лиспах мода read, мода eval

maxp12:08:44

гуру могут точно сказать simple_smile

maxp12:08:38

в общем, сделай вместо def defn и позови в рантайме

mihailt12:08:48

@maxp: ну jar запустился но при вызове опять валится с Not a file

maxp12:08:03

так (prn (io/resource ... )) что показывает в jar'e?

mihailt12:08:24

#object[java.net.URL 0x3c8cc7fb "jar:file:/Users/mihailt/Documents/fc/srv/target/uberjar/gunter-0.1.0-SNAPSHOT-standalone.jar!/android-service-account.p12”]

maxp12:08:07

тут показывается в корень jar'а

mihailt12:08:17

а вот если

(prn (io/file (io/resource "android-service-account.p12" )))
то сразу Exception in thread "main" java.lang.IllegalArgumentException: Not a file: jar:file:/Users/mihailt/Documents/fc/srv/target/uberjar/gunter-0.1.0-SNAPSHOT-standalone.jar!/android-service-account.p12 at http://clojure.java.io$fn__9085.invoke(io.clj:63) at http://clojure.java.io$fn__9059$G__9041__9064.invoke(io.clj:35) at http://clojure.java.io$file.invoke(io.clj:414) at gunter.app$_main.invoke(app.clj:38) at clojure.lang.AFn.applyToHelper(AFn.java:152) at clojure.lang.AFn.applyTo(AFn.java:144) at gunter.app.main(Unknown Source)

maxp12:08:03

кстати, переменная называется так - :resource-paths

maxp12:08:24

я бы на всякий случай в корень положил бы еще

mihailt12:08:25

с переменной, я здесь опечатался

mihailt12:08:34

в проекте ок

maxp12:08:56

:resource-paths ["src/main/resource"]

mihailt12:08:35

:resource-paths ["resources"]

mihailt12:08:06

ну и они соответственно не в срц

maxp12:08:52

судя по prn

maxp12:08:01

оно ищет в корне jar'а

mihailt12:08:13

ну собственно анзип jara файл там и лежит

mihailt13:08:03

вот мистика реально

maxp13:08:15

там это в корне или в resources ?

maxp13:08:22

а, вижу

maxp13:08:50

а в :resource-paths что указано?

mihailt13:08:22

:resource-paths ["resources"]

mihailt13:08:02

в другом месте есть такой код

(def default-account-data (->> "default.account.data.edn" io/resource slurp edn/read-string))

mihailt13:08:10

он работает

mihailt13:08:32

с io/file какая-то беда

mihailt13:08:57

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

maxp13:08:30

кстати, а почему там ->>

maxp13:08:34

а не ->

maxp13:08:59

зается мне не зря они в документации указали, что на надо io/file на resource напускать

maxp13:08:12

может где-то тут собака порылась...

maxp13:08:27

надо призвать гуру в чатег!

mihailt13:08:16

вот slurp работает

mihailt13:08:31

жесть какая-то

maxp13:08:06

если правильно помню, slurp с урлями нормально работает

maxp13:08:11

а io/file нет

maxp13:08:46

кстати да

maxp13:08:59

тут есть as-url и as-file

maxp13:08:12

причем resource возвращает url

mihailt13:08:11

as-file попробовал таже беда

maxp13:08:53

смысл в том, что из файла можно сделать урль, а наоборот не всегда

maxp13:08:12

а ты что потом делаешь с этим файлом?

maxp13:08:30

получается, что его надо вычитать, а потом делать что надо

mihailt13:08:52

потом так

mihailt13:08:57

(defn google-play-api-credential []
  (let [credential
        (doto (GoogleCredential$Builder.)
          (.setTransport http-transport)
          (.setJsonFactory json-factory)
          (.setServiceAccountId @service-account-id)
          (.setServiceAccountPrivateKeyFromP12File service-account-key)
          (.setServiceAccountScopes (seq [@service-account-scope])))]
    (.build credential)))

maxp13:08:29

стрим надо делать

maxp13:08:50

InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in));

maxp13:08:03

логично, в общем, если приглядеться

maxp13:08:49

на совсем худой конец можно временный файлик сгородить

maxp14:08:07

и как? получилось?

maxp14:08:34

на английском языке оказывется тебе то же самое рассказали

maxp14:08:39

оказывается

mihailt14:08:26

пока нет

mihailt14:08:25

туплю походу

maxp14:08:36

если коротко, то "файл" откуда-то из ресурса это не то, что файл в файловой системе

maxp14:08:47

из урля можно взять стрим и почитать его

maxp14:08:07

в общем случае взять из урла файл нельзя.

maxp14:08:26

из ресурса дают урль.

maxp14:08:32

все логично.

mihailt14:08:09

типо проверили есть ли файл ключ2, если нет то читаем стрим и пишем?

maxp14:08:45

там нет понятия файл

maxp14:08:00

из ресурса можно попросить некий урль as stream

maxp14:08:03

и почитать его

maxp14:08:30

но не получить, как объект файл фалойвой системы

maxp14:08:37

я так понимаю в этом затык.

maxp14:08:21

потому что в общем случае ресурс класс-пасса может лежать фиг гда

mihailt16:08:20

@maxp: как-то так по итогу:

(defn resource->file
  [file-name & {:keys [prefix]
                :or {prefix (str (java.util.UUID/randomUUID))}}]
  (let [tmp (java.io.File/createTempFile prefix nil)
        _ (.deleteOnExit tmp)]
    (io/copy (-> file-name io/resource io/input-stream) tmp)
    tmp))

niquola17:08:09

Блин, попробовал cljs по серьёзнее ;) ангуляр в топку

gordon17:08:33

я так и не понял как люди на ангуляре пишут( слишком тупой(

gordon17:08:29

как-то взял реакт и наклепал весь интерфейс, если и были какие косяки, то реакт сам мне сказал, что я не так делаю

dottedmag17:08:42

Ангулар ужасен безотносительно react.

konukhov19:08:23

C ангуляром такая штука – понимаешь, что он жутко уродлив – эти костыли с [“$scope”, function($scope) {}], куча непонятной магии и т.д. Но с ним можно очень быстро сделать приличный интерфейс, если разобраться. К реакту голому пока страшно подходить. А вот cljs + reagent прям отлично пошли – написал немного clojure (+ hiccup-шаблоны очень радуют), и у тебя работающий фронтенд.

delaguardo19:08:50

https://github.com/aaronc/freactive крайне рекомендую посмотреть если не хочется за собой тянуть React

gordon19:08:07

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

konukhov19:08:49

ага, я тоже на кофе джс пишу обычно. говорят, что с es6 кофе не нужен больше. ну да, и все что я написал – с позиции человека, который больше бекендом занимается simple_smile надо-надо добраться и до голого реакта, и до flux и тд.

skovorodkin21:08:24

Подскажите, пожалуйста. Нет опыта ни с clojure, ни с cljs. Настроил у себя в проекте webpack, использую загрузчик babeljs для es6. Думал, что так же легко можно будет подключить cljs, но ничего по этому поводу не нашел. Возможно ли вообще постепенное внедрение cljs в проект? Спасибо.