週刊Railsウォッチ(20180427)Rails開発者アンケート2018結果発表、「次に学びたい言語」、各種カンファレンス目白押しほか

こんにちは、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でセキュリティ問題修正ほか

Rubyスタイルガイドを読む: 数値、文字列、日時(日付・時刻・時間)

「タイムゾーンが存在しない場合というか、存在しないタイムゾーンを指定した場合のエラーのようですね」「存在しないタイムゾーンを叩くとか、タイムゾーンを引数にとって動的挿入したとかぐらいで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の語源ですね。以下はボサノバの定番曲「おいしい水」から。「アグァジュデベー」って聞こえます。

参考: おいしい水 - Wikipedia


つっつきボイス: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 まとめ

ActiveRecord::Calculationsに引数とブロックを同時に渡すことを非推奨化

kamipoさんです。

Relationselectcountsumは、ブロックを受け取れるEnumerableメソッドでもある。既に、ブロックを受け取るselect4fc3366以降引数を取らなくなったので、それに合わせた。

# 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が絡むときのfirstlastの挙動を統一

# 同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の結果発表


rails-hosting.comより

コンテナ使いが半分超えたそうです。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コントローラだとその辺がうまくいかないんで、そういうときにコントローラ自作したっ」

Deviseのこの立ち位置、タレントで言うと誰でしょう。

「RSpecも両方に入ってるのもまあわかる」「イラッとするgemの方にActiveRecordが入っているのは、だいたいarelのせい」「(爆)」

参考: rails/activerecord/lib/arel

このarelのリポジトリを探していて、まったく同じ名前のarelというRailsリポジトリの代数ライブラリが上位に出てきました。紛らわしいです…

「ところでこの『好きなgemイラッとするgem』のビジュアル表示、なかなかキレイですよね: こういうアート作品があった気がするんですけど」「ビックカメラ的とも言える」「たしかに」

  • 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はかなりいいヤツ」


newrelic.comより



airbrake.ioより


github.com/airbrake/airbrakeより

  • リポジトリ: errbit/errbit — オープンソースのairbrake API互換クローン


rollbar.comより


  • 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ウォッチとつっつき回やってて本当によかったと思いました: ActiveSupportDate#prev_occurringDate#next_occurring#26600)とか、この回のつっつき↓で以前扱ってなかったらきっと正確に訳せなかったと思います」

週刊Railsウォッチ(20170609)ついにtherubyracerからmini_racerへ、注意しないとハマるgem、5.1でのVue.jsとTurbolinksの共存ほか

「いやーほんと、こうやって顔を突き合わせながら毎週コミットを追いかけてああだこうだと言ってきたからこそ、更新情報がこれだけ膨大になっても『あー、あの時のアレねハイハイ』ってスイスイ読めるようになりましたね」「毎週追うのをやってなかったら、このボリュームを前にして『うげぇ、誰か人柱で何か踏むまで待つか』なんてスルーしちゃったり」「自分もね、Railsウォッチのつっつきを毎週やるようになってから、Railsの新しいバージョンを使うことへの抵抗感下がりましたもん」「確かにー」

GitLab Web IDEがCEに登場


about.gitlab.comより

写真がいいですねー。社内GitLabサーバーにもただちに導入決定しました。

Railsのメモリ喰いを鎮圧する(Hacklinesより)


同記事より


つっつきボイス: 「Railsのメモリ喰い、そんなのUnicorn使うのやめればだいたい直る」「(爆)」「いやマジで」
「他にも、Passengerの有料版にすればそれだけで相当メモリ量下がりますし」「とにかくRailsはRails自体のライブラリのフットプリントが大きすぎるんで、ワーカー1個立てるとそれだけで100MBとか食っちゃうから」「なるほどー」「そういうところがスレッドになればshared memoryになって軽くなるけど、マルチプロセスにするともう激重っす: つらみ」「Passengerにお金払う意味はそういうところにあるんですね」「ですね: あるいはPuma使うとか」

「それ以前の問題として、アプリケーションコードの中でワーカーごとのメモリ確保量がめちゃくちゃ多いようなコードって、そりゃもうコードが悪い」「(笑)」「よくあるのが、たとえば大容量ファイルのアップロード: 6万行ぐらいある巨大なExcelファイルとかCSVファイルを1リクエストでパースし始めると、それをメモリ上に展開するときに一瞬爆発的にメモリを食ってGCが動きそうになったり: そういうのは書き方が悪くて、非同期化するなりしないといけない」

「一般的な普通のRailsアプリなら、とりあえずPumaにしとけばいいと思う: Pumaにしてからメモリ食い問題にあまり突き当たらなくなったし」

