ブログトップ 記事一覧 ログイン 無料ブログ開設

@sugamasao.blog.title # => ”コードで世界を変えたい” このページをアンテナに追加 RSSフィード Twitter

1970 | 01 | 02 | 03 |
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

[]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っていうのがあったっぽいけど*1Ruby1.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

[]RubyMeCabを使う

まずはMecab自体をインストール

むかしにやった気がするけど、メモがてら。

MeCabはhomebrewで入れた。portsでもなんでもイイと思います。

% brew install mecab

インストールされたら辞書ファイルを作る

からipaの辞書を取ってくる。

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記号,一般,*,*,*,*,?,?,?"]

基本的には Natto::MeCab を new して、インスタンスのparseメソッドに文章を渡せば良い感じ。

2012-01-03

[]Windows7でcmd.exe日本語化させる

Windows7を買いました!!

OEM版?だからなのか、OSの表示上は日本語なのだけれど、cmd.exe上でーーようするにターミナル上では日本語が扱えなかった。

chcp 932 とかするとコードポイントデフォルトASCII(デフォルトはCP437)から、おなじみのCP932へ変更できるようだけど、実行しても Invalid code page と言われるだけで、変更が効かなかった。

解決策

「コントロールパネル」→「時計言語、及び地域」→「地域と言語」の「管理」タブを開く

f:id:seiunsky:20120104003421p:image

システムロケールの変更」ボタンを押して、ロケールを日本語にする

f:id:seiunsky:20120104003422p:image

選択するとOSの再起動を求められるのでそのまま再起動を行う。そうして新しく「スタート」→「アクセサリ」→「コマンドプロンプト」でプロンプトを開くと日本語(Shift-JIS)で立ち上がる。chcpコマンドを実行すると932と返ってくるのも確認できる。

注意

上記のOSの設定を変更する前にcmd.exeへのショートカットを作っている場合フォントが以前のままの設定になりつつ、プロンプト内のコードポイントだけ新しくなるという現象が発生する可能性がある。そうすると、なぜかフォントの選択欄だけ以前の設定を引きずってしまい、MS明朝などの日本語フォントが選択できず詰んでしまう。

ショートカットを作るなら、改めてオリジナルのコマンドプロンプトから派生させるようにしよう。

余談

chcp でコードポイントを変えられるのだけれど、65001を指定するとUTF-8になる。もしかしてUTF-8にすると人類平和が訪れるのでは? と思ったのだけれど、どうもUTF-8にすると日本語フォントを指定できないようなので儚い夢となりました*1

*1レジストリをいじるとフォントを変えられるっぽいから、もしかしたらそれでうまくいくかもしれない

2011-12-25

[]おまいらも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プロジェクトを作るだけです。

f:id:seiunsky:20111224224648p:image

f:id:seiunsky:20111224224649p:image

Create Document-Based Applicationはちゃんと試してないけれど、ちょっとコツが必要みたいなことがStackOverFlowに載っていたがURL忘れたw

f:id:seiunsky:20111224224650p:image

ビルドすると、普通にウィンドウが動いているのが確認できると思います。すばらしい!!

でもこれだけじゃ面白くない

というわけでウィンドウにドラッグするとそのファイルのフルパスを表示するアプリケーションを作ってみよう!!*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というコンポーネントを探して、メインのウィンドウにドラッグしよう。その後、領域をウィンドウ一杯まで広げる。

f:id:seiunsky:20111224224651p:image

GUIの部品を置いたので、それをさっき作ったクラスと紐付ける……と言っても、スゲー簡単でCustomClassの部分にDragViewと入れるだけ。

ちょっとわかりにくいけれど、右側の Show The Identity inspector っていうタブ(?)にある。

f:id:seiunsky:20111224224652p:image

ビルドしてみよう!!

ビルドボタンをズビッと押して、出てきたウィンドウにファイルをドロップしてみよう!!

f:id:seiunsky:20111224224653p:image

こんな感じで、複数のファイルでも出力されるし、NSLogにもちゃんと出てるのが確認できるね。

さてアプリを作ったら

