Apache Arrowのビルド

先日OSS Gate東京ミートアップ for Red Data Tools in Speeeに参加して、Apache Arrowの開発にデビューしました。自分の専門でない分野に一人で飛び込むのはなかなか大変なので、こういうイベントがあるのは助かります。と言っても2時間の中でできたのは、公…

CMakeを使ってみた (7) find_packageとpkg_check_modulesによるライブラリ探索

久しぶりにCMakeの話。外部の依存ライブラリがあるC/C++のコードをCMakeでビルドする場合、インクルードパスやライブラリパスを指定する必要がある。パスを直接指定する方法以前書いた。しかし、そこで書いたのはパスやライブラリ名を直接指定するもので、そ…

C++のマングルとextern "C" {

C++とCが混在したプログラムを書くとときどき定義したはずの関数がundefinedだと言われることがある。そんなときの対処法とマングルの話。その前にまずはC言語だけの場合を考える。例えば以下のようなCのプログラムを書いてみる。 /* main.c */ #include "fo…

Emacsで制御コードを入力する

Emacsを使っているときでも時々制御コードを直接入力したいことがある。 文字列を置換するときに改行を入れたい 強制的にタブを入力したい(たいていのモードではタブはインデントの設定になる) ちょっとググれば、Ctrl-qを使うことで改行やタブが入力でき…

GNOME Planner for Windows 独自ビルド版

リポジトリ構成を変更することにしたので一時公開停止中。最近ちょいとプロジェクト管理ツールが使いたくなった。プロジェクト管理ツールと言えばMicrosoft Projectが有名だが、如何せん値段が高いし、そこまで高機能である必要はない。代わりのツールを色々…

Bash on Windows (Windows Subsystem for Linux) でvalgrindを動かす

Windows上でLinux(Ubuntu)のバイナリを動かすBash on Windowsが発表され(Windows Subsystem for Linuxという呼び方もされているが、用語の使い分けがよく分からない)、bash, gcc, clangといったツールがWindows上で動くようになった。gccやclangを動かす…

GCC7ではエラーメッセージが改善されるらしい

プログラムを書いているときには当然色々ミスをするが、GCC(gcc/g++)が出すメッセージは Clang(clang/clang++)に比べて分かりにくい/不親切なことが多い。例えば、FooBarという名前のクラスが宣言されていて、それを使おうとしたときに以下のように間違…

valgrindが検出するメモリリークの種類

C/C++のメモリリークチェックツールと言えばvalgrindが有名だが、メッセージの詳細を日本語で説明しているサイトはあまりないようなので調べてみた。valgrindは、mallocやnewで確保されたメモリ領域がポインタによって辿れるかどうかをチェックすることでメ…

【翻訳】 The Linux Graphics Stack

この記事はGNOME関連の開発を行っているJasper St. Pierre氏のブロク記事「The Linux Graphics Stack」の翻訳である。Linuxのグラフィックス環境はX Window Systemがデファクト標準になっているが、最近はWaylandやMirといった新しいディスプレイサーバが出…

package.elで自動インストール

Emacsには便利なelispパッケージがあるが、最近ではpackage.elというのが付属していて、ネットワーク上からパッケージをインストール仕組みができている。以前はウェブ上から手作業でダウンロードして.emacs.dに下に保存していたが、package.elを使えば一覧…

Ubuntu 16.04 Unity設定

Ubuntu標準のインターフェースであるUnityだが、デフォルト状態では正直あまり使いやすくないし、見た目もイマイチだと思う。MateやKDEを入れるという手もあるが、なんとかUnityを使ってやろうと思い、色々設定してみた。 設定ツールのインストール システム…

curlコマンドによるウェブアプリのパフォーマンス測定 (2) アップロード・ダウンロード速度測定パッチ

前回の続き。前回色々試した結果、curlの-wオプションではPOSTリクエストのボディとレスポンスのBodyが両方とも大きい場合、アップロード・ダウンロード速度を上手く計れないことが分かりました。仕方ないのでcurlを改造することにしました。今回追加したの…

curlコマンドによるウェブアプリのパフォーマンス測定 (1) time_starttransferの仕様

curlの-wオプションを使うとHTTPリクエスト/レスポンスの様々なデータを表示することができます。が、ちょっと不可解な部分があったので調べてみました。 背景 ウェブアプリの簡単なテストのためcurlコマンドをよく使っていたのですが、-wオプションでちょっ…

curlコマンドによるデータ送信あれこれ

最近Webアプリを作ることがあって、動作チェックのためにcurlコマンドを色々使った。オプションが色々あって、データ送信の方法に分かりにくいのところもあったので、使い方をまとめてみる。 なぜ分かりにくいか 理由1: 送信方法が色々ある 単にデータ送信と…

Makeでビルドオプションによって出力ディレクトリを変える

前回はMakefileをヘッダファイルの依存関係に対応させてみた。そのMakefileは入力ファイル(ソース、ヘッダ)と出力ファイル(依存関係ファイル(.d)、オブジェクトファイル、実行ファイル)がすべて同じディレクトリにあることが前提となっていた。しかし…

Makeでヘッダファイルの依存関係に対応する

CやC++で書かれたプログラムをMakeを使ってビルドする、というのはUnix/Linuxではよく行われていることだが、ちゃんとしたMakefileを書くのは意外と難しい。例えば以下の3つのファイルからなるプログラムを考える。 foo.h: 関数fooの宣言がある。 foo.c: 関…

はてなブログへ移行

ベータサービス中のはてなブログのアカウントがもらえたので試しに移行してみました。 http://wagavulin.hatenablog.com/

CMakeを使ってみた (6) ソース外ビルド

CMakeを使うと、CMakeCache.txtやCMakeFilesなど様々ななファイルやディレクトリが生成される。結果的にプロジェクトのディレクトリが見にくくなりがちだ。そんなときはビルド作業を行うディレクトリを別のディレクトリにするとよい。これをソース外ビルド(…

CMakeを使ってみた (5) 設定ファイルを作る

今度は設定ファイルを作ってみる。設定ファイルと言ってもCMakeに対する設定ではなくプログラムに対するものだ。 条件付コンパイルと指定方法 ある程度の規模のプログラムの場合、#ifなどによる条件付コンパイルがあるだろう。 #include <cstdio> int main(){ #if US</cstdio>…

CMakeを使ってみた (4) ビルドオプション

今回は1つのプログラムを様々なオプションでビルドできるようにしてみる。つまりconfigureでの--enable-foo --with-barのような機能だ。 optionコマンド optionコマンドを使うとオン・オフ指定するようなオプションが可能になる。例えば、追加機能feature-x…

CMakeを使ってみた(3)ライブラリを作る

実行ファイルではなくライブラリを作る場合も大きく変わるところはない。add_executableのところをadd_libraryにすればいいだけだ。例えばmylibというライブラリがsrc1.cppからなるとき、CMakeLists.txtは以下のようになる。 cmake_minimum_required(VERSION…

CMakeを使ってみた(2)もう少しまともなプロジェクト

前回は簡単なアプリケーションを作り、CMakeでビルドしてみた。もちろん実際のプロジェクトはもっと複雑で、ソースファイルも複数あるだろうし、各種パスの設定も必要だろう。そこで今回は以下を設定してみる。 デバッグ版ビルドとリリース版ビルドができる…

CMakeを使ってみた(1)経緯と簡単なアプリケーション

はじめに CMakeを調べた経緯 CやC++でプログラムを書くときは普通何らかのビルドツールを使う。Unix/LinuxならMakeが多いだろう。Makefileにビルド手順を書くわけだ。一方WindowsでVisual Studio(以下VS)を使うときはVS上でビルドの設定を行い、その結果は…

O'Reilly Japanの電子書籍に期待

昨日O'Reilly Japanからメールが来て、Ebook Storeがアップデートされたとのことでした。今回のアップデートで、過去に購入したEbookを再ダウンロードできるようになりました。 O'Reilly Japanの電子書籍のDRM これまで購入したPDFを失くしたわけではないの…

LLVMをちょっと調べてみた

最近LLVMについて調べてみたのでまとめてみる。自分はコンパイラの専門家でも何でもないので間違った内容があるかもしれない。 GCCとコンパイラの仕組み LLVMの前にまずはコンパイラ一般の話。コンパイラはまずソースコードを解析して内部表現にする。これは…

MSYSとmsysgitの共存

Windowsでgccを使う場合は普通MSYS+MinGWを入れ、MinGW Shellから使う。一方gitを使うときはmsysgitを入れ、Git Bashから使う。msysgitは名前の通りMSYSをベースにしたものだが、インストールは独立したものになっている(デフォルトではMSYS+MinGWはC:\MinG…

M-x compileとMakefileの疑問

EmacsでCのソースファイルを編集しているときにM-x compileすると通常はmake -kを実行するが、このときのディレクトリはそのソースファイルのあるディレクトリになる。しかし、ある程度の規模のプロジェクトになるとモジュール毎にサブディレクトリを作った…

M-x compileで成功したらウィンドウを閉じる

Emacs + gccで開発するときの話。EmacsでM-x compileをすると自動的に新しいウィンドウが開き、ビルドの結果を表示するバッファ(*compilation*)が表示されます。ここに警告やエラーのメッセージが表示されるためデバッグには便利なのですが、成功した場合…

Linux共有ライブラリの簡単なまとめ

Linuxで共有ライブラリ(*.so)を作るようになったのでちょっと勉強してみた。今までは使うだけだったので、以下のようなことは知っていた。 作るときはgccの-sharedオプションを使う。 使うときはgccの"-lライブラリ名"でリンクするライブラリを指定する。 …

ソースからビルドしたrubygemsで失敗

Ruby-1.9.1をソースからビルドしてgemコマンドを実行したところエラーメッセージが出て失敗。どうもzlib関連のモジュールの問題らしい。結局zlibのヘッダファイルなどがなかったためRubyのビルド時に有効になっていなかったのが原因ぽい。zlibの開発用パッケ…