こんにちは、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に比べればマシかなぐらい」
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
の記述↓も修正してもらわないと」
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
- リポジトリ: textkit/whatson
- リポジトリ: planetruby/awesome-events — たぶんここから情報を引っ張っている?
もともと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です。ナイルビー。
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ということみたいです」「コミットの粒度ってほんと悩みますね」「読まされるレビュアーの立場で考えるしかないかなー」
10 lines of code = 10 issues.
500 lines of code = "looks fine."
Code reviews.
— I Am Devloper (@iamdevloper) November 5, 2013
アセットのプリコンパイルを高速化するには(Hacklinesより)
「CDNを使う」「@import
やrequire_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
のときに引数が評価されないという点です。』」「引数があるかどうかで違う、と」
追伸: 体操座りしながら指でいじいじしている形で覚えるとよいそうです。
プログラミング言語RubyのLonery operator。&が座っているように見えることからぼっち演算子とも呼ばれています。https://t.co/ot6aTOasi3 #steers pic.twitter.com/pkDaJ6wipo
— STEERS@コストゼロでTシャツ販売 (@STEERS_jp) September 10, 2016
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日にしたほうがよいかもしれない」と語った。
もう3倍速いの登場したかのような。
Link: ニュース解説 – 「3倍速いRuby」が登場、有名開発者が速さの秘密を語る:ITpro https://t.co/iyO4bCZhAs
— Yukihiro Matsumoto (@yukihiro_matz) January 10, 2018
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
Fukuoka Ruby Awardエントリー募集(1/31まで)(Ruby公式ニュースより)
Ruby 3とJIT(Ruby Weeklyより)
Noah Gibbsさんの記事です。Optcarrotがoptimized modeで相当速くなっています。
Ruby 2.5のベンチマーク取ってみた
HexaPDFを使っています。
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を使ってるそうです」
「この記事にはネタ画像がいくつか埋まってるんですが、その中でもこれ↓: シャイニングっていう昔のくっそ怖い映画の一番有名なシーンなんですが」「なんか見たことあるっちゃある感じ」
「この『Here’s Johnny!!』っていうセリフは、実はこの場面までの緊張感を一発で台無しにする、英語圏のこの年代の人じゃないとわからないずっこけネタなんですね」「Tonight Showという米国の長寿テレビ番組のオープニングで司会者が必ず言うセリフなんですが、日本に置き換えるとさしずめ『サザエでございま~す』とか『ぼーくドラえもん』っていう感じ: そこでそれ言うか!みたいな」
JRubyより速い
JRuby 速い速いっていうけど、CI を見てみたら ruby より全然遅いように見える。これが現実なのかhttps://t.co/3DOAsZkhsFhttps://t.co/WgLFZrESJg
— Yusuke Endoh (@mametter) December 28, 2017
つっつきボイス: 「今見てみると2.5ががくっと遅くなってますね」「何かつっかえてるのかな?」
卜部さんの「HashDoS脆弱性との戦い」
貴重な記録だ…。 / “HashDoS脆弱性との戦い! Rubyコミッター・卜部昌平が明かすプログラム堅牢化のノウハウ – エンジニアHub|若手Webエンジニアのキャリアを考える!” https://t.co/gGE3SrutTI
— masa寿司 (@masa_iwasaki) January 10, 2018
Ruby実装の命名の由来
Link: CRuby, MRI, JRuby, RubySpec, Rubinius, YARV: A Little Bit of Ruby Naming — Appfolio Engineering https://t.co/Na2YMuK4Lw
— Yukihiro Matsumoto (@yukihiro_matz) January 3, 2018
これもNoah Gibbsさんの記事です。
RubyBench: RubyやRailsのベンチマークサイト
つっつきボイス: 「https://speed.python.org/みたいなのがRubyにもないかなと思って探したら見つかりました: 相当細かくベンチ取ってくれて楽しい」
Ruby開発者のための5つの習慣(Ruby Weeklyより)
- RuboCopはいつどんなときでもかけろ
- git historyを汚すな
- お遊びプロジェクトを立ち上げてみろ
- Railsのソースコードを読め
- 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の新機能
Link: 地味すぎて誰も気がついていないCRuby 2.5の新機能 – スペクトラム: https://t.co/ZGw4a6ZVcz
— Yukihiro Matsumoto (@yukihiro_matz) January 8, 2018
mruby/c1.1 RC2リリース
mruby/c1.1 RC2を公開しました。https://t.co/Y6oEaZgIUO
— mruby/c (@mrubyc_jp) January 5, 2018
- Procクラスの実装
- sprintfメソッドの実装
- .classメソッドの実装
- RangeObjectのリファレンスカウント対応
- StringObjectのバグ修正
- 重複した数値処理の排除
- Rubyによるクラスの定義とインスタンスメソッドの定義を実装
各種言語のハッシュマップ実装を比較
Link: Russell Cohen | An Analysis of Hash Map Implementations in Popular Languages: https://t.co/QDuaNnmbLR
— Yukihiro Matsumoto (@yukihiro_matz) January 5, 2018
- Python
- Ruby
- Java
- Scala
- Golang
- C#
- C++
この記事のサイドバーにあったNo Magic: Regular Expressionsという記事もつい気になってしまいました。
Graphql-batchとPromise.rb
- リポジトリ: Shopify/graphql-batch
- リポジトリ: lgierth/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 })
asakusa.rb新年会
来週の火曜日(1/16)のAsakusa.rb meetupは、毎年恒例の、おいしいものを食べに行く新年会です。あと10人弱は入れるはずなので、参加される方はお早めに参加をご表明ください。 https://t.co/WKLXqL8wuV #asakusarb
— Akira Matsuda (@a_matsuda) January 9, 2018
現時点でまだ空席あるようです。
KitchenCI: 複数プラットフォームをサポートするCIサービス
- サイト: https://kitchen.ci/
- リポジトリ: test-kitchen/test-kitchen
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設計のカタログサイト。新しくテーブル設計する際には必ず一度ここを見る。見た目は古臭いけど数と質が圧倒的 / Industry Data Models https://t.co/5FPA7fmpyx
— Takuto Wada (@t_wada) December 27, 2017
つっつきボイス: 「確かにこれ凄い!」「医療とかホテルとか、よくここまで集めた」「実用に即したDB設計ってなかなか見る機会ないですよね」
PostgreSQLが「DBMS of the year 2017」に輝く(Postgres Weeklyより)
https://db-engines.com/en/rankingというランキングサイトを元にしています。
つっつきボイス: 「MongoDBとかってDBMSなんですかね?」
JavaScript
面接で聞かれるES6理論クイズ10問(解答付き)
500人以上の技術面接で使われた問題だそうです。
- JavaScriptのスコープを説明し、スコープの例を知っている限り列挙せよ(6点)
- ホイスティングを例を挙げて説明せよ(6点)
prototype
の役割を例を挙げて説明せよ(6点)- 3の例を拡張してprototypeの継承を説明せよ(5点)
- 3の例をES6構文で書き直せ(6点)
this
の値を説明せよ(6点)- コンテキストバインディングを例を挙げて説明せよ(3点)
==
と===
の一般的な違いを説明せよ(6点)- 変数がarrayかどうかをチェックする方法を述べよ(3点)
- 以下のコードのどこがおかしいかを説明し、修正せよ(4点)
if ( typeof x === 'object' ) {
x.visited = true;
}
rearmed-js: JavaScriptのArrayなどをRuby風に書けるライブラリ
- リポジトリ: westonganger/rearmed-js
// 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を使うライブラリ
- サイト: http://sinonjs.org/
- リポジトリ: sinonjs/sinon
テスティングフレームワークに依存しないそうです。
// 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にも対応しているそうです。
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より)
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より)
- リポジトリ: nhnent/tui.editor
表やUML図などを直接扱えるようです。
CSS/HTML/フロントエンド
HTML 5.2の新着情報とポイント(jser.infoより)
<dialog>
要素- Apple製品でのアイコン表示改善
<main>
要素を複数持てる<body>
タグ内にも<style>
を書ける(ただしパフォーマンス上おすすめしない)<legend>
タグ内に見出しタグを置ける- 廃止:
keygen
、menu
、menuitem
、厳密なDOCTYPE - etc
CSSの:not
セレクタを導入
つっつきボイス: 「:not
ときどき使いますヨ: 繰り返し要素の最後のところだけ区切り線入れたくないときとか便利」「そうそう、これないと不便」
その他
技術トークの5つのコツ
- その技術を選んだ理由を話す
- その技術で何ができるかを話す
- どうやったら動いたかをデモする(しくじったポイントも入れよう)
- 参考リンクを忘れずに
- マイクはないものと思え
meltdown: メルトダウン脆弱性の実演コード(GitHub Trendingより)
- リポジトリ: IAIK/meltdown
今旬のネタだけあって、10日ほどで★2400超えです。
これマジで?
macOSのHigh Sierraでhtopコマンドを実行するなよ!いいか、絶対するなよ!電源長押しで強制停止するしかなくなるから / “Htop on macOS High Sierra · Issue #682 · hish…” https://t.co/63N9lsJYer
— matsuu (@matsuu) January 6, 2018
Go 1.10 Beta2リリース
- 元記事: Go 1.10 Beta 2 is released
- リリースノートドラフト: Go 1.10 Release Notes
番外
闇深そうなフォントかるた
フォントの説明を聴いて正解の札を取る、「フォントかるた」なる狂気の遊び pic.twitter.com/aAF3wiMDDu
— ねこらー (@_neko_ra_men) January 2, 2018
ケンブリッジ大学の脳力測定サイト
いわゆる脳トレ的なやつです。
成功の秘訣は「大学の町の近くで育つこと」?
日本語記事: 元グーグルのデータサイエンティストが発見! 成功者の意外な共通点とは
340刷
書店にプログラミング言語Cならんでたわ。340刷。すげえ pic.twitter.com/C7fKAw7cSS
— なぎせ ゆうき (@nagise) January 5, 2018
ロシアのサーバールームお祓い事情
外から失礼します。
ロシアではサーバールームで正教会の神父が聖水を撒き散らしながら祈ってくれるそうです。https://t.co/BoYlFf4iDk— 仙狸塩狸 (@SenriEnri) January 2, 2018
つっつきボイス: 「サーバールームで水撒くか普通…」
AIで転職情報を勝手にかき集めるのは…
前半「名刺を交換したビジネスマンの個人が交流できるSNS」は「企業から転職の誘いがくる」サービスだと理解されてれば問題ない。問題は後半の「ネット上のあらゆる場所を対象に書き込みの内容を分析し、書き込んだ個人が転職を希望しているかどうかにかかわらず、人材を求めている企業に紹介する」方
— Hiromitsu Takagi (@HiromitsuTakagi) January 7, 2018
つっつきボイス: 「この人に目をつけられたらもう逃げられないっすね」
闇落ち以外のパターンが思いつかない
「自分で自分のDNAを改造するなら問題ないだろ?」と実行した科学者。筋肉の成長を促す改造遺伝子を注入し6ヶ月後にはマッチョになるはずだそう
(アメコミだったら暴走して悪堕ちする)https://t.co/6cIg83BXGv— tetsu (@metatetsu) December 25, 2017
今週は以上です。
バックナンバー(2017年後半)
週刊Railsウォッチ(20171222)定番gemまとめサイト、active_record-mtiでテーブル継承、PostgreSQL 10の非互換変更点、Railsガイド攻略法ほか
- 20171215 Ruby 2.5.0-rc1リリース、Ruby 2.4.3セキュリティ修正、Ruby 3.0で変わるキーワード引数、HTML 5.2 RECリリースほか
- 20171208 最近のRailsフロントエンド事情、国際化gem、mallocでRubyのメモリが倍増、るびま記事募集ほか
- 20171201 JSON PatchでRails高速化、Knapsack Proでテスト高速化、Decorator/Presenter gem比較ほか
- 20171124 GitHubにセキュリティアラート追加、RailsでVue.jsを使う、Railsテスト本2種、node-pruneで瞬間クリーンアップほか
- 20171117 Rails開発3年分のコツ集大成、PostgreSQL 10.1でセキュリティ問題修正ほか
- 20171110 dry-rbでFormObjectを作る、RailsのSQLインジェクション手法サイト、年に1度だけ起きるバグほか
- 20171020 Rubyが来年で25周年、form objectでサニタイズ、コアなString解説本ほか
- 20171013 Ruby 2.5.0-preview1リリース、RubyGems 2.6.14でセキュリティバグ修正、Bootstrap 4.0がついにBetaほか
- 20171006 PostgreSQL 10ついにリリース、Capybaraコードを実画面から生成するnezumiほか
- 20170929 特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか
- 20170922 特集: RubyKaigi 2017セッションを振り返る(1)、Rails 4.2.10.rc1リリースほか
- 20170915 Ruby 2.4.2リリースで脆弱性修正、strong_migrations gemでマイグレーションチェック、書籍『Mastering PostgreSQL』ほか
- 20170908 Rails 5.1.4と5.0.6リリース、コード書換え支援gem「synvert」、遅いテストを分析するTestProfほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。