ラベル 開発環境 の投稿を表示しています。 すべての投稿を表示
ラベル 開発環境 の投稿を表示しています。 すべての投稿を表示

2014年11月28日金曜日

プログラミング初心者が中級者になるために学ぶべき4つの開発ツール


プログラミングの生産性はプログラマによって大きく異なります。
生産性の差というのはアルゴリズムや言語の知識、才能など様々ありますが、その中で最も効率よく、素早く改善出来るのは開発ツールの習得でしょう

開発ツールは世の中に五万とあり、様々な用途に合わせて作られています。

それらのツールを習得しているということはプログラマとしての能力そのものと言えるでしょう。

そして、天才的なプログラマでも意外とツールを良く理解していないことがあります。彼らに対してアドバンテージを取れるという意味でも開発ツールを学ぶ価値は非常に大きいです。


ここでは個別のツールに限定するのではなく、広くどのようなツールを、どのように学ぶべきなのかを議論したいと思います。




1. IDE (統合開発環境)



ex. Eclipse, Visual Studio

多くのプロジェクトにおいて、IDEはプログラミングの殆どの時間、開いているものです。
これを良く理解しているということがプログラマにとって重要であることは間違いありません。

しかし、「IDEを習得する」とはどういうことでしょうか。
IDEの利便性を最大限に引き出すためには以下の2点を習得する必要があるでしょう。

1. ショートカットキーを覚える

IDEは思った以上に沢山のショートカットキーが存在します。
いちいちGUI上でクリックするのではなくショートカットを利用するだけで作業効率は一段と上がります。

ビルドやデバッグなどの非常に頻繁に使うショートカットはすぐに覚えますが、それほど頻繁ではないショートカットの場合、自分で意識して使うようにしないと覚えられないものです


2. ビルドプロセスを理解する

IDEを自在に操れる人というのはIDEがその内部で何をやっているのかを理解しているプログラマです。

多くのIDEはMakefileに相当するものを自動生成することでプロジェクトのビルドを自動化しています。

この自動生成されるMakefileに凡そどのような内容が書かれているのかを理解すると様々な自動化が可能になります

例えばIDEが行っているビルドをそのままスクリプトにまとめることでテストビルドを自動化することが出来ます。

 

2. テキストエディタ



ex. Vi, Vim, Emacs

テキストエディタはあらゆる場面で使う、プログラマ・エンジニアの根幹となる武器です。
プログラマにとって優良なテキストエディタを習得するということは、日本人にとって日本語を習得するということと同義です

テキストエディタの習得において最も大切なことはショートカットを覚えることです。そもそもテキストエディタを開く目的自体、あるコマンドを実行することである場合もあるでしょう。

ちなみにテキストエディタとしてはViかEmacsをおすすめします。
これらはコマンドライン上で使え、ショートカットが豊富であり、またシェアが大きいからです。

十中八九、一生使えるツールになるでしょう。



 

3. Git (バージョン管理ツール)



ex. Git, Subversion (ここではバージョン管理ツールとして)

時々Gitは不必要に複雑だ、という方がいます。

複雑かもしれませんが、不必要なものではありません。


そもそも、バージョン管理はいかなる種類のソフトウェアにおいても重要なものです。
個人で開発する場合でも、過去のコードというのは常に取っておくべきものであり、また開発の途中で「やっぱりPlan AじゃなくてPlan Bにしよう」という時にPlan Aに取りかかる前の状態にコードを戻すことが出来ます。

これを手動でやろうとして失敗した方は多いと思います。

バージョン管理を丁寧に行うだけで作業の効率は格段に上がります

Gitとは全てのプログラマが習得すべきツールです。


また、Gitは絶対にコマンドライン上で扱うべきです
確かにGUIも有用ですが、GUIはそのままでは自動化出来ないという致命的な欠点を持っています。

Gitのcommitやpushというのはめんどうな作業であるので、だからこそそれらを自動化することでそれらの作業を単純化することが出来るのです。



 

4. スクリプト言語



ex. Perl, Ruby, Python

これまでのツール紹介でも繰り返し自動化と言ってきました。

自動化というのは開発ツールの本質の一つでしょう。

そして、どれだけ自動化出来るかというのは、プログラマの能力のかなり精確なベンチマークであるでしょう

それらの自動化を担当するのがスクリプト言語です。

スクリプト言語の代表はPerl, Ruby, Pythonでしょう。

