Hatena::ブログ(Diary)

きりかノート 2冊め

2015-08-20

[][]MacPortsのport:ruby22, ruby21, ruby20を更新

あたらしいバージョンがリリースされていたので対応しました。

RubyGemsCVE-2015-3900のセキュリティ修正が含まれてたりします。詳しくは公式のリリースアナウンスをみてください。

また、以前に書いたように、port:ruby22にjemallocバリアントを追加しました。

2015-06-13

[]rubyforgeがもうない件の対応

今はなきrubyforgeの記載がPortfileに大量に残ってるのマズくね?的な話が来てた。

知ってたけどさ!ファイルはmacports.org側で再配布のコピー持ってるしいいじゃん……

とりあえず自分が担当の分だけやってみて、わりといけそうな感触があったので他のも対処。たぶん全部で160 portsくらい直した。

だいたい作業はこんな感じ。

  • 新しいウェブサイトや配布サイトを探して変更
    • rubygems.orgにあるものはそこのhomepageを見て。homepageがなければrubygems.org上のページに。
    • githubから.tar.gz取得するものは、PortGroup githubを使う。便利!!
  • gemでなく、現在の配布サイトが見つからないものは依存してる他のportがないか確認して削除。
    • gemがあるものは依存portもまとめてgem化できれば、rubygems.orgをホームページに変更して存続。
  • インストールできるけれど実行できない、コア機能のテストが通らないものもあっても仕方ないので削除。

ぜんぜん現サイトがわからなくて検索した結果、同名のライブラリあって作者変わってる場合、forkなのか引き継ぎしたのか同名の別ライブラリなのかとかの判定がしんどかった。。

2015-06-12

[] RubyCocoa 今日のコミット 2015-06-12

新しいOS Xbetaが出たので検証中、っていうかSEGVしてテスト走らないじゃん。。

だいたいこういうレベルでおかしいときは、コンパイル時に警告出てたりするものなので確認。

   In file included from /Users/kimuraw/proj/rubycocoa/framework/src/objc/OverrideMixin.m:13:
   In file included from /Users/kimuraw/proj/rubycocoa/framework/src/objc/OverrideMixin.h:10:
   In file included from /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/objc/objc-class.h:1:
   /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/objc/runtime.h:56:11: note: 'isa' has been explicitly marked deprecated here
       Class isa  OBJC_ISA_AVAILABILITY;
             ^
   /Users/kimuraw/proj/rubycocoa/framework/src/objc/OverrideMixin.m:492:22: warning: 'isa' is deprecated [-Wdeprecated-declarations]
     class_addMethod(c->isa, @selector(alloc), (IMP)imp_c_alloc, "@4@4:8");
                        ^

たぶんこれだね。クラッシュレポートもinit_ovmix() -> class_addMethod()のあたりで落ちてるし。クラスのメタクラスを取るのにisa直接見てるけど、だいぶ前にdeprecateされた方法。

objcでメタクラスを取る方法は

  • objc_getMetaClass()にクラス名を渡す。
  • object_getClass()にクラス(Class)を渡す。(ふつうのオブジェクトを渡すとそのクラスが得られる)

のどちらかで、今回はClassはもう用意してあるので後者のほうがよいね。ということで直した。

  • メタクラスの取得方法を改善(8babc63)

まあまだOS X 10.11上でぜんぶのテストは通らないんだけどね!

あとテスト流すと次のようなメッセージがでるので対処しといた。outletへのsetterがないから繋げないぜ、とのこと。

   2015-06-12 01:51:36.174 ruby2.2[1285:2455542] Failed to connect (tableView2) outlet from (TableViewNibOwner) to (NSScrollView): missing setter or instance variable

