2010年11月16日火曜日

TeXで複数のAppendixを出力する方法

本のような長い文書の場合,章ごとに付録を付けたい場合があります.標準の TeX でこれを実行するのは面倒ですが,便利なスタイルファイルがあることを知ったのでメモしておきます.
必要なスタイルファイルは appendix.sty で


からパッケージをダウンロードできます.コンパイル済みではないので,texmf の配下にファイルを配置して
$ latex appendix.ins
$ mktexlsr
といったコマンドを実行する必要があります.

典型的な使い方は
\usepackage[titletoc,title]{appendix}
% :
\chapter{My Idea} % 1つめの章
% :
\section{Analysis}
% :

\begin{subappendices} % 1つめの章の付録
\section{Proofs}
% :
\end{subappendices} % ここまでが付録

\chapter{Other Idea}  % 次の章
% :

のようになり,この場合出力される文書・目次は
1 My Idea
   1.1 Analysis
   Appendix 1.A Proofs
2 Other Idea
のような構造になります.他にも
\begin{appendices}
% この中身は章・節の配下ではなく文書直下の付録になる(多分)
\end{appendices}
といった環境や,様々なオプションがあるので詳しくはパッケージについてくるドキュメントを参照してください.

2010年11月7日日曜日

MATLABでサイズを指定してイメージファイルを出力する方法

MATLABの図を画像ファイルとして出力する場合,デフォルトでは印刷時と同様に適当なサイズの画像が保存されます.

しかし,プレゼン用画像の作成などでサイズを1024×768といった特別な値にしたい場合がしばしばあります.毎回やりかたを忘れて苦労するので,ここに方法をメモしておきます.


figure の PaperPositionMode を auto に設定し,print コマンドで '-r0' を付けるのがポイントのようです.ファイルを出力する際に幅が1ピクセル増える現象が発生しますが,バグなのか仕様なのか常に再現するのかもよく調べていません.バージョンによって挙動が異なる可能性もありますので注意してください.

2010年10月26日火曜日

RenameSheet - Excelでファイル名一括変更

ファイル名を Excel のシート上で操作してリネームすることが出来ます.Excel のスプレッドシートなので
  • 連番を振る
  • 連番を逆にする
  • 作成日などをファイル名に加える
  • 作成した順に連番を振る
  • etc...
といった操作がいとも簡単にできることが特長です.下は連番の形式を変更している動画です.




次の動画はファイルの最終更新日を元にファイル名をリネームしている様子です.




このように高度な規則に基づいたリネームも Excel を使えば楽々です.

  • 逆再生動画の作成
  • デジカメ写真などの整理・連番化・日付によるラベリング

等で需要がある気がしたので一応ダウンロードできるようにしておきます.

このソフトは Excel 2010 のマクロ(VBA)で作ってあります.Excel でマクロを書くのは初めてなのでよくわかりませんが,他環境では動作しないかもしれません.
また,このソフトの使用によって生じた結果に関して一切の責任を負うことは出来ません.一応ファイルを操作するソフトなので,万全のバックアップ・テストを行い,自己責任でご利用ください.

反応できるかはわかりませんが,要望質問などがありましたらコメント欄かメールでお願いいたします.

2010年10月10日日曜日

こんなポータブルDVDドライブが欲しい

僕が参加する学会の資料はCD配布の場合が多いのですが,CDドライブがあるノートPCやポータブルCDドライブを用意するのは結構かさばります.CDドライブはCDのサイズより小さくならないのがよろしくないですね.

そこで,こんなポータブルDVDドライブがあったらいいなーというのを考えてみました.何かのはずみで材料が手に入ったら作りたいので,ここに記録しておきます.

こんな感じで回転中のメディアが露出してるドライブは,近未来な設定の漫画とかでは出てきますが,レーザーや回転部の危険があるせいか実際の製品では見ませんね.ミスでレーザーを見ないようにするカバーと,そこそこ安定した足は実用上必要なんじゃないかなぁ…

あと,絵では画力の関係で省略していますが,背面と側面の足は収納時にはゴミがヘッドに入るのを塞ぐような構造にすると良いと思います.

