自己言及器官

プログラマーワナビー

DebianのPackage Maintainerになった

ここ1-2ヶ月ほどGoで書かれたCLIフィルタリングツールである、 pecoをDebian向けにパッケージングして、公式アーカイブに入れる 作業をしていたのですが、pecoとその依存ライブラリがDebian unstableに入ったので、
Debianのパッケージのメンテナになりました。(Debian 公式開発者・Debianメンテナとは別 これらは経験を積むとなれる)

QAページはこちら
DDPO: Haruki TSURUMOTO -- Debian Quality Assurance

どうせなのでGoで書かれた他の有用なツールもパッケージングしたいのですが、
何かいいのあるでしょうか。(Go関連の開発者以外も使うものだと良いです)
よろしくお願いします。


その他

新卒でプログラマ/エンジニア職を探しています。
(編集:2017年5月 一旦雇用先が決まりました)

@tSU_RooT mail: tsu.root AT GMAIL.com

PGP fingerprint
3718 C84E 4EDA 1B5C 4F26
8639 9D3D EE3F 63A6 000E

UbuntuのeCryptfsで暗号化したホームディレクトリを読み込む方法

VirtualBoxVM(Debian sid)上でビルドしていたら、突然PCがホストごとフリーズしてうんともすんとも 言わなくなったので電源を切って入れなおしたのだが、
(initramfs)とかBusybox などが表示されている黒画面しかでなくなったので、そのときの復旧メモ。

とりあえず喪失すると後で手に入らなくなる可能性のあるデータだけ救出しようとして、 今使っているXubuntu(Ubuntuのフレーバーディストリ、Xfceがデフォルト)のisoをUSBメモリに焼いてブートしたのだが。ホームディレクトリが読み込めない、そういえばインストール時に暗号化したのだった……、復号キーはあるけど読み込み方がわからん…となった。 そのものズバリの情報があまり見つからなかったので書いておく。
簡単に言うと、eCryptfsでマウントすれば読み込める。

xubuntu@xubuntu:~$ sudo mount -t ecryptfs  /media/xubuntu/AAAAaaaa-AAAA-aaaa-AAAA-aaaaAAAAaaaa/home/.ecryptfs/tsr/.Private /mnt/mda1
Passphrase: 
Select cipher: 
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32
 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16
Selection [aes]: 
Select key bytes: 
 1) 16
 2) 32
 3) 24
Selection [16]: 
Enable plaintext passthrough (y/n) [n]: 
Enable filename encryption (y/n) [n]: y
Filename Encryption Key (FNEK) Signature [xxxxxxxxXXXXXXXX]: XXXXXXXXxxxxxxxx
Attempting to mount with the following options:
  ecryptfs_unlink_sigs  ecryptfs_fnek_sig=XXXXXXXXxxxxxxxx
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=1356f7a19d526101
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key 
before. This could mean that you have typed your 
passphrase wrong.

Would you like to proceed with the mount (yes/no)? : yes
Would you like to append sig [XXXXXXXXxxxxxxxx] to
[/root/.ecryptfs/sig-cache.txt] 
in order to avoid this warning in the future (yes/no)? : yes
Successfully appended new sig to user sig cache file
Mounted eCryptfs

とやると、/mnt/mda1 からホームフォルダが読み込めた。
AとかXで続いている部分は環境依存とか復号関連のキーとかなので読み変えてください。
一番最初に入れるpassphraseはインストール時にメモっておくように表示される32桁ぐらいの16進数のパスフレーズである。
これだけではダメでfilename encryptionの解除に
/home/.ecryptfs/username/.ecryptfs/Private.sigの下の行に書いてあるフレーズを
Filename Encryption Key (FNEK) Signatureを聞かれた時に入力すれば良い。(上の手順の18行目)
Private.sigの上の行はpasspharseと対応しているようなので、自分の入力が間違っていないかの確認をするのに使える。

 $ sudo ecryptfs-add-passphrase --fnek

で、passphraseを入れても確認できる。情報元
最後のin order to avoid this warning in the future? に yesと答えないと何故かうまくいかないので注意。


PCの障害そのものはやはりファイルシステム不整合だったようで、

 # 使ってるシステムのルートのパスをmount(8)で調べて/dev/XXXX/YYYYを置き換える。
 $ sudo fsck -y /dev/XXXX/YYYY

をUSBブートしたXubuntuのコンソールから実行して、再起動したら治った(はず)
たぶんinitramfsからfsck(8)しても治るはず。


Written by tSU-RooT. Unless otherwise noted, the text of this page is released under a "CC0 1.0 Universal Public Domain Dedication"

Golangで別のgoroutineで起こったpanicではdeferが実行されない

