雑英辞郎
雑英辞郎
英辞郎のテキストデータが500円くらいで買えるので、それのビュワーアプリを作る事にする。英和辞典。自作アプリ
名前は雑な英辞郎アプリという事で雑英辞郎、と言う事にしよう。
データの購入
- 英辞郎(えいじろう・EIJIRO)の最新情報 テキストデータが500円くらいで買える。
コンセプト
- Androidの長期のメンテナンスが簡単なものを作る
- たまにしか使わないので使い勝手は頑張らない
- いろんな端末で使いたい
- パフォーマンスよりデバッグのしやすさ優先
開発日記
アプリ開発関連の記録を置いておく。
assets下にのビルドでとりあえず動く 2026-10-25 (日)
とりあえずPC側でsplitしたりlz4したりしたファイルをassets下に置いて、雑に動く。 単にTextViewに表示しているだけなのでセパレータとかも無いし他のエントリへのリンクとかも一切処理していないが、まぁまぁ十分だな、これ。
ほとんど自分で書かずにgeminiに書いてもらった。
インポートはそのうち必要になったら書こう。
ファイルの仕様検討 2026-10-25 (日)
とりあえず先頭のローマ字何文字かでファイルに分けて、それを圧縮した感じのを適当にルックアップする感じにしたい。
どのくらいに分割したらいいかなどをPCで検討する。
テキストデータを眺める
一行あたり1エントリで見出し語のあとはコロンがある。 他のエントリを参照してほしいものは、コロンのあとに「<ーXXXX>」が半角で書いてある(XXXXに該当する見出しが書いてある)。
イディオムも全て一行で入っている。
見出しの後には空白二つが入り品詞が入り、その後コロンで意味が続く。 複数の意味がある場合は品詞のあとにハイフンで数字が振られる。
発音記号などはあればその後に単独の行で入る。
フォーマットの検討
思ったよりサイズが小さいので、まずはシンプルなデータで不足が無いか見てみる。
見出しのインデックスで1ファイル、そのほかはまずは先頭文字ごとに24ファイルに分割していこう。 これでは大きなばらつきが出るとは思うが、それで圧縮してどのくらいかを検討したい。大きな文字があったら先頭2文字で分割、小さすぎる分にはまぁいいかな、と思っている。
圧縮フォーマットはとりあえずlz4にしてみる。 全体を圧縮したらlz4で78.6MB。24に分かれてくれれば1ファイル4MB以下になるが、ちょっと大きいね。最終的には先頭2文字になりそうだが、まずは先頭1文字で分割する所から始める。
とりあえずnodejsでcopilotに書かせる。
コンバートはアプリでやる方がいいか
コンバードはPC側でも簡単に出来るが、コンバートしたものをどうやってアプリに入れるかを考えると意外と面倒な事に気づく。
assetsに置いてビルドするのが一番カンタンだが、これだとapkを公開できなくなる(データが入っちゃうので)。 置いてビルドしてね、って感じにしてもいいのだが、端末乗り換えやタブレット買った時などにいちいちapkのビルド環境をもう一度作るのはかったるいし、apkを持ち回るのもかったるい。
やりたいのは単に先頭の文字でsplitだから、アプリでやってもいいかもなぁ。 apkにはデータは含めずに、初回に外からデータを渡してdata下に保存する感じでいいか。
zipはたかだが50MBくらいなので、これを端末で読み込ませて、見出しごとに分けてlz4で圧縮してdata下に保存、としよう。
PCでの分割データの調査
aa.txt, ab.txtなどに分割してみる。さらに一文字のものはa.txtとか、aより前のは0before.txt、zより後のはzzafter.txtとした。
nushellで
~/source/MySource/EijiroConv/split> ls *.txt | get size | math avg
295.0 kB
~/source/MySource/EijiroConv/split> ls *.txt | get size | math max
6.6 MB
~/source/MySource/EijiroConv/split> ls *.txt | get size | math min
30 B
との事。
ls *.txt | where size >= 2MiB
は12個。
一番大きいco.txtをlz4したら、2.8MBに。ちょっと大きいなぁ。
大きいものは4分割までする
- 2分割で一通り作る
- 1MiB以上は3文字に分割
- 1MiB以上は4文字に分割
とする事にした。4分割までするとhave.txtが最大で2.6MBで、1MiB以上は7つだが、だいたい1MiBちょっと。これでいいだろう。
> ls *.txt | where size >= 1MiB
╭───┬──────────┬──────┬────────┬────────────────╮
│ # │ name │ type │ size │ modified │
├───┼──────────┼──────┼────────┼────────────────┤
│ 0 │ get.txt │ file │ 1.2 MB │ 20 seconds ago │
│ 1 │ give.txt │ file │ 1.1 MB │ 20 seconds ago │
│ 2 │ have.txt │ file │ 2.6 MB │ 20 seconds ago │
│ 3 │ in.txt │ file │ 1.4 MB │ 23 seconds ago │
│ 4 │ inte.txt │ file │ 1.1 MB │ 20 seconds ago │
│ 5 │ make.txt │ file │ 1.2 MB │ 20 seconds ago │
│ 6 │ take.txt │ file │ 1.0 MB │ 20 seconds ago │
│ 7 │ with.txt │ file │ 1.2 MB │ 20 seconds ago │
╰───┴──────────┴──────┴────────┴────────────────╯
インデックスの試行錯誤
見出し語だけをリストアップしたindex.txtを作ってみた。 サイズは61.4MB。うーん、全部オンメモリでは重いか。
中身の方と同じにしてもいいんだが、まぁそこまで分けなくてもいいかなぁ。
先頭一文字で分けてみた所、s.txtは6MB。ちょっと大きいか。
先頭2文字で分けるとだいたい1MB以下で、1MB以上は10ファイル、一番大きくて2.2MBなのでこのくらいならいいか。
暫定分割方法
- 0before.txt, zzzafter.txt
- a.txt, aa.txt, ab.txt ..., zy.txt zz.txt
- 一文字はa.txtになる事に注意
- 1MiB以上はaba.txt, abb.txt...と3文字にする
- 3文字で1MiB以上だったら4文字に分割
- 4文字以上は分割しない
をsplitディレクトリに、indexをスプリットしたものをsplit_indexに置く。
ファイルはlz4で圧縮する(ファイル名は0before.txt.lz4などとする)