JVM系のソフトウェアをSDKMANで管理する

はじめに

不勉強なもので、JVM系の言語やツールを管理しやすくするSDKMANというツールの存在をつい最近知りました。 インストールやアップデート、複数のバージョンの切り替えなどをsdkというコマンドで扱えるようです。 この辺は悩みの種になりやすいところなので使ってみることにしました。

SDKMANインストール

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh" 
$ sdk version
SDKMAN 5.7.4+362

使い方

扱えるソフトウェア一覧

$ sdk list
================================================================================
Available Candidates
================================================================================
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help

--------------------------------------------------------------------------------
Ant (1.10.1)                                             https://ant.apache.org/

Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
tasks.

                                                               $ sdk install ant
--------------------------------------------------------------------------------
AsciidoctorJ (2.1.0)                                     http://asciidoctor.org/

AsciidoctorJ is the official library for running Asciidoctor on the JVM. Using
AsciidoctorJ, you can convert AsciiDoc content or analyze the structure of a
parsed AsciiDoc document from Java and other JVM languages.

                                                      $ sdk install asciidoctorj
--------------------------------------------------------------------------------
(略)

特定のソフトウェアのインストール候補

$ sdk list java
================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 13.0.1.j9    | adpt    |            | 13.0.1.j9-adpt      
               |     | 13.0.1.hs    | adpt    |            | 13.0.1.hs-adpt      
               |     | 12.0.2.j9    | adpt    |            | 12.0.2.j9-adpt      
               |     | 12.0.2.hs    | adpt    |            | 12.0.2.hs-adpt      
               |     | 11.0.5.j9    | adpt    |            | 11.0.5.j9-adpt      
               |     | 11.0.5.hs    | adpt    |            | 11.0.5.hs-adpt      
               |     | 8.0.232.j9   | adpt    |            | 8.0.232.j9-adpt     
               |     | 8.0.232.hs   | adpt    |            | 8.0.232.hs-adpt     
 Amazon        |     | 11.0.5       | amzn    |            | 11.0.5-amzn         
               |     | 8.0.232      | amzn    |            | 8.0.232-amzn        
 Azul Zulu     |     | 13.0.1       | zulu    |            | 13.0.1-zulu         
               |     | 12.0.2       | zulu    |            | 12.0.2-zulu         
               |     | 11.0.5       | zulu    |            | 11.0.5-zulu         
               |     | 10.0.2       | zulu    |            | 10.0.2-zulu         
               |     | 9.0.7        | zulu    |            | 9.0.7-zulu          
               |     | 8.0.232      | zulu    |            | 8.0.232-zulu        
               |     | 7.0.242      | zulu    |            | 7.0.242-zulu        
               |     | 6.0.119      | zulu    |            | 6.0.119-zulu        
 Azul ZuluFX   |     | 11.0.2       | zulufx  |            | 11.0.2-zulufx       
               |     | 8.0.202      | zulufx  |            | 8.0.202-zulufx      
 BellSoft      |     | 13.0.1       | librca  |            | 13.0.1-librca       
               |     | 12.0.2       | librca  |            | 12.0.2-librca       
               |     | 11.0.5       | librca  |            | 11.0.5-librca       
               |     | 8.0.232      | librca  |            | 8.0.232-librca      
 GraalVM       |     | 19.3.0.r11   | grl     |            | 19.3.0.r11-grl      
               |     | 19.3.0.r8    | grl     |            | 19.3.0.r8-grl       
               |     | 19.2.1       | grl     |            | 19.2.1-grl          
               |     | 19.1.1       | grl     |            | 19.1.1-grl          
               |     | 19.0.2       | grl     |            | 19.0.2-grl          
               |     | 1.0.0        | grl     |            | 1.0.0-rc-16-grl     
 Java.net      |     | 14.ea.26     | open    |            | 14.ea.26-open       
               | >>> | 13.0.1       | open    | installed  | 13.0.1-open         
               |     | 12.0.2       | open    |            | 12.0.2-open         
               |     | 11.0.5       | open    |            | 11.0.5-open         
               |     | 10.0.2       | open    |            | 10.0.2-open         
               |     | 9.0.4        | open    |            | 9.0.4-open          
               |     | 8.0.232      | open    |            | 8.0.232-open        
 SAP           |     | 12.0.2       | sapmchn |            | 12.0.2-sapmchn      
               |     | 11.0.4       | sapmchn |            | 11.0.4-sapmchn      
