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の開発用パッケ…

imenuで関数定義に飛ぶ

Emacsではimenuという機能があって(多分デフォルトで使える)、M-x imenuとするとそのバッファの中にある関数に飛ぶことができます。C, Ruby, Schemeなど色々な言語で使えて、しかも事前準備も必要ないので結構便利です(C言語でもっと本格的なものならetag…

プログラマが小学校卒業までにやっておくべきこと

プログラマの間でも「〜は小学生まで」という言い回しが密かに流行っていますが、それらをまとめるとプログラマは小学校卒業までに以下をやっておかなかればなりません。 CVS (参照:naoya氏の資料) bash (参照:CVSと同じ) SOAP (参照:山本陽平氏の資料36ペー…

gauche.nightとプログラミングGauche

今日は[gauche.night|http://practical-scheme.net/wiliki/wiliki.cgi?gauche.night]に行ってきた。3/14発売の[プログラミングGauche|http://www.oreilly.co.jp/books/9784873113487/]を先行販売していたので購入。 最後のページのタイトルが間違っていて訂…

第2章(1)

2.2.4節では図形言語の例と問題がある。しかしScheme自身は画面への描画機能は持っていないため、本でも具体的な描画の方法は書かれていない。もちろん本に載っている関数や問題を実装しても実際に描画できるわけではない。もちろんそれではつまらないため、…

Ruby-1.9.0リリース

Ruby-1.9.0がリリースされたようです。クリスマスリリースの予定がちょっとだけ遅れて日付が変わってしまったようですが、リリースおめでとうございます。 なにはともあれ、とりあえずインストール。環境はVine Linux 4.1 on VMware-6。 # ./configure --ena…

Windows用のNASをLinuxから使う の続き2(autofs)

前回、前々回とmountコマンドを直接叩いたが、こういうのは面倒なのでautofsを使う。以下設定例。 //Server/Folderを /mnt/nasにマウントする。 パーミッションなどは以下のようにする。 ユーザ foo グループ foo ファイルのパーミッション 775 ディレクトリ…

Windows用のNASをLinuxから使う の続き(権限の設定)

前回のようにしてマウントすると書き込みはrootしかできない。これでは不便なので一般ユーザでも書込できるようにする。所有者と所有グループはuidとgid、ファイルのパーミッションはfmask、ディレクトリはdmaskで指定する。なおUnix上のファイルのように各…

Windows用のNASをLinuxから使う

PCのバックアップをとるなら外付けのHDDを使うのが一番楽。でもUSB接続だとPCが複数あるときに面倒。ということで以前にLAN接続のHDDを買った。Gibabit LANが使えて、しかも一定時間アクセスがないとディスクもファンも止まるため普段は騒音なしというなかな…

VMware 6購入

以前VMware 5を買って使っていたが、Vistaでは不具合があるようでVistaに移行してからはVMware Playerを使っていた。 最近やっと6の日本語版が出たので購入してみた。これからセットアップだ。

Emacsのruby-mode.elってどこだっけ

Emacsにはデフォルトでたくさんのmodeが用意されてるけど、ruby-modeは入ってない。Ruby本体のソースのruby-1.8.?/misc以下にあるし、たいていのLinuxディストリビューションにはパッケージが用意されているけど、Windowsバイナリ+Meadow環境だとちょっと面…

Emacs (Meadow) + GaucheでScheme開発

Scheme処理系は色々あるがGaucheを使うことにした。理由は特にない。Emacsで便利に使えそうなのをGoogleで検索してたら最初に見つかっただけ。Gauche本体はGauche本家のダウンロードページから取ってこれる。MinGWでコンパイルしたWindows版のリンクは404に…

第1章(5)

今日は疲れたので一問だけ。 問題1.17 これは問題1.16ができれば簡単かな。5x7なら以下のようになればいいだろう。 5 7 0 5 6 5 10 3 5 10 2 15 20 1 15 20 0 35 というように、偶数なら2倍、奇数なら足し算する。

SICP第1章(4)

問題1.15 a 実際に関数pの最初に (display (format "x = ~a\n" x)) を入れて実行してみれば簡単か。 x = 0.049999999999999996 x = 0.1495 x = 0.4351345505 x = 0.9758465331678772 x = -0.7895631144708228 となり、5回呼ばれた。 b sine関数が再帰的に呼…

第1章(3)

問題1.14 まずcount-changeが何をしているのか把握する。正直説明の日本語が分かりにくいためか、すぐには理解できなかった。amountセントを、kinds-of-coins種類のコインで両替する場合の数を求める関数がcc関数。なお、コインの種類が1種類のときは1セント…

第1章(2)

SICP読書の進捗。エントリタイトルの括弧内の数字はこのブログで書くときの通し番号であって本のページなどとは関係ないです。すでに前回ちょっと書いたので今日は(2)ということで。なんかだんだん難しくなってきた。問題1.13とか数学の証明問題になってる。…

最近LaTeX環境が使いやすくなってる件について

最近はWordばかりでLaTeXを使うことがめっきり少なくなってしまったが、やっぱりLaTeXは便利だと思う。 バージョン管理が楽 テキスト形式だからCVSやSubversionを使えばバージョン管理が簡単。Wordだとhoge-0.1.docとか作って、更新するときはコピーしてhoge…

ブログを書き続けるには

2日目にしてさっそく書くことがない。いや、もちろん過去にあったことや知ったことから何かを書くことはできる。でも過去を食いつぶすようなスタイルでは今後長く書き続けることは無理そう。そんなに毎日変わったことが起きたりすごい体験をしたりしてるわけ…

SICPを読み始める

SICP(isbn:9784894711631)を読み始めた。とりあえず20ページまで。さすがに最初はそれほどつまずくことなく読めた。 それでもいくつか疑問はある。 1.1.1の脚注7 p4あたりに >>Lispはすべての式には値があるという約束に従う. とあるけど、alternative(el…

wagavulinのブログスタート

さてさて、今まで何度となく三日坊主に終わったブログを再びスタートしてみよう。