techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

既存 Rails アプリに REST API を追加する

既存 Rails アプリに REST API を追加する

前回に引き続き、Rails Tutorial で作成したアプリに REST API を追加していく。

  • Doorkeeper で OAuth 認証
  • Grape で REST API 実装

とする。
OAuth 認証は前回終わったので、Grape を使った REST API 実装から。

続きを読む

Head First Rails

Head First Rails

Head First Rails ―頭とからだで覚えるRailsの基本

Head First Rails ―頭とからだで覚えるRailsの基本

取り扱われているのが Rails 2 と古くて敬遠していた本書籍。
Rails Tutorial を一通り終えた後であれば、バージョンの違いによる問題はそれなりに埋められる気がしたので通してみようかと。

Motivation

Rails Tutorial 一回通しただけだと「Rails がよろしくやってくれる箇所」がうまく咀嚼しきれなかった(これは自身の無能さ故。チュートリアル自体はよくできていると思う)ので「もう一回通そうかな」とも思ったが、この本をパラパラめくってみると根底に流れる思想っぽいものはバージョンを経ても通ずるものがありそうなのでやってみるかな、と。

ストーリー仕立てで読んでいて面白く、「手伝ってー」と泣きついてきた友人の手助けをしていたらその友人の上司が訪ねてきて「終わらんかったらわかっとるやろうな」とプレッシャーをかけてくるなんて一幕もあったり、飽きずに読めそうというのも理由の一つ。

進め方

とりあえず Rails 2 じゃあ今からやってもなー感強いので実際のコーディングは Rails 5.1 で進めてみる。

Rails Tutorial で初めて触った Cloud 9 を今回も使っていこうと思う。環境構築楽チン万歳。

読み替え自体はまだなんとかなりそう。
進めていくとつまるところも出てくるかなー。まぁその時に考えよう。

コードは GitHub に挙げていく。

kfurue_hfrails-tickets_ Learning Head First Rails with RoR 5.1.2

ここはまだ Scaffold 使うだけなのでバージョン違いとか特に気にならない(rakerails のコマンド読み替えとかその程度な印象)。

kfurue_hfrails-ads Learning Head First Rails with RoR 5.1.2. Chapter 2 Mebay_.

第2章。テスト用データを配布してくれているが、使おうとすると盛大にエラー吐いたので、seeds を使ったテストデータ作成で代用。
この辺りは Rails Tutorial で一回やったのが効いてる感じ。

その他

トークの募集を開始しました - iOSDC Japan スタッフブログ

始まったそうな。
今年は何か発表とかもやってみたいような。とりあえずなんか出してみようかな。

Rails Tutorial 5 Following users

Rails Tutorial 5 Following users

最終章。
他のユーザーをフォローする機能を追加する。

The Relationship model

まずはデータモデルの構成から。

  • Relationship モデルの作成
    • マイグレーションの生成
    • 複合キーインデックスの追加
$ rails generate model Relationship follower_id:integer followed_id:integer
Running via Spring preloader in process 3273
      invoke  active_record
      create    db/migrate/20170705223145_create_relationships.rb
      create    app/models/relationship.rb
      invoke    test_unit
      create      test/models/relationship_test.rb
      create      test/fixtures/relationships.yml
$ rails db:migrate
== 20170705223145 CreateRelationships: migrating ==============================
-- create_table(:relationships)
   -> 0.0056s
-- add_index(:relationships, :follower_id)
   -> 0.0007s
-- add_index(:relationships, :followed_id)
   -> 0.0006s
-- add_index(:relationships, [:follower_id, :followed_id], {:unique=>true})
   -> 0.0022s
== 20170705223145 CreateRelationships: migrated (0.0094s) =====================

次に関連付けを行う。

これまでは has_many の引数で与えたシンボルからモデル名を見つけてくれていたが、今回はクラス名を明示的に指定する。
同様に、これまでは [クラス名]_id で外部キーの名前を見つけてくれていただ、外部キーの名前も明示的に指定する。

