プログラマ英語学習日記

プログラミングと英語学習のまとめなど

簡単なコードを例に自分のプログラミング思考を詳細に追ってみた

例のGoogleDataAnalysisを終えて以来、ちょっと英語熱が再燃しておりちょっとずつ勉強を再開しました。

そこで一冊音読用の本を買ったのですが、音声ファイルが「文章1つで1トラック」になっておりめちゃくちゃ使いづらい。1500ファイルぐらいありいくらなんでもiPhoneで探しづらい。

というわけで 同じ章にある音声をまとめるプログラム を作りました。ここではその過程を「プログラミング思考とは?」を題材に解説していきます。

普段は無意識的に行っている「コードを書くときの自分の思考回路」を文章化したものです。本当にプログラム未経験の人向け。経験者は見る価値ない記事です(笑)。プログラミングってこういうふうに考えていくんだ、という理解になれば幸いです。

続きを読む

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では正式になるとかなんとか。そんなに大きな変更ではありません。

一番影響大きそうなのはJVM向けコンパイラでしょうか。

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になるらしいです。また @JvmInlineJavaのときはつけることになる模様(必須?オプション?)。

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がちょっと楽しみです。