ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

pdf2audiobook

Twitter で気がついた佐藤さんのpdf読み上げシステムの動画を見ました。

www.youtube.com

PDFをテキストにして読み上げサービスを使用して音声ファイルに変換しています。

このシステムで使用しているGoogleのテクノロジーです。ひとつひとつは聞いたことあります。

  • Cloud functions
  • Cloud Storage
  • OCR with Vision API
  • AutoML Table
  • Text to Speech

ここで上手いなと思ったところがAutoML Tableによるtext(paragraph)の識別です。

20年くらい前に、FPGAのデータシートを読むのにPDFをテキストに変換してPDAで読むというのをやっていました。 ここで問題になるのが、各ページにはいるヘッダー、ページ番号、図表です。

最初は戸惑ったのですが、なれてくると自力で飛ばせるようになります。ヘッダーはほぼ同じ内容ですし、ページ番号は一定間隔で数字が出てきて、図表は改行だらけのテキストが来たら図表だなと自分で判断して飛ばすことが出来るようになります。今回、ここの部分をAutoML Tableで上手くやっているのが驚きのポイントですね。

自分が苦労しただけあって、あーここでDeep Learning使うんだという感動がありました。 社内のDX推進とかそういうのも良いけど、今の生活がちょっと良くなる技術の使い方はもっともっと可能性あると信じています。

詳しく知りたい人は今すぐGoogle I/Oに登録しましょう。

events.google.com

emsdk のアップデート

emsdk メモ

バージョン等を確認するとき

emsdk list

update するとき

emsdk update

githubから持ってきた時はgit pullで最新にできる。

WSLに入っていたemsdkをアップデートした

emsdk listでバージョンを確認。

アップデート前

The *recommended* precompiled SDK download is 2.0.9 (d8e430f9a9b6e87502f826c39e7684852f59624f).

アップデート後

The *recommended* precompiled SDK download is 2.0.16 (80d9674f2fafa6b9346d735c42d5c52b8cc8aa8e).

アップデート成功

ゼロからのOS自作入門(その2) メモリマップの取得

ゼロからのOS自作入門、その1の続き

natsutan.hatenablog.com

ゼロからのOS自作入門 | マイナビブックス

本を読みながら、メモリマップの取得プログラムを書き写してみた。 ブートしたらメモリマップを取得して、memmapという名前のファイルにメモリマップをCSVで出力します。

実行時にメモリマップを取得できるのは凄い。加えて、OSが立ち上がってないのにファイルシステムが動いているのが凄い。Qemuと実機ではメモリマップがだいぶ違う事が分かったことが収穫です。

Qemuのメモリマップ

Index, type, Type(name), PhysicalStart, NumberOfPages, Attribute
0, 3, EfiBootServicesCode, 00000000, 1, F
1, 7, EfiConventionalMemory, 00001000, 9F, F
2, 7, EfiConventionalMemory, 00100000, 700, F
3, A, EfiACPIMemoryNVS, 00800000, 8, F
4, 7, EfiConventionalMemory, 00808000, 8, F
5, A, EfiACPIMemoryNVS, 00810000, F0, F
6, 4, EfiBootServicesData, 00900000, B00, F
7, 7, EfiConventionalMemory, 01400000, 3AB36, F
8, 4, EfiBootServicesData, 3BF36000, 20, F
9, 7, EfiConventionalMemory, 3BF56000, 270C, F
10, 1, EfiLoaderCode, 3E662000, 2, F
11, 4, EfiBootServicesData, 3E664000, 219, F
12, 3, EfiBootServicesCode, 3E87D000, B7, F
13, A, EfiACPIMemoryNVS, 3E934000, 12, F
14, 0, EfiReservedMemoryType, 3E946000, 1C, F
15, 3, EfiBootServicesCode, 3E962000, 10A, F
16, 6, EfiRuntimeServicesData, 3EA6C000, 5, F
17, 5, EfiRuntimeServicesCode, 3EA71000, 5, F
18, 6, EfiRuntimeServicesData, 3EA76000, 5, F
19, 5, EfiRuntimeServicesCode, 3EA7B000, 5, F
20, 6, EfiRuntimeServicesData, 3EA80000, 5, F
21, 5, EfiRuntimeServicesCode, 3EA85000, 7, F
22, 6, EfiRuntimeServicesData, 3EA8C000, 8F, F
23, 4, EfiBootServicesData, 3EB1B000, 4DA, F
24, 7, EfiConventionalMemory, 3EFF5000, 4, F
25, 4, EfiBootServicesData, 3EFF9000, 6, F
26, 7, EfiConventionalMemory, 3EFFF000, 1, F
27, 4, EfiBootServicesData, 3F000000, A1B, F
28, 7, EfiConventionalMemory, 3FA1B000, 1, F
29, 3, EfiBootServicesCode, 3FA1C000, 17F, F
30, 5, EfiRuntimeServicesCode, 3FB9B000, 30, F
31, 6, EfiRuntimeServicesData, 3FBCB000, 24, F
32, 0, EfiReservedMemoryType, 3FBEF000, 4, F
33, 9, EfiACPIReclaimMemory, 3FBF3000, 8, F
34, A, EfiACPIMemoryNVS, 3FBFB000, 4, F
35, 4, EfiBootServicesData, 3FBFF000, 201, F
36, 7, EfiConventionalMemory, 3FE00000, 8D, F
37, 4, EfiBootServicesData, 3FE8D000, 20, F
38, 3, EfiBootServicesCode, 3FEAD000, 20, F
39, 4, EfiBootServicesData, 3FECD000, 9, F
40, 3, EfiBootServicesCode, 3FED6000, 1E, F
41, 6, EfiRuntimeServicesData, 3FEF4000, 84, F
42, A, EfiACPIMemoryNVS, 3FF78000, 88, F
43, 6, EfiRuntimeServicesData, FFC00000, 400, 1

