C言語のユニットテストライブラリPicoUnitを作った

C言語でテスト

僕が通っている大学のソフトウェア演習で、C言語で(BASIC風の)独自言語のコンパイラを作る課題が出た。 1ヶ月おきくらいに進捗のチェックと機能追加があって、それを5回くらい繰り返すと完成するらしい。

今までもソフトウェア演習はあったけど、この課題は今までと違ってテストのテストデータを提出することが必須になっている。

ただ、手動でテストすることを想定しているらしく、ユニットテストを書いてテストするみたいなことではないらしい。 手動で確認だと大変だし、カバレッジ下がりそうだし、何よりも僕は機械で出来ることは全部機械に任せる主義なので、手動でテストはナンセンスに感じて仕方無い。

assert()

調べてみたらC言語にはassert()関数というものがあって、それを使うと期待する値と違う結果が渡されたときにConsoleに何かしら表示してくれる。 ただ、assert()関数はプログラム内のどこか一度でもテストが失敗すると、その場でexitされてしまう。

まとめて全部をテストした上で落ちたテストを表示してくれる機能が欲しかったので、ライブラリ?マクロ?を書いてみた。 C言語のマクロを使ってプリプロセッサーでテストコードを差し込んで表示するだけのライブラリなので、一つのヘッダファイルだけで動く。

github.com

PerlのProveみたいにしたかったので、結果の出力形式を似せている。 使い方は簡単でテストしたいところでpu_test()して、全体のテストが終了するときにpu_print()すれば結果が表示される。

VimからAtomへの乗り換えを進めてる

趣味のコーディングのときだけ、Atomを使って様子を伺っている。 1年くらい前に、Vimを使い続けるかAtomを使うか悩んだときには、起動速度の差とかパッケージの量とかで、まだまだVimだなぁって考えたんだけど、 久々にMarkdownでメモを取る機会があって、Atomを起動したら思いの外良かった。 起動速度が早くなってるし、パッケージもだいぶ充実して良さそうなのでAtomに移れないかなと思いながらしばらく使ってみている。

Vimキーバインドになれてしまっているので、まずVimキーバインドに設定した。 入れてるパッケージはこんな感じ。とにかくVimに近づけようとしている感じがするけど気にしない。

Vim-mode

  • vim-mode (キーバインドVim風にしてくれる)
  • vim-mode-visual-block (vim-modeだけではC-vに対応してないのでvim-modeが対応するまで入れてる)
  • ex-mode (:w, :qとかに対応)
  • Sublime-Style-Column-Selection (Sublime text風のマルチカーソルをサポート)

Atom

  • file-icon (ファイルのアイコンを良い感じにする)
  • minimap (Sublime text風のマップを表示)
  • project-maneger (複数プロジェクトを切り替えれるようにする)
  • regex-railroad-diagram (正規表現を可視化)
  • term2 (シェルをAtom内で実行できる)
  • Color-Picker (カラーコードを実際の色で表示してくれる)

Linter系

  • linter (linter本体)
  • linter-perl (perl)
  • linter-jshint (JavaScript)
  • linter-less (less)
  • linter-tidy (HTML)
  • linter-flake8 (Python)

だめなところ

vim-modeの問題なんだけど、insert-modeからnormal-modeへの切り替えをjjに割り当てると、insert-modeで1文字だけのjが入力できなくなってしまう。

jだけを入力することは滅多に無いし今後のアップデートで治るらしいけど、ときどき不便。

それから、Perlのインクルード補完欲しい。今のところ無さそう。自分で書けって話ですね。

起動が遅いのが気になる。普通に使うときは気にならないけど、ターミナル内で開きたかったりするときに重いなぁ...ってなる。

Perlで、ある配列から順序そのままで別の配列の重複除いた配列を作る

Perlである配列から、順番はそのままで別の配列に含まれる要素を除いたリストを作りたかったけど、すぐ出来なかったのでメモ