Go言語ではdefer文を使うことにより、関数が終了する際に必ず実行されるような処理を書くことができます。
これにより内部でpanicが起こったりした、通常とは違う処理をした場合でも、ファイルリソースなどの解放を確実に行うことができます、しかしいつも必ずというわけではないようです。たとえば別のgoroutineで起こったpanicにより実行が中断された場合、deferは実行されないようです、以下のようなコードで挙動の違いを確認できます。

問題が無いパターン(deferが実行され、panicがrecoverで補足できるパターン)

package main

import (
    "fmt"
    "time"
)

func main() {
    defer func() {
        fmt.Println("defer!")
        if err := recover(); err != nil {
            fmt.Println("Err!")
        }

    }()
    func() {
        time.Sleep(time.Second)
        panic("panic!")
    }()
    time.Sleep(time.Second * 10)
}
defer!
Err!

deferが実行されないパターン(16行目でgoroutineを立てている)

package main

import (
    "fmt"
    "time"
)

func main() {
    defer func() {
        fmt.Println("defer!")
        if err := recover(); err != nil {
            fmt.Println("Err!")
        }

    }()
    go func() {
        time.Sleep(time.Second)
        panic("panic!")
    }()
    time.Sleep(time.Second * 10)
}
panic: panic!

goroutine 5 [running]:
panic(0x4b8e00, 0xc820068000)
    /usr/local/go/src/runtime/panic.go:464 +0x3e6
main.main.func2()
    /home/tsr/git/tmp/main.go:18 +0x72
created by main.main
    /home/tsr/git/tmp/main.go:19 +0x48
exit status 2

よく考えると納得の仕様のような気がしますが、軽くググってこれについて触れている記事などが見当たらなかったので書きました。


Copyright (C) 2016 tSU-RooT, Permission is granted to copy, distribute and/or modify this text. Unless otherwise noted, the text of this page is Dual licensed under a "Creative Commons Attribution 4.0(or any later version) International License", OR the "GNU Free Documentation License, Version 1.3(or any later version) published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts".

第2回OSS Gate にメンターとして参加した

1月に行ったOSS Gateはビギナーとして参加したのですが、今回はメンターとして参加しました。

開催前はビギナー(参加者、見守られる側)の数とメンターの数が釣り合っておらず、それならメンターとして参加するかなーとおもって行ったのだが、 蓋を開けてみればビギナーよりメンターの方が参加率が圧倒的に良く(おそらく後進を育てたいという目的で来る人が多く、参加率が高いのではないか)
メンターの一部がビギナーとして参加するということになりました、ビギナーの継続発掘が今後の課題です。

前回の反省として、メンターはあまりビギナーに手とり足とり、教えすぎてはいけないと言われたので 基本的に横から見ていて
うまく問題の部分は解決できましたか、と節目節目で声をかけるいう感じで見守っていたのだが、正直きちんとサポートできたのかは不安であります。
その作業のログはGitHubのIssueにまとまっており、ここから閲覧できます。

github.com

その問題はIssueを立てるだけじゃなくてパッチを送って取り込まれるところまで行きました。
(パッチ送付先のRroongaの作者がOSS Gate主催の@ktou さん自身だったのは割と偶然が重なった結果です)

今回、個人的に一番興味深かったのは、Gentoo使いの(確か)高校生でtwmというウィンドウマネージャーに、 知り合いの先生が作ったというパッチを送りたいという参加者です。

割と最近(ここ2年くらい)にUbuntuとかを使い始めたヌルいOSSユーザーの私としては、twm自体初耳で名前を聞いてからググる程度の知識しかなかったのですが、
経験豊かな人たちが両隣からサポートについて、GDBを使ってデバッグを行っていました。
Gitterのチャットによると、パッチ自体はその後も 継続してコーディングして完成したようで、次はメーリスにパッチを投下したいがどうするかという段階まで進んだようです。

github.com

メンターの中にはRubyコミッター(※ 次回はいないらしい)やLibreOfficeの翻訳チームの人、企業でLinuxカーネルの開発部隊にいた人などが今回居たので、
単にGitHubにIssueを立てるだけではないようなサポートもできるかもしれません。
次回の開催は5/28になります。

oss-gate.doorkeeper.jp

gitter.im

その他

この記事にOSS Gateについて言及があって面白いです。

Rubyist Magazine - Rubyist Hotlinks 【第 36 回】 須藤功平さん

リンク

sho.tdiary.net


Copyright (C) 2016 tSU-RooT, Permission is granted to copy, distribute and/or modify this text. Unless otherwise noted, the text of this page is Dual licensed under a "Creative Commons Attribution 4.0(or any later version) International License", OR the "GNU Free Documentation License, Version 1.3(or any later version) published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts".

Go言語でターミナルで動くTwitterクライアント作った

紹介

