実際に使うDocker超入門 (第1回)

Tatsuya Yatagawa
こんにちはtatsyです。 今流行りのDockerですが、私も最近自分のプログラム・ビルド/テスト環境にDockerを導入して、実行時間の削減ができたりして、結構つかえるなぁと思い始めているところです。 今回の記事では、ハイパーバイザ型仮想化とかコンテナ型仮想化とかいう難しい話置いといて(できないだけ)、とりあえずDockerを使ってみましょう。 今回は記事が長くなりそうなので2つに分けます。第1回はD ...

Travis CI上でGTestのvalue-parameterized testを実行する

Tatsuya Yatagawa
こんにちは。先日Travis CI上でGoogle Test (GTest)のvalue-parameteraized testを実行する際、少し苦労したのでやり方をまとめておきます。 GTestのvalue-parameterized test 最近のC++のユニットテスト・フレームワークはいろいろあって、最近はCATCHとかいうのが良いよ、なんていわれたりしてますね。 それでも私がしぶとくGTestを使い続けているのはv ...

Travis CIのContainer-based Infrastructureを使ってみる

Tatsuya Yatagawa
こんにちはtatsyです。 最近Travis CIの仕様が新しくなりまして、Container-based Infrastructureというものが導入されました。 詳しい内部使用は分からないのですが、これまでのTravis CIはユーザからのリクエストが来た際に、そのリクエストをスタックに積んでおいて、サーバーに空きが出た順に仮想サーバーを割り当てて処理するという手順を取っていたみたいです。 ですが、そうす ...

AOJでHaskell: 1188 階層民主主義 (Hierarchical Democracy)

Tatsuya Yatagawa
こんにちはtatsyです。 今日はHaskellの勉強を兼ねてAOJの関数型向きっぽい問題をやってみます。やる問題は1188番の階層民主主義という問題です。 問題の内容 入力は[[123][4567][89]]のようなかっこで区切られた文字列です。この中身は有権者の人数を表していて、この半分以上を取ればこの地区で勝利できます。 上の入力例ではかっこで囲まれた数字が3個ありますが、候補者はこの3個のうちの半 ...

swap技法とshrink_to_fitの違い

Tatsuya Yatagawa
こんにちはtatsyです。 最近リーダブルコードを読んでおりまして、この世の中にはvectorのswap技法と呼ばれるものがあることを知りました。 swap技法とは? swap技法というのは、vectorがreserve等で確保している内部的なメモリのサイズ(capacityで確認できる)を切り詰めるための方法です。 通常、reserveというのはメモリ容量を増やすことはあっても減らすことはありません。つ ...

Haskellでsmallptを作ってみた

Tatsuya Yatagawa
こんにちはtatsyです。 お盆休みなので最近勉強しているHaskellで[smallpt][1]を実装してみました(←暇か!)。 作成した手順に従って、ちょっとずつ解説してみたいと思います。 Vecクラス(のようなもの)を作る 「クラスのようなもの」と書いたのはHaskellにはオブジェクト指向型言語で言うところのクラスはないからです。Haskell的には独自定義のオブジェクトは代数的データ型といいます ...

Qt5でシャドウ・マッピング (Shadow Mapping)

Tatsuya Yatagawa
こんにちはtatsyです。 本日はシャドウ・マッピングのQt5で実装する方法を紹介したいと思います。 シャドウ・マッピング自体の詳しい説明は省きますので、詳しく知りたい方は 床井研究室 – 第27回 シャドウ・マッピング Tutorial 16 : Shadow mapping | opengl-tutorial.org などをご覧いただけると助かります。 シャドウ・マッピングとは? 最初にシャドウ・マッピングを簡単に解説したいと思います(本当にざっくりです)。 シャドウ・マッピングとは物体が別の物体に ...

C++11のmoveを使ってみる

Tatsuya Yatagawa
こんにちはtatsyです。 最近C++11ってすごいなぁと思う出来事が多々ありまして、そのうちの一つをブログに書いておこうと思います。 C++11で新しく追加された昨日の一つにmove semanticsというものがあります。 詳しい説明に入る前に次の単方向連結リストのコードを見てください。 struct ListNode { int val; ListNode* next; ListNode(int val_ = 0, ListNode* next_ = NULL) : val(val_) , next(next_) { } }; class List { private: ListNode* tail; public: ListNode* root; public: List(); List(const List& list); ~List(); List& operator=(const List& list); void add(int val); private: void deleteNode(ListNode* node); void copyNode(ListNode* dst, ListNode* src); }; 通常のコ ...

Google Code Jam 2015 Round 2

Tatsuya Yatagawa
こんにちは、お久しぶりのtatsyです。 本日はGCJ 2015のRound2に参加しました。 去年から1年、今日という日に賭けてきたにもかかわらず、今年は1217位という悲しい結果に終わってしまいました。 CのEasyが微妙に計算時間を短縮できなかったのが敗因です。そこらへんも含めて、 A Small / Large B Small C small を解説していきたいと思います。 A. Pegman (Small 5pt, Large 10pt) 問題 R×Cの大きさのグリッドが与えられている。グリッドの各セル ...

TopCoder Open 2015 Round 1A

Tatsuya Yatagawa
こんにちはtatsyです。本日はTCO2015ラウンド1Aの解説です。 Easy (250点) 問題 ある2つの数A,Bが与えられた時、この二つの数の類似度sim(A,B)は0から9の数字の中で、2つの数両方に含まれる数の個数を表す。AとBが取りうる値の下限Lと上限Rが与えられたとき、互いにことなるAとBでsim(A,B)の最大値はいくつか? 解法 単純に考えるとLとRの間の全ての数のペアについてsimがいくつにな ...