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をオリジナルに合わせる,というだけです.

2016年4月29日金曜日

Rump Kernelをつかってみる

RumpはNetBSD Runnable Userspace Meta Programの略である[1].
BSDCan 2009の論文を読むとRumpはNetBSDのカーネルをユーザランドにもってきて,
例えばネットワークをカーネルスタックをバイパスしてユーザランドにもってきた
スタックで処理してスループットを上げたりするもの,と解釈していた.

しかし,調べるとどうやら,単にユーザランドで使えるLibraryOSとしてだけではなく,
Type1ハイパーバイザ上で直接動作するコンテナとしても使えるLibraryOSのようだ.
Xen PVやVirtioのドライバが実装されているらしい.

そこで,Rump Kernelを使ってみたメモ.

experimentalなものらしいが,rumprunというのを使ってみる.
これをつかうと簡単にRump Kernelを含むイメージファイルの作成・起動ができるらしい.

準備

$ git clone http://github.com/rumpkernel/rumprun
$ cd rumprun
$ git submodule update --init
$ ./build-rr.sh hw
これでrump kernelのツール一式とライブラリがビルドされる.
build-rr.shにhw以外を渡してクロスビルドもできるっぽい.

ここでは,x86_64なLinuxの上で作業したと仮定します.
次に環境設定.
$ export PATH="${PATH}/$(pwd)/rumprun/bin"
$ export RUMPRUN_TOOLCHAIN_TUPLE=x86_64-rumprun-netbsd
これで,x86_64-rumprun-netbsd-gccなどRump kernelをlinkしてビルドしてくれるツールチェインへのPATHが通る.

では次はアプリケーションをビルドしてみよう.

アプリケーションビルド

$ git clone http://github.com/rumpkernel/rumprun-packages
$ cd mysql
$ make
bin/mysqldとしてビルドしたアプリケーションが置かれる.
ただし,images/data.ffsとしてファイルシステムイメージが UFSで作られるので,事前にNetBSD由来のmakefs(8)が必要.
# apt-get install makefs
私はArchLinuxユーザなのでdebtapを用いてmakefsの.debをArchLinuxパッケージに変換した.
次に,これを仮想環境が読めるイメージファイルに変換する.
$ rumprun-bake hw_virtio bin/mysqld.bin bin/mysqld
これで,virtioドライバ付きでRump KernelにリンクされたMySQLのイメージがbin/mysqld.binに焼き込まれた. ちなみに,hw_virtio以外に選べるコンフィグは次の通り
$ rumprun-bake list

!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!

xen_pv : Xen with paravirtualized I/O drivers
xen_pci : Xen with paravirtualized and PCI I/O drivers
hw_virtio : virtio targets (e.g. QEMU/KVM)
hw_virtio_scsi : virtio targets with SCSI (e.g. QEMU/KVM)
hw_generic : generic targets, includes (almost) all drivers
準備は整ったので,使用してみる.

使ってみる

まずtapを生やす.
# ip tuntap add tap0 mode tap
# ip addr add 10.0.0.1/24 dev tap0
# ip link set dev tap0 up
次に,rumprunコマンドで実行する.
$ rumprun kvm -M 128 -i \
-b images/data.ffs,/data \
-I if,vioif,'-net tap,script=no,ifname=tap0' \
-W if,inet,static,10.0.0.10/24 \
-- \
bin/mysqld.bin \
--defaults-file=/data/my.cnf --basedir=/data --user=daemon
これでMySQLデーモンサーバがRump Kernelで起動する. ホストのほうから,
$ mysql -h 10.0.0.10 -u rump
だの
$ mysqladmin -h 10.0.0.10 -u rump status
だのして遊べる.

おわりに

rumprunコマンドのusageは次の通り.
$ rumprun
!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!

usage: rumprun [script args] PLATFORM [guest args] APP [ -- ] [app args]

PLATFORM is the rumprun runtime platform to use
ec2 : create directory with contents necessary for a Amazon EC2 AMI
iso : bake app and config into a bootable iso image
kvm : hw guest via qemu -enable-kvm
qemu : hw guest via qemu -no-kvm
xen : xen guest via xl(1)

APP is the binary to rumprun. app args are processed by APP.

script args are:
[-h] [-DS] [-t tmpdir] [-T tmpdir]

-h display this message

-D dump backend commands instead of running them
-S execute sudo where potentially necessary
-t use tmpdir as dir for temp files (default: /tmp/rumprun.XXXXXXXX)
-T same as -t, except do not remove temporary directory

guest args are:
[-dip] [-b blkspec] [-D port] [-e VAR[=VALUE]] [-g args]
[-I iftag,ifopts] [-M mem] [-N name] [-W iftag,netspec]

