週刊Railsウォッチ(20180112)update_attributeが修正、ぼっち演算子`&.`は`Object#try`より高速、今年のRubyカンファレンス情報ほか

こんにちは、hachi8833です。インフルエンザA型が身に沁みました。

2018年最初のウォッチ、いってみましょう。年末年始を挟んでだいぶ記事がたまっているのでいつもより多めです。

Rails: 今週の改修

Ruby 2.5をCIに追加

まずは縁起物コミットから。

# travis.yml
   - 2.2.8
   - 2.3.5
   - 2.4.2
+  - 2.5.0
   - ruby-head

 matrix:
   include:
-    - rvm: 2.4.2
+    - rvm: 2.5.0

PostgreSQLでbulk_change_tableをサポート

MySQLでは以前からbulk: trueが使えるそうです。

# activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#367
+        def bulk_change_table(table_name, operations)
+          sql_fragments = []
+          non_combinable_operations = []
+
+          operations.each do |command, args|
+            table, arguments = args.shift, args
+            method = :"#{command}_for_alter"
+
+            if respond_to?(method, true)
+              sqls, procs = Array(send(method, table, *arguments)).partition { |v| v.is_a?(String) }
+              sql_fragments << sqls
+              non_combinable_operations << procs if procs.present?
+            else
+              execute "ALTER TABLE #{quote_table_name(table_name)} #{sql_fragments.join(", ")}" unless sql_fragments.empty?
+              non_combinable_operations.each(&:call)
+              sql_fragments = []
+              non_combinable_operations = []
+              send(command, table, *arguments)
+            end
+          end
+
+          execute "ALTER TABLE #{quote_table_name(table_name)} #{sql_fragments.join(", ")}" unless sql_fragments.empty?
+          non_combinable_operations.each(&:call)
+        end

MiniMagickでcombine_optionsをサポート

# activestorage/app/models/active_storage/variation.rb#48
   def transform(image)
-    transformations.each do |method, argument|
-      image.mogrify do |command|
-        if eligible_argument?(argument)
-          command.public_send(method, argument)
-        else
-          command.public_send(method)
+    transformations.each do |(method, argument)|
+      if method.to_s == "combine_options"
+        image.combine_options do |combination|
+          argument.each do |(method, argument)|
+            pass_transform_argument(combination, method, argument)
+          end
         end
+      else
+        pass_transform_argument(image, method, argument)
       end
     end
   end

つっつきボイス: 「MiniMagickが好きと聞いて」「好きというほどではw: ImageMagickに比べればマシかなぐらい」

[Rails] MiniMagickでPDFのページ数を取得するときはフォントエラーに注意!

PostgreSQLのrange typeでFloat::INFINITYをサポート

rangeが空文字列にならないようFloat::INFINITYに型変換するようになりました。

# activerecord/test/cases/adapters/postgresql/range_test.rb#361
+    def test_infinity_values
+      PostgresqlRange.create!(int4_range: 1..Float::INFINITY,
+                              int8_range: -Float::INFINITY..0,
+                              float_range: -Float::INFINITY..Float::INFINITY)
+
+      record = PostgresqlRange.first
+
+      assert_equal(1...Float::INFINITY, record.int4_range)
+      assert_equal(-Float::INFINITY...1, record.int8_range)
+      assert_equal(-Float::INFINITY...Float::INFINITY, record.float_range)
+    end

つっつきボイス: 「PostgreSQLのrangeって無限が使えるのか」「無限こわい」

参考: PG10マニュアル: 8.17.4. Infinite (Unbounded) Ranges

()[]を使い分けるんですね(開区間と閉区間)。Lintに怒られそう。

(lower-bound,upper-bound)
(lower-bound,upper-bound]
[lower-bound,upper-bound)
[lower-bound,upper-bound]
empty

逆関連付けで外部キーが更新されていなかったのを修正

# activerecord/test/cases/associations/has_many_associations_test.rb#2512
+  test "reattach to new objects replaces inverse association and foreign key" do
+    bulb = Bulb.create!(car: Car.create!)
+    assert bulb.car_id
+    car = Car.new
+    car.bulbs << bulb
+    assert_equal car, bulb.car
+    assert_nil bulb.car_id
+  end

つっつきボイス: 「inverse association、この間案件に出てきたナ」「逆関連付け、でいいのかな」