================================================================================
Use the Identifier for installation:

    $ sdk install java 11.0.3.hs-adpt
================================================================================

インストール

まずはJava。

$ sdk install java 13.0.1-open

Downloading: java 13.0.1-open

In progress...

######################################################################################################################################################### 100.0%

Repackaging Java 13.0.1-open...

Done repackaging...

Installing: java 13.0.1-open
Done installing!

Setting java 13.0.1-open as default.

$ java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

ScalaとKotlinも。

$ sdk install kotlin 1.3.61
$ sdk install scala 2.13.1
$ sdk current

Using:

java: 13.0.1-open
kotlin: 1.3.61
scala: 2.13.1

複数のバージョンの使い分け

JDKをもう1種類インストールしてみる。

$ sdk install java 12.0.2-open

Downloading: java 12.0.2-open

In progress...

######################################################################################################################################################### 100.0%

Repackaging Java 12.0.2-open...

Done repackaging...

Installing: java 12.0.2-open
Done installing!

Do you want java 12.0.2-open to be set as default? (Y/n): Y

Setting java 12.0.2-open as default.

こっちをデフォルトにしますか?という質問にYと答えたので12.0.2-openがデフォルトになりました。

$ sdk list java
================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 13.0.1.j9    | adpt    |            | 13.0.1.j9-adpt      
               |     | 13.0.1.hs    | adpt    |            | 13.0.1.hs-adpt      
               |     | 12.0.2.j9    | adpt    |            | 12.0.2.j9-adpt      
               |     | 12.0.2.hs    | adpt    |            | 12.0.2.hs-adpt      
               |     | 11.0.5.j9    | adpt    |            | 11.0.5.j9-adpt      
               |     | 11.0.5.hs    | adpt    |            | 11.0.5.hs-adpt      
               |     | 8.0.232.j9   | adpt    |            | 8.0.232.j9-adpt     
               |     | 8.0.232.hs   | adpt    |            | 8.0.232.hs-adpt     
 Amazon        |     | 11.0.5       | amzn    |            | 11.0.5-amzn         
               |     | 8.0.232      | amzn    |            | 8.0.232-amzn        
 Azul Zulu     |     | 13.0.1       | zulu    |            | 13.0.1-zulu         
               |     | 12.0.2       | zulu    |            | 12.0.2-zulu         
               |     | 11.0.5       | zulu    |            | 11.0.5-zulu         
               |     | 10.0.2       | zulu    |            | 10.0.2-zulu         
               |     | 9.0.7        | zulu    |            | 9.0.7-zulu          
               |     | 8.0.232      | zulu    |            | 8.0.232-zulu        
               |     | 7.0.242      | zulu    |            | 7.0.242-zulu        
               |     | 6.0.119      | zulu    |            | 6.0.119-zulu        
 Azul ZuluFX   |     | 11.0.2       | zulufx  |            | 11.0.2-zulufx       
               |     | 8.0.202      | zulufx  |            | 8.0.202-zulufx      
 BellSoft      |     | 13.0.1       | librca  |            | 13.0.1-librca       
               |     | 12.0.2       | librca  |            | 12.0.2-librca       
               |     | 11.0.5       | librca  |            | 11.0.5-librca       
               |     | 8.0.232      | librca  |            | 8.0.232-librca      
 GraalVM       |     | 19.3.0.r11   | grl     |            | 19.3.0.r11-grl      
               |     | 19.3.0.r8    | grl     |            | 19.3.0.r8-grl       
               |     | 19.2.1       | grl     |            | 19.2.1-grl          
               |     | 19.1.1       | grl     |            | 19.1.1-grl          
               |     | 19.0.2       | grl     |            | 19.0.2-grl          
               |     | 1.0.0        | grl     |            | 1.0.0-rc-16-grl     
 Java.net      |     | 14.ea.26     | open    |            | 14.ea.26-open       
               |     | 13.0.1       | open    | installed  | 13.0.1-open         
               | >>> | 12.0.2       | open    | installed  | 12.0.2-open         
               |     | 11.0.5       | open    |            | 11.0.5-open         
               |     | 10.0.2       | open    |            | 10.0.2-open         
               |     | 9.0.4        | open    |            | 9.0.4-open          
               |     | 8.0.232      | open    |            | 8.0.232-open        
 SAP           |     | 12.0.2       | sapmchn |            | 12.0.2-sapmchn      
               |     | 11.0.4       | sapmchn |            | 11.0.4-sapmchn      
