- IT Tips
- Ruby / Rails以外の開発一般
READ MORE
こんにちは、hachi8833です。最近RubyWeeklyより先にウォッチで紹介している記事がちょくちょくあることに気づきました。
6月最後のRailsウォッチ、いってみましょう。
5.1.2の修正は、これまでにもRailsウォッチで取り上げてきたものが多いので何だか親しみが持てます。ActionMailer、ActiveJob、ActionCable以外で修正が行われています。
4.2.9は重大なセキュリティ関連の修正のみとなっています。Changelogに追記されているのはActiveSupport、ActiveRecord、ActionPackのみです。
INSERT
を使用# https://github.com/rails/rails/pull/29504/files#diff-694eb08d69d73b367d06242dd0aba454R354
+ table = Arel::Table.new(table_name)
+ manager = Arel::InsertManager.new
+ manager.into(table)
+ columns.each_key { |column| manager.columns << table[column] }
+ manager.values = manager.create_values_list(values)
+ execute manager.to_sql, "Fixtures Insert"
つっつきボイス:
「このArel::InsertManager
を使ってbulk insertできるのか」「こんなのあったとは」
「自分だったらこういう場合activerecord-import使うかなー、バリデーションもできるし: ただRailsのcoreにこれを入れたくないのはわかる」
そこからデータベースへのバルクインポートの話題になりました。
つっつきボイス:
「速度出したいときは生SQL書くことになる」「SQL力を試されますね」
「1日1000万レコードぐらいのデータをTSV(タブ区切りテキスト)作ってCOPY FROM
でインポートしたり」
「やった中ではMySQLのLOAD DATA INFILE
が速かった」
#current_page?
ヘルパーがRailsエンジンのルートパスを正しく処理しないことがあったパスの末尾の/
の有無で比較に失敗することがあったのが修正されました。
# https://github.com/rails/rails/pull/29503/files#diff-26e33d6e883deb07332ac9c1922eadc0L555
- url_string.chomp!("/") if url_string.start_with?("/") && url_string != "/"
+ if url_string.start_with?("/") && url_string != "/"
+ url_string.chomp!("/")
+ request_uri.chomp!("/")
+ end
merge
でINNER JOIN
を維持するよう修正修正前のAuthor.joins(:posts).merge(Post.joins(:comments))
の結果
SELECT ... INNER JOIN posts ON... INNER JOIN comments ON....
SELECT ... INNER JOIN posts ON... LEFT OUTER JOIN comments ON...
morimorihogeさんが「これ挙動が変わる可能性あるからArel使いは注意した方がいいかも」と指摘しました。
# https://github.com/rails/rails/pull/27063/files#diff-06059df8d3dee3101718fb2c01151ad0L107
- def join_constraints(outer_joins, join_type)
+ def join_constraints(joins_to_add, join_type)
joins = join_root.children.flat_map { |child|
make_join_constraints(join_root, child, join_type)
}
- joins.concat outer_joins.flat_map { |oj|
+ joins.concat joins_to_add.flat_map { |oj|
if join_root.match? oj.join_root
walk join_root, oj.join_root
else
oj.join_root.children.flat_map { |child|
- make_outer_joins oj.join_root, child
+ make_join_constraints(oj.join_root, child, join_type)
}
end
}
pixeltrix先生も「ぼくmerge
使ったことないけどね: 自分ならクエリビルダーメソッド使う」「誰かにとってはバグでも別の人には機能だったりすることだってあるから注意したい」
元の挙動が仕様かどうか誰もわからなかったので、テストが頼りということのようです。
つっつきボイス: 「JOIN
かー」「JOIN
を使うメソッドをどこまで信用できるかという気持ちはある」「Arelで複雑なクエリ書きたくないですね」
いずれも卜部さんが立てた無言のissueです。
/000000000000000000000000000000000000000000000000000000000000000000000
begin raise ensure return end; self
/#{break}/o
つっつきボイス: つっつきボイス: 「#13687、これどういう構文だろ」「正規表現の端?」「割り算?」
$ ruby -ve '/000000000000000000000000000000000000000000000000000000000000000000000'
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
-e:1: unterminated regexp meets end of file
-e:1: warning: possibly useless use of a literal in void context
「正規表現か!」「でも落ちないな」「開発版での現象だって」「よく見たら2.5devって書いてあった」
無料で全ページ読めます。demystifyはmystifyの反対語で「神秘のベールを剥がす」のような感じです。
つっつきボイス: 「ほむほむ、No Magic Railsとか割りといいかも」「Railsの背後の挙動がわからなくて怖いとか、背後の挙動がわかるまで使いたくない!みたいな人とかにいいのかな: PHPやってた頃は自分もその傾向がちょっとあった気がする」「少なくともRailsガイドを見て書いたレベルではなさそうですね」
そこから、数年前BPSの勉強会で取り上げた「Crafting Rails 4 Applications」という書籍の話題になりました。
つっつきボイス: 「あの本はものすごい深掘りしているところはいいんだけど、網羅性が足りない点が残念」 「そういう意味ではDemystifying Railsは役に立つかも」
SQL、ORM、アプリケーションコード、ビジネスロジックの関係について論じています。
ブログ主のDimitri Fontaine氏はオープンソース、特にPostgreSQL界隈では著名なエンジニアで、PostgreSQLの機能と便利技トップ10のCraig Kerstiensも一目置いているようです。
つっつきボイス: 「SQLって本来ビジネスロジックやトランザクションなどをすべて記述できる能力があるから、ORMやアプリケーションコードとどう共存するかというのは一度は考える話だなー」「ストアドプロシージャは使いたくない」「特に名を秘すけど、ORMなど絶対認めん!みたいな過激な主張をたまに見かけますね」「それネットのどこにありますか?」「それはね…」
「速度」「読みやすさ」「検索性」の3つを挙げています。Rubyのstatic analysisについても言及しています。
以下のコードはcreate_post_tags
以外のドキュメントが生成されません。
# http://www.blackbytes.info/2017/06/costs-of-metaprogramming/ より
class RubyBlog
def create_post_tags
types = ['computer_science', 'tools', 'advanced_ruby']
types.each do |type|
define_singleton_method(type + "_tag") { puts "This post is about #{type}" }
end
end
end
rb = RubyBlog.new
rb.create_post_tags
rb.computer_science_tag
以下のようにしてyardドキュメントを生成する手もありますがいつも使えるとは限らず、結局grep
頼みになってしまったりします。
class Thing
# @method build_report
define_method(:build_report)
end
つっつきボイス: 「メタプロに速度を求めちゃいけないw」「検索性の低さは確かにある: IDEでインデックス化できないし」
こんな感じに変換してくれるパーサーを書いてみたそうです。
/
( # Capture group is so split will include matching and non-matching strings
(?: # The first character of the key, which is
(?!\s)[^:\s"'\[]{1} # ..any valid "key" char not preceeded by whitespace
|^[^:\s"'\[]{0,1} # ..or any valid "key" char at beginning of line
)
[^:\s"'\[]* # The rest of the "key" chars
: # a colon
(?: # The "value" chars, which are
'[^']+' # ..anything surrounded by single quotes
| "[^"]+" # ..or anything surrounded by double quotes
| \[\S+\sTO\s\S+\] # ..or anything like [x TO y]
| [^\s"'\[]+ # ..or any string not containing whitespace or special chars
)
)
/xi
つっつきボイス: 「Parser書きたくなる気持わかる: 神正規表現使われるとレビュー意欲そがれるw」「キャプチャグループとか名前付きグループみたいなのって最近知った」「コメントのない神正規表現はマジ勘弁」「正規表現書くのは好きだけど確かに人のは読みたくないw」
「何でしたっけ、(?=)
とか(?!)
みたいなのっていつも覚えられなくてこんなスニペット作りました↓」
"foobar".match(/foo(?=bar)/) # => #<MatchData "foo"> # 直後に bar がある foo
"fooxxx".match(/foo(?!bar)/) # => #<MatchData "foo"> # 直後に bar がない foo
"foobar".match(/(?<=foo)bar/) # => #<MatchData "bar"> # 直前に foo がある bar
"xxxbar".match(/(?<!foo)bar/) # => #<MatchData "bar"> # 直前に foo がない bar
「私もオレオレアプリの管理画面にlook aheadとlook behindのカンペ付けてます↓」
当初Build your first server-side rendered React app with Railsにしようかと思ったのですが、最近公開されたらしいVue.jsの公式SSRガイドを見つけたのでこっちにしちゃいました。
これ、すごくありがたいと思います。
<head>
の管理hydrationはVue.jsの用語のようです。化学用語だと「水和物」ですね。
今週の⭐を進呈いたします。おめでとうございます。
Making a Rails App Move Faster: A Tale of Lessons Learnedで紹介されていました。
手順が具体的なのですぐ使えそうです。
つっつきボイス: 「mail.deliver_later
だなやっぱり↓」
user = User.find(1)
mail = UsersMailer.welcome_email(user.id)
#mail.deliver_now
mail.deliver_later
今のところ★50個超えです。
つっつきボイス: 「なまじいろんな書き方ができると、コード全体でconfig parameterへのアクセス方法がバラバラになって後でつらくなりそう」「設定をいろんなところから読み込めると便利なのはわかるけど」
capybara-webkitとChromeDriverでヘッドレスにテストする解説記事です。
このサイトでは他にORMを使ってないRailsでFactoryGirlを使うコツなども面白そうです。Rails以外にiOSやAndroid記事もたくさんあるようです。
ActiveRecordでさまざまなカウンタキャッシュオプションが使えるようになるgemです。
# magnusvk/counter_culture より抜粋
counter_culture :category, touch: true
counter_culture :category, column_name: 'product_weight_ounces', delta_column: 'weight_ounces'
counter_culture :category, foreign_key_values:
proc {|category_id| [category_id, Category.find_by_id(category_id).try(:parent_category).try(:id)] }
つっつきボイス: 「お、これいいかも!」「Rails標準のcounter_cache
って機能が超シンプルなんで、ちょっと凝ったことしようとするとすぐ物足りなくなる」「使ってみよう」「READMEにコード例もちゃんと書いてあるのはうれしい」
タイトルだけ見て使いこなし系記事かと思いきや、毛色が少し違う感じです。走り書きっぽくてちょっと読みづらい…
p Integer("0123")
で8進数出力するとか勘弁。今どきパーミッションぐらいでしか使わないような8進数はp 0o123
使え。Hash#zip
がイマイチ。Enumerable#count_by
が欲しい。Pathname#glob
も使いにくい。system "wget", "-w", wait_time.to_s, uri.to_s
みたいにパラメータを#to_s
しないといけないの勘弁。irb(main):006:0> a = {x: 1, y: 2}
=> {:x=>1, :y=>2}
irb(main):007:0> b = {y: 3, z: 4}
=> {:y=>3, :z=>4}
irb(main):008:0> a.zip(b)
=> [[[:x, 1], [:y, 3]], [[:y, 2], [:z, 4]]]
irb(main):009:0> (a.keys|b.keys).map{|k| [k, [a[k], b[k]]]}.to_h
=> {:x=>[1, nil], :y=>[2, 3], :z=>[nil, 4]}
同じサイトの別記事「The Next Ruby」はもっと言いたい放題で「end
やめてPythonみたくインデント表記になあれ」「モジュールのネスト、滅せよ」という感じです。
私もこういうこと考えがちなのでいい年して頬を赤らめてしまいました。
つっつきボイス: 「p Integer("0123")
はちょっと気をつけたいかなと思ったけどRubyistなら#to_i
じゃね?」「Hash#compact
はActiveSupportにあった気がする」「Rubyにもあるな?」「system "wget", "-w", wait_time.to_s, uri.to_s
は確かに事故りそう」「ないはずなのにcount_by
ってありそうな気がしてくるのが不思議↓」
User.all.count_by(&:name) rescue $!
# => #<NoMethodError: undefined method `count_by' for #<User::ActiveRecord_Relation:0x007f99d63135e0>
そこからyaml/JSON話に広がりました。
つっつきボイス: 「yaml嫌い!」「RONはともかくとしても」「JSONのケツカンマとかコメントできないとか本当残念」「JSON5はもっと普及してもよさそうなものなのに」「JSONといえばPostgreSQL(キリッ」「MySQLもJSONがんばってるし」
Ruby on Rails Security Projectの最新のニュースレター #25が配信されたので、ざざっとリストアップします。
つっつきボイス: 「RoRのセキュリティ記事、新人の勉強会向け資料によさそう」「こういうのを1つ選んでスライドにして発表するとか」「発表ネタを探してる新人君はこのあたりからどうぞ」
CurrentAttributes
は有害日本語でも情報が出ています: JVNVU#98416507 Apache HTTP Web Server における複数の脆弱性に対するアップデート
つっつきボイス: 「thyはyourの古英語表現、シェークスピアぐらいの頃ですね」「汝の、みたいなニュアンス」「厨二病感出まくってそうw」「ファンタジー小説とかには欠かせない感じですね」
thouやthyは神様や皇帝の上から目線なセリフとかで使われる印象です。
つっつきボイス: 「お、これ後で読も!」
configuration.ymlでスタイルを設定できるようです。
Running Git Cop...
d0f9bf40a09d10618bcf8a38a5ddd3bcf12fd550 (Brooke Kuhlmann, 3 seconds ago): This is a bogus commit message that is also terribly long and will word wrap
Commit Subject Length: Invalid length. Use 72 characters or less.
Commit Subject Prefix: Invalid prefix. Use: "Fixed", "Added", "Updated", "Removed", "Refactored".
Commit Subject Suffix: Invalid suffix. Use: ".".
3 issues detected.
つっつきボイス: 「プロジェクトで使うにはちょっと固すぎるかも」「オープンソースの方が向いているかも?」「Changelogを自動生成できるのがうらやましい」「そのためには相当気をつけてメッセージ書かないとなー」
そこからcommitメッセージの話題になりました。
つっつきボイス: 「いつのことだったか、commitメッセージにことごとく「◯◯修正」しか書いてないのを見たことあります」「commitメッセージにcommitした時間をがんばって手書きで入力しているのとかも」「…」「…」
Vue.jsベースでテーブルを作れます。★4,000超えの快挙です。
Bootstrapと併用したサンプルもWikiに掲載されています。
つっつきボイス: 「これもいい!」「管理画面でこれを使うくらいの所からVue.jsをはじめてみたい」
「Vue.jsとBootstrapといえばVueStrapもすごくいいですよ↓」
Vue.jsで書かれたBootstrapコンポーネントで、jQueryやBootstrap.jsを一掃できるそうです。
Railsに取り込まれそうな予感がちょっとしてきました。
PyCon 2016で発表されたようです。詳しくはスライド(PDF)や動画↓をどうぞ。
# 送信側
% wormhole send README.md
Sending 7924 byte file named 'README.md'
On the other computer, please run: wormhole receive
Wormhole code is: 7-crossover-clockwork
Sending (<-10.0.1.43:58988)..
100%|=========================| 7.92K/7.92K [00:00<00:00, 6.02MB/s]
File sent.. waiting for confirmation
Confirmation received. Transfer complete.
# 受信側
% wormhole receive
Enter receive wormhole code: 7-crossover-clockwork
Receiving file (7924 bytes) into: README.md
ok? (y/n): y
Receiving (->tcp:10.0.1.43:58986)..
100%|===========================| 7.92K/7.92K [00:00<00:00, 120KB/s]
Received file written to README.md
つっつきボイス: 「ざざっと見た感じ、相手のIPとかわからなくてもこの7-crossover-clockwork
みたいなコードを送るだけでファイル送受信できるってことか」「リンクを知っている人だけ見られるGoogleドキュメントのURL、みたいな感覚?」「さすがに受信側でもMagic Wormholeは起動しないといけないか」
CLIでささっとファイル交換したい人向けのようです。
最初何のソフトウェアだろうと思ってリポジトリを追ってしまいましたが、これは一種のキャンペーンで、リポジトリは単なる公式サイトのアプリみたいです。
「オープンソースソフトウェアはみんなでつくるものです」「金曜日には、普段愛用しているオープンソフトウェアに数時間でも貢献しましょう」
↑これがPeatio(貔貅)だそうです。日本語読みは「ひきゅう」。やはりというか中国発です。
つっつきボイス: 「インデックス化のヒントくれるならいいけど、自動作成まではちょっとな~」「そこまで全自動ではないみたいですヨ」「SQLログから解析するのか」「PerconaのPostgreSQL版みたいな感じなのかな」
記事をまとめているときに気づきましたが、DexterではHypoPGというhypothetical indexをPostgreSQLにインストールするよう指示しています。このhypothetical indexという用語はまだ日本語になっていないようですが、Microsoft SQL Serverには搭載されているようです。
ついでに、Hypothetical Index Strategy Calculatorというサイトも見つけました。
★54,000台という凄まじさです。スタイルの多くに理由が書かれているのがいいですね。こういうの大事だと思います。
例:
3.2 参照を再代入する場合はlet
を使うこと(var
やeslintのno-var
やjscsのdisallowVar
は使わない)
理由: let
がブロックスコープだから(var
のような関数スコープではない)
つっつきボイス: 「この★の数からいって、これがJavaScript界のスタンダードなのかな」
Quick, Drawより(Quick, DrawはGoogleのサービスです)
昨年11月のRailsウォッチでご紹介したQuick, Draw!の/data
ディレクトリを開くと、これまでに登録されたおびただしい手書き画像データがずらりと並んでいます。50 millionだそうです。
Quick, Drawより(Quick, DrawはGoogleのサービスです)
書き順までしっかりデータ化されています。
今週は以上です。
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほかソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。