スクリプト言語は本質的に「上から順に実行する」というものなので、自動化というものととても相性がいいのです。また、そもそもスクリプト言語は書くのが簡単であるということもあります。






これらの開発ツールを習得し、高い生産性と知識を得ればいち早く初級者から中級者になれるでしょう。


そもそもプログラミングとは効率向上・自動化の為のものです。

それを、プログラミングという活動自体に適用するということが中級者以上に求められる技能とも言えましょう。

2014年9月21日日曜日

テキスト処理の為に学ぶべき4つの技術

テキスト処理を学ぶべき理由 

コードに限らず、テキストは常に扱う対象になります。
コードを書くことには熱心でもテキスト処理を学ぶことに熱心ではない方は結構います。
しかし、テキストはコードと同様に学ぶべき対象なのです。その理由を2点説明します。

 1. ルーチンワークからプログラミングへ

ログやデータの解析はルーチンワークではありません。

テキストとしてのデータは人間が読める対象である場合が殆どでしょう。
人間が読めるデータですから、一行ずつ直接データを読み、必要な作業を手で行うことはできます。
しかしこれはひどく退屈なルーチンワークにしかなりません。
テキストをプログラミングの対象として扱う方法や技術を学ぶことでルーチンワークを排して楽しいプログラミングをすることが出来ます

2. プログラマの生産性を向上させる

テキスト処理は手作業でやろうとすると思う以上に時間がかかるものです。
プロジェクト全体のコメントのフォーマットを変更する、などは手作業でやることも出来ますが、手作業だと変更し忘れるファイルがあったりすることは良くあります
チェックの時間も含めると手作業による効率はあまりよくないことが分かると思います。




以下で紹介する技術は全て一朝一夕で出来るものではありません。むしろ一生かけて学ぶものの一つを紹介することを目的に記事を書きました。
しかし前述のようにこれらの技術は一生使うに能う理由があります。
是非触って見てください。



1. テキストエディタ



当然ですがテキストエディタを扱うということは最も重要なことになるでしょう。

しかし、テキストエディタは熟練度による生産性の差が明瞭に表れるものの一つでしょう。
ViやEmacsなどのエディタは単純に文字を一つずつ打つという機能だけではありません。
文字列置換や様々なユーティリティがあり、また様々なショートカットキーがあります。
これらの機能は直感的ではない所が結構あったりします。それはこれらのキーが熟練者に最適であるようにデザインされているからであり、入門しやすいようになっている訳ではないからです。
この点が多くのIDEや商業ソフトウェアのUIとの違いでしょう。

入門が簡単なエディタと、熟練者にとって最適なエディタ。
一生プログラミングを続けるなら、どちらを選ぶべきかは自明でしょう。


2. awk

テキスト処理と言えばawkです。
awkはテキスト処理だけの為に開発されたという男らしいプログラミング言語です。manページも3ページしかありません。しかしテキスト処理という点に関しては不足のない言語です。

awkの基本的なアルゴリズムはパターンマッチングです。
入力テキストを行毎に読み込み、その行がパターンに合致していたら処理を行う。
これを最終行に行くまで繰り返す。

非常に簡潔で明解な言語です。文法も簡潔なので殆どの処理は一行(one liner)で済ませることが出来ます。

awk '/error/{print $1, $2}'

とすればerrorの文字列を含む行の1番目、2番目の語を出力するという処理になります。

awkは特にデータの解析に有用です。
gnuplotなどにデータを流し込む前の前処理を行ったり、統計値を取ったり、 データからデータを取り出すような処理に対して威力を発揮します。


参照リンク

The GNU Awk User's Guide
フルドキュメント。非常に詳解なので困ったらこれを見ればいいでしょう。

AWK入門(ドットインストール)
awkの入門の為ならこちらをお勧めします。awkのしっかりとした言語であるという側面と、簡単に記述できるという側面の両方を見ることが出来ます。



3. grep

grepは文字列検索の為のコマンドです。
作業のチェックやログの解析などに用いられます。

例えばプログラム中に埋め込んだTODO:をすべて読み込むには

grep -n TODO: main.cpp

とすれば

118:        // TODO: Array of dynamic sized objects.
124:        // TODO: temporal buffer to store nodes from income buffer.
147:            // TODO: Get nodes from income buffer and put it into open list.
170:            // TODO: minf(int f):
221:            // TODO: incumbent solution.
223:                // TODO: For some reason, sometimes pops broken node.
245:                //                TODO: need it to be atomic.
277:                // TODO: Push items to thread safe income buffer.
289:                // TODO: trylock
372:        // TODO: Time to printing these texts are included in the walltime.
377:        // TODO: pack to a method