================================================================================
Use the Identifier for installation:

    $ sdk install java 11.0.3.hs-adpt
================================================================================

13.0.1-openと12.0.2-openがインストールされていて、デフォルトが12.0.2-openになっていることが分かります。

$ java -version
openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)

確かに12.0.2が使われます。これを13.0.1-openに切り替えてみます。

$ sdk default java 13.0.1-open

Default java version set to 13.0.1-open

$ java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

どのように管理されているのか?

このまま使うのは気持ち悪いので、各ソフトウェアがどういう風にインストールされているのかを確認してみます。

$ which java
/home/myuser/.sdkman/candidates/java/current/bin/java

どうやらホームディレクトリの.sdkman以下にインストールされているようです。
ディレクトリとファイルの構成は以下の通り。

$ cd ~/.sdkman
$ ls
archives  bin  candidates  etc  ext  src  tmp  var
$ ls archives/
java-12.0.2-open.zip  java-13.0.1-open.zip  kotlin-1.3.61.zip  scala-2.13.1.zip
$ ls bin
sdkman-init.sh
$ find etc
etc
etc/config
$ cat etc/config 
sdkman_auto_answer=false
sdkman_auto_selfupdate=false
sdkman_insecure_ssl=false
sdkman_curl_connect_timeout=7
sdkman_curl_max_time=10
sdkman_beta_channel=false
sdkman_debug_mode=false
sdkman_colour_enable=true
$ ls src
sdkman-availability.sh  sdkman-current.sh      sdkman-flush.sh    sdkman-list.sh     sdkman-path-helpers.sh  sdkman-update.sh   sdkman-utils.sh
sdkman-broadcast.sh     sdkman-default.sh      sdkman-help.sh     sdkman-main.sh     sdkman-selfupdate.sh    sdkman-upgrade.sh  sdkman-version.sh
sdkman-cache.sh         sdkman-env-helpers.sh  sdkman-install.sh  sdkman-offline.sh  sdkman-uninstall.sh     sdkman-use.sh
$ find var
var
var/delay_upgrade
var/broadcast_id
var/version
var/broadcast
var/candidates
$ cat var/version 
5.7.4+362
$ cat var/candidates 
ant,asciidoctorj,bpipe,ceylon,crash,cuba,cxf,gaiden,glide,gradle,grails,groovy,groovyserv,infrastructor,java,jbake,kotlin,kscript,lazybones,leiningen,maven,micronaut,sbt,scala,spark,springboot,sshoogr,vertx,visualvm

管理対象のソフトウェアは.sdkman/candidatesの下にありました。

