2011年6月29日水曜日

えっと…転職するらしいです。

Twitter中毒なので、日頃の出来事をTweetしているので、私をフォローされている方はご存知のことと思いますが、

7月いっぱいで現在の会社を辞め、9月より株式会社トップゲートにて働くことになりました。


転職の経緯

  • Googleのテクノロジーに興味があった(Android/GAE)。特に費用面などの優位性からクラウドというジャンルに未来性を感じていました。
  • エンジニアとしてより高いレベルで仕事をしたいという思いがあった。トップゲートの社員の方々はスキルの高い方が多く、刺激のある環境を期待した。
  • 現在、独身であり、特に金銭的な課題はない。今年で34歳という最後のチャンスと考えていた。プログラマーとして身を立てていくことが、自分のやりたいことであり、それを実現できる環境に身を置きたかった。
といった、理由からトップゲートにて働くことにいたしました。

SIから身を引くこと

もちろん、ネガティブな理由を並べていくと、
いろいろとあるのですが、簡単に申し上げると、

SI的な構造の中でプログラマーとしてやっていくには無理がある

ということです。

もちろん、
こうした構造を改造していくことを目指すのは
選択肢としてありましたが、
これはかなり根気を要する行動であり、
真に強い人間でないとできないと思います。

しかし、私はそれほど強い人間ではありません。
そして、無理をしてでも成し遂げるほどに、
今の会社にも思い入れはありません。

(私の周囲では、私のことを変に高く評価されて、
特に出身大学などの偏見から、
私ならできるという輩もおりますが、
私も一介の人間であり、それほど強いわけではありません。)

合わない環境で頑張るのと、
会う環境で頑張るのとどちらか二択となったときに、
後者のほうが自然な流れだろうと考えました。

会社選定まで

何個か会社の候補は上がっていて、来月くらいから具体的なアクションをとろうと考えていました。

実際に、本当に行動をとろうと考えたのが、2011年6月の中旬でした。

まあ、ある出来事があったのですが、それはおいておきます。
その直後にわかめさん(@vvakame)から
「しゃっちょ~、Androidでテストなクラスタの人間が転職を希望しています」
というツイートがあり、
そのあとトントン拍子に話が進み、9月から働くということで合意を得ました。

なので、転職活動っぽいことは全くしておりません。



新しい会社ではわかめさん以外にも、のとさんなど数人の知り合いがおりますので、新天地というよりはクラス替えという感じに近いです。

フォロワーのみなさまにおかれましても、ファイルサーバーの運用が大変などのお悩みをお抱えの場合にはぜひお声がけいただけると嬉しいです。

というわけで、まぁ、今後とも宜しくお願いいたします。

2011年6月27日月曜日

ちょっとやりたいアプリメモ

やりたいアプリのメモ

  • 恋ゲー的情報処理試験アプリ
  • Chrome Extension : ページ内の一部の文章を選択したら、その部分と、ページのタイトルと、URLをTwitterに投稿する
  • 英語、フランス語、スペイン語から日本語への翻訳英会話Androidアプリ - 大学で三ヶ国語(英語、スペイン語、ラテン語)をやっていたオレにしかできないアプリ

今んとこはこれくらいかな

しかし、昨日、英語での音声出力ができなかったのがショックで、3.は頓挫中。
だれかオレにアドバイスを~(涙)

IntelliJ IDEAでslim3プロジェクトを使用する。

単なるメモ。

IntelliJ IDEAでGAEアプリを作成することはできますが、
Slim3を使用するとなると、結構設定が面倒くさい。

一応、IntelliJ IDEAでSlim3を使ったプロジェクトの
設定ノートを書いておきます。

プロジェクトの作成

Slim3プロジェクトの準備


Slim3-blank-n.n.n.zipを解凍したフォルダをIntelliJ IDEAプロジェクト用の作業スペースにコピーします。


プロジェクトの新規作成


IntelliJ IDEAにて新規プロジェクトの作成を選択します。


既存プロジェクトからのインポート


新規プロジェクトを作成する際に、既存モデルからのプロジェクト作成を選択します。


よしなにやる


よしなにやっていきます。Slim3は元々Eclipseで作成されているプロジェクトですが、既存ソースからプロジェクトを作成するを選択します。

先ほどコピーしておいたプロジェクトのパスと一致するように、強引にプロジェクト名を入力してください。

上書きするかとか聞かれるので、そのまま上書きする。

イエスマンのように、イエ~スと押し続けていく。


…ネクストだったorz

おもむろにFinish!

そうすると、こんな感じでプロジェクトが出来上がる。



プロジェクトの設定を行う。


