ラベル 研究初心者向け講座 の投稿を表示しています。 すべての投稿を表示
ラベル 研究初心者向け講座 の投稿を表示しています。 すべての投稿を表示

2014年1月14日火曜日

8階に最も速くたどり着く方法









新年あけましておめでとうございます。

8階に最も速くたどり着くには、7階でエレベータを降りて全力で階段を駆けあがればい

いです。

では。


2013年8月18日日曜日

iTermからFinderへ


http://cdn.rottmann.net/wp-content/uploads/2013/03/logo.png



おはようございます。

iTermのディレクトリをFinderに表示させるコマンドを紹介します。

有名かもしれませんが、僕は初めて知りました。

open .

です。


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/

あまり使いこなせていませんが,以下の特徴が挙げられます.

  • 論文の情報を自動で認識 (タイトル,著者…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日日曜日

FAQ C言語

C言語で疑問をもつとグーグル先生に相談する方も多いと思いますが、教科書的なものをみつけたのでこちらも参考にすると知識が深まりそうです。

FAQ


*ただし、ちょっと古いです。


2012年11月26日月曜日

ドットインストール

アプリ一発当ててやろうという声を聞いたような気がするので、新たな言語を始めるときにおすすめのサイトを共有します。

3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストール

お手すきの際に是非どうぞ。




2012年11月23日金曜日

“蒸しタオル”のススメ

Ochiai Labの皆さんはきっと昼も夜もなく四六時中、24時間ずっとプログラムを書き続けていることと思います。しかし、それでは目に優しくありません。そこで、目のケアに効果的な“蒸しタオル”を紹介したいと思います。


2012年11月20日火曜日

ショートカットキー覚えたい人向け情弱ツールのご案内

ショートカットキーマスターへの道を手助けしてくれるアプリがあります。

これでMacのショートカットは完璧!全てのアプリのショートカットをCommand長押しで表示する『CheatSheet』


このアプリを起動しなくなった時、あなたは晴れてショートカットキーマスターと呼ばれていることでしょう。

2012年11月14日水曜日

メモリリークを調べる

ぐるぐるまわるプログラムを書いてるとだんだんメモリ使用量が増えてくポップな現象いわゆるメモリリークが起きることがあるので調査可能なBoehm GCというライブラリを紹介します.

○ インスコ

Boehm GCのソースはここにあります.
./configure → make → make install のコンボでインストールできます.

○ 使う

4個くらいのナンセンスなプログラムを例にぐるメポップの見つけ方の例を示します.

(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

(1) ループ内でmallocしたアドレスを何度も同じポインタ変数に代入しよう
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);
}
検出せず.

(4) (2)のプログラムで取得した領域をstaticなポインタ配列に代入して保持しよう
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;
}
これも検出せず.

ということで,領域のアドレスを保持したポインタ変数が生きてる場合は検出しませんが,解放してない領域のアドレスが手の届かないとこにいっちゃってfreeできない場合に有効みたいです.要するにこの書き方だと解放されずに上書きされたもののみ検出します.

役立つのか微妙ですが興味ある人はお役立てください.

2012年11月10日土曜日

対話式デバッガ: GDB

バグを取る、つまりデバッグの手段として一番シンプルな方法は恐らく文を出力することだと思います。
怪しい変数の値を出力させたり、途中でプログラムが止まってしまう場合は怪しい処理の前後で文を出力させたりなど。

それ以外にも、 この記事この記事の方法を使うという手もあります。

実はそれ以外にも方法があるんです!
それは、デバッガを使うということ。
gccやg++にはGDBというデバッグツールが提供されています。
その使い方を今回はご紹介致します。



2012年11月4日日曜日

複素乗算

複素乗算の演算量を減らす方法です。

 通常、実数乗算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

前回のプログラミング輪講で、領域確保の話が出てたので、ついでに使ってる関数の一部をのっけます。(これも、今年卒業した先輩からもらったものをいじっただけですが)

領域確保
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"の表示.
誰でも一度は通る道だと思います.

慣れてくると,どうやってバグを取り除けばいいかわかってくるかと思いますが,
その原因となることを幾つか紹介していきます.

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ができているはずだ.
これを活用してみんなで論文をどんどん書いていこう!







2012年4月2日月曜日

プログラミングへの第一歩

ここでは研究室に入りたてのメンバー向けにプログラムの作り方を紹介します。

まずは作業用フォルダを作りましょう。
自分のホームフォルダ直下に置いた方がやりやすいです。
あと名前は英語で。
ここでは"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"という実行ファイルが作成されます。
実行するにはiTermで以下のように入力。
programming> ./hello
これで例の文章が出力されれば成功です。

以上のような方法で簡単なプログラムが作れるようになります。
あとはEmacsのコマンドを覚えたり、ソースファイルが多くなってきたら分割コンパイルなどを駆使して効率よくプログラミングをしましょう。