$ ls candidates/
java  kotlin  scala
$ ls -l candidates/java
合計 8
drwxr-xr-x 8 myuser myuser 4096 12月 13 15:25 12.0.2-open
drwxr-xr-x 8 myuser myuser 4096 12月 13 15:12 13.0.1-open
lrwxrwxrwx 1 myuser myuser   48 12月 13 15:29 current -> /home/myuser/.sdkman/candidates/java/13.0.1-open
$ ls -l candidates/kotlin
合計 4
drwxr-xr-x 5 myuser myuser 4096 11月 26 09:15 1.3.61
lrwxrwxrwx 1 myuser myuser   45 12月 13 15:22 current -> /home/myuser/.sdkman/candidates/kotlin/1.3.61
$ ls -l candidates/scala
合計 4
drwxrwxr-x 6 myuser myuser 4096  9月 18 18:23 2.13.1
lrwxrwxrwx 1 myuser myuser   44 12月 13 15:23 current -> /home/myuser/.sdkman/candidates/scala/2.13.1

ソフトウェアの種類ごとにディレクトリを分けてその下に複数のバージョンを展開し、シンボリックリンクでcurrentを示す、という割とシンプルな構成でした。

おわりに

言語処理系以外でも、ant、Maven、sbt等の周辺ツールもSDKMANで管理できます。仕組みもシンプルで使い勝手良さそうです。開発環境で活用していきたいと思います。

画像最適化、してますか?


こんにちは。デザイナーのMです。

