週刊Railsウォッチ(20180216)Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか

こんにちは、hachi8833です。先週はつっつき会が時間オーバーしてしまいましたが、今週は何とか収まりました。

臨時ニュース

Rails 5.1.5リリース


weblog.rubyonrails.orgより

マイナーリリースなのでバグ修正/セキュリティ対応が中心です。

ウォッチの社内つっつきを始めた直後にtakanekoさんに教えてもらうまでリリースに気づいてませんでした。ありがとうございます。
変更があったChangelogだけリストアップします。

Rails: 今週の改修

5-2-stableが頻繁かつ細かく更新されていて、リリースが迫っていることを感じます。
以下はRails 6.0.0.alphaであるmasterから見繕いました。

新メソッド: Relation#pick

DHH自らのコミットです。

現在のリレーションでその名前付きカラムの最初の値をpickする。relation.limit(1).pluck(column_name).firstのショートハンドであり、リレーションが既に1行まで絞り込まれているときに主に有用。
#pluckと同様、#pickもレコードオブジェクト全体ではなく実際の値だけを読み込むので、こちらも効率がよくなる。値がそのカラム型にキャストされる点もpluckと同様。

# PRより
  Person.where(id: 1).pick(:name)
  # SELECT people.name FROM people WHERE id = 1 LIMIT 1
  # => 'David'
# activerecord/lib/active_record/relation/calculations.rb#L217
+    def pick(*column_names)
+      limit(1).pluck(*column_names).first
+    end

つっつきボイス:pluckってlazyじゃないんだっけ?」「じゃないですね」「あー、だからこれが欲しかったのか: 気持ちはワカル」

新メソッド: #create_or_find_by

こちらもDHH。#find_or_create_byと違い、DBのunique制約が効くそうです。

# activerecord/lib/active_record/relation.rb#L188
+    def create_or_find_by(attributes, &block)
+      transaction(requires_new: true) { create(attributes, &block) }
+    rescue ActiveRecord::RecordNotUnique
+      find_by!(attributes)
+    end
+
+    # Like #create_or_find_by, but calls
+    # {create!}[rdoc-ref:Persistence::ClassMethods#create!] so an exception
+    # is raised if the created record is invalid.
+    def create_or_find_by!(attributes, &block)
+      transaction(requires_new: true) { create!(attributes, &block) }
+    rescue ActiveRecord::RecordNotUnique
+      find_by!(attributes)
+    end

つっつきボイス:#find_or_create_byじゃなくて#create_or_find_by…だと?」「unique制約ではじきながらcreateして、できなければfindする、みたいな流れか」「それにしても名前が紛らわしい…タイポかとおもた」「コードレビューで『これ間違いじゃ?』とか言われそうな予感」「#create_or_find_byはテーブルをロックするから安全な分状況によってはパフォーマンス落ちそうだなー」「登場して間もないし、Rails6向けだろうから、まだまだ議論されそうですね」

concernインクルード時のクラス名衝突を回避

# activestorage/app/models/active_storage/blob.rb
 class ActiveStorage::Blob < ActiveRecord::Base
-  include Analyzable, Identifiable, Representable
+  include ActiveStorage::Blob::Analyzable
+  include ActiveStorage::Blob::Identifiable
+  include ActiveStorage::Blob::Representable

   self.table_name = "active_storage_blobs"

つっつきボイス:includeのモジュールをこうやってカンマ区切りするの見たことなかった」「スタイルガイドではダメだった気がします」

Rubyスタイルガイドを読む: クラスとモジュール(1)構造

修正: RAILS_MASTER_KEY環境変数がある場合にmaster keyを追加しないようになった

# railties/lib/rails/commands/credentials/credentials_command.rb#L22
         ensure_editor_available(command: "bin/rails credentials:edit") || (return)
-        ensure_master_key_has_been_added
+        ensure_master_key_has_been_added if Rails.application.credentials.key.nil?
         ensure_credentials_have_been_added

