第81回 Ruby関西 勉強会に参加しました。

以下、メモです。

Fiber の使いどころ

  • RubyKaigi 2018 で AirBnB で宿をとっていて枠がちょっと余っているという宣伝
  • RubyKaigi 2017 での発表資料
  • Process - Thread - Fiber
  • 昔の Perl のスレッドはバッドノウハウが必要だったのが Ruby を選んだ理由のひとつ
  • m_seki さんは「Fiber より Thread を使うべき」と言っていたのに疑問を感じた
  • 他言語も含めて Generator などの導入が進んでいる
  • 昔の発表資料からフィボナッチ数列の実装例色々
    • Enumerator.new を使うと Enumerator::Yielder#<< が Fiber を隠蔽してくれる
    • each_conslazy などの Enumerable の便利メソッドが使える
  • Agent での Fiber の利用例
    • ゲームのキャラクターごとに Fiber
    • 状態遷移を Fiber.yield で隠蔽できる
  • IO での Fiber の利用
    • m_seki さんの発表はこの例
    • ネットワーク IO に Fiber は向かない
      • この点は同意
  • GitHub での実事例の調査結果
    • 練習用の実装がほとんど
    • 使ってそうなプロジェクト調査
      • Concurrent Ruby は JRuby などで問題があるので使ってない
      • Fluentd などは使っていなかった
    • 使っているプロジェクト
      • em-synchrony
        • ネットワーク IO が主な用途
  • 思考実験
    • あえて Fiber ネットワーク IO で有効な状況を想像
    • HTTP サーバーで Fiber を利用
    • クライアントが非常に低速 (モバイル回線など)
    • とはいえ、普通は nginx と組み合わせるので問題ない
  • ほか事例
    • 2013 年の amagasakirb
    • Parslet で電卓を実装
    • LLVMTransformer, LLVMBuilder
    • パーサ側のブロック呼び出しのネストと builder 側のブロック呼び出しのネストを組み合わせた

ブログを Octopress から Jekyll+AMP に移行した話

ブログを Octopress 2 + GitHub Pages から Jekyll 3 + AMP + Netlify に移行した話というタイトルで発表しました。

スライドはいつも通り Rabbit Slide Show (RubyGems), SlideShare, Speaker Deck にあげています。(ソースは github にあげています。)

ブログを Octopress 2 + GitHub Pages から Jekyll 3 + AMP + Netlify に移行した話

Build Awesome Command-Line Applications in Ruby2 の紹介

  • Build Awesome Command-Line Applications in Ruby2 という本の紹介
  • 会場アンケート
    • 初めての人 → 割と多い
    • Ruby 使ってない人 → 少し
    • CLI を作ったことない人 → いない?
  • CLI の作成をはやくする話
  • GUI
    • 利点: 初めての人には良い
    • 欠点: キーボードショートカットとか自動化とか
  • Java 以降 CLI が古臭く感じられるようになってきた
  • Ruby / Rails の人は驚くべきことにコマンドラインをよく使っている
  • CLI は進化している
    • git のようなサブコマンド
  • thor (ソー)
    • rake と似た文法
  • GLI

Rails3.8 から 5.1 にバージョンアップした話

  • 自己紹介
  • 対象アプリ: model数:43, controller数:42, mysql, minitest
  • Gemfile は増えたり cancan が cancancan になるなどはあったがあまり苦労はしなかった
    • docx_templater がお気に入り
    • 一気にあげたが test group だけ先にあげた方がよかったかも
  • rails app:update or rails new
    • rails new を採用して全部上書き
  • 変更点あれこれ
  • bundle install で gem のバージョンが古くなった
    • バージョン確認が大事
  • turbolinks になった
  • application なんとかを上書きし直し
  • secret_token.rb が secret.yml になった
  • routes の prefix が変わった
    • 入れ子にしたときのが変わった
  • inflections.rb が上書き
  • before 系の callback で return false から throw :abort に変更
  • belongs_tooptional: true
  • has_many :through の前に through の引数のを has_many する必要あり
  • .without という scope が active support の同名メソッドと衝突した
  • .minutes が Float から Integer になった?
  • .order に Symbol を渡した時の SQL が変わった
  • attr_accessible から strong paremeter
  • なくなったメソッドとか
  • minitest のフォルダ構成が変わった
  • テストの順番がランダムになった
  • assigns がなくなったので rails-controller-testing gem を追加
  • おまけ
    • bootstrap 2 系から 4 系にした方が倍ぐらい時間がかかった
  • まとめ
    • テスト大事
    • まめにバージョンアップ
  • did_you_mean ありがとう!
  • メインが1か月、デザインで2か月
  • 質疑応答
    • 最初の方はメモとれず
    • テストで params: の変更は大変?
      • ある程度スクリプトを書いたが手で変換した
      • synvert とか rubocop で自動変換できそう
    • E2E のテスト
      • 一人プロジェクトなので全ページみた
      • 質問者の方も E2E のテストの自動化はコストがかかるので、人手でやっている