配布したいよね。他の人にドヤ顔で送りつけたいよね!!

きちんと手続きをすればAppStoreに載せるような登録もできるんだけど、残念ながらAppStoreへ登録するようなアカウントは持っていないので、.appファイルを作って知り合いに送りつけるのが関の山です*6

MacRubyランタイムを同梱する

実はデフォルトだとランタイムの同梱がされていないので、他人の環境にmacrubyが入ってないと動かないのであった。

同梱する手順としてはProduct => Edit Scheme を選択して、Build時のオプションを変更する。

f:id:seiunsky:20111224224656p:image

"+"ボタンを押して、Deploymentを追加する。

f:id:seiunsky:20111224224654p:image

普段のBuildの時は同梱するメリットは無いと思うので、Archiveの時だけ同梱するようにチェックボックスを外す。

f:id:seiunsky:20111224224655p:image

.appを作ろう!!

XCodeのメニューから Product => Archive という項目を選択しよう。そうすると、改めてアプリケーションのBuildが行われる。

Organizerというウィンドウが立ち上がるので、Buildされた項目を選択して、"Share"ボタンを押そう。

f:id:seiunsky:20111224224657p:image

そうすると、どのような形式で出力するかというダイアログがでるので、Applicationを選択する。あとは作ったappの置き場所を選択するだけ。

おめでとう

これであなたのMacアプリがRubyで作れました!!

ちなみに、MacRubyが同梱されているかどうかは作成されたアプリケーションのファイルサイズで確認できる。今回作ったアプリの場合は29MBになった。同梱しない場合は70KBとかなので、大きく違うから見れば気がつくと思います。

作った結果のプロジェクトファイルはgithubに上げておきました*7

それでは

良い年末を!

*1:Wikipedia調べ

*2:だったと思う……

*3:アカウント登録だけじゃダメなのだ……

*4:100%なのかちょっとわからなかったけど、プロジェクトのゴールは100%互換を持つこと

*5:例がつまらないって?ハローワールドよりは発展性ありそうな気がするから多めに見てちょ

*6:メンゴメンゴ!

*7:この段になって、プロジェクトを作るときのcalendarの綴りを間違えている事に気がついたw

2011-11-13

[][][][]SQLite3の実際の型

SQLiteの型のなぞ

SQLite3の型はスゲーざっくりしていると聞いていたのだけど、RailsデータベースをSQLiteにして、適当なテーブルを作成したら、なんか varchar とか出てくる。どういうことなんだってばよ? というのを調査してみた。

まずはRailsでテーブルを作るところまで

結論から言うと、別にRailsを使う必要は無いんだけども、まぁせっかくなんでね。

ちなみに、-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の先っちょ(2.0.dev)をビルドする

Jenkins でビルドして test-all を実行するまでの手順メモ

Rubyの trunk が 2.0 になったことだし、ビルドしたくて手が震えてしまいますよね!! そんなあなたのための備忘録です。

環境

手順

  1. Ruby を チェックアウトします(gitsvn か使いたい方で)
  2. cd ruby
  3. /usr/local/bin/autoconf # このコマンドで configure ファイルを作る
  4. ./configure --prefix=$HOME/rubies/ruby_20111024 --with-openssl-dir=/opt/local --with-libyaml-dir=/opt/local
    • openssl と libyaml はデフォルトでは入ってなかったので別途portsを使ってインストールを行った。そのため、インストール先を指定する必要がある
  5. make
    • make時に "Please install yaml" のような記述があるものは、別途 ports 等でインストールする必要がある。
  6. 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実行してみたのだけど、状態変わらず。。。どこの設定を変えればいいのか教えて下しあ!!

*1:2.61ね

*2:パスの通っている方は 2.61 なのであった

*3:空にしたり、unsetしたり

2011-09-03

[]gitで◯◯日前の状態を見る

一ヶ月前の状態を確認したいお!

っていうとき

git checkout HEAD@{30.days.ago}

で、30日前の状態に戻ることができる。

もとに戻る時は、使っていたブランチを指定すると良い気がする。

git checkout master

git良くわかってないので正しく理解できてる気がしないけど。