blob.service_urlのオプションを修正

# activestorage/app/models/active_storage/blob.rb#L112
-  def service_url(expires_in: service.url_expires_in, disposition: :inline, filename: self.filename, **options)
+  def service_url(expires_in: service.url_expires_in, disposition: :inline, filename: nil, **options)
+    filename = ActiveStorage::Filename.wrap(filename || self.filename)
+
     service.url key, expires_in: expires_in, filename: filename, content_type: content_type,
       disposition: forcibly_serve_as_binary? ? :attachment : disposition, **options
   end

Rails

Rails 5.2にアップグレードするときはActiveRecord::DirtyのAPI変更に注意(RubyFlowより)

オブジェクトをsaveした後やafter_saveの中では今後以下のようにしなければならない:
* attribute_changed?ではなくsaved_change_to_attribute?にする
* changed?ではなくsaved_changes?
* changesではなくsaved_changes
* previous_changesは挙動が変わるので置き換え先はなし


つっつきボイス: 「saveした後の挙動が変わるのか」「気をつけなきゃ」

🌟DHH自ら解説するコールバックの使い所(RubyFlowより)🌟


つっつきボイス: 「お、DHHもついにゆーちゅーばーか」「まさか毎日出すとか?」「これすごくいいじゃない!」「みんなでdhhをchannel登録しよう!」「これ今夜見よう、マジで」

ついでにDHHのレーシング動画も眺めたりしました。

「どれがDHHかな?」「自分で走ってるんですね: 馬主とかじゃナカッタ」

今週の⭐を進呈いたします。おめでとうございます。
DHHのチャンネル登録はこちらでどうぞ。

翌日: 「DHHのYoutubeチャンネルのPilot Episode見たら、おしまいのあたりでまさにさっきのcreate_or_find_byの使い方説明してました」

RailsのServiceレイヤをモック化してテストする(RubyFlowより)

# 同記事より
class Web::UserLogin
  attr_reader :omniauth_data, :team_id

  def initialize(omniauth_data, team_id)
    @omniauth_data = omniauth_data
    @team_id = team_id
  end

  def self.call(omniauth_data, team_id)
    new(omniauth_data, team_id).call
  end

  def call
    ...
  end
end

つっつきボイス: 「うん、普通のService Objectとそのテスト: 特別なことはしてないっすね」「このService Objectは薄いFacadeみたいなもので単体のビジネスロジックだから、テストの書き方で悩むことは普通ないと思うし、書きにくいとしたらそのService Objectはたぶんおかしい」「どこまでモックで塞ぐかというのはありますけどね」

Railsで重要なパターンpart 1: Service Object(翻訳)

オブジェクトの責務を見直す(Hacklinesより)

# 同記事より
class TicketBuilder
  def create(event, customer, seat)
    if customer.vip?
      Ticket.create_backstage_pass(event)
    else if seat
      Ticket.create_assigned_seat(event, seat)
    else
      Ticket.create_general_admission(event)
    end
  end
end

つっつきボイス: 「責務をこうやってちゃんと取り扱えるようになると、どんなテストコードを書けばいいかもはっきりしますね」「まさにドメイン設計の話」「これは翻訳したい」

FactoryBotのcreatebuildbuild_stubbed

短い記事です。


つっつきボイス:createbuildはよく使う」「build_stubbedはデータベースに書き込まないのか」「最近社内勉強会でやっているエンタープライズ・アーキテクチャの話で言うと、ドメインモデル内に閉じたテストではデータベースに書き込む必要が本来ないからこうやってスタブ使えますね: その方がテスト速いし」
「ところでまだFactoryGirlかっこBotって書いてる」「名前変わったの昨年だからもうBotでいいのに」
「そういえば、この間から始めたRails中級チュートリアルも原文がFactoryGirlだったんで、実機で動かしながらFactoryBotに書き換えてます」

