忍者ブログ
日々の研究生活のメモ書きなど
勢いでblogを作成してしまいました。

扱うテーマについては、C言語(たまーにc++も)、gnuplot、Debian、Macなどです
(これから他のジャンルに手を出していく可能性もあります)
メモ書き程度のものですが、同じことで悩んでいる方の役に立てれば幸いです

本業は学生で、物理屋を目指しています

「bus error」「segmentation fault」で来られた方にはとてもイラっとするブログタイトルで申し訳ありません
bus error はファイルの入出力関連
segmentation fault は配列のindexまわりのエラーである可能性があるので、そこらへんをチェックしてください

last modified 2015/11/6


PR
まずはデータ生成
これもawkでやってしまおう
awk 'BEGIN{fs=10.0;for (i = 0; i < 10000; i++){t=i/fs; print t, sin(2*3.14*t*10)}}' > hoge.txt

# もっと桁数が欲しい場合は
# ちなみに後述のawkコマンドを走らせてきちんと結果を得るためには桁数が必要なので、こっちで
awk 'BEGIN{fs=10.0;for (i = 0; i < 10000; i++){t=i/fs; printf "%.10e %.10e\n", t, sin(2*3.14*t*10)}}' > hoge.txt
データ



このデータの最大値を求めるには
awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' hoge.txt
最小値は、
awk 'NR==1 {min=$1} {if($1 < min) min = $1} END {print min}' hoge.txt
極大値、極小値を求めるには
awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0)print $1}' hoge.txt > foo.txt
これらを重ねてプロットしてみる
plot "hoge.txt" w l lw 2 lc 6, "foo.txt" w p pt 5 ps 2 lc 7
sin
赤い時刻が極大値または極小値
もしそれらをバラバラに知りたかったら

awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0 && diff1>0)print $1, 1}' hoge.txt > maximum.txt
awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0 && diff1 <0) print $1,-1 }' hoge.txt > minimum.txt
でおk

プロットは
plot "hoge.txt" w l lw 2 lc 6, "maximum.txt" w p pt 5 ps 2 lc 7, "minimum.txt" w p pt 5 ps 2 lc 4

sin

(本当はNR==1のときにdiff2=0ってした方がいい気がするけどまぁいいや・・・)












タイトルがその2になってるのはその1の記事があるから↓

■ 参考 : 【TeX】複数行コメントアウトしたい


まさかの2012年の記事である・・・4年前やぞ・・・・
泣ける・・・




この4年間複数行コメントアウトを使うときは基本的に
\if0
ここコメントアウトされる
\fi
を使ってきた
数行のときは%を手で入力しまくるということもしてきたけど、
実はTeXShopには・・・失礼しました、TeXShop様にはもっといいショートカットキーがあった・・・



texshop

command+{ : 選択範囲をコメントアウト
command+} : 選択範囲のコメントを外す

(emacsでいったらM+;ですな)

あなたが神か
たぶん自分、TeXShopのこと全然使いこなせてないわ・・・









GSLをインストールすると、一緒にgsl-histogramというコマンドもインストールされる

■ 使い方 :
Usage: gsl-histogram xmin xmax [n]
Computes a histogram of the data on stdin using n bins from xmin to xmax.
If n is unspecified then bins of integer width are used.
要するに
gsl-histogram 0 100 50
で0から100の間を50ビンで区切ってヒストグラムを計算してくれる

もしデータが1列じゃないが、3列目のみのヒストグラムを書きたい場合はawkを使って
awk '{print $3}' | gsl-histogram 0 100 50
とかでおk





実例を示すためにサンプルデータを作る
# データ作り
%gsl-randist 0 10 rayleigh 2 > hoge.txt

# データの中身はこれ
% cat hoge.txt
0.0454563
3.81005
3.17951
0.65875
3.42053
2.40609
0.589601
1.53702
2.2201
1.55221

# この行でヒストグラムを取っている、0~5を5ビンで分ける
% awk '{print $1}' hoge.txt | gsl-histogram 0 5 5 > hist.txt

# ヒストグラムの中身、1列目がビンの左端の点、2列目がビンの右端の点、3列目がそのビンに入っているサンプル数
# echo 1 | gsl-histogram 0 2 2 とかで確認できる
% cat hist.txt
0 1 3
1 2 2
2 3 2
3 4 3
4 5 0



gnuplotを使ってプロットしてみる
# with boxesで描いてみる
# with boxesは省略不能
plot [-1:5][0:4] "hist.txt" u 1:3 with boxes
1
または
# with stepsで描いてみる
# with stと省略可能
plot [-1:5][0:4] "hist.txt" u 1:3 with st
2
この二つを見比べるとboxesは全体を線で囲って箱にしているのに対して、stepsではそれに沿ってステップ関数を描いているだけ(というかまさに名前がそうなんだけど・・・)

問題はヒストグラムは0から5までなのにboxesの方は-0.5から値があるように描かれていること
理想的にはx=0~1の範囲が3、x=1~2の範囲が2、x=2~3の範囲が2、x=3~4の範囲が3、x=4~5の範囲が0のステップ関数になっていて欲しいので、この場合はstepsの方が求めているものに近い
ただ左端と右端(今回は0だからわからないけど)の挙動がなんか思ってるのと違う・・・
そこも縦棒を描いてほしいんだが・・・


