セキュリティキャンプ2020全国大会に参加できることになった
応募を決めた理由
セキュキャンは一度しか参加できないので,割と慎重になっていたが,今回のキャンプに参加しても来年以降も参加できるとの事なので,参加しないのはもったいないと思った.
選択
Z-V Rustで作るLinux向けアンチウィルスソフトウェア
選択コースも面白そうなコースが多くて迷ったが,Rustに惹かれた.
Rust,AVの2つの単語で心が踊らない男はいない.
最近は基本的になんでもRustで書くタイプの人間をしているが,本を読むことも無くただひたすらに書いて覚えてきたので,一度人に教わりながらRustを書いてみたかった.
課題
課題を引用する
Z5. 「Rustで作るLinux向けアンチウィルスソフトウェア」
課題1,2は必須です。課題3は設計ドキュメントだけ、実装が途中 でもOKです。 なお、募集期限のうちは、ソースコードを公開リポジトリに置かないようにしてください。
課題1
- ClamAVのclamonaccのソースコードを読んで、その機能、必要性を説明してください。またfanotifyがない古いカーネルでは、カーネルモジュール(clamuko)が必要でしたが、必要だった理由を考察してください。
課題2
- Rustとyaraのbindingsを使い、UPXを検知するスキャナプログラムを作成してください。
- 引数でスキャン対象のファイルとyaraのルールファイルを指定して実行するようなものを作成してください。
- 加えて、ディレクトリをスキャンできるようにし、/usrをスキャンして計算時間を計測してください。
課題3
- 課題2のスキャナを拡張し、アンチウィルスサービス(デーモン化)をRustで実装してください。
- 並列スキャンができるように設計してください。
- アンチウィルスサービスのIFは自由です。
- スキャン処理だけでリソースが枯渇しないような処理の制限を設定できるようにしてください。
課題2
先に取り組んだのは課題2だった. yara crateを使えば実装難易度はgrepくらいのものなので,割とすぐ終わった.
課題1
私には課題を期限ギリギリまでやらない悪い癖がある.
楽しい実装の課題だけやって,「おもしろそうだし他のトラックの課題もやってみよう」などと軽い考えで生活した結果,締切前日の夜中に夜行バスの中でソースコードを読むことになった.
割と読みやすい綺麗なソースコードだったのと,Linuxカーネルを読む経験があったので,解読自体は割と難しいものではなかった.
一方で,ソースコードを読んでプログラムの実装はなんとなく理解しても,その機能や必要性を言語化するのは少し難しかった(結果,かなり粗末な日本語を生成してしまった).
clamukoについては,カーネルモジュールのソースコードを読もうと思って気合を入れて探してみたら,蓋を開けたら中身はほぼ別のモジュール(dazuko)を使ってるだけだった(これはもしかしたら見るバージョンが違っていたのかもしれない).
課題3
1で作ったのはほぼgrepなので,まずは使いやすいようにファイル分けたりした.
並列処理については扱い慣れてないので,別プロジェクトで勉強したりしてる.
感想
後輩がどんどん通ってるのをTwitterで見て,連絡が無いので落ちたんだと思ってた.
やけになって別の事したりしてたけどちょっとしてから封筒が来てた.
通ったのは嬉しいので頑張る.
気になる点
なぜ結果が郵送なのか
いつ結果が決まったのかわからんし,時間差が出るのでつらい
一部の人はID発表より早く届いていたので,その人達のツイートを見て,「来てないって事は落ちたんだな」と思っていた.
よくわからないけど,ID発表→必要書類郵送の順番じゃいけない理由があるんだろうか.
期限が伸びた事がわかりづらい
期限が伸びたのなら,もう少し伝わりやすい方法で伝えてほしかった.
もとの期限の間に提出した人に改めてメールで伝えるとかしてくれるとありがたかった.Twitter見てなかったらヤバかったね.
特に自分のゼミの課題は,募集期間中はソースコードを公開してはいけないというルールがあるので,もし期限が伸びた事に気付かないで公開していたらと思うとこわい.
GoとRustについて
巷ではGoとRustを比較するのが流行っているらしいので、便乗しておく。
Go
良い
Rust
良い
結論としては、やっぱりどっちも良いので俺は好きな方を使います。 他人がどっち使おうと「ほ〜ん」とか「ええやん」くらいしか口出しはしないスタンスで生きていきたい。
Let's note CF-SV7の分解
Let's note (CF-SV7)のメインボードへのアクセス
諸事情で分解が必要になった為、メモ程度にここに記す。
保証対象外となる可能性があるので、もし行う場合は自己責任。
これを参考にし、分解して生じたいかなる現象についても私は責任を負わない。
底面パネル剥がし
まずはもちろん、電源を切る。
もし充電中ならACアダプターを外す。
背面のバッテリーをロックを解除しながら上にスライドさせて抜き取る。
これは俗に言う剥がすと保証無効系のシール。
次に背面のネジを全て外していく。
種類は
ゴム足部
両上端
ファン部のカバー
左下から二番目
その他
となっているので種類ごとに無くさないよう保存しておく。
内部
ここからはメインボード(右側)に取り付けられた各パーツを外していく。
テープを剥がす場面が多く生じるが、フレキシブルケーブルを傷つけないよう、注意する。
SSDは上のネジを外し、テープを剥がしながら抜き取る。
ボード上にあるネジ(計4個)を外す。この時、HDMI端子とUSB端子の間部分にあるもの以外は同じ種類のネジである。
また、CPU上のヒートシンクを固定しているネジを外す必要性は無い。
しかし、ファンの上と横(上の写真では黒いテープで隠れている)にあるネジは外す。
上の方にディスプレイとつなぐコネクターがある。
これはテープを伸長に剥がしたのち、白いフィルムを持って垂直に持ち上げる事で外せる。
また、いくつかのフレキシブルケーブルが現在見えている面に繋がっている。
その他、ボタン電池等を繋いでいるコネクターはスライドして外せる
これは一度ボードを持ち上げながら外す。
テープを剥がすと現れるコネクターは、他のフレキシブルケーブルのコネクターとは少し形状が異なるが、グレーの部分を起こせば良い。
これで独立した(ファンはついているが)メインボードへアクセスができる。
GoでABCに挑むために必要な最低限の知識
Hello Go!
package main import "fmt" func main(){ fmt.Println("Hello Go!") }
これで
$ Hello Go!
できる。
GoでABCを解く
ABCを解く事を目標としたレベルの内容であり、厳密に学びたい場合はA Tour of Goとかでやってください。
agenda
基礎の基礎
基本的な形
冒頭で書いたhelloで察しはつくかもしれないが、ABCを解く程度なら基本的に
package main import "fmt" func main(){ // 必要な処理 }
この形はあまり変わらないだろう。
ABCを解く上では深く考える必要は無いが、Goのプログラムはパッケージから構成される。
ここで書いたコードは、fmt
パッケージをインポートしている。
これは書式入出力に用いられるパッケージだと思って良い。
インポート
もし他にもパッケージをインポートしたい場合は
import ( "fmt" "math" "hoge" "fuga" )
といった感じで追加出来る。
外部パッケージの関数を使う際は、最初の文字を大文字にする
宣言
Goでは変数、関数の宣言時、型の指定は名前の後で行う。
func add(a int, b int) { return a + y } func main() { var a int = 2 var b int = 3 var sum int = add(a, b) }
var
で変数を定義、名前をつけて型も決める。
上のコードは簡略化出来る
func add(a, b int) { return a + b } func main() { var a, b int = 2, 3 var sum = add(a, b) fmt.Println(sum) }
同じ型の宣言はまとめられる 変数の宣言はさらに簡略化できて
var a, b = 2, 3
で良い。初期化した場合は型を省略できる。
更に
a, b := 2, 3
にもできる
型
整数
int // 32bit環境では32bit、64bit環境では64bit int64 // 64bit uint // 符号なしint uint64 // 符号なし64bit整数
float32 // 32bit float64 // 64bit
文字列
string
キャスト
var a float64 = 4.5 var b int = int(a) // 型()でキャスト fmt.Println(a) // 4
書式指定子
- %d
- 10進数
- %f
- 指数なし少数
- %s
- 文字列
配列
var array [5]int primes := [6]int {2, 3, 5, 7, 11, 13}
みたいなの
スライス
配列とちがって可変長。配列への参照のようなもの。スライスに対する操作は配列にも反映される。
primes := [6]int{2, 3, 5, 7, 11, 13} // これは配列 var s[]int = primes[1:4] // primesの要素1~3
ループ
for
cに似ている
for i := 0; i < 10; i++ { sum += 1 }
みたいに書く。
初期化と後処理はしなくても良い
for ; ratio < 100;{ ratio += pt }
とか
while
while文はない。forでできるから。
for sum < 100{ // セミコロンも省略できる sum += a }
if
cに似てる。forと同じく()
は不要
if a > 0 { hoge }
if文でもforみたいに評価前に処理ができる
if sum := a + b + c; sum > 3 { return sum }
みたいに書ける elseは
if sum := a + b + c; sum > 3 { return sum } else if sum == 3 { return 1 } else { return 0 }
みたいなの
switch
Goのswitchはbreak
がいらず、case
が定数や整数である必要もない。
switch class := student.grade; class { case "1-1": first ++ case "1-2": second ++ case "1-3": third ++ default: others ++ }
みたいに書く
入出力
fmt.Println("文字列”,変数)
引数をデフォルトのフォーマットでフォーマットし、標準出力に出力し、改行をする
fmt.Printf("%d",変数)
指定されたフォーマットでフォーマットして標準出力に出力。改行はしない。
fmt.Scan(&変数)
標準入力からテキストを読み込み、スペースで区切られた値として、順番に引数に格納する。
fmt.Scanf("フォーマット指定子”,&変数)
フォーマット指定できるScan。
N個の要素をスキャンしたい時
fmt.Scan(&N) a := make([]int64, N) for i := range a { fmt.Scan(&a[i]) }
みたいにする
人がスマートフォンを複数所持すべき理由
いくつかのシチュエーションに分けて説明してみる
起床時
現在、スマホをアラームとして運用している人は少なくないだろう。
スマホがあれば好きな曲で朝を迎えることができるし、一台で複数のアラームを設定することもできる。
しかし、それでも人は二度寝する。少なくとも私はする。した。
今日は面談があるので寝なくてはいけない
— ばにらびいんず(鳥) (@n01e0) 2018年12月20日
は?なんでまだ起きてるのぼく?
— ばにらびいんず(鳥) (@n01e0) 2018年12月20日
絶起した
— ばにらびいんず(鳥) (@n01e0) 2018年12月21日
面談寝坊者初では?
— ばにらびいんず(鳥) (@n01e0) 2018年12月21日
元から起床は履修していなかったので苦手分野でしたが最近攻略しつつある。
今時は寝る直前までスマホをいじっている事が多い。Twitter見てたら寝落ちしたりとか。そんな時、スマホと一緒に寝てしまうことが多い。翌日「アラームが聞こえないと思ったら布団の中にスマホが埋まっていた」なんて事になりかねない。
そんな危険性を解消する為に
アラーム用のスマホを用意しよう
スマホを分けることで無駄な電力消費を抑えられるし、複数台用意することで起床確率の向上にもつながる。
現在私はアラーム用のスマホを2台、ベッドから限界まで遠い位置に配置し、さらにロックを解除しなければアラームも止められない設定にし、それぞれが3分おきになるようにしている。
作業時
普段、PCで複数のモニターを使っていたりする人ならば、スマホの作業スペースの狭さに苦しんだ事があるかもしれない。Twitterしながらアニメ見たり、アニメ見ながらTwitterしたり。
同時に複数の作業を。と言う点でandroidの提示した答えはマルチウィンドウとPIPだ。それぞれ簡単に説明すると、画面を分割して二つのウィンドウを表示したり、メインのウィンドウの上に小さなウィンドウを配置し、そこで動画等を再生できる。
しかし、これでは物足りない人もいるだろう。
最近はベゼルレス化が進み、画面は広くなってきたが、少し窮屈に感じる人もいるだろう。
根本的に画面が足りない。AXON Mは買いたくないが2画面は欲しいという人もいるだろう。
そんな人はシンプルに
もう一台スマホ買おう
全部解決する。
予期せぬ通信障害が発生したとき
記憶に新しいソフトバンクの大規模な通信障害発生時、公衆電話には数年ぶりに行列ができた。ニュースを見ながら「こんな時どうすれば」などと不安に思ったりした人もいるだろう。基地局だって壊れない訳じゃない。繋がらなくなる事もある。
複数のキャリアで契約しよう
「スマホ1台、キャリアは1つ」なんて運用は冗長性に欠ける。
災害時
上と似た状況で、災害時にも複数のキャリアで回線契約があると便利だ。
ただ、それだけではない。災害時用にモバイルバッテリーを用意している人は多いだろう。しかしバッテリーだけでは足りない。スマホは便利だ。ライト代わりにも使える。
ライトの代わりになるスマホを買おう
一方は画面を最大輝度にしてランタン代わりに、もう一方は手元を照らす懐中電灯代わりにしよう。
今のスマホに飽きた時
ワクワクしながらキャリアで機種変し、クリスマスの子供の様に新しいスマホを楽しんでいた筈なのに数日後には手元の革新的技術の結晶に飽きてしまうような事もあるだろう。
気になった新しいスマホを買おう
買ってしまおう。
”いかがでしたか”
いくら便利とはいえ、スマホは高い買い物。用途に応じて中古品を選択したり、賢くスマホを買っていこう。
キャリアの各種割引を使うのも1つの手だ。
端末代金と通信料の完全分離が進みつつある今、キャリアを利用した端末購入時の割引が受けられなくなる前にもう1台、スマホを買っておこう。
dev
使用しているデバイス(2020年9月19日現在)
PC
Desktop
- Ryzen7 3700X 32GB
- RX580 8GB
ThinkPad YOGA 260
Thinkpad。アキバでOneLink+ドックも5kで買った。
Razer Blade stealth
社会に適合する為に買ったけど結局適合できなかった。
ThinkPad X230
Windowsが入ったThinkPad。2年前にジャンク(キーボード破損)で購入。
ThimkPad X230
キーボードが壊れていた上のThinkPadの為にジャンク(LCD割れ、本体破損)で購入。
現在は元のメインボードを移植後放置。
ThinkPad X230
CPUがi3だった上のThinkPadの為にジャンク(上半身行方不明)で購入。
i5が載ったメインボード以外に用は無かったので予備パーツとして放置。
Dynabook Satellite B552
Windowsが欲しかったから中古で買った。本体に用は無い。
Thinkpad X220
各種実験用Thinkpad。
Thinkpad 10
何のために買ったかわからない。気付いたら手元にあった。
YOGA BOOK (Android)
かっこいいから買った。
YOGA BOOK (Windows)
かっこよかったしストレージ増えたから買った。売った
GPD Pocket
うわッ!!??マジでポケット入るじゃんこれ!!最高だなッ!!??って言いながら買った。
ThikPad T530
いつの間にか部屋にいた。デカイし邪魔。
Let's note
X230並の厚みのくせに無駄に軽い。安っぽくてキモい。いらない。
Latitude D420
おもちゃ
ThinkPad X60
IBMの香りがムンムンする
スマートフォン
Galaxy S10
メイン。
Galaxy S8+
財布。
Galaxy Note8
メモ。
BlackBerry KEYone
端末用端末。
V20 pro
高級目覚まし時計。
iPhone 6
iOS弄りたくなったから買った。
Galaxy Note3
ROM焼いて遊ぶやつ。
Nexus 5
ROM焼いたり物理的に焼いたりするやつ。
Xperia Z3
緑のスマホ持ってなかったから買った。
Xperia VL
推しが使っているスマホなので買った。当時メイン以外で始めて買った端末。
Xperia A2
何で買ったのか覚えていない。Xperiaも遊びやすいからか?
Raspberry Pi 3B+
ダウト
Raspberry Pi 3B
ダウト
iPad Pro 11
外でSSHするのに便利
iPhone 8
iPadOSとiOSは別なので
Fiio M9
その他
時計
Gear S2 classic + wena wrist leather
キーボード
fortitude60
crkbd
helix pico
NumAtreus
ProgresTouch RETRO tiny
イヤホン
Aurisonics HARMONY GOLD + Effect Audio Ares II
JHAudio Michelle
JHAudio Angie
SHURE SE215
KZ ZS6
COWON CF2
MASTER & DYNAMIC MW07
ヘッドホン
HiFiMAN HE350
Ultrasone DJ1 PRO
MONSTER ELEMENTS OVER-EAR
beyerdynamic CUSTOM STREET
V-moda crossfade M-100
parrot zik 2.0
parrot zik 3.0
AKG K550 MKIII