<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="rss.css" type="text/css"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="ja-JP">
	<channel rdf:about="http://muziyoshiz.jp/index.rdf">
	<title>無印吉澤</title>
	<link>http://muziyoshiz.jp/</link>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/" />
	<description>このサイトではIPv6やP2Pなどの通信技術から、SNSやナレッジマネジメントなどの理論まで、広い意味での「ネットワーク」に関する話題を扱っていきます。</description>
	<dc:creator>M. Yoshizawa</dc:creator>
	<dc:rights>Copyright 2012 M. Yoshizawa, copyright of comments by respective authors</dc:rights>
	<items><rdf:Seq>
<rdf:li rdf:resource="http://muziyoshiz.jp/20080427.html#c14"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20091003.html#c01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20080702.html#c10"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20080702.html#c09"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20080702.html#c08"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20080702.html#c07"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20100302.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20091013.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20071102.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20070909.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20100104.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20091017.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20091003.html#p01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20090808.html#c01"/>
<rdf:li rdf:resource="http://muziyoshiz.jp/20090808.html#p01"/>
</rdf:Seq></items>
</channel>
<item rdf:about="http://muziyoshiz.jp/20080427.html#c14">
<link>http://muziyoshiz.jp/20080427.html#c14</link>
<dc:date>2012-05-11T10:43:16+09:00</dc:date>
<title>2008-04-27のツッコミ[14] (もらる)</title>
<dc:creator>もらる</dc:creator>
<description>売上を上げたいのなら スケジュー..</description>
<content:encoded><![CDATA[売上を上げたいのなら<br>スケジュールは大切だよ！<br><a href="http://www.offisnail.info">http://www.offisnail.info</a>]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20091003.html#c01">
<link>http://muziyoshiz.jp/20091003.html#c01</link>
<dc:date>2012-04-26T11:32:32+09:00</dc:date>
<title>2009-10-03のツッコミ[1] (中村　智)</title>
<dc:creator>中村　智</dc:creator>
<description>自作アプリを宣伝するために、hitois（ヒトイス：http://www.hitois.net）を使ってみませんか？  hitoisはSNSですが、登録内容は全て公開されるという特性上、自分のホームページを作成するツールとしても使えるのです。  hitoisにはプロジェクトという機能があります。wiki形式でサイトを作成する機能ですが、自分のサイトにwiki形式のページを追加していくことで、サイトを作成していく事ができます。プ..</description>
<content:encoded><![CDATA[自作アプリを宣伝するために、hitois（ヒトイス：<a href="http://www.hitois.net">http://www.hitois.net</a>）を使ってみませんか？<br><br>hitoisはSNSですが、登録内容は全て公開されるという特性上、自分のホームページを作成するツールとしても使えるのです。<br><br>hitoisにはプロジェクトという機能があります。wiki形式でサイトを作成する機能ですが、自分のサイトにwiki形式のページを追加していくことで、サイトを作成していく事ができます。プロジェクトはいくつでも作成することができるため、作成したアプリ毎にプロジェクトを作成し、キャプチャや説明、宣伝を掲載することが出来ます。<br><br>自分のホームページにアプリ宣伝用のサイトを追加していくわけですから、自分のサイトにプロフィール等を載せておくことで、信頼感も増します。<br><br>また、hitoisはSNSなので、友人にアプリを紹介したり、アプリのコミュニティを立ち上げることも出来ます。そうすることで、アプリをより多くの人に知ってもらうことができるのです。<br><br>自作アプリの宣伝に、ぜひhitoisを使ってみてください。]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20080702.html#c10">
<link>http://muziyoshiz.jp/20080702.html#c10</link>
<dc:date>2011-01-26T19:11:47+09:00</dc:date>
<title>2008-07-02のツッコミ[10] (omメールくん)</title>
<dc:creator>omメールくん</dc:creator>
<description>riro是非やってみたいの..</description>
<content:encoded><![CDATA[riro是非やってみたいので、<br>誰か、招待状お願いいたします。<br>]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20080702.html#c09">
<link>http://muziyoshiz.jp/20080702.html#c09</link>
<dc:date>2010-03-22T23:16:32+09:00</dc:date>
<title>2008-07-02のツッコミ[9] (ねぎ醤油)</title>
<dc:creator>ねぎ醤油</dc:creator>
<description>ご招待、有難うございました。..</description>
<content:encoded><![CDATA[ご招待、有難うございました。これから楽しんでみようと思います。]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20080702.html#c08">
<link>http://muziyoshiz.jp/20080702.html#c08</link>
<dc:date>2010-03-22T11:01:55+09:00</dc:date>
<title>2008-07-02のツッコミ[8] (吉澤＠無印吉澤)</title>
<dc:creator>吉澤＠無印吉澤</dc:creator>
<description>招待状送りました。   ----  本文にも追記しましたが、僕..</description>
<content:encoded><![CDATA[招待状送りました。<br><br>&#160;----<br><br>本文にも追記しましたが、僕自身がもうriroを使っていないので<br>招待状キャンペーンはここまでということでお願いします。]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20080702.html#c07">
<link>http://muziyoshiz.jp/20080702.html#c07</link>
<dc:date>2010-03-22T02:51:01+09:00</dc:date>
<title>2008-07-02のツッコミ[7] (ねぎ醤油)</title>
<dc:creator>ねぎ醤油</dc:creator>
<description>私もリロをやってみたいです♪ ..</description>
<content:encoded><![CDATA[私もリロをやってみたいです♪<br>よかったら、どうか招待状をお願いします♪]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20100302.html#p01">
<link>http://muziyoshiz.jp/20100302.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20100302.html#p01" />
<dc:date>2010-03-02T21:02:39+09:00</dc:date>
<title>[programming]Google DevFest 2010 Japan Quizの問題とその答えの一例（Rubyで解きました）</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>programming</dc:subject>
<description>これまでのあらすじ： 3/18(木)に開催されるGoogle DevFest 2010の募集がかけられた。参加したらNexus Oneがただで貰えるのではないかと見込んだ（僕みたいな）応募者が殺到したせいかどうかは知らないが、参加希望者は定員の400名をオーバーしていた。そこで、参加希望者を上位400名に絞り込むためのプログラミングクイズがGoogleから参加希望者に送りつけられ、Nexus Oneに釣られた参加希望者はそれを嬉々として解いてしまうのだった。Nexus Oneなんて配られないとも知らずに……。    ----   そんなDevFest Quizも終わり、採点結果が参加希望者に送られたようなので、せっかくだから僕の答えも公開してみます。まあ、基本的に問題文通りの処理をベタ書きしただけですけど。   DevFest Quizは全部で10問出題され、プログラミングの問題は以下の3題でした。androidzaurusさんによる以下のまとめを見ると、みんな思い思いの言語で解いたみたいですね。僕はRubyで解きました。   みんなの回答のまとめ：はてなブックマーク - 安藤恐竜..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=programming">programming</a>]Google DevFest 2010 Japan Quizの問題とその答えの一例（Rubyで解きました）</h3><p>

これまでのあらすじ：<br/>
3/18(木)に開催されるGoogle DevFest 2010の募集がかけられた。参加したらNexus Oneがただで貰えるのではないかと見込んだ（僕みたいな）応募者が殺到したせいかどうかは知らないが、参加希望者は定員の400名をオーバーしていた。そこで、参加希望者を上位400名に絞り込むためのプログラミングクイズがGoogleから参加希望者に送りつけられ、Nexus Oneに釣られた参加希望者はそれを嬉々として解いてしまうのだった。Nexus Oneなんて配られないとも知らずに……。
</p>
<p>
 ----
</p>
<p>
そんなDevFest Quizも終わり、採点結果が参加希望者に送られたようなので、せっかくだから僕の答えも公開してみます。まあ、基本的に問題文通りの処理をベタ書きしただけですけど。
</p>
<p>
DevFest Quizは全部で10問出題され、プログラミングの問題は以下の3題でした。androidzaurusさんによる以下のまとめを見ると、みんな思い思いの言語で解いたみたいですね。僕はRubyで解きました。
</p>
<p>
みんなの回答のまとめ：<a href="http://b.hatena.ne.jp/androidzaurus/DevFestQuiz/">はてなブックマーク - 安藤恐竜のブックマーク - DevFestQuiz</a>
</p>
<p>
 ----
</p>
<p>
■ 暗号通信（配点：4.0点）
</p>
<blockquote>
<p>
あなたの登録したメールアドレスを、このクイズサーバーに転送して下さい。 ただし、次のような暗号化をしてください。
</p>
<ul>
<li>A → L
</li>
<li>B → M
</li>
<li>C → N
</li>
<li>D → O
</li>
<li>E → P
</li>
<li>中略 → 中略
</li>
<li>Z → K
</li>
<li>a → l
</li>
<li>b → m
</li>
<li>c → n
</li>
<li>中略 → 中略
</li>
<li>z → k
</li>
<li>@ → @
</li>
<li>1 → 1
</li>
</ul>
<p>

変換したメールアドレスと、次のキーワード : "（省略）" とを一緒に、<a href="http://devquiz.appspot.com/personalpost">http://devquiz.appspot.com/personalpost</a> までpostしてください。 二つのデータは以下のようにjson形式にして、POSTの本文に text/plain 形式で入れてください。
</p>
<pre>{
  &quot;key&quot;: キーワード
  &quot;pass&quot;: 変換されたメールアドレス
}
</pre>
<p>

</p>

</blockquote>
<p>

この問題は、自分のメールアドレスを変換するところまではRubyでプログラムを書いたのですが、データをpostするところはFirefoxアドオンの<a href="https://addons.mozilla.org/ja/firefox/addon/5946">RestTest</a>で送りつけて済ませちゃいました。
</p>
<p>
メールアドレスの変換処理は以下のようにベタに書いたんですが、他の人の答えを見てると、Rubyだったらtrっていうメソッドを使うと楽に解けたみたいです。なんでみんなそんなの知ってるの……と思ったらPerl由来なんだそうで。なるほど。
</p>
<pre>email = &quot;メールアドレス&quot;

BEFORE = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@.1234567890&quot;
AFTER  = &quot;LMNOPQRSTUVWXYZABCDEFGHIJKlmnopqrstuvwxyzabcdefghijk@.1234567890&quot;

converted_email = &quot;&quot;

email.split(&quot;&quot;).each do |str|
  regex = Regexp.new(Regexp.escape(str))
  idx = (BEFORE =~ regex)
  converted_email += AFTER[idx, 1]
end

print converted_email
</pre>
<p>

 ----
</p>
<p>
■ パッチワーク（配点：5.0点）
</p>
<blockquote>
<p>
ここ（実際はテキストファイルへのリンク）に "A" または "B" という文字のみを含む 600 桁、600 行のテキストがあります。 これを 600 x 600 の升目状に並べ、上下左右に同じ文字がある部分をつながっているとみなします。
</p>
<p>
まず、最も多くの文字がつながっている領域をすべて "_" で塗りつぶしてください。 最も多くの文字がつながっている領域が複数存在するならば、それらすべての領域を "_"で塗りつぶすこととします。
</p>
<p>
そして、各行ごとに "_" が何個含まれているかを数え、それらの数値を改行区切りのテキスト（600 行）として答えてください。
</p>
<p>
以下の例1を見てください。この入力には単一の文字4つでつながった領域が3箇所あります。これらすべてが「最も多くの文字がつながっている領域」なので、全て"_"で塗りつぶし、その数を数えています。
</p>
<p>
例1:<br/>
入力
</p>
<pre>ABAAB
BABAA
BAABB
ABABB
BABAA
</pre>
<p>

塗りつぶしたところ.
</p>
<pre>AB__B
B_B__
B____
AB___
BABAA
</pre>
<p>

答え
</p>
<pre>2
3
4
3
0
</pre>
<p>

例2:<br/>
入力
</p>
<pre>AAABABAAAA
ABBBBBABAA
BAABAAABAA
BBAABABABA
BAABBAAABA
AABABAABAB
ABAABBABAB
BABBBABABB
BABABBAABB
BBBABABAAA
</pre>
<p>

塗りつぶしたところ.
</p>
<pre>AAABAB____
ABBBBB_B__
BAAB___B__
BBAAB_B_B_
BAABB___B_
AABAB__BAB
ABAABB_BAB
BABBBABABB
BABABBAABB
BBBABABAAA
</pre>
<p>

答え
</p>
<pre>4
3
5
3
4
2
1
0
0
0
</pre>
<p>

</p>

</blockquote>
<p>

これは、最初なにかエレガントな解決方法があるんじゃないかと色々試したんですが、処理にやたら時間がかかったり、結局正解が出なかったりしました……。なので、結局以下のようにいちいち探索する処理を書いて解きました。
</p>
<p>
それぞれの動作は、ソースコード中のコメントの通りです。読んでもわかりにくいところとしては、check_groupメソッドがインスタンス変数@input_arrayやら@checked_arrayを参照してるところでしょうか。上から順に処理を書いていったらこうなったんですが、正直かなり汚いコードですね、こりゃ。
</p>
<pre># 問題の読み込み
@input = []
open(&quot;patchworkinput.txt&quot;) {|file|
  while line = file.gets
    @input &lt;&lt; line.chomp
  end
}

# 幅と高さ（これは不要だったかも）
@width = @input.first.size
@height = @input.size

# 読み込んだ値を入れる二次元配列
# Aなら0、Bなら1とする
@input_array = []
A = 0
B = 1

# それぞれの値をチェック済みか記録する二次元配列
# チェック前なら0、チェック済みなら1とする
@checked_array = []
UNCHECKED = 0
CHECKED = 1

# 二次元配列に初期値を設定
@input.each_with_index do |line, y|
  line.split(&quot;&quot;).each_with_index do |c, x|
    @input_array[y] ||= []
    @input_array[y][x] = (c == &quot;A&quot; ? A : B)

    @checked_array[y] ||= []
    @checked_array[y][x] = UNCHECKED
  end
end

# 個々の点を始点として、再帰的に値をチェックするための関数
# 返り値として、マッチした文字の数を返す
# xは横軸、yは縦軸の座標（いずれも0開始）、valueはマッチすべき値（AまたはB）
def check_group(x, y, value)
  # 座標が枠外なら0を返す
  return 0 if x &lt; 0 or y &lt; 0 or x &gt;= @width or y &gt;= @height

  # その枠が既にチェックされていたら0を返す
  return 0 if @checked_array[y][x] == CHECKED

  # その枠の値がvalueと違ったら0を返す
  return 0 unless @input_array[y][x] == value

  # その枠の値がvalueと同じだったら、チェックを入れる
  @checked_array[y][x] = CHECKED

  # 上下左右を再帰的にチェックする
  1 + check_group(x - 1, y, value) + check_group(x + 1, y, value) +
    check_group(x, y - 1, value) + check_group(x, y + 1, value)
end

# [ チェックに使った始点x軸, 始点y軸, 値, 一致した要素の数 ] の配列を格納する変数
results = []

@input_array.each_with_index do |line, y|
  line.each_with_index do |value, x|
    # その枠が既にチェックされていたらパス
    next if @checked_array[y][x] == CHECKED
    results &lt;&lt; [ x, y, value, check_group(x, y, value) ]
  end
end

# 一致した要素の数の最大値を計算
max_num = 0
results.each do |res|
  max_num = res[3] if max_num &lt; res[3]
end

# 一致した要素の数が最大のものだけを選択
max_results = results.select{|res| max_num == res[3] }

# 二次元配列をすべてリセット
@input_array = []
@checked_array = []
@input.each_with_index do |line, y|
  next if y &gt;= @height

  line.split(&quot;&quot;).each_with_index do |c, x|
    next if x &gt;= @width

    @input_array[y] ||= []
    @input_array[y][x] = (c == &quot;A&quot; ? A : B)

    @checked_array[y] ||= []
    @checked_array[y][x] = UNCHECKED
  end
end

# 今度は、正解部分だけをチェックする
max_results.each do |res|
  check_group(res[0], res[1], res[2])
end

# 各行の正解数を数えて、ファイルに書き込む
open(&quot;result.txt&quot;, &quot;w&quot;) do |f|
  @checked_array.each do |line|
    f.puts line.select{|l| l == CHECKED }.size
  end
end
</pre>
<p>

</p>
<p>
 ----
</p>
<p>
■ 漢字変換サーバ（配点：7.0点）
</p>
<blockquote>
<p>
数字を漢数字に変換するアプリケーションを作ってください。
</p>
<p>
<a href="http://">http://</a>[あなたのアプリケーションのURL]?n=[数字] にアクセスすると、 text/plain でその数字を漢数字に変換した結果を返すウェブサーバを作ってください。 ただし、漢字はすべて以下の表の通りにアルファベットに変換して出力してください。
</p>
<ul>
<li>零 → K
</li>
<li>一 → E
</li>
<li>二 → Y
</li>
<li>三 → M
</li>
<li>四 → B
</li>
<li>五 → H
</li>
<li>六 → P
</li>
<li>七 → Z
</li>
<li>八 → N
</li>
<li>九 → J
</li>
<li>十 → X
</li>
<li>百 → G
</li>
<li>千 → F
</li>
<li>万 → U
</li>
<li>億 → T
</li>
<li>兆 → L
</li>
</ul>
<p>

注意:
</p>
<ul>
<li>「千万」「千億」「千兆」の前に「一」がつかないようにしてください。
</li>
<li>入力は負でない整数で、大きさは高々9999兆9999億9999万9999までです。
</li>
<li>標準のポート番号80番のみ扱えます。
</li>
</ul>
<p>

</p>

</blockquote>
<p>

僕が問題を解いたときは「一」に関する注意書きがなかったような気がするんですが、ミスする人が多かったんですかね。気持ちは分かります。
</p>
<p>
それで回答の方針ですが、僕は数字を漢数字に変換するKanjiクラスを作って、それを呼び出す形にしました。テストケースを書きたかったというのもあって、変換処理は独立したクラスとして実装しています。
</p>
<p>
まず、Kanjiクラスを呼び出すnk_application.rb。このファイルに実行権を与えて公開します。
</p>
<pre>#!/usr/bin/env ruby
require &quot;cgi-lib&quot;
require &quot;kanji&quot;

input = CGI.new

print &quot;Content-type: text/plain\n\n&quot;

str = Kanji.num2kanji(input[&quot;n&quot;])
print str if str
</pre>
<p>

次に、Kanjiクラスを実装したkanji.rb。かなりベタベタにかいてます。
</p>
<pre>class Kanji
  def self.num2kanji(number)
    # 数字以外は無視
    unless number =~ /^\d+$/
      return nil
    end

    # 京に達してたら無視
    if number.size &gt; 16
      return nil
    end

    # 値が0の時は、零 → K を返す
    if number.to_i == 0
      return &quot;K&quot;
    end

    # 数字を後ろから4個ずつの固まり（チャンク）に区切る
    numbers = []

    # 部分文字列を作るためのインデックスと長さ
    index = number.size
    length = 4

    while index &gt; 0
      if index &lt; 4
        length = index
        index = 0
      else
        index = index - 4
      end

      numbers &lt;&lt; number[index, length]
    end

    # 下の位から取っているので、順序を入れ替える
    numbers.reverse!

    # 返り値
    kanji = &quot;&quot;

    numbers.each_with_index do |fournum, i|
      # 数値に変換してゼロだったら何もしない
      next if fournum.to_i == 0

      kanji += fournum2kanji(fournum)
      case numbers.size - i
      when 4
        # 兆 → L
        kanji += &quot;L&quot;
      when 3
        # 億 → T
        kanji += &quot;T&quot;
      when 2
        # 万 → U
        kanji += &quot;U&quot;
      end

    end

    kanji
  end

  # 零が出てくるのは0のときだけと思われるので、それは無視する
  # （0だけは例外として、もっと手前で扱う）
  BEFORE = &quot;123456789&quot;
  AFTER  = &quot;EYMBHPZNJ&quot;

  # 4文字の数字を、何千何百何十何、まで変換して返します。
  def self.fournum2kanji(fournum)
    kanji = &quot;&quot;

    fournum.split(&quot;&quot;).each_with_index do |num, i|
      regex = Regexp.new(Regexp.escape(num))
      idx = (BEFORE =~ regex)

      if idx
        case fournum.size - i
        when 4
          # 千 → F
          # 1だけ特別扱い（一千、とは言わない）
          kanji += AFTER[idx, 1] unless num == &quot;1&quot;
          kanji += &quot;F&quot;
        when 3
          # 百 → G
          # 1だけ特別扱い（一百、とは言わない）
          kanji += AFTER[idx, 1] unless num == &quot;1&quot;
          kanji += &quot;G&quot;
        when 2
          # 十 → X
          # 1だけ特別扱い（一十、とは言わない）
          kanji += AFTER[idx, 1] unless num == &quot;1&quot;
          kanji += &quot;X&quot;
        when 1
          kanji += AFTER[idx, 1]
        end
      end
    end

    kanji
  end
end
</pre>
<p>

で、最後に「一千」とかの扱いに不安があったので、このKanjiクラスをテストするkanji_test.rbも書きました。
</p>
<pre>require 'test/unit'
require 'kanji'

class TestKanji &lt; Test::Unit::TestCase

  def setup
  end

  def teardown
  end


  def test_num2kanji
    # 零 → K
    # 一 → E
    # 二 → Y
    # 三 → M
    # 四 → B
    # 五 → H
    # 六 → P
    # 七 → Z
    # 八 → N
    # 九 → J
    # 十 → X
    assert_equal(&quot;K&quot;, Kanji.num2kanji(&quot;0&quot;))
    assert_equal(&quot;E&quot;, Kanji.num2kanji(&quot;1&quot;))
    assert_equal(&quot;Y&quot;, Kanji.num2kanji(&quot;2&quot;))
    assert_equal(&quot;M&quot;, Kanji.num2kanji(&quot;3&quot;))
    assert_equal(&quot;B&quot;, Kanji.num2kanji(&quot;4&quot;))
    assert_equal(&quot;H&quot;, Kanji.num2kanji(&quot;5&quot;))
    assert_equal(&quot;P&quot;, Kanji.num2kanji(&quot;6&quot;))
    assert_equal(&quot;Z&quot;, Kanji.num2kanji(&quot;7&quot;))
    assert_equal(&quot;N&quot;, Kanji.num2kanji(&quot;8&quot;))
    assert_equal(&quot;J&quot;, Kanji.num2kanji(&quot;9&quot;))
    assert_equal(&quot;X&quot;, Kanji.num2kanji(&quot;10&quot;))

    # 九十九
    assert_equal(&quot;JXJ&quot;, Kanji.num2kanji(&quot;99&quot;))

    # 百 → G
    assert_equal(&quot;G&quot;, Kanji.num2kanji(&quot;100&quot;))

    # 百一
    assert_equal(&quot;GE&quot;, Kanji.num2kanji(&quot;101&quot;))

    # 九百九十九
    assert_equal(&quot;JGJXJ&quot;, Kanji.num2kanji(&quot;999&quot;))

    # 千 → F
    # 1000 は 千
    assert_equal(&quot;F&quot;, Kanji.num2kanji(&quot;1000&quot;))
    
    # 千一
    assert_equal(&quot;FE&quot;, Kanji.num2kanji(&quot;1001&quot;))

    # 千十
    assert_equal(&quot;FX&quot;, Kanji.num2kanji(&quot;1010&quot;))

    # 万 → U
    # 1万 は 一万
    assert_equal(&quot;EU&quot;, Kanji.num2kanji(&quot;10000&quot;))

    # 億 → T
    # 1億 は 一億
    assert_equal(&quot;ET&quot;, Kanji.num2kanji(&quot;100000000&quot;))

    # 兆 → L
    # 1兆 は 一兆
    assert_equal(&quot;EL&quot;, Kanji.num2kanji(&quot;1000000000000&quot;))

    # 9999兆9999億9999万9999
    assert_equal(&quot;JFJGJXJLJFJGJXJTJFJGJXJUJFJGJXJ&quot;, Kanji.num2kanji(&quot;9999999999999999&quot;))

    # この範囲を超えたらエラー
    assert_equal(nil, Kanji.num2kanji(&quot;10000000000000000&quot;))
  end

end
</pre>
<p>

動作中のサンプルはこちら：<a href="http://muziyoshiz.jp/archives/devfest2010/nk_application.rb">http://muziyoshiz.jp/archives/devfest2010/nk_application.rb</a>
</p>
<p>
 ----
</p>
<p>
僕の答えはこんな感じだったのですが、いかがでしたでしょうか。何か（物笑いとか）のネタになれば幸いです。

</p>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20091013.html#p01">
<link>http://muziyoshiz.jp/20091013.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20091013.html#p01" />
<dc:date>2010-03-02T20:16:30+09:00</dc:date>
<title>[programming][GAE]RDBからGoogle App Engineのデータストアに乗り換えるときのつまずきポイントとか実例とか</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>programming</dc:subject>
<dc:subject>GAE</dc:subject>
<description>先週末は、某温泉街に籠もってGoogle App Engine（GAE）を色々いじって遊ぶという2泊3日の合宿に参加してました。合宿と言っても「GAE」以外に特にテーマも決まって無くて、みんな適当に好きなことをやってたんですが、僕はGAEの初心者なので、   「リレーショナルデータベースのために書かれたテーブル定義を、Google App Engineに置き換えようとしたらどれくらい大変なのか？」   をテーマに決めて、下の本を読みながらコードを書いたり消したりして遊んでました。    Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)((株)グルージェント)    ----   ■ 先にまとめ   まだ勘違いも多そうですが、今回分かった「リレーショナルデータベースに慣れた人のつまずきポイント」を先にまとめておきます。     GAEのデータストアでは、複合主キーのある表を作れない。     例えばJDOだと、@Prim..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=programming">programming</a>][<a href="./?category=GAE">GAE</a>]RDBからGoogle App Engineのデータストアに乗り換えるときのつまずきポイントとか実例とか</h3><p>

先週末は、某温泉街に籠もってGoogle App Engine（GAE）を色々いじって遊ぶという2泊3日の合宿に参加してました。合宿と言っても「GAE」以外に特にテーマも決まって無くて、みんな適当に好きなことをやってたんですが、僕はGAEの初心者なので、
</p>
<p>
<strong>「リレーショナルデータベースのために書かれたテーブル定義を、Google App Engineに置き換えようとしたらどれくらい大変なのか？」</strong>
</p>
<p>
をテーマに決めて、下の本を読みながらコードを書いたり消したりして遊んでました。
</p>
<p>
<a href="http://www.amazon.co.jp/Google-Engine-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89-PRESS%E3%83%97%E3%83%A9%E3%82%B9%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774139858%3FSubscriptionId%3D1F9ZB25T785C6BC6EWG2%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774139858"><img class="amazon" src="http://ecx.images-amazon.com/images/I/51S5E3PHJFL._SL160_.jpg"
height="160" width="113"
alt="Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)((株)グルージェント)" title="Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)((株)グルージェント)">
Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)((株)グルージェント)</a>
</p>
<p>
 ----
</p>
<p>
■ 先にまとめ
</p>
<p>
まだ勘違いも多そうですが、今回分かった「リレーショナルデータベースに慣れた人のつまずきポイント」を先にまとめておきます。
</p>
<ul>
<li><p>
 GAEのデータストアでは、複合主キーのある表を作れない。

</p>
<ul>
<li> 例えばJDOだと、@PrimaryKeyを複数のインスタンス変数に付けるとコンパイル時に例外が出る。
</li>
<li> ちなみに、主キーのない表も作れない。こちらもコンパイル時に例外が出る。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 一意なIDを割り当てるためのカウンター（オートインクリメント機能）が必要なら、自前で実装する必要がある。

</p>
<ul>
<li> トランザクション処理を使うことで、このようなカウンターを実装できる。
</li>
<li> JDOインターフェイスでは、valueStrategyにIdGeneratorStrategy.INCREMENT（なんかそれっぽい）を選べるが、GAEでは使えないらしく実行時に例外が出る。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 UNIQUE制約に相当する機能もない。恐らく、自前で実装することもできない？

</p>
<ul>
<li> UNIQUE制約は、自前で定義することもできない、ような気がする……。
</li>
<li> GAEのトランザクション処理は参照したデータに対する排他処理のため、新しく追加する行の値に対する制約にはなり得ないのではないか。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 多対多の関係を表現しにくい。

</p>
<ul>
<li> リレーショナルデータベースに慣れていると、多対多の関係を表現するときは、関係を表す表を新たに追加したくなってしまうけど……。
</li>
<li> GAEでは複数の表をまたがるトランザクションは基本的に作れないので、途中で処理に失敗した場合の例外処理を書くのがすごく面倒。
</li>
<li> 当然、JOIN処理なんて無い。
</li>
<li> 多対多を実現する方法としては、一方の表に、もう一方のIDのリストを格納する列を用意すると楽。GAEでは、「リスト内のいずれかの値がAに一致する」といった検索クエリを「listItems == :A」のような形で記述できる。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 JDOとJPAのどっちを使えばいいのか分からない。

</p>
<ul>
<li> JPAを選んでもリレーショナルデータベース固有の機能は使えないので、JDOを使っておけば良いような気がする。でも、情報がなくてよく分からない……。
</li>
</ul>
<p>

</p>
</li>
</ul>
<p>

以下は、上のつまずきポイントに気付くまでに、実際に書いたり消したりしていたソースコードの話です。文章の最後にソースコードも置いておきましたので、興味のある方はダウンロードしてみてください。
</p>
<p>
 ----
</p>
<p>
■ 具体例
</p>
<p>
<a href="http://muziyoshiz.jp/20091003.html#p01">最近作ったAndroidアプリ（Where's My Info?）</a>のテーブル定義がシンプルだったので、これをGAEのデータストアに置き換えることを試みました。GAEのデータストアへのアクセス方法は以下の3種類があるのですが、今回は最も情報が多いJDOを使っています。
</p>
<ul>
<li> JDOインターフェイス（Java Data Objects、汎用的な仕様）
</li>
<li> JPAインターフェイス（Java Persistence API、RDB向け）
</li>
<li> ローレベルAPI（Key-Valueで値を保持するAPI、高速だが低機能）
</li>
</ul>
<p>

まず、元にしたAndroidアプリのテーブル定義は、以下のようなものです。個人情報（information）と情報提供先（knowers）の関係を、主キーのないinformation_knowersテーブルで表現しています。
</p>
<p>
<a href="./images/20091013_0.png"><img src="./images/s20091013_0.jpg" alt="リレーショナルデータベースの場合"  class="none"></a>
</p>
<p>
これを、GAEのデータストアで定義すると、以下のようになります。GAE上で扱う表のことを、ここでは「エンティティ」と呼んでいます。
</p>
<p>
<a href="./images/20091013_1.png"><img src="./images/s20091013_1.jpg" alt="GAEのデータストアの場合"  class="none"></a>
</p>
<p>
こうして見ると、リレーショナルデータベースでの定義と比べて、やや汚くなってるのが分かります。以下は、リレーショナルデータベース版との違いです。
</p>
<ul>
<li> Knowerエンティティの列に、関係するInformationのIDのリストを追加。
</li>
<li><p>
 IDを一意に割り当てるためのカウンタを追加。

</p>
<ul>
<li> 主キーが必須なので、ダミーの主キーを定義している。
</li>
<li> 今この資料を書きながら思ったけど、IDを一意に割り当てるためのカウンタ類は、1つのエンティティにまとめてしまえそう……。
</li>
</ul>
<p>

</p>
</li>
</ul>
<p>

で、最後にこのアプリを、ユーザ毎に別の領域にデータを格納できるように拡張すると、データストアの定義は以下のようになります。
</p>
<p>
<a href="./images/20091013_2.png"><img src="./images/s20091013_2.jpg" alt="GAEのデータストアの場合（拡張版）"  class="none"></a>
</p>
<ul>
<li> 「110487681081245093660」というのは、Googleが提供するアカウント認証サービスから取得できる、ユーザ毎に一意なユーザID。
</li>
<li><p>
 InformationエンティティとKnowerエンティティのキーには、ユーザID + "/" + ユーザ毎に一意なIDを使っている。

</p>
<ul>
<li> ユーザIDとユーザ毎に一意なIDを組み合わせた複合主キーが使えたら、ホントはそっちの方がよかったんだけど……。
</li>
<li> <a href="http://code.google.com/intl/ja/appengine/docs/python/datastore/queriesandindexes.html">クエリとインデックス</a>の方法を使って前方一致検索をすることで、特定のユーザに関係する列のみを取り出すことができる。リンク先にあるのはPython版のコードだが、Java版でも同じ方法が使える。
</li>
</ul>
<p>

</p>
</li>
</ul>
<p>

実例とソースコードを、それぞれ以下の場所に置いておいたので、もし興味があったら覗いてみてください。
</p>
<p>
実例（注意：管理者＝僕にはデータ丸見えなので、ホントの個人情報は書かないで！）<br/>
<a href="http://wheres-my-info.appspot.com/">http://wheres-my-info.appspot.com/</a>
</p>
<p>
ソースコード（上の実例で動いてるのと同じものです）<br/>
<a href="archives/WheresMyInfoWeb.zip">WheresMyInfoWeb.zip</a>
</p>
<p>
 ----
</p>
<p>
■ 感想
</p>
<p>
Eclipseのプラグインを使ってると、Google App Engineのソースコードを書くのも、本番環境にデプロイするのもすごく簡単です。でも、このデータストアを使って大規模なコードを書くのは、正直言って全然出来そうな気がしません。
</p>
<p>
こんなのを使ってあんなgmailみたいな巨大アプリを書いてると思うと、やっぱりGoogleの連中はイッちゃってるよ、あいつら未来に生きてんな……と思っていたら、今回の合宿の参加者から「Googleの中では、BigTableに（GAEには含まれてない）Chubbyを組み合わせて使ってるんじゃない？」との指摘が。そんな、ひどい……。

</p>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20071102.html#p01">
<link>http://muziyoshiz.jp/20071102.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20071102.html#p01" />
<dc:date>2010-03-02T20:16:19+09:00</dc:date>
<title>[programming]LinearNoteのデモ用サーバ（linearnote.org）を立ててみました</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>programming</dc:subject>
<description>以前の日記で紹介したLinearNoteのデモ用サーバを立ててみました。こちらへどうぞ（↓）。   LinearNote http://linearnote.org/      LinearNoteというのは、Webアプリの勉強をかねて最近開発しているメモ帳アプリケーションです。基本的には、会社とかの組織内でLinearNoteのサーバを1つ立てて、そこをみんなで利用するという使い方を想定しています。LinearNoteの目標については、9月9日の日記（LinearNote: Ruby on Railsで動くWikiのようなblogのようなメモ帳）をご参照ください。   で、今回はこのLinearNoteのデモのために、知り合いの足長おじさんからサーバを間借りしました（ありがとうございます）。   LinearNote自体には自由にユーザ登録（Sign Up）する機能もあるのですが、linearnote.orgの運用ではこのユーザ登録機能をオフにしてあります……まあ、あくまで使い勝手が見られる程度のデモだと思ってください。ユーザ登録しなくても、誰でも全ての内容を読み書きできるサンド..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=programming">programming</a>]LinearNoteのデモ用サーバ（linearnote.org）を立ててみました</h3><p>

<a href="http://muziyoshiz.jp/20070909.html#p01">以前の日記</a>で紹介したLinearNoteのデモ用サーバを立ててみました。こちらへどうぞ（↓）。
</p>
<p>
LinearNote<br>
<a href="http://linearnote.org/">http://linearnote.org/</a>
</p>
<p>
<a href="http://linearnote.org/"><img src="./images/s20071102_0.jpg" alt="linearnote.org"  class="none"></a>
</p>
<p>
LinearNoteというのは、Webアプリの勉強をかねて最近開発しているメモ帳アプリケーションです。基本的には、会社とかの組織内でLinearNoteのサーバを1つ立てて、そこをみんなで利用するという使い方を想定しています。LinearNoteの目標については、<a href="http://muziyoshiz.jp/20070909.html#p01">9月9日の日記（LinearNote: Ruby on Railsで動くWikiのようなblogのようなメモ帳）</a>をご参照ください。
</p>
<p>
で、今回はこのLinearNoteのデモのために、知り合いの足長おじさんからサーバを間借りしました（ありがとうございます）。
</p>
<p>
LinearNote自体には自由にユーザ登録（Sign Up）する機能もあるのですが、linearnote.orgの運用ではこのユーザ登録機能をオフにしてあります……まあ、あくまで使い勝手が見られる程度のデモだと思ってください。ユーザ登録しなくても、誰でも全ての内容を読み書きできるサンドボックスを用意しました。
</p>
<p>
サンドボックス（※日本語用）<br>
<a href="http://linearnote.org/sandbox_ja">http://linearnote.org/sandbox_ja</a>
</p>
<p>
LinearNoteは基本的に一人で使う事を想定しているソフトなので、ウィキウィキしい機能（みんなで同じノートを編集する機能とか）は、まだあまりきちんと作ってません。例えば、ノート編集の排他制御とかは全く実装してないので、ときどき自分のページ更新が他の人に上書きされたりする可能性がありますが、そのあたりはご勘弁ください。
</p>
<p>
あと、今回のデモサーバ公開に合わせて、LinearNote version 0.2.0を公開しました。ご興味のある方は、<a href="http://rubyforge.org/frs/?group_id=4394">RubyForgeのダウンロードページ</a>からどうぞ。機能はあんまり増えてないのですが、この機会にバージョン番号を上げておきました（参考：<a href="http://linearnote.org/muziyoshiz/LinearNote+0.2.0+Release">日本語版のリリースノート</a>）。
</p>
<p>
最近JavaScriptを使い始めたので、バージョン0.2.0ではRJSや素のJavaScriptで書いたコードが少しずつ増えていってます。しかし、自分でいじってみて改めて思いましたけど、JavaScriptでのプログラミングってホントに地雷だらけなんですね。そのあたりの愚痴も、そのうちまとめてどこかに書きたいなあ……。
</p>
<p>
 ----
</p>
<p>
おまけ: 最近の参考図書

</p>
<ul>
<li><p>
<a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=4873113326%26tag=muziyoshiz-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/4873113326%253FSubscriptionId=1CVA98NEF1G753PFESR2">Ajax on Rails</a>

</p>
<ul>
<li>Rubyで書いたコードからJavaScriptのコードを生成するRJS（Ruby-Generated JavaScript）について詳しく書かれてます。僕がJavaScriptの世界に入ったのはここから
</li>
</ul>
<p>

</p>
</li>
<li><p>
<a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=4873113229%26tag=muziyoshiz-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/4873113229%253FSubscriptionId=1CVA98NEF1G753PFESR2">初めてのJavaScript</a>

</p>
<ul>
<li>RJSで生成したコードがなぜか動かないことが多い（ホントにけっこう多い）ので、JavaScript自体を勉強するために買った本。初心者にも分かりやすいところから、Ajaxに使ってる細かな知識まで丁寧に書かれていて参考になってます
</li>
</ul>
<p>

</p>
</li>
</ul>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20070909.html#p01">
<link>http://muziyoshiz.jp/20070909.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20070909.html#p01" />
<dc:date>2010-03-02T20:16:06+09:00</dc:date>
<title>[programming]LinearNote: Ruby on Railsで動くWikiのようなblogのようなメモ帳</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>programming</dc:subject>
<description>この夏Ruby on Railsの勉強のために作ってたアプリケーションを、RubyForgeに登録しました。   RubyForge: LinearNote: Project Info http://rubyforge.org/projects/linearnote/   ソースコードの量もまだそれほど多くない（というかかなり少ない）ので、Ruby on Railsの勉強にも役立つかもしれません。もしよかったらご覧ください。   ■ これは何？   個人的なメモの記録を目的とした、メモ帳アプリケーションです。メモ帳アプリケーションはデスクトップアプリとしてもWebアプリとしても既に色々ありますけど*1、LinearNoteは特に以下の用途に特化しています。   普段は、気軽にメモを溜めたい（手元のPCにテキストファイルを書きためるように）  でも、時々はメモの一部を他の人に公開したい。またはそのメモをベースにWikiのページを作りたい     利用イメージとしては、自宅または職場に1つLinearNoteのサーバを立てて、そこにありとあらゆるメモを残していくような感じです。   書..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=programming">programming</a>]LinearNote: Ruby on Railsで動くWikiのようなblogのようなメモ帳</h3><p>

この夏Ruby on Railsの勉強のために作ってたアプリケーションを、RubyForgeに登録しました。
</p>
<p>
RubyForge: LinearNote: Project Info<br>
<a href="http://rubyforge.org/projects/linearnote/">http://rubyforge.org/projects/linearnote/</a>
</p>
<p>
ソースコードの量もまだそれほど多くない（というかかなり少ない）ので、Ruby on Railsの勉強にも役立つかもしれません。もしよかったらご覧ください。
</p>
<p>
<strong>■ これは何？</strong>
</p>
<p>
個人的なメモの記録を目的とした、メモ帳アプリケーションです。メモ帳アプリケーションはデスクトップアプリとしてもWebアプリとしても既に色々ありますけど<span class="footnote">*1</span>、LinearNoteは特に以下の用途に特化しています。
</p>
<ul>
<li>普段は、気軽にメモを溜めたい（手元のPCにテキストファイルを書きためるように）
</li>
<li>でも、時々はメモの一部を他の人に公開したい。またはそのメモをベースにWikiのページを作りたい
</li>
</ul>
<p>

利用イメージとしては、自宅または職場に1つLinearNoteのサーバを立てて、そこにありとあらゆるメモを残していくような感じです。
</p>
<p>
書き込まれたメモはデフォルトでは非公開状態になるので、普通に使う分にはWindowsの「メモ帳」でテキストファイルを作りまくるのと同じように気軽に書けます。それに加えて、適当に書いたメモをあとで他の人に公開したくなったときに、整形したりいくつかのメモを集めて1つにしたりするところで、LinearNote特有の機能が色々とフォローするわけです。
</p>
<p>
<strong>■ 主な機能とスクリーンショット</strong>
</p>
<p>
現在のバージョン（LinearNote 0.1.0）で実装している主な機能をご紹介します。
</p>
<p>
<strong>1. 複数のノートブックをホスト</strong>
</p>
<p>
LinearNoteにユーザ登録を行うと、誰でもノートブック（1つのWikiに相当するもの）を作成できるようになります。ユーザ登録画面はこんな感じ。
</p>
<p>
<a href="./images/20070909_0.png"><img src="./images/s20070909_0.jpg" alt="ユーザ登録"  class="none"></a>
</p>
<p>
ユーザ登録すると、自分のノートブックを作れるようになります。
</p>
<p>
<a href="./images/20070909_1.png"><img src="./images/s20070909_1.jpg" alt="ノートブック作成"  class="none"></a>
</p>
<p>
ノートブックの種類は、以下の4種類から選べます……が、Groupの機能は未実装です。すいません。
</p>
<ul>
<li>Personal（所有者だけが書き込み可能）
</li>
<li>Group（許可されたメンバだけが書き込み可能）
</li>
<li>Public（登録ユーザ全員が書き込み可能）
</li>
<li>Exposed（どんなユーザも書き込み可能）
</li>
</ul>
<p>

<strong>2. プレーンテキストかPukiWiki形式でメモ</strong>
</p>
<p>
作成したノートブックでメニューの「New Note」をクリックすると、メモ（LinearNoteでは「ノート」と呼んでる）の作成画面に入ります。
</p>
<p>
<a href="./images/20070909_4.png"><img src="./images/s20070909_4.jpg" alt="ノート作成"  class="none"></a>
</p>
<p>
ノートを記入すると、画面下のプレビューが自動的に更新されます。メモのスタイルは、PlainスタイルかPukiWikiスタイルから選択できます（デフォルトのPlainスタイルを選んだ場合は、ノートが等幅フォントで表示されます）。
</p>
<p>
PukiWikiパーサには、<a href="http://www.amazon.co.jp/gp/product/4839923205/ref=nosim/muziyoshiz-22">Rubyist Magazine出張版</a>に載っている添削後のPukipa（MITライセンス）を使わせていただきました。作者のgorouさん、添削者の青木さん、ありがとうございます。
</p>
<p>
<a href="./images/20070909_5.png"><img src="./images/s20070909_5.jpg" alt="ノートのプレビュー（Plainスタイル）"  class="none"></a>（Plainスタイルの場合）
</p>
<p>
<a href="./images/20070909_7.png"><img src="./images/s20070909_7.jpg" alt="ノートのプレビュー（PukiWikiスタイル）"  class="none"></a>（PukiWikiスタイルの場合）
</p>
<p>
<strong>3. メモの表示方法をカスタマイズ</strong>
</p>
<p>
これがLinearNoteの目玉機能です。他のアプリにあってもおかしくないけど、僕は見たことないので今回作ってみました。
</p>
<p>
何も考えずに適当にメモを残していると、いざ他の人にも見せようと思ったときに再編集が面倒です。そこで、その再編集を助けるために、LinearNoteは<strong>「スマートインポート」機能</strong>を備えています。
</p>
<p>
スマートインポートとは、簡単に言うとiTunesのスマートプレイリストと同じような機能です。iTunesでは、「ジャンルがRockの曲」とか「アーティスト名がthe pillows」という条件付きのプレイリスト（スマートプレイリスト）を作ると、その後曲が増えたり減ったりしても、そのプレイリストの中身が自動的に更新されます<span class="footnote">*2</span>。参考までに、iTunesのスマートプレイリストの設定画面はこんな感じです（↓）。
</p>
<p>
<a href="./images/20070909_8.png"><img src="./images/s20070909_8.jpg" alt="iTunesのスマートプレイリスト設定"  class="none"></a>
</p>
<p>
LinearNoteのスマートインポートでも、あるノートの中に他のノートをインポートするために、「タグがp2p」とか「タイトルか本文にRuby on RailsかRoRという文字列が入っている」という条件を付けることができます。スマートインポートの設定画面は次のようになります。
</p>
<p>
<a href="./images/20070909_9.png"><img src="./images/s20070909_9.jpg" alt="LinearNoteのスマートインポート設定"  class="none"></a>
</p>
<p>
スマートインポートを設定すると、ノートの下に、条件にマッチするノートの一覧が表示されます（ノートの増減に合わせて自動更新）。加えて、このノートの一覧のRSS（図の赤丸部分）を、ノートブックの最終更新一覧のRSSとは別に配信しており、ノートブックの特定の部分だけをRSSリーダで購読できるようになっています。
</p>
<p>
<a href="./images/20070909_10.png"><img src="./images/s20070909_10.jpg" alt="スマートインポート"  class="none"></a>
</p>
<p>
これをどう使うかというと……例えば、ノートブックのトップページで「タグがdiaryのノートを読み込む」というスマートインポートを設定して、公開したいノートにだけdiaryタグを付けるようにすると、トップページだけ見ると普通のブログのように見えます。RSSも出ますしね。
</p>
<p>
ちなみに、このインポート機能は自分のノートブックに対してでなく、他の人のノートブックや、全てのノートブックに対しても実行できるので、この機能自体をRSSリーダのように使う事も可能です。
</p>
<p>
<strong>■ 使ってみるには</strong>
</p>
<p>
<strong>LinearNoteの動作例</strong>
</p>
<p>
すいません。動作例はいまのところ公開してないです。さくらのレンタルサーバじゃちょっと動きそうにないので、今後の予定も未定です……。
</p>
<p>
<strong>インストール方法</strong>
</p>
<p>
RubyForgeからソースコードをダウンロードして、普通のRuby on Railsアプリケーションと同じようにすれば動作します（詳しい手順はまた後ほど）。企業内でこっそりいじるような利用法もサポートするため、ソースコードはMITライセンスで公開しました。
</p>
<p>
RubyForge: LinearNote: Project Info<br>
<a href="http://rubyforge.org/projects/linearnote/">http://rubyforge.org/projects/linearnote/</a>
</p>
<p>
Railsアプリのgemの作り方が分からなったので、まだgemファイルはありません。
</p>
<p>
Ruby全般だとnewgemやHoeが使えそうというのは調べたんですけど、newgemはRailsとscriptファイルの名前が衝突してるし、Hoeは「binディレクトリが無い」とエラーを出すし、一体どうしたらいいのか分からないんですよね……。
</p>
<p>
<strong>動作環境</strong>
</p>
<p>
開発環境は以下の通り（要するに<a href="http://instantrails.rubyforge.org/wiki/wiki.pl">InstantRails 1.7</a>）です。が、特殊な機能は使ってないので多少違う動作環境でもおそらく動くと思います。
</p>
<ul>
<li>Windows XP SP2
</li>
<li>Ruby 1.8.6
</li>
<li>Rails 1.2.3
</li>
<li>MySQL Community Server 5.0.27
</li>
</ul>
<p>

CentOSで動作することは、ちょっとだけ確認しました。db/migrate/001_setup_database.rb の中身をいじれば、MySQL以外のデータベースでも動くはずです。多分。
</p>
<p>
<strong>■ 今後のToDo</strong>
</p>
<ul>
<li>ノートブック間でのノートの移動、コピー
</li>
<li>ユーザ同士のコミュニケーション機能（コメント機能か何か）
</li>
<li>管理者向けの機能
</li>
<li>ノートの自動保存
</li>
<li>ノートのリビジョン管理
</li>
<li>インターフェイスの改善
</li>
</ul>
<p>

<strong>■ ご意見ご感想</strong>
</p>
<p>
お待ちしています。コメント欄か、yoshizawa at muziyoshiz.jpまでお願いします。

</p>
<div class="footnote">
	<p class="footnote">*1&#160;デスクトップアプリケーションでは<a href="http://howm.sourceforge.jp/index-j.html">howm</a>や<a href="http://www.kamilabo.jp/">紙copi</a>、Webアプリケーションでは<a href="http://ninjinix.x0.com/rn/">RandomNote</a>や<a href="http://www.tiddlywiki.com/">TiddlyWiki</a>などなど。</p>
	<p class="footnote">*2&#160;「ライブアップデート」のチェックを入れている場合に限りますが、普通このチェック外しませんよね？？</p>
</div>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20100104.html#p01">
<link>http://muziyoshiz.jp/20100104.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20100104.html#p01" />
<dc:date>2010-01-04T14:58:07+09:00</dc:date>
<title>[P2P]2009年の無印吉澤と吉澤を振り返る</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>P2P</dc:subject>
<description>あけましておめでとうございます。今年も皆様よろしくお願いします。   今日の日記は、年末年始恒例の一年を振り返る日記（いわゆる反省会）です。昨年までの反省会はこちら（↓）。    2005年の無印吉澤と吉澤を振り返る   2006年の無印吉澤と吉澤を振り返る   2007年の無印吉澤と吉澤を振り返る   2008年の無印吉澤と吉澤を振り返る      ----   ■ 2009年の無印吉澤を振り返って   数えてみたら、去年は12回しか日記書いてませんでした。そのうち5回は単なるP2P SIP勉強会の告知なので、実質7回。   色々理由はあると思うのですが、その一つとしては、ちょっとした感想くらいならtwitterでつぶやいて満足してしまうようになったのが原因かもしれません。ちなみに、去年までtwitterはprotectedで使っていたのですが、今年の5月くらいからpublicにして使うようになって、そこから一気に100人以上followerが増えた一年でした。   日記を書くペースは年々落ちる一方ですが、最近はもう（後述の理由も含めて）仕方ないと自分では諦めました。諦めましたけ..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=P2P">P2P</a>]2009年の無印吉澤と吉澤を振り返る</h3><p>

あけましておめでとうございます。今年も皆様よろしくお願いします。
</p>
<p>
今日の日記は、年末年始恒例の一年を振り返る日記（いわゆる反省会）です。昨年までの反省会はこちら（↓）。
</p>
<ul>
<li> <a href="http://muziyoshiz.jp/20051231.html#p01">2005年の無印吉澤と吉澤を振り返る</a>
</li>
<li> <a href="http://muziyoshiz.jp/20070107.html#p01">2006年の無印吉澤と吉澤を振り返る</a>
</li>
<li> <a href="http://muziyoshiz.jp/20080106.html#p01">2007年の無印吉澤と吉澤を振り返る</a>
</li>
<li> <a href="http://muziyoshiz.jp/20090101.html#p01">2008年の無印吉澤と吉澤を振り返る</a>
</li>
</ul>
<p>

 ----
</p>
<p>
■ 2009年の無印吉澤を振り返って
</p>
<p>
数えてみたら、去年は12回しか日記書いてませんでした。そのうち5回は単なるP2P SIP勉強会の告知なので、実質7回。
</p>
<p>
色々理由はあると思うのですが、その一つとしては、ちょっとした感想くらいならtwitterでつぶやいて満足してしまうようになったのが原因かもしれません。ちなみに、去年までtwitterはprotectedで使っていたのですが、今年の5月くらいからpublicにして使うようになって、そこから一気に100人以上followerが増えた一年でした。
</p>
<p>
日記を書くペースは年々落ちる一方ですが、最近はもう（後述の理由も含めて）仕方ないと自分では諦めました。諦めましたけど、面白い本を読んだり、新しい技術に触れたりして、ネタが出来たときは今後も随時ここに書いていこうと思います。
</p>
<p>
2009年の読書ネタ（7月以降に読んだ本についてもそのうち……）
</p>
<ul>
<li> <a href="http://muziyoshiz.jp/20090405.html#p01">2009年1月〜3月に読んだ本</a>
</li>
<li> <a href="http://muziyoshiz.jp/20091017.html#p01">2009年4月〜6月に読んだ本</a>
</li>
</ul>
<p>

2009年の新しい技術ネタ（Androidアプリの機能追加ネタもそのうち……）
</p>
<ul>
<li> <a href="http://muziyoshiz.jp/20091003.html#p01">自作Androidアプリ「Where's My Info?」をAndroid Marketに登録してみました</a>
</li>
<li> <a href="http://muziyoshiz.jp/20091013.html#p01">RDBからGoogle App Engineのデータストアに乗り換えるときのつまずきポイントとか実例とか</a>
</li>
</ul>
<p>

 ----
</p>
<p>
■ 2009年の吉澤を振り返って
</p>
<p>
昨年は、一昨年に引き続いて仕事の忙しい一年でした。
</p>
<p>
今までは割と個人でちまちまやる仕事が多かったのですが、昨年は小さいチームのリーダ的ポジションとしてチームの回し方を考えたり、自分たちの部署の技術をよそに宣伝したり、逆によその人にインタビューしたり、色々慣れない仕事を経験させてもらいました。
</p>
<p>
その過程で気の進まない仕事をしたり、気の進まない本を読んだりする機会も多かったのですが……。結果的に、少し視野が広がって今まで気が回らなかったことにも気が回るようになったような気がしています。例えば、小さいチームでもリーダをやってみることで、自分がリーダに何を「してほしい」と思っているかをより明確に意識できるようになりました（これはあとで日記のネタにするかも）。まあ、慣れない分野に飛び出してまず経験してみることは、とても大事だなあと実感した一年でした。
</p>
<p>
その一方、慣れない仕事が続いて、家に帰ってくるとすっかり気が抜けてしまい、プライベートではなかなか新しいことに手を出せない一年でもありました。去年は読書量を増やすのが目標だったのに、夏の終わりごろからすっかり読書量が減っちゃいましたし……。
</p>
<p>
ちなみに、昨年の年末に立てた「2009年の抱負」は、以下の4つでした。
</p>
<blockquote>
<p>
1. 週一冊は本を読む<br/>
2. 読んだ本、文献や、参加したイベントについては、必ずメモを残す<br/>
3. 英語の練習を毎日続ける<br/>
4. 新しいプログラム言語を1つ覚える
</p>

</blockquote>
<p>

本は、読みかけの本や、つまらなくて読むのをやめてしまった本を除くと、上期に15冊、下期に10冊。2週間に1冊弱のペースですね。メモについては、日記にこそ書いてないですが、一応残しておいて後で読み返すようになりました。
</p>
<p>
英語の勉強については、<a href="http://www.eslpod.com/website/">ESL Podcast</a>をほぼ毎日聞いていたのと、「書く英語 基礎編」という本（↓）でライティングの勉強を始めました。ただ、それでも2009年11月に受けたTOEICでは790点になってしまった（WritingはそのままでListeningが25点落ちた）のですが。まあ、高得点にこだわっても仕方ないので、こんなものかなと。
</p>
<p>
<a href="http://www.amazon.co.jp/%E6%9B%B8%E3%81%8F%E8%8B%B1%E8%AA%9E%E3%83%BB%E5%9F%BA%E7%A4%8E%E7%B7%A8-%E6%9D%BE%E6%9C%AC-%E4%BA%A8/dp/475620029X%3FSubscriptionId%3D0VQ4VDB1VMJE2RGYE782%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D475620029X"><img class="amazon" src="http://ecx.images-amazon.com/images/I/41K477PM8FL._SL160_.jpg"
height="160" width="112"
alt="書く英語・基礎編(松本 亨)" title="書く英語・基礎編(松本 亨)">
書く英語・基礎編(松本 亨)</a>
</p>
<p>
新しいプログラム言語については、ちょっとFlexをいじってみたくて、ActionScript 3.0をかじりました。あとは、Androidアプリを作ってみたり、Google App EngineをJavaから触ったり……ってJavaばっかりですね。いかんいかん（？）。
</p>
<p>
 ----
</p>
<p>
■ 2010年の抱負
</p>
<p>
今年はあまり欲張らずに、以下の3つを抱負にします。
</p>
<ul>
<li><p>
1. 週一冊は本を読む

</p>
<ul>
<li>昨年は2週間に1冊弱のペースだったので、今年も引き続きこれを目標にインプットを増やします。あとは、量を急に増やすのは難しそうなので、出来るだけ「定番」とか「古典」とか言われてるような本を優先して読むようにしようと思います。
</li>
</ul>
<p>

</p>
</li>
<li><p>
2. 読んだ本、文献や、参加したイベントについては、必ずメモを残す

</p>
<ul>
<li>これも引き続き。出来るだけ、「他の人に話すネタ」や「他の人にアドバイスするためのロジック」の形に変えてストックしようと思い、去年から紙の日記を書いてます。まとまったら紙じゃなくてWebに書けばいいんですが、キーボードに向かうより紙に書いたほうが、僕はなぜかはかどるので……。
</li>
</ul>
<p>

</p>
</li>
<li><p>
3. 週一回は運動する

</p>
<ul>
<li>去年は仕事に熱中しすぎて体調を崩すことが多く、11月の頭には新型インフルエンザで倒れてしまったりしてたので、今年はなんとか体力を付ける方向で頑張りたいと思います。まずは週一でウォーキングをするくらいからかなぁ。
</li>
</ul>
<p>

</p>
</li>
</ul>
<p>

繰り返しになりますが、今年も無印吉澤と吉澤をよろしくお願いします。
</p>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20091017.html#p01">
<link>http://muziyoshiz.jp/20091017.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20091017.html#p01" />
<dc:date>2009-10-17T21:14:23+09:00</dc:date>
<title>[書評]2009年4月〜6月に読んだ本（みんなもマーケティング本を読むといいよ！）</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>書評</dc:subject>
<description>元旦の日記で「今年は週一冊は本を読む」と宣言したのはさっぱり守れていないのですが、4〜6月に読んだ本についてメモしておきます。この時期はマーケティング関係の本を色々読んでました。   ポジショニング戦略  コトラーのマーケティング・コンセプト  キャズム  [新版]MBAマーケティング  イノベーションのジレンマ  クリティカルチェーン  ビジュアライジング・データ      ----    ポジショニング戦略[新版](アル・ライズ/ジャック・トラウト/フィリップ・コトラー(序文))   「ポジショニング」というマーケティング用語を生み出したアル・ライズ自身による、ポジショニングの解説書です。   本書によると、ポジショニングとは「消費者の頭の中にあるイメージを操作し、それを商品に結びつける」ことと定義されています。消費者は日々膨大な情報に翻弄されているため、頭の中の情報爆発を防ぐために製品のブランドやランク付け（すなわちポジショニング）が重要である、というのが著者の主張です。原著は30年以上前に発刊されたそうなのですが、この点は今でも有効な主張に思えます。   本書では、有効なポ..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=%BD%F1%C9%BE">書評</a>]2009年4月〜6月に読んだ本（みんなもマーケティング本を読むといいよ！）</h3><p>

<a href="http://muziyoshiz.jp/20090101.html#p01">元旦の日記</a>で「今年は週一冊は本を読む」と宣言したのはさっぱり守れていないのですが、4〜6月に読んだ本についてメモしておきます。この時期はマーケティング関係の本を色々読んでました。
</p>
<ul>
<li>ポジショニング戦略
</li>
<li>コトラーのマーケティング・コンセプト
</li>
<li>キャズム
</li>
<li>[新版]MBAマーケティング
</li>
<li>イノベーションのジレンマ
</li>
<li>クリティカルチェーン
</li>
<li>ビジュアライジング・データ
</li>
</ul>
<p>

 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%83%9D%E3%82%B8%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5-%E6%96%B0%E7%89%88-%E3%82%A2%E3%83%AB%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%BA/dp/4903212076%3FSubscriptionId%3D1F9ZB25T785C6BC6EWG2%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4903212076"><img class="amazon" src="http://ecx.images-amazon.com/images/I/51WCIcQzNKL._SL160_.jpg"
height="160" width="109"
alt="ポジショニング戦略[新版](アル・ライズ/ジャック・トラウト/フィリップ・コトラー(序文))" title="ポジショニング戦略[新版](アル・ライズ/ジャック・トラウト/フィリップ・コトラー(序文))">
ポジショニング戦略[新版](アル・ライズ/ジャック・トラウト/フィリップ・コトラー(序文))</a>
</p>
<p>
「ポジショニング」というマーケティング用語を生み出したアル・ライズ自身による、ポジショニングの解説書です。
</p>
<p>
本書によると、ポジショニングとは「消費者の頭の中にあるイメージを操作し、それを商品に結びつける」ことと定義されています。消費者は日々膨大な情報に翻弄されているため、頭の中の情報爆発を防ぐために製品のブランドやランク付け（すなわちポジショニング）が重要である、というのが著者の主張です。原著は30年以上前に発刊されたそうなのですが、この点は今でも有効な主張に思えます。
</p>
<p>
本書では、有効なポジションをつかむための方法や成功例が多数紹介されているのですが、個人的に特に印象深かった話をいくつかピックアップしてみます。
</p>
<ul>
<li>重要なのは、人の頭の中に一番に入っていくこと。(p.29)
</li>
<li>新製品は、必ず既製品に対抗する形でポジショニングしなければならない。消費者の「頭の中のはしご（ある基準に基づくリスト）」を作り、その中で既製品より上に登らなければならない。(p.42)
</li>
<li>成功したいなら、ライバルのポジションを無視してはいけない。もちろん、自分のポジションを無視するなど言語道断。(p.46)
</li>
<li>どんなポジションでも良い、自社がすでに消費者の中に確立したポジションを活用する。(p.52)
</li>
<li>パワーのある企業がよい商品を生むのではなく、パワーのある商品がよい企業を生み出す。例えば、コカ・コーラ社は、コカ・コーラという製品が持つ実力（製品力）の反映でしかない。(p.63)
</li>
<li>自社製品ラインナップの抜け（工場の穴）を埋めるのは間違っている。消費者の頭の中でなく、工場の中で穴を探してしまうと、市場におけるポジションを見逃してしまう。その穴は、市場では既にほかの製品に埋められていないか？(p.76)
</li>
<li>新商品には新名称が鉄則。新しい商品に既存ブランドの名前を付けるのは、情報社会では命取りになりかねない失策。(p.126)
</li>
</ul>
<p>

Eric Sink on the Business of Softwareでこの本が強く薦められているのを見て、「マーケティング本か……」とやや尻込みしながら読んだのですが、マーケティング用語を全然知らなくても、読み物として十分面白く読める本でした。マーケティングに興味を持つための取りかかりの本としては、かなりお勧めできます。
</p>
<p>
 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%82%B3%E3%83%88%E3%83%A9%E3%83%BC%E3%81%AE%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88-%E3%83%95%E3%82%A3%E3%83%AA%E3%83%83%E3%83%97%E3%83%BB%E3%82%B3%E3%83%88%E3%83%A9%E3%83%BC/dp/4492554769%3FSubscriptionId%3D17YY4RH3N5K3CNPJCC82%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4492554769"><img class="amazon" src="http://ecx.images-amazon.com/images/I/41S3SKT5R0L._SL160_.jpg"
height="160" width="115"
alt="コトラーのマーケティング・コンセプト(フィリップ・コトラー/恩藏 直人)" title="コトラーのマーケティング・コンセプト(フィリップ・コトラー/恩藏 直人)">
コトラーのマーケティング・コンセプト(フィリップ・コトラー/恩藏 直人)</a>
</p>
<p>
現代マーケティングの第一人者（らしい）フィリップ・コトラーによる、マーケティング用語の一言解説集です。読みやすく、それぞれの用語についての感じをつかむにはよい本でした。一方、マーケティング用語が順不同で（原著はアルファベット順に）解説されているため、マーケティング用語同士の関係や全体感をつかみたい方は、後述する「[新版]MBAマーケティング」の方がお勧めです。
</p>
<p>
ちなみに、本書によると「日本企業の90%はマーケティングを担当する専門セクションを置いていない」そうです(p.167)。コトラーはこれを、「マーケティング部門を置くと、そこしかマーケティングを考えなくなってしまう。日本では、全社員がマーケティングを意識して行動するのですばらしい！」みたいな観点で書いているのですが、それはたぶん違うよなあ……。個人的には、日本企業でもマーケティング部門をちゃんと用意して、そこに権限を与えた方が良いような気がします。
</p>
<p>
 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%82%AD%E3%83%A3%E3%82%BA%E3%83%A0-%E3%82%B8%E3%82%A7%E3%83%95%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%A0%E3%83%BC%E3%82%A2/dp/4798101524%3FSubscriptionId%3D1ZYN93KGC2KDTSNXKHG2%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798101524"><img class="amazon" src="http://ecx.images-amazon.com/images/I/51XEHKQEVEL._SL160_.jpg"
height="160" width="110"
alt="キャズム(ジェフリー・ムーア)" title="キャズム(ジェフリー・ムーア)">
キャズム(ジェフリー・ムーア)</a>
</p>
<p>
有名な「キャズム」の本です。一時期、ブログがブームになった頃に「キャズムを超えた」だの「アーリー・アダプタの影響力が云々」だの色々言われていたので、本書に出てくるキーワードだけは知っている人も多いと思います。僕も、今までそのへんのキーワードしか知らなかったので、改めて原著を読んで、「そういうことだったのか！」と驚かされるところが多かったです。
</p>
<p>
本書では、新製品がキャズムを超えるのが難しいのは、アーリーアダプタはその製品で何ができるのかを重視する（製品重視の視点）一方で、キャズムの先にいるアーリーマジョリティはその製品の市場を重視する（市場重視の視点）からだと主張しています。つまり、アーリーアダプタでの採用例がいくら増えても、市場を作れなければいつまでもキャズムを超えられない、と。この難題を解決するためには、ホールプロダクト（製品だけでなくその周辺のサービスなどを含む。今風に言うとエコシステムか？）の構築が重要であり、今後はホールプロダクトをR&Dの対象にしなければならないと論じています。
</p>
<p>
また、本書ではposition statementのひな形を以下のように定義していました。前回紹介したEric Sinkの定義よりはやや複雑ですが、これはこれで面白いと思うので紹介しておきます。
</p>
<blockquote>
<p>
[ (1) 代替手段 ] で問題を抱えている<br/>
[ (2) ターゲット・カスタマー ] 向けの、<br/>
[ (3) ターゲット・カテゴリー ] の製品であり、<br/>
[ (4) この製品が解決できること ] することができる。<br/>
そして、 [ (5) 対抗製品 ] とは違って、<br/>
この製品には [ (6) ホールプロダクトの主だった機能 ] が備わっている。
</p>

</blockquote>
<p>

 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E6%94%B9%E8%A8%823%E7%89%88-%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%93%E3%82%B9MBA%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%93%E3%82%B9%E7%B5%8C%E5%96%B6%E5%A4%A7%E5%AD%A6%E9%99%A2/dp/4478009759%3FSubscriptionId%3DAKIAJHEH6BDDLBHI4V3A%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4478009759"><img class="amazon" src="http://ecx.images-amazon.com/images/I/41d9Bf0o2-L._SL160_.jpg"
height="160" width="112"
alt="改訂3版 グロービスMBAマーケティング(グロービス経営大学院)" title="改訂3版 グロービスMBAマーケティング(グロービス経営大学院)">
改訂3版 グロービスMBAマーケティング(グロービス経営大学院)</a>
</p>
<p>
※僕が読んだのは第2版なのですが、既に第3版がでているのでそちらにリンクしています。
</p>
<p>
マーケティングについての良い本を探しているときに、<a href="http://wslash.com/">P2P todayの横田さん</a>から「まずは一般的なフレームワークを一通り勉強したら？」とお勧めされた本です。マーケティング用語同士の関係や全体感が整理されており、確かに（僕のような）初心者が基礎知識をつけるにはとても良い本でした。さすがヨコタン。
</p>
<p>
一方、初心者向けではあるのですが、知識が網羅的に書かれているので、読んでも「マーケティングすげー！これは重要だよ！」みたいなテンションの上がり方はしないのが難点です。もし、マーケティングに興味があるなら、上に挙げたような別の本を先に読んでテンションを上げておいた方がいいかもしれません。
</p>
<p>
 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%82%A4%E3%83%8E%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B8%E3%83%AC%E3%83%B3%E3%83%9E%E2%80%95%E6%8A%80%E8%A1%93%E9%9D%A9%E6%96%B0%E3%81%8C%E5%B7%A8%E5%A4%A7%E4%BC%81%E6%A5%AD%E3%82%92%E6%BB%85%E3%81%BC%E3%81%99%E3%81%A8%E3%81%8D-Harvard-business-school-press/dp/4798100234%3FSubscriptionId%3D1F9ZB25T785C6BC6EWG2%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798100234"><img class="amazon" src="http://ecx.images-amazon.com/images/I/51A8W7U0cSL._SL160_.jpg"
height="160" width="110"
alt="イノベーションのジレンマ—技術革新が巨大企業を滅ぼすとき (Harvard business school press)(クレイトン・クリステンセン/玉田 俊平太)" title="イノベーションのジレンマ—技術革新が巨大企業を滅ぼすとき (Harvard business school press)(クレイトン・クリステンセン/玉田 俊平太)">
イノベーションのジレンマ—技術革新が巨大企業を滅ぼすとき (Harvard business school press)(クレイトン・クリステンセン/玉田 俊平太)</a>
</p>
<p>
有名な「イノベーションのジレンマ」です。ちなみに初めて知りましたが、原題は "The Innovator's Dilemma" で「イノベーターのジレンマ」なんですね。
</p>
<p>
本書では、イノベーションのジレンマが起こる理由を、既存の製品を取り巻くバリュー・ネットワークという概念（これもエコシステムと同義か）で説明しています。企業がある製品を開発することが「技術的に」可能であったとしても、実績ある企業は自分たちが属するバリュー・ネットワークの財務構造や組織の文化に束縛されているために、そのバリュー・ネットワークを壊しかねない破壊的技術は採用できない、というのが本書の説明（の僕なりの解釈）です。
</p>
<p>
イノベーションのジレンマ自体はかなり有名な概念ですが、本書ではその中身をかなり深く掘り下げており、原著に当たる価値はあると思いました。特に、組織の能力はそのプロセスと価値基準にあり、組織の構成員がその両者を強く理解している（現在のバリュー・ネットワークで価値を生み出す能力が高い）ほど、「破壊的技術を導入させるためのインセンティブ」を組織の構成員に与えることは難しくなる、といったくだりは衝撃的でした。そういう意味で、本書の内容は組織論にも近いかもしれません。
</p>
<p>
 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AF%E4%BA%88%E5%AE%9A%E3%81%A9%E3%81%8A%E3%82%8A%E3%81%AB%E9%80%B2%E3%81%BE%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E3%82%A8%E3%83%AA%E3%83%A4%E3%83%95-%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A9%E3%83%83%E3%83%88/dp/4478420459%3FSubscriptionId%3D1S9C327N3DZD43F0K102%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4478420459"><img class="amazon" src="http://ecx.images-amazon.com/images/I/41FCPB7A3WL._SL160_.jpg"
height="160" width="108"
alt="クリティカルチェーン—なぜ、プロジェクトは予定どおりに進まないのか?(エリヤフ ゴールドラット/三本木 亮)" title="クリティカルチェーン—なぜ、プロジェクトは予定どおりに進まないのか?(エリヤフ ゴールドラット/三本木 亮)">
クリティカルチェーン—なぜ、プロジェクトは予定どおりに進まないのか?(エリヤフ ゴールドラット/三本木 亮)</a>
</p>
<p>
本書もビジネス書なのですが、こちらはマーケティングではなくてプロジェクトマネジメントに関する「ビジネス小説」です。ちなみに、ビジネス小説というのは、「ビジネス上の難題にぶち当たった主人公が」、「○○という新しい技術/手法/考え方を知り」、「仕事がうまくいくようになる」というテンプレートに沿った小説のことです。
</p>
<p>
冗長な部分を取り払うと、本書の主張はだいたい次のような感じです。小説スタイルで書かれているので、このまとめが正しいのかもあまり自信がないのですが……。
</p>
<ul>
<li>従来の経営は、部分最適が全体最適に繋がる、という経営哲学に基づいて行われていた。この経営哲学を本書では「コスト・ワールド」と呼ぶ。
</li>
<li>しかし、実際の現場では、部分的な改善が全体の改善には繋がらず、全体のスループットは強度の一番弱い部分に依存する。つまり、もっともスループットが出ない部分を補強する、という取り組みを繰り返す必要がある。この経営哲学を本書では「スループット・ワールド」と呼ぶ。
</li>
<li>個々の作業ごとにバッファを用意するやり方は、コスト・ワールドに沿った考え方。スループット・ワールドに沿ったやり方としては、個々の作業見積もりはかなりタイト（作業の終わる確率が50%〜90%のスケジュール）に設定しておいて、作業の合流地点に大きな共通バッファを持たせる。
</li>
<li>特定のスペシャリストがクリティカルパスだけでなく複数の非クリティカルパスに関わるために、結果として作業が遅れることがある。スペシャリストを守るための人単位のバッファも必要。
</li>
</ul>
<p>

「ザ・ゴール」みたいなビジネス小説が好きな人にとっては面白いと思いますし、単に小説として読めば面白いと思うのですが……僕は話の結論や整合性（どこまでが作り話なのか？）が気になってあまり集中できませんでした。
</p>
<p>
 ----
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%B8%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF-%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E6%83%85%E5%A0%B1%E8%A6%96%E8%A6%9A%E5%8C%96%E6%89%8B%E6%B3%95-Ben-Fry/dp/4873113784%3FSubscriptionId%3D0VQ4VDB1VMJE2RGYE782%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873113784"><img class="amazon" src="http://ecx.images-amazon.com/images/I/41DdCRhKTAL._SL160_.jpg"
height="160" width="124"
alt="ビジュアライジング・データ —Processingによる情報視覚化手法(Ben Fry)" title="ビジュアライジング・データ —Processingによる情報視覚化手法(Ben Fry)">
ビジュアライジング・データ —Processingによる情報視覚化手法(Ben Fry)</a>
</p>
<p>
最後はビジネス書から離れて、プログラミングに関する本です（癒される……）。
</p>
<p>
本書は、Processingというプログラミング環境を題材に、情報の視覚化（Information Visualization）のやり方を解説した本です。冒頭で、「データの理解において最も重要なポイントは、<strong>どういう問いに答えたいのか</strong>を知ることです」と訴え、答えに至るまでの過程を以下の7ステップに分解して示しています。
</p>
<ol>
<li>データ収集（acquire）
</li>
<li>解析（parse） … 構造の付加、カテゴリ分け
</li>
<li>フィルタリング（filter）
</li>
<li>マイニング（mine） … パターンを見つけたり、数学的処理をしたり
</li>
<li>表現（represent） … 視覚化モデルの選択
</li>
<li>精緻化（refine） … 基本表現の改善
</li>
<li>インタラクション（interact） … 操作、表示のカスタマイズの手段を提供
</li>
</ol>
<p>

前半では、このように「情報の視覚化」の考え方を示した上で、後半はProcessingを使って上記の各プロセスをどう改善できるかを示しています。
</p>
<p>
かなり面白く勉強になる本なのですが、書籍の内容とは別に、ProcessingがJavaベースなのが個人的にはどうしてもなじめませんでした……。これ、もうちょっと軽量なスクリプト言語をベースにした方がもっととっつきやすかったような気がするんですよね（ProcessingはJavaの上に軽量な環境を作ろうとしてるんですが、いかんせんJavaベースなので限界が）。やりたいことと比較して、Javaだとちょっと書くことが多くて面倒すぎるような。でも、この本自体は、色々新しい観点を示してくれていい本ですよ。お勧めです。
</p>
<p>
 ----
</p>
<p>
7〜9月分に読んだ本についてはまたあとで……。

</p>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20091003.html#p01">
<link>http://muziyoshiz.jp/20091003.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20091003.html#p01" />
<dc:date>2009-10-03T17:14:07+09:00</dc:date>
<title>[mobile][Android]自作Androidアプリ「Where's My Info?」をAndroid Marketに登録してみました</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>mobile</dc:subject>
<dc:subject>Android</dc:subject>
<description>最近日記を書いていなかったので、すっかり書くタイミングを逸してしまっていたのですが、実はDoCoMoのAndroidケータイ「HT-03A」を持ってます。ビックカメラで実機を触って気に入って、HT-03A発売日（7月10日）の1週間後くらいに購入しました。   その後、Hello Worldレベルよりもましな「ちゃんとした体裁の整ったAndroidアプリ」を開発する作法を勉強しようと思って、暇を見ては（日記も書かずに）ちょこちょことプログラミングをしていたわけですが……今日ようやっとAndroid Marketに登録するところまでこぎ着けました。今日はここまでの経緯をネタにいろいろ書いてみようと思います。    ----   ■ 今回自作したアプリ「Where's My Info?」   最近、引っ越しをしたり、携帯電話を買い換えたりすることが多かったので、色々と不便を感じていました。具体的には、こんなあたりが不満でした。    何かの書類に申し込みするときに、メモなどを見ないと、新しい住所/電話番号を正確に思い出せない。   古い住所/電話番号をどこに提供したのかわからない。何か..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=mobile">mobile</a>][<a href="./?category=Android">Android</a>]自作Androidアプリ「Where's My Info?」をAndroid Marketに登録してみました</h3><p>

最近日記を書いていなかったので、すっかり書くタイミングを逸してしまっていたのですが、実はDoCoMoのAndroidケータイ「HT-03A」を持ってます。ビックカメラで実機を触って気に入って、HT-03A発売日（7月10日）の1週間後くらいに購入しました。
</p>
<p>
その後、Hello Worldレベルよりもましな「ちゃんとした体裁の整ったAndroidアプリ」を開発する作法を勉強しようと思って、暇を見ては（日記も書かずに）ちょこちょことプログラミングをしていたわけですが……今日ようやっとAndroid Marketに登録するところまでこぎ着けました。今日はここまでの経緯をネタにいろいろ書いてみようと思います。
</p>
<p>
 ----
</p>
<p>
■ 今回自作したアプリ「Where's My Info?」
</p>
<p>
最近、引っ越しをしたり、携帯電話を買い換えたりすることが多かったので、色々と不便を感じていました。具体的には、こんなあたりが不満でした。
</p>
<ul>
<li> 何かの書類に申し込みするときに、メモなどを見ないと、新しい住所/電話番号を正確に思い出せない。
</li>
<li> 古い住所/電話番号をどこに提供したのかわからない。何かの申し込みのときに、古い住所/電話番号を使ってなかったか？
</li>
</ul>
<p>

そこで、今回はこの問題を解決するために「Where's My Info?」というアプリを開発しました。あまり「Androidならでは！」という感じはしないアプリですし、既存のパスワード管理ソフトに似た面もありますが、携帯に載ってるとそこそこ便利なアプリなんじゃないかと思ってます。
</p>
<p>
以下は、Android Marketに載せるために作ったスクリーンショットと紹介文です。スクリーンショットは一部英語になってますが、日本語ロケールならちゃんと日本語が表示されます。
</p>
<p>
<a href="./images/20091003_0.png"><img src="./images/s20091003_0.jpg" alt="Android Market"  class="none"></a> <a href="./images/20091003_1.png"><img src="./images/s20091003_1.jpg" alt="スクリーンショット1"  class="none"></a> <a href="./images/20091003_2.png"><img src="./images/s20091003_2.jpg" alt="スクリーンショット2"  class="none"></a>
</p>
<blockquote>
<p>
あなたはメールアドレスや電話番号を2つ以上持っていませんか？  "Where's My Info?"はあなたの個人情報を、いつ、どこで、誰に提供したかを管理するソフトウェアです。例えば、以下のような場合に、面倒な作業を手助けします。
</p>
<ul>
<li> 携帯キャリアを変えたので、メールアドレスや電話番号を差し替えたい。でもどこに書いたっけ？
</li>
<li> 引っ越したので、住所を差し替えたい。でもどこに書いたっけ？
</li>
<li> etc.
</li>
</ul>
<p>

</p>

</blockquote>
<p>

自分で使うために作ったアプリということもあって、今後もちゃんとメンテするつもりですので、是非使ってみて感想を聞かせてください。現時点では、これから以下の機能を追加しようと考えています。
</p>
<ul>
<li> データのimport/export
</li>
<li> 情報提供先へのカメラ画像の追加（どこで情報提供したかわかりやすくする）
</li>
<li> 個人情報の並び替え
</li>
</ul>
<p>

 ----
</p>
<p>
■ Androidアプリ開発の感想
</p>
<p>
基本的には、まあ、ものすごく敷居が低いですねー。
</p>
<p>
開発に使う言語はJavaで、かつEclipseでAndroidアプリを開発するためのプラグインもあります。エミュレータの起動や、実機へのインストールもそのプラグイン経由で出来るので、Java+Eclipseに慣れてる人なら特に楽だと思います。
</p>
<p>
ただ、これはフレームワーク全般に言えることですが、ライブラリが基本提供する機能から外れて、ちょっと気の利いたことをやろうとするととたんに詰まります。今回僕がつまずいたのは以下のポイント。
</p>
<ul>
<li><p>
 リストを表示するためのListViewをカスタマイズして、各項目の中にテキスト2行を表示したい。

</p>
<ul>
<li> <a href="http://www.softwarepassion.com/?p=189">Android Series: Custom ListView items and adapters(Software Passion)</a> を見て解決。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 ListViewからコンテキストメニューを呼び出したい。

</p>
<ul>
<li> <a href="http://groups.google.com/group/android-developers/browse_thread/thread/14ba131c3ebc49eb">Long click on list activity item - Android Developers</a> や <a href="http://stackoverflow.com/questions/433761/how-do-you-implement-context-menu-in-a-listactivity-on-android">How do you implement context menu in a ListActivity on Android? - Stack Overflow</a> を見てもよく分からず、結局試行錯誤してるうちになんかうまくいった。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 タブを表示させる方法がよく分からない。

</p>
<ul>
<li> <a href="http://groups.google.com/group/android-developers/browse_thread/thread/afbb95566d6ff262">Add a "footer" in a TabActivity - Android Developers</a> を参考にレイアウトのXMLを手直ししたらうまくいった。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 ListViewの中にチェックボックスを作ったときに、そのチェックボックスの値を取る方法が分からない。

</p>
<ul>
<li> <a href="http://www.anddev.org/checkbox_text_list___extension_of_iconified_text_tutorial-t771.html">Checkbox Text List :: Extension of Iconified Text tutorial :: anddev.org - Android Development Community</a> を参考に手直ししてうまくいった。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 戻るボタンを押すと古い情報が表示されてしまう……。

</p>
<ul>
<li> Activityの後始末し忘れ。もう使わないActivityはfinish()でちゃんと終わらせる。
</li>
</ul>
<p>

</p>
</li>
<li><p>
 ダイアログのタイトルを消したい。

</p>
<ul>
<li> <a href="http://groups.google.com/group/android-developers/browse_thread/thread/55a8b6b832f61a3f/0b56c8b0b9637f66?show_docid=0b56c8b0b9637f66">Dialog with No Title - Android Developers</a>
</li>
</ul>
<p>

</p>
</li>
</ul>
<p>

で、こうやって見て分かるように、細かいことを気にし出すと日本語圏にはあんまり情報がなくなってきます……。
</p>
<p>
 ----
</p>
<p>
■ 特に参考になった書籍、Webサイト
</p>
<p>
とはいえ、日本語でもAndroid関係の情報はかなり出てきていて、特に以下の本は役立ちました。幅広い話題についてかなり細かく書かれているので、この本だけ買っておけば大体なんとかなります。
</p>
<p>
<a href="http://www.amazon.co.jp/Google-Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%B1%9F%E5%B7%9D-%E5%B4%87/dp/4048679562%3FSubscriptionId%3D1S9C327N3DZD43F0K102%26tag%3Dmuziyoshiz-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4048679562"><img class="amazon" src="http://ecx.images-amazon.com/images/I/51i3GJltyEL._SL160_.jpg"
height="160" width="124"
alt="Google Androidプログラミング入門(江川 崇/竹端 進/山田 暁通/麻野 耕一/山岡 敏夫/藤井 大助/藤田 泰介/佐野 徹郎)" title="Google Androidプログラミング入門(江川 崇/竹端 進/山田 暁通/麻野 耕一/山岡 敏夫/藤井 大助/藤田 泰介/佐野 徹郎)">
Google Androidプログラミング入門(江川 崇/竹端 進/山田 暁通/麻野 耕一/山岡 敏夫/藤井 大助/藤田 泰介/佐野 徹郎)</a>
</p>
<p>
あと、WebサイトではTaosoftwareのblogにかなりお世話になりました。Android関係で疑問に思ったことを検索すると、日本語圏だと大体ここにたどり着くような感覚です。
</p>
<p>
Taosoftware<br/><a href="http://www.taosoftware.co.jp/blog/">http://www.taosoftware.co.jp/blog/</a>
</p>
<p>

とりあえず、今日はここまでで。Androidについては、またネタが溜まったらなんか書きます。

</p>
]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20090808.html#c01">
<link>http://muziyoshiz.jp/20090808.html#c01</link>
<dc:date>2009-08-08T14:11:41+09:00</dc:date>
<title>2009-08-08のツッコミ[1] (吉澤)</title>
<dc:creator>吉澤</dc:creator>
<description>一応コメ..</description>
<content:encoded><![CDATA[一応コメントもテスト。]]></content:encoded>
</item>
<item rdf:about="http://muziyoshiz.jp/20090808.html#p01">
<link>http://muziyoshiz.jp/20090808.html#p01</link>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://muziyoshiz.jp/20090808.html#p01" />
<dc:date>2009-08-08T14:10:45+09:00</dc:date>
<title>[tDiary]tDiary 2.1系から2.2.2にアップグレード</title>
<dc:creator>M. Yoshizawa</dc:creator>
<dc:subject>tDiary</dc:subject>
<description>tDiary.org - tDiary 2.2.2リリース    今回のリリースは、主にAmazonプラグインのためです。AmazonがAPI利用に認証を求めるようになったため、2009年8月15日以降、未対応プラグインでは利用できなくなります。amazon.rbを利用している場合は必ずアップデートしてください。..</description>
<content:encoded><![CDATA[<h3>[<a href="./?category=tDiary">tDiary</a>]tDiary 2.1系から2.2.2にアップグレード</h3><p>

<a href="http://www.tdiary.org/20090804.html">tDiary.org - tDiary 2.2.2リリース</a>
</p>
<blockquote>
<p>
今回のリリースは、主にAmazonプラグインのためです。AmazonがAPI利用に認証を求めるようになったため、2009年8月15日以降、未対応プラグインでは利用できなくなります。amazon.rbを利用している場合は必ずアップデートしてください。
</p>

</blockquote>
<p>

今回のバージョンアップ、Amazonプラグインを使っている人は対応必須みたいです。今まではセキュリティ対策のアップグレードがあっても、手でコードいじって済ませてたんですが、せっかくの良い機会なので今回はちゃんとコード入れ替えました。
</p>
<p>
なんか挙動がおかしい、というところがあったらtwitterあたりで教えてください。最近、日記を書く気が起こらなくてすっかりtwitterに引き篭もり中です……。

</p>
]]></content:encoded>
</item>
</rdf:RDF>