RailsでPostgreSQLの条件付きunique indexを使う(Ruby Weeklyより)

短い記事です。

CREATE UNIQUE INDEX unique_user_role_in_project ON users (project_id, role) WHERE role = 0;

つっつきボイス: 「conditional unique index…だと?w」「さすがPostgreSQL: こういうのもRDBMS側で用意されてる」「ポスグレなら何でもあるヨ!: 思い付いた機能はたいてい入ってて、その気になればアプリ書けるレベル」

そういえばこの間見かけたツイートで、あるツールを調べていたらHTMLレンダリングのコードがどこにも見当たらなくて、もしやと思って調べたらPostgreSQLが直接HTMLを吐いててのけぞったという話を見かけました。どこだったかな…

Skylight.ioがオープンソースプロジェクト向けに無料サービスを提供開始(Awesome Rubyより)


skylight.ioより


つっつきボイス:NewRelic的なサービスか: これは初めて見たけど」「プレスリリースを見てみると、オープンソースのプロジェクトには無料で提供するよって書いてる: JetBrainsとかもこういう企画やってますね」「あ、Skylightそのものがオープンソースになったわけじゃなかったか: 失礼しましたー」
サンプルサイトの画面↓をざっと見た感じでもよさそうだし、本当にオープンソースだったら社内の強力ハイエンドサーバーにSkylightサーバー立てたいところ」「NewRelicはとてもいいんだけど何しろ高い…」


同サンプルサイトより

Railsアンチパターン記事2本

2本とも古めの記事ですが。


craftingruby.comより

# 元記事1より
class CommitDecorator < Draper::Decorator
  delegate_all

  def author_link
    h.link_to(author.name, h.profile_path(author.username))
  end

  def parent_link
    h.link_to(parent.truncated_sha, h.project_commit_path(project, parent.sha))
  end

  def diff_stats
    h.t('commits.show.diff_stats_html',
        changed: diffs.count,
        additions: diffs.sum(&:additions),
        deletions: diffs.sum(&:deletions))
  end

  def file_changes
    diffs.map do |diff|
      DiffLine.new(
        status_class_for(diff), diff.path, diff.additions, diff.deletions)
    end
  end

  private

  DiffLine = Struct.new(:status_class, :path, :additions, :deletions)

  def status_class_for(diff)
    if diff.deleted?
      'deletion'
    elsif diff.added?
      'addition'
    else
      'change'
    end
  end
end

つっつきボイス: 「まあDecoratorがファットなのはどこかおかしいかも: 自分はDecorator普段使ってないし、ヘルパーでやるのが好みかな」「ワイはヘルパー嫌いマン」「このCrafting Rubyの記事はなかなかよさそうなんですが、近年の更新頻度がさみしい感じで残念です」

# 同記事2より
class Person < ActiveRecord::Base
  enum gender: { male: 1, female: 2 }

  scope :male,        -> { where(gender: 1) }
  scope :adult,       -> { where('age >= 18') }
  scope :left_handed, -> { where(right_handed: false) }

  class << self
    def left_handed_male_adults
      left_handed.male.adult
    end
  end
end

class PeopleController < ApplicationController
  def index
    @people = Person.left_handed_male_adults

    respond_to(:html)
  end
end

「お、2本目の記事のこの書き方↑わかりやすくていいじゃないですか: scopeに複雑なchained scopeを書くんじゃなくて、小さいスコープをいくつか作ってそれをクラスメソッドの方でチェインして組み立てる」「自分もつい複雑なスコープ書いちゃったりすることがあるけど、この整理法はなるほどという感じ」「画期的とかじゃないけどいぶし銀の魅力を放つ書き方」「慣れている人ならこのコード見た瞬間に納得するはず」

Ruby trunkより

シンボリックリンクに対するrequirerequire_relativeの挙動の違いを修正