RailsConf 2017のパフォーマンス関連の話題(1)BootsnapやPumaなど(翻訳)

社内Slackより: AWSの設計

Railsからはちょっと外れますが。

「何これ、ヤメテー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フロントエンド開発(1)Asset PipelineからWebpackへ(翻訳)


つっつきボイス: 「この記事は前半でRailsのJS回りの歴史をきちっと解説してくれてるんですよ」「歴史はマジ大事: どうしてこうなった?とか何でこんな設計なの?って歴史が見えないとほんとわかんない」「自分が問題に直面してないと、これが解答だと言われても判断できないですもんね」「(笑)」

Rollbar.comブログ: Railsプロジェクトのエラー、トップテン(Ruby Weeklyより)

上のアンケート話でも言及されてたrollbar.comのブログです。

Kubernetes運用設計ガイド


つっつきボイス: 「くばねてさんは、まあ好きな人が追いかければって感じ」「正直、BPSがKubernetesを運用することはない: 意味ないから」「そんなことするぐらいならGCPを買う」「AWSのFargateは?」「あれはまだ出てなーい」「AWSにはEKSってのがあって、これがKubernetes、そしてFargateはAWS独自のコンテナマネジメント」「EKS、何もかもAWSにしたい人は使うんだろうけど、どういう人だ?」

Ruby trunkより

モジュールのincludeprependを同じクラスにいっぺんにやると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

るびまがリニューアル: スマホに対応


つっつきボイス: 「るびまについに文明が訪れた!」「るびまって、みよひでさんがほぼ一人でやってるんじゃなかったかな?『いいね!』ボタンが絶妙にずれてたりするあたりに、みよひでさんがここでちょっと力尽きた感が」「偉大な人だ…」

OSS Gate東京ミートアップ: Rubyでデータ処理をするツールを開発中


speee.connpass.comより


つっつきボイス: 「Rubyでデータ処理というのが目をひいたので」「スポンサーはどこかと思ったらSpeeeさんでしたか」「eは3つ」「Speeeといえばえっと、PyCallの人だ!」「道理で」

参考: (9) Kenta Murata | LinkedIn

ついに4倍速になった部分も

シングルトンオブジェクトを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ってどことなく数学用語っぽいですね」

「ふーむ、式を与えると、ハッシュなりオブジェクトに手を突っ込んで集めてきてくれるやつっぽい?: 何か名前あったなー、こういう探索して引っこ抜いてくるみたいなやつ」「関数型っぽい感じですね」「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だけは「さん」を付けるのが自分の言語感覚的にどうもしっくりこないので、それだけの理由で敬称略しています。悪しからず。


お大事にどうぞ。

その他記事など




つっつきボイス: 「このelsifの説明割りと納得できる: Eiffelがそうだからというのも含めて」「ほぼ使わないけどなっ」



つっつきボイス: 「Guildの話、ネットにもほとんど見当たらなかったので」



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.vuejs.orgより

URLからしてVuejs本家ですね。

OracleがiOS向けJSエディタアプリが商標を侵害と主張?

Hyper 2: Electronベースのターミナルソフト(JavaScript Weeklyより)


つっつきボイス: 「自分のターミナルがJSで動いてもなぁ…やるなら安定してクラッシュしなくて履歴をいくらでも取れることを要求したいし」

CSS/HTML/フロントエンド

Chrome 67でHPKP廃止: CTに移行か

参考: Certificate Transparency の仕組みと HPKP から Expect-CT への移行 | blog.jxck.io — こちらのサイト、いつも参考になります。


つっつきボイス: 「略語って大変」「このjxck.ioの人はHTTP回りの新技術めちゃめちゃ詳しい」「mozaic.fmの人ですよね」「それだっ」

参考: mozaic.fm

フルCSSで構築された美サイト


つっつきボイス: 「これはてブでめちゃ上がってたやつ」「お仕事探してるのかな?」「たぶん学生なんじゃ?」

CLIP STUDIO TABMATE: タブレットを多用するデザイナーの左手を強化するデバイス

前からあるようですが一応。

Gmailの新機能

知っとかないと割りと困ると思います。いっそ世界中のメールが全部Gmailに集約されちゃえばいいんです。

言語よろず部屋

cargo src: Rustのソースを追うツール


ncameron.orgより

社内Rust/Haskell勢の方からのおたよりで知りました。

C2: 次世代のC言語?


同サイトより

こちらも社内Rust/Haskell勢の方からのおたよりで知りました。

参考: C言語の現代化を目指すC2

ノリノリmattnさん

Go言語については、mattnさんを追いかけていればだいたい面白そうなことやってます。

参考: Big Sky — mattnさんのブログです。

SwiftKotlinという変換ツール出現