でもそのうち学会の配付資料もネット配布がメインになって,こんな悩みはなくなるんでしょうね.

2010年7月16日金曜日

MATLAB MEXでCUDAを使う

GPU 関連のプログラミングでは大抵、C言語+αを使ってプログラムを書くみたいですが、データの処理や結果の可視化は普段使っている MATLAB のほうが楽です。

そこで、 CUDA な MEXファイルを作って MATLAB で使う方法を試してみました。
結構簡単ですが、ハマるところがいくつかあったので記録を残しておきます。

現在僕が使っている環境は

  • Windows 7 (64bit)
  • MATLAB 2010a (64bit)
  • CUDA 3.1 (64bit)
  • Visual Studio 2008 Professional
なので、参考にするときは注意してください。以下順にハマったところを挙げていきます。


64bitのコンパイラをインストールする

これはCUDAに限りませんが、mexファイルのコンパイルにVisual C++を使う際、64bitの環境では64bit用のコンパイラをインストールしておく必要があります。VS2008では64bit用のコンパイラはデフォルトではインストールされません。また、Express Edition には64bit用のコンパイラが含まれていないようです。

最新版のMATLAB plug-in for CUDAを入手する

実は一番ハマったのがここです(笑)
このページで右側のフォームに住所氏名などなどを記入するとダウンロードできるのが最新版です。
こっちのページでダウンロードできるのは古いバージョンです。(古いMATLABだとこっちを使うべきなのかもしれません。)最初新しいバージョンは非公開と勘違いしていました・・・

ちなみに日本語版のサイトには新しいバージョンへのリンクすら存在してないようです。

nvmex.mを修正する

MATLAB plug-in for CUDA と一緒に入手できるガイドラインにも書いてありますが、使用環境に応じてnvmex.mを修正する必要があります。ぼくの環境では
Host_Compiler_Location = '-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"';
としました。ソースファイルで変更しろと書かれているのはここだけですが、実際にはあといくつか修正が必要で、下のほうの nvccCommandLine を作る部分で、インクルードファイルのパスを指定している部分にダブルクォーテーションが抜けてるバグがあります。Linux環境では問題が発生しなくて見逃したのでしょうか?あと、ついでにCUDAのサンプルでよく使われているcutilを使うためのヘッダファイルのパスも追加しておきます。
    ' -I"' matlabroot '\extern\include" ' ...
    ' -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\inc"'...
