Search on the blog

2010年5月29日土曜日

subversion

今日、subversion(svn)と言われるツールをPCに導入した。
最初は、Eclipseのプラグインとして提供されているsvnをインストールしようかと思ったが、基本的な概念を理解するために、コマンドライン版のsvnをインストールした。

まず、svnって何っていう方のために簡単な説明をしよう。
svnとは、バージョン管理システムの一つである。
大人数で一つのシステムを開発する場面では、自分が更新していたファイルが知らぬ間に他の誰かにも更新されていて修正内容が競合してしまったりだとか、システムが致命的なバグで動かなくなった場合に”あの時のあの状態”に戻したいとかいった場面によく出くわす。
これを解決してくれるのがバージョン管理システムである。
つまり、svnとは、システムのチーム開発に役立つツールの一種である。

バージョン管理システムには、svnの他に、CVSというソフトもあるが、svnの方が使い勝手がいいようである。
現在、eclipseではCVSが標準で実装されている。
今後、svnが標準で実装される予定があるらしい。(eclipse恐るべし。。便利すぎる。)

svnのインストール方法、使い方については、ググればいろいろ出てくるので、ここでは、理解するのに苦労した概念について少しだけ書きたい。
svnには、trunk、branches、tagという概念が存在する。これらは、もともとはCVSの名残のようだが、この3つが何なのか概念的に説明しよう。
これらの3つの概念は、物理的には、ディレクトリという形で表現される。
  • trunk その名の通り、幹である。trunkとは、メインで開発を進めるためのディレクトリである。普段は、このtrunkにて開発を行うべきである。
  • branches その名の通り、枝である。開発の方向性が複数個に分かれる場合に用いる。例 えば、実装パターンAで開発してきたが、Aで本当にうまくいくのかどうか分から なく なってきた。この場合は、パターンAの開発をtrunkで進めつつ、代替案Bを branchesで開発することになる。また、リリース間近になって新規追加案件が出た時などは、trunkでリリースに必要な開発を進めつつ、それとは別に新規追 加案 件をbranches上で開発するといった場合も考えられる。
  • tag  tagは他の2つとは若干意味合いが違う。tagは”あの時のあの状態”に戻したいと いう要求を叶えるために、ある状態のリソースのスナップショットを保存するため の機能 である。よってtag上で開発を行うのは好ましくない。あくまでも、ある状態 (メジャーリリース、何かの節目など)のコピーを取っておく事が目的である。
と、まあこんな感じである。
ずっと前から試してみたかったsubversionがようやく使えるようになって、今日は大満足だった。
普通なら、会社で使ってるはずだが、うちの会社は何故か未だにエクセルと共用フォルダを使った管理が主流(笑)

2010年5月24日月曜日

Google Code Jam Round1

Code Jam の Round 1 が開催された。
私の結果は以下の通り。


Round 1A 1683位
Round 1B 1128位
Round 1C 1880位

ちなみに、いずれかのラウンドで、1000位以上に入賞できれば、Round2に進出できる。
残念。惜しかった。特にRound 1B。2問解けたのに。。。。

さてさて、残念ながらround 1敗退となったが、学んだことは多い。
来年のcode jamに向けて以下の事をやろうと思う!!!

  1. アルゴリズムの本の通読
  2. 共通処理のモジュール化
  3. Top coderに定期的に参加
  4. Python、C++の勉強

具体的には、以下の通り。
1. computer algorithmsという書籍を購入した。これを読み進めたい。
2. 行列の回転・転置、部分集合の抽出などなどよくありそうな処理をモジュール化しておくことで、実装スピードの向上を図りたい。
3. Top coderのSRM, marathonに定期的に参加したい。コーディングになれることが大切だと思った。
  SRMは、pythonが使用できないので、C++で参加する予定である。marathon matchは、Pythonで 参加を考えている。
4. Python、C++については、文法書を定期的に読むようにしたい。特にC++は暫く使ってないので、早めに勉強しなおそうと思う。

とりあえずは、これだけやって、来年は、Round3出場を目指したい!!

2010年5月16日日曜日

10進数をn進数に変換

Pythonの勉強を始めて、1週間弱。。
ほぼ基本的な構文は、マスターした気がする。

Google Code Jamの過去問で、10進数をn進数に変換するような処理が必要な問題があったので、
これをPythonで作ってみた。
こんな感じ。。

def base10to(n, b):
 if (int(n/b)):
  return base10to(int(n/b), b) + str(n%b)
 return str(n%b)

上記の関数は、10進数nを、b進数に変換し、結果を文字列で返す。
結果は、こんな感じ。
>>> base10to(1, 2)
'1'
>>> base10to(2, 2)
'10'
>>> base10to(9, 2)
'1001'
>>> base10to(23, 5)
'43'
>>> base10to(100, 9)
'121'
>>> base10to(1234, 10)
'1234'