つっつきボイス:requireはとても広いスコープから拾ってくるからねー」「Ruby実行時の引数で挙動変わる可能性もあるからrequire_relativeの方がセーフっちゃセーフかな」「まあDockerコンテナで動かす分にはそこまで気にしなくてもいいかもしれないけど」

Arrayにsame_all?的なものが欲しい

# これをもっと効率よく書きたい
ary.all? {|e| e.foo == ary[0].foo }

つっつきボイス: 「こういう単純な比較ならsame_all?ができたときに並列性の高い環境で爆速で動きそう」

frozen_string_literal: trueを含むファイルを読み込んだときにfreezeしないことがある

$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'frozen'

puts frozen.object_id
puts frozen.object_id
# frozen_string_literal: true

A = "a"
def frozen
  -"#{A}" # このマイナス記号があるとfreezeしない
end
x = "#{1}".freeze
# this is always properly de-duped
x = -+x # こうすると回避できる

つっつきボイス: 「へー、よく見つけたなコレ」「バグだ」「バグですね」

Ruby

論文:「Refinement Types for Ruby」(Ruby Weeklyより)


同PDFより


つっつきボイス: 「ガチ論文!!!」「今ちょっと読み切れない」「論文のURLを見るとPOPLというシンポジウムのVMCAIというカンファレンスに出したものですね: このPOPLはSIGPLANがやってるのでかなりちゃんとしてるはず」「査読に通らないと出られないようなカンファレンスかも」「Verification, Model Checking, and Abstract Interpretationというタイトルに圧倒されるー」


popl18.sigplan.org/track/VMCAI-2018より

その後学術系のさまざまな組織についてmorimorihogeさんからいろいろ教えてもらいました。

Ruby Toolboxが再開(Ruby Weeklyより)


ruby-toolbox.comより

昨年夏のウォッチ↓でRuby Toolboxの去就について報じましたが、ついに動き出したようです。

週刊Railsウォッチ(20170623)gemを見極める7つのコツ、mixinがよくない理由、重いページをrender_asyncで軽減ほか


つっつきボイス: 「お、再開したのか!」「めでたいめでたい」「資金面何とかなったみたいですね」「Herokuがスポンサーになってる」

データベースをRubyで理解する(Awesome Rubyより)

# 同記事より
class Database
  def initialize
    @storage = []
  end

  def add_record(record)
    @storage << record
  end

  def find_by(field, value)
    @storage.each_with_index do |record, i|
      next if record[field] != value
      p "Required to iterate through #{i + 1} records"
      return record
    end
  end
end

つっつきボイス: 「なるほど、データベースを作って理解するという企画」「なかなかよさそう」

TruffleRubyをざっとチェックしてみた(Ruby Weeklyより)


つっつきボイス: 「GitHubのissueに書いてるのが珍しいかも: しかもとても感謝されてますね」「GitHub issueって殺伐としがちだけどこういう意表を衝いた使い方は心がなごむなー」

RubyのJIT(Awesome Rubyより)

JITの深追い記事です。


同記事より

JITといえばWEB+DB PRESS Vol.103の特集記事も気になります。

Shopifyが昨年50万ドルを投じて修正したmrubyのセキュリティバグ一覧(Awesome Rubyより)

ActiveSupportを使ってgemのコードをdeprecateする(RubyFlowより)

# 同記事より
def blockbuster_movies
  warn('DEPRECATION WARNING: blockbuster_movies is deprecated and will be removed from LazySunday 3.0 (use netflix_movies instead)')

  netflix_movies
end

つっつきボイス: 「Railsなんかでおなじみのdeprecation messageを自分のライブラリで出してる: これは簡単にできますね」「こういうのは自分で書きたくないし」

「プリマドンナメソッド」とコードの匂い(RubyFlowより)

# 同記事
class Foo

  def bar
    puts 'Bar!'
  end

  def bar!
    puts 'Bar!'
  end

end