しょうがないのでwith boxesの方にオプションを追加してみる
plot [-1:5][0:4] "hist.txt" u ($1-0.5):3 with boxes fs solid 0.25 lc 6 lw 3
3
他にも
plot [-1:5][0:4] "hist.txt" u ($1-0.5):3 with boxes fill pattern 4 lc 6
4
とかもできる

どういうパターンがあるかは
set term pnt
set output "hoge.png"
test
で確認できる

hoge
■ 参考 : gnuplot demo script: fillstyle.dem

■ 参考 : Boxes



同じような塗りつぶしはwith stepsでもできる(最初こっちでやっていて、両端がなんか気に入らなかったので使用をやめた)
plot [-1:5][0:4] "hist.txt" u 1:3 with fillsteps fs solid 0.25 noborder ls 7, "" u 1:3 with steps ls 7 lw 3
5
やっぱり左端(見えないけど右端も)の扱いがなんか嫌・・・
なので今回はwith boxesのほうを使う

■ 参考 : filling under step functions in gnuplot






まったく関係ないけど、with histepsというのもある(hiは何の略だろう?)
これをwith stepsの代わりに使うとboxesみたいに半ビンだけ左にずれる
plot [-1:5][0:4] "hist.txt" u 1:3 with fillsteps fs solid 0.25 noborder ls 7, "" u 1:3 with histeps ls 7 lw 3
6




(2016/11/30 追記)
一応上記のwith boxes+囲い線のオプションを使えばこんな感じのグラフも作れる
画像検索でのHIT狙いで追記してみた(スクショだからちょっと線の太さが違う)

ヒストグラム











最近、ノイズレスサーチの検索ページからアクセスがあって驚いた・・・

具体的にはここから↓
■ ノイズレスサーチ - パソ活ラボ


他にはduckduckgoとか聞いたことがある
■ duckduckgo

一応、duckducogoからは「gnuplot 世界地図」「ポケモンGO 外付けGPS」「TEX 章 途中」「グラフ塗りつぶし gnuplot」とかで引っかかるっぽい
(だからどうしたって感じだけど・・・)


(2016/11/27 追記)
「フレンチクルーラー 絵 書き方」
「sshでログインできるけどscpできない」
「インド ロストバゲージ」
「CMerTV ブロック」
とかでもヒットするっぽい





データを読み込んで、ある列とある列を掛算して、ファクターかけたりするのに、
わざわざコンパイルするほどのことでもないかなぁ〜と思って最近はawkを使うことがよくある

たぶんコンパイルした方が実行速度も早いけど、コードを書いて、makefileを用意して、さらにそれらをぶん回すシェルスクリプトを書くなら
最初からシェルスクリプトでawkを1行書いた方が早く終わりそう・・・・

もちろんシェルスクリプトに書かずにawk用のスクリプトを用意して
awk -f hoge.awk
とかで食わせるのもありだと思う・・・
たぶんそうする利点は、awkファイル特有のインデントなどをきちんと使えるとか?知らんけど




話をタイトルに戻して、
awkで累乗の計算は
2**2
とかでいいらしい
gnuplotと同じ方式だ・・・
ハット(^)を使うことはないだろうと思ってたが、powでもなくて**だったとは・・・





if文は本当にC言語とまんま同じ書き方でOK
あとは省略







そういえば・・・と思い立って調べてみた
シェルスクリプトで自作関数を定義して、それを何度も呼び出すことでコードの省略化が計れる


実際に書き方を調べてみたら、本当に簡単で、なおかつその効果は絶大・・・
もっと早くに出逢っていれば・・・・




■ 関数定義の仕方
#!/bin/sh
function hoge() {

# something

}

hogeは関数名なので、何か適当に置き換える
C言語の型変数みたいにfunctionと付いているのは関数定義のルールらしい
が、別に省略してもいいらしい

あと関数名の後の()は忘れがちなので注意

どういう引数が必要かは特に書く必要はない
引数の引用時には関数の中で
#!/bin/sh
function hoge() {

argv1=$1
argv2=$2

# something

}

# これは関数を呼び出しているところ
hoge rapu kabi

