- Ruby / Rails関連
READ MORE
こんにちは、hachi8833です。この季節は水筒を持ち歩かないと命が危ない気がしています。
7月第3週のRailsウォッチ、いってみましょう。
先々週のRailsウォッチで速報でお伝えしたActiveStorageが公式に発表され、5.2から導入されることが決定しました。
Active Storage is coming to Rails 5.2: A brand-new framework for managing cloud and local files in Rails. Overdue! https://t.co/BFF4kWesT6
— DHH (@dhh) 2017年7月6日
つっつきボイス: 「ワイ先々週のつっつき会おさぼりでしたが、ActiveStorageって何でしたっけ」「Amazon S3やCarrierWaveなんかのストレージを抽象化する感じですね」「おおなるほど: ストレージの移行にも使える感じ」「うれしい人いっぱいいると思います」
「先々週見たときはActiveStorageにはAPIドキュメントがこれっぽっちもありませんでしたがw」「大変そうだなー」
「ローカルファイルも扱えるのか」「CarrierWaveがローカルファイル扱えるから当然」
今見るとドキュメントが着々と追加されているようです。
マイナーアップデートなのでバグ・セキュリティ関連と思われます。
#29742と#29699は期せずして先週のウォッチで公式より先回りしていましたので省略します。
rails secrets:show
コマンドを追加# railties/lib/rails/commands/secrets/secrets_command.rb
+ def show
+ say Rails::Secrets.read
+ end
実行にはkeyファイルが必要です。y-yagiさんのプルリクです。
レビューで「edit
で更新なかったときにはファイル更新しない方がよいのでは」との指摘があり、#29705で即修正されました。
# railties/lib/rails/secrets.rb
- write(File.read(tmp_path))
+ updated_contents = File.read(tmp_path)
+
+ write(updated_contents) if updated_contents != contents
つっつきボイス: 「rails secrets
って使ったことなかったナー」「マスターキー以外の秘密情報をリポジトリで管理できるようにするやつですね: アプリの秘密情報が増えてきたらこういうの欲しくなる感じ」「お、secrets:edit
もある:エライエライ」
#freeze_time
タイムヘルパーメソッドを追加# activesupport/lib/active_support/testing/time_helpers.rb
+ def freeze_time(&block)
+ travel_to Time.now, &block
+ end
つっつきボイス: 「タイトルにもあるけどtravel_to Time.now
のエイリアスだそうです」「どこで使うのかなっと: ActiveSupportのtime_helpersだからテスト用か」「テストコードのテストコードがあるとややこしい」
UUIDで{}
の一方が欠けている場合に対応しました。
# activerecord/lib/active_record/connection_adapters/postgresql/oid/uuid.rb
- ACCEPTABLE_UUID = %r{\A\{?([a-fA-F0-9]{4}-?){8}\}?\z}x
+ ACCEPTABLE_UUID = %r{\A(\{)?([a-fA-F0-9]{4}-?){8}(?(1)\}|)\z}
# activerecord/test/cases/adapters/postgresql/uuid_test.rb
+ "{a0eebc99-bb6d6bb9-bd380a11}",
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11",
+ "a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}"].each do |invalid_uuid|
つっつきボイス: 「UUID壊れてたらどっちみちPostgreSQL側でエラーになると思うけどねw」「orphanってちょくちょく見かける技術用語」
fork
してRandom::DEFAULT.rand
を呼ぶとSegfaultputs "before fork: #{Random::DEFAULT.rand(42)}"
fork do
puts "child: #{Random::DEFAULT.rand(42)}"
end
つっつきボイス: 「Segfault後にPryが落ちずに復帰したのがちょっとびっくりでした」「Pryならやるかも」
「fork
はKernel関数なのか」
関係ありませんが、カタカナで「セグフォ」と書くことに何となく抵抗を感じてしまう私でした。口頭なら気になりませんが。
Kernel#fork
defined?
で**
を使うと落ちるdefined?(a **{}) # 落ちる
hash_table_index()
でヌルポ0/defined?0--begin
e=m
return
0end
なにこれ怖い。
つっつきボイス: 「ぬわー、#13755は何だこりゃ」「冒頭の0/
は割り算?」
「それにしてもissueがおしなべて無言ですね」「コードに語らせるというやつですな」
無効なパターンでオーバーフローが発生する脆弱性だったとのことです。
k-takataさんが粛々と修正してくれました。ありがとうございます。
# testpy.py
+ n("[\\6000", "a", err=onigmo.ONIGERR_TOO_BIG_NUMBER) # CVE-2017-9226
+ n("[\\H- ]", "", err=onigmo.ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS) # CVE-2017-9228
今さらですが、OnigmoはRuby 2.0以降で採用されている多機能な正規表現エンジンで、Ruby以外の環境でも採用されています。私が最も頻繁に使っている正規表現エンジンです。
漢字では「鬼雲」と書くそうです。「鬼蜘蛛」じゃなかったのか。
つっつきボイス: 「[\\6000
は閉じ]
が落ちてるやつで、[\\H- ]
は範囲の-
の終端がスペースになってて無効なのか」「正規表現書いているとこういう間違いって簡単に発生しそう」
なおこのブログではベストなんとか記事が他にも並んでいました。
古くからある書籍も改訂されているようです。日本語になってるのとなってないのが半々ぐらいです。
つっつきボイス: 「(右クリ辞書をひきながら)Well-Groundedって『基礎のしっかりした』か」「1冊目は『Developer Course』ってなってる」「講習会受けるともらえる本みたいなやつかな」「最近のRailsチュートリアルはちょっとボリューム多すぎな気がする」「張り切って書きすぎたのかしら」
「ちゃんとした出版社から出ている本はきちんと書かれている点がやっぱりよい」「メジャーな出版社なら校正や編集もみっちりやってるはずですからね」「今は誰でもPDFでさっと本を作れてしまうけど、そういう英語の野良本をいくつか買ってみるとページ数の割に内容が薄かったり細かい間違いが多かったり」
「この夏休みにこの中から一冊ぐらいは選んで読んでみるといいと思われ」「お盆休み潰せばできるできるw」
今さらですが、技術書の英語はたいていの場合新聞や小説よりもずっと楽に読めます。ものにもよりますが、用語がしっかり定められていることが多く、代名詞の利用が控えめなので何を指すかで迷いにくく、小洒落た言い回しや邪魔っけなアメリカンジョークもそれほど多くなかったりするので。
morimorihogeさんがSlackに投下してくれた記事です。JetBrainsカラーで統一されたグラフィックがきれいで楽しく読めます。
つっつきボイス: 「JetBrainsのアンケートベースだから、全Ruby開発者の状況とはまた違うと思われ」「others: 1%ってこれRuby 1.8以下ってことだよね: コワイコワイ」
「rvenvがRVMをちょっと上回っている」「Rails 3はだいぶ少なくなってきたか」
「生Rackでアプリ書く人ってけっこういる?」「RailsもHanamiもSinatraもみんなRackに乗ってますけどねw」
「Pumaずいぶん増えた: しかもproductionで」「Railsのデフォルトサーバーになったからでしょうね」「ちなみにBPSの標準はUnicorn」
その場でmorimorihogeさんがアンケート: お楽しみ編も見つけてくれました。
Rubyのゲーム好き(65%)はフルタイムC#開発者(73%)より少し少ないようです。
つっつきボイス: 「シューティングがないわい」「Actionに入ってそう」「自分、パズル系ゲームぐらいしかやってない…」「これだとOthersかな」
「全然寝てない人がいる!」「それはアカンやつや」
リポジトリ: collectiveidea/audited
結論はというと、「目的による」という無難なところに落とし込んでいます。
Auditedは「Active Record User Stamping」で主に特定ユーザー追いかけ用、Paper Trailは「Active Record Versioning Area」で主に関数やメソッドなどの領域ベースで時間軸に沿った変更を追うときに、と使い分ける感じです。
なお、paper trailという語は一般には「(証拠物件として文書化された)個人の行動履歴」を指します。
APIのバージョニングに関する記事です。タイトルにあるVue.jsはここでは直接関係なさそうです。
module Api
module V1
class AuthorsController < ApplicationController
# ...
end
end
end
module Api
module V2
class AuthorsController < ApplicationController
# 互換性のない変更を行う
end
end
end
つっつきボイス: 「APIをどうやってバージョンアップするかは悩む点」「URLを変える方法や、バージョン番号をヘッダとかで示す方法とか」「はっきり覚えてないけど、GoogleはURLを変える方針だった気がする」
つっつきボイス: 「今回の新機能の中ではRubocopのQuick-fix↑がいいな」
「パンくずリストってどこどこ?」「一番下にあるこれ↓」
★こそ少ないのですが、これはAttachmentScannerというサービスの公式のgemであるとのことです。
つっつきボイス: 「CarrierWaveとは別にこういうサービスを立ち上げたのか: 目のつけどころがいいなー」「どんなウィルススキャンソフトでチェックするんだろう?」
★の数はどちらも400個台、spreadsheet_architect gemの方が新し目です。
つっつきボイス: 「axlsx_railsはだいぶ前からあって何度か使ったことあるけど、思ったよりずっとよくできていた: けっこう優秀」「spreadsheet_architectはかなり新しいですね」
blog.planetargon.comより
コードレビューサービスを行っているPlanet Argon社のブログ記事です。
つっつきボイス: 「うん、おおむね同意」「Gemfile.lockないとかヤバイ」「他社からの引き継ぎ案件をざっとチェックしていて、seedデータも用意されてなかったりすると、ああここはアカンなと思ったりしますね」
参考: ちょっと待った! Railsでgitリポジトリから除外すべきでないファイル:Gemfile.lockとdb/schema.rb
なおこちらのニュースはRandom Rubyからのものでした。クローラー任せではなく、人間がピックアップしているそうです。今後巡回先に加えようと思います。
Turbolinksの挙動を深掘りしています。手書きの図がいい味出してます。
# DOMへの副作用を抑えるスニペット例: sevos.ioより
document.addEventListener('turbolinks:load', this.setup(), {once: true})
document.addEventListener('turbolinks:render', this.setup())
document.addEventListener('turbolinks:before-render', this.teardown())
つっつきボイス: 「TurbolinksはRails 5.0になってから随分改善されたと思う」「JavaScriptやjQueryコードを足し始めるとこういうところを追うことになったりしますけど」「ワイは今の案件でいつTurbolinks切ろうか考え中」
# www.nopio.comより
class OrderDecorator < Draper::Decorator
...
def ordered_items_amount
object.items.map(&:amount_ordered).sum
end
def discount_percent
"#{(object.discount * 100).round(2)} %"
end
end
つっつきボイス: 「普通にdecoratorとpresenterの話かな」「それほど新しくはないけどまとまりよさそう」
参考: 肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)
link: We need a better language – Miguel Rochefort – Medium: https://t.co/ymiFVdcgMj
— Yukihiro Matsumoto (@yukihiro_matz) 2017年7月17日
「欲しいのはアプリじゃない、さらに洗練された言語だ」
つっつきボイス: 「でたーバベルの塔w」
PassengerでおなじみのPhusion社のブログです。みっちり書かれた良記事です。
つっつきボイス: 「ベンチマークやるならこのあたりの常識は押さえとくべき: 専用ハードウェアでベンチ取るとか」「AWS EC2やHetznerなんかの専用ハードウェアサービスのメリット・デメリットを記事でも比較している」「クラウドでのベンチマークはクラウドのパフォーマンスが変動するから基本あてにならない」
「”time budget” ってここではどういう意味なんだろう?」「”Having too few iterations means that the benchmark may produce unreliable results”: つまり1回や2回のベンチマークでは信頼できる結果を取れないので、繰り返し回数を十分確保するという感じ」
「”CPU affinity”は?」「”ensure that a process/thread “sticks” to a certain CPU core”、つまりプロセスやスレッドがCPUコア間をなるべく移動しないようにすることですね」
参考: Wikipedia-ja: プロセッサ親和性
Jean Mertz氏の同名記事「uniqueness validations in ActiveModel」のコードについて、Rails 5.1.2では挙動が少し変わっているとして別解を示しています。
def initialize(options)
super
@klass = options[:model] if options[:model]
end
「C/C++に死を」という記事から2ホップほどたどって見つけました。
strace
してみたGoよりもシステムコールの話が中心です。
つっつきボイス: 「strace
ってシステムコールをトレースできるのかー!いいのかそんなことしてw」「できないと困るww: strace
はパフォーマンスチューニングのときに一番よく使う」
静的言語であるGoでなぜにPryライクなREPLを実装…しかも「メタプログラミングとリフレクションをたっぷり含んでおります」とか、わけわかりません。さすがにまだ不安定な様子。
作者のd4l3k氏はカナダ在住のようですが、他にもWebSyncでGoogleドライブ+GoogleドキュメントをRubyとReactで再現してしまうとか、プロフィール写真の目つきも含めて何というか一種の狂気のようなものを感じてしまいました。
つっつきボイス: 「技術的には可能ですけどね」「Gopherくんの目の周りの病的な隈がw」「シャブ食ってるみたい…」
<pre id=p><script>n=setInterval("for(n+=7,i=k,P='p.\\n';i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&1:2])j=k/i;p.innerHTML=P",k=64)</script>
上を実行すると以下になるそうです。
つっつきボイス: 「こういうパズルみたいなの、ハック系のコンテンストなんかでよく出てくるw」「C++系のコンテンストなんかで、1行のコードで一番長いエラーメッセージを吐かせた人の勝ち、みたいなのもありますw」「そういうのもコードゴルフの一種なんでしょうかwドライバーの飛距離を競うみたいな」
つっつき会の後で知りました。エモそうなタイトルとはうらはらに、機械学習に過度な期待をせず、UIデザインに機械学習を応用するときの考え方や手法を具体的に解説している良記事です。
C#向けツールですが、BPS CTOのbabaさんがSlackで「このツール凄い!」と喜びの声を上げていたのでググってみました。ネット上でも喜びの声が続々見つかります。
つっつきボイス: 「おおー、これ確かに凄いww: .NETのバイナリを動的に書き換えたりいろいろやんちゃできるのか」「.NETのバイナリはソースの情報をだいぶ含んでいるからデコンパイルとか割りとやりやすいんだろうな」「難読化ぇ」
参考: 凄すぎて大草原不可避な.NET デコンパイラdnSpyを使ってみる
今どきありえなさそうなロボロボしいデザインは、信者を不安にさせないための気遣いなんですよねきっと。
参考: Wikipedia-ja: ロボット三等兵
今週は以上です。
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほかソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。