メモ的なアウトプット
気付いたら社会人になっていた。
お仕事ではだいたいC#を書いている。色々と学びを得たのでそろそろアウトプットしていく段階な気がする。
こういうのって月一とかである程度の品質を保証するのと、毎日書くので習慣化を求めるのとどっちが良いのだろう
Dependency Injection
DIとか依存性注入とか言われるやつ。個人的には Context Injection の方が分かりやすい気がする。
あるクラスが別のクラスに依存するとき、クラス内でそれをインスタンス化するんじゃなくて外部から注入する的なテクニックらしい。
今関わっているプロダクトではコンストラクタでcontextを受け取っている。
DIコンテナを使ってるぽくて謎の技術でコンストラクタにインスタンスが渡っている。今の知識レベルでは謎です。
どこ読んでもDIのメリットとして「依存するシングルトンを限定できる」的なことが書かれていないのだけど、そう感じているのは自分だけなのだろうか。
あるいは認識が間違っているのかもしれない。
Observer Pattern
リソースを監視する機構を作り、トリガーが発動したときにリソース側から監視者に通知するデザインパターン。
監視者側で処理すべき内容を監視者側で書けるので良いのだが、コードを追うのが大変になる原因でもある気がしている。
Composite Pattern
集合と要素をインターフェースを介して同一視するデザインパターン。クライアントが両者の違いを気にする必要がないときに便利。
集合・要素個別に必要な、クライアントがアクセスする某があったときにインターフェースが肥大化してしまうのが欠点。
マルチスレッド
人間が理解するには早すぎる
OpenGL入門したかった
思うところがあって OpenGL を触ることにしたのでメモを残していくことにした。
Hello World
Visual C++ -> Win32 コンソールアプリケーション -> 空のプロジェクト作成。
NuGet パッケージの管理から nupengl.core をインストールする。OpenGL をいい感じにラップする freeglut、GLFW、GLEW というやつを全部インストールしてくれるらしい*1。
「環境」のとこに貼り付けた Qiita の記事中にあったソースコードをペッと貼り付けて実行してみるが、unresolved external symbol __imp__glClear@4 とか言われる。
opengl32.lib をリンクするの忘れていた。Qiita の記事に書いていた。。。。
無事白いウィンドウが出てきてめでたい。
今
なんのこっちゃ分かってないが、なんだか良い資料が見つかったのでこれを読みながらぼちぼち理解しているところ。
とりあえず3.2.7節まで読んだ。
以下は白いウィンドウを出すプログラムに自分の理解コメントを加えたもの。
#include <iostream> #include <GLFW/glfw3.h> // コンソールウィンドウを開きたくない場合、以下のコメントアウトを外してください。 // #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int main() { // GLFW の初期化 if (glfwInit() == GL_FALSE) { std::cerr << "GLFW の初期化に失敗しました。" << std::endl; return 1; } // ウィンドウの作成。レンダリングコンテキストの取得。 // constでポインタの書き換えを禁止している(http://qiita.com/go_astrayer/items/63e8a059ae20a5d5e000) GLFWwindow* const window(glfwCreateWindow(640, 480, "Hello World", NULL, NULL)); if (window == NULL) { std::cerr << "ウィンドウを作成できませんでした。" << std::endl; // GLFW の終了処理 glfwTerminate(); return 1; } // OpenGL の処理対象ウィンドウを設定する。 glfwMakeContextCurrent(window); // 背景(クリア)色(RGBA)を指定する。OpenGL の API。 glClearColor(1.0f, 1.0f, 1.0f, 0.0f); // メインループ。ウィンドウが開いている間繰り返す。 while (glfwWindowShouldClose(window) == GL_FALSE) { // 背景色でウィンドウをクリア。 // カラーバッファ(画像表示)のみ指定。ウィンドウには他にデプスバッファ(隠面消去)、 // ステンシルバッファ(型抜き)などがある。 glClear(GL_COLOR_BUFFER_BIT); // // ここで描画処理を行う // // カラーバッファを入れ替える。裏画面と表画面の反転みたいな。 glfwSwapBuffers(window); // マウス操作等のイベントを取り出して記録。プログラムの実行を停止させない。 // glfwWaitEvents() はイベントの発生までプログラムを停止させる。 glfwPollEvents(); } // GLFW の終了処理 glfwTerminate(); return 0; }
今更だけど Slack bot を書いた
こういう感じの、受け取ったメッセージをシャッフルして再投稿するクソ bot を作った。
なんで作ったの?
顔文字がシャッフルされるとたまに変な顔文字が生まれて面白いと思った。そういえば Slack bot って作ったことないなぁ、と思った。
で、調べてみるとそこそこ新しい記事では hubotを使っていたり、Botkit を使っていたりした。
…のだけど、JS 嫌だなぁと思ったので Ruby で書くことにした。
幸いにもいい感じの gem があったのでコレを使うことにした。
一箇所だけものすごく詰まった点があって、chat.postMessage を叩きに行くとき同時にトークンを指定すれば良いと思っていたのだけど、実際は configure で指定しないとダメなのだった。
このドキュメント読んでるとメソッド呼ぶ時に token で指定すれば良さそうなんだけど、not_authed が返ってきて悲しくなる。
gem の Usage にちゃんと書いてあるので、この通りにすれば良かった。
作った bot はコレ。emoji に対応している。
C# の struct と class の違い
struct は値型,class は参照型らしい.ここ見た.
using System; struct Struct { public int x; } class Class { public int x; } class MainClass { static void Main() { var s1 = new Struct(); s1.x = 1; var s2 = s1; s2.x = 2; Console.WriteLine("s1.x: " + s1.x + ", s2.x: " + s2.x); var c1 = new Class(); c1.x = 1; var c2 = c1; c2.x = 2; Console.WriteLine("c1.x: " + c1.x + ", c2.x: " + c2.x); } }
s1.x: 1, s2.x: 2 c1.x: 2, c2.x: 2
CpawCTF やってる 2
あんまり時間ないので Lv2 の一部のみ.
Lv1 よりはやること増えてるけど,今のところ事前知識が間に合っててちょっと調べればなんとかなるレベルという感じ.
- Q13.[Stego]隠されたフラグ
- 出てくるメッセージと解答形式の対応がちょっと微妙…
- http://morse.ariafloat.com/en/
- Q15.[Web] Redirect
- Q16.[Network+Forensic]HTTP Traffic
- Q17.[Recon]Who am I ?
CpawCTF やってる
これ.
今日はとりあえず Lv1 を解いた.
- Q1.[Misc] Test Problem
- Q6.[Crypto] Classical Cipher
- Q7.[Reversing] Can you execute ?
- unix command: file ファイル・タイプを判定する
- Q8.[Misc] Can you open this file ?
- Q9.[Web] HTML Page
- firebugで検索
- Q10.[Forensics] River
- identify -verbose river.jpg
- Q11.[Network]pcap
- 普通に見れた…
- Q12.[Crypto]HashHashHash!
- findmyhash v1.1.2 -> 見つからず
- https://hashkiller.co.uk/ -> 見つかった
- Q14.[PPC]並べ替えろ!