validationコールバックが複数コンテキストで発火しなくなったのを修正

#21069で実装されていたのがいつの間にか動かなくなっていたので修正されたそうです。

class Dog
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  attr_accessor :history

  def initialize
    @history = []
  end

  before_validation :set_before_validation_on_a, on: :a
  before_validation :set_before_validation_on_b, on: :b
  after_validation :set_after_validation_on_a, on: :a
  after_validation :set_after_validation_on_b, on: :b

  def set_before_validation_on_a; history << "before_validation on a"; end
  def set_before_validation_on_b; history << "before_validation on b"; end
  def set_after_validation_on_a;  history << "after_validation on a" ; end
  def set_after_validation_on_b;  history << "after_validation on b" ; end
end
d = Dog.new
d.valid?([:a, :b])
# 修正前
d.history #=> []
# 修正後
d.history #=> ["before_validation on a", "before_validation on b", "after_validation on a", "after_validation on b"]

つっつきボイス: 「やや、before/afterコールバックのon:オプションって初めて知ったけどこれは?」「on:はコンテキストを限定するのに使うやつですね: その条件が満たされるときだけコールバックされる」「なるほど~: if書きたくないマンにはうれしい機能」「条件が複雑になったらifで書かないと見落とすかもですね」

ActiveStorageで扱う添付ファイルの拡張子を追加

# activestorage/lib/active_storage/engine.rb
+    config.active_storage.content_types_to_serve_as_binary = [
+      "text/html",
+      "text/javascript",
+      "image/svg+xml",
+      "application/postscript",
+      "application/x-shockwave-flash",
+      "text/xml",
+      "application/xml",
+      "application/xhtml+xml"
+    ]

つっつきボイス: 「content dispositionって何でしたっけ」「ファイルをインラインで表示するかダウンロードダイアログを出すかの扱いっすね」「まさにコミットメッセージに書いてあった」

String.blank?のエンコーディングがUTF-16LEでエラーになるのを修正

ActiveSupportでStringクラスを開いて修正しています。

# activesupport/lib/active_support/core_ext/object/blank.rb#104
class String
   BLANK_RE = /\A[[:space:]]*\z/
+  ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
+    h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
+  end

