アゴドリルの備忘録

小さいことを少しずつ

2019年目標

去年の目標の振り返り

2018年目標


大学に行って、pythonを勉強して、いろんなイベントに行った。
去年(2017)よりはアクティブに行動して色々できたと思う。
競プロはほとんどしなくなったけど、アルゴリズムの勉強はしないとなぁ、と思ってる。


いろんなイベントに行っていろんな人と会って、今までの価値観が色々と変わった1年だった。
海外に行きたいという中高のときの気持ちが割と戻ってきた。

今年の目標

  • 大学に行く(進級する)
  • 英語の勉強をする
  • 技術的に興味のあることを勉強・output
  • 運動をする

大学生なので、大学に行って卒検配属されれば、卒論頑張る。
海外にたくさん遊びに行きたいので英語の勉強をする。
今までどおり、技術的に興味のあることを分野構わず取り組む。
全く運動してないので、健康のためにも少しは運動をしたい。


3月に海外に行くのでまずは英語の勉強をしていくことかなぁ、


無理をしないで健康に生きていきたい。以上。

いい生活 インターン振り返り

株式会社いい生活で長期インターンとして働いていました。

不動産ビジネスを情報テクノロジーで加速させる株式会社いい生活


その振り返り。

インターンで何もわからない0からのスタートだったのですが、
要件を満たすものができたのでよかった。

期間

今年の4月末から12/26までの8ヶ月くらい

内容

社内ツールの作成
言語は主にPythonを使いました。

よかった

課題の選定

最初に複数の課題からどれをやりたいですか?って決めさせてくれたのでよかった。
自分の興味ある課題を取り組ませていただけたのは大きかった。

メンター・チームの人に無限に助けてもらってた

slackで質問したり、一人で悩んでたら社員さんにいろいろ聞いて助けてもらってた。
1を聞いて10くらい返ってきて、強いなぁという気持ちになってた。

日程調整の柔軟さ

基本的に週1で働いていました。
夏休み期間とかの長期休暇は週2くらいで働いていました。
大学の日程に合わせてスケジュールしてもらった。

また、大学のテスト期間・短期インターン時・その他所要の際は前の週に「休みます」と言って休ませてもらえて、柔軟にスケジューリングしてもらって非常に助かった。

有給だった

普通にバイトするよりよい時給だったので嬉しい。

美味しいご飯

いろんなタイミングで美味しいご飯が食べれた。嬉しい。

まとめ

大変だったけど、成長できた。
1から最終発表まで頑張った。
社員さんが強かった。
まだまだ精進!!!

RICORA言語班の個人的振り返り

某大学のRICORA言語班という技術系のサークルの部長(?)を一年間やっていたので、
できたこと・よかったこと、できなかったこと・よくなかったことを自分なりにまとめてみる。

できたこと・よかった

割と自由なサークル作り

もともと自由なサークルで、上下関係とかをそんなに気にしないサークルが例年通りできた。

新しいこと

夏季休暇でやったことや自分が最近使っているツール、興味あることなどを発表するLT大会をやってみた。
割と好評(?)だった。
知見の共有にもなった。
webについてのプレゼンなど、例年やっていないこともできた。
新しいことを少しづつだけど、取り入れることができた。

自由な活動・情報共有の場の提供

後期は基本的に課題を与えないで、好きなことをやってわからなかったら相談に乗るよ、みたいなスタイルをとった。
また、slack等で気軽に質問してもらって、それを知ってる人が答えるみたいな、情報共有もできてきた。
(今までは割とできてなかった気がする)

できなかったこと・よくなかったこと

スケジューリング

後期最初に考えていた、web、dappsなどいろんなことをやる予定だったのにできなかった。

チーム開発

チームを組んで、がっつり開発することができなかった。

反省

全体的にスケジュール管理と人員確保ができていなかったことが原因だったと今更ながら思う。

まとめ

人をまとめるのは難しかった。
老害として陰ながらサポートしていきたい。