実機(OneMix 2S)でのメモリマップ

Index, type, Type(name), PhysicalStart, NumberOfPages, Attribute
0, 7, EfiConventionalMemory, 00000000, 58, F
1, 0, EfiReservedMemoryType, 00058000, 1, F
2, 7, EfiConventionalMemory, 00059000, 45, F
3, 0, EfiReservedMemoryType, 0009E000, 2, F
4, 7, EfiConventionalMemory, 00100000, 7559A, F
5, 4, EfiBootServicesData, 7569A000, 40, F
6, 7, EfiConventionalMemory, 756DA000, E74B, F
7, 4, EfiBootServicesData, 83E25000, 302, F
8, 3, EfiBootServicesCode, 84127000, 1F, F
9, 4, EfiBootServicesData, 84146000, 30, F
10, 3, EfiBootServicesCode, 84176000, 2, F
11, 4, EfiBootServicesData, 84178000, 1388, F
12, 3, EfiBootServicesCode, 85500000, C, F
13, 4, EfiBootServicesData, 8550C000, 25, F
14, 3, EfiBootServicesCode, 85531000, 10, F
15, 4, EfiBootServicesData, 85541000, 21, F
16, 3, EfiBootServicesCode, 85562000, B, F
17, A, EfiACPIMemoryNVS, 8556D000, 1, F
18, 6, EfiRuntimeServicesData, 8556E000, 1, F
19, 4, EfiBootServicesData, 8556F000, 1, F
20, 3, EfiBootServicesCode, 85570000, 24, F
21, 4, EfiBootServicesData, 85594000, 81, F
22, 3, EfiBootServicesCode, 85615000, B, F
23, 4, EfiBootServicesData, 85620000, 10, F
24, 3, EfiBootServicesCode, 85630000, 13, F
25, 4, EfiBootServicesData, 85643000, 10, F
26, 3, EfiBootServicesCode, 85653000, 2, F
27, 4, EfiBootServicesData, 85655000, 18, F
28, 3, EfiBootServicesCode, 8566D000, 1D, F
29, 7, EfiConventionalMemory, 8568A000, D, F
30, 1, EfiLoaderCode, 85697000, 2, F
31, 4, EfiBootServicesData, 85699000, 5FE1, F
32, 7, EfiConventionalMemory, 8B67A000, 17A, F
33, 3, EfiBootServicesCode, 8B7F4000, 5E8, F
34, 0, EfiReservedMemoryType, 8BDDC000, C17, F
35, 9, EfiACPIReclaimMemory, 8C9F3000, 52, F
36, A, EfiACPIMemoryNVS, 8CA45000, 60, F
37, 6, EfiRuntimeServicesData, 8CAA5000, 4B7, F
38, 5, EfiRuntimeServicesCode, 8CF5C000, A3, F
39, 4, EfiBootServicesData, 8CFFF000, 1, F
40, 7, EfiConventionalMemory, 100000000, 16F000, F
41, 0, EfiReservedMemoryType, 000A0000, 60, 0
42, 0, EfiReservedMemoryType, 8D000000, 3000, 0
43, B, EfiMemoryMappedIO, E0000000, 10000, 0
44, B, EfiMemoryMappedIO, FE000000, 11, 1
45, B, EfiMemoryMappedIO, FEC00000, 1, 1
46, B, EfiMemoryMappedIO, FED00000, 1, 1
47, B, EfiMemoryMappedIO, FEE00000, 1, 100D
48, B, EfiMemoryMappedIO, FF000000, 1000, 100D