つっつきボイス: 「’Prima Donna Method’って新しい言葉」「へー、メソッド名に!ありとなしの片方しかないやつをこう呼ぶのか」「Rubocopに怒られるやつ」「未婚というか相方がいない感じですね: 独身メソッドというかw」「確かに!ありメソッドを見たら!なしのメソッドがあるだろうと思うし、まあ気持ちはわかる」「無理して作るのもなー」「Rubocopを黙らせるために書くこともあるけど、プロジェクトにもよるかな」

clean-code-ruby: Rubyのコードをきれいに書くコツ(GitHub Trendingより)

# 同リポジトリより
# Bad:
car = {
  car_make: 'Honda',
  car_model: 'Accord',
  car_color: 'Blue'
}

def paint_car(car)
  car[:car_color] = 'Red'
end

#Good:

car = {
  make: 'Honda',
  model: 'Accord',
  color: 'Blue'
}

def paint_car(car)
  car[:color] = 'Red'
end

つっつきボイス: 「スタイルガイドとは違うかな」「自分向けのメモっぽいかも」

SlackbotをRubyで書く(Awesome Rubyより)

# 同記事より
require ‘slack-ruby-bot’

class HelloWorldBot < SlackRubyBot::Bot
  command ‘hello’ do |client, data, match|
    client.say(text: ‘world!’, channel: data.channel)
  end
end

HelloWorldBot.run

つっつきボイス: 「Slackbot用gemっていくつかあったと思うし、こうやってさくっと書くこともできますね」

共有stringでRubyを高速化(Awesome Rubyより)

Aaron Pattersonさんの記事です。

# 同記事より
struct RString {
    struct RBasic basic;
    union {
        struct {
            long len;
            char *ptr;
            union {
                long capa;
                VALUE shared;
            } aux;
        } heap;
        char ary[RSTRING_EMBED_LEN_MAX + 1];
    } as;
};


同記事より


つっつきボイス:union出た〜」「この図↑わかりやすい」「ファイルパスとかクラスの名前空間みたいな長い文字列の繰り返しが多いときに効きそう」「frozenされてれば動く心配もないし」「この方法が効くのはたぶんRubyならではなんでしょうね: Rubyのメモリ管理はOSのメモリ管理と別なので、RubyのRObjectが分散しなくなればメモリ節約できそう」「1つ1つは数バイトの節約でもRuby側のフラグメンテーションには効果ありそう: 計測しないとわからないけど」

Rubyのヒープをビジュアル表示する(翻訳)

オピニオン: #to_aメソッドを気安く実装しないでほしい(Ruby Weeklyより)

# 同記事より
val = Time.now
Array(val)
# => [3, 21, 10, 2, 2, 2018, 5, 33, false, "EET"]

コレクションでないクラスは#to_aを返して欲しくないそうです。


つっつきボイス:Array(val)falseって何でしょうね…」「あ、サマータイムか」「値の順序も謎すぎる」

RubyのnilをRust風にハンドリング(Hacklinesより)

# 同記事より
def color_name(rgb)
  if rgb == 0x000000
    Option.some("black")
  else
    Option.none()
  end
end

puts color_name(0x000000).match(
  -> value { value },
  -> { "no match" })

# Prints "black"

つっつきボイス:nilじゃなくてnoneっぽいものを返すのか」「ところでrusticって形容詞ちょっとかっこよくね?w」「Rubyだと-ticというわけにはいかなさそうだし」「Pythonならpythonicとか?」

Swot: メアドのドメインが大学のものかどうかをチェックするgem(Ruby Weeklyより)

何に使うのかと思ったら、アカデミック版価格のある商品でメアドの実在をチェックするためのようです。

Swot::is_academic? 'lreilly@stanford.edu'           # true
Swot::is_academic? 'lreilly@strath.ac.uk'           # true
Swot::is_academic? 'lreilly@soft-eng.strath.ac.uk'  # true
Swot::is_academic? 'pedro@ugr.es'                   # true
Swot::is_academic? 'lee@uottawa.ca'                 # true
Swot::is_academic? 'lee@leerilly.net'               # false