Rails で SNS を立ち上げるには

  • 前半
  • 一度作ったものをスクラッチから作り直した
  • モピルン
  • 友達リクエストなし
  • 直接あったことがないと繋がれない
  • アイデンティティが大事
    • 組織の名刺だと
    • 自分ブランドの構築
      • 自分名刺
  • なりすましをなくす
    • QR コードなど
  • システムで感動を与える
  • システム構成
    • 複数台構成が動くのを確認して最小構成で動かしている
    • Azure だと停止しているとほぼ課金されない
  • 後半
  • 実装の話
  • Rails の構成
    • Rails 5.0.2
    • Ruby 2.3.3
    • Puma 3.8.2
    • Nginx 1.12.2
      • puma の unix socket へ proxy
  • gem
    • devise, omniauth
    • ネイティブアプリの認証で omniauth が使えなくなったので fb_graph2, google-id-token, amazon-ecs
    • azure-push
    • gretel
    • fog-azure-rm
    • remotipart を fork して使っている
  • こんなことがありました
    • 謎のサーバーエラー
      • データベースのコネクションの問題で rails がタイムアウトしていた
    • 絵文字が入力されるとエラー
    • メールの URL がローカルホスト
  • タイムアウト問題
    • データベース用のロードバランサー (MaxScale の手前) を経由するとコネクションがリークしていた
    • rails とロードバランサー間が切れていた
    • database.yml に wait_timeout: 1500 (秒) を設定する (デフォルトは無制限)
      • timeout: 5000 (ミリ秒) とは別物
    • ロードバランサーのタイムアウト値を上記より大きくする (Azure では無制限にはできない)
  • 絵文字問題
    • U+1F4A6 などでエラー
    • データベースの文字コードを utf8mb4 にする
      • alter で変更した
    • database.yml に encoding: utf8mb4 を設定する
    • 注意: インデックスとして使うフィールドは utf8mb4 にしない方がいい
      • インデックスのサイズが大きくなって問題がおきる
  • メール本文の URL 問題
    • https://127.0.0.1/… のようになってしまう
    • 前提: ActionMailer::Base.default_url_options = { host: request.host, protocol: request.ssl? ? 'https' : 'http', port: request.port *
    • Azure が生存のリクエストを送り続けていて、そのリクエストで上書きされていた
  • 質疑応答
    • http://api.rubyonrails.org/v5.1/classes/ActionMailer/Base.html の Generating URLs のように個別に host: を使うのが正当な解決法っぽい
    • なぜ MariaDB?
      • PostgreSQL は選びたくなかった
      • クラスターが組みやすかった
      • Azure の MySQL のプレビュー段階のものだと台数を減らせるので GA になったら切り替えたい
    • スレーブが落ちた時の切り替えで問題はおきない?
      • ロードバランサー, MaxScale が優秀なので乱暴に MariaDB を落としたりしても、多少遅くなる程度で、問題が起きたことはない
  • 紹介
    • ログイン後の画面も含めて紹介
    • イベントとかで他の参加者のうち、繋がってない人は名前が見えない
    • ものとも繋がれる
  • ポーケン
    • ポーケンより前からあった
    • ポーケンはポーケンがないとダメだった
    • 当時は個人プロジェクトだったので、大きく展開はできず
  • イベントコード
    • 有効期限がある
    • GPS 連動して制限する機能は予定している
  • 法人ベースもある
    • Your home の他に Office home
    • 法人に連絡先や Meet ログがたまる
  • マネタイズは法人版を売っていく
    • アポイントメントシステムとして機能をしぼっていきたい
  • QR コードも有効期限をつけている

Ruby初級者向けレッスン 65 回 ーブロックー

いつも通りの感じでした。

クロージング

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published