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

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

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


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


( 2018/01/01 追記)
( 2018/01/21 追記)
実は、2017年末に理学博士の学位を取れました〜
2018年1月中旬から某所で研究者(ポスドク)として働きます

つまり、このブログには4回生からD5で理学博士を取得する間の8年間に習得した 知識や経験値がすべて蓄積されている、ということになります(まじか)
ただし、物理に関することはほぼここには書いていないのであくまで計算機やプログラミング言語に関することだけです・・・
あとはgnuplotとかポケモンGOとか







PR

■ 参考 : Python, formatで書式変換(0埋め、指数表記、16進数など)






文字列に対して、書式指定するときは str.format() でできる

■ 桁数を指定して0埋めするときは
print('zero padding: {:0=5}'.format(100))

出力は
zero padding: 00100
この例だと:0=で0埋めを指定、5は5桁になるように0埋め


■ 符号を露わに書いてほしいときは、
a=100
print('sign: {:+}'.format(a))

出力は
sign: +100


■ 数字の小数点以下の桁数を指定したいときは
a=1234.5678
print('{:.2f}'.format(a))
print('{:.6f}'.format(a))

出力はそれぞれ
1234.57
1234.567800


■ 数字を指数形式で表示してほしいときは
a=1234.5678
print('{:e}'.format(a))

出力は
1.234568e+03



■ 有効数字
この例だと3桁と4桁の場合
a=1234.5678
print('{:.3g}'.format(a))
print('{:.4g}'.format(a))



出力は
1.23e+03
1235

■ pngをepsに変換する

ImageMagickのconvertコマンドでやる
convert hoge.png eps2:hoge.eps

出力先のファイル名の前に eps2: をつけるのが大事
これがないと、ファイルのサイズが10倍くらい大きくなっちゃう
eps: でもダメっぽい



■ pdfからepsに変換する
pdftops -eps hoge.pdf

でhoge.epsが生成される

pdftopsというコマンドはport経由でインストールした
sudo port install poppler










■ 参考 : Pythonのデコレータについて


pythonコードでの@はデコレーターというらしい

事前にデコレーター関数を定義しておいてそれを@マークで呼び出す
上の記事の例だとdecoというデコレーター関数を定義して
@deco
でtestという関数にデコレートしている呼び出してる
(携帯の外側にギラギラした石をデコってるギャルみたいな感じか? この表現がすでに古い気がしてきたが・・・)
デコレーターを利用することで、既存関数の処理の前後に自分自身で、処理を付け加えることができます。どういう状況でそういうことをするかということを考えてみました。僕自身もまだ勉強したてでわかっていない部分が多いのですが、デコレーターを使うことで、ライブラリとして提供されている関数を呼んだときに自動的に実行される処理を付加できるということになります。
Pythonでは、Javaなどで利用されるオーバーライドのような形で関数自体を書き換えてしまうことも可能ではあります。しかしながら、既存の処理には問題がないんだけど、それだけじゃなくて、違う処理も同時にさせたい。みたいな状況のときに、デコレータを使うんだと思います。
調べていたら、デコレーターを利用して、ある関数のベンチマークを行うプログラムが紹介されていました。
なるほど、ベンチマーク用のデコレーター関数を一つ作ってしまえば、あとはいろんな関数に@でデコレートしていくだけで、それぞれのベンチマークを計測できたりしますよね。便利ですね。

なるほど・・・・


なんか自分のコードにもこれが応用できる気がしてきた







基本的にやりたいことは、aタグのhrefと同じ
クリックしたら、リンクされてるwebページに飛べる

けど、aタグじゃなくてボタンを使って「どうぞ押してください」感を出したかった・・・
(謎のこだわり)

■ 参考 : buttonタグを使ってリンクを貼ってみよう

ボタンをbuttonタグで用意して、その中にonclick="location.href='http://coffee.guhaw.com/'"とか書いておけばOK

<button onclick="location.href='http://coffee.guhaw.com/'">this is button</button>
やりたいことはcgi+pythonで、submitしてページが遷移した後に、そのページ生成に使ったパラメーターを少し変えてページの再生成がしたい
出力されたページにhtmlでボタンを用意しておいて、そのボタンを押すと少しだけ異なるパラメーターで同様のcgiが走るようにしたい