これに対応してリンカのオプションも mexCommandLine の作成の部分に追加しておきます。
mexCommandLine = ['mex (''' filename '.o' ''', ''' '-L' CUDA_LIB_Location ''', ''-LC:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\lib''' ', ''-lcudart'', ' '''-lcutil64'')'];
あと、cutilを使っているプログラムを実行する際には cutil64.dll をパスが通っている場所に置かなければならないので注意してください。


とりあえず、ここまでの修正でサンプルが動くところまではいけたはずですが、
何か思い出したことがあったらまた追記します。

2010年6月20日日曜日

英語プレゼン練習支援ツール

国際会議等で英語の発表をすることがしばしばあります.
僕は英語が苦手なので,毎回台本を作って練習していますが,発音をいちいち辞書引いて調べたり覚えたりするのが大変なので,自分用に英語プレゼンテーション練習支援ツールを作りました.
興味のある人は使ってみてください.

ppt2ipod


機能
  • PowerPoint のノート部分を Windows の音声合成機能で読み上げた wav ファイルを出力します.発音の参考になります.
  • PowerPoint のスライドを画像形式で出力します.iPodや携帯に入れておくと,どこでも発表の練習が出来ます.
  • ノート部分をテキストファイルに出力します.Mac で音声合成したい人向けです.

スクリーンショット



システムの必要用件


  • .NET Framework 4.0
    大半の人は未インストールのはずなので Microsoft のページからインストールしてください.「.NET Framework 4 Client Profile」が最低限必要です.
  • 英語がしゃべれる音声合成エンジン
    Windows 7 / Vista には標準で入ってました.XPは未確認ですが,7 / Vistaより流暢さで劣るものの入っているらしいです.
  • PowerPoint
    対象となるプレゼンテーションファイルを開けるPowerPointがインストールされている必要があります. PowerPoint 2007 / 2010 で動作確認しています.

ダウンロード
  • ppt2ipod.exe
    実行ファイルです.インストール不要なので,適当な場所に置いて実行してください.
  • test.ppt
    とりあえず試してみたいけど,台本付きの PowerPoint ファイルを作るのが面倒な人のために置いておきます.

その他コメント

  • 出力されたスライド画像とスピーチを iPod と同期しておくと電車や飛行機の中での練習・暗記に便利です.僕は iPod touch に入れてますが,スライド画像の表示が速いので不意に研究の説明を求められたときなんかにも便利です.
  • Mac の音声合成のほうが流暢な気がするので,Mac持ってる人はそっちで音声合成した方が良いとおもいます.その際に便利なテキストファイルもscriptフォルダに出力しています.
  • このソフトは無保証です.利用は自由ですが自己責任でお願いします.
  • ご意見・ご要望・質問などはこの記事にコメントしていただけると助かります.

2010年2月12日金曜日

小型で安価な回転角を検出する装置

ホビーでロボット系の工作をする際に,モーターの回転角や回転速度の検出が良く問題になると思います.RCサーボがこの手の工作で頻繁に使われている理由として,角度の検出部を自分で工作することが困難なことがあげられると思うのですがどうでしょう?

アナログ型光学式ロータリーエンコーダ


そこでここでは,アナログ型の光学式ロータリーエンコーダによって角度を検出する方法を提案してみます.通常光学式のロータリーエンコーダにおいては下の図のようなスリットを持った回転円板を用います.
このような円板は手作りすることが困難であり,高精度の物は高価になります.また,絶対値型のエンコーダはスリットやセンサーの数が多く,自作は非常に困難で大型になってしまいます.そこで,ここでは以下のようなグレースケールを持つ円板
を用いて,以下の図のように配置されたセンサーを用いることを考えます.


グレースケールを持つ円板はプリンタで簡単に作成できますし,センサの組み付け精度などもそれほど必要とされないのでこのような装置は比較的簡単に作成することが出来ます.

試作機

次に実際に試作品を作ってみた結果を示します.
円板はプリンタで印刷したもので,後ろの田宮の小型ギアボックスは回転軸の固定&テスト用です.


センサー部は適当に買ってきた反射型のフォトインタラプタを2個,回転軸について90度対称な位置に配置しただけです.


組み合わせると下の写真のような感じになります.


動作テストの様子です.


動画で使っている円板は黒い部分の半径を変化させてグラデーション円板の代用とした物です.透過型のフォトインタラプタを用いる場合やグレーが使えない場合に有用なのではないかと思います.
いい加減な工作ですが,それらしい波形が出ていることが確認できます.もう少し真面目に作れば,実用的な角度センサになるのではないでしょうか.

2010年2月8日月曜日

『英辞郎 on the WEB』整列・頻度集計

ALCが『英辞郎 on the WEB』整列・頻度集計というのを始めてたんですね.

実は昔,与えられた単語の前後に来る単語の統計を表示するアプリをこっそり作ってたりします.
画面はこんな感じ.

熟語だと

こちらはwikipedia英語版のデータを突っ込んでいます.
そこそこおもしろかったので公開しようかとも思ったのですが,
なにぶんデータが大きすぎて手頃なサーバーがなかったので公開するに至りませんでした.

需要がありそうならもう一度作って公開しようかなぁ・・・
結局置き場所が問題になるわけですが.

2010年2月6日土曜日

MATLAB が出力する図を PowerPoint 向けに自動調節

MATLAB で描いた図やグラフを PowerPoint に貼り付けるときに
一番簡単な方法はFigure のメニューから [編集]-[Figureのコピー] を使って
PowerPoint 上でペーストすることだと思います.

しかし, MATLAB がデフォルト設定で作成するグラフには
以下のような問題があります.

  • プレゼン用には字が小さい
  • グリッドが出ない
    • 無いよりある方が無難だと思うのだけど・・・
  • コピー&ペースト時にサイズが変わる
    • グリッドまで変えられるので意図しない結果になることが多いですね
  • 線が見にくい
    • 細い&プロジェクターで見辛い色が使われます

丁寧に設定すればこれらの問題を解決することは可能ですが,
そこそこ面倒ですし,ミーティングなどで MATLAB による実演を行う際に
これらを逐一設定するのはテンポを損ねます.

というわけで,これらの設定を自動化するプログラムを作りました.
このプログラムは MATLAB のデフォルト設定を書き換えて,
以降に描かれるグラフをプレゼン用に見やすくします.

いまのところ MATLAB を再起動する以外に元に戻す方法はありません.

ちなみに得られるグラフは以下のようになります.

使用前


使用後
コード
function [] = prettify_figure_presen()
%PRETTIFY_FIGURE_PRESEN グラフのフォントをプレゼン用に最適化
% この関数を呼び出すと
% 以降に描かれるプロットの見た目がプレゼン向けになります.
% 元に戻すにはMATLABを再起動するしかないです.
%
% ※ ボード線図は別口(prettify_bodeplot_presen参照)
%    なので注意してください.


%% フォント
set(0,'defaultAxesFontSize',20);
set(0,'defaultAxesFontName','メイリオ');
set(0,'defaultAxesFontWeight','demi'); % normal/demi/bold
set(0,'defaultTextFontSize',20);
set(0,'defaultTextFontName','メイリオ');
set(0,'defaultTextFontWeight','demi');

%% 線の幅
set(0,'defaultAxesLineWidth', 1.5); % 軸
set(0,'defaultLineLineWidth', 2); % プロット

%% プロットの色
clorder = ...
    [  0,   0, 255; % 青
       0, 128,   0; % 緑
     255,   0,   0; % 赤
     204,   8, 204; % 紫
     222, 125,   0; % 茶
       0,  51, 153; % 紺 (青と区別しづらい,注意!)
      64,  64,  64];% 濃い灰色  
set(0,'defaultAxesColorOrder',clorder/255);

%% 最初からgrid on & box on
set(0,'DefaultAxesXGrid','on');
set(0,'DefaultAxesYGrid','on');
set(0,'DefaultAxesBox','on');

%% コピペ時にサイズを変更しない
set(0,'DefaultFigurePaperPositionMode','auto');

end

2010/2/17 追記
17行目の間違いを修正しました&reset(0)で設定を初期化できるそうです.
atsu-kan さんありがとうございます.

2010年1月27日水曜日

SyntaxHighlighter に貼り付けるコードのエスケープ

このブログでは SyntaxHighlighter を使ってソースコードを表示していますが,コードを<pre>タグの中に描くときに '<' や '>' などを&gt; &lt; などにエスケープする必要があります.

これを手でやると面倒なのでスクリプトを書いてみました.
http://maru.bonyari.jp/code2html/code2html.html
処理はブラウザの JavaScript で処理されるので prototype.js があれば
ローカルに保存しても使えます.

MATLAB で半透明の plot を作る

データが大量にあって,グラフ上で密度を表現したい場合などで
MATLAB で半透明の線を書きたいことがたまにあります.

なぜかMATLABのplotで生成される線は半透明をサポートしていないので
半透明をサポートしているpatchで線を描く関数を作ってみました.

function [ p ] = pplot(x,y,z)
%PPLOT Draw line as patch

if nargin==2
    z=0;
end

x=reshape(x,[],1);
y=reshape(y,[],1);

p=patch([x;flipud(x)],[y;flipud(y)],z*ones(2*size(x,1),1),'b');

end

使うときは以下のように使います.
x=0:1e-2:pi/2;
clf
hold on
for k=linspace(0,1,25)
    p=pplot(x,(1-k)*sin(x));
    set(p,'EdgeAlpha',0.1);
    set(p,'EdgeColor','b');
    set(p,'LineWidth',2);
    p=pplot(x,k*cos(x));
    set(p,'EdgeAlpha',0.1);
    set(p,'EdgeColor','r');
    set(p,'LineWidth',2);
end
得られる結果はこんな感じ
このように,半透明の線を描くことができ,線が集中している部分は濃い色で表示されます.
ただし,複雑な線を大量にプロットするとすごく遅いので注意してください.