Ubuntu 14.04上でruby2.2.1のインストールに失敗する(解決済み)

Ruby 2.2.1 リリース

お仕事の種でもあるRubyの最新版が出ていたので、OS XUbuntuでアップデートをしておりました。OS Xこんな感じでインストールして特に問題なく移行完了。ところがUbuntu14.04ではビルドエラーが発生。

(中略)
make[2]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/nkf' から出ます
compiling basicsocket.c
make[2]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/stringio' に入ります
compiling stringio.c
make[5]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/fiddle/libffi-3.2.1' から出ます
make[4]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/fiddle/libffi-3.2.1' から出ます
make[3]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/fiddle/libffi-3.2.1' から出ます
linking shared-object fiddle.so
<span style="color: #ff0000">/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): 再配置 R_X86_64_32S (`.rodata' に対する) は共有オブジェクト作成時には使用できません。-fPIC を付けて再コンパイルしてください。
./libffi-3.2.1/.libs/libffi.a: error adding symbols: 不正な値です</span>
collect2: error: ld returned 1 exit status
make[2]: *** [../../.ext/x86_64-linux/fiddle.so] エラー 1
make[2]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/fiddle' から出ます
make[1]: *** [ext/fiddle/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
compiling socket.c
compiling ossl_ssl_session.c
linking shared-object sdbm.so
compiling openssl_missing.c
make[2]: ディレクトリ `/tmp/ruby-build.20150307150624.4543/ruby-2.2.1/ext/sdbm' から出ます
compiling ossl_pkey_dsa.c
(中略)

libffiといかにも怪しいところがあったのと、2.2.0が出たときになんかその辺りの内容で話題があったと記憶していたのでささっとぐぐってみると、日本語版が始まったスタックオーバーフローに行き当たる。

rbenv での Ruby 2.2.1 のインストールに失敗する - スタック・オーバーフロー

Home · sstephenson/ruby-build Wiki

なるほどruby-build経由でインストールする場合に、Ubuntuではlibffi-devが必要なのね。実際sudo apt-get install libffi-devとしたところインストールが始まり、その後再ビルドすると問題なく終了。さて、gemの移行もするかな。

タクシー数の4乗数をRubyで

タクシー数の4乗数バージョン - りつ缶

まあこんな感じで。

gistbe48edab1b249f27a6d7

考え方

ぱっと思いついたのは、しらみつぶしにパターン列挙してx^4+y^4の結果が同じになるものを調べればいいなぁということで非常に安易な方法だったのだけど、

  1. (1,1)から(300,300)の組をはじめに列挙
  2. (1,2)と(2,1)は組としては同じものなのでペアをつくるときにソートしてuniq!
  3. group_byメソッドx^4+y^4を計算して、同じ値になるものをグループ化
  4. 1組しかないものは捨てて、残ったものが求めるもの

とした。一応リンク先のコードの結果も同じものなので大丈夫なはず。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

初めはGoで書こうかとも思ったけど、範囲オブジェクト使えないのがめんどくさくなって逃げてしまったわ……

Spork使うことになったので、メモ他

Spork

今のプロジェクトで使っているRailsのバージョンが3系列なこともあり、最近は4系列の話ばかりWeb上の情報を拾ってしまうので、まとめたことなどをメモしておく。

sporkrb/spork

Sporkはテスト時のRailsサーバを予め起動しておいてテスト実行時間を短縮してくれるものという認識。

プロジェクトの方針としてなるべくユニットテスト書きましょうよって話になり、これまでも場当たり的にかかれていたのをきっちりやりましょうよということで、きっちり環境整備。Spork*1自体はプロジェクトのGemfileに入っていたのだけど、頻繁にブランチを切り替えるような使い方になると都度都度立ち上げ直すのもだるいので、プロジェクトとは別に導入。

gem install spork

後はコマンド叩いて起動。自分の開発環境ではtmuxinatorを導入してRailsサーバ、rails consoleなどを一斉に立ち上げているのでsporkも同様に立ち上げています。後、開発サーバがあってそこでみんなが揃って開発しているような場合、sporkの使用するポート番号がかぶるのでexport RSPEC_DRB=33334のように環境変数設定しておく。これをしておかないとrspec test.rbみたいにコマンド叩いてrspecを起動したときにデフォルトポートを使用しているsporkに接続して、意図と違うRailsサーバでテストを開始しようとするので注意。

テストでの悩みどころ

  • プロジェクト柄、DB構造が結構複雑になっていてテストデータつくるのが大分つらい
    • テストケースもいろいろ考えられるので、このへんに時間かかるのは仕方ないと思いつつもうちょっとらくできないかと思う
  • Ralisのバージョンアップが速いので、どれがどのバージョンの情報なのかわかりづらい
    • 常に最新バージョン使い続けるというものであればいいのだけど、移行も時間かかるしのう
    • Rspecにしても記述方法かわってたりして、なかなか大変

とにかくテストデータ周りはFactoryGirl導入とかそういう話ではなく、もともとの仕様が複雑になってるところが要因なのでなんとか楽にしたいなーと思う。プロジェクト内でもそろそろ技術的負債*2を返すための期間を設けようか、という話も出てきているので何かしらネタを考えておきたいな。

*1:Rails4系列ならrails/springなんだろうし、Rails3.2なら導入できたんだろうけどいろいろお察しである。

*2:出ましたねこのワード

毎度面倒くさいのでruby-buildの環境変数周りについてメモを書いておいた

いつもいつも忘れてしまうのでruby-buildのconfigureオプションの設定についてメモっておく

時にはこういう技術的なメモも残していることを書いておかないと、このブログの存在意義の危険が危ない。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

メタプログラミングRuby

メタプログラミングRuby

大分慣れてきたので、他の言語も触らないとなー。業務で使う可能性はあるしScalaClojureあたりを押えておこうかな。

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

プログラミングClojure 第2版

プログラミングClojure 第2版

.vimrcの整理がてら、使ってるプラグインをさらしてみる

Goodbye Yellow Brick Road

Goodbye Yellow Brick Road

 色々な曲が発売されている今日この頃ですが、Goodbye Yellow Brick RoadをBGMにしながら.vimrcの整理なんぞしています。何せ会社と家の環境で設定している内容が違ったりしているので、時折操作を間違える事案が発生しておりましてな……おおざっぱな機能ごとに何を使ってるか書いておきます。未来の自分がきれいにまとめてくれることを信じて。

MacVim

 会社のUbuntuとかCentOS上ではVimのソースをとってきて香り屋パッチを当てて使ってますが、家のMacではmacvim-kaoriyaを使っております。ただここ最近はターミナル上で過ごしていることが多いので、Macでも会社と同じように自前でビルドしたほうがいいかなーと思っていたり。

プラグインたち

言わずと知れたプラグイン

  • NeoBundle
    • プラグインの管理はもうこれ全部にお任せ。
  • vimproc
  • Unite.vim
  • lightline.vim
    • 常用というかないとつらい。lightlineはfontの適用がうまくいってないので、Coolな三角形はなし。Uniteはfile, grepあたりをよく使う。grepはSilver Searcherに置き換え済み。
  • vimshell
    • 最近はあまり使ってない。tmuxでがんがんwindow立ち上げるので、そっちで操作することがおおい。
  • neocomplete
  • neosnippet
    • これもないと開発がつらい。neosnippetはもうちょっとsnippet増やして手数を減らしたい。
  • vimfiler.vim
    • 時々使う。けど便利。

RubyRails

  • vim-rails
  • vim-endwise
  • unite-rails
    • 間違いなく一番使われているのはvim-endwise。そもそもRubyでの開発環境構築がかなり突貫でやったので、いまいち使いこなせてない。精進が必要。

git

  • vim-fugitive
  • gitv
    • fugitive大活躍。

読んでるVim

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!

まだ全部読めてないよ! 分かってる人は分かってると思われるが、大事なことが書かれている。個人的にはなるほどと膝を打つ内容がおおい。

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

会社の棚にひっそりと置かれていたので、手元で時々参照。

なんかタイミング良く会社においてあったので読んでいる。

昨日ごりごりRuby書いているときに他の言語の感覚のままでハマったこと

 ひさびさにこういうハマりかたして、解決までえらく時間がかかってしまったので戒めにメモ。

 業務でプロジェクト内のコードを参考にしつつ、新規機能を追加していたのだけど思った通りの挙動をしない事案が発生。あれーと思い自分の書いたコードを見直しても参考にしたコードとほとんど変わらないので、色々調べてたら参考にしたメソッドと同名のメソッドが同ファイル内に定義されていることが判明。結果的にその同名メソッドが呼び出されていたというオチ。

 簡単な実証コードは以下。Rubyでは3引数のメソッドを呼び出そうとするとエラーになりますね。C#はオプションなしを優先するからそっちになれてしまってる優先順位を勘違いしていた。*1

*1:普通こんなコード書かないので、言語での実現可能性のお話ね

転職して3週間立ちましたので、Rubyについてちょっと書いておくか

洲崎西が面白すぎるここ数日、そして転職して大体3週間ぐらい立ちました。初めの1週間ぐらいは様子見な感じでしたが、今はもうごりごりコード書いていってます。

まああまりクリティカルでない、細々としたところですがシステムの構成把握とかコード読んだりとかもろもろしつつやってるので、なかなか時間が過ぎるのが早い毎日です。あと前職だと情報共有はメールとエクセル方眼紙やらばんばん飛び交って、どれを読んだか分からん状態だったのが今の職場だと使えるものは使うということで、SkypeやらHangoutやらその他諸々情報伝達手段が充実してメールを書く量がきれいさっぱりなくなりましたわ。

そんな感じで毎日過ごしておりますが、Rubyで本格的に仕事を始めたことによって思うところがあるのでここに記しておきます。

変幻自在の道具

Ruby触ってて思うのは、よく言えば解決する物事に対して柔軟に対応できそう、悪く言えばとらえどころがなくてどういう風に扱えばいいのか迷う、その粘土のような変幻自在性が性に合うか合わないかってところだなーというところ。確かに面白い言語ではある、が開発環境周りは「ああ、今まで楽だったのか」と思うところしきりである。

僕らはコンパイラに守られている

ばりばりのWindows端末でVisual Studioが重い……と思いつつ、C#がりがり書いていた身としてはほんとにコンパイラとかにお世話になっていたのだなぁと、これまでの仕事をしみじみと思い返してしまうのです。Rubyの「思った通りに動かせる」感は偉大ですが、コンパイラの出すエラーにとてもとても頼っていたということをまざまざと見せつけられた日々でありました。dateとdataとData、咄嗟のtypoに気付かない恥ずかしい思いをコンパイラは未然に防いでくれていたのでした。こりゃテスト書かないとやってられんわ。

IDEは偉大

どれだけの人が、Rubyのメソッドを覚えていてきっちり動くコードに落とし込めるのだろう。

重い重いと思っていたVisual Studioの至れり尽くせり感はやはりすごいと思う。最近だとJavaをちょっと触るのにInteliJを使ったりしてるけど、そのメソッドはどういう効果をもたらすか、までは覚えていられるけどやはりメソッド名はなかなか覚えていられない。そんなもんだから補完機能なんかは使わないとやってられないのだけど、IDEの「すぐに使える」補完機能というのは便利すぎて……面倒くさがりやかつ開発環境整備についつい熱をいれてしまう自分にはVimの設定をあれこれ詰めていく作業が仕事する時間をがりがり削っていってなかなか大変です。

よくみたらRuby関係ない気がしてきた

深夜帯にこういう文章書くのは話が支離滅裂になりやすいと思うので、もう寝ます。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

そろそろ買っておきたいなぁ。