2014年1月14日火曜日
2013年8月18日日曜日
2013年6月21日金曜日
ssh << MOSH | MITやっぱすげえ
(上図は、MITでの物理の授業風景らしいです)
おはようございます。Server使う人向けの話です。
SSHをより高速に便利なや〜つをMITが開発しました。
名前をMOSH と言います。
どう便利なのかは、参考リンクを。
使い方は、sshと同じです(!!!!)。
ここでは、インストール方法だけを。
(Homebrewの人)
$brew install mobile-shell
(Mac portsの人)
$sudo port install mosh
(GUI派の人)
公式サイトのpkgファイルをダウンロード
*落合研究室の人へ
pana2にはインストールしてあるので、ぜひ家やスタバ、サイパンから使ってみてください。
参考
MITからモバイル時代のSSH代替品
2013年2月2日土曜日
2012年12月20日木曜日
C言語ちょっと知識
プログラム高速化への道は難問であり、可読性との兼ね合いもあります。そこで、トリッキーですが、int型の初期化において排他的論理和を用いた手法を提案したいと思います。
int v; v ^= v;//初期化ちなみに、筆者の友人の環境によると、v=0とくらべて、2×10^(-8) [s]早くなりました。 時間がない人はお試しください。
場所:
日本, 東京都港区六本木
2012年12月19日水曜日
論文管理ソフト | mendely
【追記】
preferences > BibTeX > Enable BibTex syncingにチェック
これで持ってる論文bibファイルが生成されます。
タイトルの通り論文管理ソフトです.
http://www.mendeley.com/
あまり使いこなせていませんが,以下の特徴が挙げられます.
preferences > BibTeX > Enable BibTex syncingにチェック
これで持ってる論文bibファイルが生成されます。
タイトルの通り論文管理ソフトです.
http://www.mendeley.com/
あまり使いこなせていませんが,以下の特徴が挙げられます.
- 論文の情報を自動で認識 (タイトル,著者…etc)
- 指定したフォルダ内のファイルを自動で読み込む
- それぞれの論文にメモを書くことが可能
- PDF検索
- 日本語には弱い?
ちなみにiOS,Android版もあります.
2012年12月11日火曜日
配列のコピー
配列のコピーって、意外と面倒ですよね。僕の場合、for文を使って要素を一つづつ代入させてました。もっと簡単にできないかなと思って考えているうちに、構造体をつかえばいいんじゃないかなと思いました。
ではでは~。
struct array_tag{int x[100]};
struct array_tag a,b;
a=b;
場所:
日本, 神楽坂駅(東京)
2012年12月5日水曜日
丸め誤差の脅威( ゚ρ゚ )アゥー
みなさんはプログラムの数値がコンピュータ内では全て2進数として扱われていることはご存知ですよね!?
実はこの性質が引き起こすバグが存在し得ます。
実はこの性質が引き起こすバグが存在し得ます。
場所:
イラク ユーフラテス川
2012年12月2日日曜日
2012年11月26日月曜日
ドットインストール
アプリで一発当ててやろうという声を聞いたような気がするので、新たな言語を始めるときにおすすめのサイトを共有します。
3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストール
お手すきの際に是非どうぞ。
3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストール
お手すきの際に是非どうぞ。
ラベル:
研究初心者向け講座
2012年11月23日金曜日
“蒸しタオル”のススメ
場所:
台湾 台北市
2012年11月20日火曜日
ショートカットキー覚えたい人向け情弱ツールのご案内
ショートカットキーマスターへの道を手助けしてくれるアプリがあります。
このアプリを起動しなくなった時、あなたは晴れてショートカットキーマスターと呼ばれていることでしょう。
これでMacのショートカットは完璧!全てのアプリのショートカットをCommand長押しで表示する『CheatSheet』
このアプリを起動しなくなった時、あなたは晴れてショートカットキーマスターと呼ばれていることでしょう。
2012年11月14日水曜日
メモリリークを調べる
ぐるぐるまわるプログラムを書いてるとだんだんメモリ使用量が増えてくポップな現象いわゆるメモリリークが起きることがあるので調査可能なBoehm GCというライブラリを紹介します.
役立つのか微妙ですが興味ある人はお役立てください.
○ インスコ
○ 使う
4個くらいのナンセンスなプログラムを例にぐるメポップの見つけ方の例を示します.
(0) 準備
(1) ループ内でmallocしたアドレスを何度も同じポインタ変数に代入しよう
実行結果はリークポイントが行数で表示されます.長いので端折りますが. ちなみにループが1回だと検出はしません.
(2) freeしないvoidのmalloc用関数を呼び出してみよう
(3) (2)のプログラムでちゃんとfreeしてみよう
(4) (2)のプログラムで取得した領域をstaticなポインタ配列に代入して保持しよう
ということで,領域のアドレスを保持したポインタ変数が生きてる場合は検出しませんが,解放してない領域のアドレスが手の届かないとこにいっちゃってfreeできない場合に有効みたいです.要するにこの書き方だと解放されずに上書きされたもののみ検出します.(0) 準備
define GC_DEBUG include "gc.h" define malloc(n) GC_MALLOC(n) define calloc(m,n) GC_MALLOC((m)*(n)) define free(p) GC_FREE(p) define realloc(p,n) GC_REALLOC((p),(n)) define CHECK_LEAKS() GC_gcollect()デバッグ用に上の文を書いときます.プログラム内でmallocした領域がBoehmの管理下に入ります. ちなみにこれを導入したプログラムをgccでコンパイルするときのオプション例は以下.
gcc -o TS TS.c -I/usr/local/include -L/usr/lib -lgc
int main(void)
{
GC_find_leak = 1;
int i; int *p;
for(i=0;i<100;i++){
p = (int *)malloc(100*sizeof(int));
}
exit(0);
return 0;
}
GC_find_leak=1は ぐるポ検出モードです.
return の前に exit してるのは return した瞬間にガベコレが働いていろいろうるさかったからです.Let Mr.Exit shut him upということです.
とりあえずこれでちゃんと検出できました.やったね!v(^o^)v
実行結果はリークポイントが行数で表示されます.長いので端折りますが. ちなみにループが1回だと検出はしません.
(2) freeしないvoidのmalloc用関数を呼び出してみよう
void isalloc(int n)
{
int *p;
p = (int *)malloc(n*sizeof(int));
}
int main(void)
{
GC_find_leak = 1;
int i;
for(i=0;i<100;i++){
isalloc(100);
}
exit(0);
return 0;
}
検出.これはループ呼び出し1回だけでも検出します.
(3) (2)のプログラムでちゃんとfreeしてみよう
void isalloc(int n)
{
int *p;
p = (int *)malloc(n*sizeof(int));
free(p);
}
検出せず.void isalloc(int n)
{
int *p;
static int num_hist=0;
static int **p_hist;
p = (int *)malloc(n*sizeof(int));
p_hist = (int **)realloc(p_hist, sizeof(p_hist)+n*sizeof(int *));
p_hist[num_hist++] = p;
}
これも検出せず.役立つのか微妙ですが興味ある人はお役立てください.
2012年11月10日土曜日
対話式デバッガ: GDB
バグを取る、つまりデバッグの手段として一番シンプルな方法は恐らく文を出力することだと思います。
怪しい変数の値を出力させたり、途中でプログラムが止まってしまう場合は怪しい処理の前後で文を出力させたりなど。
それ以外にも、 この記事やこの記事の方法を使うという手もあります。
実はそれ以外にも方法があるんです!
それは、デバッガを使うということ。
gccやg++にはGDBというデバッグツールが提供されています。
その使い方を今回はご紹介致します。
怪しい変数の値を出力させたり、途中でプログラムが止まってしまう場合は怪しい処理の前後で文を出力させたりなど。
それ以外にも、 この記事やこの記事の方法を使うという手もあります。
実はそれ以外にも方法があるんです!
それは、デバッガを使うということ。
gccやg++にはGDBというデバッグツールが提供されています。
その使い方を今回はご紹介致します。
2012年11月4日日曜日
複素乗算
複素乗算の演算量を減らす方法です。
通常、実数乗算4回+加算2回ですが、実数乗算3回+加算5回にすることが可能です。
一般的に、乗算は演算量が多いため、乗算回数はできるだけ減らすことが良しとされています。
通常、実数乗算4回+加算2回ですが、実数乗算3回+加算5回にすることが可能です。
一般的に、乗算は演算量が多いため、乗算回数はできるだけ減らすことが良しとされています。
complex MulComplex2(complex x, complex y)
{
double temp;
complex z;
temp = y.im * (x.re - x.im);
z.re = x.re * (y.re - y.im) + temp;
z.im = x.im * (y.re + y.im) + temp;
return z;
}
2012年10月29日月曜日
calloc & free
前回のプログラミング輪講で、領域確保の話が出てたので、ついでに使ってる関数の一部をのっけます。(これも、今年卒業した先輩からもらったものをいじっただけですが)
領域確保
領域解放
ここにあるのは、2次元int型用なので、double型・complex型も使いたい場合は、必要なところをint→double or complexに直して作ってください。
ちなみにmallocは領域確保のみですが、callocはmalloc後に初期化してくれます。
領域確保
int **imatrix(int row, int column)
{
int i;
int **x;
x = (int**)calloc(row, sizeof(int*));
for (i = 0;i < row;i++)
x[i] = (int*)calloc(column,sizeof(int));
//cheak
if (x == NULL) {
fprintf(stderr,"out of memory\n");
exit(8);
}
return x;
}
領域解放
void i2dfree(int **p,int row,int column)
{
int i;
for (i = 0; i < row; i++)
free(p[i]);
free(p);
}
ここにあるのは、2次元int型用なので、double型・complex型も使いたい場合は、必要なところをint→double or complexに直して作ってください。
ちなみにmallocは領域確保のみですが、callocはmalloc後に初期化してくれます。
2012年6月7日木曜日
Segmentation fault の原因
コンパイルは通ったのに,いざ実行してみたら"Segmentation fault"の表示.
誰でも一度は通る道だと思います.
慣れてくると,どうやってバグを取り除けばいいかわかってくるかと思いますが,
その原因となることを幾つか紹介していきます.
こんなことを書いちゃうと発生します.
int array[10];
array[15] = 20;
これは明らかに確保していない領域を使おうとしていますよね.
こんな場合だとすぐに見つけられると思いますが,たくさんの配列を使用していて,
forループで内容をいじっている場合などは問題に気づきにくい場合があります.
また,そのforループ自体では"Segmentation fault"が発生せず,不正利用している
アドレスに他のデータが重ならないとエラーが出ない場合があります.
例えば,N=50の時にはエラーが出なかったのに,N=5000にしたら"Segmentation fault"
が発生する.といった具合です.
そうなってしまったら,gdbコマンドや"printf()"を駆使して,
どこでエラーが発生するのか頑張って探しましょう.
基本的には"Segmentation fault"が発生している部分の"前"で
間違いを犯しているはずです.
にくる可能性があって,気をつけなければならないエラーとなります.
エラー自体は単純なもので,二次配列(またはそれ以上)の形で,
大変大きな領域を確保しようとした場合に発生します.
int matrix[3000][2000];
こんな具合で大きな領域を確保しようとした場合に,"Segmentation fault"が
発生します.
この解決法は単純で,配列の領域確保を"動的配列(malloc, calloc)"
で確保してやれば大丈夫です.
int **matrix;
int row = 3000, column = 2000, i;
matrix = (int **)malloc(sizeof (int*) * row);
for(i = 0; i < row; i++){
matrix[i] = (int *)malloc(sizeof (int) * column);
}
これで解決するのですが,"Segmentation fault"が発生する部分より後ろ,
具体的には,関数内において,
void func(...){
printf("check\n");
int matrix[3000][2000];
...
}
と書いた場合に,"check"が表示されずに"Segmentation fault"が発生してしまいます.
これは,1.で示したように"前"の部分を探しても発見できず,発見が遅れるバグです.
気をつけてください.
誰でも一度は通る道だと思います.
慣れてくると,どうやってバグを取り除けばいいかわかってくるかと思いますが,
その原因となることを幾つか紹介していきます.
1,確保していない領域を使おうとしている
これが,ほぼすべての"Segmentation fault"の原因であると思います.こんなことを書いちゃうと発生します.
int array[10];
array[15] = 20;
これは明らかに確保していない領域を使おうとしていますよね.
こんな場合だとすぐに見つけられると思いますが,たくさんの配列を使用していて,
forループで内容をいじっている場合などは問題に気づきにくい場合があります.
また,そのforループ自体では"Segmentation fault"が発生せず,不正利用している
アドレスに他のデータが重ならないとエラーが出ない場合があります.
例えば,N=50の時にはエラーが出なかったのに,N=5000にしたら"Segmentation fault"
が発生する.といった具合です.
そうなってしまったら,gdbコマンドや"printf()"を駆使して,
どこでエラーが発生するのか頑張って探しましょう.
基本的には"Segmentation fault"が発生している部分の"前"で
間違いを犯しているはずです.
2,2次元配列などでかなり大きな領域を確保しようとする
こちらは"Segmentation fault"が発生する位置が,問題を起こしている部分より"前"にくる可能性があって,気をつけなければならないエラーとなります.
エラー自体は単純なもので,二次配列(またはそれ以上)の形で,
大変大きな領域を確保しようとした場合に発生します.
int matrix[3000][2000];
こんな具合で大きな領域を確保しようとした場合に,"Segmentation fault"が
発生します.
この解決法は単純で,配列の領域確保を"動的配列(malloc, calloc)"
で確保してやれば大丈夫です.
int **matrix;
int row = 3000, column = 2000, i;
matrix = (int **)malloc(sizeof (int*) * row);
for(i = 0; i < row; i++){
matrix[i] = (int *)malloc(sizeof (int) * column);
}
これで解決するのですが,"Segmentation fault"が発生する部分より後ろ,
具体的には,関数内において,
void func(...){
printf("check\n");
int matrix[3000][2000];
...
}
と書いた場合に,"check"が表示されずに"Segmentation fault"が発生してしまいます.
これは,1.で示したように"前"の部分を探しても発見できず,発見が遅れるバグです.
気をつけてください.
2012年4月27日金曜日
.texのコンパイルと.bibの使い方
texは論文等を書く研究者にとって,美しい文章を作るために必要不可欠なソフトである.
現在我らがochiailabではTeXShopの利用を推奨している.コンパイルするには.texファイルをアイコンにドラッグし,タイプセットを押すだけという大変シンプルなものである.しかしながら,実は設定がうまく行ってなかったりすると,文字コードや関連付けの事情によりエラーを起こしてしまい,「わけわからん!!」と憤慨することとなる.
このようなことに対応するために,.texファイルをiTerm上のコマンドを打ち込むことでコンパイルする方法を紹介したいと思う.同時に,.bibファイルを作ることで,参考文献の簡単な参照の仕方も説明する.これを使うことにより,いちいち論文ごとに参考文献を最適に並べ替えたり,使用していない文献をコメントアウトしたりすることが必要なくなるので,是非活用してもらいたい.
まず,普段通り.texファイル( test.tex )とそれをコンパイルするのに必要な.cls( ieicej.cls )ファイルなどを同じフォルダに用意する(ここでは test folder に入れることとする).また,.bibファイルを使うために今回は"IEEEtran.bst"も用意しよう.
ここで,test.texとieicej.clsの文字コードが "utf-8" となっているか確認する.emacsを使っている人は,そのファイルを開き,
C-x RET f (Controlとxを同時押しー>リターンー>f)
と打ち込むと文字コード入力待機状態となるので,
utf-8 RET
と打ち込もう.こうすることで文字コードを"utf-8"に変えることができる.
つぎに,.bib(test.bib)ファイルを作ろう.ファイルの中身はこんな感じ.
@article{Thomas,
author = {C. M. Thomas and M. Y. Weidner and S. H. Durrani},
title = {{Digital Amplitude-Phase Keying with MAry Alphabets}},
journal = {IEEE Transactions on Communications},
volume = {22},
year = {1974},
pages = {168--180},
issue = {2},
doi = {10.1109/TCOM.1974.1092165},
masid = {1458543}
}
「……なんだこれ」と感じるかもしれないが,これはひとつの文献に関する情報をまとめたもので,このまとまりを自分が参照したい文献についてそれぞれ作って.bibファイルに書き込んでいく.「こんなのだるいわー」というそんなあなたも大丈夫.これはネット上で自動生成することができる.
そのやりかたの一つとして,"Microsoft Academic Search"という検索エンジンで,その文献を検索する方法がある.今回は『Digital Amplitude-Phase Keying with MAry Alphabets』を検索してみよう.するといくつか候補が出てきて,今回は一番上に目的の文献が出てきた.このページに飛んでみると,
こんなページが出現する.ここで文献名の横にある『Export』をクリックしてみてほしい.そうすると,
こんな感じで,先ほど.bibファイルに書き込んでいた情報が現れる.これをCopy&Pasteするといい.ここで,書き込んだあとに,\cite{Thomas}でこの文献を参照できるように,ラベル付けをする必要がある.これは.bibファイルの例で示したように一行目の赤色の部分に"Thomas,"と書き込むだけでよい.
こうすることによって,.bibファイルを作る.そのあと,.texファイルにこれを参照するための文章を書き込む.
\bibliographystyle{IEEEtran}
\bibliography{test}
この文章はいつも参考文献を書いている一番最後の部分に書き込めばいい."test"とかいてある部分は,参照する.bibファイルの名前を入れればいい.あとはいつものように\cite{***}によって,文献を参照するだけである.
ここまでできたら,コンパイルをはじめる.まずCurrent directoryをtestにし,そこから以下のコマンドを入力していく.
test > platex test.tex
test > bibtex test
test > platex test.tex
test > dvipdfm test.dvi
test > dvipdfm test.dvi
これで自動で順番を並び替えて参照されているtest.pdfができているはずだ.
これを活用してみんなで論文をどんどん書いていこう!
現在我らがochiailabではTeXShopの利用を推奨している.コンパイルするには.texファイルをアイコンにドラッグし,タイプセットを押すだけという大変シンプルなものである.しかしながら,実は設定がうまく行ってなかったりすると,文字コードや関連付けの事情によりエラーを起こしてしまい,「わけわからん!!」と憤慨することとなる.
このようなことに対応するために,.texファイルをiTerm上のコマンドを打ち込むことでコンパイルする方法を紹介したいと思う.同時に,.bibファイルを作ることで,参考文献の簡単な参照の仕方も説明する.これを使うことにより,いちいち論文ごとに参考文献を最適に並べ替えたり,使用していない文献をコメントアウトしたりすることが必要なくなるので,是非活用してもらいたい.
まず,普段通り.texファイル( test.tex )とそれをコンパイルするのに必要な.cls( ieicej.cls )ファイルなどを同じフォルダに用意する(ここでは test folder に入れることとする).また,.bibファイルを使うために今回は"IEEEtran.bst"も用意しよう.
ここで,test.texとieicej.clsの文字コードが "utf-8" となっているか確認する.emacsを使っている人は,そのファイルを開き,
C-x RET f (Controlとxを同時押しー>リターンー>f)
と打ち込むと文字コード入力待機状態となるので,
utf-8 RET
と打ち込もう.こうすることで文字コードを"utf-8"に変えることができる.
つぎに,.bib(test.bib)ファイルを作ろう.ファイルの中身はこんな感じ.
@article{Thomas,
author = {C. M. Thomas and M. Y. Weidner and S. H. Durrani},
title = {{Digital Amplitude-Phase Keying with MAry Alphabets}},
journal = {IEEE Transactions on Communications},
volume = {22},
year = {1974},
pages = {168--180},
issue = {2},
doi = {10.1109/TCOM.1974.1092165},
masid = {1458543}
}
「……なんだこれ」と感じるかもしれないが,これはひとつの文献に関する情報をまとめたもので,このまとまりを自分が参照したい文献についてそれぞれ作って.bibファイルに書き込んでいく.「こんなのだるいわー」というそんなあなたも大丈夫.これはネット上で自動生成することができる.
そのやりかたの一つとして,"Microsoft Academic Search"という検索エンジンで,その文献を検索する方法がある.今回は『Digital Amplitude-Phase Keying with MAry Alphabets』を検索してみよう.するといくつか候補が出てきて,今回は一番上に目的の文献が出てきた.このページに飛んでみると,
こんなページが出現する.ここで文献名の横にある『Export』をクリックしてみてほしい.そうすると,
こんな感じで,先ほど.bibファイルに書き込んでいた情報が現れる.これをCopy&Pasteするといい.ここで,書き込んだあとに,\cite{Thomas}でこの文献を参照できるように,ラベル付けをする必要がある.これは.bibファイルの例で示したように一行目の赤色の部分に"Thomas,"と書き込むだけでよい.
こうすることによって,.bibファイルを作る.そのあと,.texファイルにこれを参照するための文章を書き込む.
\bibliographystyle{IEEEtran}
\bibliography{test}
この文章はいつも参考文献を書いている一番最後の部分に書き込めばいい."test"とかいてある部分は,参照する.bibファイルの名前を入れればいい.あとはいつものように\cite{***}によって,文献を参照するだけである.
ここまでできたら,コンパイルをはじめる.まずCurrent directoryをtestにし,そこから以下のコマンドを入力していく.
test > platex test.tex
test > bibtex test
test > platex test.tex
test > dvipdfm test.dvi
test > dvipdfm test.dvi
これで自動で順番を並び替えて参照されているtest.pdfができているはずだ.
これを活用してみんなで論文をどんどん書いていこう!
2012年4月2日月曜日
プログラミングへの第一歩
ここでは研究室に入りたてのメンバー向けにプログラムの作り方を紹介します。
まずは作業用フォルダを作りましょう。
自分のホームフォルダ直下に置いた方がやりやすいです。
あと名前は英語で。
ここでは"programming"とでもしておきます。
次にソースコードを書きます。
研究室のメンバーなら最初はEmacsを使って書くことになります。
Emacsを開いたら次のコマンドを入力します。
C-っていうのはCtrlボタンを押しながらってことです。
そしたらEmacsの下の細長いウィンドウにファイル名を入力します。
入れたらEnterで決定。
すると"programming"フォルダに"hello.c"というファイルが出来ます。
ここからソースコードを書きます。
とりあえずは例として以下のようなソースコードを書いたことにします。
このコマンドはこまめにやっておいたほうがいいです。
そしたら次はiTermを起動します。
以下のように入力。
実行するにはiTermで以下のように入力。
以上のような方法で簡単なプログラムが作れるようになります。
あとはEmacsのコマンドを覚えたり、ソースファイルが多くなってきたら分割コンパイルなどを駆使して効率よくプログラミングをしましょう。
まずは作業用フォルダを作りましょう。
自分のホームフォルダ直下に置いた方がやりやすいです。
あと名前は英語で。
ここでは"programming"とでもしておきます。
次にソースコードを書きます。
研究室のメンバーなら最初はEmacsを使って書くことになります。
Emacsを開いたら次のコマンドを入力します。
C-x C-f
C-っていうのはCtrlボタンを押しながらってことです。
そしたらEmacsの下の細長いウィンドウにファイル名を入力します。
Find file: ~/programming/hello.c
ファイル名は例です。入れたらEnterで決定。
すると"programming"フォルダに"hello.c"というファイルが出来ます。
ここからソースコードを書きます。
とりあえずは例として以下のようなソースコードを書いたことにします。
#include <stdio.h>
int main(void){
printf("Hello, World!¥n");
return 0;
}
これを以下のように保存。
C-x C-s
このコマンドはこまめにやっておいたほうがいいです。
そしたら次はiTermを起動します。
以下のように入力。
~> cd programming
programming> gcc hello.c -o hello
これで"programming"フォルダに"hello"という実行ファイルが作成されます。programming> gcc hello.c -o hello
実行するにはiTermで以下のように入力。
programming> ./hello
これで例の文章が出力されれば成功です。以上のような方法で簡単なプログラムが作れるようになります。
あとはEmacsのコマンドを覚えたり、ソースファイルが多くなってきたら分割コンパイルなどを駆使して効率よくプログラミングをしましょう。
登録:
投稿
(
Atom
)