WebAssembly FileのKnown sections

WebAssembly in ActionからWebAssembly Fileの構造についての続き。

www.manning.com

その1の続き

natsutan.hatenablog.com

本はバイナリのフォーマットで説明されていますが、S式に変換した方が分かりやすい。 wasm2watコマンドを使うとリーダブルなS式に変換できるので、それで中身を確認しました。 S式に変換するときに、ちょっと変わっている気がするので後でちゃんと調査したい。

Type

Tyep sectionは、関数のシグネチャを記載しています。 引数と戻り値が記載されています。

(type (;0;) (func (result i32)))
(type (;1;) (func (param i32) (result i32)))
(type (;2;) (func))
(type (;3;) (func (param i32)))
(type (;4;) (func (param i32 i32 i32) (result i32)))
(type (;5;) (func (param i32 i64 i32) (result i64)))

Import

Import sectionは、モジュールで使われるFunction、Table、Memory、Global Importの宣言です。

(import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 3)))

Function

関数のlist。S式には見つからず。

Table

型付き配列のリファレンスを記載しています。

  (table (;0;) 2 2 funcref)

Memory

リニアなメモリの記載です。

 (memory (;0;) 256 256)

Global

グローバル変数の定義です。

 (global (;0;) (mut i32) (i32.const 5243936))

Export

Exportされるシンボル情報です。

(export "memory" (memory 0))
(export "__indirect_function_table" (table 0))

Start

このセクションは手持ちのファイルには見つからず。 多分、最初に呼ばれる関数のインデックス。普通にCで書くとmainになりそう。(未確認)

Element

インスタンスが生成されるときにロードされる値。Global変数。

(elem (;0;) (i32.const 1) func 1))

Code

関数の中身。多分S式に出てくるfuncだと思う。

(func (;1;) (type 2)
    nop)

ここのtype2が、Type section の (type (;2;) (func)) に対応しています。 この場合はC言語の void f(void) {} ですかね。

Data

こちらも見つからず。インスタンスが生成されるときにロードされる値と書いてあるが、Elmentとの違いは良く分からない。

WebAssembly Fileの構造

WebAssemblyファイルの構造まとめ。

WebAssembly in Actionから。

www.manning.com

f:id:natsutan:20210330000409p:plain

最初にpreambleとして、0x00, 0x61, 0x73, 0x6dがあります。文字列で"\0asm"です。 その次にバージョン1を示す、0x01, 0x00, 0x00, 0x00が続きます。

その後にセクション情報が続きますが、known sectionとcustom sectionの二種類があります。sectionは全てoptionです。

known sectionはリンク先の表に一覧があります。

webassembly.github.io

実際にバイナリエディタでファイルの先頭を見てみたら、そんな感じになってました。

f:id:natsutan:20210330000453p:plain

ゼロからのOS自作入門(その1)

ゼロからのOS自作入門をゲットしたので早速読んでます。

ゼロからのOS自作入門 | マイナビブックス

最初はいきなりブートイメージをバイナリエディタでうち込み、USBメモリへコピー、USBからブートさせると画面に文字が表示される所から始まります。

もちろんqemuでも同じ事出来るのですが、やっぱりこういうのは実機でやらないと面白く無いですね。という訳で手持ちのOneMix 2Sでブートさせてみました。

f:id:natsutan:20210328220600j:plain

俺メモ:

  • 本にはUSBメモリのフォーマットをexFATと書いてあるが、FATでフォーマットしないとBoot出来なかった。(33ページ)
  • 僕の持っているVAIOのBIOS起動方法は、F3を押しながら電源ON
  • OneMix2Sは起動時にDEL連打

