Archive of posts with tag 'Programming'
GROWTH実験で使用するFPGA/高速ADCボードと制御・読み出し用のDAQソフトウエアは、高エネルギー実験でよく使われるCERN/ROOTのROOTファイル形式で波形データを書き出す機能があるのですが、動作試験ができていなかったのでいくつかバグがありました。
Amazon Dash Buttonを汎用のIoTボタンとして使っている例がどんどん出てきている中、1週遅れの感じがしますが、ESP8266 + Arduino IDEの組み合わせが劇的に簡単だったので、IFTTTのGoogle Spreadsheet連携を使って、ライフロギング用のIoTボタンを作ってみました。
雷雲ガンマ線プロジェクト(GROWTH / Thundercloud Project)で開発したGROWTH FPGA/高速ADCボードに関する記事の第四回です。
もう最近ではぜんぜんSpaceWireを使っていませんが、コンピュータの中なら出てきたので、C++11に書き直してgistにあげておきました。C++11だと、{}を使ったUniversal Initiaizationが使えるので、パケットのバイト列を入れたstd::vectorを初期化するのも楽ですね。(昔はpush_backをずらずら書いていた、、、)
左がGROWTH実験用のFPGAボード。右がRaspberry Pi3。
matplotlibのテンプレートにつづいて、numpyでFFTするときのテンプレートです。1.5 MHzのsin関数を5.8MHz 4ビット分解能のADCで5000点サンプルしたときの結果です。np.fft.fftfreq()関数で周波数軸も求められるので、Hzで表示しています。
先日のmbed nucleoでの128×64ピクセルOLEの駆動試験に続き、今年の冬の雷雲ガンマ線観測で使用するRaspberry Pi 3でも128×64ピクセルのOLED(Alibabaの販売サイト/Adafruitの販売サイト)をI2Cインタフェース経由で駆動してみました。画面そのものは小さいですが、16x2行のディスプレイよりも少ないインタフェース線数で、より多くの情報を表示することができます。みなさんも自分の電子工作で使ってみては。
1000ノット以上のデータを補完しようとしてメモリ不足になる場合は、numpyのinterp1dではなく、scipy.interpolate.InterpolatedUnivariateSpline(x,y,k)を使いましょう。
新しいサーバへ移動しました
東京大学のサーバが不釣になって見られなくなっていたHongoWikiを、自前のサーバに移動して再開しました。新しいアドレスは以下のとおりです。そのうち、Googleの検索ランクも戻ってくると思います。あと、Mediawiki→Jekyllの変更にともない、コメント管理サービスDisqusを使ってコメント欄も付けているので、質問や改善のコメントがある人は気軽に書き込んでください。
flowchart.jsを使うと、テキストで指定したノードの形状やテキストラベル、ノード同士の接続をテキスト形式で記述すると、きれいなフローチャートが自動的に作図されます。VisioやPowerPointを使った煩雑な作図作業から解放されましょう。gistにサンプルを掲載してみました。
テキスト形式でフローチャートを作図する例 - flowchart.js
STMicroelectronicsのARM系マイコン「STM32」を搭載したmbed対応のボード「Nucleo」シリーズが便利です。arduino互換IOと追加のIOポートがついた20〜80MHzのARMコアが搭載されたボードが1枚1500円くらいという手頃な値段で販売されています。
Soki Sakuraiさんのruby-dimensionalを使うと、Rubyで単位付きの計算がとても綺麗にできます。
ROOTのTGraphでデータ列を保持していて、そのスプライン補間関数(cubic splineならTSpline3)を構築したいときは、以下のようにTSpline3::TSpline3(const char* name, const TGraph* g, …)というコンストラクタを使用しましょう。
最近Seleniumにハマっています。以下のようにするとスクリーンショットも撮影できてしまいます。
プログラムのソースコードや衛星プロジェクトのコンフィグレーション管理にgitを使い始めようと思っている研究者の方は、コマンドラインで以下のコマンドを実行してgitの初期設定をしましょう。 まず、最新版がインストールできていない人は、Homebrewで
1
brew install git
としてインストールしましょう。
RubyROOTでヒストグラムをDraw()すると、.rootmacros内でgROOT->SetOptStat(0)していても効かずに、図の右上に統計情報が表示されることがあります。見栄えの問題でこの統計情報を消したい場合は、以下のようにしてください。
天体データ解析や人工衛星の試験のデータを可視化する際に、最近はやりのvisuallization framework d3.jsが使えるといいなと前々から思っていたのですが、なかなか勉強できていませんでした。せっかく買った日本語の解説本はあまりにヒドいクオリティだったので、Oreillyの半額セールで購入した以下の本で勉強し直しました。
cfitsioを用いたFITSファイルを生成するプログラムを書いているときに混乱したので、メモしておきます。
最近あまり情報についていけていませんでしたが、ROOTのメジャーアップデート版であるVersion 6のベータ版が2013年12月に公開されていたようですね。
何と言ってもVersion 5系からの一番の違いは、CINTからLLVM/clangベースのClingへとC++インタプリタが置き換えられたことですね。CINTも、それが最初に作られた時代のことを考えるとひじょうにすぐれた仕組みでしたが、LLVMの登場とC++1x系のサポートを考慮していよいよ移行となり、感慨深いです。
すでにROOTのgitレポジトリのmasterはVersion6系に切り替わっているとのことで、gitで以下のようにcloneすると取得できます。
` git clone http://root.cern.ch/git/root.git `
XSPECでデフォルトで使われているプロッティングライブラリ「QDP」で、表示中の生データを保存する際、wdataコマンドを使います。この結果生成されるファイルをgnuplotやROOT等でプロットしたいと思うと、先頭にあるヘッダ部分を削除しないといけません。8年間sedを使ってきましたが、複数行の削除ができると今日知りました。これを使えば、QDPデータファイルをgnuplot-readableなファイルに変換するのも一発です!
BibDeskを使って論文の管理をします。TeXで論文を書くときに、bibliographyを自動で作成できるので便利です。マニュアル(手作業)でのbibliographyの作成は人生の無駄なので絶対に何かのソフトウエアを利用しましょう(BibDeskに限らず、Sante等いろいろなソフトがあるので、使い勝手や趣味でどれにするか決めましょう)。 BibDesk [browser-shot url="http://bibdesk.sourceforge.net" width="450"] Sante [browser-shot url="http://www.thirdstreetsoftware.com/site/SenteForMac.html" width="450"] ADSから論文のBibtex情報をとりこんでエントリを作成する 1. ADSで目的の論文のページを検索&表示し、下の方にある「Bibtex entry for this abstract」をクリックする。 2. Bibtexの情報が表示されるので、Command+A → Command+Cで全て選択してコピー。 3. BibDeskのウインドウで、論文情報がリスト表示されているところをクリックしておき(どの論文が選ばれていても上書きされるわけではないので問題ありません)、Command+VでコピーしてあったBibtex情報を貼付ける。すると、自動的にそのBibtex情報がパースされて、新規エントリが作成される。 4. あとは、citekeyを自分のnotationにあわせて変更するため、Returnキーを押して詳細情報のページを表示。論文PDFをサイドバーにドラッグ&ドロップすればPDFへのリンクを登録しておけます。 TexのBibliographyを自動作成する 1. BibDeskでSave As等すると、.bib形式のファイルが書き出せるので、それをTeX側で読み込ませます。たとえば、bibtex_library.bblとして保存した場合、Texのソース内で、以下のようにしておきます。 \bibliographystyle{mn2e} ←ここは論文ジャーナル側から提供スタイルファイルを読み込ませる...
自分でドキュメントを書くときの記法をkramdownに統一しようと考えています(MediaWikiに慣れていますが、表やcross referenceが大変なので、そろそろ潮時かと思っています。Yamadaくんのオススメでrestructured textも考えましたが、syntaxが不自然なのでぼくは受け入れられませんでした)
インストール
Homebrewで簡単にインストールできます。kramdownという実行形式がインストールされるので、これにMarkdown形式のテキストファイルを与えて実行するとHTMLテキストが出力されます。
1
brew install kramdown
AStyleFormatterプラグインを使うと、Sublime TextでC++/C言語、Java等のコードを整形できるようになります。
インストール
PackageControlでインストールできます。「Shift+Command+P→Install→Astyleと入力してReturn」でインストールできるはずです。
使い方
C++やCのソースを開いた状態で「Contol+Option+F」で整形が実行できます。
Javaスタイルに設定変更
ぼくはJavaから入ったので、ANSI/K&Rスタイルは気持ちがよくありません。とくに{}の位置がifやforの次の行に来るのは行数の無駄なので、Java-styleに設定変更します。
Two-in-oneで印刷された文書をスキャナで取り込んだとき、偶数と奇数のページの回転が正しくなく、それぞれ+90°と-90°に回転してマージする必要が生じました。PDFtkを使えば以下のように、偶数ページと奇数ページを別々に回転処理してからマージできます。
回転は、oddやevenの後に付いているR(時計回り90°回転)やL(半時計回り90°回転)で指定しています。
マージには、pdftkのshuffleコマンドを使います。ファイルAとファイルBを指定し、shuffle A Bとすると、「Aから1枚、Bから1枚、Aから1枚、Bから1枚、、、、」という結合処理をして、outputで指定したファイルに結果を書き出してくれます。
いやー、便利!
1
2
3
pdftk Document.pdf cat oddR output Document_odd.pdf
pdftk Document.pdf cat evenL output Document_even.pdf
pdftk A=Document_odd.pdf B=Document_even.pdf shuffle A B output Document_rotated.pdf
この投稿の内容は「cfitsioで16-bit unsigned integerを扱う例」のエントリでより詳しく解説していますので、参照ください。
Rubyのヒアドキュメントは高機能(ruedapさん)という エントリで、Rubyのヒアドキュメントにおいて、終了ラベルのインデントを無視するオプションが紹介されていました(<<EOSではなく、<<-EOSのように、開始ラベルの先頭にマイナスを付ける)。知らなかった、、、。天体のデータ解析スクリプトをRubyでメタ的に生成する際にヒアドキュメントを多用する場面があるのですが、これが使えるとややソースコードが見やすくなりますね。
1
2
3
4
5
6
7
for i in 0...3 do
puts <<-EOS
ABC
DEF
GHI
EOS
end
FITSファイルのヘッダキーワードのなかには、階層構造を表すためにHIERARCHという接頭辞がついているものがあります。たとえば、APECのデータファイルのHIERARCH INUM_DENSITIESなど。
ぼくが作成した(一部かかわった)ライブラリなどをMac/Linuxで簡単にインストールできるように、パッケージマネージャ「Homebrew」で使えるtap(プライグインレポジトリのようなもの)をgithubで公開しました。これで、コマンドライン一行で次のようなライブラリを簡単にインストールできます。(tap名はいま参加しているプロジェクトの名称です)
1. tapを取り込む
以下を一度だけ実行してください。
` brew tap yuasatakayuki/hxisgd `
EclipseのC/C++開発環境CDTをMacで使っていると、「カーソル位置から最下行まで選択」や「カーソル位置から最初の行まで選択」をShift+Command+↓やShift+Command+↑で挑戦すると、「次のメンバ(メソッド、メンバ変数)の定義場所へ移動」になってしまいます。
egrepコマンドに-oオプションを渡すと、正規表現にマッチした部分のみ抜き出す事ができます。たとえばファイル名に書いたexposureを、後段のスクリプトで取り出すときに便利です。
cmakeで外部コマンドを実行するだけのmakeターゲットを生成したいときは、ADD_CUSTOM_TARGETを使いますが、複数行にわたってコマンドを列挙しても正しく実行されません(ぜんぶ連結されてしまう)。2行目以降は、コマンドの先頭にCOMMANDという区切り文字を入れる必要があります。