つっつきボイス: 「UTF-16ってASCII互換じゃないしエンディアンとかBOMとかサロゲートペアとかいろいろ残念で残念で: これを標準にしちゃったWindowsって(略」「出たな文字コード厨w」

参考: Wikipedia-ja: UTF-16

属性が見つからない場合の挙動を修正

# activerecord/lib/active_record/attribute.rb#234
+        def forgetting_assignment
+          dup
+        end

つっつきボイス: 「dirty save周りの修正っすね」

#25503のupdate_attributeの挙動がついに修正

昨年末のRailsウォッチで言及した#25503 update_attribute ignores autosave relationsが2年越しでついに修正されました。

# activerecord/lib/active_record/persistence.rb#405
-      if has_changes_to_save?
-        save(validate: false)
-      else
-        true
-      end
+      save(validate: false)
      end

つっつきボイス: 「例のGobyちゃんの作者のst0012さんが、このバグが直ってないって昨年落ち込んでました」「おお!これが修正されたということは、例のQiitaの定番記事『ActiveRecord の attribute 更新方法まとめ』のupdate_attributeの記述↓も修正してもらわないと」


ActiveRecord の attribute 更新方法まとめより


Goby: Rubyライクな言語(1)Gobyを動かしてみる

Rails

Rails.application.routes.url_helpersを直接呼ぶと遅い

# 直接呼んだ場合
Requests per second:    55.08 [#/sec] (mean)
Time per request:       18.155 [ms] (mean)
# モジュールをクラスにincludeした場合
Requests per second:    117.09 [#/sec] (mean)
Time per request:       8.540 [ms] (mean)

issue #23451 Performance Regression using url_routerとそれを修正するPR#24554 Memoize the RouteSet#url_helpers moduleが前から上がっていますがまだmergeされていません。それまではinclude Rails.application.routes.url_helpersする方が速いそうです。

# app/whatever/url_helper.rb
class UrlHelper
  include Singleton
  include Rails.application.routes.url_helpers
end

Rails 5.2でMySQLの降順インデックスをサポート(RubyFlowより)

# 同記事より
create_table "reports", force: :cascade do |t|
  t.string "name"
  t.integer "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["user_id", "name"], name: "index_reports_on_user_id_and_name", order: { name: :desc }
end

Railsのsystem testをRSpecから使う

# 同記事より
require 'rails_helper'

describe 'Homepage' do
  before do
    driven_by :selenium_chrome_headless
  end

  it 'shows greeting' do
    visit root_url
    expect(page).to have_content 'Hello World'
  end
end

つっつきボイス: 「この間takanekoさんに教えてもらった@jnchitoさんの記事↓の方がたいてい詳しいんですが、一応」

whatson: 今後開催予定のRubyカンファレンスを一覧表示するgem

もともとRuby Conferences (& Camps) in 2018 – What’s Upcoming?をご紹介しようと思っていたのですが、リンク先がアドベントカレンダーのせいか今日になって消滅していて、その情報源であるこのgemを見つけました。
私はうれしいですがほぼ誰得なgemですね。

$ gem install whatson
$ rubyconf
Upcoming Ruby Conferences:

  in 14d  Ruby on Ice Conference, Fri-Sun Jan/26-28 (3d) @ Tegernsee, Bavaria (near Munich / München) › Germany / Deutschland (de) › Central Europe › Europe
  in 20d  RubyFuza, Thu-Sat Feb/1-3 (3d) @ Cape Town › South Africa (za) › Africa
  in 28d  RubyConf India, Fri+Sat Feb/9+10 (2d) @ Bengaluru › India (in) › Asia
  in 55d  RubyConf Australia, Thu+Fri Mar/8+9 (2d) @ Sydney › Australia (au) › Pacific / Oceania
  in 62d  RubyConf Philippines, Thu-Sat Mar/15-17 (3d) @ Manila › Philippines / Pilipinas (ph) › Asia
  in 63d  wroc_love.rb, Fri-Sun Mar/16-18 (3d) @ Wrocław › Poland (pl) › Central Europe › Europe
  in 69d  Bath Ruby Conference, Thu+Fri Mar/22+23 (2d) @ Bath, Somerset › England (en) › Western Europe › Europe
  in 95d  RailsConf, Tue-Thu Apr/17-19 (3d) @ Pittsburgh, Pennsylvania › United States (us) › North America › America
  in 105d  RubyConf Taiwan, Fri+Sat Apr/27+28 (2d) @ Taipei › Taiwan (tw) › Asia
  in 111d  Rubyhack: High Altitude Coding Konference, Thu+Fri May/3+4 (2d) @ Salt Lake City, Utah › Southwest › United States (us) › North America › America
  in 133d  Balkan Ruby Conference, Fri+Sat May/25+26 (2d) @ Sofia › Bulgaria (bg) › Eastern Europe › Europe
  in 139d  RubyKaigi, Thu-Sat May/31-Jun/2 (3d) @ Sendai › Japan (jp) › Asia
  in 161d  RubyConf Kenya, Fri Jun/22 (1d) @ Nairobi › Kenya (ke) › Africa
  in 167d  Paris.rb XXL Conf, Thu+Fri Jun/28+29 (2d) @ Paris › France (fr) › Western Europe › Europe
  in 175d  Brighton Ruby Conference, Fri Jul/6 (1d) @ Brighton, East Sussex › England (en) › Western Europe › Europe
  in 305d  RubyConf, Tue-Thu Nov/13-15 (3d) @ Los Angeles, California › United States (us) › North America › America

    More @ github.com/planetruby/awesome-events

ついでに、元サイトがhttp://planetruby.herokuapp.com/というRuby情報クローラ的なサイトになっていました。

今年のリストでは、アフリカ大陸(南アフリカ共和国とケニア)でRubyカンファレンスが開催されるのが目につきました。ケニアのはその名もrubyconf.nairuby.orgです。ナイルビー。


http://rubyconf.nairuby.org/2018より

Rails公式ニュースにも掲載されている情報ですが、今年4月開催のピッツバーグのRailsカンファレンスCFPを募集だそうです(CFP: Call for Proposal)。


つっつきボイス:Bath Ruby Conferenceって何だ?っと思ったら、Bathはイギリスの地名なんだそうです」「水上温泉みたいな?」

Rails 5.2のdeprecation情報

ほとんど走り書きなので、5.2.0リリースまでに別途まとめようと思います。

「巨大なプルリク1件と細かいプルリク100件どっちがまし?」を考える(Hacklinesより)

今回たまたま見つけたHacklinesというRuby情報クローラが面白かったのでそこからいくつか記事を拾いました。


つっつきボイス: 「元記事にも貼られているこれほんに↓」「巨大なのがhorse-sizedで、こまいのがduck-sizedということみたいです」「コミットの粒度ってほんと悩みますね」「読まされるレビュアーの立場で考えるしかないかなー」

アセットのプリコンパイルを高速化するには(Hacklinesより)

「CDNを使う」「@importrequire_tree .を避ける」などの地道な方法が紹介されています。

マイグレーションを実行せずにSQLクエリを見たい(Hacklinesより)

同記事で、#31630 Allow to run migrations in check mode (dry run)というつい最近のPRが紹介されています。まだmergeされていません。


つっつきボイス: 「マイグレーションのdry run、たまに欲しくなりますよね」

ぼっち演算子&.の方がObject#tryよりずっと高速(Hacklinesより)

ベンチマークコードと結果はGistにあります。

#同Gistより
       user     system      total        real
      check for nil:  0.040000   0.000000   0.040000 (  0.040230)
   check respond_to:  0.100000   0.000000   0.100000 (  0.101780)
             rescue:  2.080000   0.020000   2.100000 (  2.103482)
 active_support try:  0.150000   0.000000   0.150000 (  0.151765)
    safe navigation:  0.040000   0.000000   0.040000 (  0.040369)

つっつきボイス: 「safe navigation operatorってぼっち演算子のことなのね」「後者はRubyでの俗称というかあだ名っぽいですね」
「ところでぼっち演算子って.&&.のどっちでしたっけw」「わかるーw: ワイもよく迷う」
「そういえばtry!ってどう違うんだったかな」「この記事↓翻訳したときにbabaさんに教えてもらったのを末尾に追加してあります: 『ぼっち演算子が#try!と少し異なるのは、引数付きだとnilのときに引数が評価されないという点です。』」「引数があるかどうかで違う、と」

Railsの`Object#try`がダメな理由と効果的な代替手段(翻訳)

追伸: 体操座りしながら指でいじいじしている形で覚えるとよいそうです。

belongs_to関連付けクエリのリファクタリング(RubyFlowより)

「ここではスコープよりクラスメソッドの方が自分にはわかりやすかったから」だそうです。

# 同記事より
class Job < ActiveRecord::Base
  belongs_to :category

  def self.publishable
    joins(:category).merge(Category.publishable)
  end
end

Job.publishable

他にEncapsulating queries in a Rails Modelという記事もありました。


つっつきボイス: 「スコープかクラスメソッドか」「scopeは最後のリファクタでそれっぽければやればいい気がする: デフォルトはclassメソッドでいーんじゃないかな?」

マイクロサービスはチームを苦しめる(Hacklinesより)


つっつきボイス: 「記事にあったコンウェイの法則ってこれですね↓」「うんうん、官僚組織のシステムはやっぱり官僚っぽい設計になるし」

Conwayの法則とは,“組織の設計するシステムには … その組織のコミュニケーション構造をそのまま反映した設計になるという制約がある”,というものだ。つまり,チームの開発成果がその組織の内部的なコミュニケーションのあり方によって決まる,という意味である。
Conwayの法則に従った組織の成長より

参考: クックパッドとマイクロサービス — Conwayの法則に言及しています

「ところでコンウェイっていうとライフゲームの英語名Conway’s Game of Lifeを思い出しちゃいます(年バレ!)」

flag_shih_tzu: Integerカラムにビットパターンでフラグを追加するgem(Hacklinesより)

# 同記事より
class Spaceship < ActiveRecord::Base
  include FlagShihTzu

  has_flags 1 => :warpdrive,
            2 => :shields,
            3 => :electrolytes
end

shih tzuって何だろうと思ったら、中国産の犬種「西施犬」のようです。フラグとどう関連するのかは謎です。

ついでに、元記事タイトルは「博士の異常な愛情 または私は如何にして心配するのを止めて水爆を愛するようになったか」のもじりですね。

Ruby trunkより

早くもRubyに大量のコミット

PB memoさんのRubyコミット日記です。年明け早々に追いきれないほどのコミット大漁節です。


つっつきボイス: 「みんな冬休み取ったー?w」

そういえば以下の記事で、今後Rubyのリリース日が前倒しになるかもしれないという構想が語られていました。

また、クリスマスリリースはプレゼントという意味があるものの、家族を持つコミッターが増えてきたため、「少し前の22日や23日にしたほうがよいかもしれない」と語った。

Integer#powの法(modulo)が巨大な場合の結果がおかしい->修正

以下は12が正しいそうです。

irb(main):020:0> 12.pow(1, 10000000000)
=> 1
irb(main):021:0> 12.pow(1, 10000000001)
=> 1
irb(main):022:0> 12.pow(1, 10000000002)
=> 1

beginなしでdo-endブロックでrescue

1年前の変更なので2.5には反映済みです。

lambda do
  begin  #<= これがなくてもいいようになった
    raise 'err'
  rescue
    $! # => #<RuntimeError: err>
  end
end.call

つっつきボイス: 「自分もこのbeginなくていいと思う」「matzがためらいがちにacceptしてました↓」

Although I am not a big fan of this syntax, mostly because I don’t like fine grain exception handling.
But I found out many developers prefer the syntax. After some consideration, I decided to accept this.

SymbolとStringの違いに関するRDocを追加

/* 定数名、メソッド名、変数名はシンボルとして返される
*
*     module One
*       Two = 2
*       def three; 3 end
*       @four = 4
*       @@five = 5
*       $six = 6
*     end
*     seven = 7
*
*     One.constants
*     # => [:Two]
*     One.instance_methods(true)
*     # => [:three]
*     One.instance_variables
*     # => [:@four]
*     One.class_variables
*     # => [:@@five]
*     global_variables.last
*     # => :$six
*     local_variables
*     # => [:seven]
*
* Symbolオブジェクトは識別子を表す点がStringオブジェクトと異なる
* Stringオブジェクトはテキストやデータを表す
*/

つっつきボイス: 「この間この記事↓を公開した後の変更なので取り上げてみました」


Rubyのシンボルをなくせるか考えてみた(翻訳)

Ruby

Fukuoka Ruby Awardエントリー募集(1/31まで)(Ruby公式ニュースより)


www.ruby-lang.orgより

Ruby 3とJIT(Ruby Weeklyより)

Noah Gibbsさんの記事です。Optcarrotがoptimized modeで相当速くなっています。


engineering.appfolio.comより

Ruby 2.5のベンチマーク取ってみた

HexaPDFを使っています。


gettalong.orgより

Kernel#itselfにRubyの美学を見た

短い記事です。

# 同記事より
collection.each_with_object({}) { |item, accum| accum[item] = accum[item].to_i + 1 }
# ↓ここまで簡潔に書ける
collection.group_by(&:itself).transform_values(&:count)

RubyにCコード書いてメモリ共有してみた

# 同記事より
require 'inline'
class CHello
  inline do |builder|
    builder.include '<stdio.h>'
    builder.c 'int sumThem() {
      return 2 + 2;
    }'
  end
end

>> CHello.new.sumThem #=> 4

つっつきボイス: 「RubyコードにまるっとCのコードがインラインで埋まっているんですよね」「これマジ凄くない?C拡張より楽チンそう」「rubyinlineでできるみたいです」「メモリ共有にはFiddle::Pointerを使ってるそうです」

「この記事にはネタ画像がいくつか埋まってるんですが、その中でもこれ↓: シャイニングっていう昔のくっそ怖い映画の一番有名なシーンなんですが」「なんか見たことあるっちゃある感じ」


blog.rebased.plより

「この『Here’s Johnny!!』っていうセリフは、実はこの場面までの緊張感を一発で台無しにする、英語圏のこの年代の人じゃないとわからないずっこけネタなんですね」「Tonight Showという米国の長寿テレビ番組のオープニングで司会者が必ず言うセリフなんですが、日本に置き換えるとさしずめ『サザエでございま~す』とか『ぼーくドラえもん』っていう感じ: そこでそれ言うか!みたいな」

JRubyより速い


つっつきボイス: 「今見てみると2.5ががくっと遅くなってますね」「何かつっかえてるのかな?」

卜部さんの「HashDoS脆弱性との戦い」

Ruby実装の命名の由来

これもNoah Gibbsさんの記事です。

RubyBench: RubyやRailsのベンチマークサイト


rubybench.orgより


つっつきボイス:https://speed.python.org/みたいなのがRubyにもないかなと思って探したら見つかりました: 相当細かくベンチ取ってくれて楽しい」


rubybench.orgより

Ruby開発者のための5つの習慣(Ruby Weeklyより)


  1. RuboCopはいつどんなときでもかけろ
  2. git historyを汚すな
  3. お遊びプロジェクトを立ち上げてみろ
  4. Railsのソースコードを読め
  5. Railsガイドを「もう一度」読め

つっつきボイス: 「5…」「5…」

unlessのご利用は控えめに(Hacklinesより)

# 元記事より
# Example 1
unless something?
  # do something
else
  # do other thing
end

# Example 2
unless something? || another_thing?
  # do something
end

つっつきボイス:unless自体はいいけど確かにelseと一緒に使うとか勘弁w」

RubyとPythonのmixinを比較する(Hacklinesより)

みっちり長い記事です。

# 同記事より
class RunnerMixin:
    def max_speed(self):
        return 4


class SortaFastHero(RunnerMixin):
    """This hero can run, which is better than walking."""
    pass


class SortaFastMonster(RunnerMixin):
    """This monster can run, so watch out!"""
    pass

つっつきボイス:endがないと、どうもパンツはき忘れたような気持ちになってw」「Pythonコードってブラウザからコピペしたはずみでインデント消えちゃったり」「それはコピペするなということかも」

地味すぎて誰も気がついていないCRuby 2.5の新機能

mruby/c1.1 RC2リリース

  • Procクラスの実装
  • sprintfメソッドの実装
  • .classメソッドの実装
  • RangeObjectのリファレンスカウント対応
  • StringObjectのバグ修正
  • 重複した数値処理の排除
  • Rubyによるクラスの定義とインスタンスメソッドの定義を実装

各種言語のハッシュマップ実装を比較

  • Python
  • Ruby
  • Java
  • Scala
  • Golang
  • C#
  • C++

この記事のサイドバーにあったNo Magic: Regular Expressionsという記事もつい気になってしまいました。

Graphql-batchとPromise.rb

Graphql-batchはShopifyのリポジトリですね。内部でPromise.rbを使っているそうです。


つっつきボイス: 「↓こんな感じでRubyでPromiseできるみたいです」

# lgierth/promise.rbより
require 'promise'

Promise.new
  .tap(&:fulfill)
  .then { Promise.new.tap(&:fulfill) }
  .then { Promise.new.tap(&:reject) }
  .then(nil, proc { |reason| p reason })

JavaScript: 5分でわかるPromiseの基礎(翻訳)

asakusa.rb新年会

現時点でまだ空席あるようです。

KitchenCI: 複数プラットフォームをサポートするCIサービス


kitchen.ciより

driver:
  name: vagrant

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-14.04
  - name: windows-2012r2

suites:
  - name: client
    run_list:
      - recipe[postgresql::client]
  - name: server
    run_list:
      - recipe[postgresql::server]

Chefが前提のようです。

SQL

DB設計カタログサイト


つっつきボイス: 「確かにこれ凄い!」「医療とかホテルとか、よくここまで集めた」「実用に即したDB設計ってなかなか見る機会ないですよね」

PostgreSQLが「DBMS of the year 2017」に輝く(Postgres Weeklyより)

https://db-engines.com/en/rankingというランキングサイトを元にしています。


db-engines.comより


つっつきボイス: 「MongoDBとかってDBMSなんですかね?」

JavaScript

面接で聞かれるES6理論クイズ10問(解答付き)

500人以上の技術面接で使われた問題だそうです。

  1. JavaScriptのスコープを説明し、スコープの例を知っている限り列挙せよ(6点)
  2. ホイスティングを例を挙げて説明せよ(6点)
  3. prototypeの役割を例を挙げて説明せよ(6点)
  4. 3の例を拡張してprototypeの継承を説明せよ(5点)
  5. 3の例をES6構文で書き直せ(6点)
  6. thisの値を説明せよ(6点)
  7. コンテキストバインディングを例を挙げて説明せよ(3点)
  8. =====の一般的な違いを説明せよ(6点)
  9. 変数がarrayかどうかをチェックする方法を述べよ(3点)
  10. 以下のコードのどこがおかしいかを説明し、修正せよ(4点)
if ( typeof x === 'object' ) {
    x.visited = true;
}

rearmed-js: JavaScriptのArrayなどをRuby風に書けるライブラリ

// westonganger/rearmed-jsより
var array = [];
var cb = function(val, i){ };
array.any(cb=null) // returns bool
array.all(cb=null) // returns bool
array.compact(badValues=[null, undefined, '']) // returns array, accepts array or splat arguments  
array.dig(*args) // returns value, accepts splat arguments or array
array.each(function(val, i){ })
...

Sinon.js: JavaScriptでmockやstubを使うライブラリ

テスティングフレームワークに依存しないそうです。

// sinonjs.orgより
it("returns the return value from the original function", function () {
    var callback = sinon.stub().returns(42);
    var proxy = once(callback);

    assert.equals(proxy(), 42);
});

NectarJS: JSコードをネイティブバイナリにコンパイル(JavaScript Liveより)

WebAssemblyにも対応しているそうです。

via GIPHY

JavaScriptオブジェクトのrest/spreadプロパティ(JavaScript Liveより)

// 同記事より
const style = {  
  width: 300,
  marginLeft: 10,
  marginRight: 30
};

const { width, ...margin } = style;

console.log(width);  // => 300  
console.log(margin); // => { marginLeft: 10, marginRight: 30 }  

JavaScriptのhoistingを理解する(JavaScript Liveより)


medium.com/@thamizhchelvan2005より

JavaScriptの「obfuscation」とは何か(JavaScript Liveより)

obfuscationは、いわゆるminifyやuglifyより徹底的に変換をかけています。

// 同記事より
function hello(name) {
console.log('Hello, ' + name);
}
hello('New user');

// obfuscation後
eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d=k||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k)}}return p}('3 0(1){2.4(\'5, \'+1)}0(\'7 6\');',8,8,'hello|name|console|function|log|Hello|user|New'.split('|'),0,{}))

