今回の勉強会はC言語、というかエラーメッセージ読み会というか。
参加者ログ エラーメッセージからエラーを再現(C言語)
エラーメッセージ見よう案件 最近「エラーメッセージを見よう」案件をよく見かけます。
エラーメッセージの内容をちゃんと考えていないこととか、ググれば答え見つかったりとか、思考停止に近い状態になっちゃってるのかな?
僕も時々あるので人に強くは言えないですけど、せっかくエラーメッセージ出てるのにそれはもったいないです。
どうにか解決したいと考えていたら、どこかで「エラーメッセージを再現させるゲーム」っていうのを見かけてやってみることに。
C言語なエラーメッセージを40個ほど用意して、再現してみようっていう勉強会でした。
ルール ルールは以下な2点
・google等で検索は禁止
・辞書を使う
結構時間かかってましたけど、終わった後聞いてみると「エラーメッセージの内容まんまだった」とググらなくても対応できると知れたようでやって良かったです。
内容はみんなブログ記事か何かにまとめてくれると思うので(圧力)それを楽しみにしています。
secconなメルマガに暗号があって頑張って解いてました。
[code]
株式会社ドワンゴです。弊社エンジニアからのメッセージをお読みください。
哇吼卍咢咒咬咀呀听勍哄咀們吭勗哈劬劬吼咒咢咒匯呶吩匯吮區卻匏吩們哈劼匱劼
咸勁匈匯卮劵咸勞卍劼吭咸哇匳卮呻咀卞咒卆吼哇卆咀匣咢咀勞吮匆呎咐吼听甸勍
吮哄匏丗勦勦卆卞匣听咄匳勗們匐夘亅卩匆勁卆卷卮呻勍凖匚哄勣呎匕咒咒咒咒于
読み終えた方は是非こちらへ: http://info.dwango.co.jp/recruit/
[/code]
で、これ解けたっていうただの自慢日記です。
うれしー。
こういう問題を解く人が周りにあまり居ないので頑張って増やしていきたいですね。
解く人というか興味ある人がどれくらいいるんだ、っていうところからかもしれませんが…。
興味ある人はctfとかでぐぐると幸せになれると思います。
今回の勉強会のテーマはGit。
以前やったgit DOJOをもう一度やってみた感じ。
みんなコンフリクト起こしまくりで、「いかに次の人が困るようなコンフリクトを起こすか」みたいなゲームになってました。
いいですね。
B1な子が3人も参加してました。
こういうのは最初はめちゃくちゃ難しく感じるので、まあ早いうちから触ってゆっくり慣れていくしかないよなぁ、とか。
githubを利用してやっていたので、「コード書いてgithubに置いとくと就活が少し楽になるよ」くらいのニンジンを教えつつ…。
いや、普通にgit使えると便利なことの方が多かったりするんですけどね。
7人居たので3人と4人な2チームに分けて進める感じ。
チーム内で互いに教え合いつつ進めていってたので結構理想的だったのでは、とか考えたりもしてます。
そのためか今回もとても時間かかりましたけども。
ちなみに今回もbranchきってmergeしまくりな感じでした。
絡み合うネットワーク図を見てすげー、とかなってましたけど、これがいつ「このネットワーク図汚いな」となるか。
次回は何をしようか。
今回は僕の担当回。
勉強会の3時間くらい前に「dockerでもやるか!」ってことでdockerすることにしました。
コンテナ型の仮想化技術って初めてだったのでいろいろ分からないところも・・・。
使っていって慣れるしかないですね。
来週はgitやりたいとB4が言ってたのでやるかも。
以下資料です。
docker dockerとは コンテナ型の仮想化技術 ハイパーバイザ型やホスト型はマシン上に仮想マシンをエミュレートすることで動作する。
何かプロセスを実行する際には仮想マシン上のカーネルで動かす必要がある。
そのためオーバーヘッドが大きく、リソースを多く割く必要がある。
dockerはこれらとは違いコンテナ型の仮想化技術である。
コンテナ型ではホスト上のリソースの一部を隔離した環境を作り、そこでプロセスを実行する。
実行するプロセスはホスト上のカーネルで動くため、オーバーヘッドが小さく、従来より高速に動作する。
docker以外にもLXCなどのコンテナ型仮想化技術が存在する。
dockerの特徴 dockerでは以下のリソースを隔離することができる。
ファイルシステム ユーザ/グループ プロセスID プロセス間通信 ホスト名 ネットワークデバイス これらのリソースをホスト上から隔離してプロセスを動作させる。
コンテナ型とは上手い言葉を使ったなぁ、と。
今回の前提条件 環境 Mac OS X 10.9.4 VirtualBox 4.3.14 Vagrant 1.6.2 仮想OS CentOS 7 Installと起動 CentOS7 [code]
$ sudo yum install docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
事の発端はコレである
printfな件でatton君といろいろ話をしてたら「ポインタ完全制覇とかに話でてくるのでおすすめですよ」と。
それじゃー読んでみるかーってことでkono研いってOCさんから借りて読んでみました。
ありがとうございます。
割と足りない知識が補えて良い感じな本。
ポインタだけじゃなくて変数宣言だったり関数呼び出しの話だったり、Cの細かい部分も書かれていて「へ〜そこってそういうことだったんだ」って感じることが多かったです。
いや、全部どこかしらポインタが絡んでいたか…。
いろいろな事情で日数はかかりましたけど、実質的な読書時間はあまりかかってないと思います。
コード例も当然載せられていて、その部分は写経してました。
こんなのが動く理由とか知りたい人は是非読んでみるといいんじゃないでしょうか。
[code]
(&printf)("Hello\n");
[/code]
M1担当回 今回は構成管理ツールのAnsibleのお勉強。
担当はM1の@328__君でした。
Ansibleなら4月くらいからちょくちょく触ってるので僕がやっても良かったんですけど、やりたそうだったのでやってもらいました。
Ansibleとは ansibleの基本的なお話から入ってました。
「構成管理ツールで〜」とか「他にもchefとかpuppetとかあって〜」とか「他の構成管理ツールと違って〜」です。
インフラのコード化ってのは進んでいて、ここ最近の勉強会ではずっとそれ関連ですね。
kickstartはOSインストールを自動化。
packerは仮想マシンのテンプレート作成の自動化。
kickstartなんかと連携することでvmの作成とOSの自動インストールまでやってくれます。
vagrantの作者がpackerも作っていて、vagrantのboxを自動作成するツールって具合で認識してます。
今回のansibleはサーバの構成管理をコード化しちゃおうってやつです。
コード化って言っちゃうとプログラム的に思ってしまう人もいるかもしれませんが、そんなことはないです。
・kickstartは設定テキストの羅列
・packerはjson
・ansibleはyaml
でプログラム要素はほぼありません。
ほぼって書いたのは、Ansibleでは変数を利用することができるからですね。
そういえば「この辺りはImmutable Infrastructureな話とかと絡めて理解すると結構面白いかもしれません。」を勉強会で言うの忘れてました、ってことでここで補足。
あとは、chefなんかとの比較がもう少しあっても面白かったかと思います。
コマンドの違いとか。
chefはknifeとかchef-soloとかknife-soloとか個人的にややこしかった印象しかありません…。
あまりやってないのでやればまたchefの良さも分かりそうですが、そこまでやろうと思えませんでした。
今ならchefもやりたいですね。ansibleと比較したいのでw
Handson 説明の後にはいつも通りHandson的に「じゃあ実際にやってみよう」です。
Ansibleは複数のtaskを組み合わせることでplaybookというものを作ることができます。
それを作ってwebサーバを構築してみよう、みたいな。
ここもいろいろ躓きまくりでしたね。
ansibleをbrew installするのとpip installするのでpathが違っててややこしいことが起こっていたり。
この辺りから僕はB1がプログラミングの質問に来てフェードアウトしちゃったので勉強会資料を早いとこアップロード欲しいですw
次回 僕も何か話した方がいいのかな、ってことでメンバーな人にどんなことしたいか確認中。
次回もまた火曜日になると思いますー。
1ヶ月ちょっとくらい後輩交えて勉強会って形にしてますけど、勉強になること多くて楽しいですね。
今後もこんな感じで毎週開催していく方向で進めたいです。
参加者ログ [勉強会] CentOSのインストールを自動化する
VirtualBox環境でLinuxのインストールを自動化する。
勉強会3かいめ!~packer による box の全自動化~
サーバー構築自動化 -packer編-
ついに自動化 これまでの勉強会は
・virtualboxにLinuxインストール
とか
・vagrantのbox作成
とかやってました。
全部手動でやってきたこの作業をついに自動化するときが…!
ってことでB4の@Yu_us03君に事前にお題振りをしてkickstartについて講師役をしてもらいました。
kickstart redhat系なOSを自動でインストールする仕組みのことです。
必要なものは設定の書かれたテキストファイルくらいですね。
CentOS6.4なkickstartファイルを作ってきていて、いろいろ紆余曲折を経たわけですが、無事にOSの自動インストールは完了。
「紆余曲折」な部分は、「自動インストールなのに一部手動が混じってる」とか「メモリ512MBだと厳しい」とかでした。
configファイルを一部修正すると手動な部分はなくなり、めでたしめでたし。
CentOS7でも無事動かすことができる、っていうところまでいけました。
それだけじゃあ物足りないよね、ってことで急遽packerまでやることに。
packer 「packerでどんなことができるの?」
答え:OSのインストールからvagrantのbox作成まで一気にやってくれます。
上記のkickstartと組み合わせて使う感じです。
一度実行すると勝手にvagrant packageまでやってくれるので便利。
こちらがやることはvagrant addくらいなもんになります。
というわけで、その場でぐぐって見つけたconfigを利用してboxを自動作成。
適宜必要な部分は自分たち向けな設定に直して実行。
途中経過が結構盛り上がってました。
やっぱ勝手にvirtualbox立ち上がったり、文字が打ち込まれたり、っていうのはテンション上がりますね。
gitlab kickstartもpackerも全部テキストファイルだからgitlabで管理するといいね、ってところで今回の勉強会は終了。
なんだかんだ3時間くらいかかってますが、区切りのいいところまで進めて良かった良かった。
次回 プロビジョニングツールなものをやるらしい流れ?
M1がAnsibleやりたいそうなので、それをやるかも。
Ansibleならちょっと触ったので僕が講師役やってもいいんですが、後輩にやってもらった方が良いよね。
ってことで、次回も楽しみ。
今回はB1の木下君が来てて、「えらいな〜」って思いました。(小学生並みな感想)
割とOSのインストールとかばっかりやってますけど、それ以外なことにも手を出していきたいですね〜。
ターミナル勉強会とかシェル勉強会とかいいんじゃないだろうか。
7/19(Sat) 9:00 – 21:00までの12時間耐久ctf大会のオンライン予選に参加しました。
結果は1000点取得で57位くらい。
前回よりは点数とれました!
うれしい!
チーム戦な競技なんですが、僕の人脈不足でぼっちチームで参加してました。
解けた問題 練習問題[100]
ネットワーク[100]
フォレンジック[100, 300]
バイナリ[100]
プログラミング[100]
web[100, 300(これは部分点)]
ネットワーク100 問題「このパケットを解析せよ」
添付されたファイルがpcapだったので、Wireshark起動。
中を見てみるとFTPの通信。
ファイルの中身送ってるパケット見つけてdata見てみるとbase64エンコードされた内容が。
というわけでデコードしてflagゲット。
フォレンジック100 問題「ファイルサイズが879,394bytesのファイル名を答える」
バイナリなデータが渡されるのでodする。
879,394bytesを16進数になおして検索してみるとリトルエンディアンな値で発見。
Chrysanthemum.jpgで答え。
フォレンジック300 問題「捏造された契約書を暴け」
rarファイルが渡されて解凍すると.ddなファイルが。
lessしようとすると「binaryだけど、いいの?」と。ダメです。
ls -lしてみるとこのファイルは2012年なものらしい。
それじゃあ、ってことでstringsして2012でgrepかけたら一発でした。
[code]
$ strings Timestanp.dd | grep 2012
2012:05:23 13:29:00
[/code]
おしまい。
バイナリ100 問題「x86アセンブラを読もう」
アセンブラが渡されたので読んで、コードに直すとこんな感じになった。
[code]
#include <stdio.h>
int main()
{
int a=0,i;
for (i = 1; i <= 0xff; i++) {
a+=i;
}
a -= 2;
今週の勉強会について
参加者ログ 7/14 長田研勉強会 〜Vagrantfileを読もう!〜
VagrantFileを読もう(主にNetwork周り)
[勉強会]Vagrantでネットワークの設定してみよう.
vagrantのネットワーク設定を見てみよう。
やったこと やったことは研究室のB4にまた講師役というタスクを投げ、Vagrantfileと、VirtualBoxのネットワークアダプターについての話をしてもらいました。
・NAT
・ホストオンリアダプター
・ブリッジネットワーク
の辺りですね。
それをVagrantfileでどう扱うのかとか。
実際に記述してvagrant reloadする流れでやっていて、VMを複数台作成して相互通信ができる状況とかできない状況をつくって違いを知ってもらいました。
ネットワークな部分だけだと少し時間が中途半端だったので、cpuとかmemoryサイズも変えたりしてました。
/proc/{cpu,mem}info辺りを出しつつ。
VMって楽にいろいろできるからほんとに便利です。
後輩にいろいろやってもらって僕が後から修正するっていうのは割とありっぽい?
次回 次はOSのインストールを自動化するっていう辺りをやろうと思っています。
virtualboxにkickstart使ってcentosインストールって感じかも。
次回もまたB4にやってもらう予定。
C言語リファクタ 以下なgistのソースコードリファクタをしよう gist
とりあえずこんなことしとけ 使える時はライブラリを使う マジックナンバー消す リファクタ結果 その1 その2 B1への教え方は? Asciiなマジックナンバーを文字にするのは教育上よくない? charがintで処理されることが分かりにくくなる? リファクタしまくると、B1的に読みにくい? ライブラリ使いまくり(mallocとか) メモリ空間利用の管理とか ポインタはどうやって教える? ポインタ変数の宣言時代入の動作 宣言時の'*‘の意味 [code]
int *a, b; // (int型のアドレス)を入れる変数aとint型の変数bの宣言
int *c, *d; // (int型のアドレス)を入れる変数c,dの宣言
(int *) a, b; // エラー(キャストに見える)
[/code]
宣言時の’*‘は派生型 ‘ポインタ完全制覇’を読もう 代入時の’*‘は間接参照演算子 ‘ポインタ完全制覇’を読もう どういうこと? [code]
int num = 100;
int *a = num; // これはダメ