DPDK FW進捗

seccamp 2018卒業生です。

趣味で作っているDPDK FWの進捗報告をさせていただきます。
よろしくお願いします。

DPDKとは

パケット処理に特化したライブラリのことです。

  • kernel bypassしてUser landから直接NICをたたくことができる
  • PMD(Poll Mode Driver)でCPUを占有(Polling)してパケットに関する処理に全リソースを割くことができる
  • hugepageの利用で、一ページあたりの大きさを大きくして、ページ数を少なくして、高速化ができる

以上のようなメリットがあり、パケットを高速で送受信することができます。

進捗

  • フィルター情報のjson読み取り化
  • logで出力されるプロトコルの追加(ARP/ICMP)
  • packet長のおかしいpacketのドロップ
  • フロント側のみの実装
  • packet senderの実装

以上のことをしました。

それぞれについて説明していきます。

フィルタリング設定json読み込み化

まず、今までdropする5tuple(ip dst/ ip src/ ip proto/ src port/ dst port)フィルターの情報を標準入力で受けつけるように実装していました。
しかし、それは非常に面倒だと普通は思うのでjsonを読み込んでフィルターするように実装しました。
これを実装した後に改めて計測をしました。

その際、janssonというライブラリを使いました。
Jansson — C library for working with JSON data
Jansson Documentation — Jansson 2.11 documentation

また、Log出力のOn/Offもここで切り替えられるようにしました。

ログの追加

速度を出すため、基本的にはログ出力をOFFにするのですが、ONにしたときのログの追加をしました。
今まではTCP/UDPのみ -> ARP/ICMPの追加

フロント側の実装

フロントではDPDKアプリケーションの起動・終了、config設定の修正、などをインタラクティブにできるREPLの形のCUIを実装しています。
(Pythonを使用)

f:id:agodoriru:20181208002021p:plain

packet senderの実装

このアプリを作成する際にデバッグ用に送信するパケットを自分で作れたら嬉しいと考えたので、上と同様にjson形式で設定を書いてパケットを送信するアプリケーションを作成しました。
(syuu先生のプログラムを参考にさせていただきました。)

f:id:agodoriru:20181208001913p:plain

FW性能測定

環境

f:id:agodoriru:20181207170951p:plain

上のような環境で実験しました。
Host 1側でIntel DPDK pkt-genを走らせてパケットを送信して、Host 2側で今回作成したFWを走らせてパケットをフィルタリングして、Host 1側に送信する、という形で測定しました。

HW

CPU : Intel Xeon Processor E3-1225 v6
OS : 18.04.1 LTS
NIC : Intel Ethernet Controller X540-AT2

測定結果


1filterの時はL2fwdと同様の動作をしている場合にはほぼ10Gbpsに対して、filter数を上げていくとやはり速度が落ちていく、という結果になりました。

githubリンク

github.com

パケットと戯れた結果

Todo

フロント側との結合
もっと低レイヤー的なことをして、パケットロスを減らしたい。
(どうすれば性能が向上するか全くわからないが、、、)
これを今後取り組みます。

最後に

自分はDPDKの開発環境を持っておらず、seccampでお世話になったsyuu先生のマシンを借りて開発をしています。
また、技術的な質問にも答えていただいて非常に感謝しています。
ありがとうございます。

最後の最後に

まだまだやることがあるので頑張りたい

seccamp2018参加記

8/14~8/18にセキュリティ・キャンプ(seccamp)に行った参加記

seccampとは

 セキュリティ・キャンプ事業の中心的な行事です。毎年8月中旬頃に4泊5日の合宿形式で、情報セキュリティに関する実践的な講義を実施しています。対象は22歳以下の学生で、参加するためには、募集期間中(毎年4月~5月頃)に応募課題を提出し、書類審査に通過する必要があります。
 本大会は、2004年から毎年1回開催されており、これまでに663名の修了生を輩出しました。既に社会で活躍している修了生も多数存在します。
 なお、全国大会では、参加に係る費用を主催者側で負担しています。参加者は、キャンプ期間中一人一台のPCが貸与される他、受講費・交通費・宿泊費を含めて、無料で参加することができます。