最初はformに入っているパラメーターをなんとか保持して、それをhtmlのformに代入しようかと思ったけど
formに入れるべき変数の数が20個くらいあって
それを全てパースするのは骨が折れる上に、もし変数が追加されたらそのパースする部分もまた編集しないといけないのでめんどくさい・・・
(一応formに隠れて変数を渡すのはhiddenってタイプを使えばできることは確認した)


解決は、一度cgiで生成されるURLをうまく使ってできた
cgiでpythonを走らせたときのURLは
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=67890&date=2020/05/07
みたいな感じになってると思う

pythonで
import cgi
import cgitb

cgitb.enable()
form = cgi.FieldStorage()
って書くと、このformにURLの?以降が代入されてパースできるようになる

?以降の para1=12345&para2=67890&date=2020/05/07 はクエリ文字列と呼ばれる
この言葉で検索してると、このクエリ文字列を取得してそれをパースする方法がわかった

■ 参考 : PythonCGIでGETメソッド取得
import os
import cgi
if 'QUERY_STRING' in os.environ:
query = cgi.parse_qs(os.environ['QUERY_STRING'])
else:
query = {}
#ここまでおまじない

a = int(query['a'][0]) #データaを整数として読み込む
b = int(query['b'][0]) #データbを整数として読み込む
自分がしたかったのはクエリ文字列をそのまま取ってくることだったので、
str_query = os.environ['QUERY_STRING']
みたいにすればOK

このstr_queryに対して、パラメーターの一部を置き換えるような置換をしてあげればいい
文字数がわかってるときの任意の置換は↓の記事を参照

■ 参考 : 【python3】re.sub()で文字数が決まった任意の文字列を置換する


自分好みに置換したクエリ文字列が例えば
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=99999&date=2020/05/7
だとして(2番目のpara2ってのの値が違う)
あとは生成したwebページにこのURLへのリンクを用意しておけばOK
それをクリックしたら、ほぼ同じパラメーターでcgiが動く
できたwebページにいくと、また同様にリンクがあるはず






今回は関係なかったけど、
str_query = os.environ['QUERY_STRING']
とかで、クエリ文字列を全部持ってきてからそれをパースする(分解して処理する)ときは以下の記事が参考になる

■ 参考 : PythonでURLのクエリ文字列(パラメータ)を取得・作成・変更


import urllib.parse
すると、いろんな関数が使えるようになる

ただ、cgiのクエリ文字列の場合はcgiモジュールの中にいろんなパースする関数があるので、
そっちを使ったほうが便利
form.getvalue("hoge")
form.getfirst("hoge")
とか

■ 参考 : 21.2. cgi --- CGI (ゲートウェイインタフェース規格) のサポート





余談やけど、
cgi.print_form(form)
とか
print(os.environ)
打つと、form関連の内容が見れる
なにかに使えるかもしれないのでメモ









■ 参考 : Pythonで文字列を置換(replace, translate, re.sub, re.subn)

pythonで置換する関数は
replace()
re.sub()
他がある

replaceは決まった文字列を決まった文字列に置換する
s = 'one two one two one'
print(s.replace(' ', '-'))
みたいな感じ
ワイルドカードは使えない




文字数が決まったワイルドカードを使いたいときはre.subを使う
import re
a="12345678"
re.sub("12..", "1200", a)
結果は '12005678'
頭が12でその後ろに2文字の何かが付いてるときにそれを1200に置換する

最初はここを*でやってたら、うまくいかなくて詰まった・・・・







pythonで動くwebツールを使ってて、もしかして、このwebサーバーでJupyter Notebookを動かせたら便利なんじゃね?と気づいた

Jupyter Notebookのインストールは
pip install jupyterlab --user

インストールが完了したら、webサーバー上でNotebookを立ち上げる
jupyter notebook --no-browser --port=7800


ローカルマシンでremote_serverのポートにポートフォワードする(トンネリング)
ssh -N -f -L localhost:8001:localhost:7800 remote_server

