こんにちは、hachi8833です。最近はTechRachoが私の外部記憶装置と化しています。
ゴールデンウィーク特集号というつもりでもなかったのですが、またしても駆け込みでガンガン増やしてしまいました。この後もう少し足すかもしれません(懲りてない)。
ゴールデンウィーク前のウォッチ、さわやか気分でいってみましょう。次回のウォッチは5/11(金)の予定です。GW中日の5/1と5/2には何かポエム系記事書くかもしれません。
今回のつっつきも、BPSの福岡拠点であるウイングドアの皆さまと画面共有しながら行いました。いつもありがとうございます。今回はなぜかZoomのご機嫌がよろしくなかったので、appear.inに切り替えてしのぎました。
つっつきボイス: 「損切が大事」
各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
⚓Rails: 今週の改修
公式情報はRailsConf 2018 Editionと銘打った特集を組んでいます。
#32612とか#32610とか#32582などは先週取り上げてしまったので、今週は少し趣を変えて、後述のRails 5.2リリースノートからこれまで取り上げていなかったものもピックアップしてみたいと思います。
⚓存在しないタイムゾーンを指定した場合のActiveSupport::Timezone.all
例外を修正
# activesupport/lib/active_support/values/time_zone.rb#L280
def zones_map
@zones_map ||= MAPPING.each_with_object({}) do |(name, _), zones|
- zones[name] = self[name]
+ timezone = self[name]
+ zones[name] = timezone if timezone
end
end
つっつきボイス: 「タイムゾーンかー」「たしか使っちゃだめなクラスありましたよね: DateTime
だったか」「以前もロシアかどっかでタイムゾーンの扱いが面倒とかいう話が出たような」「そうそう、以前のウォッチ↓でも扱いました: タイムゾーンのくせに飛び地になってたりとか」「同じ名前なのにタイムゾーンのオフセットが確定しないことがありそげ」
週刊Railsウォッチ(20171117)Rails開発3年分のコツ集大成、PostgreSQL 10.1でセキュリティ問題修正ほか
「タイムゾーンが存在しない場合というか、存在しないタイムゾーンを指定した場合のエラーのようですね」「存在しないタイムゾーンを叩くとか、タイムゾーンを引数にとって動的挿入したとかぐらいでRailsでエラーがraiseされたらそれはヤダなー」「raiseするぐらいならしれっとデフォルトのタイムゾーン使って続行するぐらいの方がましかも」
⚓デフォルトオプションがなければ空の[]
を渡すようにした
# actionview/lib/action_view/helpers/translation_helper.rb#L60
def translate(key, options = {})
options = options.dup
has_default = options.has_key?(:default)
- remaining_defaults = Array(options.delete(:default)).compact
+ if has_default
+ remaining_defaults = Array(options.delete(:default)).compact
+ else
+ remaining_defaults = []
+ end
元の英語がよれよれで、ソース見ないと意味わからなかった...(追伸: その後ちょい修正されたっぽいです)
つっつきボイス: 「これはソース見るほうが早いです」「テストコードないし...」「テストないと何を期待してるのかイマイチわからんなー」「まあそんな大きな影響があるとは思えない感じ」
⚓ロケールを指定したときの非可算名詞の複数形対応を修正
ここからはRails 5.2リリースノートより拾いました。
# activesupport/lib/active_support/inflector/methods.rb#L388
# Applies inflection rules for +singularize+ and +pluralize+.
#
- # apply_inflections('post', inflections.plurals) # => "posts"
- # apply_inflections('posts', inflections.singulars) # => "post"
- def apply_inflections(word, rules)
+ # If passed an optional +locale+ parameter, the uncountables will be
+ # found for that locale.
+ #
+ # apply_inflections('post', inflections.plurals, :en) # => "posts"
+ # apply_inflections('posts', inflections.singulars, :en) # => "post"
+ def apply_inflections(word, rules, locale = :en)
result = word.to_s.dup
- if word.empty? || inflections.uncountables.uncountable?(result)
+ if word.empty? || inflections(locale).uncountables.uncountable?(result)
result
else
rules.each { |(rule, replacement)| break if result.sub!(rule, replacement) }
# activesupport/test/inflector_test.rb#L437
+ assert_equal("agua", "agua".pluralize(:es))
+ assert_equal("aguas", "agua".pluralize)
+
ActiveSupport::Inflector.inflections(:es) { |inflect| inflect.clear }
assert ActiveSupport::Inflector.inflections(:es).plurals.empty?
assert ActiveSupport::Inflector.inflections(:es).singulars.empty?
+ assert ActiveSupport::Inflector.inflections(:es).uncountables.empty?
assert !ActiveSupport::Inflector.inflections.plurals.empty?
assert !ActiveSupport::Inflector.inflections.singulars.empty?
+ assert !ActiveSupport::Inflector.inflections.uncountables.empty?
end
スペイン語なんかのagua(水)はラテン語由来だったはずで、英語のaquaの語源ですね。以下はボサノバの定番曲「おいしい水」から。「アグァジュデベー」って聞こえます。
つっつきボイス: 「pluralize
、一発で発音できんわ: Railsで初めて覚えた単語」「これきっと造語だよな...と思ったら一応手元の串刺し検索辞書に載ってた: 英辞郎だけでしたがw」「"複数形にする"」「singulalize
があるならきっとその逆があるってことぐらいは推測つくけど」「他で使い所なさそー: あ、でも英語圏の小学校とかでは普通に使うのかな」「それは間違いないはずです: 英語の単数複数ってすっごく重要なので」
「で、uncountable(非可算名詞)というあの英語的にくっそ面倒なやつに、さらにロケールごとに対応したということですね: furnitureとかequipmentとかinformationみたいなやつ」「ははー、同じ単語でも活用形とか単複同形とかがスペイン語とかドイツ語なんかの言語によって違ったりすることがあるってことか!」「Railsでこんなところまでサポートするのはもう果てしがないというか、途中で嫌になったりしないかな」「沼化してる」
「もうオレはdatas
なんて見てもそんなにびっくりしないけどなっ」「自分が見た限りですが、実はそういう不規則活用って最近の英語圏でもどんどんグダグダになりつつありますね: mailって本来は集合名詞(sheepとかfishみたいに)なんですが、最近は中国人英語とかインド人英語が怒涛のように流入しているせいか、平気でmailsとか使う事例が山ほどあって、もうmailsありでいいんじゃね?って思ったり」
「確か社内GitLabのアクティビティログか何かだったんですが、metadata
で、複数形がmetadatas
に活用されてたという話、見ましたヨ」「(爆)」「それ英語的に判断難しいなー」「複合語だし」「metadatum
、聞いたことも見たこともねーし」
- datum / data
- index / indices? indexes?
- mail / mail? mails?
- metadata? metadatum? / metadatas???
「そういえばinformationってs付けていいのかどうかいつも迷う」「基本、s付けないんですけどね」「indexが単数で、indicesが複数形」「お、それはデータベース方面でお馴染み: show indices
とかやりますね」
後で手元の串刺し辞書(Logophileというアプリで検索できるようにしてある)の英英辞典で確認すると、こうありました。
informationは非可算名詞としてしか使えない。"an information"も"informations"もアウト。特定の情報を指したい場合に、"a piece of information"や"an item of information"などと書くことならできる。
英語の数詞(a sheet of papersなど)はこれがまた面倒で、日本語の「一匹、一羽、一頭、一着、一反」の面倒くささに匹敵します。タンスは「一竿」って数えるんですって。
参考: 【常識?】知っておくとカッコいい!色々な物の数え方、単位【雑学】 - NAVER まとめ
元ネタという大先輩 pic.twitter.com/yiiPEi6T7n
— ラリアット:C97 二日目・西E40b (@rariatoo) September 13, 2017
⚓ActiveRecord::Calculations
に引数とブロックを同時に渡すことを非推奨化
kamipoさんです。
Relation
のselect
、count
、sum
は、ブロックを受け取れるEnumerable
メソッドでもある。既に、ブロックを受け取るselect
は4fc3366以降引数を取らなくなったので、それに合わせた。
# activerecord/lib/active_record/relation/calculations.rb#L39
def count(column_name = nil)
- return super() if block_given?
+ if block_given?
+ unless column_name.nil?
+ ActiveSupport::Deprecation.warn \
+ "When `count' is called with a block, it ignores other arguments. " \
+ "This behavior is now deprecated and will result in an ArgumentError in Rails 5.3."
+ end
+
+ return super()
+ end
+
calculate(:count, column_name)
end
つっつきボイス: 「うん、これは正しいと思う: 引数とブロックのどっちも取れたりすると挙動予測するの難しくなるし」
⚓limit
が絡むときのfirst
とlast
の挙動を統一
- Consistency between first() and last() with limit by brchristian · Pull Request #27597 · rails/rails
# 同PRより
Topic.limit(1).first(2).size #=> 2
Topic.limit(1).last(2).size #=> 1
# activerecord/lib/active_record/relation/finder_methods.rb#L532
else
relation = ordered_relation
- if limit_value.nil? || index < limit_value
+ if limit_value
+ limit = [limit_value - index, limit].min
+ end
+
+ if limit > 0
relation = relation.offset(offset_index + index) unless index.zero?
relation.limit(limit).to_a
else
つっつきボイス: 「ほほー、first()
とlast()
はRubyのメソッドで、引数で最初から何番目とか最後から何番目というのを指定できるやつ: second
なんかは確かRailsのメソッドだけど」
追伸: ActiveRecordに関しては、別定義みたいです。
参考: ActiveRecord::FinderMethods
「とはいうもののサンプルでlimit(1)
してからfirst(2)
する意味がわからない: 修正の方はmin
を取るようにして挙動を一貫させたということだけど、こんな書き方誰もしないっしょ」「まず誰も踏まなさそうですね」
⚓非推奨の:if
/:unless
文字列フィルタを削除
# activesupport/test/callbacks_test.rb#L1189
- assert_deprecated { klass.before_save :tweedle, if: "true" }
- assert_deprecated { klass.after_save :tweedle, unless: "false" }
- assert_deprecated { klass.skip_callback :save, :before, :tweedle, if: "true" }
- assert_deprecated { klass.skip_callback :save, :after, :tweedle, unless: "false" }
+ assert_raises(ArgumentError) { klass.before_save :tweedle, if: ["true"] }
+ assert_raises(ArgumentError) { klass.before_save :tweedle, if: "true" }
+ assert_raises(ArgumentError) { klass.after_save :tweedle, unless: "false" }
+ assert_raises(ArgumentError) { klass.skip_callback :save, :before, :tweedle, if: "true" }
+ assert_raises(ArgumentError) { klass.skip_callback :save, :after, :tweedle, unless: "false" }
つっつきボイス: 「文字列フィルタって何だったっけと思って」「そうそう、前はコールバックのif:
とかunless:
オプションに文字列でRubyのコードを何でも渡せちゃったんですよね」「何それ怖い」「それが非推奨になり、今回ついに消えたってことか: そういえばそういうの見たなどっかで」
「今後はどうするのかな?lambdaで渡す?」「本家PRをみると、どちらかというとメソッドを定義して、Symbolで指定しろって感じに見えますね(どっちでもいいけど)」「それにしても、こういうところに生のRubyコード渡せちゃう実装って怖すぎるよね」「ユーザー入力をそこに直接ツッコんだりしたら...((((;゚Д゚))))ガクガクブルブル」「しかしですね、昔のRailsの本ではこの書き方しちゃってたんですよ」「えー!」「まあ流石にnew
とか書いてあったらおかしいってすぐわかるけど、あの頃メソッド呼び出しなんかはよく普通にこうやって書いて渡されたりしてたんですよね」「...」
⚓Rails
⚓Rails開発者アンケート2018の結果発表
コンテナ使いが半分超えたそうです。morimorihogeさんも勉強会で言ってましたが、Dockerはキャズムをとっくに過ぎて定番となりましたね。
自分の首を絞めるのはわかっていても、次回から「インフラ&コンテナ」枠も作らないといかんなという気がしてきました。
つっつきボイス: 「今話題のアレです: 前にウォッチで紹介した後に私も回答入れました」「ほほうアレね」
- If not all apps are kept updated, why not?
「TIMEとBUDGETって実質同じ」「ところでこういうアンケートってどういう人たちがアンケートに回答してるか次第だよねホント」「永遠の課題ですね」「たとえば3.0 or earlierとか、実態がこのとおりなのかどうかは甚だ疑問: 意識低い人はそもそもこういうアンケートに回答しないだろうし」
「お、GitLabけっこう使われてるな」「コンテナ率58%、この母集団ではなっ」
「(好きなgemイラッとするgemで)まあ妥当でしょうね: 誰もが嫌うactiveadminとか」「(爆)」「なおオレはDevise嫌いじゃない派」「...Devise、コントローラさえもっとちゃんとしてれば」「あ、ホントそう!あれはマジでキモい、つらい」「というと?」「使ってカスタマイズすればわかります: 自分はカスタマイズが必要になったら、基本的にDeviseのコントローラは継承しないという戦略を取りますね」「そうそう」「Deviseのコントローラを継承したうえであれこれカスタマイズしようとすると、まずうまくいかない」「たとえばRegistrationのフェーズを自分たちでカスタマイズしたいなら、DeviseのRegstrationコントローラを見ながら自分でRegistration
コントローラを書くww: それが一番安全」「(爆)」
「ログインで段階的に会員登録するとかよくあるじゃないですか: たとえば最初はメールアドレスだけ入力させて取りあえず使えるようにしてあげる、そして他の機能を増やしたかったら個人情報をもっと入力してください、ってやるとか、こういうのをDeviseでやろうとするとかなり大変」「(゚д゚)(。。)(゚д゚)(。。) ウンウン」「デフォルトのRegistration
コントローラだとその辺がうまくいかないんで、そういうときにコントローラ自作したっ」
Loved Gemsの一位がdeviseで、Frustrating Gemsの二位もdeviseなの趣がある
— . (@y_yagi) April 24, 2018
Deviseのこの立ち位置、タレントで言うと誰でしょう。
「RSpecも両方に入ってるのもまあわかる」「イラッとするgemの方にActiveRecordが入っているのは、だいたいarelのせい」「(爆)」
参考: rails/activerecord/lib/arel
このarelのリポジトリを探していて、まったく同じ名前のarelというRailsリポジトリの代数ライブラリが上位に出てきました。紛らわしいです...
「ところでこの『好きなgemイラッとするgem』のビジュアル表示、なかなかキレイですよね: こういうアート作品があった気がするんですけど」「ビックカメラ的とも言える」「たしかに」
昔TVでモデルさんか女優かがビックカメラの紙袋のデザインが素敵でバッグの一部に紙袋をリサイクルしたっていうのを見て言われてみればビックカメラの紙袋のやつ、良いデザインだな。と身近すぎて気づかない素敵デザインがあることを認識させてくれたよね。 pic.twitter.com/Gz6PCKjv4m
— 外村 (@tonomura_AT) October 7, 2016
- For greenfield Rails projects, what are you using to manage Javascript libraries?
「おー、今日のBPS社内のチームミーティングで盛り上がったアセットマネジメントじゃないすか」「半分近くWebpack使ってるとか、母集団偏りすぎじゃね?」「まだ半分以上はasset pipeline使ってるということでもありますね」
- Which Application Exception tracking tools do you use in production?
「NewRelicがまた上昇? 9割ぐらいの人が無料枠とかじゃなくて?」「NewRelicいいんだけど高いんだよなー: 前にも話したけど」「自分はairbrakeクローンのerrbitを使ったりしてるかな: たまに落ちてますけど」「あと某案件で使ったrollbarはなかなかよかった: うろ覚えだけど、たしか無料枠でも5000イベントぐらいは食えた」「有料だと結構取られますが、rollbarはかなりいいヤツ」
- リポジトリ: airbrake/airbrake
- リポジトリ: errbit/errbit -- オープンソースのairbrake API互換クローン
- Which Rails Servers are you using in production?
「これはもうPumaでいいんじゃね?」「(笑)」「もうPuma以外を使う理由があまりない」「Pumaが普通に動いてればもうUnicornに戻りたくないし: 何がつらいって、Unicornでgraceful restartとやらが肝心なときにちゃんと動いたことがオレの中ではなかったこと」「そうだったんすか」「僅差だけどついにPassengerに抜かれたし」
- Which databases do you prefer to use in production?
「やー、もうぽすぐれで決まりっしょ」「もうぽすぐれ!ぽすぐれ!」「Othersって何でしょね?」「そりゃあMicrosoft SQLとかOracleとか」「そういえば某案件ではついにOracle 12が登場するし」「新しいやつっすよね: マルチテナント対応とか何とかって」
「まあ母集団については適度に差し引いて考えるとして、とにかくいろいろ興味深かった」
⚓RailsガイドのRails 5.2リリースノート更新
お待たせいたしました。
つっつきボイス: 「お、これはhachi8833さんがやったやつ」「はいです: ちょっぴり翻訳しそびれた箇所がありましたがyasukawaさんが修正してくれました🙇」「たぶんそのあたりで自分がエネルギー切れ起こしたっぽいですw」
「今回訳していて、2年近くRailsウォッチとつっつき回やってて本当によかったと思いました: ActiveSupportのDate#prev_occurring
とDate#next_occurring
(#26600)とか、この回のつっつき↓で以前扱ってなかったらきっと正確に訳せなかったと思います」
週刊Railsウォッチ(20170609)ついにtherubyracerからmini_racerへ、注意しないとハマるgem、5.1でのVue.jsとTurbolinksの共存ほか
「いやーほんと、こうやって顔を突き合わせながら毎週コミットを追いかけてああだこうだと言ってきたからこそ、更新情報がこれだけ膨大になっても『あー、あの時のアレねハイハイ』ってスイスイ読めるようになりましたね」「毎週追うのをやってなかったら、このボリュームを前にして『うげぇ、誰か人柱で何か踏むまで待つか』なんてスルーしちゃったり」「自分もね、Railsウォッチのつっつきを毎週やるようになってから、Railsの新しいバージョンを使うことへの抵抗感下がりましたもん」「確かにー」
⚓GitLab Web IDEがCEに登場
写真がいいですねー。社内GitLabサーバーにもただちに導入決定しました。
⚓Railsのメモリ喰いを鎮圧する(Hacklinesより)
つっつきボイス: 「Railsのメモリ喰い、そんなのUnicorn使うのやめればだいたい直る」「(爆)」「いやマジで」
「他にも、Passengerの有料版にすればそれだけで相当メモリ量下がりますし」「とにかくRailsはRails自体のライブラリのフットプリントが大きすぎるんで、ワーカー1個立てるとそれだけで100MBとか食っちゃうから」「なるほどー」「そういうところがスレッドになればshared memoryになって軽くなるけど、マルチプロセスにするともう激重っす: つらみ」「Passengerにお金払う意味はそういうところにあるんですね」「ですね: あるいはPuma使うとか」
「それ以前の問題として、アプリケーションコードの中でワーカーごとのメモリ確保量がめちゃくちゃ多いようなコードって、そりゃもうコードが悪い」「(笑)」「よくあるのが、たとえば大容量ファイルのアップロード: 6万行ぐらいある巨大なExcelファイルとかCSVファイルを1リクエストでパースし始めると、それをメモリ上に展開するときに一瞬爆発的にメモリを食ってGCが動きそうになったり: そういうのは書き方が悪くて、非同期化するなりしないといけない」
「一般的な普通のRailsアプリなら、とりあえずPumaにしとけばいいと思う: Pumaにしてからメモリ食い問題にあまり突き当たらなくなったし」
⚓社内Slackより: AWSの設計
Railsからはちょっと外れますが。
lol wtf no pic.twitter.com/p3HDsaZL8l
— Matt Stancliff (@mattsta) April 4, 2018
「何これ、ヤメテーw」というニュアンスに見えたのですが、笑いのポイントが知りたかったので社内Slackで聞いたところ、むしろ真っ当でよい設計との由。
その後kazzさんとタバコ吸いながら話していて、「Lambdaの使い方やログのとり方もうまいし意図もよくわかるし、とてもいい設計ネ!」と激賞してました。
つっつきボイス: 「いい設計というかまあ、AWSみたいなマネージドなサービスで、こういう今流行のサーバーレス!なサービスとして静的Webサイト配信を組み立てようとすればこうなる感じですね」「こういうのが普通?」「というよりこうするしかない」
「このとき読み飛ばしてたけど、static websiteって書いてあったんですね」「そw: たかがstatic websiteを配信するためだけにこんだけのAWSサービスを動員しなきゃいけないという」「そこが笑いのポイントでしたか!なるほど〜すっきりした!」「普通ならさくらのレンタルサーバーあたりにぽいっと置けば済むようなしろものなのに」
「ちなみにGitHub Pagesなんてのはまさにこういう感じになってるはずですね(おっと自分で書いてたわ↑)」「あーそっか!」
「そしてこういうAWSなんかのサーバーレスなアーキテクチャ図のいいところは、このシステムがどういう機能を内包しているかが図を見ただけでだいたいわかるところなんですね」「たとえばこの図にはRoute 53が入ってますけど、これはすなわちドメインのホスティングも書き換えをするんだなと即座に見当がつく」「GitHub Pages使ったことあればわかると思うんですが、あそこは自分のGitHubユーザー名.github.io
ってドメインになるんですね: あれをやるにはDNSを動的に操作できる必要があるから、Route 53が置かれていることでそういう機能があると即わかる」「逆にRoute 53が置かれてなければ、同一ドメインでのホスティングしかサービスできないということになる」「なーるほどー」
「もちろん元のツイートでlol wtf noとか言ってるのもわかるし自分もどうかとは思うけれどw、こういうふうにできるのは1個1個が小さいマネージドサービスだからなんですね」「これが逆に物凄い神システム的なモノリスだったりすれば、図にはinputとoutputが生えてるだけで中で何やってるのか全然見当がつかない」「だから果たしてどちらがいいのか?という話にもなりうるわけです」
「そういえば今日ちょうどBPS社内勉強会で新人向けにLinuxコマンドについて解説したんですけど、あれもまさにそうで、Unixの思想である『小さなものを組み合わせてタスクを達成する』的な話と、このアーキテクチャ図は通じているところがありますね: なーんてね」
もそっとよく見えるように、babaさんの注釈画像も貼ってみます。
「『シンプル』って書いてあるのがbabaさん流のギャグかなと」「あーなるほど、書いてある場所はどれも"S"で始まってますからねw: シンプルのS」「ちなS3はSimple Storage Service」「SNSもSimple Notification Service」「シンプルなものが組み合わさってこれだけコンプレックスなものができあがったと」「(笑)」
⚓RailsとWebpackerでAngular 2をがっつり使う
今日BPS社内のチームミーティングでRailsとAngular JSの組み合わせで白熱したときに見つけた記事です。いつもはやらないのですが、既に翻訳リクエストかけて翻訳中です。仮に応答がなくても、そのまま社内で共有しちゃう予定です。
つっつきボイス: 「この記事は前半でRailsのJS回りの歴史をきちっと解説してくれてるんですよ」「歴史はマジ大事: どうしてこうなった?とか何でこんな設計なの?って歴史が見えないとほんとわかんない」「自分が問題に直面してないと、これが解答だと言われても判断できないですもんね」「(笑)」
⚓Rollbar.comブログ: Railsプロジェクトのエラー、トップテン(Ruby Weeklyより)
上のアンケート話でも言及されてたrollbar.comのブログです。
⚓Kubernetes運用設計ガイド
加筆修正した資料を公開しました。https://t.co/j7LZizc55T
#containerdaysjp— spesnova (@spesnova) April 23, 2018
つっつきボイス: 「くばねてさんは、まあ好きな人が追いかければって感じ」「正直、BPSがKubernetesを運用することはない: 意味ないから」「そんなことするぐらいならGCPを買う」「AWSのFargateは?」「あれはまだ出てなーい」「AWSにはEKSってのがあって、これがKubernetes、そしてFargateはAWS独自のコンテナマネジメント」「EKS、何もかもAWSにしたい人は使うんだろうけど、どういう人だ?」
⚓Ruby trunkより
⚓モジュールのinclude
とprepend
を同じクラスにいっぺんにやるとModule#ancestors
がおかしい気がする
# 同バグより
module M3; end
module M1
include M3
end
module M2
prepend M3
end
class Sub
include M1
include M2
end
# [Sub, M1, M3, M2, Object, Kernel, BasicObject]
p Sub.ancestors
つっつきボイス: 「このissue、放置されてます」「こういうのイヤなんだよねーもうw: ancestors
がどうなってるとか考えたくないし」「もうちょっとわかりやすく書いてくれればなー」
⚓URI::HTML5ASCIIINCOMPAT
がarrayではなく式を返す
# 同バグより
➜ ~ RBENV_VERSION=2.2.5 ruby -e "require 'uri'; p URI::HTML5ASCIIINCOMPAT"
[#<Encoding:UTF-7 (dummy)>, #<Encoding:UTF-16BE (autoload)>, #<Encoding:UTF-16LE (autoload)>, #<Encoding:UTF-32BE (autoload)>, #<Encoding:UTF-32LE (autoload)>]
➜ ~ RBENV_VERSION=2.3.0 ruby -e "require 'uri'; p URI::HTML5ASCIIINCOMPAT"
"expression"
➜ ~ RBENV_VERSION=2.4.4 ruby -e "require 'uri'; p URI::HTML5ASCIIINCOMPAT"
"expression"
➜ ~ RBENV_VERSION=2.5.0 ruby -e "require 'uri'; p URI::HTML5ASCIIINCOMPAT"
"expression"
つっつきボイス: 「regressionで、2.3.0からのバグってことか」「URI::HTML5ASCIIINCOMPAT
とか自分使わないなきっと」
⚓64-bit fixnumの精度が落ちる
# 同バグより
assert_operator((0.0).step(bignum.to_f, 1.0).size, :>=, bignum) # 精度が落ちることがある
つっつきボイス: 「RubyのNumericは自動で切り替わるから、そこのあたりか」
⚓Integerのアトミックなincr/decrが欲しい
# 同issueより
counter = 0
counter.incr # => 1
counter.incr(10) # => 11
counter.incr(-1) # => 10
counter.reset # => 10
counter # => 0
つっつきボイス: 「Rubyのようにすべてがオブジェクトだと素朴なincr/decrはできないという認識でした」「Rubyには++
とか--
はないですからね」「この辺難しいなー: incr
みたいなことをしたいとしたら破壊的メソッドとして!
付けるべきかとか、10大きいとか-1大きいみたいなことを指定したいなら次の値という意味でsuccessor
的な名前の方がいいんじゃないかな、とか」「だからincr
要らないんじゃね?って」「このreset
って...?」(以下延々)
⚓Ruby
⚓るびまがリニューアル: スマホに対応
Rubyist Magazine、通称るびまを大型アップデートしました。一番大きなポイントはスマホでも見やすくなったことです。各記事へのURLが変わりましたがこれまでのURLもリダイレクトされます。今度とも、るびまをよろしくお願いします。 pic.twitter.com/lJeoQGdUmx
— みよひで画伯 (@miyohide) April 22, 2018
つっつきボイス: 「るびまについに文明が訪れた!」「るびまって、みよひでさんがほぼ一人でやってるんじゃなかったかな?『いいね!』ボタンが絶妙にずれてたりするあたりに、みよひでさんがここでちょっと力尽きた感が」「偉大な人だ...」
⚓OSS Gate東京ミートアップ: Rubyでデータ処理をするツールを開発中
つっつきボイス: 「Rubyでデータ処理というのが目をひいたので」「スポンサーはどこかと思ったらSpeeeさんでしたか」「eは3つ」「Speeeといえばえっと、PyCallの人だ!」「道理で」
参考: (9) Kenta Murata | LinkedIn
⚓ついに4倍速になった部分も
Now attr_reader is 4x faster than not JIT-ed case https://t.co/9bDBp8Pusc
— k0kubun (@k0kubun) April 20, 2018
⚓シングルトンオブジェクトをRubyのデフォルトの引数に使う
# 同記事より
class Foo
NOT_PROVIDED = Object.new
def bar(one, two: NOT_PROVIDED)
puts one.inspect
if two == NOT_PROVIDED
puts "not provided"
else
puts two.inspect
end
end
private_constant :NOT_PROVIDED
end
つっつきボイス: 「デフォルト引数にちょっとしたValue Objectを入れたいみたいな話かな: よくあるやつ」「Object.new
じゃなくてもたとえばハッシュにするとか」
⚓Rubyの「deep hash」(Hacklinesより)
# 同記事より
def set_value!(hash, value = nil, &fn)
lead_in = @paths[0..-2]
target_key = @paths[-1]
new_hash = hash
lead_in.each { |s| new_hash = new_hash[s] }
new_value = block_given? ?
yield(new_hash[target_key]) :
value
new_hash[target_key] = new_value
hash
end
# Hehehehehehe
def set_value(hash, value = nil, &fn)
set_value!(deep_clone(hash), value, @fn)
end
つっつきボイス: 「XF?あ、gemのようだ」「transformってどことなく数学用語っぽいですね」
- リポジトリ: baweaver/xf
「ふーむ、式を与えると、ハッシュなりオブジェクトに手を突っ込んで集めてきてくれるやつっぽい?: 何か名前あったなー、こういう探索して引っこ抜いてくるみたいなやつ」「関数型っぽい感じですね」「READMEに書いてある、HaskellのLensって書いてあるのがそれなのかな?」「これはそろそろ社内Haskell勢を召喚しなくては」
# 同リポジトリより
# Read left to right
%w(1 2 3 4).map(&Xf.pipe(:to_i, :succ))
# Read right to left
%w(1 2 3 4).map(&Xf.compose(:succ, :to_i))
people = [{name: "Robert", age: 22}, {name: "Roberta", age: 22}, {name: "Foo", age: 42}, {name: "Bar", age: 18}]
people.map(&Xf.scope(:age).get)
# => [22, 22, 42, 18]
「上の例だとage:
の値をかき集めてる: データ処理なんかによさそう」「データ構造のネストが込み入ってきたときとかにこんなふうに書きたいかもね」「こういうのって『いつか使ってやるゾ』って心の中で準備しといて使う機会を日頃から探してないと使うの忘れちゃうんですよね」「これなんてeach
でループ書けば全然普通にできることだし」
⚓台湾でRubyxElixirカンファレンスが今日から開催
観測範囲では、Matzやhsbtさんやko1さんやigaiga555さんなどが昨日あたりから現地入りしているようです。ところで、Matzだけは「さん」を付けるのが自分の言語感覚的にどうもしっくりこないので、それだけの理由で敬称略しています。悪しからず。
台湾にて @igaiga555 さんのコミュニケーション能力に感心する。
— Yukihiro Matsumoto (@yukihiro_matz) April 25, 2018
これこれ pic.twitter.com/GxIBcPofZc
— SHIBATA Hiroshi (@hsbt) April 26, 2018
こんな食べ物を噛むのもつらい状態で台湾に行くの? 悲しい
— Yukihiro Matsumoto (@yukihiro_matz) April 24, 2018
お大事にどうぞ。
⚓その他記事など
- 元記事: Why Is Choosing Good Solutions for Projects So Hard in Rails?(Hacklinesより)
- 元記事: Weekly trending Ruby on Rails repositories. April, 24(Hacklinesより)
cpp_dependency_graph (0.1.2): Generates interactive dependency visualisations (dot, d3.js) to study the… https://t.co/48XXVXkIkh
— RubyGems (@rubygems) April 24, 2018
「なぜRubyのelsifはelseifでもelsifでもないのか」という質問に対して、「elsifは発音を変えない範囲で最も短い」と説明した。補足的にはPerlやEiffelもそうだからというものもあるけど。aliasを許容するRuby文化ならelseifも予約語として認めるという選択肢もあるけど予定はない
— Yukihiro Matsumoto (@yukihiro_matz) April 25, 2018
つっつきボイス: 「このelsif
の説明割りと納得できる: Eiffelがそうだからというのも含めて」「ほぼ使わないけどなっ」
これからスライド準備です。ところで笹田くんGuild の話だけするんだっけ? AutoFiber の話はしない?
— Yukihiro Matsumoto (@yukihiro_matz) April 25, 2018
つっつきボイス: 「Guildの話、ネットにもほとんど見当たらなかったので」
仕事もしてたのよ。言語開発の合間に。
— Yukihiro Matsumoto (@yukihiro_matz) April 21, 2018
会社に向かう電車の中で仕事を済ませてしまって、会社ではrubyを作ってたという伝説は事実だったのですか?
— ooooo (@ooooo) April 21, 2018
若干大袈裟な表現ですが、おおむね事実ですね。
— Yukihiro Matsumoto (@yukihiro_matz) April 21, 2018
Qiitaの「トレンド」に上がってきてた「ブラックジャックゲーム」をRubyで実装してみた。一見簡単そうに見えるけど、しっかり作り込もうとすると結構大変だった💦
コードはこちら↓https://t.co/5ty6PagcK7
チェリー本の知識があれば構文的にはほとんどわかるはず。ただし、テストコードはRSpecです。 pic.twitter.com/6U6ekeIEnT— Junichi Ito (伊藤淳一) (@jnchito) April 26, 2018
⚓SQL
⚓PostgreSQLのデータ型: Date/Timestamp/Time Zones(Postgres Weeklyより)
つっつきボイス: 「いろんなDBMSのデータ型の扱いは、一度は比較して調べておくといいですよ」「特にtimestampはDBMSによって違ってたりすることがあるんで: timestampがnullableなものもあれば、MySQLみたいにtimestamp(あとtextarea)にnullをセットできないのはdatetimeにして切り抜けたりとか」「ほー!」
⚓スライド: PostgreSQL 10のパフォーマンス向上に役立つ機能
⚓GCPのCloud SQLでPostgreSQLをサポート(Postgres Weeklyより)
⚓JavaScript
JavaScriptの扱いが軽いわけではなくて、情報が多すぎて手が回らないのが現状です。
⚓めちゃ大規模なJavaScriptアプリを設計する(JavaScript Weeklyより)
⚓VuePress: 静的サイトジェネレーター(JavaScript Weeklyより)
- 元記事: VuePress
URLからしてVuejs本家ですね。
⚓OracleがiOS向けJSエディタアプリが商標を侵害と主張?
⚓Hyper 2: Electronベースのターミナルソフト(JavaScript Weeklyより)
- サイト: Hyper™
- 公式ブログ: ZEIT – Hyper 2
つっつきボイス: 「自分のターミナルがJSで動いてもなぁ...やるなら安定してクラッシュしなくて履歴をいくらでも取れることを要求したいし」
⚓CSS/HTML/フロントエンド
⚓Chrome 67でHPKP廃止: CTに移行か
- フォーラム: Intent To Deprecate And Remove: Public Key Pinning - Google グループ
- RFC 7469 - Public Key Pinning Extension for HTTP
参考: Certificate Transparency の仕組みと HPKP から Expect-CT への移行 | blog.jxck.io -- こちらのサイト、いつも参考になります。
つっつきボイス: 「略語って大変」「このjxck.ioの人はHTTP回りの新技術めちゃめちゃ詳しい」「mozaic.fmの人ですよね」「それだっ」
参考: mozaic.fm
⚓フルCSSで構築された美サイト
- サイト: DropOut
つっつきボイス: 「これはてブでめちゃ上がってたやつ」「お仕事探してるのかな?」「たぶん学生なんじゃ?」
⚓CLIP STUDIO TABMATE: タブレットを多用するデザイナーの左手を強化するデバイス
前からあるようですが一応。
⚓Gmailの新機能
知っとかないと割りと困ると思います。いっそ世界中のメールが全部Gmailに集約されちゃえばいいんです。
⚓言語よろず部屋
⚓cargo src: Rustのソースを追うツール
社内Rust/Haskell勢の方からのおたよりで知りました。
⚓C2: 次世代のC言語?
- サイト: C2 Programming Language
- リポジトリ: c2lang/c2compiler
こちらも社内Rust/Haskell勢の方からのおたよりで知りました。
参考: C言語の現代化を目指すC2
⚓ノリノリmattnさん
円楽:えー、今から私がブラウザで漫画村を見ようとしますので、皆さんはウェブサーバになったつもりでステータスコードをおもしろおかしく返して下さい。 はい、楽さん早かった!
— mattn (@mattn_jp) April 23, 2018
僕が作った作品をご覧ください。https://t.co/LU7hr61GPJhttps://t.co/B4GB0ztDwB
— mattn (@mattn_jp) April 20, 2018
そうなると #golang にも移植したくなるよね。https://t.co/2H1q1lTt5w
— mattn (@mattn_jp) April 20, 2018
Go言語については、mattnさんを追いかけていればだいたい面白そうなことやってます。
参考: Big Sky -- mattnさんのブログです。
⚓SwiftKotlinという変換ツール出現
- リポジトリ: angelolloqui/SwiftKotlin
同リポジトリより
つっつきボイス: 「へー、割りと1対1対応してる」「その言語にしかないようなオブジェクトクラスとかでなければ、最近の言語はその気になれば割りと相互変換できるんかな」
Parrotってあったのを思い出したのですが、最近どうなんでしょう。
⚓GopherCon 2018
Russ Cox出たのか。後できこう。 /
Go Time #77: Dependencies and the future of Go with Russ Cox | News and podcasts for developers | Changelog https://t.co/gLl6k91oFS— . (@y_yagi) April 26, 2018
というツイートを見かけて、もしやと思ったらと今こんなのやってるそうです。今の今まですっかり見落としてました(´・ω・`)。
- サイト: GopherCon 2018
- Russ Coxの講演
Go Time 77: Dependencies and the future of Go with Russ Cox – Listen on Changelog.com
⚓こんなところで
Elixir じゃん pic.twitter.com/XtlHE89vSD
— 捻子 (@drillbits) April 25, 2018
⚓「Cコンパイラ自作」集中講義ですって
というわけでですね!
今年は @rui314 さんとともに
「Cコンパイラを自作してみよう!」
という集中講義をセキュリティキャンプで担当します!
コンパイラを書いたことがない方でも大丈夫!大事なのは、コンパイラをつくりたい!という気持ちだけです。ぜひご応募くださいー!https://t.co/NUTZ6YStH7— hikalium (@hikalium) April 24, 2018
⚓その他
⚓GoogleがDFPの旧いAPI提供を終了
GoogleのDoubleClick for PublishresというGoogleのサービスです。
参考: DFPことはじめ。基本的な用語と設定手順。 - Qiita
⚓DNS over HTTPSって?
サイトブロッキング絡みの記事で「DNS over HTTPSが普及する前の今ならXXできる」という記述を見かけたのですが、その記事がどこだったか思い出せなくてXXが何だったのかわからずじまい...。
お前本当に仕事早いな…:サイトブロッキングのイラスト|いらすとや https://t.co/ta3SEbq5bO
— イスラエルエリカちゃん (@syuu1228) April 23, 2018
⚓BBCが効果音を無料公開
BBCが16000種以上の効果音を無料公開 https://t.co/TFlBee9GvX
— しかのつかさ (@sikano_tu) April 23, 2018
⚓Twitterの視覚障害者支援機能
TwitterでPCから画像を投稿する時、「目の不自由な方のため」の「画像の説明」が追加出来るようになっていた。インフラとも言われるようになったTwitterを考えると良い変更だなあ。
この説明はPCのUIでは実際にソースにも出ないみたいだけど、どこで使われるのかな。 pic.twitter.com/XlFSG1oZFK— 辻正浩 | Masahiro Tsuji (@tsuj) April 22, 2018
つっつきボイス: 「alt属性を入れられるみたいな感じ?」
⚓HackerRankの2018年スキルアンケート結果
恐ろしいぐらい凝りに凝ったビジュアル表示です。デザイナーにも眺めて欲しい感じです。
次に学びたい言語の5位がRubyでした。
つっつきボイス: 「Rが意外に高い??今からR学びたい人ってデータ解析やる人しかいないだろうなー」「Juliaが意外に低い」「見ようによってはそれほど差がないという気もしますね」「Rは昔ちょっと使ったなー: チャートを描くときとか」「3分ぐらいなら触ったことありました」
⚓皆さんのGDPR対策は大丈夫?
⚓その他のその他
【拡散希望】
TBSで放送されたドラマでインパクトファクターが出てきたけどこの解釈は間違い!
個人の評価指数ではなく、雑誌の影響度の指標であり、ゲームのような個人レベルでの比較はできませぬ(´;Д;`)
大学の先生も言ってて、すごく間違い認識多いから特に大学生気をつけて!!#ブラックペアン pic.twitter.com/26GKCXui9I— riko (@rikakooekaki) April 22, 2018
個人的な経験なんですが、機械学習と人間の手調整が同じくらいの精度の時は管理的な意味で手調整のが断然楽です。(手調整はコードベースなので)
— 山本一成🌧️️Ponanza (@issei_y) April 19, 2018
まあでも、とても調整する気が起きない場合はとりあえず学習器に放り投げましょう。結構いい結果だしてくれるかもしれません。(どっちやねん)
— 山本一成🌧️️Ponanza (@issei_y) April 19, 2018
つっつきボイス: 「うん、これはもう既に普通というか当然ですね: 巷で流れてくるAIとか機械学習とかビッグデータとか言ってるやつはだいたいビッグデータじゃないし、フィルタでできることをやってるという感じ」「本当に機械学習が必要なのって、たとえばこのデータから何が取れるのかわからん、みたいなものだろうし」「私将棋に暗いんで知りませんでしたが、この山本一成さんって将棋AIのすごい人なんですね」「山本さんはもう超有名っす」「むちゃくちゃ有名っすね: Turing Complete FMの文字コードの回でも言ってた、あの逆さまの将棋フォント作っちゃった人↓」
参考: フォントはフォントに大事|山本 一成@Ponanza|note
SSD化したWindows95マシン当時では考えられなかった速度で起動するw pic.twitter.com/KLVBSCTSf0
— ゴトゥ (@siwata04) April 26, 2018
⚓番外
⚓和で評価するか調和平均で評価するか
参考: 調和平均 - Wikipedia
⚓徹夜が身体に良くない理由
- 元記事: アリエナイ科学メルマ [まぐまぐ!]
なるほど、前に見たこの図に近い感想。これは20代、30代…と年を重ねるにつれて顕著。
ちなみに、老齢に近づくと睡眠時間が短くなると言われているが、これは眠りが浅くなるだけで、やはり睡眠時間が少ないのは問題とのこと。
『睡眠不足の状態で瞬発的な反応を調べたら』https://t.co/cf7WRQJlqj pic.twitter.com/GEswJcK8Je
— 吉澤準特 / 図解ツイート多め / Amazon総合7位 (@juntoku_y) April 22, 2018
つっつきボイス: 「このあたりはねー、個人差あるっしょ」
⚓ミクロ2題
- 極小のダイヤモンド針を曲げるのに成功: Scientists find a way to bend and stretch diamond, one of the hardest materials on Earth
絶対零度近くで一個のナトリウム原子と一個のセシウム原子をレーザーでガイドして衝突させて化学反応させるのに成功したんだって。
すんごい時代になってきたね。Laser-beam ‘tweezers’ guide two atoms to collide https://t.co/q9SBsJCi7U
— physico (@physico_physio) April 20, 2018
⚓World of Tanksの戦車リサーチはガチ
現在,我々の会社には2200人の社員がいて,そのなかにはフルタイムで戦車の歴史的研究をしている社員が12人います。図書館や美術館は基本ですが,ロシアの各地には日本の戦車が残っています。遺棄された戦車を実際に調べにも行きました。
同記事より
つっつきボイス: 「ちょwwこれw」「フルタイム、12人ってw」「下手すると日本の研究者より詳しいぞこれ!」
「なんかこう、アサシン クリード オリジンズの最近出たエジプト編みたいなやつで、発見されたばかりのピラミッドの部屋が当然のようにゲームに速攻実装されてたみたいな世界ですね」「何それ~」「それむしろ実装しなかったら悔しくて夜も眠れないんじゃ」
参考: 『アサシン クリード オリジンズ』には、先週発見された「ピラミッド内の謎の巨大空間」がすでに実装されていた?隠し部屋が確認される | AUTOMATON
⚓超精密かつ斬新なリズム
この方々の体内クロックは、一番細かい音符の少なくとも2倍速はあります(インドやアラビアやアフリカやラテンの音楽ならまったく平常運転)。体内での分周によって8分音符や4分音符といったパルスを得て、それを出力しています。
より振動数の高い内部クロックを体内で分周することで、音符の長さに関わらずテンポが極めて安定します。
このあたり、気が向いたらポエム記事にしようと思います。
今週は以上です。皆さまよいゴールデンウィークを!
Twitterより
TechRachoの中の勉強会、今月2回目の参加。railsだけでなく様々な分野の知識が得られるからよいなぁ。
— osamu_arita (@osamu_arita) April 26, 2018
https://t.co/xySZkMrR43 すごい!これ読んでおけばtwitterやらんでもいいのでは?感がある。
— Miura Hideki (@miura1729) April 27, 2018
バックナンバー(2018年度)
週刊Railsウォッチ(20180420)NGINX Unit正式リリース、Rubyをメモリリークさせてみる、美しいコード宇宙ほか
- 20180413 RailsConf 2018、Form Objectの昔と今、rubyreferences.github.ioのドキュメントがスゴイ、GitHubが10歳にほか
- 20180406 ruby-sass gemが非推奨に、Roda gem、paiza.ioは便利、Linuxは/procで遊ぼうほか
- 20180330 春のリリースラッシュ: Rails 5.1.6/5.0.7とRuby 2.5.1など、Ruby 2.2は3月でメンテ終了ほか
- 20180312 Rails 5.2.0 RC2リリース、「サーバーレスなRubyが欲しい」、capybara風JSテストフレームワークCypressほか
- 20180316 Rails 5.2のドキュメント更新中、Value Objectの使い方、RubyがTIOBEトップテン復活、Rails「雪だるま」エンコーディングほか
- 20180309 RubyGems.orgのTLS 1.0/1.1接続非推奨、2年に1度のRailsアンケート、DockerのMoby Project、Ruby拡張をRustで書けるruruほか
- 20180302 Ruby 2.6.0-preview1とWebpack 4.0リリース、爆速検索APIサービスAlgolia、Clowneでモデルをクローンほか
- 20180223 Ruby25開催、Rails6のパラレルテスト、書籍「RSpecによるRailsテスト入門」更新ほか
- 20180216 Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか
- 20180209 RubyにMJIT初マージ、高速JSON API gem、Railsにparallel-testingブランチほか
- 20180202 Rails 5.2.0 RC1と5.1.5.rc1リリース、Rails 6開発開始、メソッド絵文字化gemほか
- 20180126 Bootstrap 4登場でbootstrap_form gemが対応、PostgreSQLやnginxの設定ファイル生成サービスほか
- 20180119 derailed_benchmarks gem、PostgreSQLをGraphQL API化するPostGraphile、機械学習でモック画像をHTML化ほか
- 20180112 update_attributeが修正、ぼっち演算子
&.
はObject#try
より高速、今年のRubyカンファレンス情報ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。