いつ再チャレンジしようかと思っていた企画ですが、最近RubyとRailsの事を勉強しだしたので、これはクリアしとかんといかん!と思うたので、数日かけてやっとクリアできました。
ではGOGO。
前提条件として、RubyとGemはレンサバに入っているものではなくて自前でインストールしたものでやります!ですが、今回はrbenvで新しいRubyにしたところも載せているのでその辺も見て頂けたらと思います。
rbenvを入れますか
ここは詰まらないと思うので、論よりコードってことで
ディレクトリ名はrubyになってますが、もうちっと考えた名前にした方が後々よろしいです。
mkdir ruby cd ruby git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile echo 'export TMPDIR=HOME/tmp >> ~/.bashrc exec $SHELL -l git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build rbenv install --list rbenv install 2.1.5 rbenv rehash rbenv global 2.1.5 $ ruby -v ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-freebsd9.1]
これでrubyは2.1.5となりました。
シェルはBashを使っています。
Gemupdateしておきます。だいぶと触ってなかったので色々動いてましたがちゃんと見てません。
gem update
とりあえずさくらのレンサバも仕様が変わっているかもしれないので、いったんはRailsをインストールして普通に進めてみようと思います。
とりあえず今の状況を把握
参考サイトは前回と同じです。
Ruby on Railsをはじめよう | Mitakalab:
Railsを入れます。
$ gem install rails --no-ri --no-rdoc Successfully installed rails-4.1.8 8 gems installed
Sqliteは入れてないのでMysqlを指定します。
$ rails new mitakalab-twitter -d mysql
さて、ファイル生成してみてみますがどうなるか。
$ rails g controller users index show Could not find a JavaScript runtime
仮にroot権限があったりLinuxだったらGemfileの
# gem 'therubyracer', platforms: ruby
をコメントアウトしてbundle install とすれば解決です。さようなら。
では本題に戻ります。
うむ、以前とどうやら変わっていないようですね。
rails s / rails g ともにダメです。
OSのバージョンは現在
$ uname -ro FreeBSD 9.1-RELEASE-p15
さて、今の状態を説明しますと、ググるとすぐに出てきますがFreebsdでlibv8とtherubyraceのインストールでこけるという問題がまだ続いているので色々調べている状態です。
まずチャレンジしたこと
GCCをアップグレード
nable to find a compiler officially supported by v8. It is recommended to use GCC v4.4 or higher
何故かというと上のエラーが気になったので、試してみたのですがこれまたなかなか大変でした。
ちなみにデフォは4.2です。
$ gcc -v gcc version 4.2.1 20070831 patched [FreeBSD]
4.4を入れようと思います。
$ wget http://core.ring.gr.jp/pub/GNU/gcc/gcc-4.4.4/gcc-4.4.4.tar.gz
まずはいきなり./configureしてみました。
configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.
うすうす分かっていましたが、gmpとmpfrを入れろとの事。
Versionを確認したのさと言い訳して先に進む。
最初にgmpをインストールしましょう。
オプションはこれでOKかと思います。
なんでmpmrなんてディレクトリ名なのかというと、先にgmpを入れないといけないのに、mpfrを入れようとしてエラーが出たけどそのままやっちゃったんですね~。
しかもスペルを間違えてるというバカっぷり。
./configure --prefix=/home/USER/mpmr/ Libraries have been installed in: /home/USER/mpmr//lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /bin/sh ./mkinstalldirs /home/USER/mpmr//include mkdir /home/USER/mpmr/include /usr/bin/install -c -m 644 gmp.h /home/USER/mpmr//include/gmp.h /bin/sh ./mkinstalldirs /home/USER/mpmr//include /bin/sh ./mkinstalldirs /home/USER/mpmr//info mkdir /home/USER/mpmr/info /usr/bin/install -c -m 644 ./gmp.info /home/USER/mpmr//info/gmp.info /usr/bin/install -c -m 644 ./gmp.info-1 /home/USER/mpmr//info/gmp.info-1 /usr/bin/install -c -m 644 ./gmp.info-2 /home/USER/mpmr//info/gmp.info-2 install-info --info-dir=/home/USER/mpmr//info /home/USER/mpmr//info/gmp.info
では続いて、mpfrを入れますが、ここではgmpのパスを指定します。
さっき間違えたパスのまま進めたので、ずっとmpmrのままですorz
$ ./configure --prefix=/home/USER/mpmr/ --with-gmp=/home/USER/mpmr/ ranlib /home/USER/mpmr/lib/libmpfr.a ---------------------------------------------------------------------- Libraries have been installed in: /home/USER/mpmr/lib Libraries have been installed in: /home/USER/mpmr//lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /bin/sh ./mkinstalldirs /home/USER/mpmr//include mkdir /home/USER/mpmr/include /usr/bin/install -c -m 644 gmp.h /home/USER/mpmr//include/gmp.h /bin/sh ./mkinstalldirs /home/USER/mpmr//include /bin/sh ./mkinstalldirs /home/USER/mpmr//info mkdir /home/USER/mpmr/info /usr/bin/install -c -m 644 ./gmp.info /home/USER/mpmr//info/gmp.info /usr/bin/install -c -m 644 ./gmp.info-1 /home/USER/mpmr//info/gmp.info-1 /usr/bin/install -c -m 644 ./gmp.info-2 /home/USER/mpmr//info/gmp.info-2 install-info --info-dir=/home/USER/mpmr//info /home/USER/mpmr//info/gmp.info
ここまでは大したことはなかったのですが、ここからだんだん大変になってきます。
gmake[2]: *** [configure-stage1-target-libgcc] エラー 1 gmake[1]: *** [stage1-bubble] エラー 2 gmake: *** [all] エラー 2
config.logを見ろとあるので(気づくのにだいぶかかったのだが)素直に見ましょう。
$ cat ./x86_64-unknown-freebsd9.1/libgcc/config.log | grep "not found" Shared object "libmpfr.so.2" not found, required by "cc1" Shared object "libmpfr.so.2" not found, required by "cc1"
ないと言われるのだが、あるのでしっかりここだよここ!としてあげます。
$ ls -l /home/USER/mpmr/lib/ | grep libmpfr.so.2 lrwxr-xr-x 1 USER users 12 11月 19 02:11 libmpfr.so -> libmpfr.so.2 -rwxr-xr-x 1 USER users 963649 11月 19 02:11 libmpfr.so.2
どこでやるかと言うと
LD_LIBRARY_PATH
こいつです。
./bash_profileに指定しました。
で、もう1度!で上手くいきました。
Libraries have been installed in: /home/USER/bin/lib
そして、よく見ると毎回メッセージでちゃんと教えてくれていた訳ですね。
If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
LD_LIBRARY_PATHに追加するように書いてあります。
これでGCC4.4が入ったのですが、GCCのMakeはかなり時間とリソースを食います。
-s -g4オプションで4並列でgmakeしましたが、Loadaverageも10ほどになりました。
これが出来上がったGCC。ちゃんとライブラリとかいろいろ設定しましょう。
$ gcc-4.4 -v Using built-in specs. Target: x86_64-unknown-freebsd9.1 ▒▒▒▒ե▒▒▒▒▒▒ץ▒▒▒▒: ./configure --prefix=/home/USER/bin --program-suffix=-4.4 --disable-multilib --with-gmp=/home/USER/mpmr --with-mpfr=/home/USER/mpmr ▒▒▒▒åɥ▒ǥ▒: posix gcc version 4.4.4 (GCC)
文字化けしちゃうんだが、動作には問題ないです。
ではでは、ここらでいったん必要なものをまとめてみます。
通常であればFreeBSD 9 で amd64の場合は
gem install libv8 -v '3.3.10.4' -- --with-system-v8 gem install therubyracer -v '0.10.2' -- --with-v8-dir
この組み合わせのはずです。
参考サイト
libv8とtherubyracer入らない問題にわたしもハマったメモ – 青いの:
GCCもバージョンあげたし大丈夫だあ!という事でやってみたら。
全然無理でした。
ハッと思ったのが、ローカルからぶっこむとどうだろうかと思ったのですが。
$ gem install --local therubyracer-0.10.2.gem Building native extensions. This could take a while... Successfully installed libv8-3.3.10.4 Building native extensions. This could take a while... ERROR: Error installing therubyracer-0.10.2.gem: ERROR: Failed to build gem native extension. /home/USER/.rbenv/versions/2.1.5/bin/ruby extconf.rb creating Makefile make "DESTDIR=" clean make "DESTDIR=" compiling rr.cpp rr.cpp: In function 'VALUE rr_define_finalizer(VALUE, void*, VALUE)': rr.cpp:48: warning: control reaches end of non-void function compiling v8.cpp In file included from v8.cpp:16: v8_locker.h:6:7: warning: no newline at end of file In file included from v8.cpp:17: v8_debug.h:6:7: warning: no newline at end of file In file included from v8.cpp:18: v8_v8.h:6:7: warning: no newline at end of file compiling v8_array.cpp v8_array.cpp:48:2: warning: no newline at end of file compiling v8_callbacks.cpp compiling v8_context.cpp compiling v8_date.cpp v8_date.cpp:34:2: warning: no newline at end of file compiling v8_debug.cpp In file included from v8_debug.cpp:2: v8_debug.h:6:7: warning: no newline at end of file compiling v8_exception.cpp v8_exception.cpp:10: warning: '<unnamed>::stack' defined but not used compiling v8_external.cpp v8_external.cpp:10: warning: '<unnamed>::references' defined but not used compiling v8_function.cpp In file included from /home/USER/bin/include/c++/4.4.4/vector:61, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h: In function '_OI std::__copy_move_a(_II, _II, _OI)': /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: expected primary-expression before ')' token /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: there are no arguments to '__is_pod' that depend on a template parameter, so a declaration of '__is_pod' must be available /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated) /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:396: error: '__simple' cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:397: error: template argument 2 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h: In function '_BI2 std::__copy_move_backward_a(_BI1, _BI1, _BI2)': /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:587: error: expected primary-expression before ')' token /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:587: error: there are no arguments to '__is_pod' that depend on a template parameter, so a declaration of '__is_pod' must be available /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:592: error: '__simple' cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:593: error: template argument 2 is invalid In file included from /home/USER/bin/include/c++/4.4.4/vector:62, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/allocator.h: At global scope: /home/USER/bin/include/c++/4.4.4/bits/allocator.h:146: error: expected primary-expression before ')' token /home/USER/bin/include/c++/4.4.4/bits/allocator.h:146: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available /home/USER/bin/include/c++/4.4.4/bits/allocator.h:163: error: expected primary-expression before ')' token /home/USER/bin/include/c++/4.4.4/bits/allocator.h:163: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available In file included from /home/USER/bin/include/c++/4.4.4/vector:63, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/stl_construct.h: In function 'void std::_Destroy(_ForwardIterator, _ForwardIterator)': /home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:116: error: a function call cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:116: error: template argument 1 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:117: error: invalid type in declaration before '(' token /home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:117: error: invalid use of qualified-name '::__destroy' In file included from /home/USER/bin/include/c++/4.4.4/vector:64, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator)': /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:115: error: a function call cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:116: error: a function call cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:116: error: template argument 1 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function 'void std::uninitialized_fill(_ForwardIterator, _ForwardIterator, const _Tp&)': /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:170: error: a function call cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:170: error: template argument 1 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:171: error: invalid type in declaration before '(' token /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:171: error: invalid use of qualified-name '::uninitialized_fill' /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&)': /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:223: error: a function call cannot appear in a constant-expression /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:223: error: template argument 1 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:224: error: invalid type in declaration before '(' token /home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:224: error: invalid use of qualified-name '::uninitialized_fill_n' In file included from /home/USER/bin/include/c++/4.4.4/vector:65, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/stl_vector.h: In member function 'void std::vector<_Tp, _Alloc>::swap(std::vector<_Tp, _Alloc>&)': /home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available /home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: '__is_empty' was not declared in this scope /home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: template argument 2 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: invalid type in declaration before '(' token In file included from /home/USER/bin/include/c++/4.4.4/vector:66, from v8_function.cpp:2: /home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h: In member function 'void std::vector<bool, _Alloc>::swap(std::vector<bool, _Alloc>&)': /home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available /home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: '__is_empty' was not declared in this scope /home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: template argument 2 is invalid /home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:760: error: invalid type in declaration before '(' token *** [v8_function.o] Error code 1 Stop in /home/USER/lib/ruby/gem/gems/therubyracer-0.10.2/ext/v8. make failed, exit code 1 Gem files will remain installed in /home/USER/lib/ruby/gem/gems/therubyracer-0.10.2 for inspection. Results logged to /home/USER/lib/ruby/gem/extensions/x86_64-freebsd-9/2.1.0-static/therubyracer-0.10.2/gem_make.out
Successfully installed libv8-3.3.10.4が出たところでぬか喜びさせられましたが結局無理でした。
これをクリアすれば解決かなぁとうすうす感じていたので引くに引けない状態で、それが3日ほど続きましたw
いろいろなバージョンのv8とtherubyracerだったらどや!
また諦めようと思いかけたのですが、v8とtherubyracerにfreebsd版がある事に気づいたのでいろいろなパターン試してみました。
これが正しいバージョンのはずですが。
$ gem list v8 *** LOCAL GEMS *** libv8 (3.3.10.4 ruby amd64-freebsd-8) libv8-freebsd (3.3.10.4) $ gem list therubyracer *** LOCAL GEMS *** therubyracer-freebsd (0.11.1) $ gem list therubyrhino
これです。
まぁ、これもダメだったんですけどね。
その他、libv8を1個にするのも試したし、Bundleに指定するのも試しましたがダメですた。
ガンガン進めてログも残してないので何も載せれませんw
めげずにダウンロードできる全てのバージョンで試しましたが
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
(´・ω・`)
execjsでも、therubyrhinoも試しましたが同じく、Javascriptのruntimeがないと仰る同じ結果でした。
$ gem list execjs *** LOCAL GEMS *** execjs (2.2.2)
$ gem list therubyrhino *** LOCAL GEMS *** therubyrhino (2.0.4) therubyrhino_jar (1.7.4)
だが今回はまだあきらめなかった!
逆転裁判だったらこの辺でのりうつった綾里千尋が出てくるところらへん。
Node.jsを入れる
過去にも参考にしていた
JavaScriptエンジンをインストールする – 祈れ、そして働け ~ Ora et labora:
こちらでも色々な方法があるぜよ!と記載されているので、じつは前回にも解決できたのかもしれないが、そこは当時と今との経験と引き出しの違いだってことで。
参考サイト
root権限なしでNode.js、MongoDBをインストールする方法:
手順は参考サイトを見て進めてね。
$ node -v v0.10.33
よし、入りました!!
この手順でlibexecinfoも入りました。
レンサバでPortsCollectionからインストールする手順もググると出てきますので、そっちでもいいかもしれません。
さあ、閉めにいきますか。
簡単なものを作成してみます。
$ rails new testrails -d mysql
次rails gでエラーが出なければこちらの勝利です。
$ rails g controller users index show create app/controllers/users_controller.rb route get 'users/show' route get 'users/index' invoke erb create app/views/users create app/views/users/index.html.erb create app/views/users/show.html.erb invoke test_unit create test/controllers/users_controller_test.rb invoke helper create app/helpers/users_helper.rb invoke test_unit create test/helpers/users_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/users.js.coffee invoke scss create app/assets/stylesheets/users.css.scss
トゥットゥル ━━(゚∀゚)━━━━━!!
長かった・・・。
Mysqlの設定をconfig/database.ymlに書き換えよう。
$ rails s
libv8-freebsdとNode.jsでOKだったってことで。
javascript – therubyracer or nodejs, which should I use? – Stack Overflow:
StackOverflowでネタにもなっていました。
あじゃじゃしたー (●´ω`●)