exFATとFATの話は筆者からフォローありました。FATが選べるならFATでOKです。

中国語を一年間勉強した

我学汉语学了一年了

中国語を一年間勉強したまとめ。

去年JDLAのE資格受験後に中国語の勉強を始めて、duolingoというサービスで1年間中国語の勉強を続ける事ができました。途中3日くらい抜けているのですが、休んでも継続していることになる褒美アイテムで継続していることになっています。

f:id:natsutan:20210306005401p:plain

趣味の言語学習はこれまた沼で、電子辞書、英英辞典/汉语词典、ディクテーション、シャドーイング、資格取得、言葉のシャワー、多読、精読、アニメでマスター、日記を書く・・・・全部やっていたらきりが無い。大事なのは続ける事。無理矢理モチベーションを上げたり、モチベーションが低くてもできる事を続けるのが大事と思って一年続けました。

なんで勉強を始めたか

一番大きなモチベーションは中国語で書かれた技術書が読めるようになりたかったことです。 ずいぶん前に出張で上海にいったとき、上海で一番大きな本屋に連れて行ってもらい、ハードウェアのコーナーを見て中国語読めず良く分からず残念な思いをしました。ハードの本は日本語の本は少なく、英語の本も少なくて結構高額ですが、上海の本屋は結構しょうもない本もあって、本好きの僕としては絶対お宝的な本があると確信していました。

もう一つは、このゲームが遊びたかったんですよね。

吞食孔明传は、ファミコンの天地を喰らうリスペクトなゲームです。システムはだいたい一緒で、後半のストーリーはだいぶ違います。周回要素あり(多分)。

store.steampowered.com

ちなみにこのゲームは特に中国語分からなくてもクリアー出来ました。

一年の成果

まいにち中国語(NHKラジオ講座)

コロナによるリモートワークで、いままで通勤時間だった時間帯をNHKのラジオ講座に回すことが出来ました。なんだかんだ言ってだいたい一年間続きました。最初の頃はただ聞いてるだけでしたが、最近は予習もするようになって勉強時間食います。結局でてくる単語を覚えに行かないと力にならない。次の4月からは、アニメやゲームで活躍している声優さんらしいので、もう一年は頑張れそう。

中国語検定準四級合格

中国語検定の中では一番の雑魚。受検を飛ばす人もいるくらいです。このまま勉強を続けたら一つ上の四級はいけるんじゃないかと思う。40代の間に三級までは行きたい。

文法の基礎

www.amazon.co.jp

やさしくくわしい中国語文法の基礎を最初から最後までノートに写しながら読みました。この本で学んだ事がまいにち中国語で登場すると理解が進みます。一回目なので全体感を掴むのが目的で、このあと何度も戻ってくると思います。机の取りやすい位置に常駐しました。

発音

中国語は発音が難しい。声に出さないと漢字を覚えられない事が分かって見よう見まねで練習しています。ちなみに会社の同僚に中国語で話しかけてみたところ全く伝わらず、ちゃんと人に教わらないと駄目とアドバイスもらいました。はい。

孔子学院

先月、立命館大学の横の孔子学院で有料の特別講座があったので行ってきました

そこで分かったことは「発音できない人は文法の授業に参加できない」です。先生がここに入りそうな言葉を一つ言ってくださいといわれて「非常(フェイチェン)」とドキドキしながら発音したが????って顔をされてしまった。先生(日本人)は教えるプロなので、僕のレベルにあった超簡単な所を当ててくれたのですが、それでも通じなかったのはショック。

こうやって恥をかいて上達するのだ、他の人達も最初は僕レベルだったはず、と何回も自分に言い聞かせ正気を保ってました。

これからそれから

一年間、朝と夜の一番良い時間を中国語の勉強につぎ込みました。それでも本はまだ読めないです。会話文と違って実際の文章はとても長く、全部の漢字の意味が分かっても文にならない。 孔子学院の講義がだいぶ刺激になって、動詞を丸で囲って、SとOとか入れて行くのが理解の近道とわかり、しばらくはリーディングに力を入れたい。

4月になったら発音はちゃんとしたトレーニングを受けたいが、これは業務とコロナと家族の様子みながらになりそう。