2010年12月31日金曜日

【108番目のきのこ】「学び」は楽しい

 プログラマとは、常に勉強を欠かすことができない仕事です。他の仕事でも「学ぶこと」は当然必要なのでしょうが、進化の早いコンピュータの世界を相手にするプログラマは、やはり多くの勉強が必要な職業であると思います。しかし、中には勉強というものに抵抗を感じ、職務中に得た知識のみで仕事をしている人も少なくありません。少し厳しい言い方をしますが、そのような人々とは一緒に仕事をしたくないな、と思ってしまいます。
 わたしのプログラム歴は、COBOLからスタートしました。COBOLという言語には、汎用機を使って仕事をしていた人々が長年培ってきたノウハウがいろいろあります。わたしが最初に教わったコーディングのお作法は、「自分のやりたい処理と似たような処理をしているプログラムを探し出し、それをコピーして改変しろ」というものでした。わたしは何もこのやり方を批判しているわけではありません。それが、汎用機でCOBOLという言語を使ってプログラムをする際の、ベストプラクティスだったのです。
 そのようなお作法でプログラムを書いているプログラマであれば、確かに職務中に得た知識のみで仕事をしていても良かったのかもしれません。しかし、DRY(Don't repeat yourself)原則が重視される昨今のプログラムの世界において、かつてのCOBOLのようなコピペ駆動開発は一切通用しません。より美しいコードを書くためのお作法は、様変わりしてしまいました。そしてそれは今、この瞬間も進化し続けています。
 コーディングのお作法だけではありません。クライアントアプリケーションとWebアプリケーションでは考え方がまったく異なります。アプリケーション間の通信はSOAPで行うのか、RESTfulにするのか。データはRDBに保存されるのかそれともNoSQLなのか。マルチコアプロセッサが主流となっている今後は、並列処理に関するノウハウの蓄積がより深まっていくでしょう。
 わたしたちは、こういったすべての変化に対して、対応していかなければならないのです。そしてそのためには、職務中に得た知識だけでは不充分なのです。自分の時間を使って、日々勉強しなければいけません。
 勉強と聞くとツラいイメージを抱く人が多いでしょうが、そんな事はありません。学生時代の試験勉強とは違うので、誰もあなたの勉強に口を出したり、叱られたりすることはありません。勉強は自分の世界を拡げる行為です。新たに得た知識は、あなたの着想にそれまでとは異なる息吹を吹き込みます。あなたの書くコードは日に日に美しくなり、品質も向上します。勉強した結果、得られるものは素晴らしい世界です。
 IT勉強会カレンダーなどを参考に、気になる勉強会に参加してみても良いでしょう。知識だけでなく、人脈を拡げることもできます。自分の師匠となる人物に出会うこともあるかもしれません。さらには、あなたが誰かから刺激を受けるのと同じように、あなたが別の「誰か」に良い刺激を与えることもあるでしょう。
 「学ぶ」という事は楽しいものです。自分の世界を拡げ、新たな友人を生み出し、そしてキャリアにより良い影響を与えるものです。とりあえず、気になる言語のSDKをダウンロードするところからまずは始めてみましょうか。


※この記事は下記企画に賛同して書いた記事です。
  皆さんもどんどんきのこを増やしていきましょう!!

「108番目のきのこを生やす会」:http://atnd.org/events/11274

2010年12月24日金曜日

いろいろな言語でメリクリ!!

いろいろなプログラム言語でメリークリスマス!!

Ada:
with Ada.Text_Io; use Ada.Text_Io;
procedure Xmas is
begin
 Put_Line ("Merry Christmas!!");
end Xmas;

BASIC:
10 PRINT "Merry Christmas!!"
20 END

C:
#include 
#include 
int main (int argc, char **argv) 
  {
  puts ("Merry Christmas!!") ;
  return EXIT_SUCCESS ;
  }

C#:
class XmasApp 
{
 static void Main() 
 {
  System.Console.WriteLine("Merry Christmas!!");
 }
}

COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. XMAS.
PROCEDURE DIVISION.
DISPLAY "Merry Christmas!!".
STOP RUN.

Java:
public class Xmas{
    public static void main(String[] args){
        System.out.println("Merry Christmas!!");
    }
}

Ruby:
puts "Merry Christmas!!"

Scala:
object Xmas extends Application {
  println("Merry Christmas!!")
}

SQL:
SELECT 'Merry Christmas!!' FROM dual;

PHP:
<?php
echo 'Merry Christmas!!';
exit;
?>

2010年12月7日火曜日

ライトニングトークをやってきた。

先日の土曜日に、エンジニアライフのオフ会に参加し、ライトニングトークをしてきた。その模様を少しお届け。

会場は今回のイベントに快く場所を提供くださった、「神戸情報大学院大学」さん。

プレゼンの達人がお出迎え。


会場の様子


LTに使ったスライド。



僕のLTは6:40くらいから


他の録画はこちら:http://www.ustream.tv/channel/lits2010winter

2010年11月29日月曜日

モバブーでIS03ライフをより快適にするよ!

IS03を手に入れた。念願のAndroidデビューである。

しかし、どうもバッテリーに難があるとの情報を聞いたので、快適なIS03ライフを過ごすために秘密兵器を投入することにした。

SANYOの「eneloop mobile booster」通称モバブーである。

今回購入したのは、高容量タイプのKBC-L2BSである。もともと、iPodの充電用にKBC-L2ASを持っていたが、これは残念ながら出力が足りないらしく、IS03の充電ランプが点灯しなかった。



このモデルは付属のアタッチメントが充実している。

下の写真のように、コンセントから充電ができる。


もちろん、PCのUSBからの充電も可能!!




USBコードに付属のアタッチメントをつけると…。


IS03に給電できる!!


当然、USB出力なので、iPadにも給電可能!!!


これで外出先で少々無茶な使い方しても、安心だね!!

2010年11月12日金曜日

11月11日はポッキー&プリッツの日

11月11日は「ポッキー & プリッツの日」だった。

こういう「今日は〇〇の日だから△△を食べよう」的なイベントは当然関連業界によるマーケティングなわけなのだが、僕はこういうのは嫌いじゃない。

そんなわけでオヤツにはちゃんとポッキーを食べたのだが、他にどんな日があっただろうかとちょっと考えてみた。

・土用の丑に鰻を食べる。
・バレンタインデーのチョコレート(関連してホワイトデーも?)
・節分の恵方巻き
・台風の日にコロッケを食べる(2ちゃんねる発祥)

・食べ物ではないけど、サン・ジョルディの日なんてのもある(本を贈るんだって)。

あとは、暦とは関係ないけど、もうじき解禁されるボジョレーヌーボーも、解禁日の0時ちょうどとかにわざわざ飲んだりするよな。そんなに美味しいものでもないんだけど、僕も去年会社の先輩と解禁日当日に飲みに行ったっけ。

こういう「縁起物だから」みたいなノリで、何かを食べたり、飲んだりするっていうのは普段のルーチンとちょっと違う気分になれるから、お祭り的な感覚で心地良いのかもしれない。
あえて乗っかって、「そんなに特別に美味しいもんでもないよねぇ」なんて言いながらワイワイやるのが、楽しいんだな。

2010年11月5日金曜日

KOFに行ったついでに撮った写真いろいろ

今日、KOF(関西オープンフォーラム)に遊びに行って来た。
先日、携帯電話のカメラが壊れてしまったので、万が一KOFで魅力的な被写体があったときにカメラが無いと困る、ということで、我が家にある唯一の携帯電話以外のデジカメ、PENTAX K100を持っていった。

大げさなカメラを持って行くと、今度は「せっかく持ってきたんだから何か撮ろう」と、KOFと全然関係ないものをパシャパシャ撮って遊んでしまった。

そこで、いくつか気に入った写真をご紹介。

↓まずは会場のATC


↓大阪府庁になるかもしれなかったWTC

↓展望台は松本零士の世界が再現されてるそうな

↓「さんふらわあ」 港萌え…

↓ATCの吹き抜けを見上げてみた

↓KOFの会場内で唯一撮った写真

結局会場ではほとんどカメラ使わなかった。

2010年10月31日日曜日

【翻訳】Code Kataその1 スーパーマーケットの価格

Code Kataの日本語訳を色々探してみたが、見つけられなかった。
無いのなら自分で作ればいい、ということで、Code Kataその1を英語学習がてら、翻訳してみた。
学校の授業以外での英文翻訳なんて生まれて始めてやったので、ツッコミ大歓迎です。
=============================================
Code Kata -その1 スーパーマーケットの価格
  ( http://codekata.pragprog.com/2007/01/code_kata_one_s.html )

この型はDFW Practionersミーティングにあるいくつかの議論から起こりました。その問題はパッと見簡単なもの-- スーパーマーケットで商品に値をつけること--です。
豆の値段が0.65ドルであるというように、スーパーマーケットのいくつかのものには、単純な価格がついていますが、それより複雑な価格のものもあります。
例えば:
   ・3個で1ドル (すると、私が4個か5個買うならいくらになる?)
   ・ポンドあたり1.99ドル(とすると4オンスはいくら?)
   ・2つ買うと一つは無料(じゃあ3つ目の値段は?)
この型は、コーディングを必要としません。この演習は、お金を表現するための様々なモデルと価格に、充分なこれらの(およびその他の)価格体系に対応する柔軟性を実験します。そして同時に一般的な場面で(チェックアウト時、株式管理、受注などのために)使用可能です。
   ・小額なお金は存在していますか?
   ・いつ丸めは起こりますか(やるとしても)?
   ・あなたはどのように価格決定の動作記録を保ちますか?(あなたは、必要があります)
   ・経費と価格は同じクラスのものですか?
   ・100缶の棚を使って値が付けられるとき、
         「2つ買ったら1つ無料」の場合にどのように在庫を評価しますか?
これは、理想的なシャワータイムの「型」ですが、注意してください。問題のいくつかは、最初に現れるより微妙です。わたしは、主な選択肢を消化するために、それが2、3週間分のシャワーを浴びるのに相当するかもしれないことを提案します。


■GOAL
この型のゴールはよりゆるいスタイルの実験的なモデル化を練習することです。問題を扱うできるだけ多くの異なった方法を探してください。各々のいろいろな取引を考慮してください。どんなテクニックを使うことが、これらのモデルを調査するためにベストですか? それらを記録するために? どのように、あなたはモデルが合理的であることを確認できますか?
=============================================


…なんか、日本語として変ですね。やっぱり難しい…。
要するに、いろいろなスーパーマーケットの価格設定のモデルを考えてみようってことです。
今後も気が向いたら(もう二度と向かないかもしれないけど)順次翻訳していこうかな、と思ったり思わなかったり…。

Code Kataって知ってる?

情熱プログラマという本 ( http://amzn.to/d6zjDE ) を読んでいる。

そこにこんなことが書いてあった。

プログラマはしばしば実務の中でスキルを訓練する。
これがミュージシャンだったらどうだろう? 彼らがステージ上で変な音を出しながら練習していたら、観客はどう思う? 練習は、観客のいない密室で、自分の時間を使ってするべきだ。プログラマもそれと同じだ。

なるほど、それはその通りだ。で、この本にプログラミングの訓練の手がかりが紹介されている。
それが「Code Kata ( http://codekata.pragprog.com/ )」 だ。

"Kata"とは、空手の型のこと。
空手の練習は、定められた型を繰り返し反復することで技術を習得していく。
それと同様のコンセプトで、型を訓練し、ソフトウェア開発のスキルを磨きましょう、というものだそうな。

お暇な方は試してみては?

2010年10月29日金曜日

今までよく分かってなかったラムダ式の使い道を考えてみた。

C#3.0から追加された言語仕様に「ラムダ式」というのがある。
どういうものかは、何となく知っていたが、今いちどういう局面で使うのか分からなかった。
(業務アプリでこういう実装がどうしても必要な局面もあんまり無いし)

昨日、『言語設計者たちが考えること』( http://amzn.to/azXdTs ) という本でC#の設計者であるアンダース・ヘルスバーグのインタビューを読んでいて、このあたりの認識に閃きを得た。

そこでラムダ式の使い道について、誰得なエントリーを書いてみる。
まぁ、僕個人の覚書なのでスルーしてもらってもOKです。

内容に関して、「お前そりゃ間違ってるよ」などのツッコミがあれば大歓迎です。
拙いコードですが、お暇な方はお付き合いください。

さて、まずはこんなコードを書いてみる。
static void Main(string[] args)
{
  TokyoOutput();
  OsakaOutput();            
}

private static void TokyoOutput()
{
   int result = 0;
   for (int i = 1; i <= 10; i++)
   {
      result += i;
   }
  Console.WriteLine("計算結果は" + result.ToString() + "ですね。" +
                                 Environment.NewLine);
}

private static void OsakaOutput()
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    Console.WriteLine("計算結果は" + result.ToString() + "やね。" + 
                                Environment.NewLine);
}
1から10を順に足しこんでいって、それを標準語で出力するメソッドと、大阪弁で出力するメソッド。ご覧の通り、異なるのは最後の結果出力のみで、計算処理は当然まったく同じロジック。 しかし、これはいくらなんでもブサイクすぎる。同じロジックが複数のメソッドに分散しているなんて。ってことで、ちょっと分離してみたらこうなった。
static void Main(string[] args)
{
    TokyoOutput(Calculate());
    OsakaOutput(Calculate());
}

private static int Calculate()
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    return result;
}

private static void TokyoOutput(int i)
{
   Console.WriteLine("計算結果は" + i.ToString() + "ですね。" + 
                                Environment.NewLine);
}

private static void OsakaOutput(int i)
{
    Console.WriteLine("計算結果は" + i.ToString() + "やね。" + 
                                Environment.NewLine);
}
うーん。なんか周りくどい…。 計算処理(Calculate)からの戻り値を次の出力メソッドに引数で渡すとか、面倒くさくね? ここにはコードを書かないけど、計算部分を抽象クラスにして、出力部分をoverrideするって手もある。しかしこの程度の処理でそこまで大げさにやるのもなんか嫌だ。 そこでラムダ式を使ってみる。
static void Main(string[] args)
{
    Action Tokyo = (int i) => 
                 Console.WriteLine("計算結果は" + i.ToString() +
                                   "ですね。" + Environment.NewLine);
    Action Osaka = (int i) => 
                 Console.WriteLine("計算結果は" + i.ToString() + 
                                   "やね。" + Environment.NewLine);
    Output(Tokyo);
    Output(Osaka);
}

private static void Output(Action outProc)
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    outProc(result);
}
うん。なんかすっきりした気がする。

ラムダ式を使う局面ってこんな感じでいいのかな?

要するに、関数をパラメータで渡すって事だから、メソッドの中の一部を外から見て任意にしたいって事だよね? うん。なんとなく分かってきた。もうちょっと掘り下げて考えていこうっと。

2010年10月27日水曜日

僕たちが若い人たちに伝えられること

今度、ちょっとしたライトニングトーク大会を皆で企画している。

その中で、会場はある幹事メンバーの母校を使わせてもらえることになった。
最終的にそこを使わせてもらうかはどうかは、これから皆で話しあって決める予定なのだけど。

なんでも担当の職員さんや先生方もノリノリで、エンジニアを志す学生に向けて勉強のために公開してもらえるなら喜んで提供しますよ、というありがたいお話である。

学生さんにオープンにするのは全然問題ないのだが、この件で少し悩んでしまった。

僕らが、エンジニアを目指す学生さんたちに伝えられることなんてあるだろうか……?

IT業界は今、多くの局面において厳しい状況にさらされている。

どういう風に厳しいかは今回の主旨に関係ないのであえて書かないけれど、お世辞にも若い人に向けて「うちらの業界は安泰だから安心して飛び込んで来い」なんて言えない。なんたって自分たちの10年後がどうなっているかすら、不安な状況なんだから。

僕らは、エンジニアを志す若い人たちに、一体何を伝えてあげればいいんだろう…。

でも、あまり難しく考える必要はないのかもしれないな。

確かに厳しい世の中だけど、少なくとも僕らはこうしてイベントなどをやっては仲間内で集まって、ケラケラ笑いながら、遊んだり、学んだり、お互いに影響を受け合ったりして楽しくバカなことしてる。

そういう部分を見せてあげられれば、それでいいんじゃないかな。

そして、若い人に向けてそんなバカで最高にクールなお祭りを見せてあげられる僕らは、なんだかんだいって幸福なんじゃないかな。

2010年10月24日日曜日

totoBIGが当たったよ!

毎回、10口ずつ買っているtotoBIG。
生まれて初めて当選した!!

その模様をお届け。

これが結果画面。
右上にある「当せん照会サービス」をクリック!!

当せん照会画面で照会番号を入力!!
そしてその結果は……………。


見事当せんなり!!!

5等。1,800円!!

10口買ったから差し引き -1,200円。

まあ、損得とかじゃなくて当たったらそれはそれで嬉しいものだ。



2010年10月23日土曜日

前へ進むという事の覚悟

禁煙を始めて三週間が経った。

ニコチンの離脱症状も無くなり、僕は今、「非喫煙者」としての生活を満喫している。

僕はもう二度と、タバコを吸うことはないだろう。なぜなら、タバコを止めるという行為によって、僕は一つ前へ進んだのだから。

喫煙者であった頃の自分にとって、禁煙はとてつもないハードルだった。たとえば、タバコが嫌いな会社の偉い人と一日過ごすために一時的に禁煙を余儀なくされる場合など、そのたった数時間が耐え難いほどだった。

しかし、僕は禁煙を決断した。最も短絡的な動機はタバコの値上げである。そしてもう一つの動機は、「自分はそろそろ次のステージに行かねばならない」という自身のキャリアに関する悩みがあったからだ。

キャリアといっても別に転職を考えている訳ではないのだけれど、もう一段、自分を意識的にレベルアップさせたいと考えたのだ。TOEICの勉強などを始めたのもその一貫である。

意識的に自分をレベルアップさせるためには、相当な困難を伴なう。タバコをあっさり止めるくらいの事ができなくて、レベルアップなどできるものか。なぜかそう思った。そして僕はタバコを止めた。

自分自身を次のステージに上げるために、覚悟を決めて踏み出した道であるから、後戻りは許されない。時々タバコを吸いたいな、と思うときはあるけれど、そうはいかない。

例えば、転職した人が、前職をどれだけ懐かしんでも、もう戻ることはできない。
例えば、学生時代にどれほどノスタルジーを感じようと、戻ることはできない。

前へ進む覚悟というのは、そういう事だ。

だから、僕も後ろを振り返らない。二度とタバコは吸わない。

そう自分に言い聞かせながら、「非喫煙者」としてのモチベーションを維持している。
それに、喫煙者時代に「非喫煙者になりたい」とある意味で憧れていた自分自身の姿になった、過去の自分にとっての「あちら側」の生活を過ごす満足感なんかも心地良い。

これ、結構効果があってオススメの禁煙法ですよ。

2010年10月21日木曜日

意外な方向が見えて面白くなってきた の巻

今日は午後から、某社が主催するクラウド研究会に参加した。

上司から参加を命じられた会なのだが、最終的に研究成果を論文に書いて来年のシンポジウムで発表する、という恐ろしくも興味深い会である。

研究テーマは「クラウドサービスの運用について」。

しかし、一言でクラウドと言っても幅が広すぎて、きちんとスコープを絞らないと論文どころか本一冊書けてしまうような事態になる。

ここで別の研究グループの中間報告を聞く。
別のグループもクラウドについて研究しているようだが、我々の感覚からすると少し違和感のある結論に向いているようだ。

そこで、シンポジウム全体のバランスを考えると、その別グループの主張と真逆の方向で研究を掘り下げ、対立構図を作っても面白いのではと提案してみた。内容的に逆の意見で掘り下げるのも可能であるということで、その方向性で行くことになった。

あと、この会議では「クラウドサービスの定義」について、今まで誰も言及しなかった少し面白い視点でのアイデアが出た。論文として成果をまとめるのであれば、こういった「今までにない視点」は非常に有効である。

具体的にどういった内容かを今ここで書いてしまうと、シンポジウムのお楽しみが無くなってしまうので詳細は伏せるが、ちょっと面白い方向になってきた。

さて、来月までにこの論文要旨を僕が書くことになったので、頑張らないと!!

2010年10月18日月曜日

【備忘録】iBatis.netで任意の場所に配置されているSqlMap.configを指定する方法その2 -こっちのほうが良いみたい-

頑張って英語のマニュアルを読んだら書いてあった。

http://code.google.com/p/mybatisnet/downloads/detail?name=Doc-DataMapper-1.6.2.zip&can=3&q=datamapper+docs
↑このマニュアルの73~75ページ

public class Mapper
{
    private static volatile ISqlMapper _mapper = null;
    protected static void Configure(Object obj)
    {
        _mapper = null;

    }

    protected static void InitMapper()

    {

        ConfigureHandler handler = new ConfigureHandler(Configure);

        DomSqlMapBuilder builder = new DomSqlMapBuilder();

        _mapper = builder.ConfigureAndWatch("SqlMap.configのパス", handler);

    }

    public static ISqlMapper Instance()

    {

        if (_mapper == null)

        {

            lock (typeof(SqlMapper))

            {

                if (_mapper == null)

                {

                    InitMapper();

                }

            }

        }

        return _mapper;

    }

    public static ISqlMapper Get()

    {

        return Instance();

    }

}
C#4.0 (Visual Studio 2010)
iBatis.DataMapper 1.6.2

builder.ConfigureAndWatch()というメソッドが、SqlMap.Configの変更を監視し、
変更が無ければ前回作成したインスタンスを再利用するようだ。

なるほど、こっちのやり方のほうが安心。

上記サンプルクラスを使えば、Mapper.Instance()というように、
従来通りMapperにアクセスできるという寸法だね。

やっぱり面倒臭がらずにマニュアルは読むべきだな…。

【備忘録】iBatis.netで任意の場所に配置されているSqlMap.configを指定する方法

iBatis.netでは、iBatis関連のdllとSqlMap.configを同じディレクトリに配置する必要があるのだが、
ちょっと理由があって、それぞれ別々に配置したくなった。

なにかいい方法はないかといろいろ試したら、こんな実装で実現できた。


ISqlMapper _sqlMap = null;



XmlDocument sqlMapConfig = new XmlDocument();

DomSqlMapBuilder mapBuilder = new DomSqlMapBuilder();

sqlMapConfig.Load("Sql.configのパス");

_sqlMap = mapBuilder.Build(sqlMapConfig, true);


C#4.0 (Visual Studio 2010)
iBatis.DataMapper 1.6.2

ほんとにこれでいいのかな?
もうちょっと調べてみる。

2010年10月17日日曜日

今更ブログを始めて見た。

これまでに何度かブログを作ってきたのだが、いろいろ思うところあってもう一度やってみる。

かつては自作サイトで日記を書いていたが、いろいろ面倒になって閉鎖。
mixiで日記を書いているが、マイミク(ほとんどリアル知人)限定に向けた内容。
某所でコラムを書いてみるが、もう少しカジュアルな話題も書きたい。技術的な独り言とか。
で、そういう部分はTwitterでまかなおうと思ったけど、140字ではいろいろ足りない。

そんなわけでここに独り言の場を作った。

ひょっとしたら放ったらかしになるかもだけど、気が向いたら更新しますよ、と。