のように出力され、進捗状況が概観するのに使えます。
awkと比較すると、grepは出力を編集するためのものではなく、インタラクティブに、テキストがどうなっているのかを把握するために使いやすいように思います。

grepによるパターンの検索(Oracle)


4. Ruby or Python

やや大規模なテキスト処理を行う場合、シェルスクリプトやawkでは表現力が足りなかったり、あるいは読みやすいコードにならない場合があります。しかしテキストデータに対してC++やJavaで書くのはオーバーキルな場合が多いです。

RubyやPythonのような言語を理解しているとこういうちょっとしたプログラムを実装するのにも役に立ちます。





先に述べましたように、これらの技術は小手先技ではなく、一朝一夕に得られるものではありません。しかしスケールアップしていくものです。
一生使える技術を学びましょう。




2014年9月5日金曜日

Windows版Guake, Qonsoleの使い方

以前紹介しましたGuakeのWindows版, Qonsoleを紹介します。
Qonsole Icon


QonsoleはWindows上でドロップダウン式に呼び出すことの出来るターミナルです。見た目はこんな感じ。




デフォルトではWin+Cでターミナルを呼び出すことが出来ます。
Windowsのターミナルといえばコマンドプロンプトですが、他のターミナルも呼び出すことが出来ます。こんな感じの画面で設定できます。
コンソールの大きさ、透明度、シェルの種類、呼び出しコマンドなどなど、自由にカスタマイズすることが出来ます。



Windowsではターミナルを使わない、と言う方もいるかと思います。まぁUnixと比較して使い辛いことは間違いないでしょう。しかしGUIよりもCUIの方が効率が良い場面はいくらでもあるでしょう。Qonsoleは非常に手軽に起動出来ますから、これを機会にWindowsにも触ってみてはいかがでしょうか。

2014年5月24日土曜日

プロファイラを使ってみよう

プロファイラって使ってますか?

なんか思ったよりもっさり動いているなぁという時に思いつくがままに改良してみて、あまり上手くいかないというのは、改良している部分がプログラムのボトルネックではないからです。

しかしプログラムの中のどの部分が時間を食っているのかは分かりづらいこともあります。

そこで便利なのがプロファイラ。
プロファイラは実行されたプログラムの関数ごとの計算時間、呼び出し回数などなとを計測するかなり便利な代物です。

ここでは例としてgnuのg++プロファイラ、gprofの使い方を説明します。
使い方の手順としては、


1. -pgオプションをつけてコンパイルする。 
g++ -pg main.cc

2. 実行する。 
./a.out

3. gprofを実行する。
gprof a.out


とするだけでプログラムの各関数の消費時間が空間的に理解できるように表示されます。

gprof出力の全文を載せるとちょっと詳細過ぎるのでここでは一番に見るべき情報に絞ります。

Flat profile: 各関数で結局どのくらい時間がかかったのか。
Call graph: 各関数がどのように他の関数から呼ばれたか。


Flat profile:

Each sample counts as 0.01 seconds.
%        cumulative self           self    total
time  seconds       seconds calls  s/call  s/call  name
67.15 30.77         30.77     2    15.39  23.14    f2
33.82 46.27         15.50     1    15.50  15.50    f1
0.07   46.30         0.03                          main

Call graph (explanation follows)

granularity: each sample hit covers 2 byte(s) for 0.02% of 46.30 seconds

index   %time        self  children  called  name

[1]     100.0        0.03   46.27             main [1]
                     30.77  15.50     2/2      f2 [2]
-----------------------------------------------------
                     30.77  15.50     2/2      main [1]
[2]     99.9         30.77  15.50     2      f2 [2]
                     15.50   0.00     1/1      f11 [3]
----------------------------------------------------
                     15.50   0.00     1/1      f2 [2]
[3]        33.5      15.50 0.00       1      f1 [3]
-----------------------------------------------
この辺りを見ればどの関数を手直しすべきか分かると思います。
プロファイラはユニットテストみたいに使うと便利なんじゃないかと思います。
つまり、


1. コードを改善する。

2. 実行してプロファイラにかける。

3. プロフィールを分析し、次に改善すべき関数を決める。


のイテレーションを行えば効率良く質の高いコードがかけます。

とにかくはしから改善していけばいいじゃないか、という考えもありますが、アムダールの法則をみるに、ボトルネックとなっている関数から改善するという考えの方がプログラマ的なんじゃないかなと思います。