セキュリティ・キャンプ:IPA 独立行政法人 情報処理推進機構

ということで学生無料で強い人に色々教えてもらえるキャンプがあるということで応募用紙を出したら通ったので行ってきた。
(応募用紙は気が向いたらブログに投げたい。)


0日目

パッキングがいい感じにできて助かった。

1日目

朝はしっかり起きて出撃した。

出撃トラック

眠い・暑い・荷物重いで会場到達までが地味に辛かった。
北府中駅から会場のクロスウェーブ府中までは自分と同じ様にスーツケースを持った民がたくさんいたのでついていけば場所がわかった。


開会式

OSCの紹介

法律のお話

夕食

18:00に夕食でめっちゃ早かった。

LT大会

Wiiの正しい遊び方LTとか、アンチウイルスソフトウェアとパッキング処理済みマルウェア対決のLT、Z4で扱うDPDKのLTが面白かった。
面白いし、技術力的なところでレベルが違うなぁ、って思いながら聞いてた。

グループワーク

seccamp終わった後、どういった活動をするのか、話し合ったりして検討した。

2日目(トラック1日目)

なぜか圧倒的起床力をこのタイミングに発揮してしまい、6:00に起きた。
キャンプ中に唯一の外出できるコンビニタイムでコーヒーを調達した。

しっかり起きれたのに部屋がわからないというインシデントが発生して2、3分遅れてトラックの部屋に着いた。

参加したトラック紹介

圧倒的治安の悪さで有名なZトラックで、その中で決めつけで治安の悪いZ4トラックで毎日頑張ってコードを書いてた。
真面目なことを言うと、DPDKというネットワーク処理に特化したCのライブラリを使ってファイアウォールを実装していこう、というゼミに参加しました。

講義開始

twitterで見た事がある赤いサメアイコンの強い人とネコのアイコンの無限に強い人が講師で、受講者は自分と研究でDPDK使ってる強い人で物理が専攻で趣味でプログラムやってる人が行っては行けないようなやばいゼミだった。

マシンが4台、受講者二名にプロの講師二名の最高の環境だった。

f:id:agodoriru:20180819163128j:plain

1日目は各トラックのイントロダクションをして、その後は各ゼミごとに別れてイントロ・実装とか作業をしていった。
自分は朝から晩まで事前課題で書いたコードをDPDKのコードに移植するために、C言語のコードのバグフィックスと最適化を行なっていた。

基本的にペアプロで開発をしていった。
sshで開発マシンに入って頑張って実装してた。
マシンのhost名がかっこよくて、良さみが深い、って一人で思ってた。

ssh経由で開発するっていう事が今までなくて、nanoの使い方で色々困ってた。
(nanoを使った理由は単に下にコマンドが書いてあって使いやすそうだったからです。
実際はまあまあ辛かったのでemacsvimを使い始めたいと思います。)

自分がコードを書いていて、色々というかほとんど指摘されました。
いつも、中途半端な理解だったところもしっかり指摘されてしまって、教えてもらいながらやっていけたので良かったです。
gitの使い方とか、bashのコマンドとか、Cのコードの書き方以外にも色々教えてくれた。

最後の方はエラー出してごめんなさい〜、って心の底で思いながら実装してた。
講師の人がエラーの処理方法とかを隣で教えてくれたけど、朝からの作業時間が10時間くらいとかで、頭が蒸発してて頭に入ってこなかった。
(講師の人にもこれはバレてたっぽい。)
バグフィックスが割としんどかった。
でも、エラーが出たときのときの対処を何回もやって、これは今回のゼミだけでなくて、今後の日常の開発で常に役立つよなぁ、とあとで思った。