つっつきボイス: 「アカデミックのメアドってバラつき多くてチェック面倒なんですよね」「なぬー、自分の母校が入ってない: プルリクしなきゃ」「存在しない大学でも足せちゃいそうw」

traffic_jam: コンカレントなRubyプロセスの動作頻度を時間指定(Ruby Weeklyより)

# 同リポジトリより
require 'traffic_jam'

TrafficJam.configure do |config|
  config.redis = Redis.new(url: REDIS_URL)
end

limit = TrafficJam::Limit.new(
  :requests_per_user,
  user.id,
  max: 3,
  period: 1 # seconds
)
limit.increment      # => true
limit.increment(2)   # => true
limit.increment      # => false
limit.increment!     # => raises TrafficJam::LimitExceededError

sleep 1

limit.increment(2)   # => true
limit.exceeded?      # => false
limit.exceeded?(2)   # => true

limit.used           # => 2
limit.remaining      # => 1

つっつきボイス: 「Sidekiqとかでできるやつですね」「ありゃ、Redis必須って書いてある」

surrealist: Rubyオブジェクトをjson_schemaに沿って変換(RubyFlowより)

# 同リポジトリより
class Person
  include Surrealist

  json_schema do
    {
      foo: String,
      name: String,
      nested: {
        at: {
          any: Integer,
          level: Boolean,
        },
      },
    }
  end
  # ... method definitions
end

Person.find_by(email: 'example@email.com').surrealize
# => '{ "foo": "Some string", "name": "John Doe", "nested": { "at": { "any": 42, "level": true } } }'

つっつきボイス: 「ははーん、json_schemaをペロッと貼って出せるのか」「めちゃ長いJSON schema定義渡されたときに使えそう: 手書きでRuby化したらきっとめげる」
「surrealistってどう読むのかな?」「何だっけんーと、あ、『シュールレアリスト』か: 英語ならスーパーリアリスト」「だからダリの顔がw」


同リポジトリより

参考: Wikipedia-ja サルバドール・ダリ

学生向け課題: MRIのアイデアリスト


つっつきボイス: 「オープンソースソフトウェアに貢献したいけど何からやればいいかわからない人は、こういうのを参考にするとよいですね」

Ruby25、いよいよ来週土曜

SQL

スライド: 20TB越えのPostgreSQL(Postgres Weeklyより)


つっつきボイス: 「20TB越え…ドキドキする」「AWSのRedShiftとかならこのぐらいのでかさになったりしますね: これぞビッグデータという感じ」「スライドもだいたいこういう場合の定番の手法」

PostgreSQLをピュアRubyで使う(Postgres Weeklyより)


同記事より


つっつきボイス: 「プロトコルを自分で書いてgemなしでやってみせるぜ、という感じですね」

クイズ: SQLウィンドウ関数(Postgres Weeklyより)

サイトでクイズができます。


つっつきボイス:ウインドウ関数は最初のうちは概念がちょっとわかりにくいんですよね」「株なんかで使われる移動平均が典型で、たとえばある日から直近7日前までの株価を平均して、元の日にちを1日ずつ遡って同じように平均値を出してプロットすると元より緩やかな曲線が取れる: その直近の幅がウインドウ」「そんなにしょっちゅうは使わないのでとりあえずは概念を押さえておけばいいと思うけど、ビジュアル表示を扱うときとかには知っとくと役に立つかも」

参考: 統計Web 移動平均

PostgreSQLログ監視のポイント(Postgres Weeklyより)


同記事より

JavaScript

AnyChart: チャート作成ライブラリ(JavaScript Liveより)

2018 DEVIES賞を受賞したそうです。


developerweek.comより

JavaScriptの.reduceメソッド(JavaScript Liveより)