Ctrl + Sft + Alt + Sでプロジェクトセッティングを表示する。
その際に、まずは「Modules」→「プロジェクト名」→「Sources」→「test」→「Test Sources」と選択していって、testフォルダを認識させる。

Platform Settings→新規設定→名前に「GoogleAppEngine-1.5.0」(2011/06/27時点での最新は1.5.1)→クラスの追加を押してjarファイルを選択する。

この際に入れておくべきjarファイルは以下のとおり。場所はGae-SDKのlibフォルダにあるので、気合で探す。

appengine-local-runtime-shared.jar
el-api.jar
repackaged-appengine-ant-1.7.1.jar
repackaged-appengine-ant-launchar-1.7.1.jar
repackaged-appengine-jasper-6.0.29.jar
repackaged-appengine-jasper-el-6.0.29.jar
repackaged-appengine-tomcat-juli-6.0.29.jar
jsp-api.jar
servlet-api.jar
appengine-jsr107cache-1.5.0.jar
jsr107cache-1.1.jar
datanucleus-appengine-1.0.8.final.jar
datanuclieus-core-1.1.5.jar
datanucleus-jpa-1.1.5.jar
geronimo-jpa_3.0_spec-1.1.1.jar
geronimo-jta_1.1_spec-1.1.1.jar
jdo-api-2.3-eb.jar
appengine-tools-api.jar



また、modulesに戻って、「Modules」→「プロジェクト名」→「Dependencies」→「Add」と選択していく。


「Add」ボタンをクリックした後に、何か選択が出てくるので、迷わず「2:library」を選択する。
すると次のような画面が表示されるので、「lib」と「GoogleAppEngine-1.5.0」を選択する。


おめでとう


これで心置きなく、IntelliJ IDEAのパワーを存分に発揮してslim3での開発ができるようになります。

オレは今のところ、slim3本の写経しかしていませんが、半端無く写経の速度は高くなります。
たとえば、「@Test public void testDeleteRootEntity」というテストメソッドを書いていくためには、

pu + Enter
voi + Entet
testDeleteRootEntity



と打っていくだけなので、かなりの速度が体感できます。


プロのプログラマーとしてはお気に入りのIDEも使いこなせるようになっておきたいですね。

2011年6月23日木曜日

Groovyでword count

Groovyでword countをやってみました。
ただ、まあ普通にカウントするだけでは面白く無いので、
@fumokmmさん『今日から始めるGPars』を参考にして、
並列処理でやってみました。

以下、ソースコード

def count(arg){
    withPool{
        arg.parallel
            .map{[it, 1]}
            .groupBy{it[0]}.getParallel()
            .map{it.value=it.value.size();it}
            .sort{-it.value}
            .collection
    }
}

count(words.replaceAll("-\n", "").replaceAll(/[..:.,]/,"").split(/[\s:]/)).each{
    println it
}


実際のカウントの部分のreplaceAll(String, String)は対象となる文章(GoogleのMapReduce論文)に合わせて、適宜文字の調整をするために行っています。

で、これの結果の上位の文字は次のとおりです。
the=484
of=312
a=213
to=197
and=170
is=122
The=104
in=97
MapReduce=87
for=85
that=79
)=76
data=72
reduce=68
(=63
by=60
map=59
on=58
output=58
are=56
function=49
tasks=48
task=48
machines=45
as=41
input=40
it=40
from=38
this=34
computation=33


小文字、大文字の変換をやっていないので、ちょっと微妙ですかね。
また、カッコの数も違っているので、なんか微妙です。

ちなみに、実行速度は以下の条件で、
Intel Xeon 3460
RAM 8.00GB
Groovy 1.8.0
Java 1.6.0-24
約1s程度でした。

2011年6月21日火曜日

Androidでも流れるインターフェース

無駄に流れるインターフェースでOnClickListenerを実装してみた。

まずはアプリの仕様から。

画面仕様
  • 最初の画面はTextViewButtonで構成される。
  • Buttonをクリックすると、次の画面に移動する。
  • 次の画面はTextViewButtonで構成される。
  • Buttonをクリックすると、最初の画面に移動する。

非常に単純な作りですね。
ちなみにこれは次の記事でテストを書くのでよく覚えておいてね。


で、百聞は一見にしかずで、これまた画面の動きをハードコピーしました。


この画面で「push me!」を押すと、


この画面になります。

多分、Androidをやっている人たちなら、この画面簡単に作れちゃうでしょう。
いや実際オレも30分くらいで完成しました。
では、これからオレがdisるコード例を示します。


class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        View view = findViewById(R.id.button);
        view.setOnClickListener(
            new OnclickListener(){
                @Override
                public void onClick(View v){
                    Intent intent = new Intent(this,
                            NextActivity.class);
                    startActivity(intent);
                }
            }
        );
    }
}