じゃー、逆のパターンも欲しいよなってことで、
n進数を10進数に変換する関数はこんな感じ。

def base10from(num, b):
 n = 0
 numlist = list(num);
 while (numlist):
  n *= b
  n += int(numlist.pop(0))
 return n

上記の関数は、b進数表記のnumを10進数に変換する。
結果は以下のようになった。
>>> base10from('11',2)
3
>>> base10from('13',5)
8
>>> base10from('123',8)
83
>>> base10from('1234',10)
1234

プログラミングコンテストに向けて、いろいろな問題を解いて練習するのはいいことだが、それ以上に、使えるパーツ(自作の関数やクラス)を蓄えておくことが大切だと痛感した今日この頃。。。
自分の引出しは小さすぎるぜ(泣) 学生のとき、もっと勉強しとけばよかったなー(笑)

2010年5月13日木曜日

Pythonすげー@_@ (ループのelse文)

Google Code Jam予選の悲惨な結果を受けて、Pythonの勉強を始めた。
Round 1が開催される2週間前に、新しい言語を選択するなんてちょっと無謀な冒険にも思えたが、そんなことはないようだ。

Pythonすげーー。
何かPythonマスターしたら、何でも簡単に出来そうな気がしてきた。

いろいろ便利な機能があるのだが、今日はループ文のelse文を紹介する。
Pythonはループにelse文を付けることができる。どういう意味か分かるだろうか?

例えば、整数xが素数であれば、"The input value is a prime number." と表示する関数 isPrime(x)をループのelse文を利用して書いてみよう。

def isPrime(x):
for i in range(x-1, 1, -1):
if not x % i:
break
else:
print "The input value is a prime number."

如何だろうか?
ループ文内でbreakを利用し、
  • 与えられた終了条件まで完了してループを抜けたのか
  • breakによってループを抜けたのか
を判断したい場面はしばしばある。else文は、ループが与えられた終了条件を満たして終了した場合(つまり、ループ内の条件が偽になった場合)にのみ実行される。
for文と同様に、while文においてもelseを使用することが出来る。

def isPrime(x):
i = x
while (i-1) > 1:
i = i - 1
if not x % i:
break
else:
print "The input value is a prime number."

これは、今までに勉強してきた言語には無かった機能である。このelse文を使うことで可読性の高い均一的なコードの作成が期待できるのではないだろうか?

2010年5月9日日曜日

Google Code Jam 予選

昨日、Google Code Jamの予選が行われた。
今年のFinal Roundは、映画onceの舞台アイルランドで開催される。
決勝戦に進めるのは、世界の精鋭プログラマー25人のみ。
問題はすべて英語で出題されるという言語の壁を乗り越えて、私は、、風になる。(意味不明)

このプログラミングコンテストに参加するのは、今年が初めてである。
私は、1カ月前から準備を始めたはずだった
Google Code Jamでは、使用する言語は任意である。無償で提供されるものであれば、どの言語を使っても、どんなツールを使っても構わない。
使用経験のある言語は、C/C++、Java、VBA、php。
どの言語を使おうか考えた。
  • Cはテキスト処理に弱い。リストやハッシュが標準で提供されていないため少々面倒だ。
  • C++、Javaは、ライブラリが充実していて機能的には問題ないが、オブジェクト指向という言語の性格上、スピード重視の小規模プログラミングには向かない。
  • phpは、CGI専用というイメージがあったので何となく使いたくなかった。
さて、どうする‥‥。
私が出した結論は、「Perlだ!Perlしかない。」
それから、Google Code Jamに向けて、地獄のPerl修行が始まった。
が、2日で終了(笑)
まあ予選ぐらいは何とかなるだろう。Golden Weekあるし、そこで練習しよう!!
しかし、Golden Weekは、旅行に出かけたり、Google App EngineにはまったりでPerlの勉強はできず。

そして、ついに、運命の予選の日が訪れた。
なんと、本番当日になって、ルールを読み出すというだめっぷり。
とほほのPerl入門を見ながら、問題を解くというだめっぷり。

しかし、神様は、私を見捨てなかった。
今年の問題、か、か、簡単すぎるーーーーー。
特に、問題A。肝となるコーディングは、1行だけ(笑)
Google Code Jamは、各ラウンドA、B、Cの三問から構成され、それぞれの問題は、small setとlarge setと呼ばれる小規模の問題(単純な実装で解ける)、大規模の問題(ひらめきが必要)を含んでいる。
予選ラウンドは、A、B、Cの任意の問題においてsmall set、large set両方に正解すれば突破となる。