-b configures a block device. The format of "blkspec" is:
hostpath[,mountpoint] where:
hostpath = image that is passed to the guest as a block device
mountpoint = if "hostpath" is a file system image, mountpoint on guest
-D attaches a gdb server on port to the guest
-d destroys the guest on poweroff
-e set environment VAR to VALUE
-g specify 'args' to guest. handling, if any, is guest-dependent.
-I create guest network interface and attach the user-specified
iftag to it. the format is:
iftag,ifbasename,[backendopts]
e.g. -I 'qnet0,vioif,-net tap=/dev/tap0'
-i attaches to guest console on startup
-M set the guest's memory to mem megabytes, default is 64
-N set the guest's name to name, default is rumprun-APP
-p creates the guest but leaves it paused
-W configure network interface new style, where "netspec" is
inet,dhcp - IPv4 with DHCP
inet,static,addr/mask[,gateway] - IPv4 with static IP
inet6,auto - IPv6 with stateless autoconfiguration
e.g. -W qnet0,inet,static,1.2.3.4/24

すごい,なんとXenとKVMだけじゃなくてbootableなisoに焼いてみるとか(もしかしたらrumprun-bake hw_genericをつかえばbaremetal起動できる?)
EC2 AMIイメージをサクっと作れてしまう.
それに,rumprun-pacagesレポジトリはMySQLだけじゃなくてnginxやらなんやら結構充実している.memcachedやLevelDBもあるようだ.

ここまでで思ったのは,rumprun-pacagesのアプリの種類だとか,
複数のVMMで起動できたりEC2 AMIがカンタンに作れたり,

とってもこれOSvに近くない?

という感想を抱いた.
なんというか,おもったより実用に近いもののようだ.

これからどういう方向に進んでいくのかもちょっと気になるなあというところ.

P.S.
関連でLKLを使おうとしてるけどビルドがコケて悲しい

参考文献:
^[1]: KANTEE, A. Environmental Independence: BSD Kernel TCP/IP in Userspace. In Proc. of AsiaBSD-Con (2009), pp.71–80.

2016年4月22日金曜日

IIJmioのひかりコラボ,「mioひかり」でIPv6 IPoE

そういえば最近関西から関東に引越しました.

で,IIJmioのMVNOサービスを使ってたので,安さに目が眩んで,
回線+ISPにmioひかりを選びました.

これはサービスインの時のてくろぐさんの記事で,
IPoE方式によるIPv6接続、DS-LiteによるIPv4接続への対応を検討しています。対応時期などは未定です。
とあったので, それへの期待も込みでした.

そこで昨日,mioひかりでもIIJmio FiberAccess/NF同様にIPv6 IPoEとDS-Liteが
オプションで使えるというプレスが出たので,早速申し込みました.
IIJmioひかりにおけるIPoEオプション提供開始のお知らせ
料金は月額800円

私の場合,IIJmioの紹介割引x2と春のスタートアップ割引とmio割(MVNOとのセット割引)
があったので,まあ月額800円でもお釣りが来るかな,とおもって迷わず申し込みました.

ちなみに,今ならIPoEオプションの最初2月は無料だそうです.

これが昨日の11時30分,申し込み受け付けのメール.

そして19時間10分後の今朝6時40分のメール.
メールではサービス開始が明日の日付になってますが,
このメールの来た時間に丁度DNSが引けなくてネットワークが不通になりました.

理由は,私がGentooでルータを作ってるため,IPv6 PPPoE(net.ppp1)が切れた時点で
依存サービスのdnsmasqが停止して,家のLAN内のマシンが一斉にDNSが引けなくなったため.

一般的なブロードバンドルータつかってたり,
DNSキャッシュサーバを建てずに直接DNSサーバとしてISPのサーバを指定してたらネットワークが不通になるなんてことはないです.(そのはず)

で,ルータのWAN側のポートにRAされたPrefixでアドレス生やしてとりあえずgoogleとかにping6したら,疎通できました.

ということで自宅もIPoEなv6が使えるようになりました.

しかし,ルータでRA Proxyするまでは良いのですが,
そのアドレスでLANから外に繋がらないので,ip6tablesのルールが間違えてる気がします.

とりあえず,以下ポインタ

OCN IPv6 の非固定prefixを配下のルータで使う
この記事最後にrdiscでRAを受けて,radvdのconfigを生成するスクリプトが紹介.
このスクリプトの後にradvdを起動して,ip6tablesでforwardルールを書けばいけるはず(と思ったんだけどなあ)
(そのスクリプトのレポジトリへのリンクはコレ)

仙石浩明の日記 IPv6(2)
Linuxでブルータ(IPv6 ブリッジルータ)を組むときのノウハウ.
もしかしてip6tablesでeth1からeth0にforwardして〜とかじゃなくてブリッジする必要あるのかなあ.

