2007年 06月 10日

obj.to_plist, OSX.load_plist

こんなのあったんだ……

rubycocoa

できてるところまでチェックイン。インデントの設定とかを完全に忘れてた。2スペースインデントらしいのでそっちの流儀にあわせた (スペースインデントすることよりも、全体で統一されていないことのほうがまずい) newcocoa と rb_nibtool.rb 相当のことはできるはず、だけれど、テンプレの Rakefile を書いていないのでうまみがすくない。

テストを tests/ においたほうが良いっぽい。とりあえず既存のテストを AutoRunner するだけにしとこう。

  • Rakefile 書いてない
  • Xcode 関連も書いてない

rubycocoa Rakefile

一番簡単なテンプレにだけとりあえず Rakefile を追加。内容はほとんど [Rubycocoa-devel 906], [Rubycocoa-devel 907] のコピペ。
引数なし rake でビルドからアプリケーション起動までやるようにしてみて、ためしに Hello World を Console.app に表示するやつを作ってみたけど、Interface Builder で繋ぐ部分だけ GUI であとは CUI でできるようになって結構気持ちいい。Interface Builder でアクションとか設定するより Ruby 定義から update するのが便利だなぁ。

rubycocoa create AppController.rb とかやるとクラス定義ふくんだ (awakeFromNib とかを定義ずみの) スケルトンつくれるともうちょい楽かなぁ。

  • standalonefy.rb くみこみ
  • package (.dmg) つくるタスクかく
  • publish するタスクかく

ChangeLog

そういえば書いてない。commit log とは別に書かないといけないのかな。svn log すると ChangeLog 形式のログがでてくるけれど、これはコピペで svn と ChangeLog どっちも書いてるのかなぁ。あとあとさかのぼって書いてもいいのか謎

コピぺらしい。なるほど

2007年 06月 08日

ib_action

ib_action :buttonPressed { |sender| ... }

とか書けたんだ……

2007年 06月 07日

.pbxproj いぢり

ファイルの追加を適当にやってみたけどこれでいいのか謎すぎる。オブジェクトに id がついているけど、Xcode がどうやってあれを求めているのかわからないので SHA1 ハッシュとって最初の24文字を使うようにしてみたけど、なんだかなぁ。どっかにフォーマットのリファレンスがあるかなぁと思ってぐぐっていたけれど、ないっぽい。

require "digest/sha1"
require "osx/cocoa"
include OSX

class XcodeProject

	class Group
		def initialize(proj, id)
			@proj, @dic = proj, proj[id]
		end

		def [](key)
			@dic[key]
		end

		def inspect
			"#<Group #{self["name"]}>"
		end

		def add_file(type, path, tree)
			id = Digest::SHA1.hexdigest(path)[0, 24].upcase
			@proj.plist["objects"][id] = NSDictionary.alloc.initWithDictionary({
				"isa" => "PBXFileReference",
				"lastKnownFileType" => type,
				"path" => path,
				"sourceTree" => tree,
			})
			@dic["children"] = NSArray.alloc.initWithArray(@dic["children"].to_a << id)
		end
	end

	attr_accessor :objects
	attr_reader :rootObject, :plist


	def initialize(bundle_path)
		@plist_path = "#{bundle_path}/project.pbxproj"
		@plist = NSPropertyListSerialization.objc_send(
			:propertyListFromData, NSData.alloc.initWithContentsOfFile(@plist_path),
			:mutabilityOption, NSPropertyListMutableContainersAndLeaves,
			:format, nil,
			:errorDescription, nil
		)

		@objects = @plist["objects"]
		@rootObject = self[@plist["rootObject"]]
	end

	def [](obj_id)
		@objects[obj_id.to_s]
	end

	def groups
		mainGroup = self[@rootObject["mainGroup"]]
		Hash[*mainGroup["children"].map {|i|
			g = Group.new(self, i)
			[g["name"].to_s, g]
		}.select {|i| i[1]["isa"].to_s == "PBXGroup"}.flatten]
	end

	def save
		File.open(@plist_path, "w") do |f|
			f.puts @plist
		end
	end
end

proj = XcodeProject.new("testcocoa.xcodeproj")
p proj.groups
proj.groups["Classes"].add_file("text.script.ruby", "path.rb", "<group>")
proj.save

なんかコードかくより

コード自体を書くより、どうコード書くかで悩んでる時間のほうが圧倒的に多い……
がんがん書きたいのになぁ。どうしたらいいんだろう。経験するしかないのかなぁ (デザパタはこういうのを埋めるのにいい感じだけど、どのデザパタ使うかでさらに悩む)
拡張性とか、他の要素とかを頭悪いくせに最初から考えるのがダメなんだろうけど、むずい。

Xcode template

erb 変換するより既存のテンプレートつかえよとかいうアレなので Xcode のテンプレ変換を Ruby で書きなおししようと思っていくらか書いてみたけれど、テンプレートのリネーム規則が wkwkrn 状態でこまる……あと IDENTIFIER の変換規則がわからないのでスペースをアンスコにするだけとかアレなことを

そういえば Xcode を AppleScript から操作できるみたいで、これでファイルの追加とかもできそうな予感だけれど、どうなんだろう…… AppleScript が書けない……

rbosa で書けそうな感じではあったけれど、どうやってファイルを追加したらいいかわからなかった。むずい。plist 読みかきしたほうがはやいなぁ (コーディングも、実行速度も)
plist 直は互換性で将来まずそうだけど……

2007年 06月 04日

rc

どこまでコマンドの機能にするか (rails みたいに初期化だけ)
どこまで rake のタスクにするか
rake/gem に依存していいのか
インストーラへの適用はどうするか
よんでないソースがおおい

2007年 06月 02日

Proxy Desktop

が終了できないとか言われて、あからさまにあやしい名前のプログラムだなぁと思った。(フォルダを別プロセスで開くようにしておくと、explorer.exe がたちあがりまくっておかしくなることがあるみたい (XP SP2))