同リポジトリより


つっつきボイス: 「へー、割りと1対1対応してる」「その言語にしかないようなオブジェクトクラスとかでなければ、最近の言語はその気になれば割りと相互変換できるんかな」

Parrotってあったのを思い出したのですが、最近どうなんでしょう。

GopherCon 2018

というツイートを見かけて、もしやと思ったらと今こんなのやってるそうです。今の今まですっかり見落としてました(´・ω・`)。

  • Russ Coxの講演

Go Time 77: Dependencies and the future of Go with Russ Cox – Listen on Changelog.com

こんなところで

「Cコンパイラ自作」集中講義ですって

その他

GoogleがDFPの旧いAPI提供を終了

GoogleのDoubleClick for PublishresというGoogleのサービスです。

参考: DFPことはじめ。基本的な用語と設定手順。 - Qiita

DNS over HTTPSって?

サイトブロッキング絡みの記事で「DNS over HTTPSが普及する前の今ならXXできる」という記述を見かけたのですが、その記事がどこだったか思い出せなくてXXが何だったのかわからずじまい…。

BBCが効果音を無料公開

Twitterの視覚障害者支援機能


つっつきボイス: 「alt属性を入れられるみたいな感じ?」

HackerRankの2018年スキルアンケート結果

恐ろしいぐらい凝りに凝ったビジュアル表示です。デザイナーにも眺めて欲しい感じです。


research.hackerrank.comより

次に学びたい言語の5位がRubyでした。


research.hackerrank.comより


つっつきボイス: 「Rが意外に高い??今からR学びたい人ってデータ解析やる人しかいないだろうなー」「Juliaが意外に低い」「見ようによってはそれほど差がないという気もしますね」「Rは昔ちょっと使ったなー: チャートを描くときとか」「3分ぐらいなら触ったことありました」

皆さんのGDPR対策は大丈夫?

参考: EU一般データ保護規則 - Wikipedia

その他のその他


同記事より


参考: インパクトファクター - Wikipedia



つっつきボイス: 「うん、これはもう既に普通というか当然ですね: 巷で流れてくるAIとか機械学習とかビッグデータとか言ってるやつはだいたいビッグデータじゃないし、フィルタでできることをやってるという感じ」「本当に機械学習が必要なのって、たとえばこのデータから何が取れるのかわからん、みたいなものだろうし」「私将棋に暗いんで知りませんでしたが、この山本一成さんって将棋AIのすごい人なんですね」「山本さんはもう超有名っす」「むちゃくちゃ有名っすね: Turing Complete FMの文字コードの回でも言ってた、あの逆さまの将棋フォント作っちゃった人↓」

参考: フォントはフォントに大事|山本 一成@Ponanza|note


番外

和で評価するか調和平均で評価するか


scrapbox.io/nishioより

参考: 調和平均 - Wikipedia

徹夜が身体に良くない理由


つっつきボイス: 「このあたりはねー、個人差あるっしょ」

ミクロ2題


sciencealert.comより


World of Tanksの戦車リサーチはガチ

現在,我々の会社には2200人の社員がいて,そのなかにはフルタイムで戦車の歴史的研究をしている社員が12人います。図書館や美術館は基本ですが,ロシアの各地には日本の戦車が残っています。遺棄された戦車を実際に調べにも行きました。
同記事より


つっつきボイス: 「ちょwwこれw」「フルタイム、12人ってw」「下手すると日本の研究者より詳しいぞこれ!」
「なんかこう、アサシン クリード オリジンズの最近出たエジプト編みたいなやつで、発見されたばかりのピラミッドの部屋が当然のようにゲームに速攻実装されてたみたいな世界ですね」「何それ~」「それむしろ実装しなかったら悔しくて夜も眠れないんじゃ」

参考: 『アサシン クリード オリジンズ』には、先週発見された「ピラミッド内の謎の巨大空間」がすでに実装されていた?隠し部屋が確認される | AUTOMATON

超精密かつ斬新なリズム

この方々の体内クロックは、一番細かい音符の少なくとも2倍速はあります(インドやアラビアやアフリカやラテンの音楽ならまったく平常運転)。体内での分周によって8分音符や4分音符といったパルスを得て、それを出力しています。
より振動数の高い内部クロックを体内で分周することで、音符の長さに関わらずテンポが極めて安定します。

このあたり、気が向いたらポエム記事にしようと思います。


今週は以上です。皆さまよいゴールデンウィークを!

Twitterより

バックナンバー(2018年度)

週刊Railsウォッチ(20180420)NGINX Unit正式リリース、Rubyをメモリリークさせてみる、美しいコード宇宙ほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

Frontend Focus

frontendfocus_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