2016年8月18日木曜日

ビルドしたx86_64なPC向けの「lk」カーネルをQEMUで動かす

前回の記事の続き.

ビルドしたものはscripts/do-qemux86-6を付けると動かせる.
が,このスクリプトを走らせるとmakeでlkのビルドをしなおそうとする.

正直単にQEMUを起動するだけなので,次のコマンドをlkのプロジェクトディレクトリのルートで行なえば良い.
$ qemu-system-x86_64 -m 512 -smp 1 -machine q35 -kernel build-pc-x86-64-test/lk.elf -nographic
-enable-kvm -cpu hostを付けるとか-nographic外して-serial stdio付けるとか,-m-smpの後ろの数字変えてメモリ割り当てやVCPU数変えるとか,
scripts/do-qemux86で指定できるオプションでの引数の変更とかは勝手にすれば良いと思う.

Googleの新OS,Fuchsiaに使われてるらしいカーネル「lk」をx86_64なPCをターゲットにビルドしてみる.

表題の通りです.
レポジトリはここ
https://github.com/littlekernel/lk.git

まずは,
$ git clone https://github.com/littlekernel/lk.git
$ cd lk
ここで次のパッチをあてる.
このパッチは2つの変更から為る.

ひとつめ
arch/x86/toolchain.mkの25行目,FOUNDTOOLが,ifndef ARCH_x86_64_TOOLCHAIN_PREFIX の中にある.
これだとARCH_x86_64_TOOLCHAIN_PREFIXを自分で指定したら必ずビルドに失敗してしまう.
しかも,この変数はもし宣言されてない場合はx86_64-elf-をプレフィクスにしようとする.大半のPCのLinux環境ではx86_64-pc-linux-gnu-だろう.
ふたつめ
engine.mkGLOBAL_DEFINESHAVE_MREMAP=0を追加する. Linuxだとこの環境変数はデフォルトで1にされてしまい,external/lib/heap/dlmalloc/dlmalloc.cmremap(2)を使おうとするが, その実装がこのプロジェクト中に存在しないので,ビルドに失敗する.

加えて,次の修正が必要かもしれない.
binutilsの中でも,nm, c++filt, objdump, objcopy, size, ldのコマンドを使用するが,このlkのビルドシステムはARCH_x86_64_TOOLCHAIN_PREFIXで指定したツールチェインのプレフィクスがこれらコマンドについてる前提でビルドする. しかし,x86_64向けのbinutilsにプレフィクスがついたコマンド名のコマンドが入ってない場合も多い.その場合はlnコマンドとか使ってなんとかするしかない.

以上を修正したところで,次の通りに実行.
(ただしツールチェインのプレフィクスは自分の環境に合わせてください)

$ env ARCH_x86_64_TOOLCHAIN_PREFIX=x86_64-pc-linux-gnu- make pc-x86-64-test
これでビルドは完了

P.S. という指摘を貰う.ARMとかMIPSとかだけじゃなくてi386/x86_64もここのツールチェイン使うが正解っぽい. FOUNDTOOL変数の定義の場所は明かにバグっぽいけど,そもそもここのツールチェインダウンロードしてパス通してってやれば,普通にプレフィクスそのままでビルド通るだろうから気がつかなかったんだろな.

2016年7月12日火曜日

フレッツ回線の収容ビルとか障害情報とか

https://flets.com/customer/const2/

ここで自分の住所や電話番号から障害情報やどこのNTTビルに収容されてるか確認できる。
今知りました。

2016年6月25日土曜日

近年のTeXLiveでAdobe14書体を使う+日本語フォント埋め込み

Adobe書体の埋め込み

ちょっと前の情報だと,dvipdfmx -f dlbase14.map foo.dvi などとすれば良いとある.
しかし,最近は dlbase14.map はない.

また,usr/share/texmf-dist/dvipdfmx/dvipdfmx.cfgには
f pdftex.map
という項目があり,pdftex.mapupdmap-sys の結果の pdftex_dl14.map のコピーだった.
だが,デフォルトで,
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phv}
\renewcommand{\ttdefault}{pcr}
としても,実際に PDF に埋め込まれるのは URW のクローンフォントである.
本当に Times とかを埋め込むには,
# updmap-sys --setoption LW35 ADOBEkb
などとすると,/var/lib/texmf/fonts/map/pdftex/pdftex_dl14.map が書き換えられた.
べつに /usr/share/texmf-dist 以下とか見てなくて,/var/lib/texmf-dist のほうを見てる事にしばらく気がつかず.


日本語フォント埋め込み

デフォルトだと日本語フォントが埋め込まれなくて悲しくなる.というか読み辛い.
次のコマンドでプリセットのフォントマップをつかってくれる.
# kanji-config-updmap-sys auto
大抵の環境で ipa.map を使われると思う.指定できるのは次
hiragino, hiragino-pron, hiragino-elcapitan, hiragino-elcapitan-pron, morisawa, morisawa-pr6n, kozuka, kozuka-pr6n, ipaex, ipa, ms, yu-osx, yu-win, yu-win10
例えば Windows 10 で游書体を使いたいとかなら
C:\Windows\System32> kanji-config-updmap-sys yu-win10
とかすればいい感じにやってくれるはず.試してないけど.