LinuxでIPv6ルータで/64プレフィックスを無理やり/72などに分割してみた
いままで/56のprefixをDHCPv6-PDで受けてたけど,ひかり電話契約がないので
/64になってしまって,サブネットの扱いどうしようかなあとおもってたら発見.
下位64bitのとこでがんばってサブネット切れるんですね.
後々の参考にしたい.

2016年4月6日水曜日

おるみんマイグレーション - 洗濯機扁

実は居を関西から関東に移しました.

以前は寮(というとちょっと語弊があるかも)に住んでいたので,
生活用品がほぼゼロで越してきたのでちょっと四苦八苦.

実家で昔単身赴任に使われ現在腐らせてる白物家電を送ってもらったのですが,
以前の使用者の片付けが非常に悪く(これは愚痴です),洗濯機の脚スペーサーがひとつ欠けており水栓つぎてと説明書が消失しておりました.

新居の洗濯機用蛇口は通常の蛇口だったので,
この際と思い(というか以前の洗濯機使用者たる父が,「水栓つぎてで既存の蛇口を傷めるより別の蛇口にせよと頑強に主張したのもあるのですが),蛇口を交換してみることに.

過程を書くのは備忘録と,かつて一度だけDIYという記事タグを使ったことを思い出したためです.

使ったもの:



TOTOのTW11Rとシールテープです.

このTW11Rは大変素晴しく,給水ホースが簡単に取り付けられる上に止水弁があります.
ホースが抜けても水がだばだばしません.
それに,バルブは45度回すだけで開栓できる構造です.

取り付け方:

まず元栓を閉めにいきます.だいたい玄関の外の水道メーターの近くだとか,
アパートの1階の基礎部にまとめて並んでるとかです.

次に,既存の蛇口を外します.


このようなレンチを使っても良いかもしれません.私はえいやと筋肉で外しました.
外したところには,以前のゴミや錆びがたくさん付いてるので使い古しの歯ブラシなどでキレイにしましょう.

その次は,とりあえず蛇口を取り付けてみます.
だいたい5回ほど回すと閉まると思うのですが,この時の回す回数を記録して蛇口はまた外します.

そして,実際の取り付けにかかります.

蛇口のネジ部にシールテープを5,6周巻き付けます.
シールテープは粘着性がないので,軽く引っぱりながらしっかり巻き付けます.
巻き付け終わったら指でおさえて更にくっつけます.

そして,取り付けます.(先程記録した回数-1)回ほど回すようにしましょう.
回すとき,回しすぎたとおもって逆方向(緩める方向)に回すといけません.
回しすぎた時は取り外して取り付け部も蛇口のネジもシールテープをキレイに除去し,
シールテープ巻き付けから再開します.
そうしないと水漏れするからです.

以上で,単水栓の取り付けは完了です.


なお,余談ですが私は蛇口を取り付けたとき締めすぎたとおもってやりなおそうとしたとき,
蛇口が締まりすぎた為にザルボ毎外れてしまい蛇口とザルボが外れませんでした.
退去の時は水栓レンチかザルボ買うほうが良さそうですね……

もうひとつ余談.

排水ホース長すぎたので溝部の先端でちょん切って排水エルボとスリーブを取り付けなおしました.これは説明するほどの事でもなく簡単でしたね.

2016年3月30日水曜日

CentOSを複数台のUEFIなホストにインストールするときPXEでうまいことやるやつ

どこかにメモをしようとおもったけどブログの記事をまるで書いてないのを思いだしました.

CentOS 7.2前提

1. CentOSのisoイメージをダウンロード

2. /mnt/centosにisoイメージの中身を全部そのまま配置

3.

次を実行
$ mkdir -p /var/tmp/tftpboot
$ cp /mnt/centos/EFI/BOOT/grubx64.efi /var/tmp/tftpboot/
$ cp /mnt/centos/images/pxeboot/{vmlinuz,initrd.img} /var/tmp/tftpboot
(もしかしたらgrubx64.efiは/mnt/centos/Packages/grub2-efi-なんとか.rpmを解凍してgrubx64.efiを取り出さないといけないかも)

4.
これを/etc/dnsmasq.confにする.
enp8s0は自分の環境のインターフェース名に変える.

5.
/var/tmp/tftpbootに次の中身でgrub.cfgを作成

6. kickstartのコンフィグファイルをks.cfgという名前で/mnt/centos/に配置


7.
# darkhttpd /mnt/centos
# systemctl start dnsmasq


これで自動でPXE Bootして,Kickstartでインストールしてくれるはず.
もしKickstartを使わず手動インストーラをぽちぽちするならば,
2.で/mnt/centosにファイルを配置とかじゃなくてisoを直接マウントして,
grub.cfgのカーネルコマンドラインからks=の部分を削除すれば大丈夫です.