突然ですが、皆さんは画像最適化してますか?(唐突
私はしています。

弊社ではサイトの制作などをさせて頂く機会が多々ありまして、制作の最終段階であるサーバーアップの前に、サイト内で使用する画像を圧縮して最適化するというフローがあります。

Webサイトのスマホ閲覧の割合がPCと半々、場合によってはPCの閲覧比率を超えることも珍しくなくなってきたので、通信容量(いわゆる”ギガ”)を少なくして、サイトを高速に表示させることが必須となっています📱

そこで今回は、普段使用している画像最適化ツールを紹介したいと思います。

TinyPng


https://tinypng.com/

「パンダのやつ」と僕は呼んでいます🐼
けっこう昔からあるので、かなり有名なオンライン画像圧縮ツールだと思います。
サイトを見て頂く通り、パンダが画像を圧縮してくれます。
Chromeのブックマークバーに突っ込んでるので、ブラウザ上からサクッと圧縮できる手軽さが便利です。
一気に20枚、または上限5MBまでの画像ファイル(jpg/png)を圧縮可能です。
gifよりきれいなアニメーションができる、Animated PNG(APNG)にも対応しています。
ページの下の方でパンダがぬるぬる手を振っていますね👋

対応ファイル形式:jpg / png / APNG

jpeg.io


https://www.jpeg.io/

こちらのサービスは、単純に画像を圧縮するというわけではないのですが、様々な形式の拡張子のファイルを一括でjpgに変換して最適化してくれるツールです。
png形式の画像はjpg形式に比べてファイルサイズが大きくなることがあるので、こちらを利用してjpgに変換することにより容量の削減になることもあります。特に写真を利用している素材とかですね📷
他にもpsdでワイヤーやカンプを作成して画像として書き出す際にも、こちらを使えばpsdからそのままjpgを作成してくれるので便利です。

対応ファイル形式:jpg / png / gif / svg / bmp / eps / psd / tiff / WebP

Squoosh


https://squoosh.app/

Googleが開発したオンライン画像圧縮ツールです。
サイトにアクセスして、画像をドラッグ&ドロップするとプレビュー編集画面に遷移します。
この画面上で画質や圧縮形式などを設定することができます。
また、画面の左右で圧縮前と圧縮後のプレビューを見比べることもできるので保存後のイメージを目で確認しながら調整することができます。めっちゃ便利👀
ただ、現状では画像1枚ずつしか編集することができないので、一括で圧縮をしたい場合には向いていません🙅‍♂️
私の場合は、画質を極力落とさずに綺麗な見た目のまま写真の容量を圧縮したいときなどのシビアな圧縮条件が求められる場合に利用することが多いです(あまりないですがw
ちなみにリサイズも同時にできるので、さらに容量圧縮したい場合などにも使えます。

対応ファイル形式 : jpg / JPEG2000 / mozjpeg / png / gif / pdf / bmp / tiff / WebP

ImageOptim(Mac向けアプリ)


https://imageoptim.com/

ImageOptimは、Mac向けの画像圧縮専用アプリです。
ブラウザからいつでも圧縮はできませんが、いつも利用しているPCにインストールしておけばすぐに使うことができます。
私はいつもこのアプリを使って画像を最適化することが多いです。
アプリをインストールして、Finderで画像を右クリックすると「ImageOptimize」という項目が表示されます。
その項目をクリックすると自動でアプリが起動して、画像最適化を開始してくれます。便利!
容量制限なしで、複数選択もできるのでバシバシ使用することができます🤘

ファイル形式:jpg / png / gif

ReSizer(iOSアプリ)


https://apps.apple.com/jp/app/jp/id1388705112

弊社が開発したiOS向けの画像リサイズアプリです。
直感的なUIで画像を好きなサイズにリサイズ、画質を選択することで容量も最適化することができます。
カメラロールからの一括選択にも対応。画像に関するExif情報の確認や削除もこのアプリからできます。
スマホからブログを書く際や、ストレージの容量を確保したいときなどに大変重宝するアプリなのでぜひ一度インストールしてみてください✨



ぜひ今回ご紹介したツールを利用して画像の最適化をしてみましょう!
楽しく快適なインターネットライフを🥺

冬太りをなんとかしたいという話

こんにちわ。
リエです。

皆さん、お正月はどんな風に過ごされましたか?
私は完全に寝正月でした(^q^)
身体を全く動かさなかったのにいつも以上に食べまくりました。
あっ、でもお餅は珍しく1個しか食べなかったな。

久しぶりに姉夫婦とも会えたので楽しい時間を過ごすことができました。
※余談ですが、うちの愛犬はいつも怪獣みたいなのに義兄の前ではめっちゃおとなしくておりこうワンコでびっくりしました。姉が体調悪いんかなと心配するほどおとなしかったです。(病院とかトリミングの時もこんな感じです。こんな状態の愛犬のことをリエ家ではよそいきワンコと呼んでいます)
まぁ、姉夫婦が帰ったらいつも通りの怪獣ワンコに戻りましたが。

12月も美味しいものをたくさん食べてお正月もダラダラして、そんな生活を続けてたらそりゃ太ります。うん、わかっていました。
でも現実に目を背けていたら、持っていたタイトめなスカートがきつくてファスナーが上がらなくなりました。これは完全にアウト。やばいです。

ということでダイエットを始めることにしました。
ある程度は好きなものを食べたいしきつい運動はしたくないので、ゆるい食事制限と軽い運動というダイエットで。短期間で戻すのではなく長期戦でね。

運動はお家でできるものがよかったので去年になんとなく買って放置していたこちらの本をメインにして、

後は「痩せすぎ注意ダンス」をやっています。

10分間のダンスですが、想像以上にきつい!このダンスをした次の日は必ず筋肉痛になります。本気で痩せたかったら毎日1〜3回やるといいそうですが、私は無理なので週1〜2回やっております。(甘いって言わないで)

3日坊主にならないように、毎日何をしたかをノートに記録しています。
無理せずやるのがモットーなので何もしない日ももちろんあります。
今の所、筋トレが週3、ダンスが週1〜2回という割合です。

体重は測っていないのでわかりませんが、スカートが履けるくらいにはサイズは戻りました。
お仕事もデスクワークでほぼ1日座りっぱなしなので、ダイエットが終わっても定期的に運動は続けていきたい次第でございます。

とこの記事を書いたのは1月中旬。
2月現在、リバウンドしつつあります。。
ダイエット前、体重を測ってなくてこの前測ったらなんと去年の10月から4キロも増えていました。やばいやばいやばい。
全体的にムチムチしてきたなと思っていましたが、4キロも増えたらそうなるわ。これはまじでやばい。
ゆるくダイエットとか言ってた自分を殴りたい。
定着する前になんとか戻すよう頑張りたいと思います。

次いってみよー!

あけおめことよろ。
今年もすでに一ヶ月終わりかけていることに気づいたマエダです。

年始は毎年恒例えべっさんにメンバーみんなでご祈祷に行って参りました。
そして、書き初めをしてSlackで共有し抱負を述べるランチ会を実施しました。
※ 例年もっと早くブログ書いてたのに忘れていました;

昨年の書き初め記事はこちら。

今年の僕の書き初めはこちら。

私たちの普段馴染みのあるUIでアプリでは、[次へ]というボタンやウェブサイトではページングで利用する[次へ]というリンクなどがあります。

弊社は、おかげさまで設立から丸5期・丸5年を経過しました。
本当にありがとうございます!

今期は10年目に向けた新しいスタートと捉え、「初心に帰ること」とこれまでの5年以上にこれから先5年は「チャレンジすること」をお約束します。

今始まったばかりの2020年代は僕たちがつくります。

いかりや長介さんの言葉、「次いってみよー」。
なんかすごくポジティブでワクワクするコトバ。
僕たちは次のステージに一歩踏み出せるよう頑張ります!

いつもお世話になっている皆様、これからお世話になる皆様、今後とも何卒よろしくお願いいたします!

Solrのコレクション名に日本語を使えるか

先日、テーブル名やカラム名に日本語が使われているデータベースからデータをSolrにインポートする機会がありました。Solr側のコレクション名やフィールド名で日本語を使えるならインポートの手間が小さくて済むので、実際そういうことができるのか調べてみました。

コレクションAPIで日本語名のコレクションを作ってみます。

$ curl -s 'http://localhost:8983/solr/admin/configs?action=CREATE&omitHeader=true&name=test1&baseConfigSet=_default'
$ curl -s 'http://localhost:8983/solr/admin/collections?action=CREATE&name=テスト&numShards=1&replicationFactor=1&wt=json'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /solr/admin/collections. Reason:
<pre>    Server Error</pre></p><h3>Caused by:</h3><pre>org.apache.solr.common.SolrException: URLDecoder: The query string contains a not-%-escaped byte > 127 at position 19
(略)

サーバエラーになってしまったのでURLエンコードしてパラメータ指定します。

$ curl -s 'http://localhost:8983/solr/admin/collections?action=CREATE&name=%E3%83%86%E3%82%B9%E3%83%88&numShards=1&replicationFactor=1'
{
  "responseHeader":{
      "status":400,
      "QTime":0},
      "error":{
      "metadata":[
        "error-class","org.apache.solr.common.SolrException",
        "root-error-class","org.apache.solr.common.SolrException"],
        "msg":"Invalid collection: [テスト]. collection names must consist entirely of periods, underscores, hyphens, and alphanumerics as well not start with a hyphen",
        "code":400}}
エラーメッセージによると、コレクション名に利用できるのは以下の文字種に限るようです。
  • 英数文字
  • ピリオド
  • アンダースコア
  • ハイフン(ハイフンは先頭文字としては使えない)

ソースコードを調べると、コレクション名のチェックをしているのは以下のクラスでした。

solr/solrj/src/java/org/apache/solr/client/solrj/util/SolrIdentifierValidator.java

チェックに使う正規表現は以下の通りです。

final static Pattern identifierPattern = Pattern.compile("^(?!\\-)[\\._A-Za-z0-9\\-]+$");

SolrIdentifierValidatorではシャード、コレクション、コア、エイリアスの名前をチェックしています。チェックに使う正規表現は共通なので、シャード、コレクション、コア、エイリアスについては同じ仕様であることが分かりました。