termbox-goを使ったので、割とGUIっぽく動きます。
よくあるツイートやTLをターミナルに出力して動作終わりという感じではありません。
最近買ったラップトップがスペック低くて、ブラウザからTwitter開くのつらいので作った。(mikutterは肌に合わなかった)
リポジトリはこちら。

github.com

デモ

TLとツイート
f:id:tSU_RooT:20160318181626p:plain リスト f:id:tSU_RooT:20160318181813p:plain
ユーザータイムライン f:id:tSU_RooT:20160318181918p:plain 会話ビュー f:id:tSU_RooT:20160318181947p:plain

その他

休み中だからすぐ書き終わると思ったら意外と時間かかった、
vendorとかどうするかなぁと思ってたら作ってる間にGo1.6がリリースされて使えるようになった。
とりあえず趣味プログラミングが一段落したので将来につながる行動をしたい(職探しなど)

来週にはOSS Gateというイベントがあります、こちらにメンターとして参加します。

oss-gate.doorkeeper.jp

OSS Gateを立ち上げようというイベントに参加した

先週の火曜日にOSS Gateを立ち上げようというイベントに参加した。
これはどんなイベントかというと、去年OSSをテーマにしていたSEゼミというイベントが金銭的に継続できなくなったので、OSSへの参加者を増やそうという目的の後継のイベントを立ち上げようという会。
主に既にSEゼミを行ってわかっている問題点をどう解決するかというのを話し合っていた。(寿司とアルコールを胃に入れながら)

主催の須藤(@ktou)さん曰く、OSSへ参加したいが参加できていない人は、参加の方法がわからないだけであり、それをサポートすればOSSの参加者が増える(だろう)とのこと。
個人的にフリーかつオープンなソフトウェアへの貢献について興味があるので、むしろ立ち上がったイベントにはメンターではなく、指導を受ける参加者側として次回以降参加するために話を聞いてきました。

まず自分がOSSの開発について何故興味があるのかということを何人かが話すことになった、私は自分の使っているソフトウェアのソースコードが覗けるのは楽しいし、
typo修正レベルでもたまにPull-Requestを送ってコミット履歴に自分の名前が残るのが嬉しいといったようなことを喋べらせてもらった。
他に参加者の対象はどういういったのを想定するのかといったのことについて疑問が呈されていて、
たとえば単純にOSSに貢献したい個人開発者, はたまた会社から言われてOSSの開発に参加することになった人など
もし後者をターゲットにするならやることは変わるのではないかと。(主催曰く、どちらの人でも良く 人それぞれの参加目的は違って良いということになった。
目的が違ってもお互いに協力できるというのがOSS的な開発手法の良いところだと私も思う)

その後にブレインストーミング的なこともやったのですが、自分がいたテーブルは割と盛り上がっていて

  • OSS Gate自身のソフトウェアを用意する
  • ビッグネームのOSSに貢献しているメンターを呼ぶ
  • Ruby Kaigiのようなイベントと併設する
  • なんとか最初の成功体験を積ませる
  • パッチを書いているところを動画で撮って生放送する(実演 コントリビュート芸)

といった感じの案が上がった。
他のテーブルでは参加者の層を大学1-2年生にフォーカスを置いて、課題の改善方法を提案していた。 (大学3-4年になってから知っても遅いのではという意見に正直耳が痛い)

あと個人的にブログを読んでいたtDiaryのたださんなどとお話をしてみたかったのだが、テーブルが離れていてお話できなくて残念だった感じです。

こういった活動が就職・転職などに強く評価されるようになるといいな〜と思っています。

第一回イベントは2016年の1/30(土)にやるという方向で話がまとまっているので、少しでも興味のある人は歓迎です。
とりあえずBegginer向けのイベントということで、未経験者・初心者を想定しているようです。
その他参考URL
OSS Gateを立ち上げよう に参加しました
OSS Gateの立ち上げに行ってきた
GitHub Issue:2016年1月30日(土)にOSS Hack 4 Beginners相当のイベントを開催する


Copyright (C) 2015 tSU-RooT, Permission is granted to copy, distribute and/or modify this text. Unless otherwise noted, the text of this page is Dual licensed under a "Creative Commons Attribution 4.0(or any later version) International License", OR the "GNU Free Documentation License, Version 1.3(or any later version) published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts".

コヨーテの紹介

NOTICE!

この記事はボドゲ紹介 Advent Calendar 2015の5日目の記事です。
前日の記事は ぽんこつさん(ponkotuy)の 新電力会社デラックス紹介 でした。

はじめに

みなさんボドゲしてますか?
私は月に最低1回はボドゲで一日中遊んでいる気がします。
さて今日紹介するのはハッタリと推理を駆使して遊ぶコヨーテです。

コヨーテ 日本語版

コヨーテ 日本語版

このゲームの目的