・8:30~12:30
・13:30~17:30
・19:00~22:00
の合計11時間で今まで感じたことがない疲れを得て、2日目を終えました。

シャワって11:30くらいに速攻で寝れた。

3日目(トラック2日目)

起きたのが8:20で、朝飯行けない〜、って思いながらトラックの部屋に向かった気がする。

朝に特に話があるわけでもなく、各班の作業タイムが始まった。
1日目まででまだDPDKのサンプルコードに移植する作業が始まってなくて、あーやばい、って心の底で思ってたのを覚えてる。
トラックの最後の時間までにはDPDKのサンプルコードを動かして、少しづつやっていける状態になったのでよかった。

企業紹介

某社さんのオフレコの話が聞けてやばかった。

グループワーク

疲れてて、チューターの人と喋ったりしてた。

HR

HRという名の実装時間
相変わらず、コード書いてた。

HRの時間が終わって良い感じのところまでいって、もう少し実装したいですーみたいな事を言ったら、良いよーって言ってくれて、神だった。
結局良い感じの時間まで教室外の机で実装してた。

近くにいた講師・チューターの方々が「進捗どうですか」「どんな感じですか」って質問されて答えようとしたら「nano使ってるんですか?」ってなってみんな大好きエディタの話でめっちゃ盛り上がった。
楽し〜い。

あと、良い感じのCUIのプログラムのdemoを見せたりしてくれて、かっこいー、こんなの作りたいー、って思ったりしました。

4日目(トラック最終日)

6:30くらいに起きた。
まだベッドでゴロゴロ寝られるな、って思ってゆっくりしてたら8:15くらいなってて、朝飯行けない〜、ってなった。

3日目夜に良い感じに実装が進んで少しだけコードをいじって、計測にはいれた。
良い感じに高速化出来てる感じでよかった。

午後はトラック内で最終発表をした。
資料作成能力のNASAを発揮してしまい、時間をかけてしまった。
一旦、事前課題で自分が書いたコードが最終的にDPDKにのせて早くなったのがトラック最終日までに実装できたので、一応最低限の目標は達成したと言えるので、安心と高速化の喜びを感じた。

4日目のどっかのタイミングでNOC部屋に行ったりもした。
Elastic Search + kibanaで可視化されたログ見せてもらった。
飯時にめっちゃトラフィック上がってるアクセスポイントとかわかって面白い〜、とか思ってた。

企業紹介

ヒルンの発表が面白かった。

グループワーク

色々考えた。
seccamp恒例の本などのプレゼントタイムもここで行なった。

HR

今後、どういった機能を実装すると良い感じになるかという検討をしてた。

5日目

例の如く、朝飯行けず。

グループワーク

今後取り組む事を書いた。

成果発表

集中トラックは他も面白そうだった。
コンパイラゼミの0日目にセルフホスティング出来た人の話が普通に面白くて、かつ実装力がやばそうでやばかった。
リバエンゼミとかのハードよりのゼミも面白そうだな、って思った。

成果発表(続き)

いろんな分野の話が聞けた。
資料があるのであとで色々見てみたい。

閉会式

アウトプットが大事だという話を聞いた。
ブログとgithubに色々アウトプットしていきたい。

帰宅トラック

荷物が重くて大変だった。

戦利品

セキュキャンパーカーとTシャツといろんな本をもらいました。
(写真に乗ってないノベルティもたくさんいただきました。ありがとうございます。)
自分の受けていない、他の講義の資料があって、あとで勉強できるチャンスがあって良い〜、って思いました。

f:id:agodoriru:20180819182016j:plain

感想

素直に楽しかった。まずはそれに尽きると思います。
三日間、隣に強い講師がいて、いろんなことを聞いてなんでも答えてくれるという最高の環境だった。
参加する講師・受講者が無限に強くてやばいのでは思ってたけど、案の定トラック1日目に実装力がなくて頭が蒸発してました。
自分はまだまだプロには程遠い存在ということがわかったので、精進していく必要があると再認識した。
twitter上にいる強い人にも名刺交換とかできて、いろんな人と関われる良い機会になった。

