Recently in computer Category
February 4, 2012
gnuplot の canvas terminal についての諸々
gnuplot 4.4から、terminalにcanvasが追加された。このcanvasは、何を隠そうHTML5のCanvasオブジェクトに、グラフを描画するコードを出力する。たとえば、以下のコマンドを入力すると、
set terminal canvas mousing jsdir 'http://www.argv.org/~chome/gnuplot' set output 'sinx.html' plot sin(x)
sinをプロットした画像が、sinx.html に書き出される。次に、
set terminal canvas name 'sinx' set output 'sinx.js' plot sin(x)
と入力すると、name オプションで指定した文字列のidを持つcanvas要素にグラフを描画する関数を含むJavaScriptのコード「のみ」が、sinx.jsに出力される。ドキュメントによると、このスクリプトを使う最小構成は以下のようなHTMLとのことだ。
<html> <head> <script src="canvastext.js"></script> <script src="gnuplot_common.js"></script> </head> <body onload="fishplot();"> <script src="fishplot.js"></script> <canvas id="fishplot" width=600 height=400> <div id="err_msg">No support for HTML 5 canvas element</div> </canvas> </body> </html>
が、OSX版のChromeでは、変数zoomedが宣言されていないとエラーが出るので、以下のようにグローバル変数 zoomedを宣言する。JavaScriptのみを出力する場合は自前でコードを追加するはずなので、そこで宣言しておけばよいだろう。
<html>
<head>
<script src="canvastext.js"></script>
<script src="gnuplot_common.js"></script>
</head>
<body onload="sinx();">
<script type="text/javascript">
var zoomed = false;
....
</script>
<script src="sinx.js"></script>
<canvas id="sinx" width=600 height=400>
<div id="err_msg">No support for HTML 5 canvas element</div>
</canvas>
</body>
</html> 2012年2月4日現在、すでにgnuplot 4.6-RC1が出ているので、このバグが修正されているか確認する必要がある。されていなかったらpatchを投げよう。
February 2, 2012
pipeを使ってgnuplotをCで書いたプログラムから制御する方法(Win32)
gnuplotは優れたプロットプログラムである。インタラクティブにコマンドを入力してもよいし、スクリプトを書いてバッチ処理もできる。そしてWin32であっても、パイプを使って外部プログラムから制御することもできる。ここではWin32 APIを使って、Cで書かれたプログラムからgnuplotを操作してみた。
#include <stdio.h>
#include <stdlib.h>
static const char *GNUPLOT = "c:\\gnuplot\\binary\\gnuplot.exe -persist";
int main(int argc, char* argv[])
{
FILE *pPipe = _popen(GNUPLOT, "w");
if(NULL == pPipe){
printf("popen fail\n");
return 0;
}
fprintf(pPipe, "set terminal png\n");
fprintf(pPipe, "set output 'test.png'\n");
fprintf(pPipe, "plot cos(x)\n");
_pclose(pPipe);
return 0;
}非常に簡単だ。UNIX同様パイプを作成し、パイプにコマンドを入力する。この例だと、test.pngというファイルにcos(x)のグラフがPNG画像として保存される。ポイントは、gnuplotコマンドに -persistオプションを付けることである。
そういえば、気になっていたスタイルシートを修正しました。
April 23, 2011
gnuplotを使って実験ノートに貼りやすいグラフを印刷する方法
あくまでも個人用メモである。私は実験ノートにA4のノートを使っている。gnuplotでデータをプロットしてepsで印刷するといい感じのサイズに印刷できる。が、一つのグラフにA4用紙1枚で印刷されてしまい紙の面積の半分も使っていないので、これはもったいない。ということで psutil を総動員(?)して一枚に複数のグラフを印刷する。
まず、gnuplotで普通にプロットする。例えば、sinとcosをプロットしてepsで出力。あえてスクリプトにしているのは、後で論文に貼ったりする時とかに再利用したいのでプロットの過程を残しておくためである。Emacsのgnuplot-modeを使うと便利。
#!/usr/bin/gnuplot
set terminal postscript eps
set output 'sin.ps'
plot sin(x)
set output 'cos.ps'
plot cos(x)
次に、2つのファイルを1ページに結合して、out.psに保存。
$ psmerge sin.ps cos.ps | psnup -f -2 -s 1 > out.ps
最後のリダイレクトはパイプでlprに流したり、ps2pdfに流したりお好みで。
May 23, 2010
dpkg-buildpackageメモ
Debianパッケージの作成プロセスを自動化するコマンドであるdpkg-buildpackageのメモ。dpkg-buildpackageは以下の手順でパッケージを作成する。
- 環境変数の準備。dpkg-architectureでBuild archやHost arch等を設定し、またCCFLAGS、CXXFLAGS、LDFLAGS等を設定
- build-dependencyとbuild-conflictsのチェック。(-d でスキップ)
- debian/rule clean (-nc でスキップ)
- dpkg-source (-b, -B, -A のいずれかが設定されているとスキップ)
- -b, -B, -Aオプションによって以下のいずれかに分岐
- debian/rules build (デフォルトまたは-b)
- debian/rules binary-arch (-B)
- debian/rules binary-indep (-A)
- dscファイルを署名 (-us でスキップ)
- dpkg-genchanges でchangesファイルを生成
- changesファイルを署名 (-uc でスキップ)
- もしも-tcが指定されていたら、debian/rules clean
-j で、並列に動かすCPUの数を指定することができる。はしょったところもあるので、dpkg-buildpackage(1)を確認のこと。
February 16, 2010
Tera Stationをremoteからshutdownする方法
そんな必要がどこにあるのかといわれそうだが、今日届いたUPSが、運用中の古いTera Stationに対応していなかったのだ。なので停電のときくらいしかシャットダウンしないFreeBSDのホストに、Tera Stationを落とすrcスクリプトを書いた。
やったことは、Tera StationのWeb設定画面のHTMLを読んで、シャットダウンボタンを押した時のブラウザの要求をwgetで再現しているだけ。SERVERとADMIN_PASSWORDを変更すれば、普通に使えるだろう。試験したわけではないがLinuxでも動くはずだ。
#!/bin/sh
#
# rc script to shutdown Tera Station by knakao
#
#REQUIRE LOGIN
SERVER=fileserver #ファイルサーバーのホスト名
ADMIN_PASSWD=password #adminのパスワード
URL="http://$SERVER/cgi-bin/ts.cgi"
POST="page=maintenance&mode=shutdown&type=setup"
USER=admin
WGET=/usr/local/bin/wget
ts_down()
{
OPT="--http-user=$USER --http-password=$ADMIN_PASSWD --post-data=$POST"
OPT="$OPT -o /dev/null -q -T 5"
URL="$URL?$POST"
$WGET $OPT $URL
}
case $1 in
start)
;;
stop)
ts_down;
;;
esac
2009-02-17 追記
私はLinuxユーザなのでついwgetを使ってしまうが、FreeBSDな方々はcurlを使うのかな。ということで後日curlバージョンを。って必要ないか。
September 23, 2009
Linux BoxにTime Machineを使ってバックアップする方法 [UPDATE]
netatalk 2.0.5rc1で、Time Machineをサポートするようになったので、MacBook ProのディスクをTime Machineでバックアップするようにしてみた。
今回使用したLinux BoxのOSはLinuxで、Ubuntu 8.04LTSを使用した。ちなみにUbuntuのデスクトップ版は、ログインしたときしかネットワークに繋がないのでサーバ用途には使えない。迷わずServer Editionを使用のこと。必要なのはavahi-daemon とnetatalk。ただし2009年9月23日現在、Ubuntu、Debian共にTime Machineをサポートしているnetatalk 2.0.5rcはパッケージになっていないので、tarballからコンパイルする。まずはavahi-daemonとnetatalkのコンパイルに必要なパッケージをインストール
$ sudo aptitude install avahi-daemon cracklib2-dev fakeroot libssl-dev $ sudo apt-get build-dep netatalk
sourceforgeからnetatalk 2.0.5rc1をダウンロードして、make install。将来、パッケージ化されることを期待して、/opt/netatalk にインストールすることにする。
$ tar jxvf netatalk-2.0.5rc1.tar.bz2 $ cd netatalk-2.0.5rc $ ./configure --prefix=/opt/netatalk $ make $ sudo make install
まずはnetatalkの設定。/opt/netatalk/etc/netatalk/ にある、afpd.conf と AppleVolumes.default を編集する。afpd.confは、デフォルトのままでOKだったので、編集しないで良かった。ホームディレクトリにTimeMachineというディレクトリを作り、そこをTime Machine用のディレクトリとすることにすると、AppleVolumes.defaultは以下のようになる。
~/TimeMachine "Time Machine" options:usedots,upriv,tm
次にavahi-daemonの設定。/etc/avahi/services に、afpd.service というファイルを作り、以下の内容にする。
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>homefs</name> <service> <type>_afpovertcp._tcp</type> <port>548</port> </service> </service-group>
このファイルのname要素は、Finderに表示されるサーバー名になる。最後にafpd, と avahi-daemon を起動。の前に、afpd の rcスクリプトを書いておく。
2009-09-26 追記
HAT氏のコメントによると、rcスクリプトは自動生成されるようだ。デフォルトでは /etc/init.dにインストールされてしまう。まぁデフォルトでもよいのだが、最後まで/optにこだわることにする。ここで、--enable-debian のオプションを付けて configureを実行し、initscript のテンプレートが格納されているディレクトリに移動し、rcスクリプトを生成する。すなわち distrib/initscript に移動しmake する。HATさん、有用なコメントありがとうございました。
$ ./configure --prefix=/opt/netatalk --enable-debian $ cd distrib/initscripts $ make
生成されたrcスクリプト atalk を/opt/netatalk/etc/init.d にコピー
$ sudo mkdir -p /opt/netatalk/etc/init.d $ sudo cp atalk /opt/netatalk/etc/init.d
そして起動。
$ sudo /opt/netatalk/etc/init.d/netatalk start $ sudo /etc/init.d/avahi-daemon start
Mac 側でFinderを立ち上げ、[Command] + K を押しネットワークドライブをマウントする。アドレスは afp://サーバのホスト名。ユーザ名とパスワードで認証したら、Time Machineという共有ディレクトリが見えているはずだ。そして Mac で Time Machine を設定すればよい。
この記事は、HowTo: Make Ubuntu A Perfect Mac File Server And Time Machine Volume [Update6]、およびTime Machine with Netatalkを参考にした。
このファイルサーバのために、新たにAtom 330を使った小さいLinux Boxを新調した。1TBのディスク2台でRAID 1のアレイを構築。なんかえらい安かった。秋葉原のドスパラですべてのパーツを調達したら3万円ちょっとだった。普通にNASを買ってもそのくらいしそうだし、Mediatombを入れてメディアサーバにできたり、常時稼働するLinux BoxとしてIPv6だなんだで、いろいろごにょごにょできる。
そういえば一ヶ月ほど、記事を書いていなかった。この間、海外出張したり色々あったが、まぁ気が向いたらおいおい書いていくことにする。
December 22, 2008
ボイスレコーダで録音した音声をオーディオCDにする方法
ひょんなことで、ボイスレコーダで録音した音声をオーディオCDに焼く必要があったので、そのメモ。使用したボイスレコーダは、Olympus Voice-Trec DS-50。これはUSBでPCに接続するとUSBストレージに見えて WMAフォーマットで、録音した音声をファイルとして取り込む事ができる。 さてこれをどうやってオーディオCDにするか。まずWMAをWAVファイルに変換する。mplayerを使う。
% mplayer -ao pcm sound.wma
こうするとsound.wmaというファイルがWAVに変換されて、audiodump.wavというファイルに保存される。次にCDオーディオファイル形式に変換する。ここではsoxを使う。
% sox sound.wav sound.cdr
こうすると、sound.wavが、オーディオCD形式に変換され、sound.cdrというファイルに保存される。これをcdrecordで焼く。全てのトラックのcdrファイルを用意してrootになり、
# cdrecord -audio -dev=.... *.cdr
とやれば良い。-devオプションは、各自の環境で。おそらく
# cdrecord -dev=help
とやれば、-devオプションに必要な情報が得られるだろう。 私が使用したmacbook (OSX tiger)では
# cdrecord -audio -dev=IODVDSercices/0 -driveropts=burnfree *.cdr
だった。cdrecordはwavを喰わせてもよさそうなので、soxでCDR形式にする必要はないかもしれない。オーディオ用のデジタルレコーダならもっと簡単だろう。