私は、とりあえず、Aが解けて満足して、そのあとCに挑戦した。
少し時間はかかったが、Cも解けた。
だが、Perlが、
1000000000000000000
とファイル出力すべき場面で
1.0e+18
と出力していたことが判明。
だが、時既に遅し。
いろいろ調べたが、sprintf()によるフォーマッティングでも解決しないようだ。
数値を文字列にフォーマットすれば、解決するだろうと思ったがどうやらそんな単純なことではないらしい。
数値の表示桁数の設定を指定したりもしたが、これでも無理。
結局、上位桁の数値から逐次出力するような関数を自分で作らないといけないってことか??

ダメだ、ダメだ。
そんなの面倒くさい。
こうなったら、Perl辞めてやる。次は、Pythonだ!!!
本戦に向け、今日から鬼のPython修行が始まるはずだ

2010年5月8日土曜日

とりあえず、インストール。

さてさて、前回のブログでは、Google App Engineの紹介とクラウドの説明を行った。
今回は、インストールして、軽く使ってみた感想を書こうと思う。

現時点では、Google App Engineは以下の2つの言語をサポートしている。
  • Python
  • Java
私は、Javaを選んだ。
使い方は至って簡単、ここのサイトを見れば、簡単なアプリケーションの作成からデプロイメント(配置)までのやり方は載っている。
ただ、この公式サイト、説明不足なところや間違いが数点あるようだ。
これについては、次回書こうと思う。

とりあえず使ってみて思ったことは、Eclipse Pluginを使おうってことだ。
Pluginのインストールはオプションになっているが、ほぼ必須と考えてもらっていいと思う。
Eclipseを持ってない人は、この際、Eclipse入れちゃいましょう!!
私は、生来、何でも一から作りたくなるという頑固オヤジ的な性分があり、たいてい便利なツールというものには不信感を抱ていた。
だが、今回は別だ。これ入れてなかったら、正直、もう力尽きてたかもしれない(笑)
プロジェクトの作成(必要な設定ファイル・適切なディレクトリ構造の構築)とデプロイメントはボタンを押すだけで出来る@_@
ビルドを行うための設定ファイルも自分で作成する必要はない。ボタン一つで、ビルド、開発環境でのテスト実行までが自動で行われる。

もっといろいろ書きたいことがあったのだが、今日はこの辺にしておこう。
今から、Google Code JamのQualification Roundに挑戦しようと思う。
憧れのアイルランドが私を待っている(笑)多分無理

2010年5月7日金曜日

Google App Engine

みなさんは、Google App Engineというものをご存知だろうか。
私は、先日、その存在を勤務先の友人に教わった。

何やら、サーバーアプリをGoogleのサーバーを借りて開発できるらしい。
しかも、サーバーの利用料は無料。。
これは、今流行りのクラウドってやつですね@_@

ってなことで、Google App Engineを初めてみた。
How To的なことや開発を通じて学んだ知識などをこのブログに書いていこうと思う。
とりあえず、3日坊主にならないようにしたい(笑)

今日は、初めての投稿と言うことで、クラウドとは何ぞや?ということを書きたい。
昨今のコンピュータ技術に精通していない人のために、そして、自分自身のために。

簡単に言うとクラウドとは、その名の通り、雲の上からやってくるサービス、もしくはそのサービスを実現するための仕組みである。
従来のITサービスの利用は、ユーザー(利用者)が、自身で、サーバー、ストレージ、データ、ソフトウェアなどを自分で管理していた。ユーザーが大企業にあると、この維持管理の手間・費用はバカにはならない。
そこで、クラウドの登場だ。
ユーザーは、自身で、サーバー、ストレージ、‥などの管理は行わない。
ネットワーク上に存在するブラックボックス上のシステムを利用するだけなのだ。自分の会社に専用のサーバーやデータベースを買う必要もない。面倒な維持管理をする必要もない。
ただ、雲の上からやってくるサービスを使いたいだけ利用して、使った分だけ使用料を払えばいいのだ。
これがクラウドである。

そして、このGoogle App Engineも、クラウドの一種ということができる。
本来、サーバーアプリを構築しようとすると、サーバーマシンを買ってきて、ネットワークの設定をして、データベースを導入して、あっセキュリティも考えないとな…
と、やることが非常に多かった。
私も、学生のときサーバーアプリを作ろうと思ったことがあったが、この手間のせいで、思っただけで終わってしまった(泣)
Google App Engineを使用することで、このサーバーマシンを買ってきて、‥という一連の手間が省略される。開発環境は雲の上に存在するので、開発者はそれを利用するだけである。つまり、アプリケーションの作成に集中できるのである!!
しかも、このGoogle App Engine、法人向けの大規模システムの場合は課金制らしいが、小規模システムの場合は、無料で利用できるらしい。す、素晴らしい。
こういうの、待ってたんだよ★

さてさて、今日はこの辺にしとこう。
最初からとばすと、バテちゃうんでね。