順番に数字をいいながら、最後まで生き残ること!

ゲームのプレイ人数

5〜12人ぐらいが適切

このゲームの特長

プレイヤーはこのように数字の書かれたカードを1枚ずつ、プレイごとに渡されます。
f:id:tSU_RooT:20151205211710p:plain:h400
このカードに書かれている数字はコヨーテの数です。

カードを貰ったらあなたはこのカードの表面(数字の書いてある面)を見ないようにしてカードを持ってください。額につけたりすると絶対に見えないように持つことができます、インディアンポーカーの要領です。

追加ルールが無い場合、プレイヤーが取れる行動は2つしかありません。

  • コヨーテの数を宣言する
  • コヨーテを宣言する

まずスタートプレイヤー(最初のプレイでは適当に、2回目からは負けたプレイヤー、または脱落したプレイヤーの次)から始めて数字を宣言します。
このとき、この場に何匹のコヨーテが「少なくとも」いるかを推理して、コヨーテの数を宣言してください。(この数は場にあるカード全体の合計です)

宣言する数に上限はありませんが、1以上の整数を宣言してください。(聞いた話ですが、世の中には酔って億を宣言する人もいるらしいです)

もしも前のプレイヤーが宣言した数が場にいるコヨーテの数より大きい(ぴったりはダメです)と思ったなら、
あなたはコヨーテ!と宣言して前のプレイヤーに挑戦してください。
コヨーテが宣言されたら、すべてのプレイヤーはカードを表にして公開し、コヨーテの数を数えます。この時前のプレイヤーが宣言した数が大きかったらあなたの勝ちですが、同じかそれよりも小さかったらあなたの負けです。

負けたプレイヤーは身代わり人形のカードを使ってライフを1個減らしてください。もしも身代わり人形のカードがもう無いなら、そのプレイヤーは敗退です、ゲームから脱落します。

まだプレイヤーが充分にいるなら、使ったカードを回収し捨て札にして、ゲームを繰り返します。

プレイガイド

さてここで宣言する数ですが、正しくプレイしていればあなたは自分のカードの数字だけ見ることができませんね?
ではどうやって場の全体の合計の数字を推理すればいいのでしょうか?

少なくともあなた以外のカードは見えるはずです、見えるカードは全部暗算で数えて数字を覚えましょう、そしてあなたがスタートプレイヤーでなければ他のプレイヤーが宣言した数から、実際の合計の数字がどのくらいなのか推理ができるはずです。

しかしいくつかの特殊なカードがプレイヤーの妨害をします、 この3枚のカードは要注意です!

f:id:tSU_RooT:20151205211851p:plain:w400
左からMAX→0,?,×2 というカードが並べられています、
MAX→0カード(キツネカード)は 場にある数の中で一番大きい数をすべて0にしてしまいます、

?カード(ほらあなカード)はコヨーテが宣言された後に、山札から1枚引いて、引いたカードの数字を合計に加えます、つまりこのカードだけは効果がコヨーテが宣言された後にしかわかりません。

×2カード(酋長カード)はすべての基本カードの数字を2倍にします、このカードが場に出ているときは大抵の場合みんなの宣言の数字がインフレします!

自分がこのカードを持っているときは意外とわかりやすいですが みんなでグルになって騙しに来ている可能性も捨て切れません。

さてこれだけではなく、他にも注意するカードはあります。

f:id:tSU_RooT:20151205211929p:plain:w400
左端のカードは夜カードです、このカードが出たら計算終了後に すべてのカードを合わせてシャッフルし、それが新しい山札になります。

基本的に一度出た特殊なカードはしばらく出てきませんが、夜カードが出た後はしばらくどんな種類のカードでも出てくる可能性があるので、危険であると同時にブラフをかけるチャンスでもあります。

右の2枚はマイナスカード(兵隊カード)です、見たとおり場の数字がマイナスされます、このとき注意したいのは時にマイナスのカードが重なって出たとき、コヨーテの数がマイナスなことがあることです、このときスタートプレイヤーは勝つためには大抵ハッタリをかける必要があるでしょう。

面白いところ

何度か遊んでいると、結構適当に数字を宣言するプレイヤーとか出てきたり、
自分が大きなコヨーテカードを持っている時にみんなでハメにきたりとか、
逆にこいつMAX→0カード持っているからカモになりそうだなーと思ったら、
みんなで共謀してそいつをハメにいったりとかそういうところが面白いです。

プレイ時間がいい感じに短いし、プレイヤー数も幅があるので他のボドゲの合間に遊ぶのもオススメです!

以上 コヨーテの紹介でした!

明日はboardgameblogさんです。どんなボードゲームが紹介されるのでしょうか。

このブログの記事は必要である範囲で他の著作物を引用していることがあります。また指摘・修正を受け付けます