Mar 11

IBM様の社名を伏せなければいけないと勘違いしておりましたので一部内容を修正させて頂きました。 Fri Mar 12 17:25:37 JST 2010
はじめまして。suzuki-sと申します。
今年の1月にKLabに中途入社いたしまして、初めての投稿です。
これをきっかけにどんどん投稿していきたいと思いますので、今後ともよろしくお願いいたします。

さて、近頃KLabは勉強会ラッシュでして、先日のサイバーエージェント様に引き続き、
3月5日(金)、IBM基礎研究所の方々と勉強会をさせていただきました。
その様子をレポートさせていただきます。

Continue reading »

Mar 08

どうも、honda-hです!

先日、「アメーバブログ」や「Amebaなう」などの面白いサービスを次々にリリースされているサイバーエージェント様と合同で勉強会をさせていただきました。

その様子をレポートさせて頂きます。

非常に有り難いことに予想を上回る参加人数となり、30人分用意していた席がほぼ埋まってしまいました。

Continue reading »

Mar 05

umjammer です。

Kindle Development Kit (KDK) が発表されてしばらく立ちます。
私も Java 使いとしては黙ってられなかったのですぐさまベータプログラムに
エントリーしたのですが、3月に入ってもいっこうに知らせがありません。

審査があるみたいなので皆にいくとは思わないのですが、twitter で検索しても
嘘くさい何件か以外は見当たりません。まだでてないんですよね?

もう待っていられないので先に作っちゃいます。

ちなみに KDK は Javadoc がすでに公開されています。
世の中にはいろんなものが落ちていまして codavaj という Javadoc リバースエンジニアリング
ツールが存在します。codavaj ? Javadoc の逆かい!素敵なネーミングセンスです。

codavaj は Javadoc を読み込んで Java プログラムのスケルトンへ変換することが可能です。
KDK が手に入らないのなら自前で実装します!


$ codavaj.sh wget http://kdk-javadocs.s3.amazonaws.com/index.html docs
$ codavaj.sh codavaj docs src http://java.sun.com/javame/reference/apis/jsr217/

とすれば、src にコードが生成されます。

今回は KComponent ぐらいしか使わないのでその辺りと、KindletContext を適当に
実装しました。

KDK の超適当実装

さて KDK はできました。次は Kindlet でアプリ作成です。
KDK は Personal Basis Profile ベースなので Kindlet 対応すれば他は殆ど Applet と同等なので


public class KindleTestApp implements Kindlet {

    private MyView view;

    private KindletContext context;

    /** */
    public void create(KindletContext context) {
        try {
            view = new MyView();
            this.context = context;
            this.context.getRootContainer().add(view); // ここ勝手に想像w
        } catch (Exception e) {
e.printStackTrace(System.err);
        }
    }

    /** */
    public void start() {
        new Thread(view).start();
    }

    /* */
    public void stop() {
    }

    /* */
    public void destroy() {
    }

