Twitterに上げる動画をffmpegで再圧縮する

一眼レフカメラで撮った動画をTwitterにあげようにも「互換性のない」と却下されるのでffmpegで変換することに。
変換前後でVLCのコーディック情報を比べると色空間情報が消えてるのでAdobeRGBなどを使ってると弾かれる模様?

ffmpeg -i “input/file/path.mp4” -c:v libx264 -c:a aac -vf fps=30 -aspect 16:9 outputfilepath.mp4

場合によってはこれ以上のオプションをつけないといけないかもしれない

セキュキャン△(セキュリティキャンプのススメ)

タイトルでコケてますね。流行に乗りたかったんです、ゴメンナサイ。(2020年になっては流行りでもなくなった…)

さて
セキュリティ・キャンプ全国大会2018
セキュリティ・キャンプ全国大会2019
セキュリティ・キャンプ全国大会2020(オンライン)

セキュリティ・キャンプ全国大会の受講者の募集が始まりましたよ。
今年もまた、あの熱い夏が来るんですね…どんな方が参加するのか…
今年は、講師の方との交流時間が増やされていたり、小中学生でも参加しやすいように就寝時間が早めのジュニアユースができていたりと、去年参加した私たちの感想や意見が反映されててとてもいい感じです。

2020年追記: 今年はオンラインで長期間実施するそうですが、オンラインでも多くのことが得られるのではないかと思います。また「受講生としての参加は一回のみ」という原則がありますが今年ばかりは特例が出て来年も応募できるみたいです。二度行けるなんてお得じゃないですか、今すぐ応募しましょう。

私自身のセキュリティキャンプの応募用紙や体験記はカテゴリー: セキュリティキャンプにある記事を参照してください。
数個リンクを貼っておきます。
セキュリティキャンプ 応募課題晒し
セキュリティキャンプ 応募から結果発表まで
セキュリティキャンプ2017参加記
セキュリティキャンプ2019参加記(チューター)

今回これを書いたのは、セキュリティキャンプに応募しようか迷ってる人に一つでもいいから情報を渡せたらいいなと書いたものです。SEO的に検索結果の下の方に出てたかと思いますが、それにもかかわらず、わざわざ見ていただきありがとうございます。

参加すると何がいいのか

突然ですが、あなたはどこに住んでますか。
都会でしょうか、それとも田舎でしょうか。
そして、あなたの周りに80人くらいのITに熱意ある学生はいますか。

私は参加当時福岡に住んでいたのですが当時周りに自分の興味のあることを詳細に語り合える人はいませんでした。
また、IT関係のイベントにも参加していませんでした。
TwitterではITに詳しい人を見かけるけど、どう話したらいいかわからない、という気持ちでした。
(詳しい経緯は応募課題を見てもらえればわかりますが)そんなある日、ふと脳裏にセキュリティキャンプが浮かびました。
無我夢中で応募用紙を書き上げて応募し、結果ありがたく参加させていただけることになり実際参加してみると多くのIT関係者の方にお会いできました。
自分より年下の参加者や年上の学生の方、中には協賛企業の方、有名な本を書かれているプログラマーの方とお話できる機会もあり、それは今でも心の中に焼き付くほどの経験です。
キャンプの間は様座な人の意見や得意分野の話、将来の目標などを聞きました。
その後帰ってくるとOSCやLT大会と実は周りにも話を聞いたり発信できる場があることを発見しました。
いや、正確には行く勇気が出ました。セキュリティキャンプに行って、「情報は情報を発信するところに集まる」という言葉に背中を押されやる気が出ました。
「セキュリティキャンプに行って自分はまだまだだと挫折を感じた。」という文章を多く見たかと思います。たしかに私も失敗をたくさんしましたし、挫折も感じました。
ただ挫折で終わらせないのがセキュリティキャンプです。きっとあなたの背中を押してくれるような体験も待ってるはずです。

セキュリティキャンプの良さはあなたの視野をグッと広げてくれて、さらなる挑戦への勇気を与えてくれるということです。(他にもたくさんあります)

セキュリティに詳しくないよ…

私はx86OS自作入門コースにいましたが、みなさんが想像するような、アンチウイルスソフトや、不正アクセス検知などは一切していません。
RustでOS(といえるのか?)を書いてましたが、Rustはセキュアな言語を目指してるのでそんな言語でOSを作ればセキュリティに貢献するかもしれないと思ってました。
集中コースでプログラムを書いてみたいなら、セキュリティに深くこだわる必要もないかもしれません。
また、選択コースでは以前耳にした暗号技術や興味のある分野のセキュリティについての講義を受けるのも良いかもしれません。
いずれにせよ準備期間があり、その間にオンライン上で事前学習ができますのでそこでわからないことを詳しく聞けるでしょう。

ガチプロじゃないから落ちそう

「ガチプロじゃないけど受かった」って文章、たっぷり見てきたでしょう。
ガチプロじゃなくても受かるらしいですよ。中にはガチプロなのに偽…なんでもないです。
私はやってきたことをイキってイキりまくってドヤ顔で書きました、もうそれはあとから見てしょうもないことまで書いてるなぁと思うほど。
とりあえず、書いてみましょう。

