- Ruby / Rails関連
週刊Railsウォッチ(20180622)Railsの需要未だ巨大、Unicode 11.0リリース、WebDriverがW3Cで勧告、Flutter.io、2封筒問題ほか
こんにちは、hachi8833です。私が気まぐれに応援するサッカーチームは必ず負けるので、どこも応援しないようがんばります。
「ドイツにメキシコが勝ったのってどのくらいすごいの」
「Perl対Go 並行処理対決でPerlが勝った」
「Goroutineが退場してPreforkが勝った」
などの会話が行われている— windymelt (@windymelt) June 20, 2018
各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
まだ検討段階ですが、週刊Railsウォッチの刊行日を月曜日に移動するかもしれません
⚓Rails: 今週の改修(Rails公式ニュースより)
特記ない限りRails 6.0向けです。
⚓既存association削除時の探索をハッシュに変えて高速化
# activerecord/lib/active_record/associations/collection_association.rb#L391
def remove_records(existing_records, records, method)
records.each { |record| callback(:before_remove, record) }
delete_records(existing_records, method) if existing_records.any?
- records.each { |record| target.delete(record) }
+ hashed_records = records.group_by { |record| record }
+ target.select! { |record| !hashed_records[record] }
records.each { |record| callback(:after_remove, record) }
end
GDPR対応でユーザーや「いいね👍」をごっそり削除することになった人、いるよね?
dependent: destroy
オプションのアルゴリズムが更新されて(計算量が)二次から一次に削減されました。これ大好き😋
公式ニュースより大意
つっつきボイス: 「each
で全回しでdeleteしてたのを、group_by
してからhashed_records
で削除したと」「quadratic(二次)からlinear(一次)って、ここでは計算量のことでいいんですよね?」「ですね🧐O(n^2)
からO(n)
に削減されたやつ」「お、例のsgrifさんが『self.target -= records
だけでいけるんじゃ?』ってコメントしてる🤔」「おー、確かにこの書き方は演算子がオーバーライドされてればできるな: 面白い😋」
参考: ランダウの記号 - Wikipedia
参考: 一次方程式 - Wikipedia -- linear equation
参考: 二次方程式 - Wikipedia -- quadratic equation
⚓storeアクセサで従来のprefixの他にsuffixも使えるようになった
- PR: Allow prefix/suffix options for store accessors by untidy-hair · Pull Request #29373 · rails/rails
# 同PRより
store :settings, accessors: [ :two_factor_auth ], coder: JSON, _prefix: true
# => accessor will be model.settings_two_factor_auth
store_accessor :settings, :secret_question, _prefix: 'config'
# => accessor will be model.config_secret_question
store :settings, accessors: [ :login_retry ], _suffix: 'setting'
# => accessor will be model.login_retry_setting
つっつきボイス: 「おー、store
にsuffixもねー: 既存のデータベースでsuffixを使うやつがあるんだろうし、prefixが使えるならsuffixも欲しいというのはまあワカル」「指定したsuffixが自動で追加されるんですね」「自分はあんまり使わないかなー?😆」
⚓Active Modelのデフォルトのエラーメッセージ表示方法を改良
- PR: Allow to override the full_message error format by Larochelle · Pull Request #32956 · rails/rails
#{attribute} #{message}
を#{message}, full_message
に変更し、以下のどれでも使えるようにしつつ高速化も図ったようです。
en:
errors:
format: '%{message}'
en:
activemodel:
errors:
models:
person:
format: '%{message}'
en:
activemodel:
errors:
models:
person:
attributes:
name:
format: '%{message}'
つっつきボイス: 「full_message
がオーバーライドできるようになって、しかもi18nなのか!そういえば今まではデフォルトのエラーメッセージが生書きされてたような気がする」「この改修はどの辺がうれしいんでしょうか?」「今まではデフォルトのエラーメッセージが完全に英語の語順になっちゃってたんで、日本語環境だとeach
で回してゴニョゴニョしないといけないとか、いろいろ使いにくかったんですよ」「あー!なるほど😲ローカライズでもメッセージ内のプレースホルダーの位置なんかを言語によって変えないといけないけど、まさにその問題か」「そのあたりをi18nでもう少し何とかできるようになったということのようだ」「上はyamlファイルなんですね?」「ですです: i18nのfull_message
のテンプレートをyamlでオーバーライドできるようになったということでしょうね: 嬉しい人には嬉しいのかも?」「私は嬉しいです😄」
⚓developmentモードのeager loadingを修正
- PR: Fix bug with eager_load in development environment by dan-jensen · Pull Request #33118 · rails/rails
Rails 5.1/5.2でconfig.eager_load = true
するとサーバーがロックすることがあったそうです。
# actionpack/lib/action_dispatch/journey/routes.rb#L51
def ast
@ast ||= begin
asts = anchored_routes.map(&:ast)
- Nodes::Or.new(asts) unless asts.empty?
+ Nodes::Or.new(asts)
end
end
つっつきボイス: 「config.eager_load = true
でロックとか恐ろしいw💀」「修正はめちゃシンプル: ast
だから抽象構文木ですね」「どうやらこいつが何かのはずみで同時に呼ばれるとヤバかったんだろうなー: コミットメッセージを見ると、Railsエンジンが複数ある場合にRouteSets
が空になる問題だったのか!」「😲」「自分はあまり踏まなそうなバグかな?」
参考: Rails エンジン入門 | Rails ガイド
参考: 抽象構文木 - Wikipedia
⚓テスト中のパラメータエンコーディングにto_query
ではなくRackを使用
- PR: Use Rack to generate query information under test by tenderlove · Pull Request #33093 · rails/rails
# actionpack/lib/action_controller/test_case.rb#L104
case content_mime_type.to_sym
when nil
raise "Unknown Content-Type: #{content_type}"
when :json
data = ActiveSupport::JSON.encode(non_path_parameters)
when :xml
data = non_path_parameters.to_xml
when :url_encoded_form
- data = non_path_parameters.to_query
+ data = Rack::Utils.build_nested_query(non_path_parameters)
else
@custom_param_parsers[content_mime_type.symbol] = ->(_) { non_path_parameters }
data = non_path_parameters.to_query
end
お馴染みAaron Pattersonさんによる修正です。
Rubyが生まれた頃、そしてこれからのRubyを語ろう――まつもとゆきひろ氏×アーロン・パターソン氏【GitHub Satellite Tokyo】 (1/2):CodeZine(コードジン) https://t.co/6IWGpTP73F @codezineさんから
— Ryo Ishigaki (@risgk) June 20, 2018
つっつきボイス: 「ちょうどMatz vs Aaron Patterson対談の記事があったので貼ってみました↑💎」「GitHub Satellite!😃HTTPのクエリパラメータのあたりで、to_query
だとエンコーディング前にソートされてたのをRackのに切り替えて修正したということかな」
⚓associationのコレクション更新に-=
を使うよう修正
これは自分で見繕いました。
この修正によってメモリ上で変更されたassociationもloadedとしてマーキングされるので、次回のアクセスでデータベースクエリの発生を回避できる。
同commitより大意
# activerecord/lib/active_record/associations/collection_association.rb#L399
def remove_records(existing_records, records, method)
records.each { |record| callback(:before_remove, record) }
delete_records(existing_records, method) if existing_records.any?
- hashed_records = records.group_by { |record| record }
- target.select! { |record| !hashed_records[record] }
+ self.target -= records
records.each { |record| callback(:after_remove, record) }
end
つっつきボイス: 「あ、これちょうど今回の一番上の#29939の続きじゃないですか❤️」「ほんとだ: sgrifさんのサジェスチョンどおりですね🙂」「どこまで最適化されてるかはわかりませんが😆」「😆」
⚓Rails
⚓Railsへの需要は未だ巨大
Link: Demand for Ruby on Rails is Still Huge – Yoel Blum – Medium: https://t.co/VMDiLgQp2i
— Yukihiro Matz (@yukihiro_matz) June 18, 2018
サクッと読める記事です。
つっつきボイス: 「実際に使われている既存のRailsアプリがとても増えたし、エンジニアの需要も普通に多いというか減ってないという実感」「LinkedInの求職の件数(サンフランシスコのベイエリアなど)をチェックするというのはうまいですね: 言語ではRubyは必ずしも上位ではないけど、フレームワークでの求職数は圧勝しているというあたり」「ところでMatzがRailsネタでツイートするのは割と珍しいかも?」「確かにー」
⚓tokaido: RailsアプリをmacOSアプリにする
- リポジトリ: tokaido/tokaidoapp
Railsガイドに載ってました。東海道?
つっつきボイス: 「単独のMacアプリにできるということみたいです: こういうのがあったって知りませんでした」「自分も😆」「よく見ると最後の更新が3年前...Railsをまるっと飲み込んだら結構なサイズになりそう?」
⚓AMPって今どうよ(Frontend Weeklyより)
つっつきボイス: 「AMPはもう普通に使われてると思うし: あと最近AMP JSも使えるようになるみたいだし」「あ、そうだった😲」
参考: AMP とは – AMP
⚓GraphQLは未来なのか?(Frontend Weeklyより)
「GraphQL is not your data model」という見出しがとりあえず気になりました。
つっつきボイス: 「日本だとGraphQLに夢を見ている人が多い印象🌠」「😆」「日本はフロントエンドとサーバーサイドを別の人がやってることが多いという事情もあるし: もしかするとソシャゲ界隈でGraphQL使いたい人が多いかもね🕶」
⚓アセットパイプラインディレクトリの脆弱性
つっつきボイス: 「Herokuの記事でした」「productionでconfig.assets.compile = true
しなければ大丈夫だそうです(オレオレアプリもセーフ🤑)」「アセットのコンパイルって、ごくごく稀にオンにしてみることがあったりしたナ: コンパイルがうまく動かなかったときとか😆」「やったことなかった...」「Directory Traversalはなかなかエグい☠️けど、アプリがコンテナに置かれててchrootしているとかならそこまで深刻ではないのかもしれないけど、ね」
⚓git push -f
はヤバい
参考: git push -f をやめて --force-with-lease を使おう - Qiita
つっつきボイス: 「実はこの間Gobyちゃんのリポジトリでgit push -f
やらかしちゃって😓」「マジでw🤣」「今後やらかさないようgit config --system receive.denyNonFastForwards true
を唱えました」「master権限持っててぶっ壊したらどうしようもないけど、開発者ならprotectedブランチ的なものを立てるとか、masterブランチとdevelopブランチに直接pushできないようプロテクトしておくべきではあったかな😎」「そうでした😵」
「最近よく聞くのは、『featureブランチでは基本的にpush -f
しない』という運用ですね: 重複更新が入ってもとりあえずコミットでつなげて、最後マージするときにsquashする」「なるほど!」「もちろんプロジェクト次第ですけどね: 個人的には、そのfeatureブランチを自分しか触ってないならpush -f
してもいいんじゃね?とは思うけど」
「いつもは自分のブランチでpush -f
してたんですが、今回はうっかりst0012さんのPRブランチにpushしちゃって💦」「人のブランチにgit push -f
は、そりゃ戦争🔫💣ものだな🤣」「さすがにムッてたと思います...ほんとすみません🙏」「最初にfeatureブランチができたらそれ以外の人はpushできないようになったりするといいかもしれないですけどね😎、まあgit push -f
は使わざるを得ないときもあるんでドンマイ」「😃」
⚓Railsアプリのデータベースロジックを失わない方法(RubyFlowより)
# 同記事より
app/
sql/
application.sql
user.sql
product.sql
つっつきボイス: 「sql/ディレクトリ掘ってるのが気になって」「それは普通に生SQLを置くところでしょうね: ははぁこれはマイグレーションについての記事か」「というと?」「通常のdb:migrate
に限らない、データベースの更新とかも含むマイグレーションで使う生SQLはこういうところに置こうよという趣旨」「😃」
「ついでですが、これみたいに1回しか実行しない生SQLをどこに置くかっていつも悩ましいんですよ」「確かにー」「1回こっきりならスニペットで書くか、あるいはActiveRecord使うならrakeタスクにするとか: SQL一発だけならこの記事みたいな管理方法もありかなとは思う」
⚓5つの手順で完璧なenumを作る(RubyFlowより)
つっつきボイス: 「完璧なenum🤣: まずはarrayじゃなくてhashでやろうとある、自分もhashでやるのが好きだし😋」
# 同記事より
class Catalog < ActiveRecord::Base
enum localization: [:home, :foreign, :none]
end
0 -> home
1 -> foreign
2 -> none
「そうそう、業務システムなんかで、enumをデータベースに0
とか1
の値で入れることにこだわるケースがあったりするんですが、それだとソース見ないと値の意味がわからないんじゃね?って思うことしばしば😆」「それ確かにー」「自分はstringで保存したい派: PostgreSQLだと確か文字列enumが使えて、MySQLにもenum型が確かあって、そういうのを使えばできるし」
# 同記事より
class Catalog < ActiveRecord::Base
enum localization: { home: 0, foreign: 1, none: 2 }
end
「お、この記事はPostgreSQL enum使ってるじゃん↓: エライ!」「これだとデータベース内部は数値でもクエリでは文字列が使えるんですね」「そうそう、やるなら自分はぜひこっちにしたい😋」「😃」
# 同記事より
class AddStatusToCatalogs < ActiveRecord::Migration[5.1]
def up
execute <<-SQL
CREATE TYPE catalog_status AS ENUM ('published', 'unpublished', 'not_set');
SQL
add_column :catalogs, :status, :catalogs_status
end
def down
remove_column :catalogs, :status
execute <<-SQL
DROP TYPE catalog_status;
SQL
end
end
「で究極のソリューションは、と: おー、これはたぶんPostgreSQLの機能だと思うんですが、型を追加してますね、CREATE TYPE catalog_status AS ENUM
で」「😃」「createのenum定義に直接型を書く代わりに、catalog_status
という名前を付けてそれを使ってマイグレーションをすると: これは確かにキレイに書ける」「おー、ぽすぐれ側でやろうということですね」「まあ今度はこのcatalog_status
って定義はどこなんだ?と思われるかもしれないし、ここまでぽすぐれに頼っていいんだろうかとも思いますが😆」
# 同記事より
# マイグレーション
class AddStatusToCatalogs < ActiveRecord::Migration[5.1]
def up
execute <<-SQL
CREATE TYPE catalog_status AS ENUM ('published', 'unpublished', 'not_set');
SQL
add_column :catalogs, :status, :catalogs_status
add_index :catalogs, :status
end
def down
remove_column :catalogs, :status
execute <<-SQL
DROP TYPE catalog_status;
SQL
end
end
# ValueObject:
class CatalogStatus
STATUSES = %w(published unpublished not_set).freeze
def initialize(status)
@status = status
end
# what you need here
end
⚓RailsアプリでReactをホットリロードに使う(RubyFlowより)
つっつきボイス: 「ホットリロードは最近のWebアプリではよく見かけますね: フロントだと欲しいヤツ」「Webpackも使ってるし」
⚓Railsのcredential
先週Railsのcredentialの話が出てたので。
つっつきボイス: 「この間の話は要するにcredentialをリポジトリにコミットする場合にマスターキーをチームでどううまく扱うかという問題でしたが、この記事みたいにマスターキーをAWSのKMSに保存すれば、KMS内の生の鍵には開発者のアクセスを許す必要がないし、KMSに置かれた鍵をIAM経由で使うようにすれば、プロジェクトから抜けたメンバーをIAM Groupから外すだけでマスターキーにアクセスできなくなるということですね」「😃」
⚓Rails APIとJWT認証とVuejsでSPAする(RubyFlowより)
つっつきボイス: 「JWTはWeb界隈では新し目の認証方式ですね」
⚓最近よかったRuby/Rails記事: 2018年前半(RubyFlowより)
つっつきボイス: 「ざっと見たところこれまでウォッチで既に取り上げたり翻訳したりした記事も載ってて、ちょっとだけ『勝った』感ありました😆」「😆」
⚓search_flip: ElasticsearchでクエリをチェインするDSL(RubyFlowより)
- リポジトリ: mrkamel/search_flip
Finally, SearchFlip supports ElasticSearch 1.x, 2.x, 5.x, 6.x. Check section Feature Support for version dependent features.
同リポジトリより
つっつきボイス: 「よくあるやつなのかなと思って」「お、これElasticsearchの6.xに対応してるのがエライですね!: たしかこの間のRails Developers Meetupだったかな、Elasticsearch向けの何かのRubyのライブラリがElasticsearchの5.xまでしか対応してなくて新しい機能はまだ使えないねみたいな話があったと思ったんだけど、6.xに対応しているという理由でこのgemを使う人がいるかも?」
⚓ActiveSupport::MessageEncryptor
ActiveSupport::MessageEncryptorを慎重に使う - nisshieeのブログ https://t.co/t4skI6tsm6
— mknstone (@mknstone) June 20, 2018
つっつきボイス: 「そうそう、Rubyでencrypter/decrypter使うとだいたいこんな感じになりますね: しかしActiveSupportの割にはローレベルな書き方😆」
# 同記事より
ENCRYPT_CIPHER = 'aes-256-cbc'
ENCRYPTOR = begin
key_len = ActiveSupport::MessageEncryptor
.key_len(ENCRYPT_CIPHER)
key = ActiveSupport::KeyGenerator
.new("<環境から挿入したkey>")
.generate_key("<環境から挿入したsalt>", key_len)
ActiveSupport::MessageEncryptor.new(
key,
cipher: ENCRYPT_CIPHER,
digest: 'SHA1',
serializer: Marshal,
)
end
「その後に『デフォルト値には頼らない』って書いてますけど、これは使う処理系やライブラリによってデフォルト値が違うことがあるんですよ」「というと?」「以前一度はまったのが、PHPのライブラリでencryptしたものをRubyのライブラリでdecryptしようとしたら、どっちかのライブラリでゼロフィル(ゼロ値で埋めること)やられてて復元できなかったことあったんですよ😭: たしか相当無理やりに突破した」「ありゃ~」「ライブラリを素直に無加工で使ってくれればいいものを、そうやってデフォルト値変えられたりするとつらい」
「そういえば私も正規表現ライブラリを異なる言語間で共通で使おうとして似たようなハマり方したことありました😢」「それもあるある: eregなのかpregなのかとかね、といっても最近pregしか見かけないけど😎」
参考: preg_match関数と正規表現の理解を再度見直す - Qiita
⚓その他Rails
おっ、TrelloはMarkdownが使える。書きやすい。
— おちゃ (@ochaochaocha3) June 17, 2018
- サイト: Trello
⚓Ruby trunkより
⚓提案: 第2のGCヒープ「Transient heap」
ko1さんによる提案です。
mallocが管理するヒープに代わる第2のGCヒープ「Transient heap」のMRIへの導入を提案します。利用されるGCアルゴリズムは「世代的」「コピー」GCアルゴリズムに近いものです。これによってmallocされたヒープの問題を軽減できると見込みます。
同issueより大意
つっつきボイス: 「mallocの手前に別のメモリ管理レイヤを置くという感じ: 結局OSのメモリ管理とRubyのメモリ管理という2層があるから、mallocだといろいろうまくいかないところがあるんでしょうね」「ふーむ🤔」「今日の社内勉強会でキャッシュのしくみの話をしたけど、キャッシュの場合と似た感じで、同じ仕事をする層が複数あるとそれぞれがてんでに局所最適に動作して全体としてうまくいかない、なんてことが起きがちですね」
⚓Time.strptime
が%j
を使うユリウス暦で正しく動かない
# 同issueより
require "time"
require "date"
### Works for Dates ###
parsed_date = Date.strptime("15300", "%y%j")
expected_date = Date.new(2015, 10, 27)
# Does not raise
raise "dates not equal" if expected_date != parsed_date
### Does not work for Time ###
parsed_time = Time.strptime("15300", "%y%j")
expected_time = Time.new(2015, 10, 27)
# Raises
raise "times not equal" if expected_time != parsed_time
つっつきボイス: 「Date
だと動くのにTime
だと動かないというバグ」「Julian date=ユリウス暦の日付」
ローマ教皇グレゴリウス13世が1582年、ユリウス暦に換えて、太陽年との誤差を修正したグレゴリオ暦を制定・実施したが、今でもグレゴリオ暦を採用せずユリウス暦を使用している教会・地域が存在する。
Wikipediaより
ツイートより
つーかそもそも %j はユリウス日ですらねぇ。年頭からの通日だ。
— さく (@sakuro) June 22, 2018
⚓Time
にタイムゾーンを設定する公式のAPIが欲しい
# 同issueより
>> ENV['TZ'] = 'America/New_York'
>> Time.now.zone
=> "EDT"
>> ENV['TZ'] = 'Europe/London'
>> Time.now.zone
=> "BST"
ActiveSupport::TimeWithZone
でやってるようなのを定めたいそうです。
参考: ActiveSupport::TimeWithZone
つっつきボイス: 「タイムゾーンは誰がというかどこで一元管理するのかという問題がそもそもあるんですけど、最終的にはOSの環境変数が頼りですね: この機能はActiveSupportから持ってきてもいいと思う」
⚓Ruby
⚓StripeのRuby lint
Link: Stripe is building a Ruby typechecker – Byteconf – Medium https://t.co/INmiYFzxhv
— Yukihiro Matz (@yukihiro_matz) June 18, 2018
- サイト: Sorbet Playground
つっつきボイス: 「Stripeはこの辺に力入れてますね: RubyKaigiのこの発表見られなかった😢」「この間のウォッチでもちょっとだけ扱いましたが一応」「sig(foo: Integer).returns(String)
みたいにシグネチャを指定するのか: Matz好みでないやり方😆」「構文変わっちゃいますもんね...」
# sorget.runより
class A
sig(foo: Integer).returns(String)
def bar(foo)
foo.to_s
end
end
def main
A.new.barr(91)
A.new.bar("91")
end
⚓グループ名がない場合にスキップする修正
skip when group name is not foundhttps://t.co/NkxGbefYjW
— Ruby and Rails Log (@rubyandrailslog) June 20, 2018
Windows対応のようです。
⚓mruby-meta-circularとは
Link: 私が書いているものは型推論器ではなくなんなのか https://t.co/4RQ5KPTLL8
— Yukihiro Matz (@yukihiro_matz) June 16, 2018
つっつきボイス: 「RiteVMってmrubyのVMなんですね: Riteというとつい春の祭典を連想してしまいます🙂」
参考: mruby Virtual Machine(RiteVM) — mrubook 1.0 documentation
「今回のRubyKaigi 2018を見てて思ったんですが、mrubyって組み込み系という印象がそれまで強かったけど、最近はむしろH2Oみたいなミドルウェア系での活躍が目立っててそちらで見直されてる感」「確かにH2Oの成功がアピールした感じありますね😃」
参考: H2O - the optimized HTTP/2 server
別件ですがこんなのも。
mruby添付のminirakeにparallel compilationオプションが付き、ccacheと組み合わせると私のマシンではtravis_config.rbのフルビルドが8秒で完了するようになった。ありがとう @take_cheeze
— Yukihiro Matz (@yukihiro_matz) June 21, 2018
⚓dining-table: Rubyでテーブルをきれいに作るgem
- リポジトリ: mvdamme/dining-table
# 同リポジトリより
class CarTableWithConfigBlocks < DiningTable::Table
def define
table_id = options[:table_id] # custom option, see 'Options' above
presenter.table_config do |config|
config.table.class = 'table-class'
config.table.id = table_id || 'table-id'
config.thead.class = 'thead-class'
end if presenter.type?(:html)
presenter.row_config do |config, index, object|
if index == :header
config.tr.class = 'header-tr'
config.th.class = 'header-th'
elsif index == :footer
config.tr.class = 'footer-tr'
else # normal row
config.tr.class = index.odd? ? 'odd' : 'even'
config.tr.class += ' lowstock' if object.stock < 10
end
end if presenter.type?(:html)
column :brand
column :stock, footer: 'Footer text'
end
end
つっつきボイス: 「名前が😆」「一度こういう感じに作っておけばHTMLテーブルの他にも後でcsvとかxlsxとかいろんな形式で出せるのか: カスタマイズしたテーブルを扱うときなんかにちょっといいかも😋」
⚓MRuby-Zest: mrubyのオーディオGUIフレームワーク
Link: MRuby-Zest: a Scriptable Audio GUI Framework: https://t.co/QzQiyfBacN
— Yukihiro Matz (@yukihiro_matz) June 17, 2018
⚓長ったらしいif-else条件のリファクタリング(RubyFlowより)
# 同記事より
# Before
# Metrics/MethodLength: Method has too many lines. [13/10]
def foo1(number)
if number == 1
'one'
elsif number == 2
'two'
elsif number == 3
'three'
elsif number == 4
'four'
elsif number == 5
'five'
else
'many'
end
end
# After
DICTIONARY = {
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five'
}.freeze
def foo2(number)
DICTIONARY[number] || 'many'
end
つっつきボイス: 「うん、これは定番のリファクタリングですね: よく使うというか最初からこう書くし」「そうでしたか!😲」「DICTIONARY
を作ることで意味が明確になるし、条件を後で変えたり追加したりするのも楽だし、何より読みやすい❤️」
「↓こんなふうにlambda使うのはちょっとスゴイな😉、でもこれも自分使ってるわ」「😀」「こうやってlambda使ったり出力をeval
したりするとかすると最強感💪」
# 同記事より
# After
module SearchService2
PARAMS_MAP = {
'id' => ->(value) { { id: value } },
'first_name' => ->(value) { { 'first_name' => value } },
'last_name' => ->(value) { { 'last_name' => value } },
'email' => ->(value) { { 'email' => value } },
'city' => ->(value) { { 'city' => value } },
'gender' => ->(value) { { gender: value } },
'height_after' => ->(value) { { height: { '$gt' => value } } },
'height_before' => ->(value) { { height: { '$lt' => value } } },
'weight_after' => ->(value) { { weight: { '$gt' => value } } },
'weight_before' => ->(value) { { weight: { '$lt' => value } } },
}.freeze
...
⚓その他Ruby
- 元記事: Should you implement a bug bounty program | ButterCMS
- 元記事: Ruby inheritance -Access modifiers and misconceptions behind them(RubyFlowより)
- リポジトリ: angela-d/resgen/ -- レジュメ作成支援gem(RubyFlowより)
`0o` で8進数というのは知っていたけど、 `0` だけでも8進数扱いになるのか。。
instance method String#to_i (Ruby 2.5.0) https://t.co/6qciKvyIyI
— masa寿司 (@masa_iwasaki) June 13, 2018
つっつきボイス: 「言われてみればそうだったわー😲: あんまり使わないけど...」
スタバでRubyしてて、エラーが出て困ってた。そのとき後ろから、「エラー見ましょうか?」とお兄さんが声をかけてきて、エラーを解決してくれた。そのあと「頑張ってください」とさっそうと去っていった。かっこいい。
— ラーメン食太郎@ラノベ感想ブログ (@samurai_se) June 16, 2018
YouTubeにRubyKaigiのKeyNote上がってた。順次上げてくのかな。 #RubyKaigi
— たのじ@来年は松本行きたいな。 (@twitanoji) June 16, 2018
Link: まつもとゆきひろさん「ことわざに通じるRubyのプログラミングとコミュニティ」 〜RubyKaigi 2018 基調講演 1日目:RubyKaigi 2018 Keynote レポート|https://t.co/Jk0Yj49uzS … 技術評論社: https://t.co/PTb940tOyp
— Yukihiro Matz (@yukihiro_matz) June 20, 2018
esp32で完全素人がmrubyプログラミングするのに準備するのは、なにがいいのかな。micro:bit?
— Yukihiro Matz (@yukihiro_matz) June 20, 2018
月曜日、東京にいるので #tcfm に行けるかな
— Yukihiro Matz (@yukihiro_matz) June 20, 2018
TCFM出演?
- 追記(2018/06/23): しまったこれでした↓
Turing Complete FMミートアップ、TECH PLAY様のご好意で渋谷のイベントスペースを貸していただけることになりました! 従って6/25(月)7pm〜で開催決定です。参加登録はこちらから→ https://t.co/Q98tqNuEq5 #tcfm
— Rui Ueyama (@rui314) June 21, 2018
RubyKaigi 2018での生ペアプロ動画も上がってました。
⚓クラウド/コンテナ/インフラ/Linux
⚓Linux高速化の話題2つ
https://twitter.com/hatebuholic/status/1008504153101033472
つっつきボイス: 「最近のLinuxネットワークの詳細は正直よくわからん😆: まともに追いかけてたのはカーネル2.6ぐらいまでだったし」「あー、じゃLinuxも結構がっつり更新されてるんですね」「ちゃんと更新されてますよ😎」
コンパイラやリンカに還元して欲しい。 / “Linuxバイナリを最適化して性能を向上させる「BOLT」、Facebookがオープンソースで公開。言語やコンパイラに依存せず高速化 - Publickey” https://t.co/dZQKixiKt7
— mattn (@mattn_jp) June 21, 2018
⚓書籍「実践 パケット解析 第3版」
第3版出てたのか /
O'Reilly Japan - 実践 パケット解析 第3版 https://t.co/9hiKsYIkAJ— y-yagi (@y_yagi) June 18, 2018
⚓OSI階層とは
「ネットワークエンジニアといえばこの図だね」で笑った #npstudy pic.twitter.com/850rRtlvW9
— ふたみん (@futamint) June 8, 2018
このネタ割と前からあったんですね。
⚓Google I/O 2018全動画
Google I/O 2018 - All Sessions - YouTube https://t.co/kJgI2lotrn これは、勉強し放題ではないか。凄い。
— V (@voluntas) June 17, 2018
その他クラウド/コンテナ/インフラ/Linux
- 元記事: Microsoft 365 FastTrack Now Supports Co-management Deployment Guidance - WinBuzzer -- Microsoft 365 FastTrackの新機能
関係あるかどうかわかりませんが、以下も見つけました。
(Ive never been able to say this yet)
🙋Well Actually!🙋All of Office 365 is (almost finished) being completely rewritten in this little scripting language called #JavaScript.
And Skype
And Microsoft Teams
And @Code
And all of @MSEdgeDev Debug Protocol (instead of C++)— 📦🛠👷🏻♂️Sean Larkin (@TheLarkInn) June 13, 2018
- 元記事: Everything about DNS, you never dared to ask. A Primer. - DNSimple Blog -- 誰も尋ねないDNSの秘密(RubyFlowより)
- 元記事: 脱MacBookしようとしてnew XPS 13 2018年モデルにLinuxをいれてみたけどちょっと後悔してるよ - タオルケット体操
自分用にコンピュータを買うならCPUはIntelだとしてどれを選ぶ? ちなみに私ならi5
— sanonosa🍍 (@sanonosa) June 20, 2018
パッチベースの分散バージョン管理システム。良さそうだけど名前が覚えられないのは重大なマイナスな気が。
Link: Pijul: https://t.co/lprg0QwJxN— Yukihiro Matz (@yukihiro_matz) June 20, 2018
ほんとだMacの日本語入力モードでzh,zj,zk,zlと打つと矢印が出る! vi使いの仕業だな https://t.co/qHundycpK1
— Haruhiko Okumura (@h_okumura) June 20, 2018
つっつきボイス: 「これ定期的に出回るネタ😎」「🤣」
小説をgit管理するようになったらすんごい楽になったから物書きのためのgit入門も書きたいんだけど、gitを説明するのはLaTeXを説明するより遥かに難しい……
— 斎藤漁火(isari) (@isaribi_saitoh) June 18, 2018
Link: プログラマ向けノート「Boostnote」開発のBoostIO、オープンソースのバグ修正をクラウドソーシング的に依頼できる「IssueHunt」をローンチ - THE BRIDGE(ザ・ブリッジ): https://t.co/3bWZunxois
— Yukihiro Matz (@yukihiro_matz) June 20, 2018
SRE に限らず、Web 系システムの運用やってる若い人全員にオススメしたいんですが、『インフラエンジニアの教科書 2』 のデータベースの章はガチ。
特にデータベースの日常監視の項目に書かれてる内容はぜんぶテストに出るし、現場で「あ、これゼミでやった問題だ」ってなります。— かつひささん (@katsuhisa__) June 17, 2018
⚓SQL
⚓試さないと損するPostgreSQLの機能(Postgres Weeklyより)
⚓AWS RedshitとPostgreSQLはどこが違うか(Postgres Weeklyより)
⚓pgdeltastream: PostgreSQLの更新をリアルタイムに観測(Postgres Weeklyより)
- リポジトリ: hasura/pgdeltastream
⚓PostgreSQLの関数
はてブで見かけました。
⚓JavaScript
⚓AirbnbがReact Nativeをやめた話
すごい、5つのパートに渡ってRNをやめた経緯が書かれている / React Native at Airbnb – Airbnb Engineering & Data Science – Medium https://t.co/XAYXX0xIFW
— Student (@rejasupotaro) June 19, 2018
はてブなど各所で話題ですね。ついAirBnBと書いてしまいそうです。
React Native at Airbnb、中身読まずに結論づけてる人が多そうなので日本語訳をやっていきます 翻訳の許可は確認中です/ React Native at Airbnb(Ⅰ) 日本語訳 - https://t.co/d5f380rbwf https://t.co/rvuumeZUad
— hotchemi (@hotchemi) June 20, 2018
↑先越されちゃいました(´・ω・`)。
つっつきボイス: 「これもmizchiさんが早速アンサー記事↓書いてくれてますね」
参考: いつ ReactNative を使っても大丈夫か - mizchi's blog
⚓flutter.ioとAndroid fuchsia OS
社内Slackで密かに見守られています。Dart言語ベースだそうです。
参考: Dart - Wikipedia
Flutterが何らかの形でFuchsia OSに採用されるかもしれないとも。
参考: iOSとAndroid、両方のアプリを一度に作れちゃう優れモノ! Googleの隠れた戦略が見える「Flutter SDK」 | ギズモード・ジャパン
⚓Parcel 1.9.0リリース(JSer.infoより)
⚓その他JavaScript
個人的には若い人はjqueryを勉強する必要ないと思う
- これからはvue, reactでいきましょう
- 基礎はちゃんとpure jsを学びましょう
- 今世の中にあるwebサイトにはjqueryが死ぬほど使ってあるので、嫌でも業務でやる機会が出てくる。その時に学ぶで問題ない。— なかむ (@____nakamu____) June 19, 2018
もしこんなのを求められるようになったら、日本を出ていくかソフトウェア開発者やめるかするよ… / JavaScript実行時、「閲覧者の了解をいちいち得る」ページ登場 「Coinhiveより嫌」「悪夢」と話題 - ITmedia NEWS https://t.co/qGmkMDqN9Y
— 五里霧中 (@kubosho_) June 20, 2018
⚓CSS/HTML/フロントエンド/テスト
⚓「WebDriver」がW3CでRECに
“「WebDriver」がW3Cの勧告に到達。Webブラウザのテスト自動化などを実現 - Publickey” https://t.co/SUAeBYWOWD
— takehikom (@takehikom) June 20, 2018
参考: 「WebDriver」がW3Cの勧告に到達。Webブラウザのテスト自動化などを実現 - Publickey
⚓GDPRどころじゃないのかも
Creative Commonsも反対を表明しています。つかTechRachoも他人事ではありません。
.@EP_Legal has adopted both Article 11 (#linktax) and Article 13 (#CensorshipMachines). It’s a dark day for the open web, but the fight will continue in the upcoming plenary vote in the European Parliament. #SaveYourInternet #SaveTheLink #FixCopyright
— Creative Commons (@creativecommons) June 20, 2018
参考: ハイパーリンクを貼るだけで著作権料がかかる通称「リンク税」がEUで導入されようとしている - GIGAZINE
⚓CSS+JSのアニメーションロゴ
⚓Unicode 11.0リリース
つっつきボイス: 「とりあえず絵文字増えましたね❤️」「海老🍤」
参考: Emoji Recently Added, v11.0
⚓リグレッションとデグレーションの違い
⚓その他CSS/HTML/フロントエンド/テスト
- サイト: Welcome, Camper! | freeCodeCamp -- HTML/CSS/JSの素振りができるサイトって他にあるかしら?
- 元記事: 治安の悪い Slack Emoji を作るツールを作った - Qiita -- 動く絵文字、嫌いな人はとてもキライらしいと最近知りました
https://twitter.com/dothtml5/status/1009386658981130241
⚓言語よろずの間
⚓マイクロソフトのBlazorとは
⚓GoからPHPに帰ってきた話
https://twitter.com/hatebuholic/status/1008504153105199107
話は少し逸れますが、先日のRubyKaigi 2018のドリンクアップでPHP開発者の方とお話しする機会があり、PHPでは英語情報を探さないといけない状況がほぼまったくないと伺いました。
⚓書籍「Go言語でつくるインタプリタ」の続編「Go言語でつくるコンパイラ」がリリース
おおおーWriting An Interpreter In Goの作者が次はWriting Compiler In Goを!期待感しかないすなー https://t.co/Qzw0vw7iGY
— Taichi Nakashima (@deeeet) June 20, 2018
↓参考まで: こちらは例のGobyちゃんに最も強く影響を与えたリファレンスです。
ごめん、写真が雑すぎたから上げ直すね pic.twitter.com/Mc0MIHiolU
— 7594591200220899443 (@shyouhei) June 18, 2018
⚓SHA1コリジョン
SHA-1(160ビット)がコリジョン起こす確率は・・・! https://t.co/t67s8IZC5L
— Haruhiko Okumura (@h_okumura) June 20, 2018
各所でバズってますね。
sha1のコリジョンって、いったいどんだけデータためてたんだろ。2^64とかでもまだ1/2^40くらいの確率じゃないの? truncateしてたわけじゃないよね? データが同一だったわけでもないよね?
— Kazuho Oku (@kazuho) June 20, 2018
超信頼性が必要なところで今SHA1使ってる可能性はゼロなので大丈夫でしょう(真顔)
— 成瀬 (@nalsh) June 20, 2018
SHA1 でコリジョン引いた人をパリジャンヌに似せてコリジョンヌと呼びたい。
— mattn (@mattn_jp) June 20, 2018
⚓モンティ・ホール問題より手ごわい「2封筒問題」
BPS社内でも盛り上がりました。
↑この問題について最も引用されているという短い論文です。読んでもいませんが、三浦俊彦『可能世界の哲学』によると、「交換すると双方が得になるのは事前期待値が無限大の場合に限られる」ことがこの論文で示されているんだそうです。
同書によると、この2封筒問題を扱うサイトや書籍は必ず炎上するらしく、出版界では密かに疎まれているんだそうです。Railsウォッチもついに炎上?
参考: 数学 - 二封筒問題
参考: 可能世界論 - Wikipedia
同書で紹介されていた以下の本もちょっと気になります。命名の助けになるか混乱の元になるかわかりませんが。
参考: 藤川直也『名前に何の意味があるのか 固有名の哲学』 - logical cypher scape
⚓Rust 1.27リリース
// 同記事より
// SIMDなし
let lots_of_3s = (&[-123.456f32; 128][..]).iter()
.map(|v| {
9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0
})
.collect::<Vec<f32>>();
// SIMDあり
let lots_of_3s = (&[-123.456f32; 128][..]).simd_iter()
.simd_map(f32s(0.0), |v| {
f32s(9.0) * v.abs().sqrt().rsqrt().ceil().sqrt() - f32s(4.0) - f32s(2.0)
})
.scalar_collect();
参考: SIMD - Wikipedia
⚓その他言語
- 元記事: (1) プログラマーであるあなたは、自分自身を言葉で統治しているのですか? - Quora
- 元記事: 「Go言語らしさ」とは何か? Simplicityの哲学を理解し、Go Wayに沿った開発を進めることの良さ - エンジニアHub|若手Webエンジニアのキャリアを考える!
えっ...... -> "自分用にカスタマ イズした Vim と、ほとんどデフォルトの状態の Vim の間をスイッチするのは非常に簡単で、これは普段 Ruby を書いている人が急に Haskell を書いても 大丈夫な感覚に近いです。" Software Design 2018年 7月号 p.46
— yancya (@yancya) June 18, 2018
たぶん反語?
私は.vimrcは最小限しか設定してません。
Q. 好きな定理は何ですか?
A. ネーターの定理ですこれは「系に連続的な対称性がある場合、それに対応した保存則が必ず存在する」というもので、例を挙げると
時間対称性→エネルギー保存則
並進対称性→運動量保存則
回転対称性→角運動量保存則
ゲージ対称性→電荷保存則があります
— ヨビノリたくみ😬 (@Yobinori) June 20, 2018
This project finds #Golang projects on GitHub and format them 😆https://t.co/mUdFxJBtkA
— Stan Lo 🕵️♂️ (@_st0012) June 17, 2018
あらゆるGoリポジトリにgofmt -w .
をかけてまわるようです。
Tip of the day.
Scripting languages as first programming language for CS bachelors are WRONG. You are not able to write an OS, a DBMS, or even an Office suite with an scripting language.
— J. Daniel Garcia (@jdgarciauc3m) June 10, 2018
この本まじすげー。コードにルビを降るのすごいし、エラーコードとかもすごい!!!というか、最高の発明だ #インプレス pic.twitter.com/fKtqLhcTLx
— erukiti.ts (@erukiti) June 14, 2018
Ruby プログラムにルビ。 https://t.co/gFYtYBY734
— Yukihiro Matz (@yukihiro_matz) June 21, 2018
⚓その他
⚓3D XPointメモリとは
- 元記事: 【イベントレポート】ついに明らかになった3D XPointメモリの正体。外部企業がダイ内部を原子レベルで解析 ~相変化メモリとオボニックスイッチで構成 - PC Watch -- 昨年の記事です
⚓macOSの「クイックルック」は残る
SQLite使ってるって初めて知りました。
参考: macOSの「クイックルック」は暗号化ドライブのファイルまでキャッシュしており、データは永続的に保管されいつでも閲覧できる - GIGAZINE
⚓人感センサー
IKEAで買い物中、たまたま目に付いた人感センサー付きLEDライト「OLEBY」を買ってみた。
単四電池3本でスイッチは無し。両面テープで壁に貼るだけで取り付け完了。
かなり広範囲で人影を察知してサッと光る。微妙に暗いクローゼットがとても便利になった。これで2個セット799円。 pic.twitter.com/IUvS5UjZ1c— ORCRIST (@orcrist) February 11, 2017
これ改造がとっても楽なんだそうです。
⚓その他のその他
- 元記事: 車への無線IDチップ取り付けが義務化へ、中国でさらなる監視強化か - GIGAZINE
- 元記事: Grafene, scoperta una sua nuova e rivoluzionaria proprietà: proiettare luce - Wired
- 元記事: 珍品堂購買部
純粋に欲しいです。けどCD-ROM販売...
大阪の地震でたくさんの大切な器が割れたと思いますが、捨てないで欲しい。(最初に金継ぎ講座を開いてくれたのは、高槻市だった)また、直し方教えに行きます。親の形見とか家宝の茶碗とかバラバラでもなんとかなりますので。 pic.twitter.com/L0iCGjNcUd
— ナカムラクニオ Kunio Nakamura (@6jigen) June 18, 2018
あと最近痛感したのが、「あとでいいや」つって後回しにしている小さい細々した作業が、意外と脳のメモリ喰ってるってこと。そういうのいちどがっつり処理してメモリ開放してやるとびっくりするくらいパフォーマンス上がる。一度まとまった時間とって、そういうの一気に片付けるべき。
— ひらめきメモ🎉7万部📔 (@shh7) June 18, 2018
— 廣瀨 雄太 |服屋 itochi (@hirose__yuta) June 20, 2018
(平均示す)棒グラフはダメだという話。 https://t.co/vyxSH1M7Qm
— Takahiro Sumiya (@gnutar) June 20, 2018
自分の過去記事ですが、これやっぱ大事なこと言ってると思うのでRT
新調理システムとロボットが結びつくとき、厨房に革命が起こる
ニチワ電機による自動搬送ロボット台車活用の試み https://t.co/FYm213TneE— 森山和道/ライター、書評屋 (@kmoriyama) June 18, 2018
そして、プログラミング自由研究で話題になって「子供の科学」7月号も買ってみた。研究の進め方やレポートの書き方の基本まで書いてある。子供がみんなこれを読んでくれてたら、大学での教育は楽になるなぁw pic.twitter.com/7fZirvb2Ds
— 宮下芳明 Homei Miyashita (Professor, Meiji University) (@HomeiMiyashita) June 19, 2018
「日本の本社の生産技術部が設計した製造ラインの発想自体が古くて中国では使えない」RT
「紅いシリコンバレー」深センで目撃したロボット産業の恐るべき進化
日本のお家芸で中国企業の後塵を拝する日も近いhttps://t.co/KXTD4OHDts— 森山和道/ライター、書評屋 (@kmoriyama) June 18, 2018
そういえば祖父宅から出てきたこいつがなんなのか調べてなかったな pic.twitter.com/NpkNdTWq4W
— プリン🐣 (@Purin8492) June 18, 2018
つっつきボイス: 「あーこれ何だっけ??」「タイガー式計算機ですね: 自分も実物見たことありませんが😭」
朝永振一郎のエッセイでこれと朝晩格闘してたという記述を見たぐらいでした。
(´-`).。oO( 深層学習、例えるならジェットエンジンのコンプレッサーやMRIのFFTみたいな技術スタックですから、早晩外注になりますし、少し学べば誰もができるのが当たり前になりますし、その技術だけでは待遇が下がっていきますよね…。全ての技術はそれを適用するドメインが大事です。 )
— Yuta Kashino (@yutakashino) June 21, 2018
↑後はワイヤレスになってくれれば完璧ですね。
⚓番外
⚓氷河期の写実的な壁画は自閉症スペクトラムの表れという説
参考: 氷河期の壁画が驚くほどに写実的だったのは「描き手が自閉症だったから」という説明 - GIGAZINE
⚓明和電機健在
金曜日は東京で稲見自在化身体プロジェクトのキックオフミーティングにお呼ばれして、明和電機の土佐さんとパネルでご一緒した。その後、土佐さんからパンフレットをいただいたのだが、これがもう最高過ぎて。https://t.co/nWIyHG7asc pic.twitter.com/BZM7hqUQsK
— Minao Kukita 久木田水生 (@minaokukita) June 17, 2018
参考: 明和電機 - Wikipedia
⚓特大ステッカー
MacBookにステッカーベタベタやるやつやりたいんだけど美術館のミュージアムショップで最高のやつを見つけてしまってこれ以上貼るのが難しい pic.twitter.com/u9JTuyLeIo
— まび (@mability) June 15, 2018
⚓変わり筐体
これなんてどう? pic.twitter.com/Wz33FoBnl2
— 大塚実(Minoru OTSUKA) (@ots_min) June 17, 2018
こんなのもあるぞ! pic.twitter.com/1ecH7To4BU
— 大塚実(Minoru OTSUKA) (@ots_min) June 18, 2018
⚓極太マジックハンド
《日経Robo》日本ハムが焼豚などの把持にソフト素材の新型グリッパー https://t.co/Xztq9UzDzV
— 日経クロステック 自動車・電機 (@techon) June 7, 2018
⚓過酷な環境で酸素を生むバクテリア
参考: 人類の火星移住で酸素の供給源として活躍するかもしれないバクテリアが発見される - GIGAZINE
⚓WiFiで壁の向こうを透視
既にWiFiでの室内の物体の位置特定ってできてた気も。
⚓材料は星
「謙虚であれ、あなたは土から出来ているのだから。
気高くあれ、あなたは星から出来ているのだから。」
セルビアの諺らしいけど、ビッグバン宇宙論の元素合成の話に通じる深さがあってカッコいい。— Shuuji Kajita (@s_kajita) June 17, 2018
⚓極大から極小までをインタラクティブに
元になった以下の「Powers of Ten」はかなり昔にIBMが制作した定番の教育コンテンツだそうです。
つっつきボイス: 「やっぱり最後は宇宙ネタ?」「そう決めてるわけではないんですが、何となくで😆」
今週は以上です。
おたより発掘
TechRachoの中の勉強会を終えて帰宅中。@morimorihoge さんの知識の幅が広くて凄い。
— osamu arita (@osamu_arita) June 21, 2018
今回もボリュームがすごい...個人的には「長ったらしいif-else条件のリファクタリング」の項目が特に勉強になりました >> https://t.co/t7dNfJWmkc
— popmac (@popmac1451) June 23, 2018
バックナンバー(2018年度後半)
週刊Railsウォッチ(20180615)TTY gemとHTTPClient gemは優秀、Rubyの謎フリップフロップ、ちょいゆるRubyスタイルガイドほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。