Skip to content

Instantly share code, notes, and snippets.

@mike-neck
Created December 19, 2025 20:48
Show Gist options
  • Select an option

  • Save mike-neck/67b41b4f1cb5dc880a130bbf5b519c11 to your computer and use it in GitHub Desktop.

Select an option

Save mike-neck/67b41b4f1cb5dc880a130bbf5b519c11 to your computer and use it in GitHub Desktop.

Kindle の履歴で振り返る 2025


誰?

  • 持田
  • Craftsman Software という受託(?)の会社で YAML 書いてる
  • 関でも、ジャバでもない
    • 関東在住
    • Java はほとんど最近書いてない
  • 関ジャバに一度は参加しておくかと思って参加してみた
  • なお、今回は今年参加する2度目3度目の勉強会

振り返り

  • 自分を特徴づける何らかの継続的な活動
  • 客観的なデータをもって分析する
  • 次への指針を導く指標とする

自分を特徴づける継続的な活動?

  • 多くの人の場合、仕事が当てはまる
    • まあ、それは各自の仕事でやればいいか
  • 仕事外で何やっていたか?

-> 毎日1冊漫画読んでた


漫画

  • ほぼすべての漫画は Kindle で読んでる
  • Kindle での読書記録は Amazon から csv 形式でダウンロードできる
  • データをダウンロードして、 duckdb で遊んでみよう

Kindle のデータ

  • このページを参考にすればデータのリクエストはすぐできます
  • データリクエストからおおよそ 2 日程度でデータをダウンロードできるようになります

データの中身

読書履歴として使うのが以下の 2 つの CSV

  • Kindle.Devices.ReadingSession.csv
    • ASIN ごとの読書の履歴
  • Digital.SeriesContent.Relation.2/BookRelation.csv
    • 書籍のタイトル、購入日など
  • 漫画の巻数や出版社の情報はすべてタイトルに入っているので、それらは強引に分離してやる必要がある
1日外出録ハンチョウ(21) (ヤングマガジンコミックス) (Japanese Edition)
サンキューピッチ 3 (ジャンプコミックスDIGITAL) (Japanese Edition)

データの正規化

Kotlin で書いた

  • 半角・全角数字の混在
  • 括弧の半角・全角
  • 巻数記載の表記ゆれ
  • タイトルから巻数を分離
  • タイトルから出版社分離
  • タイトルのわからないデータの除去
fun String.normalize(): String = Normalizer.normalize(this, Normalizer.Form.NFKC)
val numberRegex = Regex("""(\d+)""")
val publisherParenthesisRegex = Regex("""\((\S+\s+)?\S+\)""")
val appendixRegex = Regex("""【.+】""")
val titleDescriptionRegex = Regex("""(通(常|巻)|モノクロ|カラー)版""")
val spaceRegex = Regex("""\s+""")
val onceLastNumberWithSpacesRegex = Regex("""\s*\(?\s*\d+\s*\)?巻?\s*$""")

val rawTitle = getTitle() as String

if (rawTitle.normalize() == "Not Available") return@mapNotNull null
val title = numberRegex.replace(rawTitle.normalize()) { match -> " %d ".format(match.groupValues[1].toInt()) }
  .replace("(Japanese Edition)", "")
  .replace(appendixRegex, "")
  .replace(titleDescriptionRegex, "")
  .replace(spaceRegex, " ")
val volume = numberRegex.findAll(title).lastOrNull()?.value?.toIntOrNull()
val publisher = publisherParenthesisRegex.find(title)?.value?.replace("(", "")?.replace(")", "") ?: ""
return@mapNotNull Book(
  it.asin,
  title.replace(publisherParenthesisRegex, "").replace(onceLastNumberWithSpacesRegex, ""),
  volume,
  publisher,
  it.creationDate,
)

データの分析


結論

  • Kindle のデータを分析すると、どのようなことに関心を持っていたかわかる(?)
  • duckdb すごい
  • 技術書で読み終わった書籍あったんだけど、出てこなかった...
  • Amazon Music の分析もできるので、そちらもやってみると楽しい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment