前回のアップデートから間があいてしまいましたが、 iPhone用の手帳アプリ、PokéDia-1.2 のアップデート申請をいたしました。

iPhone シミュレータ iPhone シミュレータ

今回のアップデート内容は以下の通りです。

  • メモが消えるバグを修正
  • メモの表示が乱れる問題を修正
  • 絵文字キーボードへの対応(左図参照)
  • メモの一覧表示機能(右図参照)
  • メモの検索機能(右図参照)

絵文字キーボードについては、 Tweeter に習って日本のiPhoneのみ対応となっています。

今日の出来事を表示する機能については、次回のアップデートで追加予定です。今後ともよろしくお願いいたします。

審査が無事に通過する事を祈りつつ。

See Also

posted by Png genki on Sat 7 Feb 2009 at 14:22

Ruby-1.9.1では、以下のように配列リテラルの中でHashを定義する事が出来るようになったのですね。

   1  [:foo, :bar => :baz]
   2  #=> [:foo, {:bar=>:baz}]

いままでも、

   1  [:foo => :bar]

のような形式であればOKだったのですが、配列リテラルの中に Hash以外の要素を含む場合には構文エラーが発生していました。

posted by Png genki on Fri 6 Feb 2009 at 18:31

従来のソフトウェア工学が決定的に間違っている点

従来のソフトウェア工学が決定的に間違っている点は、 ソフトウェアを作るソフトウェアに関する工学ではない事だと思う。

100倍の生産性を達成するためには、ひとつ階段を上にのぼる必要がある。

従来のソフトウェアエンジニア人事工学が決定的に間違っている点

「やらなきゃいけない」仕事が20%で、残りの80%が「やりたいしごと」。たとえ単純作業でも、残り80%にそれが属しているのであれば嬉々としてやってしまう。彼らからこれを取り上げてしまうと、残り20%も小さくなってしまう。好きなようにやらせておくのが吉である。

つまらないコードを生成するコードを書く事は、 つまらないコードを書く事自体と比べて何倍も面白い。

手でコードを書くプログラマと、コードにコードを書かせるメタプログラマでは、 規模が大きな仕事になるほど差が開いていくと思う。

「ソフトウェア工学」は矛盾語法か?

真のソフトウェア工学はまだ未来のものだ。一年とかけずに三千人以下でエンパイアステートビルを造り上げるようなものは、現在のソフトウェア工学に存在しない。(中略) 何十万もの奴隷を何十年も使い石に石を重ねてゆく様は、まさに今日ほとんどのソフトウェア開発で行われている事だ。

真のソフトウェア工学は、もう存在している。それは、 タワークレーンを使った高層ビル建築 に似ている。 メタプログラマーの仕事は、タワークレーンを組み立てるために小さなクレーンを動かす事だ。 それを実現するための道具はもう揃っていると思う。 それを使いこなしてる人もそれなりにいる。 では何が足りないのだろうか。

tc

それはなんと言っても、実績が足りない。というか無い。 例えば5人のメタプログラマーの会社が、500億円の案件を50億円で受注したというような事例は皆無だと思う。 経営者は、万が一プロジェクトが失敗に終わった時に、実績が無い事に手を出した事を責められる事になる。 しかしながら、これについては成功事例が生まれれば改善する可能性があると思う。 営利企業の経営者が、これほどの節約機会を見過ごすとは思えない。

という事で、システム経費を劇的に圧縮する方法をお探しの方は、 までご相談ください :-)

追記

  • 「真のソフトウェア工学」という名称使ったのは、引用元の「「ソフトウェア工学」は矛盾語法か?」の中で使われている名称をそのまま受けての事です。そういう学問が存在してるよ、という事を言いたかった訳ではないです。
posted by Png genki on Fri 6 Feb 2009 at 08:12

ss

Yay! I am looking forward to it very much!

Merbはmerb-action-argsが無くても動くのだけど、 あの格好良さを知ってしまうとね・・・。

posted by Png genki on Fri 6 Feb 2009 at 06:02

merbでGeneratorプラグインを作る方法を紹介します。

merbのgeneratorの仕組みは、 templater という汎用的なGeneratorフレームワークを使って作られています。 なので、基本的にはtemplaterを使ったGeneratorの作り方という事になります。

まずは、Generatorプラグインのひな形を生成します。

   1  % merb-gen plugin hello

Gemの形で提供されるものであれば、merb-pluginの形式である必要は無いですが、簡単にそれを用意してくれるので、merb-gen pluginを使ってみました。

さて、続いて、GEM_ROOTにGeneratorsというファイルを作ります。

   1  scope 'merb-gen' do
   2    dir = File.join(File.dirname(__FILE__), 'lib', 'generators/')
   3    Merb.add_generators dir + 'hello_generator'
   4  end

続いて、GEM_ROOT/lib以下のディレクトリ構成を以下のような感じにします。

   1  lib
   2  `-- generators
   3      |-- hello_generator.rb
   4      `-- templates
   5          `-- hello
   6              |-- app
   7              |   `-- app以下のファイル群
   8              `-- spec
   9                  `-- spec以下のファイル群

hello_generator.rbが、Railsのgeneratorで言うところの Generatorマニフェストファイルに相当します。