    /** */
    private class MyView extends KComponent implements Runnable {
      :

こんな感じでしょうか?

あとはビューアを適当にこしらえて

2010-03-05

一番乗り??? 実機は白黒だよなぁ…

Dec 22

12/16(水)に、先日の交流会でお世話になりましたクックパッド様を弊社にお招きして勉強会を開催いたしました!

勉強会の様子

今回は、クックパッド様から2テーマ、KLabから2テーマの発表がありました。

まずは、KLabから nagai-k が『OpenSocialアプリ入門』というテーマで発表しました。

発表中のnagai-k

ソーシャルアプリではどんな風なやりとりが行われているのか、APIの使い方など、ソーシャルアプリの基本となる部分について、分かりやすく解説していただきました!ソーシャルアプリといえば、今もっとも熱い分野のうちのひとつです!弊社でも開発に力を入れており、クックパッド様からも弊社側からも多くの質問が上がり、まさにホットな話題を提供してくださいました!
発表資料はこちら

次に、同じくKLabから sasaki-k が『全文検索エンジンSolr試食』というテーマで発表しました。

発表中のsasaki-k

全文検索エンジンSolr(ソーラ)のしくみ、実際に使ってみての気づきなどを発表してくださいました!(魚)料理の試食になぞらえての発表で、笑いを誘いつつ大いに盛り上がりました!Solrはまだ知名度の低い技術ですが、今回の勉強会で注目してもらえたのではないか、とsasaki-kも手ごたえのあった様子(後日談)。これからの動向に期待大です!!
発表資料はこちら

続きまして、クックパッド様の発表に移りました。

まずは、最高技術責任者(!)の橋本様から、『クックパッドのRailsリニューアル』というテーマで発表いただきました。

発表中の橋本様

なんと、Railsがまだベータ版だった2005年から、そのすばらしさに自信を持っていらっしゃったそうです!また、クックパッドサイトのリニューアルは2008年に行われたそうなのですが、その前に「たべみる」というサイトを、なんと開発開始からわずか1ヶ月でオープンさせることができたそうです!そのスピード感…尊敬します!!

次に、開発の森田様から、『Railsでのテスト駆動開発』というテーマで発表いただきました。

発表中の森田様

クックパッドサイトの開発中に、どのようなやり方でテストを行っているのか、実例も交えながらお話していただきました!かなり内部的なことも係ってきてしまうので、詳しくお伝えできないのが残念ですが、実際のテスト時の動作画面も見せていただくことができました!こういった勉強会の場でなければ見られない、貴重な体験をさせていただき、本当にありがとうございました!!

ここで、勉強会は一旦終了し、懇親会に移りました。
懇親会では、お酒も入りw、クックパッド様と弊社の技術者が語らう、熱い夜となりました!!

お越しいただいたクックパッドの皆様、本当にありがとうございました!

Dec 16

umjammer です。

ネタがホットなうちに、

Google Japanese Input が出ました。変換効率が各地で話題になってますね。
Mac な私も早速導入してみたのですがメニューバー上に表示される変換モードの
アイコンがいまいちキレくありません。ことえりのアイコンと比較してみたところ
サイズが微妙に違うみたいでリサイズされて少しボケた感じになっています。

私は目が結構いい方で、気になって仕方が無いのでことえりのアイコンの色を
変更したアイコンを作成してみました。満足のいく仕上がりになりましたので
公開します。

ライセンスが微妙なので個人利用にとどめてくださいね。

あと私は「ひらがな」と「直接入力」しか使わないのでとりあえず二つです。

作り方は
/System/Library/Input Methods/Kotoeri.app/Contents/Resources
にあることえりのアイコンを

Gimp の場合

  1. 画像/モード で RGB に変換
  2. 色/着色 で 色相 228 彩度 68 輝度 34 に変換
    (本家と同じ色にするためにはもう少しがんばれます)
  3. PNG としてセーブ

このように変換して、
/Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources
にある等価なアイコンに上書きすればOKです。

見た目にこだわる人はお試しください!

PS

この Blog も Google Japanese Input で書いてみました。悪いけどことえりさんサヨウナラ。

Nov 30

こんにちは。takei-hです。

ちょっと時間が経ってしまったのですが、アシアル株式会社KLab株式会社の合同勉強会でMessagePackとPHP Extensionについて発表しましたので、資料を公開します。



また、PHP Extensionもだいたい形になったので、公開します。

MessagePack PHP Extensionのダウンロード

Continue reading »

Nov 24

秋の寒さが、木の葉を赤く染める季節になりましたね。みなさんいかがお過ごしでしょうか。
我々若手は、寒さを吹き飛ばすほど熱く燃えております!!

ということで、本日のお昼時、クックパッド様と技術者交流会を行いました。
今回は特にサーバやDBなどのインフラ周りのお話を中心に、楽しい時間を過ごさせていただきました。私は常日頃アプリ側をやっておりますので、今回のインフラ談義はとても勉強になりました!PC向けかモバイル向けか、参照が多いサイトか更新が多いサイトか、ということろで最適なインフラ構成は違ってくるんですね。サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用を読んでもっと勉強しよう!

また、談義中、社員の方が作ってくださったランチを頂きました。ほうれん草のサラダ、牡蠣のグラタン、きのこリゾット。どれもおいしく頂きました♪ごちそうさまでした!

そして最後に、素敵なキッチンの前で記念写真。ありがとうございました!

勉強会の共同開催など、今後も積極的に外部との技術交流を図っていきます!

Nov 20

こんにちは。takada-atです。

先日開催されたアシアル株式会社KLab株式会社の合同勉強会で発表しましたので、資料を公開します。

携帯絵文字の文字エンコーディング変換およびキャリア間のマッピングについてKLabでの対応をご紹介させて頂きました。

資料は以下にあります。

携帯絵文字をutf-8エンコーディングにする話

Nov 20

tadaka-atです。

最近Haskellの記事ばかり書いていますが、PHPも書いてます!ということでPHPのライブラリを公開しました。

PictgramConverter

サポートする機能は