ローカルマシンのwebブラウザで http://localhost:8001/ にアクセスする
そしたら、トークンを入力するように言われる(パスワードみたいなものか?)

最初にnotebookを立ち上げたときに表示されたトークンを入力すれば、notebookが使えるようになる

終了するときは、ローカルマシンで
lsof -ti :7800 | xargs kill -9
を実行すればOK






■ 参考 : Jupyter 知っておくと少し便利なTIPS集

■ 参考 : Jupyter Notebookでコードの自動補完をする


によると、Notebookに
%config IPCompleter.greedy=True
と書いておくと、補完ができるようになる







javascriptでユーザーの操作に呼応して(トリガーされて)、何かアクションを起こすことをイベントハンドラというらしい
わかりやすい一覧があったのでメモしておく

■ 参考 : JavaScriptのイベントハンドラ一覧




一番よく使われるのは onLoadかonClickやと思う

onLoadはページの読み込みが終わったことにトリガーされて、なにか関数を呼び出したりできる
onClickはボタンをwebページに置いといて、ユーザーがそれをクリックするとなにか関数を呼び出したりできる


今回やろうと思ってたのが
webページ上にリストがあって、そのリストがユーザーの入力した時間に基づいて内容が変化するというもの
リストにはデフォルトの内容があって、毎回ページを更新するとそのデフォルトのものに戻るようにしたい
ただ、ユーザーが一度リストの内容を変えるとそれをどうやってデフォルトの内容に戻すのか全然アイデアが出なかった・・・

結局、このユーザーの入力した時刻に基づいてリストを更新するのはやめて別の方法でか解決
(これまでのすべてのデータの和集合を取るようにしたので、リストを手で変更する必要をなくした
和集合自体は1時間に1回差分を見て追加があったら追記するようにcrontabが動いてる
たぶんできる限りユーザーの負担を減らしたほうが良い気がしたのでこの案でGO)





どこかで使えるかな?と思ったイベントハンドラに
ユーザーが画面を閉じる直前に処理をするonbeforeunloadってのがあった

■ 参考 : ブラウザの閉じるボタンに割り込む #JavaScript #JQuery


なにかに使えるかもしれないので、一応メモ








ついに15万
https://coffeepote.tumblr.com/post/615761697008975872






python3でちょいちょいコードを書いてて計算時間が遅いことに色々とイラついてきた
本当はpythonなんか使いたくないんやけど、しょうがないから並列化処理をして早くする

幸い今回のジョブは完全に独立で走らせても最後にまとめられればOK、かつ計算の順番は問わないものなので並列化難易度はかなり低い




ひとまずpythonで並列化のためのライブラリがどんなものがあるのか調べてみた

2019年7月の記事でわかりやすくまとまってるのがあった
python3まで網羅してくれてるのでありがたい

■ 参考 : Pythonの並列処理・並行処理をしっかり調べてみた

thread : python2向けで古い

threading : python3で使える、threadの上位互換

concurrent.futures : threadingの上位互換

他にも
multiprocessing
Joblib
asyncio
とかがあるっぽい


最初の記事を読んでthreadingを使おうとしてみたけど、わからん・・・
その後、multiprocessingの方を使おうとしてみたがこれまたわからん
一応メモだけしとく・・・

■ 参考 : Python で並列処理(初めての人向け)

■ 参考 : [Python] マルチプロセスな処理を実装して、処理を高速化する

■ 参考 : pythonの並列計算(CPUの数だけ並列させる)





結局、joblibというライブラリを使って並列化する
コードはめちゃくちゃシンプル

# with multiple processing by joblib
def wrapper_parallel_function(i):
 parallel_function(arg1, arg2, arg3, data[i])
 return data[i]

out = Parallel(n_jobs=-1)([delayed(wrapper_parallel_function)(i) for i in range(len((data)))])

みたいな感じ?(元のコードの名前を変えて書いたので間違ってるかも・・・)

parallel_functionという関数がもともとあって、それを並列化したい
関数の引数は色々とあるけど、dataというリストについて並列化したい
引数がいっぱいあるので、それをまとめてラッパーを用意する

