簡単なコードを例に自分のプログラミング思考を詳細に追ってみた
例のGoogleDataAnalysisを終えて以来、ちょっと英語熱が再燃しておりちょっとずつ勉強を再開しました。
そこで一冊音読用の本を買ったのですが、音声ファイルが「文章1つで1トラック」になっておりめちゃくちゃ使いづらい。1500ファイルぐらいありいくらなんでもiPhoneで探しづらい。
というわけで 同じ章にある音声をまとめるプログラム を作りました。ここではその過程を「プログラミング思考とは?」を題材に解説していきます。
普段は無意識的に行っている「コードを書くときの自分の思考回路」を文章化したものです。本当にプログラム未経験の人向け。経験者は見る価値ない記事です(笑)。プログラミングってこういうふうに考えていくんだ、という理解になれば幸いです。
続きを読むGoogle Data Analytics Professional Certificate 終了!
この間受講開始したGoogle Data Analytics Professional Certificate、無事終了しました。
予想より数段早く2週間ちょっとで終わってしまいました。軽くレビューでもしてみます。
続きを読むECSについて学んでみた
最近はRustが流行りなので再開してみました。1年ほど前に競プロで遊んでそれっきり。「Rustで何作ろう?」で詰まってしまい学習が完全にストップしてました。
ところが最近、Rustのゲームエンジンがあることを発見。ゲームなら作る気がでます(趣味領域)。
ぱっと探したところ主流なのは2個。Amethyst と Bevy というエンジン。両方とも ECS
という仕組みを採用してました。
...なんだそれ?...
調べると最近のUnityでも採用されているとか。自分の勉強不足を痛感です。そこでサンプルアプリを眺めながら構造を読み解き、勉強のため簡単なECSエンジンのサンプルをSwiftで組んでみました。その過程を紹介します。
続きを読むこの手のフレームワークを理解するには使うよりも「バグバグ&簡素なオレオレ仕様でいいから同じ仕組みのものを作る」のが有効と思ってます。RxやReactなどもそうやって覚えました。
Kotlin 1.4.3プレビュー機能まとめ
Kotlin 1.4.3で新機能プレビューが発表されので中身をまとめてみたいとおもいます。今はプレビューですがKotlin1.5.0では正式になるとかなんとか。そんなに大きな変更ではありません。
sealed interface
sealed class
の interface バージョン。殆どの用途では sealed interface になるでしょう。
sealed interface Shape class Rectangle(): Shape class Circle(): Shape
見た目もほぼ一緒。明示的にクラスとしてゴリゴリでなければinterfaceで十分だと思います。
sealed classをパッケージ単位に
今までsealed-classとそれの継承クラスは同一ファイルである必要があったのですが、それが同一モジュール/同一パッケージに拡張。
visibilityとあったので「そのファイル固有のsealed」もいけるかも?(未検証)
Serialization変更
- inline classサポート
- inlineでSerialize
- Unsigned系サポート
JVM record サポート
JDKで試験的に追加されている record
への対応です。Kotlinでいう data class
ですね。以下のようにannotationをつけることで Java から record として見えます。
@JvmRecord data class Rectangle(val width: Int, val height: Int)
とはいえAndroidでは使わない(使えない)機能ですね...サーバサイド向けでしょう。
inline class変更
inline
に変わり value
という修飾子が登場。将来的に inline
はdeprecateになるらしいです。また @JvmInline
をJavaのときはつけることになる模様(必須?オプション?)。
inline class Name(private val s: String) @JvmInline value class Name(private val s: String)
またJava側から「inlineクラスを引数にする関数」を呼び出せるように。ただしアノテーションが必要です。
value class UInt(val x: Int) fun compute(x: Int) { } @JvmName("computeUInt") fun compute(x: UInt) { }
JVM IR backend
IR(intermediate representation)をベースにしたコンパイラがベータに。JS向けはAlphaのまま。(ともに1.4.0でAlpha)
パフォーマンスがよくなるらしいです。
compileKotlin { kotlinOptions.useIR = true }
Kotlin/Native
箇条書きで
- パフォーマンス改善
- WatchOS64bitサポート
- Xcode12.2のライブラリサポート(なんのこと?これしか書いてない)
Kotlin/JS
- トップレベルプロパティのlazyサポート
Gradle
- GradleConfigurationをキャッシュするように
- ビルドが早くなる
標準ライブラリ変更
toUpperCase系改善
- locale次第で挙動が変わるので、新メソッド用意
- トルコだと
"kotlin".toUpperCase()
がKOTLİN
になってたらしい
Old | New |
---|---|
String.toUpperCase() | String.uppercase() |
String.toLowerCase() | String.lowercase() |
String.capitalize() | String.replaceFirstChar { it.uppercase() } |
String.decapitalize() | String.replaceFirstChar { it.lowercase() } |
char
- Char.toInt()が紛らわしいので改善です
"4".toInt() //4 '4'.toInt() //52
- Charコードが文字の数値表現のどちらか混乱を招くため
class Char { // Charコード関係の処理 constructor(code: Int) val code: Int //'4'.code==52 //数値表現 fun digitToInt(radix: Int): Int fun digitToIntOrNull(radix: Int): Int? } //Int側から fun Int.digitToChar(radix: Int): Char
以上です。そんなに大きな変更ではないですね。まだ試せてませんがJVM-IRがちょっと楽しみです。