  • 絵文字sjisバイナリをutf-8バイナリに変換
  • キャリア間の絵文字変換

「ShiftJISからutf-8への文字コード変換とともに、絵文字もutf-8エンコーディングに変換」「異なるキャリアの絵文字も表示キャリアに合わせて変換」という処理が手軽にしかも高速にできるすぐれものです。

インストールは以下のコマンドで完了します。

$ pear channel-discover openpear.org
$ pear install openpear/PictgramConverter-alpha

詳しく知りたい方は以下の勉強会資料もごらんください。
アシアルKLab合同勉強会で発表しました

Nov 17

takada-atです。
前回HaskellおよびRubyでエコーサーバーを発表したところ、エコーサーバーおよびネットワークプログラミングの基礎について、社内でいろいろな指摘を受けました。
今回は、指摘された点をひとつひとつ改良していきたいと思います。

リンク: Haskellでエコーサーバー

ポート番号

実は恥しながらRFCにエコーサーバーの規定があるのを知らなかったのですが、一般に「エコーサーバー」と言った場合、正式には「RFC862 - Echo Protocol」のサーバー実装を指すことが多いようです。
http://www.faqs.org/rfcs/rfc862.html

RFC862では、エコープロトコルのポート番号に 7 を割り当てています。

A server listens for TCP connections on TCP port 7.

もちろん1024以下のポート番号を利用するには、ルート権限が必要ですが、可能ならポート番号7を利用することが望ましいでしょう。

forkについて

forkしたあと、親プロセスでハンドラを閉じていないという指摘を受けましたが、これは誤解で、GHCの「forkIO」「forkOS」は、forkシステムコールとは無関係な、スレッドを新たに生成する関数です。名前が少しまぎらわしいですね。
なお余談ですが「forkIO」は疑似スレッド、「forkOS」はネイティブスレッドを生成します。
さらに余談ですが、http://ja.wikipedia.org/wiki/食事する哲学者の問題って、ひょっとして「フォーク」と「fork」をかけてるんですかね? 大発見だと思ったんですが、全然関係ない上に間違ってますか、そうですか……。

参考リンク: Control.Concurrent

シグナルハンドリングについて

いくつかのシグナルをハンドリングしておかなければ、クライアントの動作によってサーバー自体がダウンしてしまいます。
特に危険なのがSIGPIPEです。
ソケットに対し、書き込みを行なった場合、相手側がすでにclose状態だとこのシグナルが発生します。デフォルトの動作ではプロセスが強制終了してしまいます。

参考リンク:
シグナル (ソフトウェア) - Wikipedia
SIGPIPE - Wikipedia, the free encyclopedia

以上をふまえた上で、高レベルAPIを提供するNetworkライブラリではなく、より低レベルなNetwork.Socketライブラリを使うように書き換えてみます。

main部分は以下のように変わりました。


main = withSocketsDo $ do
         let port = fromIntegral 7
         soc <- socket AF_INET Stream 0
         addr <- inet_addr "0.0.0.0"
         let sockaddr = SockAddrInet port addr
         bindSocket soc sockaddr
         listen soc 5
         -- mainスレッドではいくつかのシグナルをブロック
         blockSignals $ list2set [sigPIPE]
         putStrLn $ "start server, listening on: " ++ show port
         acceptLoop soc `finally` sClose soc

list2set = foldr addSignal emptySignalSet

read, writeについて

以前のバージョンではソケットからの読み込み・書き込みにhGetLine, hPutStrLnを利用していたのですが、これを使うと、サーバー・クライアント間の改行コードの違いなどによって問題が発生しうるという指摘を受けました。
エコープロトコルの実装としては、行ごとの読み込みではなく、文字列をすぐ読み込んで書き込む方が望ましいでしょう。


def echo_do(soc)
    while true
        buf = soc.recv(1)
        soc.write(buf)
    end
end

テスト

以上の動作確認をtelnetを手動で立ち上げて確認するのではなく、Rubyによるテストスクリプトを作成し、こちらで動作確認を行なうことにしました。


require 'test/unit'
require 'socket'

class EchoTest < Test::Unit::TestCase
    def test_echo
        #エコーのテスト
        soc = TCPSocket::new("localhost", 7)
        ["abc", "ab\na", "\n"].each do |s|
            soc.write(s)
            buf = soc.read(s.size)
            assert_equal(s, buf)
            puts buf
        end
        soc.close
    end
    def test_concurrent
        #同時接続のテスト
        socs = []
        3.times do |i|
            Thread::fork(i,socs){ |i, socs|
                sleep 0.1
                soc = TCPSocket::new("localhost", 7)
                s = "hoge"
                soc.write(s)
                buf = soc.read(s.size)
                assert_equal(s, buf)
                puts buf
                socs << soc
            }
        end
        (ThreadGroup::Default.list - [Thread.current]).each {|th| th.join}
        socs.each {|s| s.close}
    end
end

ソースコード

Haskell版とRuby版、修正したものを以下に掲載します。
なお、Haskell版のコンパイルはthreadedオプションを付け以下のようにやってください。

ghc -threaded --make -o echo2 echo2.hs

Continue reading »