単に警告の出てたoutletに対してib_outletで宣言するようにした。

  • テスト時の"Failed to connect..."が出ないように。(c8fa6b2

2015-05-31

[]RubyCocoaプロジェクトをgithubに移行

しました。

インストーラは最新の1.2.0 (2014年7月)だけgithubにも置きました。それ以前のはSourceForgeからゲットしてください。

f:id:kimuraw:20150531140505p:image

import.github.com使って、そのまま持ってきたので昔の開発用のタグも混ざって"102 releases"とかワケわかんないことになってますね…

ウェブサイトAPIリファレンスのついでにyardで作ってるんですが、.nojekyllファイルを置かないとIndexナビゲーションが機能しない(_index.html is not working for gh-pages · Issue #111 · lsegal/yard)とかにハマったりしました。

活発とは言えませんが、メンテナンスは続けるつもりなのでよろしくお願いします。

[] RubyCocoa 今日のコミット 2015-05-31

半年ぶりくらいですね。。

rbenvの件で思い出したんだけど、RubyCocoaがruby.dylibを要求するのってなんでなのでしょうね。昔は.aでもよかったし、動作させる上では技術的にも問題ないはずなのでライセンス的な話かなあ。。

2015-05-30

[]rb22-*なportがぜんぜんない

とくに結論のないはなし。

MacPortsにrb22-てportないんだけど、なんか例とかないの?」てメールが来た。

PortGroup rubyの確認用に手元では作ってるので、そいつを簡略化してgistに上げて「これ見て」と返信しておいた。


ruby.setup

MacPortsにはPortGroup(コード)という仕組みがあって、Portfileを簡単に書けるようにいろいろサポートしてくれる。

自分が担当する前(ruby-1.8.6以前のころ)から、PortGroup rubyにはruby.setupキーワード(tcl的にはproc)があって、これを使うと簡単にRubyのライブラリツールインストールできるようになっている。

前述のgistの例でいうと、

   ruby.setup          bundler 1.10.1 gem {} rubygems ruby22

で、この行のruby22をruby21にすればport:ruby21用のPortfileになる。(実際にはPortfileのファイル名も変えないとlintにはひっかかる)

これはrubygemsを使う例だけど、他にもいろいろなインストール手法に対応していて、

  • setup.rb
  • extconf.rb && make && make install
  • install.rb (1) basic_install.rb - 実行するとぜんぶインストールする。
  • install.rb (2) - config.saveを生成するタイプ。
  • make (このタイプpdumpfsしか見たことない…)
  • 単純にコピー

などが利用できるようになっている。でもいまどきはgemしかないよね。


rb22-* なportはなぜないのか / そもそもいるの?

直接にはだれもコミットしてないからなわけだけど。いちお考えてみると、

  • brew使ってる
  • gem installすればいい

あたりだよねえ。きっと。

個人的にはgem install|updateすればいいし、portつくって更新に追従するのもめんどう、といったところ。

ただそれは自分がrubyユーザだからそう思うわけで、そうでない人が特定のコマンド使いたいだけで「gem installしてね」というのもどうなんじゃろ?とも思える。(冒頭の質問してきたひとはRailsやってるて書いてたのでgemやbundler使ったほうがよくね?と思うけれど)

たとえばackPerlsphinxblockdiagPythonなわけだけど、それぞれに応じてcpanやpip使いわけてね!ってのものなんだかびみょーな気持ちはぬぐえないよな。

cpan2portのように言語のパッケージシステムから自動でPortfile生成するのもあって、これのgem用のをつくるのもそんな難しくないけど、じゃあ欲しいかっていうとそうでもないよなあ。

2015-05-24

[][]第72回 Cocoa勉強会に行ってきた(5/23)

会場はいつもの新宿伊藤ビルの貸し会議室

ここのとこ休んでたのでわりとひさしぶり。

なんか今回は「Cocoa……?」な回でした。資料はconnpassのほうとか。


発表

業務システム開発の話。自分はそっち側の人間なわけだけど、わかることもそうでないことも。

RSpecに強く影響を受けたテスティングフレームワークQuickの話。ちょうどその後にネット上でまたRSpecについて盛り上がってたのでいいタイミング?

自分はずっとtest-unit派でRSpecよくわからんのだけど、せっかくの機会なので”Better Specs { rspec guidelines with ruby }”とか読んだりしてる。

普段使い+ラズパイ機器の開発にも使える持ち運び可能なディスプレイの話。あいかわらずハードウェアはさっぱりわからん。話聞いてるのは面白いのだけれど。


次回の予定

次回は7月の予定です。

2015-04-15

[][]MacPortsのport:ruby22, ruby21, ruby20を更新

あたらしいバージョンがリリースされていたので対応しました。

  • port:ruby22: 2.2.2
  • port:ruby21: 2.1.6
  • port:ruby20: 2.0.0-p645

2.2にはtk-8.6対応が入ったみたいなんだけど、手元での確認が終わらなかったのでtkバリアントはまだ有効にしていません。次までにはなんとかしたいかな。

あと2.2でサポートしたjemallocもバリアントに次から追加する予定(手元ではテスト済み)です。gmpと同様に、デフォルトはオフで+jemallocで有効になるようにします。

2015-03-03

[][]MacPortsのport:ruby22, ruby20を更新

あたらしいバージョンがリリースされていたので対応しました。

  • port:ruby22: 2.2.1
  • port:ruby20: 2.0.0-p643

2.0.0は最後の通常リリースです。2.2.1はたぶん通常の定期リリースだと思います。

また、1.9.3系は先月でサポート終了しました。今までありがとう!

2014-12-31

[][] MacPortsにport:ruby22を追加

しました。2.2.0です。

基本的に今までと同じです。

  • ruby2.2, rake2.2, gem2.2などバージョンのsuffixがつく
  • port select ruby ruby22などselectを使うと、suffixなしのバージョンで使える

2014-11-15

[][]MacPortsのport:ruby21, ruby20, ruby19を更新(セキュリティ修正あり)

あたらしいバージョンがリリースされていたので対応しました。

  • port:ruby21: 2.1.5
  • port:ruby20: 2.0.0-p598
  • port:ruby19: 1.9.4-p551

今回もセキュリティ修正を含みます。詳細は公式の情報をごらんください。

先日あった、2.1系のコンパイルが古いOS Xでは止まってしまうことがある問題は修正され、2.1にもマージされました。Portfile側でconfigureのオプションを追加していたのを削除しています。

2014-10-30

[]Yosemite用のRubyCocoa 1.2.0インストーラを公開

うん、すっかり忘れてた。Yosemite環境用のインストーラを用意しました。

ruby-1.8はOS X 10.10には入っていないので、ruby-2.0用のもののみです。1.8で使いたい人は先日の1.8用の一式を使ってください。

また、内容は7月にリリースした1.2.0のままなので、ruby-2.0関連の修正されていない不具合があります。trunkでも直ってないんだけど。

2014-10-28

[][]MacPortsのport:ruby21, ruby20, ruby19を更新(セキュリティ修正あり)

あたらしいバージョンがリリースされていたので対応しました。

  • port:ruby21: 2.1.4
  • port:ruby20: 2.0.0-p594
  • port:ruby19: 1.9.4-p550

今回のリリースはセキュリティ修正を含みます。詳細は公式の情報をごらんください。

また、今回のリリースからPOODLE対応として安全でないとわかっているSSL/TLSオプションが無効になっています。こちらも公式ページに説明があります。

MacPortsのrubyとしては、この変更を取り消すvariantは用意しません。


OS X 10.7と10.8でコンパイルが終了しない対策

buildbotの進捗をながめてたら、10.7と10.8のビルドタイムアウトで失敗していた。手元の10.7環境で試してみたところ、minirubyでrbconfig.rbを生成するところで止まってることが確認できた。どうもminirubyがおかしいみたい。`./miniruby sample/test.rb`を実行してみてもうんともすんとも言わない。

このレベルで動かないのはconfig.hがおかしいことが多いので、正常に動作した10.9環境と比べてみる。

   % diff -u config.h-10.9 .ext/include/x86_64-darwin11.0/ruby/config.h
   --- config.h-10.9	2014-10-28 02:38:10.000000000 +0900
   +++ .ext/include/x86_64-darwin11.0/ruby/config.h	2014-10-28 22:09:09.000000000 +0900
   @@ -272,7 +272,6 @@
    #define HAVE_UTIMES 1
    #define HAVE_WAIT4 1
    #define HAVE_WAITPID 1
   -#define HAVE_BUILTIN___BUILTIN_BSWAP16 1
    #define HAVE_BUILTIN___BUILTIN_BSWAP32 1
    #define HAVE_BUILTIN___BUILTIN_BSWAP64 1
    #define HAVE_BUILTIN___BUILTIN_CLZ 1
   @@ -316,9 +315,9 @@
    #define DLEXT_MAXLEN 7
    #define DLEXT ".bundle"
    #define LIBDIR_BASENAME "lib"
   -#define RUBY_SETJMP(env) _setjmp((env))
   -#define RUBY_LONGJMP(env,val) _longjmp((env),val)
   +#define RUBY_SETJMP(env) __builtin_setjmp((void **)(env))
   +#define RUBY_LONGJMP(env,val) __builtin_longjmp((void **)(env),val)
    #define RUBY_JMP_BUF jmp_buf
    #define HAVE_PTHREAD_H 1
   -#define RUBY_PLATFORM "x86_64-darwin13.0"
   +#define RUBY_PLATFORM "x86_64-darwin11.0"
    #endif /* INCLUDE_RUBY_CONFIG_H */

まー、RUBY_SETJMP()やRUBY_LONGJMP()あたりがあやしいよね。configureのオプションで--with-setjmp-type=_setjmpとして強制的に指定してやればminirubyは動くようになって解消した。とりあえず、MacPortsのPortfileにはこれを入れて対処することに。

抜本的な対応は、rubyのupstreamのほうでどうにかしよう。

(10/29 追記)trunkに修正が入り、この問題は解消しました。はやすぎる!

2014-10-26

[][]忘れがち、OS Xの標準のファイルシステムは大文字小文字を区別しない

ちょっと前にMacPortsのチケットで問い合わせがきてた(#45257 (ruby20: warnings from library files that differ only by case of filename) – MacPorts)ものについて、慣れてるとすぐあたりがつくんだけど、気付かないとだいぶイミフなのでメモ残しとこう。

これはMacPorts固有の現象でもないので、10.9 Mevericksに添付のrubyで試してみよう。

   % irb -w --simple-prompt
   >> RUBY_VERSION
   => "2.0.0"
   >> require 'Digest'
   => true
   >> Digest::MD5.digest("!")
   /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/digest.rb:4: warning: method redefined; discarding old const_missing
   /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/Digest.rb:4: warning: previous definition of const_missing was here
   /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/digest.rb:28: warning: method redefined; discarding old file
   /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/Digest.rb:28: warning: previous definition of file was here
     :

定数が上書きされてるよ!という警告がでてきてしまう。これはなぜ?という話。もちろん実際にはファイルは小文字の名前の"digest.rb"しかない。

requireされたファイルを見てみると、確かに"digest.rb"と"Digest.rb"のふたつの名前が読み込まれている。これは実際には同じファイルだ。

   >> $LOADED_FEATURES.grep(/digest/i)
   => ["/System/Library/.../lib/ruby/2.0.0/universal-darwin13/digest.bundle",
       "/System/Library/Frameworks/.../lib/ruby/2.0.0/Digest.rb", # *D*igest
       "/System/Library/Frameworks/.../lib/ruby/2.0.0/digest.rb", # *d*igest
       "/System/Library/.../lib/ruby/2.0.0/universal-darwin13/digest/md5.bundle"]

原因はOS Xの標準のファイルシステム、HFS+がファイル名の大文字小文字を区別しないことだ。

1. require "Digest" → $LOAD_PATHから"Digest.(rb|bundle)"を探すと(詳細はるりまのKernel#require参照)、ファイルシステムは大文字小文字を区別しないので「"Digest.rb"があるよ」と答える → digest.rbが読み込まれ、"Digest.rb"として$LOADED_FEATURESに記録される。

2. Digest::MD5したとき、const_missingの処理の中で`require "digest"`される。"digest.rb"はまだ$LOADED_FEATURESの中にはないので、同じ"digest.rb"が読み込まれる。

という流れみたい。今回は警告メッセージ出すようにしてたから気付けたけれど、ファイル名の大文字小文字がちがってても動いてしまうので、そのまま他の環境に持っていくと動かない。ということもあるので注意。

Mac用のアプリでもこのへんわりとぐだぐだで、ファイルシステムを大文字小文字区別するHFSXに変えると動かないものがあるというのは時々聞く話。でも個人的にはそろそろ標準をHFSXにしてほしいなあと思う。

2014-10-13

[]RubyCocoa with Ruby-1.8 on Yosemite

ちょっとまだruby 2.0対応版に問題があるようなので、とりあえず用意しました。Yosemite GM3上で簡単に動作確認済みです。

配布物は次の2つです。

  • Ruby-1.8-for-RubyCocoa.pkg: ruby本体。rubygemsとtest-unit入り。
  • RubyCocoa-1.2.0-OSX10.10-Ruby1.8.dmg: RubyCocoa。libruby.aに静的リンク済み。

ruby-1.8.7-p374とRubyCocoaのインストーラは別々です。rubyは--disable-sharedしてつくったので、組み込みライブラリCocoaだけで構成されたアプリであれば、ruby本体は不要です。

標準添付ライブラリや他のgem・ライブラリを使用している場合(ようするにアプリのコード以外にrequireしている場合)は、アプリケーション単体で配布するにはRubyCocoa添付のstandaloneify.rbを利用して、アプリケーションバンドルに必要なファイルをアプリケーションに含める必要があります。

 % ruby standaloneify.rb -f -d YourApp.app /path/to/build-dir/YourApp.app

なにかあればお知らせください。

2014-08-01

[][]ruby-2.1.2のlibffi-3.1対応

チケットが来てたので対応しました。

内容についてはrubyのissie#9897にあるとおりです。

いちお簡単に説明すると、ビルド時にマクロとしてRUBY_LIBFFI_MODVERSIONという値を定義しているのですが、従来の"3.0.13"のような数字3つのバージョンから"3.1"という数字2の形式に変わったため、その値に入れるバージョンの加工に失敗してfiddleがコンパイルされないという状況になっていました。

trunkやruby_2_1ブランチでは修正済みだったので、その変更を適用しました。ruby-2.0ではRUBY_LIBFFI_MODVERSIONを使っていないためこの問題はありません。

また、別件で新しいXcodeでdlモジュールがインストールされないという問題があったので合わせて対応しています。

port:ruby21でfiddleが使えないなどの状況が起きた場合は、port upgrade ruby21で解消すると思います。