みたいにして、$1, $2と関数の引数を使用する
(シェルスクリプトの引数と同様、ということは$#や$@、$*などの変数もあるのか? いや、別に使わんからいいけど・・・)
(調べてみたらあるらしい)
関数を呼び出すときは()は不要

返り値も使用できるらしいけど、基本的にそういう凝った使い方をシェルスクリプトではしないので省略
基本的にプロットをfor i in `ls *.txt`とかで回したりするくらいなので・・・


あと実際に関数を書いてみて気づいたけど、
たぶん関数宣言と関数呼び出しの順番は、先に関数宣言をされていないとダメっぽい
(シェルスクリプトって上から順番に実行していくだけなのでそりゃあそうだと思うけど、そのことについて書かれてなかったのでちょっとハマった)












昨日、TOEICを初めて受験してきた

ことの発端は某所の最終面接で尊敬する方に
「今時英語喋るのは当たり前っしょ どれくらい話せるのかわからんからTOEICくらい受けといた方がいいよ」
とありがたいお言葉をいただいたからである
普通なら「あ〜まぁ時間あればやりますわ〜」って感じだけど、その方のお言葉だったので早速大学の生協で申し込んだ

受験料は大学からだったので4400円くらい
結果も2週間くらいで帰ってくるので素晴らしい




英語の試験なんて英検を高校のときに受けたっきりなので、若干wktk
普段、英語の勉強なんてやっていないし、初めてなので現状を知るという意味で特に何の対策本なども読まずに突撃

一応、ネットでどういう問題が出るのかというのは調べていった
注意するべきこととしては
* 腕時計で時間管理しないと絶対に間に合わない
* 解答用紙にも問題用紙にも落書きをしてはいけない
ということくらいか

前者は腕に何かを付けるといろんな場所にカチャカチャ当たって嫌なのでそもそも腕時計持ってない・・・・・
直前に100円均一を覗いてみたけど、腕時計はなかった(そりゃあそうか・・?)

後者はカンニング行為として見なされるらしい




試験の内容としてはリスニングが100問、リーディングが100問って感じ
全体を通して、完全に合ってると確信できた問題は40問くらいしかなかった
最後のリーディングの20~30問くらいは時間がなくて適当に書かざるをえなかった

後半のリーディングの問題は5~30行くらいのいろんな書類やメールを読んで、内容と一致している答えを選ぶような問題だった
割と頭を使う問題もあって、センター試験の国語の問題のうち簡単なものを英語でやっているような感じだった
あとはメールやいろんなポスターやら書類やらがすべて英語文化で書かれているので、そういうのに慣れてないといけないっぽい
一応英語メールは書くことがあるので、メールに関してはできた気がするけど、新聞記事を読む問題はほんと苦しかなかった

どうでもいいけど、英語メールの問題で
「うちに応募してくれてありがとう。あなたは素晴らしい人材だからぜひうちのインタビューを受けてほしい 具体的にはxxxさんにコンタクトしてね」
みたいなメールの返信が来てて笑ったw
インタビューってのは大学とかのパーマネント(や任期付も?)の職に応募した人の最終面接みたいなもので、その大学のスタッフの前で自分の研究についてプレゼンをするというものらしい
よく見てるブログ(そのブログはもう更新されてないから"見てた"だけど)で、そういうのを受けていた人が記事にしてて見聞きしてて助かった・・・

あとリーディング問題の前半はセンター試験でもあるような1単語の穴埋め問題で
正直そこに時間をかけすぎた・・・
もし配点が問題毎に違うなら、たぶん違うと思うけど、そこの配点は低いはずだから後半のリーディングにもっと時間をかけて稼いだ方が良かった気がする
単語穴埋め問題は
 1. 時制や複数形か
 2. 単語を知ってるか知ってないか
 3. 特殊な用例
を判定する問題な感じがしたので、1以外はわからなかったら全部Aとか決めてさくっとやってしまう方が良さそう・・・・




あとリスニングに関しては、少なくとも研究室に入る前よりかは聞き取り能力は向上してるはずだけど、まったくできなかったと言っていいだろう・・・
100問中、絶対に合ってるのは10問くらい?
かなりさくさくと進んでいく+一度しか聞けないので聞き逃したら終わり
「1回の英語を聞き逃したらビジネスチャンスを逃してしまうよ」ということを伝えたいのかもしれない(知らんけど)

あと英語を話す人には男性/女性いるけど、基本的に女性の英語はかなり理解できた気がする
男性の方がほとんど何言ってるのか分からんかった気もする
抑揚の付け方の問題?

あと訛ってる英語の問題がなかったのが救いだった(特にインド人)
「世の中の自分は英語聞き取れるっす」って人にぜひインド人の英語を聞いてほしい・・・
まーじでむずかしいから・・・・




また来年、リベンジするかもしれない
今回はたぶん400点あれば良い方がかなぁ〜って感じだった
(ここ最近全然寝てないし!!という言い訳をしておく・・・・)














数ヶ月間、ことあるごとに「アップデートがあります、OSを上げてください」って通知が出てその度に「また今度」を選んでたが
ついに寝ぼけていて、いいえを押したつもりが「はい」を押してしまった・・・・

すぐにiPod touchの電源を切ろうとしたが時すでに遅し・・・

白黒の背景でシークバーが溜まって行く画面に移行してもう何もできない・・・
15分くらいしたら綺麗なiOS10がインストールされていた

まぁしょうがないか・・・と思って使い続けようと思ったけど、スリープ画面からホーム画面に行く方法がわからない・・・

「あれ・・・スライドするんじゃないの?」

調べてみたら、ホームボタンを押し込む方式に変わっていた・・・
iPhone 7とかのホームボタンなら、押し込みじゃなくて、触るだけでスリープ解除できたり
画面を手前に倒すだけでスリープ解除できたりするらしいけど


スレッガー中尉「悲しいけどこれiPod touchなのよね・・・」
hqdefault

(設定見たけど変えれなかった)





しょうがないので母艦と接続してバックアップからiOS9に戻すか・・・
と思ってあれこれ調べてみた

OSのアップデートがすでにされている
= iOS9にするためには古いのにファームウェアを戻す必要がある
= ファームウェアをダウンロードしてきて、iPodをリカバリーモードにして、iTunesからファームウェアファイルを使って復元をする必要がある
という流れらしい
(ファームウェアが何かは知らぬ)

■ 参考 : iOSのダウングレード iOS10からiOS9に戻してみた

ひとまずファームウェアを落としに行くか・・・・

■ 参考 : IPSW Downloads

なんかダメっぽい。

ファームウエアだめ
This firmware is not signed. This means you cannot restore to it in iTunes.
「これ使ってもiTunesからは復旧できないよ」と書いてあるような・・・・

「iOS9?」

ないよ

\(^o^)/オワタ





方向を変えて、iOS10を今後も使うとしてアプリや曲のデータの復旧をしないと・・・・
(実はバックアップからすぐに戻せると思って最速でデータを全部リセットしてしまった)

今にして思うと、アフォの極みである。

ちなみにリセットした後で、起動したiPod touchがiOS10だったときにすべてを悟ってかなり冷や汗が出た



バックアップから復元をしようと思って、母艦のMacとケーブルで接続しても認識しない
iOS10なので、iTunesもそれにともなっってアップデートしないといけないらしい

appstoreからアップデートしようにも、エラーが出て進まない・・・・(写真撮り忘れた)
再起動してもうんともすんとも言わない
エラーメッセージでググっても変な中国語のページが出るだけ・・・


しょうがないので、もう一台のyosemite Macを出してきてやっとiTunesのアップデートが終わった
次は、外付けHDDで取ってあるバックアップの状態に復元する

これはiTunesを起動して「手動でバックアップ/復元」の「バックアップを復元...」を選べばそれで万事OKっぽい
あとは20分ほど待機


待機中
碇司令
なんとか現状復帰はできた・・・・・







今回の件については寝ぼけていて、アップデートをしてしまったのがすべての発端で
その後の初動もかなりまずかったので無駄なことをしてしまった(楽しいけど、冷や汗がやばかった)

airもtouchもコンパクトなのに色々とできて便利だから使ってきたけど、アップデートが来るたびに色々とめんどくさいし、おそらく今後appleからはMac book airもiPod touchも今後は発売されないと思うのでどこから鞍替えしないといけない
もし、androidでもappleでもない新しいデバイスが出てきたら、勇気を出して乗り換えてみるのもありかなと最近思っている・・・
airも同様

たぶん両者に不満を持っている人は少なからずいると思うので、第三勢力が出てきたら徐々にユーザーが移行して、盛り上がって行くと思う
できればiOSの脱獄みたいにユーザーが独自開発したものも使えるような環境になっていると面白いと思うんだけどなぁ〜

自分がiPod touchに望むことは基本的に音楽を聞けて、写真が撮影できればそれで十分なんだけどね・・・
最初にiPod classicからiPod touchに乗り換えた理由がその二つだったので

後は撮影した写真をDropboxとかまたはMacの純正アプリでパソコンの方に気軽に転送できたらなお良い
音楽プレイヤーとしての機能はプレイリストの中をランダム再生とかそれだけでいいんだけどねぇ〜









printf("%%\n");
でOK

\%でできるかな〜と思ったけどダメだった









■ 過去記事 : 【git】ひとつ前の状態に戻りたい git reset --soft HEAD^

と少し関係がある
git reset --soft HEAD^
で一つ前のコミットをする直前に戻ったとして、その中で
git rm hoge.c
としていた場合、この操作を取り消してコミットを分割とかしたいのにそもそも
git checkout hoge.c
ができない・・・・


そういうときは
git reset HEAD hoge.c
git checkout hoge.c
でOK





git reset --soft HEAD^
で今、修正している他のソースコードはそのままにしてコミットだけを取り消すことができる

例えばhoge.cを修正して
git add hoge.c
git commit -m "Added hoge.c"
という状態で
git reset --soft HEAD^
すると、
hoge.cがまだcommitされていない状態に戻る


--softの代わりに、--hard もあるけどそちらはhoge.cの修正が完全になかったことになるので、
おそらくそちらを使いたい人はあまりいないはず









何がやりたいかというとこういうグラフが書きたい

multiplot

左下がメインの図で、2つのデータの散布図
左上が散布図のx方向のデータのヒストグラム、右下が散布図のy軸方向のデータのヒストグラム
おまけで平均値まで付けてみた(awkさん、ありがとう)

普通にgnuplotのmultiplotで2x2の分割を使っていると左上→右上→左下→右下という順番でグラフが埋まっていく
けど今回は右上を空けておきたい
そういう白紙にしてスキップするようなコマンドがあるのかマニュアル読んだけど、
英語でわからんちんだったのでゴリ押すことにした

あとgnuplotのdemoも見たけど、multiplotのページは全部埋まってる図しかなかった

(2016/11/5 追記)
右下の図を少し回転させたのが次の図で、下のスクリプトはこの図を書くものに修正しました
赤字が少し工夫した点


さらに修正



■ 画面に白紙を表示させる方法

まず枠(border)やgrid、tics(グラフに付いてる目盛り)はすべて手で消さないといけない
それらを表示させない設定をした後で、白紙の画面を描画→設定を元に戻す必要がある
そのときにresetとしたくなるが3番目、4番目の図の大きさが他の2枚と一致しなくなるのでやめた方がいい

具体的には
set key off
set xlabel ""
set ylabel ""
unset ytics
unset xtics
set nomy2tics
set nomx2tics
unset border
unset grid
plot [:][-1:1]1/0
とかでおk

最後の plot [:][-1:1]1/0はy軸の範囲指定をきちんとしないとエラーになるっぽい
他に出てきたのはplot sqrt(-1)とか
というかプロットする範囲を指定した上で、そこに入らないように何かをプロットするならなんでもいいと思われる




■ データの作り方
data2=hoge.txt
data3=foo.txt
gsl-randist $seed $nsample rayleigh 1 > $data2
gsl-randist $seed $nsample chisq 5 > $data3

hist2=hist_2.txt
ave_2=`awk '{sum+=$1}END{print sum/NR}' ${data2} | cut -c1-4`
max_2=`awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' ${data2}`
cat ${data2} | gsl-histogram $xmin ${max_2} $nbin > ${hist2}
echo "$ave_2"

hist3=hist_3.txt
ave_3=`awk '{sum+=$1}END{print sum/NR}' ${data3} | cut -c1-4`
max_3=`awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' ${data3}`
cat ${data3} | gsl-histogram $xmin ${max_3} $nbin > ${hist3}
echo "$ave_3"

data0=paste.txt
paste $data2 $data3 > $data0
これでデータができる
なぜdata1がないのか気になってしまうが何かしらの試行錯誤の名残なんだと思う・・・・(シャッと書いたので気にしない)

gsl-randistというコマンドはGSLをインストールしたら一緒に入ってくると思う
そのコマンドがない人はなんでもいいので1次元のデータを手で書いてください

data0というのをわざわざ作っているのは散布図を作っているから散布図を書きたいから




■ プロットのスクリプト
#!/bin/sh

xmin=0
xmax=10
nbin=40
nsample=10000
seed=0

data2=hoge.txt
data3=foo.txt
gsl-randist $seed $nsample rayleigh 1 > $data2
gsl-randist $seed $nsample chisq 5 > $data3

hist2=hist_2.txt
ave_2=`awk '{sum+=$1}END{print sum/NR}' ${data2} | cut -c1-4`
max_2=`awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' ${data2}`
cat ${data2} | gsl-histogram $xmin ${max_2} $nbin > ${hist2}
echo "$ave_2"

hist3=hist_3.txt
ave_3=`awk '{sum+=$1}END{print sum/NR}' ${data3} | cut -c1-4`
max_3=`awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' ${data3}`
cat ${data3} | gsl-histogram $xmin ${max_3} $nbin > ${hist3}
echo "$ave_3"

data0=paste.txt
paste $data2 $data3 > $data0

gnuplot <<EOF
set term png size 720, 720 fontscale 1.2 linewidth 1.5
set output "hoge.png"

set tmargin 0
set multiplot layout 2,2

set size square

set lmargin 6
set rmargin 4
set tmargin 0
set bmargin 2

## (1, 1)
set xlabel "rayleigh dist"
plot [${xmin}:${max_2}] "$hist2" u 1:3 w step lw 2 lc 1 title "mean=${ave_2}"

## (1, 2)
set key off
set xlabel ""
set ylabel ""
unset ytics
unset xtics
set nomy2tics
set nomx2tics
unset border
unset grid
plot [:][-1:1]1/0


## (2, 1)
set xtics rotate by -60
set key on
set ytics
set xtics mirror
set border
set grid
set bmargin 4
set xlabel "rayleigh dist"
set ylabel "chi^2 dist"

plot [${xmin}:${max_2}][${xmin}:${max_3}] "$data0" u 1:2 w d lc 0 notitle

## (2, 2)
set xlabel ""
set ylabel "chi^2 dist"
plot [:] [${xmin}:${max_3}] "$hist3" u 3:1 w step lw 2 lc 3 title "mean=$ave_3"


unset multiplot
EOF

rm ./*.txt













(タイトルですべて終わり)




■ ダメな例
\left< A + B + C + D + ... +\\
+ X + Y + Z \right>
■ OKな例
\left< A + B + C + D + ... + \right.\\
\left. + X + Y + Z \right>
2016-10-24 19.55.05


&と\left, \rightの位置にも注意
改行した後で&の前に\leftを入れるとダメ

■ ダメな例
N_{\rm ave} &= \left< N_1 + N_2 + N_3\right>\\
N_{\rm ave} &= \left< A + B + C + D + \cdots + \right.\\
\left. &+ X + Y + Z \right>
■ OKな例
N_{\rm ave} &= \left< N_1 + N_2 + N_3\right>\\
N_{\rm ave} &= \left< A + B + C + D + \cdots + \right.\\
& \left.+ X + Y + Z \right>
2016-10-24 19.54.54









ここのフローチャートが割と参考になった

■ 参考 : フロー図を描いてみる


一応フローチャートを作るときの記号などは基本的なものに従ったつもりだけど、ちょっと違うかも・・・




flowchart_blog

digraph flowchart {
node [shape="box", fontname="MS Gothic"];
edge [fontname="MS Gothic"];
start [label="start", shape="ellipse", style="filled", fillcolor="#CCCCCC", width=0.1, height=0.1];
end [label="end", shape="ellipse", style="filled", fillcolor="#CCCCCC", width=0.1, height=0.1];

node5 -> node6;
node6 -> node3[label="a0, a3"];

start -> node1;
node1 -> node2[label="a"];
node2 -> node3[label="b"];

node1 -> node4[label="c"];
node4 -> node3[label="d"];

node3 -> node7[label="e"];
node7 -> node8[label="f"];
node8 -> node9;
node9 -> end[label="a, b, c, d, e"];
node8 -> node1[tailport=e, headport=e];

node1 [label="hoge", shape="parallelogram", fixedsize="true", width=4.0, height=0.5];
node2 [label="foo"];
node3 [label="aho", shape="doubleoctagon"];
node4 [label="ver"];
node5 [label="aha\nha"];
node6 [label="hoge2"];
node7 [label="hoge3"];
node8 [label="本当に?", shape="diamond"];
node9 [label="OK!!!!"];
}




そのうち色々と追記して行きます




わかりやすい参考記事

■ 参考 : DOTユーザーズガイドの日本語訳

■ 参考 : Graphvizとdot言語でグラフを描く方法のまとめ




■ 疑問
・数式は入れることができないのか?

日本語はそのまま入力できるし、表示もされる




コメント文
// ここはコメント文

/* ここはコメント文 */

# ここはコメント文
の3種類がある




矢印なしのフローチャート
graph graphname {
a -- b -- c;
b -- d;
}
hoge3矢印ありのフローチャート
digraph graphname {
a -> b -> c;
b -> d;
}
hoge4


wikiの一番下にあった問題点ってのをそのままコピーして作ってみたら
グニャ〜って曲がったグラフができた・・・ 失敗だ・・・

digraph g {
node [shape=plaintext]
A1 -> B1
A2 -> B2
A3 -> B3

A1 -> A2 [label=f]
A2 -> A3 [label=g]
B2 -> B3 [label="g'"]
B1 -> B3 [label="(g o f)'" tailport=s headport=s]

{ rank=same; A1 A2 A3 }
{ rank=same; B1 B2 B3 }
}
hoge4
rankdir=LR;
とスクリプトファイルの中に書いておくと
「上から下に」じゃなくて「左から右に」進むフローチャートができる


色を付ける
graph graphname {
node [style=filled, colorscheme=rdpu4];
#rankdir=LR;
a -- b -- c;
b -- d;

a [style=filled, fillcolor=1];
b [style=filled, fillcolor=2];
c [style=filled, fillcolor=3];
d [style=filled, fillcolor=4];
}
hoge3node [style=filled, colorscheme=rdpu3];の行は上の方に書かないとエラーが出た
調べてないから勘だけど、rdpu4の数字はいじってもOK
ある色からある色までを4分割するってことだと思う
数字を4にしたままで
d [style=filled, fillcolor=5];
のように置き換えるとエラーが出て変な色で塗りつぶされる





ノードの形は以下のような種類がある(参考にしたpdfより)
ノードの形
graph graphname {
node [style=filled, colorscheme=rdpu4];
#rankdir=LR;
a -- b -- c;
b -- d;

a [style=filled, fillcolor=1, share=circle];
b [style=filled, fillcolor=2];
c [style=filled, fillcolor=3];
d [style=filled, fillcolor=4];
}
のようにcircleと書けば円になってくれる




■ 文字を改行したい
\n
でおk




■ 矢印の横に文字を入れる方法
同じく一つ上のスクリプトで
b -- d[label="hoge"];
のようにすればhogeと入る

たぶん、フローチャートの形によっては矢印と干渉するのでスペースなどを入れて対処する

他にも、次のようなオプションが付けられる。
// edge define
alpha -> beta [
label = "a-b", //エッジラベル
labelfloat = true, //ラベルの重なりを許可する
headlabel = "head", //エッジの終端にラベルをつける
taillabel = "tail", //エッジの始端にラベルをつける
labeldistance = 2.5, //ラベルの位置をノードからの距離で指定する
labelangle = 70, //ラベルの位置を角度で指定する
color = blue, //エッジカラー
style = solid, //エッジスタイル
dir = both, //エッジの矢印を指定する
arrowhead = normal, //エッジの終端の形状を指定
arrowtail = normal, //エッジの始端の形状を指定
arrowsize = 1, //矢印の大きさ倍率で指定
weight = 5 //エッジの重み付け 重みが大きいエッジが結ぶノードがより近く配置される
fontname = "Migu 1M", //エッジラベルフォント
fontsize = 14, //エッジラベルフォントサイズ
fontcolor = blue //エッジラベルフォントカラー
];
■ 参考 : Graphvizとdot言語でグラフを描く方法のまとめ





shapeの中には「レコード」というものがある
縦横に自由に分割できる上に、分割したパートについても矢印の出し入れができる




■ 接続ポート
それぞれのノードの左右上下どこから矢印を出すかを制御できる
n : 上
ne : 右上
e : 右
se : 右下
s : 下
sw : 左下
w : 左
nw : 左上
c : 中央
_ : 自動
graph graphname {
node [style=filled, colorscheme=rdpu4];
a -- b[headport=w, tailport=e];
b -- c;
b -- d[label="hoge"];

a [style=filled, fillcolor=1, shape=circle];
b [style=filled, fillcolor=2];
c [style=filled, fillcolor=3];
d [style=filled, fillcolor=4];
}


hoge3headport="w"のようにダブルコーテーションはいらないので注意
a -- b[headport=w, tailport=e];
aからbへの矢印のうち、headportつまりbに入るところは左から
逆にtailportつまりaから出るところは右から出るようになっている
(矢印にとってのheadとtailなので少し理解するのに苦労した・・・)




■ 次へ : 【dot言語】フローチャートを1つ書いてみた









dotというフローチャートを描くためのツールがある
doxygenというコードのドキュメントを自動生成するツールでも、このツールが使われていて
ある関数が別のコードのどの関数で呼ばれているかなどが視覚的にかなりわかりやすく描かれていたりする




インストールは
sudo port install graphviz
でOK




どんなことができるかは次のページを見てもらうとわかりやすいかも

■ 参考 : データのビジュアル化を最少の労力で




まずはdotに食わせるスクリプトファイルを用意する
hoge.dotというファイル名で以下の内容のもとを作成する
digraph sample {
alpha -> beta;
alpha -> gamma;
beta -> delta;
}
グラフとして出力するコマンドは
# dot -T[出力形式] [スクリプトファイル名] -o [出力ファイル名]
dot -Tpng hoge.dot -o hoge.png<.div>
これでできたのが
hoge手元で試したところ、gif, pdf, pngはできた
他のフォーマットはあんまり使うことがないのでこれだけできれば十分か

ちょっと描きたいフローチャートがあるので、それが作る過程でいろいろと構文のことを勉強できるだろう




■ 次へ : 【dot言語】のチートシート















ここからスタイルシート(styファイル)を落とせる
■ 参考 : Direc­tory macros/latex/contrib/ulem

使い方などはこちらにまとまっている
■ 参考 : ulem.sty

\usepackage{ulem}
\sout{hoge}
でいけるらしい
ただ表の中で使ってみたら、思っていることにならなかった


他にも式中で使うキャンセルを表す斜線もパッケージになっていた
■ 参考 : cancel.sty

今たまたま読んでる教科書でこれ使われてるわ・・・・










git status
とすると、configureで生成したファイルがワッサーーーと並ぶので、一番肝心の修正したファイルリストが隠れてしまう
そこで
git status | more
としていたが、
今度はcolorでなくなってしまう


ググったら解決方法が書いてあった

■ 参考 : git/git status|lessとかでカラー表示にならない件

git config --global color.branch always
git config --global color.diff always
git config --global color.interactive always
git config --global color.status always

でOK
このコマンドをどこでもいいので走らせると、~/gitconfigが書き換えられる

これらの設定が何かとコンフリクトして悪影響が出る場合は、以下のコマンドで元の設定に戻せる
git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto









■ 参考 : シェルスクリプトでコマンドの有無を確かめる
if [ `which hoge` ]; then
echo 'hoge atta'
fi
自分も最初にwhichとifでどうにかなりそう・・・と思ったけど、if文の書き方がわからなくてググった・・・
シェルスクリプトのifはこんなに使っても全然覚えられない・・・
testとifと[ ]があって頭グチャグチャ

whichの代わりに、hashやtypeというコマンドに置き換えても動くしそっちの方が早いという記事もあって試してみた

■ 参考 : Bashでコマンドの存在チェック
if type "hoge" > /dev/null 2>&1
then
 echo "hoge atta"
fi








それは・・・たぶん無理だ・・・


git add -p
で、1つのファイルを一度にコミットするんじゃなくて、1つのファイルの修正を分割してコミットすることができる

■ 参考 : Gitの便利な-pオプション四兄弟
git stash -p
も便利そう(絶対に使いこなせないけど)
これは今行った修正を更地に戻すけど、後でそこに復旧できるようにする
ファイルを最新の状態に戻すときは、git checkout hoge.c でOK


git log -pは割と使ってる、これはそのコミットでの修正点を具体的に見れる

あとここには書いてないけど
git log --stat
ってのも便利だと思う





(2016/10/27 追記)

git add hoge.c -p
は全然使わないだろうとか言ってたけど、かなり便利なことに気づいて活用している
表示された部分をaddしたいときはy、したくないときはn

ちなみにgitさんが提示してくるadd部分の範囲が広すぎる場合は
y/nの他に表示されているsを押すと、さらに細かい範囲を指定し直してくれる
それで良ければyを押せばいい




判別する方法は、
#include <math.h>

if ( isnan(x) ) {
 // これはNaNの場合
} else {
 // NaNでない場合
}

if ( isinf(x) ) {
 // これはInfの場合
} else {
 // Infでない場合
}
じゃあ判別できているのかのテストの方法は、

■ 参考 : infやnanになる条件

log(0)とか、5/0.0とかやってみたけどすべてInfになってしまった・・・

■ 参考 : 8.3 math.h

このままではNaNのテストができないので、
math.hにNANってマクロがあるらしいので、それに対して調べてみた

あとでもうちょっと調べてみたら、sqrt(-1.0)って作り方もあるらしい




以前軽く調べた知識によると、IEEE_754では
NaNもInfも指数部のビット全て1(つまり255)
NaNは仮数部が0以外の任意の値
Infは仮数部が0
らしい

そんなことを知らなくても、上記のisnanとかで調べられるからまぁいっか・・・・











一つ前の記事
■ 過去記事 : 【シェルコマンド】デフォルトのdiffでは見にくいのでオプションとcolordiffを試し見た
と少し関係がある

emacsで2つの画面を同時に閲覧することがある
2画面で開いたソースコードを比較しながら、同時にスクロールできたら便利だろうなぁ〜と思って調べてみたらそんな機能があった
C-x 3
M-x scroll-all-mode

解除したいときはもう一度、
M-x scroll-all-mode

■ 参考 :Scroll two opened buffers in a split window at the same time










デフォルトのdiffが見にくいので、--colorとかないのかな〜と思ってググったら色々と便利そうな情報が見つかった


■ 参考 : diff コマンド見辛かった

早速colordiff入れたわ・・・

あとは
-uオプションで、+/-とかで追記・削除などを表してくれるようになる
-yオプションで、真横に並べてくれる
このままでは見にくいので
% diff hoge.c foo.c -y > hoge.txt
% emacs hoge.txt
とかでOK?


あと
■ 参考 : diffの結果をカラーで閲覧
に書いてあったが、git repository内ならそもそもgit diffでcolor表示にできる






前回書いたMPIの記事はあまりにめちゃくちゃだった・・・
今回もめちゃくちゃです

一応、既存のコードの並列化自体はできて、並列処理はできました
(そもそも既存のコードが遅いので、、まだまだ改善の余地がありますが)

もっと早くする方法について色々と調べて行くと「master/slave方式」というのが見つかった




通常並列化するときは

例えば何かある値をn個計算するとして逐次コードだと、
for(i=0; i<n; i++){
// 何か計算
}
みたいにしてやる


これをncore個のcoreで並列化するときは、サイクリック配置
for(i=0; i<n; i=i+(ncore)){
// 何か計算
// MPI_Gatherで集める または printfとか
}
または、ブロック配置では
for(i=(myrank*ncore); i<(myrank+1)*ncore; i++){
// myrankはそのプロセスのrank
// 何か計算
// MPI_Gatherで集める または printfとか
}
みたいな感じか?(上ので合ってるかはわからんけど)
他にもこれらを組み合わせたブロックサイクリック配置というのがあるらしい

どうやって逐次コードを並列化するかはその計算処理自体に依存するのでケースバイケース





一方でmaster/slaveでは、myrank==0のプロセスは他の監視するためだけに使う
myrank!=0のプロセスは何かの処理や計算をする

言うのは簡単だけど、これを実装するのがなかなか大変・・・
サンプルコードも色々と探したけど、そのまま活用できそうなのが見つからない
もうちょっと書くと、計算に必要なパラメーターをmasterがsend(MPI_Send)して、slaveがreceive(MPI_Recv)して計算を走らせる
計算が終わったらslaveがmasterに値をsendして、masterが値をreceiveする
そのslaveは次の計算ができるので、また走らせて・・・というのを管理していく
masterはいつでも受信できるように
MPI_Recv(&result, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
のようにANYを使う

たぶんこういう理解で合ってるはず・・・

大まかなmaster/slave方式は以下のコードを見てもらえるとわかるはず
myidという変数で場合分けしてる
■ 参考 : code_mpi_exp/test_mpi5.c

他の例もある(githubでも割と探した)
■ 参考 : Parallel programming: an MPI example

■ 参考 : pi-pp/serie_4/master_slave_template.c

■ 参考 : pi-pp/serie_4/mpi-master-slave-template.c

一つ上のとすごく似ているが微妙に違う

■ 参考 : ValiTDS/valiTDS/gcd.c

ポルトガル語で説明が書いてあるけど、要するに3つの整数の最小公倍数を探す計算らしい


■ 参考 : Master/slave programs in MPI

動くコードがすべて書いてくれている
ありがたい


■ 参考 : /* 1からこの数までの和を求める */

どういう経路で見つけたページか忘れたけどすべてのコードが書いてある
コピペで完全に動いてビビった





他のサンプルコードは、「MPI 並列化 "サンプルコード" C言語 -pdf」とかで検索しても全然見つからない
その検索で見つけた興味深い記事をメモしておく

■ 参考 : Message Passing Interface (MPI) 統合スレ

ネット上にマジでまとまった情報がないから2chに行ってみた
2004年からある老舗だが、あまり活発ではないらしい
とりあえず一度全部さっと目を通しておくとMPIのソースコードには慣れられる


■ 参考 : link集/MPI

2009年で更新が止まっている


■ 参考 : MPI Programming samples

リンク集の中にあった東工大のサンプルコードページ
見つけたサイトの中ではかなり有意義なページ
実際にコピペでは動かないものがあるので注意



■ 参考 : MPI Documents

日本語のpdfもあるが、1997年のものだった
少しだけsample codeがある

■ 参考 : Web pages for MPI and MPE

上記のページのdocumentは少し検索しずらかったり、読みにくい
web page版があった






色々と調べて感じたのが、MPIによる並列化ってまだ今も使われている技術なんだろうか・・・
並列化って今はもっと他のライブラリとかを使ってたりするのだろう
ちょっと不安だけど、まぁもうちょっとやりこんでみる・・・・




(2016/10/10 追記)

今更だけど、すごくよくまとまったページを見つけた

■ 参考 : PCクラスタ超入門 講習会テキスト


この中で特に「MPIによる並列プログラミングの基礎」というのが役に立ちそう
他のドキュメントはまだ見てないけど、高速な並列化をするために重要なことが書かれていそう・・・ まだ見てないけど









プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞
自己紹介:
#include <stdio.h>
#include "MyProfile.h"

#define TWITTER coffee_pote

int main(void){

printf("\n");
printf("過去記事でリンクしていた画像を忍者ブログからflickrへ移転、これですこしは見やすくなったかも\n");
printf("\n");
printf("猿でもわかるgnuplot を執筆中(何も進んでいない・・・・)\n");
/* 最終更新 2016/11/25 */
return 0;

}
カウンター
ブログ内検索
feedlyボタン
follow us in feedly
twitter
Flickr

Template "simple02" by Emile*Emilie
忍者ブログ [PR]