tui.editor: 表やグラフも扱えるMarkdownエディタ(JavaScript Liveより)

表やUML図などを直接扱えるようです。


nhnent/tui.editorより

CSS/HTML/フロントエンド

HTML 5.2の新着情報とポイント(jser.infoより)


  • <dialog>要素
  • Apple製品でのアイコン表示改善
  • <main>要素を複数持てる
  • <body>タグ内にも<style>を書ける(ただしパフォーマンス上おすすめしない)
  • <legend>タグ内に見出しタグを置ける
  • 廃止: keygenmenumenuitem、厳密なDOCTYPE
  • etc

CSSの:notセレクタを導入


つっつきボイス::notときどき使いますヨ: 繰り返し要素の最後のところだけ区切り線入れたくないときとか便利」「そうそう、これないと不便」

その他

技術トークの5つのコツ


reverentgeek.comより

  • その技術を選んだ理由を話す
  • その技術で何ができるかを話す
  • どうやったら動いたかをデモする(しくじったポイントも入れよう)
  • 参考リンクを忘れずに
  • マイクはないものと思え

meltdown: メルトダウン脆弱性の実演コード(GitHub Trendingより)

今旬のネタだけあって、10日ほどで★2400超えです。

これマジで?


つっつきボイス: 「ダチョウ倶楽部」

Go 1.10 Beta2リリース

番外

闇深そうなフォントかるた

ケンブリッジ大学の脳力測定サイト

いわゆる脳トレ的なやつです。

成功の秘訣は「大学の町の近くで育つこと」?

日本語記事: 元グーグルのデータサイエンティストが発見! 成功者の意外な共通点とは

340刷

ロシアのサーバールームお祓い事情


つっつきボイス: 「サーバールームで水撒くか普通…」

AIで転職情報を勝手にかき集めるのは…


つっつきボイス: 「この人に目をつけられたらもう逃げられないっすね」

闇落ち以外のパターンが思いつかない


今週は以上です。

バックナンバー(2017年後半)

週刊Railsウォッチ(20171222)定番gemまとめサイト、active_record-mtiでテーブル継承、PostgreSQL 10の非互換変更点、Railsガイド攻略法ほか

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

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

Awesome Ruby

RubyFlow

160928_1638_XvIP4h

Postgres Weekly

postgres_weekly_banner

Frontend Weekly

frontendweekly_banner_captured

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

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

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