2017/07/07
このブログをhttps化した(少しだけ)
一応世の中はそうなっていると聞いているのでそうした。
以前にたまたま見かけたJxckさんのこれに感銘を受けた、というと大げさだけど。ちゃんとしないとなぁという思いから。
HTTP2 時代の Web - web over http2
とりあえずhttpのものはhttpsに置換。
Bloggerの設定でhttpリダイレクトでhttpsになる仕組みがあったのでそれをオンにした。ブログの情報はhttpsで閲覧可能になった。
https対応していないっぽいブログパーツは捨てた。
ただ、まだ各ブログエントリ内でhttpでaタグとか使っちゃっているところもあるだろうからそこは暇なときに直していくしかない。一番骨が折れるかもしれない。
細々使っているAdsenseはhttpsか可能だったので、小遣い稼ぎがてら残しているけど収益なんか無いに等しいので飾り。
人間は欲深い。
ちょっと悲しいのは、はてぶがhttpの方にリンクされていて全然表示されなくなったこと。
だけど今までのはてブの数でドヤってするのも微妙だしな。
今後はhttpsではてブとかついていくだろうし大した問題では無い。
2017/06/28
2017/06/26
Kotlinの演算子オーバーロードはnullableが絡むと少しめんどい
つまりこういうめんどくささがあります。
val f1 : () -> Unit = {}
f1() f.invoke() // OK
val f2 : (() -> Unit)? = null
f2() //コンパイルエラー
f2?.invoke() // OK
軽く解説
nullableをレシーバーに取りにくい
f1()という関数呼び出しは、実は演算子オーバーロードという機能によって実現しています。
f1()とコードを書いた時 f.invoke() が呼び出されるというものです。
f1は () -> Unit 、つまり引数なしでUnitを返す関数型をlambdaで表現したものですが
実体の型はFunction0<Unit> というインターフェースです。
Function0の実装はこうなっています。
// kotlin.jvm.functions
// Functions.kt
public interface Function0 <out R > : Function<R> {
/* Invokes the function. */
public operator fun invoke(): R
}
f1はFunction0自身であり、invokeが実行されます。
これがf2のようにnullableとなった場合にKotlinの演算子オーバーロードはそれを許しません。
f2?.invokeという風に厳密にかけとコンパイルエラーになります。
つまり、nullableな変数の関数呼び出し(nullableな型をレシーバーとする関数呼び出し)をしにくいということです。
演算子オーバーロードは?による特殊記法がない
前述したコードのf2を、f2?()とかって実行出来れば良いのではという感じもしますが、
Kotlinはそういった言語設計を行っていないようです。
f2?()という呼び出しをサポートする代わりに明示的にf2?.invoke()と書きなさい、としています。
これはnull安全的観点で言うと良いような気もしますが、
突然普段は演算子オーバーロードによって隠蔽されているinvokeという謎関数が出てきた感じになるので、実装者としては混乱するかもしれません。
推測ですが、f2?()とかという書き方をサポートしなかったのは
単純に?を使った記法を利用できる箇所を限定的にしたかったのと、
コンパイラの字句解析とかを簡単にしたい(めんどい)というのがあったのではないかと思います。
nullableなものでも演算子オーバーロードを利用する
nullableだと演算子オーバーロードが利用できないかというとそうではありません。
拡張関数を利用すれば良いのです。
たとえば次のように実装すればinvokeの呼び出しも演算子オーバーロードを介して利用可能です。
operator fun <R> Function0<R> ?.invoke() = this?.invoke()
val f2 : (() -> Unit)? = null
f2() // コンパイル通る
ただし、Kotlinの標準ライブラリとしてわざわざこういった機能を提供せず
f2?.invoke()と書かせているのは、関数を実行したつもりで関数を実行していないなどのバグの元になるのを防ぐといった意図がありそうですしあまりお勧め出来るソリューションではありません。
nullableの場合の振る舞いは多分実装者が決めるもの
もう一つ、理由として考えるられるのは
nullableなものを実行した時の対処というのは大体においてコーディングしている側に委ねられるものだと思います。
たとえばBigDecimal + BigDecimal で返されるのは2つのインスタンスの値を加算したものであるのは自明という感じがしますが
BigDecimal? + BigDecimal
BigDecimal? + BigDecimal?
などは何を返すかはちょっと考える必要があります。
あと、単純に標準ライブラリが膨らみますね。
まとめ
- 演算子オーバーロードはnullableをレシーバーにとる時の挙動はあんまりサポートしていない
- どうしてもやりたいなら実装者側で拡張関数で追加していく必要がある
おまけ
悪ふざけコードです。
https://gist.github.com/yyYank/02d6c7f64532bb30cd0e63563d90feb2
2017/06/04
Kotlin入門までの助走読本の個人的な裏話
Kotlin入門までの助走読本というfree bookを
僕も参加させてもらって、ちょっと書きました。
楽しかったなぁー。皆さんありがとうございました。
豪華執筆陣による「Kotlin入門までの助走読本」をリリースします!
— 日本Kotlinユーザグループ (@kotlin_jp) 2017年5月29日
話題のプログラミング言語の「味見」をぜひ!PDF注意https://t.co/LJJDReAzue
ぜひ読んだ方はアンケートも書いてみて下さい。ありがたく拝見します。
あくまで個人的な感想&意見という感じですが、裏話としてブログを書いてみます。
2017/05/26
Kotlinという言語とNull Safety
何も考えずタイトルつけたのに胡散臭い。
どうも、趣味でKotlinの情報を集めてるだけの人です。
KotlinはAndroidで公式採用されることが決まりまして特需が出てきています。
こぞって企業がPRのために「Kotlin使ってますアピール」をしたり、
Kotlinとはなんぞや、みたいな話を書いたりとかしてますので、
この速さなら言える、ということで僕も便乗して久しぶりにKotlinの話を書こうと思います。
前提
プログラミング言語は簡単で、それを難しく語る人や難しく使う人がいるというだけな気がしています。
つまり何が言いたいかというとKotlinは簡単です。あと、ラクです。
僕が今日書こうとしているのはよく分からないボヤキなので単純に学びたいというだけであれば、
Kotlin KoansとKotlinの公式サイトのリファレンスだけ見れば大体充分です。
他の情報はまぁ、あんまり読んでも読まなくても一緒です。(というとアレですね。。)
あ、でもKotlinスタートブックという本は良いです。
あと、僕のサイトも使ってみてね(宣伝)
逆引きKotlin
それだけで良いと思うのでココから先は読まなくても問題ないです。