- Ruby / Rails関連
週刊Railsウォッチ(20180216)Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか
こんにちは、hachi8833です。先週はつっつき会が時間オーバーしてしまいましたが、今週は何とか収まりました。
臨時ニュース
Rails 5.1.5リリース
マイナーリリースなのでバグ修正/セキュリティ対応が中心です。
ウォッチの社内つっつきを始めた直後にtakanekoさんに教えてもらうまでリリースに気づいてませんでした。ありがとうございます。
変更があったChangelogだけリストアップします。
- ActionMailer: 1件
- ActionPack: 2件
- ActiveJob: 1件
- ActiveModel: 1件
- ActiveRecord: 10件
- Railties: 1件
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
のモジュールをこうやってカンマ区切りするの見たことなかった」「スタイルガイドではダメだった気がします」
修正: 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はたぶんおかしい」「どこまでモックで塞ぐかというのはありますけどね」
オブジェクトの責務を見直す(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のcreate
とbuild
とbuild_stubbed
短い記事です。
つっつきボイス: 「create
とbuild
はよく使う」「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より)
- プレスリリース: Announcing Skylight for Open Source!
- サイト: https://www.skylight.io/
- サンプル: The Odin Project
つっつきボイス: 「NewRelic的なサービスか: これは初めて見たけど」「プレスリリースを見てみると、オープンソースのプロジェクトには無料で提供するよって書いてる: JetBrainsとかもこういう企画やってますね」「あ、Skylightそのものがオープンソースになったわけじゃなかったか: 失礼しましたー」
「サンプルサイトの画面↓をざっと見た感じでもよさそうだし、本当にオープンソースだったら社内の強力ハイエンドサーバーにSkylightサーバー立てたいところ」「NewRelicはとてもいいんだけど何しろ高い...」
Railsアンチパターン記事2本
2本とも古めの記事ですが。
# 元記事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より
シンボリックリンクに対するrequire
とrequire_relative
の挙動の違いを修正
これを直したのがまだほんの数ヶ月前なので、だいぶ新しいバージョンのRubyでしか実行しないと断言できる場面でないとなかなか適用できなそうです。 https://t.co/lmxlqqbzvV
— Akira Matsuda (@a_matsuda) February 14, 2018
つっつきボイス: 「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より)
つっつきボイス: 「ガチ論文!!!」「今ちょっと読み切れない」「論文のURLを見るとPOPLというシンポジウムのVMCAIというカンファレンスに出したものですね: このPOPLはSIGPLANがやってるのでかなりちゃんとしてるはず」「査読に通らないと出られないようなカンファレンスかも」「Verification, Model Checking, and Abstract Interpretationというタイトルに圧倒されるー」
その後学術系のさまざまな組織についてmorimorihogeさんからいろいろ教えてもらいました。
Ruby Toolboxが再開(Ruby Weeklyより)
昨年夏のウォッチ↓でRuby Toolboxの去就について報じましたが、ついに動き出したようです。
週刊Railsウォッチ(20170623)gemを見極める7つのコツ、mixinがよくない理由、重いページをrender_asyncで軽減ほか
つっつきボイス: 「お、再開したのか!」「めでたいめでたい」「資金面何とかなったみたいですね」「Herokuがスポンサーになってる」
データベースをRubyで理解する(Awesome Rubyより)
- 元記事: Developing a database. Part 1. Why may you need indexes and how does Hash index work. | Zonov.me
# 同記事より
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の特集記事も気になります。
WEB+DB PRESS Vol.103の特集記事「Ruby最前線」で、Ruby 2.5で高速化された機能とその仕組みや、2.5で2倍高速化されたERBを題材にRubyのコードのパフォーマンスチューニング方法について書かせていただきました。よろしくお願いします!! https://t.co/FZpfkC98Rz
— k0kubun (@k0kubun) February 13, 2018
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より)
- リポジトリ: uohzxela/clean-code-ruby
# 同リポジトリより
# 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側のフラグメンテーションには効果ありそう: 計測しないとわからないけど」
オピニオン: #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より)
- リポジトリ: leereilly/swot
何に使うのかと思ったら、アカデミック版価格のある商品でメアドの実在をチェックするためのようです。
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より)
- リポジトリ: coinbase/traffic_jam
# 同リポジトリより
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より)
- リポジトリ: nesaulov/surrealist
# 同リポジトリより
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のアイデアリスト
Google Summer of Code で通ったそうなので、 MRI のアイディアリスト: https://t.co/UyCAmHFTZ1 の最初の奴を考えました。比較的簡単で効果が高い領域なので、腕に覚えがある方は挑戦しませんか。できる限りサポートします。
— _ko1 (@_ko1) February 13, 2018
つっつきボイス: 「オープンソースソフトウェアに貢献したいけど何からやればいいかわからない人は、こういうのを参考にするとよいですね」
Ruby25、いよいよ来週土曜
Dave Thomasさんのメッセージを追加しました。Daveさんはピッケル本と呼ばれるRuby入門書の著者で、Rubyを世界へ広めたきっかけを作った方です。RubyKaigi2007での基調講演は講演後にスタンディングオベーションが起こり、会場が大きく沸いた熱い講演でした。 https://t.co/msQsgKyfY3
— Ruby25 (@ruby25th) February 14, 2018
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より)
- 元記事: Best JavaScript Technology: AnyChart JS Charts Library Wins 2018 DEVIES Award!
- リポジトリ: AnyChart/AnyChart
2018 DEVIES賞を受賞したそうです。
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より)
- サイト: webassembly.studio
CSS/HTML/フロントエンド
Unicode 11.0の追加絵文字が発表
つっつきボイス: 「これは見ていて楽しい動画」
参考: ユニコードコンソーシアム、「Unicode 11.0」で追加する新しい絵文字を正式に発表 ー 全157種類
いよいよChrome 68から全HTTPサイトが「Not Secure」に(Frontend Focusより)
つっつきボイス: 「いよいよ来るか」「あそこの有名サイトとかあそこのサイトとか長らくhttpのままだったなー」
MicrosoftやAppleがPWAに対応、GmailがAMPに対応
- 元記事: AppleもiOS/macOSをProgressive Web Apps(PWA)対応へ。次のSafari 11.1でService Workerなど実装
- 元記事: Google、GmailにAMP導入でメールをよりインタラクティブに
一番議論を呼んでいるHTML5拡張(JavaScript Liveより)
つっつきボイス: 「Encrypted Media Extensions (EME)とかDigital Rights Management (DRM)は議論になる宿命ですね」
その他
devhints.io : 各種言語の要点をさっと見られるアンチョコサイト
- サイト: https://devhints.io/
- リポジトリ: rstacruz/cheatsheets
見せ方がきれいです。リポジトリで追加/変更できます。
つっつきボイス: 「お、これ便利かも」「書式が割りと揃っているのがうれしいです」「ちょい忘れかけた言語でとりあえず書くときによさそう」
「Cherylの誕生日問題」を解くPythonコードをRubyに移植してみた(RubyFlowより)
つっつきボイス: 「米国の会社の入学試験にこういう論理クイズがよく出てきますね」
参考: 【難問】14歳向けに出題された『シェリルの誕生日』が難しすぎると話題に!
bettercap-ng: 侵入テストツール(GitHub Trendingより)
- リポジトリ: evilsocket/bettercap-ng
以前のウォッチで紹介したbettercapの後継だそうです。
つっつきボイス: 「リポジトリのユーザー名でだいたい察しがつく」「evilsocketぇ...」
gRPC
- 元記事: モバイルアプリでgRPCを使う
- サイト: https://grpc.io/
gRPCを知らなかったので貼ってみました。
番外
EUがサマータイム廃止に向けて動き出す
EU欧州議会が絶対多数で「サマータイム」廃止へ。疲労感、健康上の問題が理由。 pic.twitter.com/Oq3vcqAysz
— ウィーンの森の散歩道 (@Wander_Weg) February 9, 2018
つっつきボイス: 「EU中の開発者が泣いて喜ぶやつ」「疲労感って誰の疲労感なんだろう...ワタイらのことじゃなさそう」「日本も終戦後に一瞬だけサマータイムあったらしいですね」「なくてよかったー」「たぶん電気が普及してなかった時代の産物だったから、最初は19世紀とかそのあたりなのかな」
参考: Wikipedia-ja 夏時間
ライブコーディングでプログラミング言語を作る
そういやプログラミング言語を作りたい人のための入門として、30分で実際に、わりと自明ではないことができる言語を作ってみせるという動画をとったんですよ。結構教育効果が高いのではと思っているので、興味があってまだみてなければぜひ。 https://t.co/q47C7j4HPv
— Rui Ueyama (@rui314) February 12, 2018
無線データ通信
RT
世界最高速!毎秒120ギガビットの無線伝送に成功 | 東工大ニュース | 東京工業大学 https://t.co/GspoWEpw9P— 森山和道/ライター、書評屋 (@kmoriyama) February 13, 2018
Sci-Hi: 科学論文の海賊版サイト
つっつきボイス: 「そういうサイトがあるって知らなかった」「論文って読むのも出すのも金かかるうえに、読んでもらえないと価値がない」「研究者にはうれしいけど出版社は恨むでしょうね」
参考: 科学論文の海賊版サイト「Sci-Hub」を生み出したアレクサンドラ・エルバキアン氏とは一体どんな人物なのか?
猫でもわかる宇宙の秘密
- PDF: 猫でもわかる宇宙の秘密
私のお楽しみとして。
無の境地
数万行書いても100スター行かない事もあるのに、1行もコード書いてないのに13000以上スターが得られる事もある。人生は難しい。https://t.co/isRZDBZWAM
— mattn (@mattn_jp) February 15, 2018
今週は以上です。
バックナンバー(2018年度)
週刊Railsウォッチ(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など)です。