2004 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 |
2012-02-09
■[ruby]RbConfigというのがあってビルド時の情報とかが取れる
Rubyのインストール時の情報を保持しているみたい
RbConfig::CONFIGという定数のHashに様々な情報が入っている。
sugamasao@GRAM% ruby -v ruby 1.9.3p5 (2011-11-30 revision 33907) [x86_64-darwin10.8.0] sugamasao@GRAM% ruby -rpp -e"pp RbConfig::CONFIG" {"DESTDIR"=>"", "MAJOR"=>"1", "MINOR"=>"9", "TEENY"=>"1", "PATCHLEVEL"=>"5", "INSTALL"=>"/usr/bin/install -c", "EXEEXT"=>"", "prefix"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head", "ruby_install_name"=>"ruby", "RUBY_INSTALL_NAME"=>"ruby", "RUBY_SO_NAME"=>"ruby.1.9.1", "exec"=>"exec", "ruby_pc"=>"ruby-1.9.pc", "PACKAGE"=>"ruby", "BUILTIN_TRANSSRCS"=>" newline.c", "USE_RUBYGEMS"=>"YES", "MANTYPE"=>"doc", "NROFF"=>"/usr/bin/nroff", "vendorhdrdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/include/ruby-1.9.1/vendor_ruby", "sitehdrdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/include/ruby-1.9.1/site_ruby", "rubyhdrdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/include/ruby-1.9.1", "UNIVERSAL_INTS"=>"", "UNIVERSAL_ARCHNAMES"=>"", "configure_args"=> " '--prefix=/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head' '--enable-shared' '--disable-install-doc' '--with-libyaml-dir=/Users/sugamasao/.rvm/usr' '--with-baseruby=/Users/sugamasao/.rvm/wrappers/ruby-1.8.7-head/ruby' 'CC=clang'", "vendordir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/vendor_ruby", "sitedir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/site_ruby", "ruby_version"=>"1.9.1", "sitearch"=>"x86_64-darwin10.8.0", "arch"=>"x86_64-darwin10.8.0", "RI_BASE_NAME"=>"ri", "ridir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/ri", "rubylibprefix"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby", "MAKEFILES"=>"Makefile", "THREAD_MODEL"=>"pthread", "SYMBOL_PREFIX"=>"_", "EXPORT_PREFIX"=>"", "COMMON_HEADERS"=>"", "COMMON_MACROS"=>"", "COMMON_LIBS"=>"", "MAINLIBS"=>"", "ENABLE_SHARED"=>"yes", "DLDLIBS"=>"", "SOLIBS"=>"", "LIBRUBYARG_SHARED"=>"-lruby.1.9.1", "LIBRUBYARG_STATIC"=>"-lruby.1.9.1-static", "LIBRUBYARG"=>"-lruby.1.9.1", "LIBRUBY"=>"libruby.1.9.1.dylib", "LIBRUBY_ALIASES"=>"libruby.1.9.dylib libruby.dylib", "LIBRUBY_SO"=>"libruby.1.9.1.dylib", "LIBRUBY_A"=>"libruby.1.9.1-static.a", "RUBYW_INSTALL_NAME"=>"", "rubyw_install_name"=>"", "LIBRUBY_DLDFLAGS"=> "-Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace -install_name /Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/libruby.1.9.1.dylib -current_version 1.9.1 -compatibility_version 1.9.1 -Wl,-unexported_symbol,_Init_* -Wl,-unexported_symbol,*_threadptr_* $(XLDFLAGS)", "LIBRUBY_LDSHARED"=>"clang -dynamiclib", "warnflags"=> "-Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration", "debugflags"=>"-ggdb", "optflags"=>"-O3", "cxxflags"=> " -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration", "cflags"=> " -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration", "cppflags"=>"", "NULLCMD"=>":", "INSTALLDOC"=>"nodoc", "CAPITARGET"=>"nodoc", "RDOCTARGET"=>"nodoc", "EXECUTABLE_EXTS"=>"", "ARCHFILE"=>"", "LIBRUBY_RELATIVE"=>"no", "EXTOUT"=>".ext", "PREP"=>"miniruby", "TEST_RUNNABLE"=>"yes", "setup"=>"Setup", "EXTSTATIC"=>"", "STRIP"=>"strip -A -n", "TRY_LINK"=>"", "LIBPATHENV"=>"DYLD_LIBRARY_PATH", "RPATHFLAG"=>"", "LIBPATHFLAG"=>" -L%s", "LINK_SO"=>"", "LIBEXT"=>"a", "DLEXT2"=>"", "DLEXT"=>"bundle", "LDSHAREDXX"=>"g++ -dynamic -bundle", "LDSHARED"=>"clang -dynamic -bundle", "CCDLFLAGS"=>"-fno-common", "STATIC"=>"", "ARCH_FLAG"=>"", "DLDFLAGS"=> "-Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace", "ALLOCA"=>"", "WERRORFLAG"=>"-Werror", "CHDIR"=>"cd -P", "RMALL"=>"rm -fr", "RMDIRS"=>"rmdir -p", "RMDIR"=>"rmdir", "CP"=>"cp", "RM"=>"rm -f", "PKG_CONFIG"=>"", "DOXYGEN"=>"", "DOT"=>"", "MAKEDIRS"=>"mkdir -p", "MKDIR_P"=>"mkdir -p", "INSTALL_DATA"=>"/usr/bin/install -c -m 644", "INSTALL_SCRIPT"=>"/usr/bin/install -c", "INSTALL_PROGRAM"=>"/usr/bin/install -c", "SET_MAKE"=>"", "LN_S"=>"ln -s", "NM"=>"nm", "DLLWRAP"=>"", "WINDRES"=>"", "OBJCOPY"=>":", "OBJDUMP"=>"", "ASFLAGS"=>"", "AS"=>"as", "AR"=>"ar", "RANLIB"=>"ranlib", "try_header"=>"", "COUTFLAG"=>"-o ", "OUTFLAG"=>"-o ", "CPPOUTFILE"=>"-o conftest.i", "GNU_LD"=>"no", "GCC"=>"yes", "EGREP"=>"/usr/bin/grep -E", "GREP"=>"/usr/bin/grep", "CPP"=>"clang -E", "CXXFLAGS"=> " -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration", "CXX"=>"g++", "OBJEXT"=>"o", "CPPFLAGS"=>"-D_XOPEN_SOURCE -D_DARWIN_C_SOURCE ", "LDFLAGS"=>"-L. ", "CFLAGS"=> " -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=shorten-64-to-32 -Werror=implicit-function-declaration -fno-common -pipe", "CC"=>"clang", "target_os"=>"darwin10.8.0", "target_vendor"=>"apple", "target_cpu"=>"x86_64", "target"=>"x86_64-apple-darwin10.8.0", "host_os"=>"darwin10.8.0", "host_vendor"=>"apple", "host_cpu"=>"x86_64", "host"=>"x86_64-apple-darwin10.8.0", "RUBYW_BASE_NAME"=>"rubyw", "RUBY_BASE_NAME"=>"ruby", "build_os"=>"darwin10.8.0", "build_vendor"=>"apple", "build_cpu"=>"x86_64", "build"=>"x86_64-apple-darwin10.8.0", "RUBY_RELEASE_DATE"=>"2011-11-30", "RUBY_PROGRAM_VERSION"=>"1.9.3", "BASERUBY"=>"/Users/sugamasao/.rvm/wrappers/ruby-1.8.7-head/ruby", "target_alias"=>"", "host_alias"=>"", "build_alias"=>"", "LIBS"=>"-lpthread -ldl -lobjc", "ECHO_T"=>"", "ECHO_N"=>"", "ECHO_C"=>"\\\\c", "DEFS"=>"", "mandir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/man", "localedir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/locale", "libdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib", "psdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/doc/ruby", "pdfdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/doc/ruby", "dvidir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/doc/ruby", "htmldir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/doc/ruby", "infodir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/info", "docdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share/doc/ruby", "oldincludedir"=>"/usr/include", "includedir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/include", "localstatedir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/var", "sharedstatedir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/com", "sysconfdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/etc", "datadir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share", "datarootdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/share", "libexecdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/libexec", "sbindir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/sbin", "bindir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/bin", "exec_prefix"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head", "PACKAGE_URL"=>"", "PACKAGE_BUGREPORT"=>"", "PACKAGE_STRING"=>"", "PACKAGE_VERSION"=>"", "PACKAGE_TARNAME"=>"", "PACKAGE_NAME"=>"", "PATH_SEPARATOR"=>":", "SHELL"=>"/bin/sh", "rubylibdir"=>"/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1", "archdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/x86_64-darwin10.8.0", "sitelibdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/site_ruby/1.9.1", "sitearchdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.8.0", "vendorlibdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/vendor_ruby/1.9.1", "vendorarchdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.8.0", "topdir"=> "/Users/sugamasao/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/x86_64-darwin10.8.0"}
ちなみに、元々はConfigのエイリアスとしてRbConfigっていうのがあったっぽいけど*1、Ruby1.9.3(から?)だと、逆にConfigの方がエイリアスになっているらしく、RbConfigを使うことが推奨されている。
Configを使うと、プギャー!ってされるのだった。
ruby-1.9.3-head :001 > Config (irb):1: Use RbConfig instead of obsolete and deprecated Config.
みんな大好きwatchrもConfig(RbConfigじゃないので使うと警告がでるのであった)を使っていて、OS毎のファイルイベントを扱うライブラリの選択とかの参考にしてる感じ。
2012-01-08
■[ruby]RubyでMeCabを使う
まずはMecab自体をインストール
むかしにやった気がするけど、メモがてら。
MeCabはhomebrewで入れた。portsでもなんでもイイと思います。
% brew install mecab
DLしたtar.gzを展開して、ディレクトリに移動する。あとは普通にmakeするだけなんだけれど、configure時のcharsetをUTF8にしておくことにする。イマドキ、UTF8じゃないほうが例外だと思うので。
./configure --with-charset=utf8 make make install
MeCab単体での動作確認
一応、単体で動くか確認してみる。
% echo "お前は今まで食ったパンの枚数を覚えているのか?" | mecab お前 名詞,代名詞,一般,*,*,*,お前,オマエ,オマエ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 今 名詞,副詞可能,*,*,*,*,今,イマ,イマ まで 助詞,副助詞,*,*,*,*,まで,マデ,マデ 食っ 動詞,自立,*,*,五段・ワ行促音便,連用タ接続,食う,クッ,クッ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ パン 名詞,一般,*,*,*,*,パン,パン,パン の 助詞,連体化,*,*,*,*,の,ノ,ノ 枚数 名詞,一般,*,*,*,*,枚数,マイスウ,マイスー を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 覚え 動詞,自立,*,*,一段,連用形,覚える,オボエ,オボエ て 助詞,接続助詞,*,*,*,*,て,テ,テ いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル の 名詞,非自立,一般,*,*,*,の,ノ,ノ か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ ? 記号,一般,*,*,*,*,?,?,? EOS
大丈夫そうですね。
natto っていうRubyバインディングを使う
nattoがいいのかよくわからんけど、とりあえず目に入ったので使ってみます。
gem install natto
これだけ。irbで確認してみよう。
ruby-1.9.2-head :018 > pp Natto::MeCab.new.parse("お前は今まで食ったパンの枚数を覚えているのか?").split("\n").delete_if{|n| n == "EOS"} ["お前\t名詞,代名詞,一般,*,*,*,お前,オマエ,オマエ", "は\t助詞,係助詞,*,*,*,*,は,ハ,ワ", "今\t名詞,副詞可能,*,*,*,*,今,イマ,イマ", "まで\t助詞,副助詞,*,*,*,*,まで,マデ,マデ", "食っ\t動詞,自立,*,*,五段・ワ行促音便,連用タ接続,食う,クッ,クッ", "た\t助動詞,*,*,*,特殊・タ,基本形,た,タ,タ", "パン\t名詞,一般,*,*,*,*,パン,パン,パン", "の\t助詞,連体化,*,*,*,*,の,ノ,ノ", "枚数\t名詞,一般,*,*,*,*,枚数,マイスウ,マイスー", "を\t助詞,格助詞,一般,*,*,*,を,ヲ,ヲ", "覚え\t動詞,自立,*,*,一段,連用形,覚える,オボエ,オボエ", "て\t助詞,接続助詞,*,*,*,*,て,テ,テ", "いる\t動詞,非自立,*,*,一段,基本形,いる,イル,イル", "の\t名詞,非自立,一般,*,*,*,の,ノ,ノ", "か\t助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ", "?\t記号,一般,*,*,*,*,?,?,?"]
2012-01-03
■[windows]Windows7でcmd.exeを日本語化させる
Windows7を買いました!!
OEM版?だからなのか、OSの表示上は日本語なのだけれど、cmd.exe上でーーようするにターミナル上では日本語が扱えなかった。
chcp 932 とかするとコードポイントをデフォルトのASCII(デフォルトはCP437)から、おなじみのCP932へ変更できるようだけど、実行しても Invalid code page と言われるだけで、変更が効かなかった。
解決策
「コントロールパネル」→「時計、言語、及び地域」→「地域と言語」の「管理」タブを開く
「システムロケールの変更」ボタンを押して、ロケールを日本語にする
選択するとOSの再起動を求められるのでそのまま再起動を行う。そうして新しく「スタート」→「アクセサリ」→「コマンドプロンプト」でプロンプトを開くと日本語(Shift-JIS)で立ち上がる。chcpコマンドを実行すると932と返ってくるのも確認できる。
注意
上記のOSの設定を変更する前にcmd.exeへのショートカットを作っている場合、フォントが以前のままの設定になりつつ、プロンプト内のコードポイントだけ新しくなるという現象が発生する可能性がある。そうすると、なぜかフォントの選択欄だけ以前の設定を引きずってしまい、MS明朝などの日本語フォントが選択できず詰んでしまう。
ショートカットを作るなら、改めてオリジナルのコマンドプロンプトから派生させるようにしよう。
余談
chcp でコードポイントを変えられるのだけれど、65001を指定するとUTF-8になる。もしかしてUTF-8にすると人類に平和が訪れるのでは? と思ったのだけれど、どうもUTF-8にすると日本語フォントを指定できないようなので儚い夢となりました*1。
2011-12-25
■[ruby]おまいらもMacRubyでMacアプリ作ろう
このエントリはRuby AdventCalender 2011の企画です
Ruby Advent Calendar の25日目の記事です。24日目は@kwappaさんのHappy Xmas, Rubyists! | Kwappa研究開発室でした。
ちなみに、12/25と言うと、バカボンのパパや銭形のとっつぁんの誕生日として知られていますね*1。
26日はid:tackunさんのSinatraを使って、RESTFulなWeb-APIを作ってみたい - tackun noteです。
MacRubyを使うと、XCodeで普通のMacアプリが作れる
XCode4系*2からは、XCodeの新規プロジェクトでMacRubyを使ったアプリケーションが作れます。3系はテンプレートを手動で追加すればできた気がします。
MacRuby自体はLionだったら最初からインストールされているという噂です。私の環境はSnowLeopardなのですが、気がついたら入ってました。たぶん手動でインストールした気がするけれど、よく覚えてないw
このエントリは下記の環境での結果です
- Mac OSX 10.6.8
- XCode4.2
- MacRuby 0.10
MacRubyがインストールされているかは下記で確認できます。なければ MacRuby本家サイトからインストールしましょう。
sugamasao@GRAM% which macruby /usr/local/bin/macruby sugamasao@GRAM% macruby -v MacRuby 0.10 (ruby 1.9.2) [universal-darwin10.0, x86_64]
SnowLeopardでのXCodeを使った開発っていうのは結構オワコンになっているので、手軽には開発環境を整えられない可能性があります。AppStoreでインストールできるのはLion用のXCodeで、SnowLeopard用XCode4.2のバイナリは Apple Developer でデベロッパー登録をしてライセンス料を払っているとDLできる*3。もしくは、Lionが出る前にXCode4系を手に入れてる人くらいな気がします。なので、素直にLionにするのがきっとベストアンサー。
12/26 追記
SnowLeopardでは、MacRubyをインストールすればXCode4でプロジェクトを作成する時にMacRubyプロジェクトが出てくるのは確認した。四の五の言わずMacRubyをインストールすれば良い感じです。
MacRubyとは
あんまし馴染みがないと思うのですけれど、このMacRubyというのは、Cocoaフレームワークのラッパーとかではなくて、RubyとObjective-Cを良い感じに悪魔合体させつつ、Ruby1.9とかなり互換性を持ってるプロジェクトです*4。
MacRubyをインストールすると、macxxxというコマンド類がインストールされるので、既存のRuby関係のコマンドとは名前の衝突が起きないようになっています。macgemやmacirbとかがあります。
RubyとObjective-Cの悪魔合体っぷりとかは、普通の組み込みクラスをancestorsすると垣間見れたりする。
irb(main):001:0> Fixnum.ancestors => [Fixnum, Precision, Integer, Precision, Numeric, Comparable, NSNumber, NSValue, NSObject, PP::ObjectMixin, Kernel]
NSナンチャラクラスが組み込まれてたりするのだ。
このままでもcocoaフレームワークを叩くことができるので面白いのだけど、XCodeを使ったほうが見た目が派手だからそっちについて書くよ。
XCodeでアプリを作ろう
プロジェクトを作ろう
まぁ、特に気をつける事とかないです。普通にMacRubyプロジェクトを作るだけです。
Create Document-Based Applicationはちゃんと試してないけれど、ちょっとコツが必要みたいなことがStackOverFlowに載っていたがURL忘れたw
ビルドすると、普通にウィンドウが動いているのが確認できると思います。すばらしい!!
でもこれだけじゃ面白くない
というわけでウィンドウにドラッグするとそのファイルのフルパスを表示するアプリケーションを作ってみよう!!*5
ドラッグイベントを扱うクラスを作ろう
New File... から新しいRubyファイルを作成する。名前は "DragView.rb" として、以下のような内容にしておく。
キモはNSViewを継承することと、ドロップされた時のイベントとかを実装するところ。ココら辺は通常のObjective-Cとほぼ同じのはず。実装するメソッド名とかは同じだけれど、実装方法はほぼRubyでいける。型宣言も不要だし、classとかdefとかの構文もRuby。もちろん、ヘッダーファイルとかも不要。
# # DragView.rb # advent_calender_2011 # # Created by on 11/12/24. # Copyright 2011 __MyCompanyName__. All rights reserved. # class DragView < NSView # ドラッグイベントを受け取るファイル種別を追加する def initWithFrame(frame) registerForDraggedTypes(NSArray.arrayWithObjects(NSTIFFPboardType, NSFilenamesPboardType, nil)) super(frame) end # ドラッグされたオブジェクトがウィンドウ領域に入ってきた時のイベント。戻り値でそのオブジェクトを許可するかが選択できる def draggingEntered(sender) NSLog("draggingEntered") return NSDragOperationGeneric end # ドロップイベント def performDragOperation(sender) zPasteboard = sender.draggingPasteboard files = zPasteboard.propertyListForType('NSFilenamesPboardType') NSLog("sender=#{sender}") files.each do |file| NSLog(file) end alert = NSAlert.new alert.setMessageText(files.join("\n")) alert.runModal() return true end end
よく見るとわかるかもしれないけれど、普通にNSLogとかNSAlertとかも使える。扱うノリはRubyのままなので、慣れると結構ラク。
ドラッグ領域をXCodeで配置して、クラスと紐付ける
ボタンとかがあるGUI部品の中からCustomViewというコンポーネントを探して、メインのウィンドウにドラッグしよう。その後、領域をウィンドウ一杯まで広げる。
GUIの部品を置いたので、それをさっき作ったクラスと紐付ける……と言っても、スゲー簡単でCustomClassの部分にDragViewと入れるだけ。
ちょっとわかりにくいけれど、右側の Show The Identity inspector っていうタブ(?)にある。
ビルドしてみよう!!
ビルドボタンをズビッと押して、出てきたウィンドウにファイルをドロップしてみよう!!
こんな感じで、複数のファイルでも出力されるし、NSLogにもちゃんと出てるのが確認できるね。
さてアプリを作ったら
配布したいよね。他の人にドヤ顔で送りつけたいよね!!
きちんと手続きをすればAppStoreに載せるような登録もできるんだけど、残念ながらAppStoreへ登録するようなアカウントは持っていないので、.appファイルを作って知り合いに送りつけるのが関の山です*6。
MacRubyランタイムを同梱する
実はデフォルトだとランタイムの同梱がされていないので、他人の環境にmacrubyが入ってないと動かないのであった。
同梱する手順としてはProduct => Edit Scheme を選択して、Build時のオプションを変更する。
"+"ボタンを押して、Deploymentを追加する。
普段のBuildの時は同梱するメリットは無いと思うので、Archiveの時だけ同梱するようにチェックボックスを外す。
.appを作ろう!!
XCodeのメニューから Product => Archive という項目を選択しよう。そうすると、改めてアプリケーションのBuildが行われる。
Organizerというウィンドウが立ち上がるので、Buildされた項目を選択して、"Share"ボタンを押そう。
そうすると、どのような形式で出力するかというダイアログがでるので、Applicationを選択する。あとは作ったappの置き場所を選択するだけ。
おめでとう
これであなたのMacアプリがRubyで作れました!!
ちなみに、MacRubyが同梱されているかどうかは作成されたアプリケーションのファイルサイズで確認できる。今回作ったアプリの場合は29MBになった。同梱しない場合は70KBとかなので、大きく違うから見れば気がつくと思います。
作った結果のプロジェクトファイルはgithubに上げておきました*7。
それでは
良い年末を!
2011-11-13
■[ruby][rails][sqlite3][sql]SQLite3の実際の型
SQLiteの型のなぞ
SQLite3の型はスゲーざっくりしていると聞いていたのだけど、RailsでデータベースをSQLiteにして、適当なテーブルを作成したら、なんか varchar とか出てくる。どういうことなんだってばよ? というのを調査してみた。
まずはRailsでテーブルを作るところまで
結論から言うと、別にRailsを使う必要は無いんだけども、まぁせっかくなんでね。
- Ruby 1.9.3
- Rails 3.1.1
- SQLite 3.7.3
ちなみに、-T は unit/test のテンプレートを作らないというオプションで、単なる手クセなので気にしないで(普段はrspecを使うので)。
% rails new sample -d sqlite3 -T (snip) cd sample % rails g scaffold blog title:string body:text like:integer % bundle exec rake db:migrate
ちなみに、ここの例ではテキトーなブログシステムを作る、みたいのを想定してもらいたい。likeはそのブログに対するいいね数みたいなものだと思って。
データの確認
まず、念のためRails側のmigrateでどんな型が指定されているかを確認する。
% cat db/migrate/20111113064850_create_blogs.rb class CreateBlogs < ActiveRecord::Migration def change create_table :blogs do |t| t.string :title t.text :body t.integer :like t.timestamps end end end
あたりまえだけど、指定した通りである。
さて、SQLiteでDBを開いてみよう(rails db とかでも大丈夫だと思うけど)。
% sqlite3 db/development.sqlite3
では、さっきのテーブルの中身を見てみよう。
sqlite> .dump blogs PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE "blogs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "body" text, "like" integer, "created_at" datetime, "updated_at" datetime); COMMIT;
整形してなくてアレだけど、varchar や datetime とかが指定されてる。無いんじゃないの。
ここからが本題
こういう時は公式のドキュメントにあたるのが一番ですね。
で、ここをきちんと読んでみると、1.0 Storage Classes and Datatypes に、データ型として5つあるよと書いてある(このデータ型はカラムの型ではなく、実データを扱う際の型らしい?)。
- NULL
- INTEGER
- REAL
- TEXT
- BLOB
さらに、1.2 では Date型を保持する型としては TEXT の場合と REAL の場合と INTEGER の場合があるとか書いてある。
カラムの型は
2.0 Type Affinity に書いてある。SQLite3ではこの5つが定義されているようだ。
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
つまり、SQLiteの実際のカラムの型っていうのは、ここの事らしい。で、更にその下 2.2 Affinity Name Examples に他のSQLとの互換のためにどのような型指定の場合はどの型に変換されるかのテーブルがある。
というわけで
今回の場合だと以下のような型に変換されているような気がする。
- title => TEXT
- body => TEXT
- like => INTEGER
- created_at => NUMERIC
- updated_at => NUMERIC
なんとなくわかったのだけど、その変換された型を実際に確認する場合ってどうすれば良いんですかね。。。
2011-10-30
■[ruby][ci]Rubyの先っちょ(2.0.dev)をビルドする
Jenkins でビルドして test-all を実行するまでの手順メモ
Rubyの trunk が 2.0 になったことだし、ビルドしたくて手が震えてしまいますよね!! そんなあなたのための備忘録です。
環境
- Mac OSX 10.6.8 SnowLeopard
- autoconf 2.68(このエントリを書いた時点では2.61でやっていたけど、最新版にアップデートした)
手順
- Ruby を チェックアウトします(git か svn か使いたい方で)
- svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
- git clone https://github.com/ruby/ruby.git ruby
- cd ruby
- /usr/local/bin/autoconf # このコマンドで configure ファイルを作る
- ./configure --prefix=$HOME/rubies/ruby_20111024 --with-openssl-dir=/opt/local --with-libyaml-dir=/opt/local
- openssl と libyaml はデフォルトでは入ってなかったので別途portsを使ってインストールを行った。そのため、インストール先を指定する必要がある
- make
- make test-all
test-all で必要になって追加インストールしたもの
- ports で install しているので、configure の --with オプションで利用するパスは /opt/local になる
- sudo port install openssl
- sudo port install libyaml
jenkins でCI環境を作るときに必要なもの
実行ユーザがdaemonで、$HOMEが /var/root になっていて書き込み権限まわりでうまくいかなかった。しかたなく、HOMEの値をちょっと退避させて対応を行った。
Jenkinsでビルドするときのスクリプトはこんな感じ。
ちなみに、チェックアウト先の "ローカルモジュールディレクトリ" は ruby_src に指定してある。
ORG_HOME=${HOME} HOME=${JENKINS_HOME} DIR=`pwd` mkdir -p ruby cd ruby_src /usr/local/bin/autoconf ./configure --prefix=${DIR}/ruby --with-openssl-dir=/opt/local --with-libyaml-dir=/opt/local make make test-all HOME=${ORG_HOME}
※ pkg でインストールした最新版である 2.68 の autoconf を使うために、絶対パスで実行するように修正しました*2
ちなみに
上記の設定で Jenkins 上ではきちんとビルドできるようになったのだけど、自分のターミナルから実行すると
71) Failure:
test_read_mode(TestIO_M17N) [/Users/sugamasao/rubies/ruby_src/test/ruby/test_io_m17n.rb:1552]:
<"a\nb\nc\n\x{C2A2}"> expected but was
<"a\nb\nc\n蔵">.
72) Failure:
test_pipe(TestIO_M17N) [/Users/sugamasao/rubies/ruby_src/test/ruby/test_io_m17n.rb:707]:
<nil> expected but was
<#<Encoding:UTF-8>>.
こんな感じで エンコード周り(と思われる箇所)のエラーがでてしまう。
LANGの設定かなぁと思って設定しないで*3実行してみたのだけど、状態変わらず。。。どこの設定を変えればいいのか教えて下しあ!!














