SOLG System Blog

MEANと私(出会い編)

2016年01月29日

MEANと私(出会い編)

こんにちは、
プログラムを書くより要件定義や外部設計をやってる方が多い私です。

けれど、やっぱりプログラムは好きなのと
何か新しいものをやりたいなぁという好奇心から
ちょっと前から気になっていた、
従来の
「クライアントからのリクエストでの応答する」のではなく
「サーバーからクライアントへプッシュする仕組み」について調べていたら

MEAN Stackに出会いました。

LAMPに代わる次世代の構成とのこと。
おい、大きく出たな。

MEAN Stackの特徴は、
・サーバーとクライアント両方の面倒を見てくれる
・言語はJSのみ
・サーバープッシュ型なので利用者が更新ボタンを押さなくても情報を提供できる

他にも何か書いてあったけど、眠たくなってきたので、そっとタブを閉じました。
要は、JSだけでサーバーサイドからクライアントまで全部作れる簡単な仕組みだよってことかな。
そうに決まってる。

ついでにMEAN Stackで探すと必ず出てくる説明ここに書いときますね。

MEAN Stackとは、システムを構成する技術の頭文字を繋げたものです。
M MongoDB
E Express
A AngularJS
N Node.js
+ Stack(まとめるって意味)

Node.js以外は聞き覚えのないものばかりだ。

ついでにLAMPは
L Linux
A Apache
M MySQL
P PHP

LAMPはOSがLinuxで固定になってるけど
MEANはMAC、Linux、Windowsで使えるとな。

へぇー

Linux限定だったら
ラーメン(LAMEN)になってたのに・・・残念。

実際に流行っているのか調べてみたところ
Googleトレンドで見たらこんな感じ





2014年あたりからグイグイっと上昇してる。
国でいうとインド、アメリカ、カナダ、オーストラリア、ふむふむ、日本は、なしと。
アマゾンで書籍を探しても、なし・・・

こ、これは、あれか

ビックウェーブがくる前兆か

よし、この波に乗るためにちょっと先に勉強して
作ろうと思ってた趣味(ネトゲ)のサイトもこれで作ってみよう。
使えそうだったら業務にも活用してみよっかな!(お許しが出れば)  

Posted by iA SEチーム at 20:00Comments(0)システム制作

[Rails]Railsのバージョンを上げたことでspatial_adapterが使用できなくなりました

2016年01月14日

遅くなりましたが、明けましておめでとうございます。
今年もよろしくお願いいたします。

さっそくですが、本題に入ります!
今回はRails4.2にて標準搭載となったActive Jobを使用したいために、Railsのバージョンをあげたところspatial_adapterが使用できなくなってしまった件について話していこうと思います。

spatial_adapterとは


標準のRailsではMySQLのgeometry型が取り扱い使いづらいため、使いやすくしてくれるgemです。
githubにて色々な方が公開されているため、実際に使用したものが気になる方はこちらをごらんください。

Rails4.2でのspatial_adapterのエラー


githubを見ていただいた方は、お分かりになったかと思いますが、
ActiveRecordのバージョンが3.2.0 and upとなっており、Railsのバージョンが上がったことで合わせてActiveRecordのバージョンが上がったので、対応していないバージョンになってしまいました。

どのようにエラーが出たかというと…
マイグレーションなど処理実行時に以下のようなエラーがでてしまいました。
$ bundle exec rake db:migrate
rake aborted!
NoMethodError: undefined method `type' for "varchar(255)":String

原因箇所については、dbに関わりそうなgemを1個ずつ削って調査しました…

Rails4.2では何を使えばいいのか?


google先生にいろいろ教えていただいたところ、Rails4.2でgeometry型を扱うにはactiverecord-mysql2spatial-adapterを使用すればいけるとのこと。
ただ、インストールされているActiveRecordのバージョンが4.2だったため、今回はこちらのactiverecord-mysql2spatial-adapterを使用させていただきました。

ではマイグレーションから…
$ bundle exec rake db:migrate
== 20151225060238 DeviseCreateUsers: migrating ================================
-- create_table(:users)
-> 0.0109s
-- add_index(:users, :email, {:unique=>true})
-> 0.0123s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0134s
== 20151225060238 DeviseCreateUsers: migrated (0.0368s) =======================

うまくいったので、次はgeometry型の値を取得してみます(実際には他にもテーブル生成しました)。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.3ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
=> #Location id: 1, geom: 0
irb(main):002:0> l.geom.class
=> Fixnum

むむむ…
geometry型のはずの値が数値となっていました。再度いろいろ調べてみるとrgeorgeo-activerecordのgemが必要ということでインストールしてgeometry型の値を取得。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.3ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
=> #Location id: 1, geom: 0
irb(main):002:0> l.geom.class
=> Fixnum

むむむむむむ…
結果は変わらず、geometry型のはずの値が数値となっていました。なにがおかしいんだと思いながらactiverecord-mysql2spatial-adapter-42のドキュメントを再読…
すると、db設定のadapterを「mysql2」ではなく「mysql2spatial」にするという記述があったため変更してgeometry型の値を再度取得。
$ rails c
Loading development environment (Rails 4.2.5)
irb(main):001:0> l = Location.first
Location Load (0.2ms) SELECT `locations`.* FROM `locations` ORDER BY `locations`.`id` ASC LIMIT 1
skip_logging (1.7ms) SHOW FIELDS FROM `locations`
=> #Location id: 1, geom: #RGeo::Geos::CAPIPointImpl:0x3fd68132ac34 "POINT (138.48486379999997 35.0239507)"
irb(main):002:0> l.geom.class
=> RGeo::Geos::CAPIPointImpl
irb(main):003:0> l.geom.x
=> 138.48486379999997
irb(main):004:0> l.geom.y
=> 35.0239507

見事geometry型の値を取得することに成功しました!
ちなみに、データについてはspatial_adapterのgem使用時に登録しておいたデータでも問題なくgeometry型の値を取得できましたが、どうやらspatial_adapterのバージョンが低いとそのままでは使用できず、sql文でgeometryからxy値を取得して変換をしないとエラーとなるようです。

まとめ


Railsのgemは便利なものが多く、一度環境さえ作成できればかなり簡単に開発が行えるのですが、Ruby、Railsのバージョンを上げ、使ってたgemが使えなくなった際、どのgemが使えなくなったのか原因調査が難しく、代わりを見つける、または、自作しなければならないということになり、結構難易度が高いなーっと改めて実感しました。
gem周りについては、とにかく経験を積むしかないと思うので、また同じようなことがあれば情報共有ということで書いていければと思います。

では、今回はこの辺りで!  

Posted by iA SEチーム at 23:03Comments(0)システム制作プログラミングrails

PageTop