開発の方は、C言語の基礎から丁寧に教えてくれて、最終的にはDPDKのサンプルコードに移植して動かせる状態になった。
開発したものに関しては、また開発記という形で別のブログに上げたいと思う。
C言語完全に理解した、DPDK完全に理解した、まではいかないけど、ほんのちょっとは理解できて成長できたと思います。

三日間nanoを使って開発したけど、流石にemacsvimに入信した方が良さそう、って言われてvimの資料があったので、、、(以下略)

スライド


最後に

Zトラックはいいぞ
(ほぼ)一対一で開発できて最高だった。
(他のトラックに参加してないからなんとも言えないけど、さすがに一対一はこのZトラックだけなのでは?
なお、治安の悪さもピカイチだった。)
治安が悪いと散々言ってるものの、実際はめっちゃラフな環境ですごい開発しやすくて、居心地がよかったので3日間本当に楽しかった。(だからこそ治安が悪くなった(?))

興味のある学生へ

応募した方が絶対良い経験・良い刺激になるので応募しましょう。
学生なのに応募しないで後悔するのが一番良くないので。
なので、このブログを見て、かつ技術的に強くなりたい人は来年応募しましょう、という参加してください。(Zトラックは良いぞ!)
ネットワークとマルウェアに興味がある人はぜひZ4に応募しましょう。

一緒に参加した人へ

切磋琢磨しあいましょう。
また、どこかで会いましょう

講師・チューターの方々へ

強くなって帰ってきます。

最後の最後に

トラック最終日に撮った治安の悪い写真で参加記を終わりたいと思います。

dockerについて

学内でGit,dockerなどの開発環境について勉強する(ゆるふわ)勉強会があったので物理学科ながら参加してみた。そこでdockerにふれたので忘れないように書きます。

dockerとは

Docker Inc.が開発した軽量なコンテナ型の仮想化ツール

仮想マシンとコンテナ型仮想化の違い

Virtualboxなどの仮想マシンはもともと動いているホストOSの上にVirtual boxなどの仮想マシンを立てて、そこでゲストOSを立ててそこでプロセスなどを実行する

dockerなどのコンテナ型の仮想環境ではコンテナという領域でプロセスを実行する

コンテナは仮想マシンに比べて余計なものが動かない→軽い!!!


dockerの公式ドキュメント
Docker Documentation | Docker Documentation


imageとcontainerについて

・image
コンテナの実行環境、ファイルシステム、操作方法みたいなのをまとめたもの
自分でOS,コマンドなども編集可能

・container
imageによって作成した仮想環境のこと


コンテナの起動まで

イメージの取得
$ docker pull [image名]

https://hub.docker.com/explore/
上のリンクからpullできるものは確認できる


version指定をしたいときは

$ docker pull ubuntu:14.04

上のように":"をつけてversionを指定


コンテナの起動
$ docker run [option] image [command]

imageがローカルにないか自動で確認してくれて、ないときは自動でpullをおこなってから起動をする


オプション

-i インタラクティブ
-t 擬似端末接続
-d バックグラウンドで実行

$ docker run -it ubuntu:16.04 /bin/bash

↑よく使う

上のコマンドを実行すると、起動したubuntuのコンテナのターミナルに接続ができる


コンテナ名を指定

$ docker run --name hoge ubuntu

コンテナ名:hogeのコンテナを作成
(通常、コンテナ名はランダムに作成される)


よく使いそうなコマンド一覧

起動中のコンテナにログイン
$ docker attach [コンテナ名 or ID]

起動中でないとアタッチはできない

コンテナの起動
$ docker start [コンテナ名 or ID]


-aオプションを加えて

$ docker start -a [コンテナ名 or ID]

で起動と同時にコンテナにアタッチ(ログイン)することもできる