// 同記事より
const fruits = ['banana', 'coconut', 'strawberry', 'apple'];
const longestFruit = fruits.reduce(
  (longestFruitThisFar, curFruit) => {
    if (curFruit.length > longestFruitThisFar.length) {
      return curFruit;
    }
    return longestFruitThisFar;
  }
);
// longestFruit is now 'strawberry'

つっつきボイス: 「JSの.reduceはRubyにもありますね: injectもそうだし」

jQueryをVue.jsに置き換える(JavaScript Liveより)

WebpackでWebパフォーマンスを最適化する(Frontend Focusより)

Google Developersの記事です。

Web Assembly Studio: ブラウザで動くWeb AssemblyのIDE(Frontend Focusより)


同サイトより

CSS/HTML/フロントエンド

Unicode 11.0の追加絵文字が発表


つっつきボイス: 「これは見ていて楽しい動画」

参考: ユニコードコンソーシアム、「Unicode 11.0」で追加する新しい絵文字を正式に発表 ー 全157種類

いよいよChrome 68から全HTTPサイトが「Not Secure」に(Frontend Focusより)


security.googleblog.comより


つっつきボイス: 「いよいよ来るか」「あそこの有名サイトとかあそこのサイトとか長らくhttpのままだったなー」

MicrosoftやAppleがPWAに対応、GmailがAMPに対応

一番議論を呼んでいるHTML5拡張(JavaScript Liveより)


つっつきボイス:Encrypted Media Extensions (EME)とかDigital Rights Management (DRM)は議論になる宿命ですね」

その他

devhints.io : 各種言語の要点をさっと見られるアンチョコサイト

見せ方がきれいです。リポジトリで追加/変更できます。


つっつきボイス: 「お、これ便利かも」「書式が割りと揃っているのがうれしいです」「ちょい忘れかけた言語でとりあえず書くときによさそう」

「Cherylの誕生日問題」を解くPythonコードをRubyに移植してみた(RubyFlowより)


つっつきボイス: 「米国の会社の入学試験にこういう論理クイズがよく出てきますね」

参考: 【難問】14歳向けに出題された『シェリルの誕生日』が難しすぎると話題に!

bettercap-ng: 侵入テストツール(GitHub Trendingより)


同リポジトリより

以前のウォッチで紹介したbettercapの後継だそうです。


つっつきボイス: 「リポジトリのユーザー名でだいたい察しがつく」「evilsocketぇ…」

gRPC

gRPCを知らなかったので貼ってみました。

番外

EUがサマータイム廃止に向けて動き出す


つっつきボイス: 「EU中の開発者が泣いて喜ぶやつ」「疲労感って誰の疲労感なんだろう…ワタイらのことじゃなさそう」「日本も終戦後に一瞬だけサマータイムあったらしいですね」「なくてよかったー」「たぶん電気が普及してなかった時代の産物だったから、最初は19世紀とかそのあたりなのかな」

参考: Wikipedia-ja 夏時間

ライブコーディングでプログラミング言語を作る

無線データ通信

Sci-Hi: 科学論文の海賊版サイト


つっつきボイス: 「そういうサイトがあるって知らなかった」「論文って読むのも出すのも金かかるうえに、読んでもらえないと価値がない」「研究者にはうれしいけど出版社は恨むでしょうね」

参考: 科学論文の海賊版サイト「Sci-Hub」を生み出したアレクサンドラ・エルバキアン氏とは一体どんな人物なのか?

猫でもわかる宇宙の秘密

私のお楽しみとして。

無の境地


今週は以上です。

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

週刊Railsウォッチ(20180209)RubyにMJIT初マージ、高速JSON API gem、Railsにparallel-testingブランチほか

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

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

Rails公式ニュース

Ruby Weekly

Awesome Ruby

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

Frontend Focus

frontendfocus_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured

JavaScript Live

jslive_logo_captured

Github Trending

160928_1701_Q9dJIU

デザインも頼めるシステム開発会社をお探しなら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ウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