多くの講師の方がよくおっしゃってることは「課題ではやる気を見ている」ということです。
「調べてみてこういうところがわかったけど、〇〇がよくわからなかった」よりも「調べてみたけど、○○がわからなかった。だからサイトを参考にこんなプログラムを書いてみた、どうしてもわからないここの部分だけはサイトのコードを真似したけど、それ以外は自分なりの理解で書いてみた。書いたプログラムを実行したところ、大方動くけどたまにクラッシュするから解析したところ、△△な処理でおかしくなってるみたいなので修正を試みたが、うまく行かなかった。」のほうが自分なりの解釈と解決方法を提示していて、成功はしていないものの様々な事を試したことがわかります。
参加記を見ていただくとわかりますが、キャンプの中では複雑怪奇な不具合に遭遇することもあり、単純なネットサーフィンだけでは解決できないこともあります。その時に様々な手段で解決しようとすることが重要となってきます。講師の方はその手段を取る熱意があるかを見ているのだと思います。

セキュリティ・キャンプは修了してもそこで終わるわけではありません。
続けてこそだと思います。
今でも修了生とのつながりもありますし、修了生の主催したLTにも行ったことがあります。
あなたがセキュリティキャンプで素敵な経験をできることを願っています。

Zen言語で配列ポインタに詰まった話

オンライン授業で課題が多くてバタバタしているPG_MANAです。

