Rails + Adobe AIRでの業務システム
昨年末から4月末まで、 Rails(JSON+RubyAMF) + Adobe AIR(Flexベース,デスクトップアプリ)での業務システムな仕事をがっちりとやっておりました。
Adobe AIRというと、今だとモバイル開発が主戦場で、WindowsやMac向けのデスクトップアプリとしては、世間一般ではオワコン扱いなのかもしれません*1。
しかし、今回Rails+Adobe AIRの組み合わせでやってみて、個人的にはこういう組み合わせは業務システム用途ではまだまだイケる、アリだよねという感想を持ちました。
以下、いいとおもった事をつらつらと。
デスクトップアプリなので、ブラウザ間の差異とか気にしなくていい。
Adobe AIRはCookieの取り扱いはブラウザのものを使うので、DeviseとかRailsに構築した認証の仕組みがそのまま使える。
Railsサーバ側ではAPI提供に徹して、AIR側と疎結合に構築すれば、構成変更等にも柔軟に対応出来る。
PDFでの印刷処理が楽*2。
開発言語がActionScriptなので、クライアントサイドをJavaScriptで開発する時よりハマリが少なくていい。クラス定義、パッケージ、型宣言があるので大分いい。
もっとも、これは開発側から見てのいい点なので、発注側から見た場合にはこの限りではないでしょう。
これからだと、技術者の確保が難しくなっていく(る)とか容易に想像出来ますし。
Flex SDKがASFへ委託されたりとか、プラットフォーム自体の将来性がどうなのかとか。
・・とかありますが、責任持って面倒見られる人がいれば、発注側にとっても今でもいい選択肢かと。
つぶのみをTwitter API version 1.1対応しました
https://dev.twitter.com/blog/current-status-api-v1.1
https://dev.twitter.com/blog/changes-coming-to-twitter-api
検索APIが認証必須に変わっているので、対応しないと検索などが何れできなくなってしまいます。
で、重い腰を上げて対応しました。
と、言ってもtwitter4Jをバージョンアップしただけです。
検索の結果もユーザータイムラインやホームタイムラインの結果と同じ内容のツイートのデータを返すようになった為、若干の作業が必要になりましたが、大した苦労なく対応できました。
twitter4J本当便利。ありがたいことです。
つぶのみはこちら
第28回 Rails勉強会@東北に参加
https://www.facebook.com/events/378705102216002/
OzakiさんによるRails4.0ネタでした。
はじめにこちらのスライド。
https://speakerdeck.com/alindeman/rails-4-dot-0-whirlwind-tour
その中から特にStrong ParametersとTurbolinksについては、スライド見終わった後、RailsCastsをネタに皆で手を動かしながらワイワイとやりました。
http://railscasts.com/episodes/371-strong-parameters
http://railscasts.com/episodes/390-turbolinks
Turbolinksはこのままリリースされたらギャッという人がたくさん出そうでだいぶアレ。
後、スライド中で出てきたnoneというメソッドやallがActiveRecord::Relationを返す件について↓
#Relation#none # Chainable null object > Post.none #<ActiveRecord::Relation []> # Doesn't hit database > Post.none.to_sql "" > Post.none.to_a [] #Relation#all returns a relation (chainable) # Rails 3 > Post.all.class Array # Rails 4 > Post.all.class ActiveRecord::Relation > Post.all.to_a.class Array
勉強会中に、jQueryや関数型言語っぽくチェーンして書けて、条件分岐を書くケースが減るという事かなとか言いましたが、実際の使用ケースを見ないとわからないという意見がありました。
で、記事に書いてみようかと思ったら、Active Record Query Interface — Ruby on Rails Guidesここに書いてあったのでまるまる引用。
9 Null Relation
The none method returns a chainable relation with no records. Any subsequent conditions chained to the returned relation will continue generating empty relations. This is useful in scenarios where you need a chainable response to a method or a scope that could return zero results.
Post.none # returns an empty Relation and fires no queries. # The visible_posts method below is expected to return a Relation. @posts = current_user.visible_posts.where(name: params[:name]) def visible_posts case role when 'Country Manager' Post.where(country: country) when 'Reviewer' Post.published when 'Bad User' Post.none # => returning [] or nil breaks the caller code in this case end end
Rails4.0では、noneでActiveRecord::Relationを返してくれるので、上記のようにcurrent_user.visible_postsのところで空配列が来てるかの条件分岐を入れずに、jQueryのようにチェーンして書けると。
ScalaのOptionのNoneとかも彷彿とさせますね。
Rails3.2までの場合だと、例えば[]やnilを返してそれをチェックするとか、visible_posts_user_nameといったvisible_postsとwhere(name: params[:name])を一気に処理するメソッドを作成するといったアプローチになるかと。
Rails4.0の場合は、visible_postsメソッドを他でも利用出来て、再利用性を高めて、さらに重複を排除してコードを書けるようになるというのがメリットかなあと。
allがActiveRecord::Relationを返すようになるというのも同様な流れな気が。で、allがActiveRecord::Relation返せば、scopedはいらない子になるのでDEPRECATIONと。
もっともallの場合は、all呼ばないでwhere呼ぶ事が多い気がするので使用ケースは少ないかと。
個人的にはこんな風に理解しました。
参加の皆様お疲れ様でした。
YQLで複数ブログのRSSをJSONで取得して、新着として表示する
前に単独のRSSを取得する方法を書いたけど、複数取得を書くのをすっかりわすれていたので。
簡単なのでYQLだけ。ついでに日付順になるようsortも。
select * from rss where url = 'http://d.hatena.ne.jp/yuichi_katahira/rss' or url='http://blog.livedoor.jp/katahirado/index.rdf' | sort(field="date",descending="true");
なお、RSS2.0を混ぜると、日付はpubDateになり、RSS1.0のdate(dc:date)とは異なるので、YQLの結果だけで日付順にするのは無理かと。
あと、Atom,Feed0.3なんかもまぜようとすると、from句をrssからxmlにしないと当然取れない。
で、XMLにした場合は、取れる結果が、各ブログの記事が要素になったフラットな配列ではなく、各ブログのfeedが要素になった結果が返ってくるので、自前で少し加工する必要がある。
11/21オープンアワー@片平堂告知
11/21にオープンアワーを片平堂オフィスで行います。
9時ぐらいから12時までです。
内容、参加方法等については、開始時間以外、片平堂で毎週火曜日に行っているオープンアワーと同様です。
宜しくお願いいたします :-)
104
11月20日オープンアワーresult
参加者3人(自分を含む)。
ひさびさの開催にもかかわらず参加者が。
改修工事もあまり騒がしくなかったので、明日もオープンしようかと。
お疲れ様でした。
WebViewに動的にJSを読み込みした後の評価(実行)タイミングではまった
11/20日追記:SafariとChromeでも試して見たところ、JSでbodyに複数appendChildすると順番は一定しない事を確認。そうだったのか。
http://blog.setunai.net/20120317/javascript%E3%81%AE%E5%AE%9F%E8%A1%8C%E9%A0%86%E5%BA%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
備忘録。
WebViewは、JSファイルを並列に読み込む。
で、動的に4つくらいJSファイルをbodyの末尾に読み込んでいるが、コードが追加順番に依存しているので、追加した順番に評価してほしいがどうも一定しない。
LABjsやRequireJS等を使うのが良いのだろうが、手っ取り早く、Railsライクに全部のJavaScriptファイルを順番に結合したファイルを作成、読み込むことで解決した。
ただこれをやると開発時に面倒くさくなるので、各JSファイルをちょっと手直しして結合する書き捨てスクリプトをRubyで書いた。
こういった処理は、GoogleのClosure Compilerや、RailsのAsset Pipelineなどを利用するのが標準的か。
しかし今回の場合は、Objective-C側から呼び出している為JS側では呼び出されていないメソッドや、Objective-C側から動的に挿入されているはずのネームスペースのメソッドをJS側から呼ぶといった、変則的なコードが散らばっていたりするという事情があるので、自前の結合スクリプトを用意した。圧縮も勝手にされるとちと困るので。