読みづらいですね。
まだ、OnClickListenerがひとつだからいいものの、複数のViewにボタンを設定するとなったら、発狂しそうですね。

というわけで、オレが実装したのは次のようなコードです。

class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Create.activity(NextActivity.class)
            .from(this)
            .listenOn(R.id.button);
    }
}


インターフェースを単純につくっています。
まずはインターフェースから。


interface MoveActivity extends OnClickListener{

    public MoveActivity from(Activity preActivity);

    public MoveActivity to(Class<? extends Activity> nextActivity);

    public MoveActivity listenOn(int view);
}


インターフェースはこれだけです。
前のエントリとほとんど変わりません。変わったのはlistenOn(int view)を付け加えたあたりですね。
したがって、これを実装したクラスのテスト性もほとんど変わりません。

これの実装が頑張りどころです。

class Create implements MoveActivity {

    private Activity preActivity;
    private Class<? extends Activity> nextActivity;

    public static MoveActivity activity(
            Class<? extends Activity> newActivity){
        return new Create()
                .to(newActivity);
    }

    @Override
    public MoveActivity from(Activity preActivity){
        this.preActivity = preActivity;
        return this;
    }

    @Override
    public MoveActivity to(Class<? extends Activity> nextActivity){
        this.nextActivity =  nextActivity;
        return this;
    }

    @Override
    public MoveActivity listenOn(int view){
        preActivity.findViewById(view).setOnClickListener(this);
        return this;
    }

    @Override
    public void onClick(View view){
        Intent intent = new Intent(preActivity, nextActivity);
        preActivity.startActivity(intent);
    }
}


ここのポイントは普通ならgetInstance(Class<? extends Activity>)とやるメソッド名を、activity(Class<? extends Activity>)としている所です。Javaに慣れている方には若干読みづらく感じますが、あまりJavaに詳しくない人でもこれならActivityを組み立てることできますね。

あともうひとつのポイントは返す型はかならずインターフェースにすること。

これはDevLove Hangar Flight で矢野さんがおっしゃっていた、Javaの型とはクラスではなく、インターフェースのことだというインターフェース原理主義に即しています。これなら、Androidのバージョンが変わってAPIが変更されてもActivity部分は変えなくて済みますからね。

2011年6月20日月曜日

日本Androidの会 6月定例会に行ってきたよ

とりあえず、月曜日なので短めに。

表題の件について、駒場に行ってきました。
19時頃の駒場東大前駅の西口はいいですね。
JKが(以下自粛)

では、レポートを…


HoneyCombアプリつくってみたよ
みやけんさんによるHoneyCombアプリ作成のレポートです。

Android3.0からはAndroid Tab対応になったのはご存知だと思いますが、UI部分がかなり変わってきています。
Android2.xではひとつのActivityがひとつの画面に対応していましたが、HoneyCombアプリではActivityの中にフラグメントとよばれる要素が加わり、複数の画面で構成できるようになったとのことです。(嘘いっているかもしれませんが…)

というわけで、今までのようにActivityの中に、Viewはもとより、ModelもControllerも突っ込んでいたアプリは作り方そのものを見直さないといけないようです。

そうなるとMVCとかMVVM(あまりよく知っていない)とかの話になるのかと思ったのですが、そこまで突っ込んだ話にはなりませんでした。

あとHoneyCombアプリを作成する際に気をつけたいのが
  • とにかくスペックのいいマシンで開発する
  • 活きの良いHoneyCombタブを用意する。
  • やっぱりEclipse
です。

一つ目については、その通りで、スペックのいいマシンでないと、指が止まる→考えていたことを忘れる→何をコーディングしていたのか曖昧になるという悪循環になります。
SIerの悪口を言うのはアレですが、SIerの偉い人はこのあたりのことをあまり理解していないことが多い。そのSIerがExcelからAndroidアプリのコードを作り出すとかやろうとしだしたら、ちょっとやばいことになると思う。

二つ目はAndroid3.0のエミュレーターは重たいので、端末を接続してやるのが多分最適解だと思っています。かなり同意しました。

三つ目ですが、これはどうなんだろう。
IntelliJ IDEAを使っていますが、Androidに関してはEclipseの方がサポートが強い感じがします。テストの実行に関してはAntが一番速いらしいし、融通が効くので(@SmallTest/@MediumTest/@LargeTestアノテーションを有効活用できる)、こちらをおすすめしたいところですが…

ChromeOS/Chromebookについて
丸山先生によるChromeOS/Chromebookの報告。

結論から先に述べると、

Don't buy Chromebook

だそうです。