imageの一覧を表示
$ docker images
実行中のコンテナの一覧を表示する
$ docker container ls
すべてのコンテナ(実行中でないものも含む)を表示する
$ docker container ls -a
コンテナ/イメージの削除
$ docker rm container名
$ docker rm image名
コンテナ/イメージの全削除(実行中のものは除く)
$ docker container prune
$ docker image prune

そういえば

dockerのインストールが成功しているのにも関わらず、dockerの起動の際にpermission deniedなどと表示されるときはユーザがdockerグループに所属していないためにsudoを毎回打つ必要があります。そのためユーザをdockerグループに所属させると、毎回sudoを打つ必要がなくなります。詳しくは

qiita.com

自分はこの方法で解決しました。


参考
http://qiita.com/voluntas/items/68c1fd04dd3d507d4083

Gitの基本操作

学内でGit,dockerなどの開発環境について勉強する(ゆるふわ)勉強会があったので物理学科ながら参加してみた。Git回だったのでまずはローカルでのgitの基本操作について復習としてまとめてみる。

基本的なコマンド

  • git init
  • git add
  • git commit
  • git status

gitレポジトリの作成

今回は作業用ディレクトリとしてzinken_reviewを作成し移動。

$ mkdir zinken_review
$ cd zinken_review

gitで管理したいのでgit initコマンドを使用してgitレポジトリを作成する。

$ git init

そうするとInitialized empty Git repository in ~/zinken_review/.gitと表示されて空のgitレポジトリが作成されてgitで管理・運用ができるようになる。

確認としてlsコマンド

$ ls -a

を実行すると.gitファイルがあるのが確認できる。

基本の流れ

ファイルの作成・変更→git add→git commit
の順に作業をしていく。

空の状態なので新たにテスト用ファイル(今回はtest1.txt)を作成・編集をして、これをコミットする作業を行う。


①test1.txtを作成・編集

②ファイルをステージングエリアにあげる

ステージングエリアにあげるにはgit addコマンドを使用する。

$ git add test1.txt

③コミットをする。コミットをするにはgit commitコマンドを使用する。実行するとviが起動してコミットメッセージを書くことができる。

$ git commit


コミットメッセージをemacsで書きたい場合は、以下のコマンドを実行するとコミットメッセージがemacsでかけるようになる。

$ git config --global core.editor 'emacs -nw'

これで更新終了。

ファイルの編集・追加→git add→git commitが一連の流れ

↑これ大事

git statusについて

どれをステージングエリアに上げたか否か、コミットしたか否かを調べるにはgit statusコマンドを使う。

変更したファイルをステージングエリアに上げていない状態でgit statusコマンドを使用すると以下のような表示になる。

f:id:agodoriru:20170809190858j:plain


変更・追加したファイルをステージングエリアに上げて、コミットしていない状態でgit statusコマンドを使用すると下のような表示が出る。

f:id:agodoriru:20170809190848j:plain


すべてのファイルがコミットまでされて最新の状態である場合は下のようになる。

f:id:agodoriru:20170809191532j:plain


ブランチ関連のコマンド

  • git branch
  • git checkout
  • git merge

ブランチの作成・切り替え・結合

ブランチを作成する時はgit branchコマンドを使用する。
試しにtest_branchという名前のブランチを作成する。

$ git branch test_branch

現在のブランチ一覧を確認するときも同様にgit branchコマンドを使用するとbranchの一覧が表示される。

$ git branch

"*"マークが付いているところが現在いるブランチである。


ブランチの切り替えをしたい場合にはgit checkoutコマンドを実行する。

$ git checkout test_branch


ブランチを結合するにはgit mergeコマンドを使用する。
masterにtest_branchをmergeする場合には、まずmasterに移動する。それからgit margeコマンドを用いてブランチを結合する。

$ git checkout master
$ git merge test_branch


他にもgit logコマンドやGithubとの連携など、様々なコマンドがあるので調べてまとめたい。

参考
Git - Book
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