N x Mのグリッドがあったとします。 自明ですが、マス目の数は N*M 個です。

これを K 個の長方形に分割することを考えるとき、 K 個の長方形の面積の差が高々 min(N, M) であり、各々の長方形の周の長さの和が最小となるような分割を行うアルゴリズムを求める。

posted by Png genki on Thu 18 Mar 2010 at 06:45 with 1 comment

Ohm を使っていると色々と不満な点が見えてきます

  • @attributes を得る手段がない (#attributes が column_names を返す)
  • create!, save! がない
  • first, all がない
  • ...

これは AR 脳というよりも、ARの洗練されたAPIと比べてしまうと、 Ohm の未成熟さが浮き彫りになってしまうためだと思います。

ohm-arfreaks

そこで、ARのメソッドをOhm上で使えるようにしたラッパーを作成しました。

http://github.com/maiha/ohm-arfreaks

インストール

   1  % gem install ohm-arfreaks

   1  require 'ohm'
   2  require 'ohm-arfreaks'   # これを追加
   3  
   4  class Video < Ohm::Model
   5    attribute :url
   6    set       :tags
   7  end
   8  
   9  Video.create!(:url=>"a")
  10  Video.first.attributes
  11  => {:url=>"a", :tags=>[]}

以下のメソッドが利用可能です (0.1.0 現在)

  • self.primary_key
  • self.columns
  • self.column_names
  • self.content_columns
  • self.columns_hash
  • self.create!
  • save!
  • self.first
  • self.last
  • self.count
  • self.delete_all
  • new_record?
  • attributes

ARと比べると使えるメソッドは少ないですが、 これだけでも随分Ohmが快適になると思います。

backup

例えば、redis はどこに DB を作っているかわかり辛いので 時々バックアップが欲しくなるのですが、 昔懐かしのar_fixtures plugin 相当のことは以下のコードでできるようになります。

   1  File.open("videos.yml", "w+") do |f|
   2    hash = Video.all.inject({}){|h,v| h[v.id]=v.attributes;h}
   3    f.print hash.to_yaml
   4  end

posted by Png maiha on Tue 16 Mar 2010 at 19:16

あるアプリでは「Target terminated too early to collect data」というエラーが出てLeaksを使ってのメモリ使用状況を見ることができないのに、別のアプリだとそのような状況は起きず困っていたのですが、解決したのでメモしておきます。

@k_katsumiさんからは下記のadhocでget-task-allowの値が問題かもというのと、オーガナイザで実機を再認識するのが良いというのをアドバイスを頂いたのですが、残念ながら解決しませんでした...

実機デバッグでの注意点
http://numata.designed.jp/ja/2009/03/iphone-5.html

実機でInstrumentsが使えなくなったときの対処法
http://d.hatena.ne.jp/iphone_dev/20080825/1219649967

それで、色々調べてまわったのですが、よい方法が見つからず困っていたところ

You are not running the application through Xcode when you do this. Start the application manually, then bring up Instruments and connect to your device.
http://stackoverflow.com/questions/2032834/memory-footprint-of-an-app-on-iphone

というコメントでした。この中ではActivity Monitorについての話だったのですが、Leaksも同じかも!と思ってぐぐったらありました!

Finding iPhone Memory Leaks: A “Leaks” Tool Tutorial
http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/

上記の方法だと、xCodeは関係なく、iPhoneとInstrumentsでメモリ使用状況を見ることができます。yay! 多少、ステップが増えるのですが、出来ないよりは全然マシ!ということでよしとします。 (もしかしたら、同じapp名?のリリース版(購入したapp)とデバッグしようとしているappの二つあるのが原因なのかもですが...)

posted by Png satoko on Mon 15 Mar 2010 at 08:24

以下のサイトに手頃な文量で要点がまとまっているので参考になりました。

公式ドキュメントは以下にあります。

SCons本が欲しい今日この頃。 達人出版会 に期待したい。

posted by Png genki on Mon 15 Mar 2010 at 06:16

現状

   1  % gem --version
   2  1.3.6
   3  
   4  % ./script/console
   5  Loading development environment (Rails 2.2.2)
   6  /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails/gem_dependency.rb:224:in `specification':NoMethodError: undefined method `version_requirements=' for #<Gem::Dependency:0xb7769604>

  • rails 側での対応はなし
  • rubygems 側は trunk で修正済
  • rubygems の新バージョンはなかなか出ず

対策

  • rubygems の trunk から最新版をインストールする (git じゃないのがダサイ)

インストール

(/tmp/ あたりの適当な場所で実行)

   1  % svn export http://rubygems.rubyforge.org/svn/trunk/ rubygems
   2  A    rubygems
   3  A    rubygems/History.txt
   4  ...
   5  リビジョン 2460 をエクスポートしました。
   6  
   7  % cd rubygems
   8  # ruby setup.rb

(setup.rb の実行でインストールされます。必要に応じてrootで)

確認

   1  % ./script/console
   2  Loading development environment (Rails 2.2.2)
   3  /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails/gem_dependency.rb:224:Warning:...
   4  /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails/gem_dependency.rb:224:Warning:...
   5  ...
   6  > User.count
   7  => 25707

warning が一杯出るが気にしない。 rubygems 1.3.7 が出るまで、とりあえずこれでOK。

posted by Png maiha on Sun 7 Mar 2010 at 13:34

git svnを以下のような構成で使っていた時に、git svnのリモートトラッキングブランチのpointerがtrunkに代わってしまい、いつのまにかブランチにcommitしたつもりのものがtrunkにcommitされるという事があり、困りました。

ss

gitから.gitにpushしたものを git-svnからpullしたタイミングで発生するようです。 解決策としては、git-svnでgit pullをせずに、

   1  % git fetch remote-name
   2  % git merge --no-ff remote-name/branch-name
   3  % git svn dcommit

でok. アクシデンシャルなdcommitを防ぐには、--dry-runが便利です。

posted by Png genki on Fri 5 Mar 2010 at 11:23 with 1 comment

git-svnを使っていて、git svn dommitするときに、 掲題のようなエラーメッセージが出た場合、リモートリポジトリとローカルリポジトリのトラッキングブランチの同期が取れていない事が原因かもしれません。

例えば、SVNリポジトリ上で削除されているブランチが、ローカルのgitリポジトリに残ってしまっている場合、以下のようにリモートトラッキングブランチを削除する事で問題を解決できる可能性があります。

   1  % git branch -D -r <branch name>

posted by Png genki on Fri 5 Mar 2010 at 02:41

SConsを使ってscons testでテストを実行するには、 SConstructもしくはSConscriptで以下のように書く (Google Test仕様)

   1  import os, sys
   2  Import('env')
   3  env = env.Clone()
   4  
   5  test = env.Program('test', Glob('*.cpp'), LIBS='gtest')
   6  test_alias = Alias('test', [test], test[0].abspath)
   7  AlwaysBuild(test_alias)

See Also

posted by Png genki on Tue 2 Mar 2010 at 07:49

PLY形式のモデルデータをMSH形式に変換する方法のメモ。

MT Package の FORM2FORMコンバータを使います。 このページの下のほう から mtjade.tar.gz をダウンロードして展開し、FORM2FORMディレクトリに移動してmakeします。 使い方はこんな感じです。

   1  % ./form2form foo.ply foo.msh

以下の行をコメントアウトしておくと、indexedではないmshが生成されます。

   1  #define INDEXED

MSH形式の仕様は こんな感じ です。

posted by Png genki on Mon 1 Mar 2010 at 08:25
  • ActiveRecord の TC/TT アダプタ
  • AR 上で動作するので全てのAPIが利用可能

インストール

   1  % gem install activetokyocabinet

サーバの起動

   1  % ttserver -port 11114 db.tct &

  • ポート(11114)は何でもよい
  • ファイル名も何でもよい (拡張子はtct)

セットアップ

   1  require 'active_tokyocabinet/tdb'
   2  
   3  ActiveRecord::Base.establish_connection(
   4    :adapter  => 'tokyotyrant',
   5    :database => {
   6      :englishes => {:host => 'localhost', :port => 11114},
   7    }
   8  );

  • adapter 名は 'tokyotyrant'
  • database で利用するテーブル名と参照するTTの設定を指定する
  • 以下で Englishモデルを使うので "englishes" を定義している
  • 複数のモデルを使うときはやっぱりTTが複数必要?

使い方

   1  class English < ActiveRecord::Base
   2    include ActiveTokyoCabinet::TDB
   3  
   4    string :word
   5    int    :length
   6  
   7    validates_presence_of :word, :length
   8  
   9    def validate
  10      self[:length] ||= word.to_s.size
  11    end
  12  end

  • ARなので validate でも何でも思い通り
  • カラム定義は string, int, float (date/datetimeはない?)

   1  # /usr/share/dict/words を流し込み
   2  buf = File.read("/usr/share/dict/words")
   3  buf.scan(/^([a-z]+)$/) {
   4    English.create!(:word=>$1)
   5  }
   6  
   7  English.count
   8  => 64024
   9  
  10  English.all(:conditions=>["word regexp ? and length > ?", '^mai', 12])
  11  [#<English id: 33247, word: "mainstreaming", length: "13">,
  12   #<English id: 33250, word: "maintainability", length: "15">]

  • 正規表現の検索も可能

   1  e = English.first
   2  e.delete
   3  ActiveRecord::StatementInvalid: NoMethodError: undefined method `values_at' for 1:Fixnum: DELETE FROM englishes WHERE (id IN (1))
   4          from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `log'

あれ!?あれ?

まとめ

  • ARで稼動する上に正規表現による検索も可能
  • 削除(delete, destroy)ができないのはご愛嬌

で、一番驚いたのは、実装方法。 普通なら、ARの各メソッドをTT化していきそうなものだが、

  1. ARにSQLを作成させて
  2. そのSQLをパーズして
  3. TTに翻訳する

その発想はなかった。目から鱗です。 というか、SQLのparserは実用性が高いのでまず、 それをgem化希望!激しく希望!!

参考

posted by Png maiha on Fri 26 Feb 2010 at 01:35 with 2 comments