u-ryo's blog

various information for coding...

Author: U-ryo

Groovy Grape Fails

| Comments

時々、「全く同じgroovy scriptなのにあるマシンでだけ 起動に失敗する」ことがあります。 error messageはcaseによりますが、例えば直近では以下のようなものでした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ groovy webpush.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: Error grabbing Grapes -- [download failed: com.google.guava#guava;19.0!guava.jar(bundle)]

java.lang.RuntimeException: Error grabbing Grapes -- [download failed: com.google.guava#guava;19.0!guava.jar(bundle)]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
        at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77)
        at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:59)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:238)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:250)
        at groovy.grape.GrapeIvy.getDependencies(GrapeIvy.groovy:464)
   :
   :

要するに「guava-19.0.jarのdownloadに失敗した」と。 ~/.groovy/grapes/com.google.guava/guava/を見ると、 確かに他のlibrariesのようにjars directoryがありませんし、 当然jar fileもありません。 じゃぁっていうんで、自分でguava-19.0.jarを落としてきて、 jars/作ってその下に置いても、同じ結果です。 Groovyが悪いのかJavaが悪いのかGrapeが悪いのか設定が悪いのか versionが悪いのか、何なのか全然分かりません。 普通に動くマシンでのJava/Groovyとversionを合わせてもダメ、 Grapeする各libraryのversionを上げてもダメ、 Guava 19.0を明示的に@Grabに入れてもダメ、 Groovy - Grab - download failedを見て~/.groovy以下や~/.groovy/grapesを削除してもダメ、 と途方に暮れました。 いつもは面倒なので諦めて、 その動くマシンでやっていつのですけれども、 今回は粘って原因究明してみました。

結局、以下のどちらかの方法で立ち上がるようになりました。

  1. ~/.groovy/grapes/com.google.guava/guava/jarsではなく~/.groovy/grapes/com.google.guava/guava/bundlesにして、その下に落としてきたguava-19.0.jarを置く
  2. 他の多くのlibrariesと同様に~/.groovy/grapes/com.google.guava/guava/jarsに落としてきたguava-19.0.jarを置き、~/.groovy/grapes/com.google.guava/guava/ivy-19.0.xml<publications>下の<artifact name="guava" type="bundle" ext="jar" conf="master"/>type attributeをbundleからjarにする

上手く行っていたマシンでは、 ~/.groovy/grapes/com.google.guava/guava/bundlesが出来ており、 その下にguava-19.0.jarもフツーにありました。 上手く行かないマシンではなぜbundlesが出来ないのか、は未だ不明ですが、 取り敢えず前に進める方法がわかったので記しています。

あぁ、あと、このようにGrapeに失敗すると、 ~/.groovy/grapes/以下にresolved-caller-all-caller-working73.propertiesresolved-caller-all-caller-working73.xmlといったfilesが澱のように溜まっていくので、都度削除した方がいいです。

Push Notification From Command Line by Ntfy

| Comments

コマンドラインからPush通知が出来るというのでやってみました。 (Linuxのコマンドラインやスクリプトからスマホにプッシュ通知する。(ntfyというツールの紹介)) PushBulletを使ってみました。 ChromeやFirefoxだとextension、 スマホだとアプリを入れます。

1
2
sudo apt install python-pip
pip install ntfy

ntfyを入れ、~/.ntfy.ymlにPushBulletのaccess_tokenを入れ、 ~/.local/bin/ntfy -t 'Title' send 'notification contents' とすると、送れました。 スマホ側の音とか振動は、アプリでの設定にて調整可能です。

最初よくわかってなかったのですが、 PushBulletのアプリを入れると、 電話帳やSMS(Short Message Service)もぶっこ抜いてくるんですね。 それと知らずにSMS送ってしまい、相手に不審がられてしまいました。

CSV Download on Spring Boot REST

| Comments

Spring BootでCSV downloadを実現するのに、 Spring MVC で CSV をダウンロードさせるを参考にしました。 要するに、

  • compile "com.fasterxml.jackson.dataformat:jackson-dataformat-csv" in build.gradle
  • Bean classの各fieldに@JsonProperty
  • field出力順を制御したいので@JsonPropertyOrder({"login", "filename",...})
  • CsvMapper mapper = new CsvMapper();してCsvSchema schema = mapper.schemaFor(SomeBean.class).withHeader();してreturn mapper.writer(schema).writeValueAsString(beans);
  • compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"を入れて@JsonFormat(pattern="yyyy/MM/dd HH:mm:ss")してmapper.registerModule(new JavaTimeModule());すると、ZonedDateTimeを如意に表示できる?Formatting Java Time with Spring Boot using JSON