今回、Zen言語(https://zen-lang.org/ja-JP/)に新しいバージョンが登場し言語仕様が一部変わったようで、build.zenの書き換えが必要になりました。

それとは別にZen言語でVRAMに書き込もうとしたときに躓いたので備忘録して残しておきます。

環境

  • Solus Linux(Linux Kernel 5.6.4-152.current) x86_64
  • Zen(v0.8.20200706LTS)

ソースコードと解析

今回書いていたコードはi386な環境でfreestandingで起動して画面を白で塗りつぶすというものです。(hariboteOSのブートローダを使用)(一部コードを削除)

export fn HariMain() linksection(".text.hari_main") noreturn {
    var p: usize = 0;

    if (binfo.vmode == 16) {
        const vram = @intToPtr(*volatile [*]mut u16,0xfd000000).*; // 0xfd000000はVRAMのアドレス
        const max: usize = 1024 * 768;
        while (p < max) {
            vram[p] = 0xffff;
            p += 1;
        }
    }

    while (true) {
        asm volatile ("hlt");
    }
}

これがうまく動かないのでobjdumpを覗いたところ

...
  48:   b8 00 00 00 fd          mov    eax,0xfd000000
  4d:   8b 00                   mov    eax,DWORD PTR [eax]
  4f:   89 45 f8                mov    DWORD PTR [ebp-0x8],eax
  52:   81 7d fc 00 00 0c 00    cmp    DWORD PTR [ebp-0x4],0xc0000
  59:   73 1c                   jae    77 <HariMain+0x47>
  5b:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
  5e:   8b 4d f8                mov    ecx,DWORD PTR [ebp-0x8]
  61:   66 c7 04 41 ff ff       mov    WORD PTR [ecx+eax*2],0xffff
  67:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
  6a:   83 c0 01                add    eax,0x1
...

となっています。
これをみるとVRAMにアクセスする際の手続きが
*(*(0xfd000000) + 2 * p)となっています。これではうまく動きません。

一瞬コンパイラのバグを疑ったのですが、よくよく考えると配列型の実態は配列の最初の要素のポインターに過ぎないので@intToPtr(*volatile [*]mut u16,0xfd000000).*と書くとそうなるのは、まあそれはそうです。@intToPtr()につられてついつい一番前に*をつけてしまいました。良くない良くない。

さて原因がわかったので単なる配列型にキャストすべく、const vram = @intToPtr(volatile [*]mut u16,0xfd000000);としてもコンパイルエラーになるので、どうしたものか悩みながら試行錯誤していたところ、順序を入れ替えて
const vram = @intToPtr([*]volatile mut u16,0xfd000000);としたらできました。

結論

export fn HariMain() linksection(".text.hari_main") noreturn {
    var p: usize = 0;

    if (binfo.vmode == 16) {
        const vram = @intToPtr([*]volatile mut u16,0xfd000000); // 0xfd000000はVRAMのアドレス
        const max: usize = 1024 * 768;
        while (p < max) {
            vram[p] = 0xffff;
            p += 1;
        }
    }

    while (true) {
        asm volatile ("hlt");
    }
}

@intToPtrなどビルドイン関数を利用する時はその意味をよく吟味して使いましょう…

MouseProのLTEモジュール(Telit LN940)をLinuxで使う

HPのノートパソコンでハズレを引いて落ち込んでいたのですが、ラストチャンスということでもう一台購入するチャンスを手に入れました。変な欲を出してLTEモジュールがついたPCを選ぼうとMouseProのノートパソコンを購入しました。LenovoのThinkPadも考えましたが、HPのサポートの件でサポート評判の悪いメーカは却下されました。
さて、動作確認用OS・Windowsでは大体のテストは完了しopenSUSEを入れたわけですが、LTEモジュールはすぐには認識してくれませんでした。まあこれは想定していたことでしたし、lsusbやusb-devicesでは表示されているのでいろいろ調べてみることにしました。

追記(2022/04/03)
ATコマンドを使用して利用可能にする方法について別記事を作成しました。
MouseProのLTEモジュール(Telit LN940)をLinuxで使う(ATコマンド編)

環境

  • MousePro-NB510HL
  • openSUSE Tumbleweed
  • KDE Plasma Desktop

搭載されているデバイスを確認

$ usb-devices
...(略)...
T:  Bus=02 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
D:  Ver= 3.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs=  3
P:  Vendor=1bc7 ProdID=1900 Rev=03.10
S:  Manufacturer=Telit
S:  Product=Telit LN940 Mobile Broadband
...(略)...

USBデバイスとして接続されていて、Telit社のLN940というデバイスらしいです。
調べてみるとLinux用のドライバあるようで、マニュアルもあり(https://www.telit.com/wp-content/uploads/2018/03/Telit_LN940_Linux_SW_User-Guide_v1.2.pdf)それを読むと、Linuxカーネルにドライバが存在してそうだなと解析しました。

cdc_mbimとqmi_wwan

どうやらWWAN用のモジュールとしてcdc_mbimとqmi_wwanの二種類があるようで、どういう関係でどういう歴史があるかは今後調べていきたいと思いますが、とりあえずデバイスがどういう風に認識しているか確認します。

$ dmesg | grep ww

とするとcdc_etherとしてLTEモジュールが認識されていることを確認できます。
明らかに認識が間違っているのですが、無理やりudevなどでモジュールを変更しようとしても失敗するのでネットを漁っていると、 https://techship.com/faq/how-to-configure-telit-ln94-series-cellular-modules-to-qmi-mode-used-by-linux-systems-with-qmi-wwan-or-gobinet-driver/ を発見しました。
usb_modeswitchを使うらしいです。とりあえずusb_modeswitchやlibqmiやmodemmanagerをインストールします。(ModemManagerはsystemctlでenableしてstartしておきます)

設定


先にKDEのネットワーク設定からMobile Broadband Connectionを追加しておきます。
Docomo系のMVNO(OCN Mobile ONE)の場合は”Any CDMA device”=>”日本”=>”NTTdocomo”=>”My plan is not listed”=>”lte.ocn.ne.jp”=>”完了”で設定を追加して、ユーザ名(mobileid@ocn)とパスワード(mobile)とPIN(初期設定では0000)を設定して保存します。
次に

$ sudo usb_modeswitch -v 1bc7 -p 1900 -u 3

としてみます。再度usb_devicesで確認してみますと、cdc_mbimとして登録されています。
この状態でモバイルブロードバンドを「接続」をやってみると接続に一瞬成功するのですがすぐに切れてしまいます。usb_modeswitchで確認してみますとモードが2に戻っています。
仕方ないので

$ sudo usb_modeswitch -v 1bc7 -p 1900 -u 1

としてみますと、今度はqmi_wwanとして登録されています。
これで接続してみますとうまく接続されています。

接続が成功している状態

これを永続化させるためにudevに設定を追加します。

$sudo vi /etc/udev/rules.d/15-lte.rules

ATTR{idVendor}=="1bc7", ATTR{idProduct}=="1900", RUN+="/usr/sbin/usb_modeswitch -v 1bc7 -p 1900 -u 1"

これで再起動時に再接続されるようになります。(Wifiを優先させたい場合は自動接続を着ると良いと思います)

さらにスリープから復帰した際にusb_modeswitchが動作するようにsystemdのサービスを作成します。

$ sudo vi /etc/systemd/system/wwan-sleep-hook.service

[Unit]
Description=Exec usb_switch for the WWAN module at resume
After=sleep.target

[Service]
Type=simple
ExecStart=-/usr/sbin/usb_modeswitch -v 1bc7 -p 1900 -u 1

[Install]
WantedBy=sleep.target

作成した後はsystemctl enable wwan-sleep-hook.serviceで有効にしておきます。

書き忘れていることもあるかもしれないのでうまく行かない場合はコメントをください…

埋伏智歯(親不知)を2本抜いたお話

新型コロナウイルスで世間は様々な場面で痛手を負ってますが、抜歯でそれどころではないPG_MANAです。
今回は親知らずを春休みを利用して抜いてきたのでそれの記録をしておきます。
書いて需要があるかはわかんないですが、この雑記は自分でも見返すので後々「あ〜あのときはすごかったなぁ」と振り返るために書いておきます。
これから親不知を抜く人や暇潰しをしたい方に読んでいただければと思います。

抜歯の理由

自分の親不知は、上下4本すべて完全に埋まっていて(完全埋伏歯というらしいです)、レントゲンを見ると見事に斜めになって埋まっています。この内下二本は内側を向いており歯並びに悪影響を及ぼし噛み合わせが悪くなることから、かかりつけ歯科医の先生から大学生での抜歯を勧められていました。抜歯手術と聞いて気が進みませんでしたが、噛み合わせが悪くなって頭痛に悩ませられるのも嫌なので長期休暇を利用して抜くことにしました。
完全に埋伏歯の手術は高度な技術が必要らしく、かかりつけ医の先生では時間がかかってしまうとのことでしたので、別の病院で抜くことになりました。

1本目抜歯当日

さて1本目抜く日が来てしまいました。
朝から「嫌だなぁ〜嫌だなぁ」と言いつつも病院まで自転車で移動しました。
診察が始まり紹介状を渡してレントゲンを撮った後、すぐさま手術が始まりました。
数回麻酔を打たれるんですが、だんだん奥歯の根本に鈍痛が来てその後痺れてきます。
麻酔が効くまで10分位待たされるんですがそれがまた地獄で、いらぬ予想を膨らませて冷や汗が止まらなくなっていきます。
待たされた後、「では始めます〜」と言われて口の中にメスが入ります。歯肉を切るのでメスを使うのは至極当然なのですが、生まれてこのかた口の中にメスを入れるなんて想像もしたことがなかった自分は早くも顔面蒼白。歯肉が開かれエアタービン(キュイーンとなるやつ)を使って親不知を削ります。その後リムービングドライバと呼ばれるマイナスドライバ状の器具で歯を割っていくと言われたんですがこれが一番の地獄でして、ガッツガッツ顎を突かれるので顎が疲弊するわ、「メリメリメリ…パキッ」という口の中で聞きたくない音が顎を伝って直接耳に届くわ、涎が溜まって舌を動かしたくなるがドライバで間違って刺されたらひとたまりもないと思い必死に我慢するわ、とにかく耐える時間が続きました。おかげで背中は汗でびっしょりになりました。時々口から何かを取り出す度に「これで終わりか?」と期待しては再びドライバが入って目をつぶって耐えるを繰り返した後、縫合が行われて終了しました。わずか30分で終了したようです。ガーゼを噛んで圧迫止血した後会計を済ませて(治療費は6000円)病院を後にして薬局で抗生剤と解熱鎮痛剤(ロキソニン)をもらって帰りました。夜までは麻酔が効いてましたが徐々に切れたので鎮痛剤を飲んで寝ました。

抜歯1日後

抜歯の後は腫れると聞いていましたが、大して腫れずに痛みも口内炎のような痛みで鎮痛剤でどうにかなるレベル。口も炎症があって大きくは開きませんが噛むことはできる程度。
「なんとかなりそうだし、柔らかいものなら食べよう」と焼きそばや煮魚を平らげて実家の作業を手伝ってました、後の苦しむとは知らずに…

抜歯2,3日後

朝起きて鎮痛剤を飲んで昼に鎮痛剤が切れた頃から痛みの種類が変わってることに気づきます。口内炎のような広く痛いのではなく、穴が空いた部分がクリティカルに痛い神経痛に変わり激痛になって襲いかかってきます。鋭い痛みは頭痛をも誘って頭と顎を抱えながら寝込む羽目に…鎮痛剤は最低でも6時間開けないといけないので痛みに耐えて時間が経ったら即座に鎮痛剤を飲むを繰り返す日々になり食欲も失せてしまいました。夜中に鎮痛剤が切れて「イッテェェ」と叫びながら起きて鎮痛剤を飲んで効果が出るまで30分程度顎を押さえて耐え、効果が出てきて耐えられる程度に収まり穏やかな眠りについたのもつかの間、4時間しか持たず激痛に叩き起こされ寝不足になりました。それでも段々痛みが引いてきて3日後の昼には耐えられる程度になっていきました、が…

抜歯4〜7日後

今度は抜歯傷付近から非常に不味い汁(アルカリ性だと判断)が出てきて口の中を襲います。
おまけに口の中から強烈な腐敗臭がして、周囲からもしかめっ面をされるのでマスクを室内でも着用するようになりました。
最初は麻酔が打たれた部分が化膿したのかと思いましたがそのような雰囲気でもないので謎の苦汁に苦しむ羽目に…痛みは完全に引かないので唾液が出てそれが苦くなり舌がしびれるような感覚に苦しみそれを中和をしようと余計に唾液が出てまた苦くなるの悪循環に陥り鼻水まで垂らして苦しみました。アルカリ性なら中和すればいいとレモン飲料や梅干しを舐めるなど涙ぐましい努力で耐え抜きました。
後にかかりつけ医の先生に「食べかすが親不知周辺の歯にくっついて腐敗したんですよ」と教えてもらいました。激痛で親不知周辺を触らないように、磨かないようにしていたのと抜歯後調子に乗って色々食べたのが仇になっていたようです。
苦汁を舐め続けて舌も痺れて、おまけに急に肩と顎が凝ってガクガクと震えるので湿布を貼って寝るなどいろいろ辛くて、ろくに思考もまとまらなくなりチマチマGoogle App Engineをいじる程度しかできなくなりました。

抜歯8〜12日後

苦汁は相変わらず出続けご飯も美味しく食べられない日々ですが段々とくさやのような匂いになり味も魚の乳酸発酵したような味になり不味いことに変わらないのですが多少耐えられるようになりました。痛みも大分引いてきて鎮痛剤は手放せないですが気にならない程度になりました。しかしながら炎症は引いてないようで倦怠感に襲われ眠気が取れず午前中は寝ながらボォ〜とコロナショックで乱高下する株価を見て、午後になってApp Engine移行作業をする日々が続きました。眠気も普段より早く来て11:00までは眠りについてることが多くなりました。それでも段々と回復してそろそろ本調子と行こうとした時にその時は来るのです…

2本目抜歯当日

「嫌だなぁ」と思えどその時は来るのです。
診察台によだれかけをつけられて寝かされ、先生が来るのを待ってると前回と違う先生が登場し「抜歯後の調子はどうですか?」と訊かれて、「きつかったです…」と疲れた顔で答えました。抜歯時の縫合糸は本来一週間後に抜いてもらうのですが、今回は抜歯と同時にしてもらおうと「あっ、『バッシ』(抜糸)を先にお願いできますか?」「『バッシ』(抜歯)を先にですね、わかりました〜麻酔しますね〜」「あっ、ごめんなさい、糸の方です」「糸の方ですね、失礼しました」というやり取りもしながら抜糸・麻酔・歯肉切開と進んでいきます。現在の状況を親切に説明してくださり、智歯を砕いて割ってそれから引っこ抜くみたいなのですが、そこで例のマイナスドライバが出てくるわけでてきます。智歯が大きくなかなか割れないため何回も突いている時に勢い余って歯茎に刺さりそうになりながら「アッすみません」と言われて冷や汗をながすなどしているうちに糸で縫って終了。今回も30分程度で終わり、また薬をもらって家に帰りました。前回と違いもう抜かなくて良いという気の軽さはありましたが、明日から苦しまないといけないという暗い気持ちは残りました。

2本目抜歯1日後

朝起きたら頬が腫れてました。
明らかに一本目よりも酷く腫れており周りも見てわかる程度です。
一方で神経痛や口内炎のような痛みがなくただ頬が腫れてそれによる熱を持った痛みがあるだけで鎮痛剤がなくても耐えられる程度でした。しかしこの後が怖いので服用しておきました。
前回の反省を踏まえ食事は栄養ゼリーと野菜ジュースという普段なら絶対食べない、噛まなくていい加工食品のみで直接胃に流し込みます。
倦怠感は相変わらず発生しますが、痛みがないだけマシかなと思いながらこたつで寝るなどしていました。

2本目抜歯2日後

朝起きたら頬がパンパンに腫れてました。それはもう輪郭がわからなくなるほどでおたふく状態です。朝から微熱があり布団で横になっていたところ、親が緊急外来に駆け込むという事態が発生しまして、朝からドタバタしました。命には別状はないもののやはり焦るものでアドレナリンが出て体調不良なんて強制的になかったことにされ発熱も倦怠感もなくなりキビキビ動けました。鎮痛剤より遥かに効くアドレナリン…
午後に無事に帰宅できたわけですが、その日はわけのわからない体調が続きました。
アドレナリンの影響で体はエネルギーに満ち溢れてるしキビキビ動くけど発熱で頭がボォーとして倦怠感はひどいという寝てようか作業しようか悩ましい状況になりました。
とはいえ作業しても仕方ないので寝ました。
食事は相変わらず栄養ゼリーで凍らせて晴れた頬に当てて解かして飲んでました。

2本目抜歯3,4日後

更に頬が腫れ熱も38.1℃も出て汗をダラダラ流しながら布団で寝続ける日々を送りました。
と言っても3日目午前中は発熱していることにも気づかず家の作業を手伝っていたのですが、途中から強い倦怠感に襲われて寝ました。
痛みが我慢できるからという理由で服用を止めていたロキソニンですが、鎮痛目的でなく解熱目的で使用することに。
腫れは首にまで及び呼吸しにくいこともあり、腫れの中にはとても硬い部分もありました。
頬の腫れにより何かを噛むと必ず口の中の皮まで噛んでしまうため、ヨーグルトや栄養ゼリーしか食べれなくなり、さらに口を開けようとすると頬が攣るという人生初めての経験をするはめに…
食べては寝るを繰り返し耐えました。

2本目抜歯5,6日後

腫れも引いてきて、長かったお布団生活も終わり起き上がって作業できるようになりました。
倦怠感はありますが、数日前とは比べ物にならないほどに改善しました。
口も徐々に開くようになりましたが、こちらはまだ時間がかかるようです。

2本目抜歯7日後

この日にかかりつけ医の先生に抜糸してもらい今回の件で病院行くのは最後となりました。
最初に抜いた方は段々と元通りになっていっており、後一週間たてば2本目もほぼいつもどおりに使えるようになるとのことです。
たまに神経痛がする程度で腫れも9割方なくなりました。

感想

抜歯で一ヶ月近く四苦八苦にしたわけですが、新型コロナウイルスでイベントも全滅していたので生活面での悪影響はプログラムがかけなかったくらいです(頭が回らないのでコードがかけない、かけないと何もしてないという感覚が精神を蝕むという悪影響)。
通常の抜歯より遥かにきつかった埋伏智歯抜歯ですが、無事に後遺症に悩まされることもなく治りそうなので良かったです。
今後抜く予定の人は以下のことに気をつけたら良いと思います。

  • 抜歯1日後に食事ができると判断した場合でも肉類は食べない(抜歯部分は歯磨きができないため、そこについて腐ってしまう)
  • 抜歯前に噛まずに食べられるゼリーなどをかっておく(場合によっては全く噛むことができなくなります)
  • 液体歯磨きを口に含んで数分待って吐き出すをすると腐敗臭が減る
  • 痛くなくても抜歯後数日間は処方された解熱鎮痛剤は飲む

WiresharkでWifiでの通信を取れるか検証した話

某大学のWifiの学生認証が平文だったので、そのことを指摘する前に自室のWifiで平文通信をキャッチできるか検証してみました。公共の場所での許可のないキャプチャは違法となりますのでご注意を…

使用した機材

  • BUFFALO WI-U2-300DS
  • Kali Linux 2019.4 (VirtualBox)

手順

まずはKali Linuxを起動して、WI-U2-300DSを接続します。(VirtualBoxではUSBコントローラーが2.0以上でないと正しく動かないことがあった)
端末を起動して「iwconfig」を実行すると以下のような感じで子機が認識されているはずです。(wlan0は環境によっては異なるかもしれません。以降はwlan0と仮定します。)

wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry short  long limit:2   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off

次に稼働しているWifi関係のツールを止めます。

airmon-ng check kill

おそらくwpa_supplicantが停止させられます。
次に子機をモニターモードにします。iwconfigを使います。(間にifconfigでdownとupを挟まないとうまく行かない…?)

ifconfig wlan0 down
iwconfig wlan0 mode monitor
ifconfig wlan0 up

うまく行けば無言でプロンプトが帰ってくるので、そのまま作業を進めます。
次に

airodump-ng wlan0

を実行するとSSIDの一覧が出ますので、キャプチャしたいSSIDをみつけ、チャンネル(CH)をメモします。

次にWireSharkを起動します。
先に「表示」=>「無線ツールバー」より無線ツールバーを出しておきます。
今度はWPAの鍵を設定します。
「編集」=>「設定」=>「Protocols」=>「IEEE 802.11」=>「Decryption keys」より
鍵を入力します。
WPA2-PSKの場合はhttps://www.wireshark.org/tools/wpa-psk.htmlでSSIDとパスワードを入れ、生成されたキーを「+」=>「WPA-PSK」と選んで入力します。
OKを押して閉じていったあと、「キャプチャー」=>「オプション」より、wlan0を選択して、キャプチャを開始します。
無線ツールバーで先程メモしたチャンネルを接続後、別端末で該当Wifiにつなぎます。(最初のハンドシェイクが傍受できないと解読できないため、つないでいる場合は一旦切って再接続してください。)

うまく解読できれば、色付きのログが流れてくるはずなので、example.comでも接続するとHTTP通信内容が見れます。

感想

公共WifiなどのHTTP通信もダダ漏れなんでしょうね…恐ろしい。
あとセキュリティに詳しくなりたい。

Sakai19(Sakai Project)をインストールした

Sakaiというのは学習管理システムとかeラーニングとか言われてるシステムで、大学ではMoodleかこっちを使う所が多い(?)そうです。某所で古いバージョンのFork版が動いてたので、ふと思い立ってサーバー立て時の記録を残しておきます。Tomcatなどのいい勉強になったかな(半日潰れた)。

構築環境

  • Ubuntu 18.04 LTS
  • Google Cloud Platform Compute Engine n1-standard-1
  • RAM 3.75GB
  • HDD 10GB
  • Sakai 19.03

テストで立てたので環境も即席のものです。最初は別サーバーのDockerコンテナでやろうと思いましたが、URLをサブディレクトリにすることができず、サブドメインの設定をするのも面倒だったのでIPアドレスが降ってくるGCE使いました。JVMを使うからなのか、メモリは結構食いまして2GB以上は必要なのではないでしょうか(足りないと途中でエラー吐いて死ぬことがある)
https://confluence.sakaiproject.org/pages/viewpage.action?pageId=109772886
基本はここを見ながら進めます。

Tomcat導入

まずは、必要なパッケージを落としておきます。

apt-get install git openjdk-8-jdk maven mysql-server nginx

最初はOpenJDK-11-JDK入れていたんですが、うまく動かないので8を持ってきました(ドキュメントでもJava 1.8とあるし、JDKの互換性は結構ないんですね…)
つぎにTomcat 8系をひっぱってきます(ここらへんからsuなどでrootになってるほうが楽かも)
https://tomcat.apache.org/download-80.cgi でtarボールをダウンロードしてきて/opt/以下に展開します。(注意したいのはapt-getでのtomcatではだめで、tomcatのパッケージにSakaiのバイナリを追加する形で動かすようです。)
そしてリンクを張っておきます。

cd /opt/
tar xvf apache-tomcat-8.5.49.tar.gz
ln -nsf apache-tomcat-8.5.49 tomcat

次にドキュメントにあるようにtomcatのbin/setenv.shに以下の内容を追加します。

export CATALINA_HOME=/opt/tomcat
export JAVA_OPTS="-server -d64 -Xms1g -Xmx2g -Djava.awt.headless=true -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -Dhttp.agent=Sakai"
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false"
JAVA_OPTS="$JAVA_OPTS -Dsakai.security=$CATALINA_HOME/sakai/"
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Tokyo"
JAVA_OPTS="$JAVA_OPTS -Dsakai.cookieName=SAKAI2SESSIONID"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8089 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Duser.language=ja -Duser.region=JP"

高速化のロジックがドキュメントでは乗っていますが、お好みに応じて行います。

Sakaiの起動

次にhttp://source.sakaiproject.org/release/よりSakaiのバイナリパッケージを引っ張ってきます。これをTomcatのディレクトリで展開します。

cd /opt/tomcat/
tar xvf sakai-bin-19.3.tar.gz

また、SakaiでMySQLを使うにはひと手間いるらしく、まず、https://dev.mysql.com/downloads/connector/j/より、「Connector/J」の「Platform Independant」のtarを持ってきて中にある「mysql-connector-java-.x.x.x.x.jar」をtomcat/lib/ の中に放り込みます。

次にmy.conf(Ubuntuでは /etc/mysql/mysql.conf.d/mysql.conf らしい)の[mysqld]以下に

default-storage-engine=InnoDB
lower_case_table_names=1

を追加します。(https://confluence.sakaiproject.org/display/DOC/Sakai+11+database+supportより)

次に tomcat/sakai/local.properties にhttps://confluence.sakaiproject.org/pages/viewpage.action?pageId=109772886に従って次の設定を書き込みます。(sakaiuserとsakaipasswordとsakaidatabaseは適宜置き換えてください)

username@javax.sql.BaseDataSource=sakaiuser
password@javax.sql.BaseDataSource=sakaipassword

## MySQL settings
vendor@org.sakaiproject.db.api.SqlService=mysql
driverClassName@javax.sql.BaseDataSource=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
url@javax.sql.BaseDataSource=jdbc:mysql://127.0.0.1:3306/sakaidatabase?useUnicode=true&characterEncoding=UTF-8
validationQuery@javax.sql.BaseDataSource=select 1 from DUAL
defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTED

これに従って、mysqlで該当データベースとユーザを追加します。(ドキュメントを参考にすると良いでしょう)

次にnginxのリバースプロキシを設定します。
local.propertiesにserverURIを記載していても、NginxでHostをSakaiにパスしないと正常に動作しないので注意してください。(ここを忘れててうまく行かなかった)

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    ....
}

ここまですると、設定が終わっているはずなので、tomcat/bin/startup.shを叩くと起動が開始します。tomcat/logs/catalina.outを確認してエラーで死んでなければ、起動後(2分くらいかかります)、http://hogehoge/portal/にアクセスするとメイン画面が出てきます。(UserName:admin PassWord:admin で入れます)

だいぶ雑な説明でしたが、とりあえずinstall記です。

ibus-mozcのビルド記

ibus-mozcがないLinuxディストリビューション使ってるので、ビルドしてインストールしました。
今回はx86_64環境とします。

ビルドにはibus-develみたいなibusの開発用パッケージが必要とGTK+-2.0-develとQt5Base-develが必要です。
そんでももって以下のコードを実行します。

$ git clone https://github.com/google/mozc.git
$ wget https://raw.githubusercontent.com/PG-MANA/solus-ibus-mozc/master/files/mozc.patch
$ patch -p < mozc.patch
$ cd mozc/src
$ GYP_DEFINES="ibus_mozc_path=/usr/lib64/ibus-mozc/ibus-engine-mozc server_dir=/usr/lib64/mozc" \
        python build_mozc.py gyp
$ python build_mozc.py build -c Release unix/ibus/ibus.gyp:ibus_mozc server/server.gyp:mozc_server \
        gui/gui.gyp:mozc_tool renderer/renderer.gyp:mozc_renderer

Server_dirは/usr/lib/mozcにするとリンクのせいか(大抵x86_64は/usr/lib は/usr/lib64 にリンクされている)、起動に失敗するようでした。

そんでももってできたファイルをインストールします。
以下のコードをrootで動かしてください

pushd out_linux/Release
install -m 00755 -D ibus_mozc      /usr/lib/ibus-mozc/ibus-engine-mozc
install -m 00755 -D mozc_renderer  /usr/lib/mozc/mozc_renderer
install -m 00755    mozc_server    /usr/lib/mozc/mozc_server
install -m 00755    mozc_tool      /usr/lib/mozc/mozc_tool
install -m 00644 -D gen/unix/ibus/mozc.xml  /usr/share/ibus/component/mozc.xml
popd
pushd src/data/images/unix
install -m 00644 -D ui-alpha_full.png  /usr/share/ibus-mozc/alpha_full.png
install -m 00644    ui-alpha_half.png  /usr/share/ibus-mozc/alpha_half.png
install -m 00644    ui-dictionary.png  /usr/share/ibus-mozc/dictionary.png
install -m 00644    ui-direct.png      /usr/share/ibus-mozc/direct.png
install -m 00644    ui-hiragana.png    /usr/share/ibus-mozc/hiragana.png
install -m 00644    ui-katakana_full.png  /usr/share/ibus-mozc/katakana_full.png
install -m 00644    ui-katakana_half.png  /usr/share/ibus-mozc/katakana_half.png
install -m 00644    ime_product_icon_opensource-32.png  /usr/share/ibus-mozc/product_icon.png
install -m 00644    ui-properties.png  /usr/share/ibus-mozc/properties.png
install -m 00644    ui-tool.png  /usr/share/ibus-mozc/tool.png

これでとりあえず動くはずです
必要なことがあれば後で追記します。

OtakuAssembly 出版記

OtakuAssembly Vol.1が技術書典7で出ました。
https://techbookfest.org/event/tbf07/circle/5710683937177600
ここでは終了後の感想やOtakuAssemblyの成り立ちなどを書いておきます。

OtakuAssemblyの成り立ち

2019/4/14の池袋で技術書典6がありました。
当時上京したてで初めての東京らしい大規模イベントに参加しました。
セキュリティキャンプを超える1万人の人混みの中で今まで見たこともない数の技術書同人誌を見て多くの先端技術やニッチな技術を知りました。
そのときにセキュリティキャンプ2017に参加したときのあの熱さとともに当時思っていた「新たな視点でOSを作る人の支援をする」という目標を思い出しました。
「自分も本を出版して新たなOS自作をする人のお手伝いしたい」、そう熱い思いを抱えて帰宅し密かに文を書き出しました。ところがいざ書き始めると「本を書くのは思っていたより難しい…」「こんな初歩的なネタで受けるんだろうか…」「印刷費も高いし大損はしたくないな…」と多くの壁が立ちはだかりました。そんな不安でモジモジしていたときに@sksat_tty氏に会う機会があり、雑談の後ある話題を持ちかけました…「技術書を一緒に書いてみないか。そうすればボリュームも増えてクオリティーも上がるし印刷費も分担できてリスク回避にもなる。合同誌だとネタにもなるだろうし、もう少しメンバーを増やせばもっと面白くなりそう。」と。sksat氏の返事は芳しくなく「やるならちゃんとした内容でやりたいし今の自分ではその域に達していないから…」というごもっともな意見で話が終わりました。そんな話を聞いて自分も「OSがバリバリできるわけでもないし、やっぱり本を出すのはおこがましすぎるかな…」と技術書執筆の熱も冷めていきました。
執筆作業もおろそかになっていたとき突然sksat氏から声がかかりました。どうやら「『本を書きたい』と言っているうちは書かないんですよ。」と煽られたとのことで、sksat氏とたまたま一緒にいたCra2yPierr0t氏を巻き込んで「本を書こう!!」とSlackチームが結成されました。
その後にTwitterで募集をかけたらメンバー10人以上になったり、Otaku + Assemblyという安直足し算でサークル名が決まったり、脅威の300Pの本ができたり…とあっという間に時が過ぎていき、気づけば技術書典7でサークル側に立っていました。

OtakuAssembly Vol.1を売ってみて

びっくり、ただただびっくりです。
当初も思いもよらなかった300Pの分厚い「薄い本」ができたと思ったら、43秒で一冊売れる勢いで売れてしまって5時間近くダウンロードカードを渡す作業をして、空いた口が塞がらないほどの驚愕です。
終わった後で原稿を読み返してみたら、圧倒的ボリュームで自分が知らないこともサークルメンバーがたくさん書いてくださってました。
OtakuAssembly Vol.1が成功したのは本当にメンバー皆様のおかげです。
こんなリーダー性のかけらのないオタクと一緒に進んでくれて、最終的に二人原稿を落としてしまいましたが「8人分のゴチャゴチャに低レイヤーネタが詰め込まれた分厚い本」というインパクト抜群の本を出版できましたし、そのおかげで売ることができたと思います。
自分の書いた記事が果たしてどんな評価を受けるかわかりませんが、「技術書を書きたいんだ」という思いのたくさん詰まったOtakuAssembly Vol.1を大切にしたいと思います。
次回が出るかわかりませんがその時はどうか皆さんよろしくお願いします。

OtakuAssemblyの良かった点・悪かった点

良かった点

  • ネタ盛りだくさんのボリューミーな本が作れて話題を呼び完売できた
  • 印刷費のリスクヘッジができた
  • 校閲作業をみんなでできた(文章下手な自分にとって大変ありがたい)
  • 作業が分担できたり、様々な知見を頼りにできた

悪かった点

  • お金の話では少し揉めた(しっかり取り決めて厳重に扱うべき)
  • お金の受け渡しに難がありそう(金銭やり取りは最小限にすべき)
  • 意思疎通がうまく行ってない点もあった(これは自分がリーダーを決めたり、役割を指定しなかったのが悪いです…)

終わりに

BOOTHなどでの販売も予定しているのでよかったら購入してください。
購入してくださった皆様、心から感謝します。またどこかでお会いしましょう。

Thermaldの設定の仕方

熱暴走(?)気味のノーパソを手に入れてしまい、Windowsはなんとか使える範囲だけどLinux入れて並行作業すると動作カクカクなので悲しい(親との相談の上大学用のWindows機として使うことにしました)。Core i5なんだけどなぁ…今回はメーカを冒険してみましたが、Linux機を買うときはメーカもしっかり選びましょう。

そんなわけで、Thermaldを入れて発熱を抑えようと思いましたがその時の設定方法をメモしておきます。thermaldは導入済みとします。
設定ファイル作る方法は

$ git clone https://github.com/intel/dptfxtract.git
$ cd dptfxtract
$ sudo acpidump > a
$ sudo acpixtract a
$ sudo ./dptfxtract *.dat
$ sudo cp /etc/thermald/thermal-conf.xml.auto /etc/thermald/thermal-conf.xml

としたら環境にあった設定ファイルができます。(acpiutilがないとacpidumpあたりは動かないかも)
あとは設定ファイルをお好みでいじってsystemctlでenableしてやるといいと思います。