以下はmerb-mailerのgeneratorファイルの例です。

   1  module Merb::Generators
   2    class MailerGenerator < NamespacedGenerator
   3  
   4      def self.source_root
   5        File.dirname(__FILE__) / 'templates' / 'mailer'
   6      end
   7  
   8      desc <<-DESC
   9        Generates a mailer
  10      DESC
  11  
  12      option :testing_framework, :desc => 'Testing framework to use (one of: rspec, test_unit)'
  13  
  14      first_argument :name, :required => true, :desc => "mailer name"
  15  
  16      template :mailer do |t|
  17        t.source = 'app/mailers/%file_name%_mailer.rb'
  18        t.destination = File.join("app/mailers", base_path, "#{file_name}_mailer.rb")
  19      end
  20  
  21      template :notify_on_event do |t|
  22        t.source = 'app/mailers/views/%file_name%_mailer/notify_on_event.text.erb'
  23        t.destination = File.join("app/mailers/views", base_path, "#{file_name}_mailer/notify_on_event.text.erb")
  24      end
  25  
  26      template :controller_spec, :testing_framework => :rspec do |t|
  27        t.source = 'spec/mailers/%file_name%_mailer_spec.rb'
  28        t.destination = File.join("spec/mailers", base_path, "#{file_name}_mailer_spec.rb")
  29      end
  30  
  31    end
  32  
  33    add :mailer, MailerGenerator
  34  end        

あとは、GemをインストールすればOK.

posted by Png genki on Thu 5 Feb 2009 at 05:40

Gemをインストールすると、依存するGemも一緒にインストールする事が出来ますが、 Gemの依存関係は、通常の依存関係の他に、開発環境用の依存関係も設定されています。 開発環境用の依存関係は、そのGemの開発や修正を行うために必要なGemを表しています。 今回は、開発環境用の依存関係をまとめてインストールする方法を紹介します。

   1  % sudo gem install --development gemname

これでOK.

posted by Png genki on Wed 4 Feb 2009 at 03:06

Ruby-1.9.1対応や、1.8.7、1.8.6での動作確認などをする必要がでてきたので、 そんな状況で便利なmultirubyを試してみました。

multirubyはZenTestの一部として公開されているので、 ZenTestが入っていない人はインストールします。

   1  % sudo gem install ZenTest

続いて、以下のような感じでruby-1.8.6 p287をインストールします。

   1  % multiruby_setup mri:svn:tag:v1_8_6_287
   2  % multiruby_setup mri:svn:tag:v1_8_7_72
   3  % multiruby_setup mri:svn:tag:v1_9_1_0

SVNからソースをチェックアウトしてきて、コンパイルが始まります。

終わったら、rubygemsを更新します。

   1  % multiruby_setup update:rubygems

あとは、

   1  % multiruby -S irb

などのようにすると、複数のバージョンのRubyでirbが順番に実行されます。

   1  multiruby -S gem install gemname

のようにして各環境用にGemをインストールします。

See Also

posted by Png genki on Wed 4 Feb 2009 at 02:34

Proc#to_sourceみたいな強力なリフレクション機能がRubyに実装されて欲しいので、言語デザイナーがエキサイト出来るようなゲームを考えてみる。

  1. クラスオブジェクトの取得
  2. メソッドオブジェクトの取得
  3. メソッドカテゴリ
  4. アノテーション
  5. メソッドの実行時呼び出し(Invocation)
  6. クラスの実行時作成
  7. メソッドの実行時作成
  8. メソッドボディの置き換え(Swizzling)
  9. メソッドシグネチャへのアクセス(#parameters)
  10. ASTへのアクセス(ParseTree)
  11. メソッドソースへのアクセス(to_source)
  12. module/mixinのuninclude, unextend, unmixin
  13. 全ての動的修正を元の状態に戻せる

さらにアドバンスドな項目

  • 実行時修正の安全保障(Sandbox)
  • 実行時修正の権限管理機能
  • 実行時修正の履歴管理機能
posted by Png genki on Tue 3 Feb 2009 at 11:03 with 2 comments

Getting ready for Ruby 1.9.1

We are excited about Ruby 1.9.1. Of course, with all the performance improvements, who wouldn’t be? Unfortunately a large number of Ruby libraries and extensions still don’t work on 1.9.1, so Ruby 1.9 cannot be considered production-ready yet.

しばらくは大きなプロジェクトのRuby-1.9.1対応がにぎやかになりそうですね。 安定板のリリースは重要だな。

Merbはまだaction-argsの問題があるけど、 1.9.1でMethod#parametersが出なかったので、 ParseTreeあたりが1.9.1に対応する感じで進化して対応される気がする。 せめてProc#to_sourceがあればripperを使ってなんとか出来たと思うんだけどなー。

posted by Png genki on Tue 3 Feb 2009 at 10:24

iPhoneの通話中にHomeに戻ってからアプリケーションを起動すると、 以下のような普段の2倍の高さの緑色のステータスバーが表示された状態で アプリケーションが立ち上がります。

ss1

高さが2倍になってるので、 通常のステータスバーの場合と比べて、 やや狭い画面にあわせたデザインにする必要があります。 さらに、通話が中断された場合、緑色のステータスバーが消えて、 通常の高さのステータスバーになるのですが、 この時に、[UIApplication application:willChangeStatusBarFrame:] が呼ばれないという不具合が以下のサイトで報告されていました。

posted by Png genki on Mon 2 Feb 2009 at 04:12
Contents
PokéDia-1.2のアップデートを申請いたしました
Ruby-1.9.1のHashリテラル
真のソフトウェア工学はもう存在している
Merbist達のRuby-1.9は1.9.2から始まるらしい
merbでgeneratorプラグインを作る方法
Gemのインストール時に開発用の依存Gemもインストールする方法
multirubyで複数のバージョンのRuby環境を作る
リフレクション番付(草案)Ver.2.1
Passenger (aka mod_rails)がRuby-1.9.1に対応したらしい
application:willChangeStatusBarFrame:が呼ばれない問題
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