例えば、以下のfoo, barが与えられたとき、

foo = (1,2,3,4,5,6)

bar = (1,3,6)

次のようなbazを手に入れたい。

baz = (2,4,5)

簡単なのはfooとbarをハッシュにしてしまって統合することだけど、順番も保証したい。

答え

my @foo = (1,2,3,4,5,6);
my @bar = (1,3,6);
my %bar = map { $_ => 1} @bar;
my @baz = grep { !$bar{ $_ } } @foo;

ポイントは、最終的に重複を消したい方の配列はそのままで、もう一つの配列をハッシュにすること。こうすれば、取り出した要素は元の順になる。

一番最後の行はこれでも行けるはず(未確認)

my @baz = grep { $_ != $bar{ $_ } } @foo;

NodeでORMのSequelize使ってみた

ORMのSequelizeを使ってみた。 NodejsでWebアプリケーション作るときは、MongoDB + Express + Angular + NodejsのMEANスタックを使うのが定番らしいけど、 MongoDBもAngularも触ったこと無いので、慣れてるMySQLを使うべくSequelizeを入れた。

モデルの作成

var Sequelize = require('sequelize');
var Seq = new Sequelize('nodejs','root','');
var Article = Seq.define('Article', {
        name: Sequelize.STRING,
        text: Sequelize.TEXT('long')
});
Seq.sync();

これ

var Seq = new Sequelize('nodejs','root','');

だけで、localhostのnodejsっていうDBにrootで接続してくれる。パスワードがあるときは第三引数で指定する。

var Article = Seq.define('Article', {
        name: Sequelize.STRING,
        text: Sequelize.TEXT('long')
});

データモデルはこんな感じで定義する。Seq.sync() すると、モデルで書いたデータ構造でMySQLにテーブルを作ってくれる。

レコードの追加

Article.create({ 
        name: 'foo', 
        text: 'bar'
    });

レコード追加するときは、こんな感じ。直感的。

レコードの検索

Article.findAll().then(function(articles){
    //結果の処理
});

検索もこんな感じで全件検索したりできる。 今のとこ一覧しか使ってないので、Where句指定してないけど、ドキュメント読んだ感じ指定するのも簡単だった。

まとめ

  • Sequelizeを日本語で解説したサイトは少ないけど、公式サイトのドキュメントしっかりしてるし、海外では採用事例多そうなので安心。

  • ORM使うと抽象度が上がるけど、実際にどんなクエリが走るのかが目に見えなくなって、大きなプロジェクトだと破綻するとも言うので、 ORMを使うのが一概に良いかどうかは分からない。

  • 一応、SequelizeはSQLのクエリが毎回ログに流れるので、眼力あれば確認できる。

最近、JavaScriptとAndymoriハマってる

JavaScriptパターン

JavaScriptパターンを借りて読んでる。7割くらい読み終わったんだけど、JavaScriptの文法を勉強しつつ、アンチパターンをさけるプログラミングが出来そうで良い。 JavaScriptは自由度高いけど、その自由度の高さ故に何も考えずにコード書くと悲惨なことになるので、グッドパターンとアンチパターンを学べるのがありがたい。

プロトタイプベースのオブジェクト指向とスコープが関数スコープのみっていうのが、普通のオブジェクト指向言語と違って感覚つかむのが難しい。 ブログとかポートフォリオサイトくらいのレベルだったら、何も考えずに書いてもいいけど、もっと大きなWebサービスで同じことすると、謎の挙動示したりして地獄見そうなので、ちゃんと勉強しときたい。

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

省エネ家電すごい

なんとなく気になってエアコンの電気代調べてみたら、1時間10円くらいってことを知った。意外と安い。たぶん、つけっぱなしにするともうちょっと1時間あたりの電気代下がる。 2011年製造のダイキンの6畳用エアコンだから、最近のやつはもっと安いのかな。

