文字列と相互変換できる列挙型(enum)

stringとenumを双方向で変換できてかつPODなのが欲しくなったので書きました。内部の変換テーブルにはboost::bimapを使っています。特徴としては 双方向に変換できる 実行時 POD型 boost::bimapなので速い(後述) などです。 使用例 ENUM_UTILの実装は(長…

GCCのOpenMP実装(libgomp)のライセンス

最近gccでOpenMPを使っていて、ふとライセンスが気になったので調べてみました。ただし私は法律の専門家ではないので、正確な情報はライセンスの原文を見て判断してください。そもそも、gccでC++のコードをコンパイルすると、OpenMPとは関係なくlibstdc++やl…

初めてOpenMPを使ってみて気づいたこと

最近、あるプログラムを並列化して速度を上げるためにOpenMPを使っています。ネット上で検索するとOpenMPの入門記事はあっても実際に使ってみたよ、というのは多くないようなのでそのときに気づいたことなどを書いてみました。 OpenMPと他の並列化技術との比…

boost::logはmutable_constantをshallowコピーする

boost::logのloggerとそれに紐付いたmutable_constantをコピーしようとしてハマったのでメモ。 deepコピーがしたかったのだけど、結果はタイトル通りshallowコピーだった。ドキュメントにもよく読んだら書いてあった。 The shared pimpl design comes signif…

HaskellでのSDLの使い方

SDLのHaskellバインディングはいくつかありますが、この記事ではHackageのSDLを使って説明しています。Windows環境だとCabalではうまく入らなかったりするので、直接ソースからビルドする必要があるかもしれません。 SDLを使うにはFFIが必要 SDLを使ったHask…

Haskellでシューティングゲームを作ったまとめ

ゲーム製作者コミュニティ in 札幌の春のシューティング祭りプロジェクトで一ヶ月ほどかけて簡単なシューティングを作りました。 Windowsバイナリは紹介ページ、ソースはHackageから落とせます。ビルドにはSDLが必要です。また、絵と音楽はそれぞれコミュニ…

CabalによるHackageへのアップロードとSetup.hsの使い方

CabalでHackageにパッケージを上げたのでやり方をまとめておきます。 0.Hackageのアカウントを用意する Hackageはダウンロードなら誰にでも出来るようになっていますが、アップロードするにはアカウントが必要になります。説明を読んで、ross@soi.city.ac.uk…

HaskellでFizzBuzzやってみた

Twitter見てたらFizzBuzzの話題が流れてたので書いてみた。最初に考えたのがこれ。引数 n 以下のFizzBuzzを文字列にして返す再帰関数を定義した。 fizzbuzz 1 = "1" fizzbuzz n = fizzbuzz (n - 1) ++ " " ++ case (mod n 3, mod n 5) of (0, 0) -> "FizzBuz…

Haskellでクイックソート

Haskellに限らず関数型言語の紹介では、プログラムの簡潔さを表すのにクイックソートがよく使われます。Haskellでクイックソートを書くとこんな風になります。 --qsort.hs qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y …

Haskell始めました

Haskellは前に少しだけ触ったことがあるのですが、ちゃんと使ってみようという気になりもう一度勉強を始めました。とりあえず有名処理系のGHCをダウンロードしようとしたところ、ダウンロードページにHaskell Platformでライブラリと一緒に入れたほうがいい…

QtのPhononモジュールで動画再生

QtにはPhononというクロスプラットフォームなマルチメディアAPIが付属しています。PhononはもともとKDE向けに開発された、DirectX・QuickTime・GStreamerなどのバックエンドを抽象化するAPIで、音声や動画の再生を簡単に行うことが出来ます。 今回は早速、動…

QtWebKitがすごすぎる

最近Qtを使い始めたのですが、QtにはQtWebKitというWebKitベースのブラウザエンジンが付いています。 せっかくなので遊んでみよう、と思ったらあまりに簡単で驚いたので紹介です。 #include <QApplication> #include <QtWebKit> int main(int argc, char* argv[]) { QApplication app</qtwebkit></qapplication>…

オブジェクトの初期化と代入

C++

ライブラリを書いていると、自作のクラスを便利に使えるようにコンストラクタ・コピーコンストラクタ・コピー代入演算子をたくさん用意したくなることがあります。でも、これらが一体いつどこで呼ばれるのか資料が少なかったので、また仕様書を読んでみまし…

テンプレート関数のオーバーロード解決とSFINAE

C++

自作のライブラリを書いていて、SFINAE(Substitution failure is not an error)の詳細が知りたくなった。仕様書を読んだので以下にメモ。 テンプレート関数のオーバーロード解決規則 あるテンプレート関数の呼び出しに対して、オーバーロードされた関数の…

C++でURLエンコード/パーセントエンコード

ネットで見つけたものがうまく動かなかったから自分で書いた。space_to_plusをtrueにするとスペースが(%20ではなく)+記号になるようにした。 #include <string> #include <sstream> #include <iomanip> std::string url_encode(const std::string& str, bool space_to_plus = false) </iomanip></sstream></string>…

CMakeのビルド構成の設定

C++

Makefileを書くのが面倒になったので、CMakeを使ってみた。 デバッグモードやリリースモードのようなコンパイルのモードを指定できないか調べたところ、CMakeLists.txtに set(CMAKE_CXX_FLAGS "") set(CMAKE_CXX_FLAGS_DEBUG "-g -pg") set(CMAKE_CXX_FLAGS_…

gccのプリコンパイル済みヘッダ

C++

昨日の続き。gccのプリコンパイル済みヘッダ(PCH)がかなり速いことに気づいたけど、日本語の資料が少ないので本家のマニュアルを読んだ。結構複雑だったから下にメモしておく。 作り方 foo.hのプリコンパイル済みヘッダを作る場合、普通にコンパイルするよ…

ビルド時間の短縮

C++

Boostは便利だけど、ちょっと使っただけでビルド時間が一気に長くなってしまうので、何とかならないか調べてみた。まず、最近のgccではプリコンパイル済みヘッダ(PCH)が使えるらしい。しかし、ヘッダをプリコンパイルしたときのオプションが本番のコンパイ…

ブラウザとOSの境界

今現在、ウェブサイトがブラウザを通してPCにプログラムをインストールしようとするのはかなり嫌われている。 Flashやjavascriptはあるけど、もっとマシンパワーの要る計算を(サーバでなく)クライアントにさせたいというニーズは確実にあるはず。SELinuxみ…

ICFP 2009 Programming Contest

C++

結果が出たようです。 http://icfpcontest.org/scoreboard.php 私(C--)は111位でした。VMの実装に手間取ったことと、「入力を行うプログラムを書く→実行する→プログラムを修正する」のサイクルに時間をとられたのが失敗かなぁ。シミュレーションなので実行…

ニコニコ動画検索システム

以前から、ニコニコ動画をニコニコ動画APIでクロールして、面白い動画を探そうというのをしていました。サイト→Mylist per Comment基本的にはとにかくデータを集めてきて、そこからコメントに対してマイリストが多くついてるような動画を表示しています。あ…

C++0x Standard Library wishlist

C++

C++0x Standard Library wishlist (revision 5)というのを発見しました。この中には具体的な提案が既にあるものから曖昧な希望まで入っているらしく、素敵なことになっています。でも、この辺りのものがBoostに出揃ってくればかなり便利になりそうな気が・・・…

クラスのメンバ関数内のstatic変数

C++

インスタンスごとに存在するんだと思ってた。実際にはクラスに所属する(staticメンバ変数やグローバル変数と同じで一つだけ)らしい。完全に思い違い。

未解読文書一覧

C++

読みたいもののメモ。 More C++ Idioms Blitz++作者のページの文書 特にTechniques for Scientific C++とか。 なんかどれも一部で有名、世間でマイナーな気が。

boost::asioはもっと評価されるべき

C++

boost::asioはネットワークメインの非同期入出力ライブラリです。以前から知ってはいたのですが、使ってみたら予想以上に便利でした。iostream風になってるだけでこんなに便利とは。 クライアントの例はLet's Boostに有るので、サーバの例を。コンパイルには…

MzSchemeでネイティブコンパイル

最近久しぶりにSchemeを使ってるんですが、ネイティブコンパイルがしたくなりました。 MzSchemeのmzcで直接実行ファイルを出そうとしたら、moduleを使うところでハマったのでメモ。 helloworldの作り方 ;hello.ss (module hello mzscheme (display "hello, w…

S式は読みにくい

まず先に言っておきますが、括弧は慣れれば読めるかもしれないですし、実際私もそうだと思ってたりします。じゃあ何が読みにくいかというと、何もかも関数呼び出しの形式で書かれてしまうことです。この辺のことは404 Blog Not Foundの http://blog.livedoor…

画像処理ライブラリ

C++

画像処理ライブラリのメモ。 GIL(boost::gil) 元はAdobeがオープンソースで公開したもので、Boostが取り込んだ。 画像のフォーマット依存な部分をテンプレートで抽象化して隠すのが目的。なので提供している機能はかなり低レベル。 OpenCV Intelがオープン…

Boost 1.36 リリース

C++

Boost 1.36がリリースされました。 http://www.boost.org/users/news/version_1_36_0 新しく追加されたライブラリは Accumulators Exception Units Unordered です。 内容はLet's Boostにすでに紹介が出ています。 Unorderedはハッシュを使うコンテナで、標…

ICFP 2008 Programming Contest

C++

Final Roundの途中結果が出ています。 http://www.icfpcontest.org/results/final/index.html 私(suzumiyaharuhiko)は5回戦で脱落。 アルゴリズムは 普段は左回りで回転してホームを向いて加速・前進 障害物を見つけたらブレーキしつつ右回りで回転してよ…