一応、Googleがかなり本気を入れているらしいのが、ビジネスマシンのクラウド化で、Chromebookはそれをもろに狙っているターゲットマシンという位置づけだそうです。

まあ、確かに業務なんてブラウザだけでできますからね。Chromebookはそれだけの用途にはうってつけだと思います。

セキュリティなどの対策もChromebookではしっかりやっているそうです。

そのなかで、ちゃんとGoogleが企業のデータを預かってちゃんと運用できるのかといったコンプライアンス(?)的なあたりが、冒頭の結論に導かれたようです。

WWDC報告
結構、しゃべってはいけないことが多いらしく、基調講演の内容を主に解説されていました。

個人的には○○○のエミュレーター機能は面白いと思いました。

Windows Phoneについて
興味がわかなかったので、ほとんど右から入って左に抜けていました。
すみません。

ただ、気になったのが、WP7とWP-mangoって何が違うのかよくわからなかったのと、日本では電波法の関係からまだデバッグ用に使える端末がないらしく、ちょっと暗雲が立ち込めていますね。

台湾の報告
台湾のAndroid端末市場についての報告。

向こうではAndroidタブが流行っているそうですが、そのほとんどがAndroid2.2系のものが主流だそうです。

オレ的にはChromeOSの話が聞ければ満足だったので、まあ、参加してよかったと思います。

2011年6月19日日曜日

Android埼玉でJUnitのセッションをしてきました。

Android埼玉でJUnitについてセッションの時間を設けていただいたので、私見ながらJUnitの紹介をしてきました。

まず、その前に、Android埼玉、オレ遅刻してきましたorz
ひどいですね。発表者なのに…
進藤さんご迷惑をおかけいたしました。

埼玉Androidの会の方は藤原さん(@zegenvs)さんが主催するモクモク会をメインに参加していて、定例会の方は実は二回目でした。
というのも、埼玉Androidの定例会はたいていテスト部MTGとかぶることが多くて、テスト部メインなオレは泣く泣く埼玉Androidに参加できなかったのです。(半分ウソつきました。)

以下、今回セッションの時間をいただけた経緯です。
  • 社内用にJUnitの資料をGoogle Docsで作成
  • 特に秘匿にする必要性を感じなかったので、Twitterでアドレス付きでつぶやいた
  • 埼玉支部長の進藤さんから埼玉Androidの会でぜひと…
という感じですね。
30分時間をいただけるなんて光栄です。
ありがとうございます。

あと、資料の誤りを指摘してくださった、千葉Androidの会(#chibandroid)のnouzui2007さんありがとうございます。



で、他の方の発表ですが、一人未完の資料をどう持っていくか作戦を練っていて
モクモクしていやがったので、左耳から入って右耳から出て行っててあまり覚えていません。
あいかわらず失礼なやつだ、オレ。

一応、記憶に残っているプレゼンで以下の二つがあります。

めーめー会
@chocokanpanさんが2~3ヶ月に一度開催する、ジンギスカンを食べる会のLTです。
実は埼玉Androidの会でLTするのが実は二回目で、その初回が第二回埼玉Androidの会だったそうです。
で、それの何が印象に残っているかというと、オレの勉強会デビューがまさにその第二回埼玉Androidの会だったわけです。
そして、埼玉Androidの会のセッションデビュー日とめーめー会の二回目のLTが重なるあたり、奇遇だな~と感心していた次第であります。

スマフォビジネスの事情
Androidアプリ開発者の皆様ならご存知のアプリ紹介サイト[アンドロイダー]を運営するトリワークスさんによるスマートフォンのビジネスモデルのおはなしです。

Androidアプリでビジネスを展開するための非常に有益な情報が提供されたと思います(スルーっと解説)。
で、実はトリワークスさんも埼玉Androidの会で講演するのは二回目でして、その初回はなんと、第二回埼玉Androidの会。これまた偶然ですね。トリワークスさんも@chocokanpanさんに「奇遇ですね」とおっしゃっていました。

そいで、私のプレゼンですが、
いつものTwitter口調でずっとやっていました。
そして、人生初のライブコーディングしましたが、あれは、練習が必要ですね。
内容はすでに頭の中にあるんですけど、手が追いつかないのと、クビが痛いのと、焦るのとで、、、いい経験させてもらいました。
資料はこんな感じです。




オレとしては珍しく、懇親会に参加しました。
土曜日サイコー!

主だった話は埼玉Androidの会でロゴマークを作るということで、
おざわ(@osa030)さんのロゴの話題になりました。

おざわさん曰く、

タマといえば「○んたま」でしょ!


かなり大爆笑でした。

愉快な方達がいる埼玉Androidの会、とても楽しかったです。
埼玉Androidの皆様、今後とも宜しくです。