引っ越す前の家に付いてた20年近く前のエアコンが、10畳のリビング用とかで、つけると電気代跳ね上がってたから、そのイメージが残ったままだった。最近の家電、省エネ凄いな。

Andymori

Youtubeの自動再生で流しっぱなしにしてたときに、良い曲だなーと思ってアーティスト確認したらAndymoriだった。凄いAndymori好きな人が居るので、名前は知ってたけど聞いたこと無くて、Andymoriなのか...!!って思いつつ、最近ずっと聞いてる。 でも、解散しちゃったんだよね(´・ω・`) www.youtube.com

www.youtube.com

www.youtube.com

Vimで全角記号の後ろにカーソル移動すると崩れる件

Vim使ってて、「…」とか「○」みたいな全角記号が書かれてるファイルを編集すると、変になる。 記号の後の文字が2回繰り返されたり、記号の後ろに半角スペースが空いたように見えて、削除すると記号ごと消えたり。

なので、いつもそういう文字列が含まれるときだけAtomを起動させてた。 (それならもういっそAtom使えよって話なんですが)

文字コードの問題なのかなーとか思ってたけど、ぐぐったら普通に答え見つかった。 www.graviton-jk.net

.vimrcに

set ambiwidth=double

って書いとくと良いらしい。快適。

互換品のMagsafe2 60Wアダプタを買った

Magsafe

外でMacBookを使う機会が増えてきて、平日は常に持ち歩いている。 公称8時間持つバッテリーをMacBook Proは積んでいるらしいが、ビルドしたり仮想環境立ち上げたりと、CPUが100%に近い状態でブン回してると3時間も持たない。 なので、常にリュックの中にMacとACアダプタが入った状態になりつつある。

常備しときたい

家の机に、外部ディスプレイ用のMini Displayportケーブルと有線LAN用のThunderbolt-EthernetケーブルとUSB3.0ハブの親ケーブルを引き出して置いてるので、ここにMagsafeケーブルを常に置いておいて、Macにまとめて繋げたい。

・家に帰ったら、ケーブルまとめて繋いでデスクトップ風に使う

・外に行くときは全部抜いて、Macだけ持っていく

こんな感じの生活がしたい。

さすがに高くないっすかね

予備のACアダプタ買おうとしたけど、Apple純正の60W電源は前から値上げされ続けてて、今はなんと税込み10,260円

さすがに、ACアダプタに1万円って高くないかな...

Apple Wireless KeyboardとかMagic Trackpadですら8000円とかなのに、電源が1万超えはちょっと買いにくい...

Amazonに売ってる互換品

Amazonで調べたら、互換品が3000円前後で売られてたので、これで妥協することにした。

(これ使うともちろん保証効かなくなりますし、ACアダプタが壊れるだけでなく、MacBookが壊れたり、火事になる危険性もあるので買うときは自己責任で買ってください)

届いたやつ(怪しい)

もう箱の時点で怪しい。リチウムイオンとか書かれてるけど、ACアダプタリチウムイオン使ってないし。何かのバッテリーが入ってたダンボールを流用してる感すごい。 f:id:yuki_tkd:20150715235702j:plain

が、開けてみると普通だった。 なんか互換品はAppleマークがないとか、色がグレーとか言われてたけど、届いたのはOEM品なのか分かんないけど、Appleマーク入ってる。 f:id:yuki_tkd:20150715235717j:plain

上が互換品で、下が純正。 f:id:yuki_tkd:20150715235726j:plain 純正がアメリカのDELTA社製で、互換品がSamsung製(表記は)。 f:id:yuki_tkd:20150716001406j:plain

ビクビクしながら繋いでみたけど、今のところ正常に動いてる。 発熱も普通だし、Macにも60WのACアダプタとして認識されてるっぽい。

Amazonのレビューとかだと、2週間くらいで壊れたみたいな意見よく見るので、しばらく使ってから壊れたらまた報告しよう。