とか書いておきながら,次の TeXLive 2016 ではデフォルトで IPA フォント埋め込みにしてくれるっぽいので知らなくてもいいかもしれない.

P.S.
https://gist.github.com/orumin/235888076da7932cd21e9b1f525d0ff9
 Adobe 14書体をごにょるやつ,ライセンス的にダメっぽいけど.

2016年6月21日火曜日

ちょっとスクレイピングの練習と,narou.rb

ちょっと最近Kindle PaperWhiteを書い直しまして,それと
小説家になろうをちらちらと読むようになった.
私はもともとしたらば掲示板にあるやる夫スレなどを読んでおり,それからすると小説家になろうの小説もまあまあ馴染みやすかったのでつい読んでしまう.

そこで,Kindleで素敵な組版で読めるといいなとおもったところ,
narou.rbの存在を知った.

しかしながら,(当然だが)既に商業化などに付き削除されてしまったものはnarou.rbじゃダウンロードも電子書籍化も不可能である.
だが,Web Archiveに生きている事は多々あり,これをEPUB3にして手元に保持しておきたいなあとか考え,次のスクリプトでnarou.rbで管理できる形に目次と小説本文をyaml形式で保存するスクレイピングスクリプトをつくった.

ぶっちゃけていうとこの素晴らしい世界に祝福を!のWeb版のEPUBをコレクションしておきたかったというわけです.

以下,成果.
RubyもNokogiriもあまりよくわかってないのでイテレーションが非効率な気がするが,まあそんなに問題ないとおもう.


Raspberry PiでH.264エンコード

かつて Raspberry Piでh264動画をハードウェアエンコードする という記事の後に
(録画をWindowsのEPGDataCap_Bonでやって録画マシンと違い常時起きてるRaspberryPiにファイルを貯めていくという構成だったので)Raspberry PiでMPEG2-TSをH.264にしようとしてた事があった.その記事の主に,いくつかこちらでわかった事をブログにまとめるといいながら1年半ブログに書いていない事に今気がついてしまった.
忘れないうちに書きます.いまさらこの情報役に立つかなあ…….

2,3日試行錯誤してたと思うのだけどその結果がこちら.
このスクリプトです.MPEG2のハードウェアデコードのライセンスを買う必要あり.
最初に紹介した記事最後で,エンコードした動画がカクつくという記述があったが,
あれは彼のパラメータ指定がわるくって,H.264のGOPがやたら小さいとどんなマシンでも
デコードの負荷が異常になって再生がおっつかなくなるという話だった.
RaspberryPiのハードウェアエンコーダ(OpenMax)向けのgstreamerプラグイン(gst-omx)では,
periodicty-idrでIDRフレームの間隔を指定できるので,元動画のフレーム数の10倍ぐらいに指定しておけばいいとおもう.アニメなら240ぐらい?
GOPが大きすぎるとシーク位置があまりにも飛び飛びになる上に,動き予測を失敗して本当にひどい動画が出来上がる.

それと,どうやらgst-omxはBフレームとか使えないっぽいので,quant-b-framesとかのパラメータは指定できないようだし,参照フレーム数は1で固定の模様で,さらにデインターレースやリサイズ,平滑化といった処理はどれもCPU処理になるのでこれらをやらせようと絶望的な速度になるようだ.加えて,interval-intraframesでI/IDRフレームの挿入頻度を決定してて,動きの多い部分で増やして,そうじゃない部分では減らすとかないので,ファイルサイズがそんなに小さくならない.
また,音声部分について,aacparse + avdec_aacはなぜか失敗するので,gstreamerのbadプラグインだったかuglyプラグインだったかを追加して,mpegaudioparse + madを用いて再エンコードしている.非効率だしよくないなあ.

追記:
RaspberryPi 3 をh264動画変換サーバにする(ハードウェアエンコーダをgstreamerで使う) - min117の日記
という記事をみつけたのだけどこの人がハマってるエラーはたぶん私が上述のスクリプト作るにあたってハマったエラーど同じ.
録画データがソースなMPEG2-TSはStream IDとか指定しないとエラーになる.
なぜなら,録画データは複数のストリームをもってるからである.
上のスクリプトに付いたコメント(Gistのコメント欄です)にはMenuIDあるならSID指定しなくていいって書かれたけどなんかそれはうまくいかなかった気がするけどいかんせん1年半前の事なのですっかり覚えていない.
だれかつっこみor検証たのみます

2016年5月20日金曜日

Kindle端末のフォントを筑紫明朝から別のフォントに差し替える

初代PaperWhiteなどは自由にフォントを追加できるようですが,
最近のKindle端末はそれが出来なくなってるようです.
しかし,筑紫明朝のファイルの中身を差し替えると好きなフォントにできるようでした.

Kindle端末の/system/fonts/ja.fontはcramfsで作られたファイルシステムイメージのようです.

この差し替え作業,面倒なのでスクリプトにしました.

これを使うためには
  1. Linuxで,かつgvfsが使える
  2. gvfsでKindleをマウントしている
これらを満たしている場合に,引数に差し替えたいフォントへのパスを指定し実行すると,
なんやかんややってフォント差し替えをしてくれます.


ちなみに紹介すると,やってることは,cramfsを展開し,ファイルを差し替え,cramfsを作りなおし,足りないサイズをzero fillで足し,ctimeをオリジナルに合わせる,というだけです.