とのこと。(裏でそんなに色々やってくれてたんか、というのが全く理解できてなかったことがここで露呈

続いて Relationship のバリデーションを追加する。

テストを作成してからバリデーションを作成し、テストが通ることを確認するが、

Exercises

にもある通り、Rails 5 からはバリデーションの追加が必須ではなくなったそうな。

optionalが出てきた から、これを使わない限りは存在性は保証されている、か。

following と followers の実装に進む。

  • has_many, through を使う
  • source を使ってどの id の集合であるかを明示的に指定
  • follow, unfollow メソッドの実装
    • テストの実装
    • メソッドの実装
    • テストが通ることの確認

これで任意のユーザーがフォローしているユーザーの追加、削除などができるようになる。

次に任意のユーザーをフォローしているユーザーを操作できるよう実装していく。 と言っても先の内容とほぼ同等。

A web interface for following users

GUI を実装して先ほどのメソッドを実際に動かしてみる。

  • seed を使ったサンプルデータの作成
  • フォローしているユーザー数、フォロワーのユーザー数を表示するパーシャルの作成
    • ルーティングの実装
      • member ルーティングオプションの使用
    • フォロー数、フォロワー数は count を使うと Rails が高速化の為に DB 内で合計した数値を返してくれる
    • Ajax から使えるように一部要素には CSS id を振っておく
    • SCSS の追加
  • Follow, Unfollow ボタンようパーシャルの作成
  • これらのパーシャルの表示をプロフィールページに追加

と進める。
ここまでで、フォローボタンの動作と、プロフィールページにフォローしているユーザーの数とフォロワー数が表示できるようになる。

次にフォローしているユーザーの一覧、フォロワーの一覧を表示するページを作成する。

  • ログイン済みユーザーにしか閲覧できないようにする
    • テストを先に実装
    • Users コントローラに following, followers アクションを追加
      • render を使って出力するビューを明示
    • following, followers 表示用の共通のビューを作成
  • 統合テストの作成
    • HTML の構造を網羅的に確認するテストは壊れやすいので簡易な確認にしておく
    • 空にしておいた Relationship の fixture を埋めてユーザー間のフォロー関係を作成する
    • 数が正しいか と URL が正しいかの2点を確認する
  • テストが全て通ることを確認する

Follow ボタンの基本的な動作を実装する。

  • Relationships コントローラの作成
  • アクセスコントロール
    • テストの実装
      • Follow ボタンはログイン済みユーザーにのみ使えるように
      • ログイン済みユーザーでない場合はログインページにリダイレクトされていることを確認
    • before フィルターの実装
  • create, destroy アクションの実装
    • フォーム送信されたパラメータから対象ユーザーを探す
    • follow, unfollow メソッドを実行する
    • 同じページを再読み込みする

これで動作するようになるが、最後の再読み込みが無駄なので無くしたい。ということで次の Ajax 編に突入する。

  • フォームを書き換える
    • remote: true を form_for に指定する
  • Relationships コントローラを書き換える
    • リクエストの種類に応じて応答を場合分けする
      • respond_to を使用する
  • RJS ファイルの作成
    • アクション名と同じファイル名で作成
    • フォームを follow用、unfollow用で書き換える
    • 表示する統計数を更新する
  • テストを作成する
    • Ajax のテストでは xhr :true を使用する
    • フォローしているユーザー数、フォロワー数が1ずつ増減することを確認する

The status feed

自分のマイクロポストと、自分がフォローしているユーザーのマイクロポストをフィードに表示する。

  • 振る舞いはわかりやすいので User モデルのテストから実装
    • フォローしているユーザーのマイクロポストがあることの確認
    • 自分自身のマイクロポストがあることの確認
    • フォローしていないユーザのマイクロポストが無いことの確認
  • とりあえずの実装
    • フォローしているすべてのユーザーを DB から取り出す
    • 上記を使ってフォローしているユーザーの配列を DB から取り出す

動くようにはなるが、ユーザー数が増えてくるとレスポンスが低下する問題があるのでサブセレクトを用いて作り変える。

DB から Ruby コード内に持ってくる回数を極力減らし、DB 内での操作のみに閉じることで高速化することができる、という理屈だが、この辺りは実際に何か作る際その時々に合わせて作りを考える必要がある。

Of course, even the subselect won’t scale forever. For bigger sites, you would probably need to generate the feed asynchronously using a background job, but such scaling subtleties are beyond the scope of this tutorial.

というわけで、非同期処理を使用するなどいろいろ頑張らないといけないケースも出てきたらがんばる。

その他

というわけで Rails Tutorial 終了。ありがとうございました。

ここからいろいろ作ってみよう& Rails 5.1 のキャッチアップをしようかな。

一晩でAndroidアプリ公開

TL;DR

  • Android Studio など必要なファイルのダウンロードは済ませておく(ここは"一晩"の中に含まない)
  • 作るアプリはシンプルに
  • デザインは頑張れないので絵文字を多用
  • アイコンは Android Asset Studio - Launcher icon generator を使わせてもらったらすごく便利だったありがとうございます
  • 無料の写真 - Pixabay も使わせてもらいましたありがとうございます
続きを読む

Google Maps APIを使ってみる

Google Maps API

マップを Android アプリに追加しましょう。ベースマップ、3D の建物、屋内のフロア図、ストリート ビューや衛星画像、カスタムのマーカーなどを統合できます。

  • Google Maps API
  • 準備
    • APIを有効にする
    • AndroidManifest.xmlの設定
    • Mapを表示する
    • Mapにマーカーを置く
    • 地図表示倍率と初期表示座標をセットする
  • マーカーのクリックイベントを取得する
    • 参考URL

準備

APIを有効にする

https://console.developers.google.com/apis/library?hl=JA
f:id:forestsoftjpdev:20170528142708p:plain:w300

有効にするをクリックする f:id:forestsoftjpdev:20170528142730p:plain

続きを読む