技術的なやつ

技術的なやつ

メモ的なアウトプット

気付いたら社会人になっていた。

お仕事ではだいたいC#を書いている。色々と学びを得たのでそろそろアウトプットしていく段階な気がする。
こういうのって月一とかである程度の品質を保証するのと、毎日書くので習慣化を求めるのとどっちが良いのだろう

Dependency Injection

DIとか依存性注入とか言われるやつ。個人的には Context Injection の方が分かりやすい気がする。
あるクラスが別のクラスに依存するとき、クラス内でそれをインスタンス化するんじゃなくて外部から注入する的なテクニックらしい。
今関わっているプロダクトではコンストラクタでcontextを受け取っている。
DIコンテナを使ってるぽくて謎の技術でコンストラクタにインスタンスが渡っている。今の知識レベルでは謎です。

どこ読んでもDIのメリットとして「依存するシングルトンを限定できる」的なことが書かれていないのだけど、そう感じているのは自分だけなのだろうか。
あるいは認識が間違っているのかもしれない。

Observer Pattern

リソースを監視する機構を作り、トリガーが発動したときにリソース側から監視者に通知するデザインパターン
監視者側で処理すべき内容を監視者側で書けるので良いのだが、コードを追うのが大変になる原因でもある気がしている。

Composite Pattern

集合と要素をインターフェースを介して同一視するデザインパターン。クライアントが両者の違いを気にする必要がないときに便利。
集合・要素個別に必要な、クライアントがアクセスする某があったときにインターフェースが肥大化してしまうのが欠点。

マルチスレッド

人間が理解するには早すぎる

その他

コアとなるプロダクトを拡張可能にしてプラグインとして組み込んでもらう方式、密結合云々とかそんな綺麗事よりも「プラグイン側がひどいコードでも知らね〜〜」で通すための生存戦略な気がしてきた

OpenGL入門したかった

思うところがあって OpenGL を触ることにしたのでメモを残していくことにした。

環境

Windows8.1、Visual Studio 2015
基本的には以下のページを見ながらやっていった。

qiita.com

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 を書いた

f:id:ibako31:20170228201501j:plain

こういう感じの、受け取ったメッセージをシャッフルして再投稿するクソ bot を作った。

なんで作ったの?

顔文字がシャッフルされるとたまに変な顔文字が生まれて面白いと思った。そういえば Slack bot って作ったことないなぁ、と思った。


で、調べてみるとそこそこ新しい記事では hubotを使っていたりBotkit を使っていたりした。
…のだけど、JS 嫌だなぁと思ったので Ruby で書くことにした。

幸いにもいい感じの gem があったのでコレを使うことにした。

github.com

一箇所だけものすごく詰まった点があって、chat.postMessage を叩きに行くとき同時にトークンを指定すれば良いと思っていたのだけど、実際は configure で指定しないとダメなのだった。

github.com

このドキュメント読んでるとメソッド呼ぶ時に token で指定すれば良さそうなんだけど、not_authed が返ってきて悲しくなる。
gem の Usage にちゃんと書いてあるので、この通りにすれば良かった。

github.com

作った 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

C++と同じような感覚だと,デフォルトのアクセシビリティが違うのかなーと思ってたけどもっと重要な部分が違っていた.

CpawCTF やってる 2

あんまり時間ないので Lv2 の一部のみ.
Lv1 よりはやること増えてるけど,今のところ事前知識が間に合っててちょっと調べればなんとかなるレベルという感じ.

  • Q13.[Stego]隠されたフラグ
  • Q15.[Web] Redirect
  • Q16.[Network+Forensic]HTTP Traffic
  • Q17.[Recon]Who am I ?

ksnctf やってる

これ
CpawCTF よりむずそう.

以下,今ところ解けてる問題.

  • 1. Test Problem
  • 2. Easy Cipher
  • 3. Crawling Chaos
    • 何すれば良いのかは割とすぐ分かったけど,どうすれば良いのか分からなくて苦戦した
    • ググり力が低い…
    • ヒント: Firebugで難読化解除されたコードが見れるのとJS整形( ttp://jsbeautifier.org/ )

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
  • Q10.[Forensics] River
    • identify -verbose river.jpg
  • Q11.[Network]pcap
    • 普通に見れた…
  • Q12.[Crypto]HashHashHash!
  • Q14.[PPC]並べ替えろ!