Parallelという関数でラッパー関数を並列化する
out = Parallel(....というところで、dataという配列を1つ1つラッパーに渡している

みたいな感じだと思う

■ 参考 : PythonのJoblibによる並列計算について

この記事にも書いてあるけど、並列化の処理の終了順がジョブ依存なので
出力される順番もランダムになる

それを回避するには記事のように出力結果にデータのindexを入れておき、
それを後でソートする方法がある










選択肢が2400個とかあって、スクロールして目的のものを探すのが大変
なので、選択肢のプルダウンに検索機能を付けてみる

例は↓のような感じ

■ 参考 : Basic usage - select2





使い方はinstallationのページにあるようにライブラリを読み込む

■ 参考 : Using Select2 from a CDN - select2
$(document).ready(function() {
$('.js-example-basic-single').select2();
});

みたいにjavascriptのタブの中に書いておく
js-example-basic-singleはclass名を書く
ほかはいじらなくてOK





■ 他の使えそうなオプション

■ 参考 : jQuery + Select2 : ドロップダウンリストの幅を調整する

■ 参考 : jQuery: プラグインSelect2で






■ javascriptの配列を外部ファイルからselect2で読み込む

■ 参考 : 【Javascript】セレクトボックスの選択肢を外部ファイルにしておく

↑の記事では外部ファイルからリスト形式にして、それをselectタブに流し込んでいた

実はselect2を使うと、こんな関数を書かなくても大丈夫


■ 参考 : 4-1.動的にoptionタグを生成する

ただし、注意しないといけないのは、配列の要素にidとtext が必要(txtではない)
valとtxtではないことに注意






便利そうなオプションがあったらさらに追記する








基本的に↓に書いてあるとおり

■ 参考 : セレクトボックス(プルダウン)を外部ファイルから作成+リストのデータを取得(JavaScript)


プルダウンの選択肢を事前に分けて、list.jsという名前で保存しておく
list.jsをhtmlソースコードの上の方で読み込む
<script type="text/javascript" src="js/list.js"></script>


bodyの下の方でscriptタグを用意して
その中に、データを読み込む関数を書く
function readFirst(){
for(var i=0;i<list.length;i++){
let opt = document.createElement("option");
opt.value = list[i].val; //value値
opt.text = list[i].txt; //テキスト値
document.getElementById("PullDownList").appendChild(opt);
}
};

listという配列はlist.jsの中に用意しておく
必要な要素は
{val:"1", txt:"P1"},
こんな感じ
txtは選択肢として表示される名前
valは選択されたときに渡される値
これがlistの個数だけ繰り返される


あとはこの関数をhtmlの読み込み完了後に実行すれば良い

元記事ではbodyタグにonloadを実行させて、読み込もうとしているが自分のところではうまくいかなかった
代わりに
window.onload = readFirst();
とbodyの下の方のjavascriptに書いたら動いた
なぜbodyのonloadではだめなのかは不明

どこまでjavascriptが動いているかをテストしたかったら
console.log('Hello1');
とか書けば、動いているのかわかる










こんな感じ
sh-4.2$ echo $(( 100 + 008 * 300 ))
sh: 100 + 008: value too great for base (error token is "008")
sh-4.2$ echo $(( 100 + 009 * 300 ))
sh: 100 + 009: value too great for base (error token is "009")
sh-4.2$ echo $(( 100 + 007 * 300 ))
2200
sh-4.2$ echo $(( 100 + 005 * 300 ))
1600

■ 参考 : 先頭0埋めの値の演算


原因は、頭に0が付いている数字は8進数だと考えられるらしい(どういうことかわからぬ・・・)

exprを使えば008とかでも計算できるらしいが、exprは遅いからなぁ〜・・・

まぁ、ひとまずこういうことも起こるということを覚えとけばこのトラブルは回避できそう







python local variable 'hoge' referenced before assignment nonlocal

ってエラーが出て詰まった・・・・

■ 参考 : UnboundLocalErrorについて考察してみた


global変数とlocal変数の違いでエラーが起こっているのかと思ってコードとにらめっこして該当箇所を探したが
自分のコードの原因はもっと単純やった・・・

1. 関数の中でhogeが返り値になってる
return hoge
2. 関数の中でif分岐があって、片方の分岐に入らないとhogeが定義されていない
3. return hogeとすると「hogeがないよ」ってエラーが出てた

なので、if分岐がONになるときはエラーが起こらず
if分岐に入らないときはエラーが起こってた

1時間くらいかかったわ・・・
ひとまず、自分のpythonのglobalとlocal変数への理解は正しいことは確認できた

globalはなんとなくわかるけど、nonlocalってのもあるらしい
違いはわからん
必要ならまた調べる





面白そうな記事があったのでメモ

■ 参考 : 他の言語に慣れた人がPythonを使ったときにつまずきがちな10のポイント









同じiCloudのアカウントにログインしてるiPhoneをMacの上に置くと(具体的には左にあるイヤフォンジャックあたり)、スリープしてしまった・・・
handoffとかいろんな同期機能があるけど、こんな機能もあったのかぁ〜〜〜〜

と勘違いして調べてみたら理由がわかった

■ 参考 : デバイスの磁石で Mac ノートブックコンピュータがスリープ状態になることがある
磁石が使われているデバイスを Mac ノートブックコンピュータの下またはパームレストの上に置くと、コンピュータがスリープ状態になることがあります。

MacBook、MacBook Air、または MacBook Pro の下またはパームレストの上に磁石を置くと、コンピュータが予期せずスリープ状態になることがあります。この現象は、次のような場合に発生することがあります。
iPhone、iPad、または磁気を帯びたデバイスをコンピュータのパームレストの上に置いた場合。iPhone のスピーカーや、ほとんどの iPad ケースには磁石が使われています。
Apple Watch やそのマグネット式の充電ケーブルをコンピュータのパームレストの上に置いたり、Apple Watch を装着したまま手首をパームレストの上で休ませたりした場合。Apple Watch 用の一部のバンドには磁石が使われています。
コンピュータを積み重ねた場合。下に置いたコンピュータの磁石で、上に置いたコンピュータの磁気スイッチが作動してしまう場合があります。たとえば、上に置いたコンピュータの電源を入れても、起動する前にスリープ状態になってしまう場合があります。
磁気を帯びたものの上にコンピュータを置いた場合。
公開日: 2015 年 07 月 14 日


磁石の入ったものならなんでもスリープになってしまうらしい
知らなんだ・・










C言語を勉強して使い始めて10年くらい経つけど、この度初めてbool型というのがあることを知りました
boolの存在自体はpythonとか他の言語で知ってたけど、Cにもあるとは・・・・




■ 参考 : stdbool.h

/usr/include/stdbool.hというヘッダーファイルにbool型の値の定義が書いてあるらしい
基本的に
false が 0
true が 1
らしい

手元の環境でファイルを見てみたかったけど、同じ場所にないんだが・・・

bool型を使ったコードをコンパイルするときは --std=gnu99 をつける(--std=c99との違いはわからぬ)




面白い記事を見つけたので貼っとく

■ 参考 :C99 の bool と int の振る舞い





bool型の変数をprintfするときは整数型と同じ%dでいいらしい
無理やり0のときはfalse, 1のときはtrueで出力する方法もあるっちゃーある(以下のリンクを参照)

■ 参考 : c言語のbool型変数の出力変換指定子





pythonの開発環境を整えるパッケージ管理ツール(?)としてよく名前を聞くのが、pipとかvirtualenv
調べてもイマイチわからん・・・
(というか、使いたくないpythonに色々と時間を取られるのが嫌)

今回、minicondaを導入するのは楽という話を聞いたのでやってみた

anacondaというのもよく聞く
minicondaとanacondaの違いは

■ 参考 : AnacondaとMinicondaの比較、どちらで環境構築するべきか


ざっくり中身の充実度っぽい
anacondaはなんでも入ってるけど、その分ファイルサイズが大きい
minicondaは最小限のパッケージなので、追加で必要なものは自分でインストールする必要がある

追加で必要なパッケージのインストールにはyamlというのを使えば楽っぽいので
今回はminicondaで環境を整えてみた
以下、メモ





# Miniconda をダウンロードするスクリプトをダウンロードする

% wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# ダウンロードする
# enterとかyesを打ってると設定が終わる
# 自動的に設定が~/.bashrcに追加される
% bash Miniconda3-latest-Linux-x86_64.sh

# 設定を歳読み込みするために、新しいterminalで作業をする
conda config --add channels conda-forge

# それぞれの業界で詳しい人が配布しているyamlファイルをダウンロードする

# インストールする
% conda env create --file hoge-py37.yaml

# activateする
% conda activate hoge-py37



conda関連で便利そうなコマンドメモ
# インストールされているパッケージ一覧をみる
% conda list

# パッケージをインストールしたいとき
% conda install numpy

# activateする
% conda activate hoge-py37

# yamlファイルを出力
% conda env export > hoge.yaml

このyamlファイルを人と共有すれば、相手にも同じ環境を作れるのでとても便利





コマンドの例
hogeが実行コマンド
valgrind -v -v --error-limit=no --leak-check=full --tool=memcheck --show-reachable=no hoge

出力を記録しておきたいなら@tcsh
valgrind -v -v --error-limit=no --leak-check=full --tool=memcheck --show-reachable=no hoge >& val_err.txt
-vと2回書いてるのはより情報を出力するため

--error-limit はデフォルトだとyes
エラー報告の数を1000くらいで打ち切るオプションなので、これを外してすべてのエラーを出力する

--leak-check=full は必要

--tool=memcheck はvalgrindで使えるツールのうちどれを使うか指定する
このオプションがない場合もデフォルトでmemcheckが選ばれるのでなくてもいい

--show-reachable=no
確保された領域が解放されないままプログラムがabortした場合に検出される? わからん




コンパイル時に CFLAGS="-g -O0" のようにしてコンパイルオプションを追加しておく
-gはデバッグ関連(行番号とか)の情報を実行ファイルに入れておくオプション
-O0は本来-O2とかするところを、最適化しないようにしてコンパイルする
最適化してしまうと、順番とかが実行される変わる可能性があるかららしい

これをしておくと、valgrindのエラー出力の表示に関数名やコードの何行目かが表示されるので、バグ取りがとてもしやすくなる
逆にないと、とてもつらい・・・





ワーニング、エラーメモ

■ Warning: set address range perms: large range
大きいサイズのメモリ確保をしたとき


■ memcheck GC: 1000 nodes, 55 survivors (5.5%)
これは自分のコードには関係なくて、memcheckの性能を示すものらしい
バグ取りには関係ないので無視


■ メモリリークの例
==224793== 704,643,072 bytes in 1 blocks are possibly lost in loss record 1,312 of 1,312
==224793== at 0x4C2BC3C: memalign (vg_replace_malloc.c:857)
==224793== by 0x4C2BD01: posix_memalign (vg_replace_malloc.c:1020)
==224793== by 0x4E47325: HOGE (my_malloc.c:38)
==224793== by 0x4E475A0: HOGE (my_malloc.c:123)
==224793== by 0x4031E2: main (coinc.c:347)
-g -O0を付け加えてコンパイルしてるとこんな感じで情報が出てくる
実際はHOGEとかmy_malloc.cとかは別の名前なので適当に差し替えておきました

valgrindで実行ファイルを動かした場合は、メモリ確保の関数とかが通常のライブラリのではなく
valgrindのライブラリのものが用いられるっぽい
例えばposix_memalignとか


■ メモリの不正アクセスの例
==224793== Invalid read of size 8
==224793== at 0x4121D2: zpk2sos (iir.c:845)
==224793== by 0x4126BE: iir_design_sos (iir.c:1029)
==224793== by 0x404A12: main (coinc.c:509)
==224793== Address 0x187b0e28 is 8 bytes after a block of size 304 alloc'd
==224793== at 0x4C2B955: calloc (vg_replace_malloc.c:711)
==224793== by 0x4117DC: zpk2sos (iir.c:746)
==224793== by 0x4126BE: iir_design_sos (iir.c:1029)


参考になりそうなページ

■ 参考 : Using and understanding the Valgrind core(valgrindの公式ドキュメント)

■ 参考 : Valgrindの結果の見方、日本語訳、など役に立つことまとめ

■ 参考 : Valgrindの使い方







ちょっと関係ないけど、もし動的メモリを2回freeしてしまうとエラーになる

このエラーの箇所を探すコツを↓の記事で見かけたのでメモ

■ 参考 : double freeバグのデバッグ.



実行ファイルに対して、以下のコマンドを実行するとコマンドのバイナリファイルがどういう順で何を実行するのか見える
逆アセンブルとかいうらしい(なにかに使えるかもしれないのでメモ)
objdump -D a.out | more











branch一覧をみる
git branch -a
masterブランチに戻る
git checkout master

hogeというbranchを作成してそのbranchに移動する
git checkout -b hoge

fooというbranchを元に、hogeというbranchを作成するとき
git checkout -b hoge origin/foo


hogeというbranchを本家のリポジトリに登録する
git push -u origin hoge

hogeというローカルブランチを削除する
git branch -d hoge

hogeというリモートブランチを削除する
ただ、これをしても他のユーザーの環境では表示が消えないらしい、どうしても消したいときは
git fetch -p
git push --delete origin hoge







■ 参考 : 3.5 Git のブランチ機能 - リモートブランチ

に面白いことが書いてあったのでメモ
“origin” は特別なものではない
Git の “master” ブランチがその他のブランチと何ら変わらないものであるのと同様に、 “origin” もその他のサーバーと何ら変わりはありません。 “master” ブランチがよく使われている理由は、ただ単に git init がデフォルトで作るブランチ名がそうだからというだけのことでした。 同様に “origin” も、git clone を実行するときのデフォルトのリモート名です。 たとえば git clone -o booyah などと実行すると、デフォルトのリモートブランチは booyah/master になります。

へぇ〜






関連記事

■ 過去記事 : 【condor】について調べたのでメモ





condorは1つのジョブを走らせて、それを見届けてくれる
DAGmanはcondorの拡張版みたいなものっぽい

ジョブA, B, Cと3つのジョブを走らせるとして、
Aが終わったらBを、Bが終わったらCを走らせる
みたいなそれぞれのジョブを関連付けて走らせることができる

詳しくは↓にある図を見てもらうとすぐに分かるかと
■ 参考 : Workflow management with DAGMan


ジョブA→B→CみたいなのはLinear型と呼ばれるらしい
上記のページのDAGman用サブミットファイルは
######DAG file######
##### Define Jobs ###
##### JOB JobName JobDescriptionFile
JOB A0 namd_run_job0.submit
JOB A1 namd_run_job1.submit
JOB A2 namd_run_job2.submit
JOB A3 namd_run_job3.submit

##### Relationship between Jobs ###
##### PARENT JobName CHILD JobName
PARENT A0 CHILD A1
PARENT A1 CHILD A2
PARENT A2 CHILD A3
みたいな感じ

最初にジョブの名前とそれぞれのサブミットファイルを定義
その後でジョブの関連を書くっぽい



あとはジョブA〜Cの前後にプリプロセスとポストプロセスを走らせることもできるらしい
######DAG file######
##### Define Jobs ###
##### JOB JobName JobDescriptionFile
JOB A0 namd_run_job0.submit
JOB A1 namd_run_job1.submit
JOB A2 namd_run_job2.submit
JOB A3 namd_run_job3.submit

##### Relationship between Jobs ###
##### PARENT JobName CHILD JobName
PARENT A0 CHILD A1
PARENT A1 CHILD A2
PARENT A2 CHILD A3

##### PRE or POST processing of a job
##### SCRIPT PRE/POST JobName ProcessScript
SCRIPT PRE A0 pre-script-temperature.sh
SCRIPT POST A3 post-script-energy.sh

シェルスクリプトになってるけど、ファイルの入出力があるならすべて絶対パスで書く必要がありそう


他の例として、
Aが終わったらBとCを走らせる
BとCが終わったら、Dを走らせるとかしたい場合は

■ 参考 : Node Job Submit File Contents
# File name: diamond.dag
#
JOB A diamond_job.condor
JOB B diamond_job.condor
JOB C diamond_job.condor
JOB D diamond_job.condor
PARENT A CHILD B C
PARENT B C CHILD D





再帰的にファイルの全文検索をしたいディレクトリに移動してgrep-findを実行する
C-x C-f hoge
M-x grep-find

下のような表示がミニバーに出るので、そのまま検索したい言葉を入力する(この例ではsomething)
Run find (like this): find . -type f -exec grep -nH -e something {} +

たぶんこれは新しい機能ではなくて、findとgrepを組み合わせたコマンドのエイリアスみたいなものか
それにしても便利・・・
findとgrepの組み合わせは覚えられなくて毎回調べてたので











前記事で書いたツールの中で非常に多岐に渡るオプションを取り回す必要があった
具体的にはプロットタイプ1~9に対して、プロットの範囲[xmin, xmax][ymin, ymax]
全部で36個ある・・・
もしプロットタイプが増えたらさらに増える

これを全部関数の引数にして渡すのはやばすぎる!!!

と数ヶ月前の自分も思ったらしく、どう実装したかというと
xmin, xmax, ymin, ymaxを全部のプロットタイプで同じものを採用するという・・・

プロットの範囲を辞書型のリストにしておけば、関数の引数に渡すのは1つで済むから楽じゃね?
と思い至ったのでそれを実装してみた
この記事は辞書型のメモ

(一応約2年前にpythonの本を1から全部読んで、そのときのメモに辞書型のことは書いてあった
読んでみたら、こいつ全然辞書型わかってねーなー・・・と笑ってしまった)








■ 参考 : とっても便利なPythonの辞書型について覚え書き
# 空の辞書を作成、これに追加していく
dic_range = {}
dic_range["xmin_plottype1"] = 0
dic_range["xmax_plottype1"] = 5
dic_range["ymin_plottype1"] = 10
dic_range["ymax_plottype1"] = 40
みたいな感じ
これをplottypeの分だけ全部回して、さらに例外処理もすればOK


辞書の要素を取り出すときは辞書にキーを代入すればOK
xmin = dic_range["xmin_plottype1"]
本当は辞書のキーに取り出したい要素のものがあるか調べたほうが安全だと思う
if "xmin_plottype1" in dic_range.keys():
 xmin = dic_range["xmin_plottype1"]
else:
# なんかデフォルトの代入するとか
 xmin = ...
ただ今回は事前に例外処理はしてるので、キーがxmin_plottype1の要素には何かしらの値が入ってるのでしなくても大丈夫












前にも出た記憶はあるけどなぜか記事にしてなかったのでメモ

原因は簡単で、自分が定義した関数の引数の順番がまずいという話
引数の順番で、デフォルト値付きの引数は一番うしろに固めて置かないといけない
def func(a, b=100, c)

みたいなのがだめ
def func(a, c, b=100)
はOK


■ 参考 : python3 SyntaxError: non-default argument follows default argumentはなぜ起こるのか













cgiからpythonを動かして色々とやるツールを少し前からちょこちょこ作ってる
その中で不特定多数のユーザーが走らせたコマンドを記録したくなった
いつ走らせたか、どんなオプションを使ったか
これをログに残しておく

そこで走らせた日付を知りたい

■ 参考 : Pythonで現在時刻・日付・日時を取得

import datetime
d_today = datetime.date.today()
print(d_today)
# 2019-02-04

とか
時間入りで日付を知りたいときはnowを使う

dt_now = datetime.datetime.now()

print(dt_now)
# 2019-02-04 21:04:15.412854


取得した日付をファイルに書き込むときはこれを文字列に変換すればOK
file.write(str(today) + "\n")







プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "生きてます"
print "コロナのせいで15万くらい損失出してますが、生きてます"

# 最終更新 2020/03/15
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

とある物理の院生日誌~院生は社会へ旅立った~
(研究室の先輩の個人ブログ)

英語例文を見て自然に英語・英会話を学ぶ
(楠本慶ニさんの個人ページ、様々な情報の密度の高さに感動)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


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