複数人の開発なら端から改善していく、TOYOTA生産方式というのは有用でしょうが、一人の開発の場合資源の投下場所は考慮すべきでしょう。

2014年4月26日土曜日

一人の開発でもGitを使おう

Gitを使っていますでしょうか?

Gitは版管理システムというものの一つで、簡単に言うとチームで開発するときにコードがこんがらがらないように一ヶ所にまとめて管理し、かつ各々が自由に開発できるという便利なシステムです。

元々はLinux開発の為にリーナスが一週間かけて開発したシステムだそうです。ので多くのオープンソースで使われております。つまり、オープンソースのように不特定多数の開発者間でも開発することを可能にする、頑強なシステムになっています。

そうすると一人の開発で使うものじゃないと思われるかもしれませんが、実はこれは一人での開発にも非常に役立ちます。どういうことかというと、例えば一ヶ月前・一ヶ月後の自分なんて他人もいいところだということです。

自分で書いたコードでもちょっと前のものだとよく分からなくなるというのはよくあることだと思います。また、ある変更を加えた後にやっぱり変更前のものの方が良かった、ということもあるでしょう。テキストエディタなら結構履歴が残っているものですが、この時点に戻したい、というのを探し出すのはかなり時間がかかります。加えてそれが複数のファイルに跨る変更だった場合、ファイル間の変更も同期させないといけない訳ですから、これは非常に面倒ですね。

そこで便利になるのが版管理システム、Gitです。単独での開発においてもGitを使うと何が便利なのかというと、


・「ここの時点のコードに戻したい」というのをすぐに戻せる。

・複数のファイルを同期して戻すことが出来る。

・GitHubにあげれば色んなパソコンで共有出来る。

などがあげられます。


ただ、Gitは使い方が難しいということで敬遠されがちです。最低限必要なコマンドが結構あり、かつコマンドの順序が定まっている部分もあります。ので習熟に時間はかかるでしょう。

なぜ難しいのか。それは「正しい使い方を簡単に、間違った使い方を困難に*」というインターフェイスの原則に従っているからです。つまり、何でもかんでも制御可能にしてしまうと共同開発には使えない訳です。ので、望ましくないコマンドを受け付けないことで頑強性を実現していると言う訳です。そして、一度正しい使い方を理解すれば非常に簡単に版管理システムを使うことが出来ます

最近では非常に明解なGUIが整備されています。WindowsならTortoiseGit, Linuxならcola-gitとか。

いずれどこかで使いますし、ここで覚えてしまっては如何でしょうか。



・参照リンク
Windows用GUI:TortoiseGitの使い方
サルでもわかるGit入門

Gitの構造・システムについて解説されている、入門Git。
サルでもわかるGit入門はコマンドの使い方等の説明は非常に丁寧なので慣れたらこれを読めばいいと思いますが、UIの説明に重心が寄っていて、Gitというシステム全体についての解説が薄いように思えます。Gitの設計を知ることこそGitを習熟する肝だと思うので、この本をお勧めします。





*「正しい使い方を簡単に、間違った使い方を困難に」というのはプログラマが知るべき97のことより。





2014年4月24日木曜日

ドロップダウン式ターミナル Guake

GuakeはLinux上でドロップダウン式に呼び出すことの出来るターミナルです。
F12ボタンを押すと非常に素早くターミナルウィンドウを呼び出すことが出来ます。


Guakeのよい所をざっとあげると、

F12を押すとすぐに出てくるので、他の作業をしているときにふとターミナルで操作をしたくなったときにパッと呼び出せる

・もう一度F12を押せばプロセスを切断せずにターミナル画面を引っ込められる

・ウィンドウが半透明なのでノートPCなどの小さいディスプレイでも扱いやすい


といった感じです。

特にターミナルを使い慣れていない方にお勧めします。なぜなら慣れていない人は、私もですが、ターミナルに慣れていないと「あれ、これどうやるんだっけ」と言ってgoogle検索しながら操作をするわけです。そうするといちいち画面を切り替えるのも面倒ですし、Referenceを見ながら作業をしたいという訳です。

そこでこのGuakeを使うと、さくさくと画面を切り替えられるし、必要に応じて半透明な画面を利用してWebページを確認しながらターミナルを操作することが出きるという訳です。


如何でしょうか。こうしたちょっとした工夫・イノベーションで開発効率は大きく変わると思います。


参照リンク
GuakeのGitHub
Wiki
デモ