こんにちは、hachi8833です。記事数抑えたはずが遅くなってしまいました。
各記事冒頭にはでパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
Rails: 今週の改修
全体にrafaelfrancaさんのコミットが目立ちます。まずはまだ動いている5-2-stableから。
Rack::BodyProxy
でbodyが改変されていたのを修正
@app.call
が返すオブジェクトが(定数などで)保存済みだと、Rack::BodyProxy
でbodyをラップする継続サイクルでbodyが改変され、最終的にSystemStackError
になる。以下は再現コード。
同PRより
# 同PRより
class HealthcheckApp
SUCCESS_RESPONSE = [200, { 'Content-Type' => 'text/plain' }, ['success']].freeze
def initialize(app)
@app = app
end
def call(env)
return SUCCESS_RESPONSE if env['PATH_INFO'] == '/heartbeat'
@app.call(env)
end
end
app = HealthcheckApp.new(-> (_x) { [200, {}, nil] })
logger = Rails::Rack::Logger.new(app)
logger.call('REQUEST_METHOD' => 'GET')
つっつきボイス: 「ほあっSystemStackError
って割りとキツイやつ?」「修正前のはresp[2] =
みたいに配列を直接書き換えてますね↓」「ははー、なるほど!修正前はresp = @app.call(env)
と配列が参照渡しになってた」「修正後のは変数展開で渡してるから書き換わらないと」
「直接書き換えてても普通に使われてる分にはほとんどの場合問題は起きなかったんでしょうけど」「使いまわしているうちにcontent lengthとかMD5あたりで不整合が生じそう」
# railties/lib/rails/rack/logger.rb
- resp = @app.call(env)
- resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
- resp
+ status, headers, body = @app.call(env)
+ body = ::Rack::BodyProxy.new(body) { finish(request) }
+ [status, headers, body]
「しかしSystemStackError
って心にインパクトあるというか、見ると絶望感に襲われそうw」「これだからconst
できない言語は(爆)」
ActiveRecord::QueryCache
ミドルウェア内を最適化
# activerecord/lib/active_record/query_cache.rb#L28
def self.run
- ActiveRecord::Base.connection_handler.connection_pool_list.map do |pool|
- caching_was_enabled = pool.query_cache_enabled
-
- pool.enable_query_cache!
-
- [pool, caching_was_enabled]
- end
+ ActiveRecord::Base.connection_handler.connection_pool_list.
+ reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! }
end
- def self.complete(caching_pools)
- caching_pools.each do |pool, caching_was_enabled|
- pool.disable_query_cache! unless caching_was_enabled
- end
+ def self.complete(pools)
+ pools.each { |pool| pool.disable_query_cache! }
ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
つっつきボイス: 「map
で回していたのをreject
とeach
に変えたと」「呼び出し多いだろうからmap
で全回しじゃなくてreject
でフィルタしてからeach
する方が効率いいぜ、ってことか」「ベンチマーク見たいなー: ないのかな?」
params#dig
の修正
params = ActionController::Parameters.new(a: { b: { c: 1 } })
params.dig(:a, :b)[:c] = 2
params
# 修正前=> <ActionController::Parameters {"a"=>{"b"=>{"c"=>1}}} permitted: false>
# 修正後=> <ActionController::Parameters {"a"=><ActionController::Parameters {"b"=><ActionController::Parameters {"c"=>2} permitted: false>} permitted: false>} permitted: false>
# actionpack/lib/action_controller/metal/strong_parameters.rb#L592
def dig(*keys)
- convert_value_to_parameters(@parameters.dig(*keys))
+ convert_hashes_to_parameters(keys.first, @parameters[keys.first])
+ @parameters.dig(*keys)
end
つっつきボイス: 「確かにdig
は修正前みたいな挙動を期待しないですよね普通: 上と似た感じのミューテーション問題」「参照渡しから値渡しへの変更」
「それにしてもこういう書き方↓されるとイヤだよねって思うw: 推奨したくない」「ものすごく追いにくいコード」「どう呼ばれても安全にしておくのがいい書き方デス!」「ほんとその通り!」
params.dig(:a, :b)[:c] = 2
メソッド呼び出しのダブルsplat**
を普通の引数に変更
続いてRails 6向けmasterから。
# actionview/lib/action_view/helpers/form_helper.rb#L1973
- fields_for(scope || model, model, **options, &block)
+ fields_for(scope || model, model, options, &block)
つっつきボイス: 「Ruby 2.6ではダブルsplat **
の使用が警告されるみたいですね」「上だけ見ると、メソッド定義側ではなくてメソッド呼び出し側のダブルsplatですね」「Rubyのその変更ってどこで知らされたんだろう?(記号探しにくい…)」「ruby 2.6.0dev (2018-04-04 trunk 63085)
で出る警告だということはわかったけど」
「うーん**
とか普段使わないからなー、pryでちょい試しているけどうまくダブルsplatのbad caseを出せない…: おー、呼び出し側では**
があってもなくてもハッシュをキーワード引数として渡せる↓ことはわかった」
h = {a:1, b:2, c:3}
def hoge(arg=99, a:, b:, c:)
puts "arg:#{arg}, a:#{a}, b:#{b}, c:#{c}"
end
hoge h #=> z:99, a:1, b:2, c:3
hoge **h #=> z:99, a:1, b:2, c:3
「つ#12106: 2年前にオープンしたまま閉じてませんが、何かそれっぽいissue見つけたので誰か頑張って解読してください」「works fineってどの辺がfineなんだか」
不要なActionController::
を削除
# actionpack/lib/action_controller/metal/exceptions.rb#L25
- class ActionController::UrlGenerationError < ActionControllerError #:nodoc:
+ class UrlGenerationError < ActionControllerError #:nodoc:
end
修正そのものはシンプルですが、 rafaelfrancaさんのEiNSTeiN-:patch-1
というブランチ名が何だか気になりました。
つっつきボイス: 「superfluous: 余分な、無駄な」「すごーく堅苦しい言葉ですね」
確かこの言葉を最初に見たのはスピノザの「エチカ」の英語版でした(原文はラテン語)。
finalize_compiled_template_methods
をデフォルトでオンに
# actionview/lib/action_view/template.rb#L9
class Template
extend ActiveSupport::Autoload
- mattr_accessor :finalize_compiled_template_methods
- self.finalize_compiled_template_methods = true
+ mattr_accessor :finalize_compiled_template_methods, default: true
action_view.finalize_compiled_template_methods
はconfigなんですね。
つっつきボイス: 「んなオプション(゚⊿゚)シラネ」「この設定ってどこだろ?」「つ9facd9a」
「ところで、このPRはどうやら単なる書式修正ですね」「お」「その前のeede8d8 Add action_view.finalize_compiled_template_methods
config optionでの機能追加したときの書式が古かったからちょっと直したということみたい」「しまった、そっちが本編でしたか」
Rails
RubyのSassが非推奨に
- 元記事: Ruby Sass is Deprecated « Sass Blog
- サイト: Sass: LibSass — C/C++への移植
- 旧リポジトリ: sass/ruby-sass — 非推奨(場所も移動してました)
- 新リポジトリ: sass/dart-sass — Dartで実装されたSass(今後これらがofficial)
つっつきボイス: 「今日Slackに流してもらった情報ですね」「しばらくちょい面倒なことになりそうな気がする: sass-railsとsassc-railsの両方に依存してたらどうなっちゃうんだろうとかw」「LibSassはC/C++で速そうではある」「しかしRuby版がなくなるのはちょっと悲しいなー: マイナーなアーキテクチャ上でちょっとした処理するときとか便利だったんで」
Webpacker 4 pre版リリース(Hacklinesより)
つっつきボイス: 「Webpack 4はこないだ出てる(ウォッチで既報↓)から、Webpacker gemも追随してるということですね」「割と紛らわしい…WebpackとWebPacker」「もうpre2になってるし↓」「まあまだしばらくかかるかな」
Rails 5.2のcredentialをKubernetesで使う(Ruby Weeklyより)
Kubernetesは最近「クバ」とか「クーバァ」みたいにじわじわ略されつつあるような雰囲気?
つっつきボイス: 「確かにそろそろ呼び方統一してもいいんじゃね?」「記事の方は、Railsのcredentialsはそもそもマイクロサービス的なコンテナを意識したソリューションだから当然できますね」「確かに: 記事短いし、『やってみたらできた!うれしい!』という感じ」
マイグレーション支援gem 4種
- リポジトリ: ankane/strong_migrations
- リポジトリ: LendingHome/zero_downtime_migrations
- リポジトリ: instructure/outrigger
- リポジトリ: procore/handcuffs
handcuffs(手錠)ってすごい名前。
つっつきボイス: 「strong_migrationsはTechRachoにも何度か登場してますね: 有名」「何というか微妙によくやってくれるヤツ」「この手のマイグレーションに機能を追加するのって怖くてしょうがないんですけど: 1個のマイグレーションファイルをずうっと書き換えるのこっそりやってますが何か」「何とw」「あ、でもそれってクックパッドさんでおなじみのridgepoleがまさにそれですよね: ridgepoleは結構いい」「ridgepoleを使うときは、マイグレーションの履歴を知りたければGitのログ見れということになる」「言われてみれば履歴を二重管理することもないですね」「本格的に使ったわけではないけれど、ridgepoleがつらくなることがあるとすれば、ridgepoleが対応していないDBMSの独自機能をいじり始めたときかな」
参考: クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ
「zero_downtime_migrationsはおそらくPostgreSQLの機能を使ってやるんじゃないかな: PostgreSQLに確かそういうスキーマ変更時のロック回避関連の機能があった」
「outriggerはマイグレーションにタグを打てるみたいですね↓」「いやぁ、マイグレーションでタグが必要になる運用って何か間違ってる気がする…」
# instructure/outriggerより
class PreDeployMigration < ActiveRecord::Migration
tag :predeploy
end
class PostDeployMigration < ActiveRecord::Migration
tag :super_fun
end
Switchman::Rake.shardify_task('db:migrate:tagged')
「handcaffsもマイグレーションにphaseを設定できますが、じゃこれも?」「同じくその運用自体がどうかと思うし、マイグレーションを複雑にするのは何かが間違ってる気がする…そう思わない?」「フレームワークが整備される前は機能としてのマイグレーションはなかったし、本番リリースすれば捨てていいぐらいのものだったはずだし」「そうそう、マイグレーションがソースコードとして永続化するのは方向性として何か違う気がする」「欲しいのは本来スキーマ」「昔は皆てんでばらばらにマイグレーションのバッチを書き捨てて追えなくなっちゃったりしただろうから、Railのマイグレーションファイルはそうした書式と置き場所を統一するためのものだったのかもですね」
「そういえば以前Excelにテーブルを書くとSQLを生成するマクロを作りましたよ: 今もこっそり使われてますが」「そうそうSIerがよくやってるヤツ」「新規はともかく変更し始めるとすごく面倒くさかったけどw」「そもそもRailsはスキーマ変更頻繁すぎ」「まあそれはRailsの思想ということで」
Roda: プラグイン方式の柔軟で強力なルーティングエンジン
- サイト: http://roda.jeremyevans.net/
- リポジトリ: jeremyevans/roda
y-yagiさんが最近好きなフレームワークだそうです↓。近々READMEの翻訳をTechRachoで公開しようと思います。
なお、以前翻訳したRodauthもRodaを全面的に使っています。Developers Meetupのアフターパーティで「RodauthのREADMEは名ドキュメント」とy-yagiさんとうなずきあいました。
つっつきボイス: 「Sinatraのルーティングがベースになってるらしいです」「あー、ネストで書けるのかなるほど!」「ソースを見ると、本体はわずかで、ほとんどの機能をプラグインとして装備してました」
# http://roda.jeremyevans.net/より
# cat config.ru
require "roda"
class App < Roda
route do |r|
# GET / request
r.root do
r.redirect "/hello"
end
# /hello branch
r.on "hello" do
# Set variable for all routes in /hello branch
@greeting = 'Hello'
# GET /hello/world request
r.get "world" do
"#{@greeting} world!"
end
# /hello request
r.is do
# GET /hello request
r.get do
"#{@greeting}!"
end
# POST /hello request
r.post do
puts "Someone said #{@greeting}!"
r.redirect
end
end
end
end
end
run App.freeze.app
「まあわかるなー: 何しろRailsのルーティングは最近になるほどよくわからなくなってきてるから(爆)」「この間もそんな話になりましたね」「Railsのルーティングの完全なドキュメントが欲しいし、ルーティングまじで難しい: ルーティングをネストしても必ずしもURLがネストされるとは限らないからかなり不可思議な感じになるとか」
「結局Railsガイドのルーティングが頼りってことですかね?日本語まだ追いついてないですが(やらなきゃ…)」「つguides/source/routing.md、とよく見たらRailsガイドのソースか」「ルーティングにconcern
あるんですけど?」「そう、あるんですよ」「defaults: { format: 'jpg' }
あたりからだんだん不思議感あふれてくる」「constraints
、これ割りと便利だけど気をつけないと死ぬ: ルーティングが重複しているときに記述の順序で評価順序が変わってハマったことあった」「to: MyRackApp
でRackアプリを指定できるんでlambda書けるし」
「やっぱり最新のガイドかー」「だいたいは見覚えあるけど、知りたいのはこれが組み合わさるとどうなるのかってところなんですけどねw」
「話逸れますが、Railsのルーティング機能って何か名前が付いてましたよね: Developers Meetup2日目オーラスの対談で耳にしたときに何のことだかわからなくて」「journey」「それだっ」
「線路」と「旅」としゃれたんでしょうね。
「Hanami 2.0でRodaを採用しようという提案も出されてるんですよ: breaking changeを承知で」「Roda、きれいに書けるしHanamiに入るのはいいんじゃないかな」
GoCD: デプロイをビジュアル管理するサービス(Ruby Weeklyより)
- サイト: https://www.gocd.org/
- リポジトリ: gocd/gocd
- 元記事: Run GoCD on Kubernetes | GoCD Blog
サイトの図のデザインがかわゆくて個人的に好きです。図がどうもカッコよく作れない人は、描線を思い切って太くするだけで相当印象変わるとこっそり思っています。
つっつきボイス: 「最近こういう感じのをよく見かけますね: ↓これGitLabにも同じようなのが入ってる」「ほんとだ」「AWSにもこういうのあるし、多くのCIに取り入れられてますね」
「AWSはCIとCD両方できる」「前にも話したけど、このCIとCDとCDって略称どうにかならない?w」「ですねー: 短くてかぶってて扱いづらい」
- CI: Continuous Integration
- CD: Continuous Deployment
- CD: Continuous Delivery
昔のRailsのdynamic finderって何がまずかったの?
ツイートで見かけて気になったので、ラジオのお葉書感覚で拾ってみました。
つっつきボイス: 「dynamic finderは昔のRailsにあったfind_なんちゃら
みたいなやつということで」「やっぱりメソッドが大量に生成されたのと、method_missing
で取るのが嫌がられたとかでしょうね: method_missing
だとデバッグも拡張もしづらいし」「かといって前もって生成するという方向にもならなかったし」
参考: Rubyリファレンスマニュアル method_missing
参考: activerecord-deprecated_finders — gemに切り出されたんですね
まったく個人的にですが、method_missing
というと排水口に仕掛ける網みたいなのを連想してしまいます。
ActiveRecordを非同期でマイグレーションする(Hacklinesより)
# 同記事より
class MigrationProcessingJob < ApplicationJob
def perform(params)
async_migration = AsyncMigration.find(params.fetch(:async_migration_id))
all_migrations = migration_context.migrations
migration = all_migrations.find { |m| m.version == async_migration.version }
# actual work!
ActiveRecord::Migrator.new(:up, [migration]).migrate
async_migration.update!(state: "finished")
end
def migration_context
ActiveRecord::Base.connection.migration_context
end
end
つっつきボイス: 「ははー、ジョブでマイグレーションやる感じか」「Rails Developers Meetupでからあげエンジニアことささたつさんのプレゼンで、彼がやっているClassiのdb:migrate
がすごく時間かかるという話をしてたんですが、そういう状況ではこういう形のasyncマイグレーションというのは検討の余地あるかも」「Classiさんはこの分野でけっこうシェアを伸ばしているそうでスゴイ」
その後、学校とインターネット接続の話題でしばし盛り上がりました。
その他記事など
- リポジトリ: kvokka/pp_sql — RailsのActive Recordログをカッコよく整形するgem
- 元記事: Russian doll caching in Rails | AppSignal Blog(Ruby Weeklyより)
- 元記事: Design Patterns in Large Rails Applications: Query Objects | iRonin.IT(Awesome Rubyより)
- リポジトリ: etewiah/property_web_builder — 不動産サイト構築用Railsエンジン
- 元記事: VueJS Components with CoffeeScript for Rails - via @codeship | via @codeship(Ruby Weeklyより)
- 元記事: How to Deploy Rails Applications With Ansible, Capistrano and Semaphore - Semaphore(Ruby Weeklyより)
- 元記事: Creds - Multi Environment Credentials - Freeletics Engineering Blog(RubyFlowより)
- 元記事: RediSearch and time series data(Hacklinesより)
- 元記事: ActiveRecord Tricks | Drifting Ruby(RubyFlowより)
- 元記事: How to Create an Active Storage Previewer (Example) - GoRails(Ruby Weeklyより)↓
Ruby trunkより
Stack consistency error
/bundle/gems/sprockets-3.7.1/lib/sprockets/mime.rb:122: [BUG] Stack consistency error (sp: 960, bp: 959)
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
(snip)
つっつきボイス: 「あまり見かけないエラーな気がして」「Stack consistency error
見たことない…」
ISeq#to_binary
-> load_from_binary
-> eval
すると落ちる
$ ./miniruby -ve 'str = "class P; def p; end; def q; end; E = \"\"; N = \"\#{E}\"; attr_reader :i; end"; iseq = RubyVM::InstructionSequence.compile(str); bin = iseq.to_binary; RubyVM::InstructionSequence.load_from_binary(bin).eval'
ruby 2.6.0dev (2018-04-02 trunk 63063) [x86_64-linux]
Segmentation fault (core dumped)
prepend
されたモジュールからシングルトンメソッドを取れない
module Empty; end
class MyClass
singleton_class.prepend(Empty)
def self.foo; end
end
MyClass.singleton_methods(false) # => [:foo]
MyClass.singleton_method(:foo) # => NameError (undefined singleton method `foo' for `MyClass')
これと関係ありそうな記事がちょうどRubyFlowに流れてきました。
つっつきボイス: 「singleton_methods
?普段使わないけど」「私もtakanekoさんに教えてもらって知りました: シングルトンメソッドはクラスメソッドだということです」
参考: Rubyリファレンスマニュアル Object#singleton_methods
Ruby
Rubyで時間を「正確に」測る方法(Ruby Weeklyより)
# 同記事より
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# time consuming operation
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
elapsed = ending - starting
elapsed # => 9.183449000120163 seconds
つっつきボイス: 「RTCで時間取れとかそういう話?」「『時間は一方向に進むとは限らない』みたいな見出しがちらっと見えた」「まあ実際そう: monotonicという概念とか」「monotonicって、数学の『単調に増加する』の単調ですね」
「Androidアプリとか、バックグラウンドに回るとクロックが嘘ついたりするんで」「ええぇ!」「時間を頻繁に測りすぎたらいけないとか何とかあってですね」
「この辺の時間がらみの知識はパフォーマンスとかベンチマークをやるときには必須で、ちゃんとしたコンピュータサイエンスの本だと最初の方で解説することが多いですね」「測定そのものにも時間がかかると」
参考: 時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房 — 時間取得について詳しく書かれています
searchkick: ユーザーの検索パターンを学ぶ検索gem(Awesome Rubyより)
- リポジトリ: ankane/searchkick
Elasticsearchを使っているそうです。chewy gemと比較されていました
# 同リポジトリより
class Product < ApplicationRecord
searchkick language: "german"
end
Product.search_index.tokens("Dish Washer Soap", analyzer: "searchkick_index")
# ["dish", "dishwash", "washer", "washersoap", "soap"]
Product.search_index.tokens("dishwasher soap", analyzer: "searchkick_search")
# ["dishwashersoap"] - no match
Product.search_index.tokens("dishwasher soap", analyzer: "searchkick_search2")
# ["dishwash", "soap"] - match!!
つっつきボイス: 「表記ゆれやスペルミスとか部分一致に対応する感じですね: クックパッドさんとかが自力で頑張ってる分野」「見た感じ英語だけなのかな?」
Elasticの日本語プラグイン: kuromojiが使えるようです。
「タマネギ、たまねぎ、玉ねぎ、玉葱のどれで検索してもヒットさせるとか、単にネギって書いたときに長ネギとタマネギと万能ネギのどれにヒットさせるか、みたいな処理とか」「そういうのをちょっとだけお気楽にできるようにするんでしょうね」
Kernel#at_exit
、初級編、中級編、魔境編(Awesome Rubyより)
# 同記事より
puts "start"
at_exit do
puts "start of first at_exit"
at_exit { puts "nested inside first at_exit" }
at_exit { puts "another one nested inside first at_exit" }
puts "end of first at_exit"
end
at_exit do
puts "start of second at_exit"
at_exit { puts "nested inside second at_exit" }
at_exit { puts "another one nested inside second at_exit" }
puts "end of second at_exit"
end
puts "end"
つっつきボイス: 「at_exit
?フック系か」「これって2回書いたら後のやつが上書きしちゃいます?」「書いたのと逆順に実行しますね」「お、ちゃんとスタックに積むのか: それはスバラシイ」「Ruby技術者認定試験には何年か前に出ましたヨ」「やべーw」「あの試験にはこういう知る人ぞ知るみたいなものが出ますねー」
「at_exit
、何かで見たことありますね: スレッドが分かれた後の後始末みたいなところとか」「プログラム自体が強制終了しない限りは終了時に実行してもらえる感じなんでしょうね」「/tmpの下に作ったゴミを終了時に片付けるとか」
参考: RubyリファレンスマニュアルKernel.#at_exit
継続的開発のつらさ(それはそうとStruct.new
を継承すんな)(Awesome Rubyより)
class Country < Struct.new(:request, :ip, :country_code, :country_code2, :country_code3, :country_name, :continent_code)
つっつきボイス: 「Rubyスタイルガイドで『Struct#new
で初期化したインスタンスを継承しないこと』ってあったのを思い出したので」「それはやっちゃダメなやつ: さすがにこういうのは見たことないけど」「…何かで見た気がする」「…やったことある: 単にattr_accessor
とコンストラクタを書く手間を省きたかった、以上」「ま気持ちはわかりますw」「この書き方するとRubyMineとかで捕捉できなくなっちゃうんですよね」
RejectKaigi 2018も開催
現時点では参加フォーム準備中だそうです。登壇受け付けは行われています。
つっつきボイス: 「RejectKaigiっていう名前がイイですね: Rで始まってるとことか」「韻を踏んでるw」「本編のRubyKaigiはあまりRails寄りの話が出なかったりするんで、むしろこっちの方がRails寄りとか業務運用寄りの話聞けるチャンスあるかも」「凄いのは、これRubyKaigiの公式イベントなんですよね」「ホントだ」
Ruby 3×3のゴールを目指して
RubyKaig 2017のラス前↓を務めた、大御所Vladimir Makarovさんの記事です。
つっつきボイス: 「出たマカロフさん」「やっぱりJITは大きな話題だよね: まJITを入れるとベンチマークをいくらでも偽装できるみたいなところがないわけではないけどw: 長いんでこれは後で読もう」
cron的なRubyプログラム対決
つっつきボイス: 「ところでcron
の何がいいって、他が死んでもめったに死なないことだよね」「godなんてすぐ死にますよ」「godなのに(´・ω・`)」「で結局安定してる監視ソフトとなると昔ながらのmonitになる: config書きにくいけどなっ」「monitは大量にエントリ書くと全部グローバルになって、あれがつらい: 前にも話したsupervisorは一応{}
で括れるから本当はsupervisorの方がいいんだけどなー」
paiza.ioは便利
つっつきボイス: 「Paizaこういうのを始めたのか」「そうそう、paiza.ioはいいですよー、面接相手に使ってもらうときなんかにとっても便利!: ログインいらないし対応言語豊富だしIDEっぽいことたいていできるし」「Chromebookとかで使ってもらえば後始末もいらなくてさらに安心」
久々にを進呈いたします。おめでとうございます。
その他記事など
- 元記事: RESTClient vs Faraday | LibHunt — HTTP/RESTクライアント対決
- 元記事: NEW: Passenger command center Fuse Panel — Passengerのブラウザ向けダッシュボード「Fuse Panel」(Ruby Weeklyより)
- 元記事: If the OS landscape was disrupted, would Ruby have survived until today?! — Ruby25の英語圏向けレポート
- 元記事: Ruby の lazy loading の仕組みを利用して未使用の gem を探す - クックパッド開発者ブログ
SQL
PostgreSQLでLLVM JITサポートに向けて取り組み開始(Postgres Weeklyより)
つっつきボイス: 「ぽすぐれまでJIT!」「SQLクエリをJITコンパイルするのか: むしろとっくにやってたのかと思ってた」「前にウォッチでも話したウィンドウ関数とかJITが効きそうなのに」
PostgreSQL 10向けにみっちりコメントのついたconfigファイル(Postgres Weeklyより)
# 同設定ファイルより
...
# max_connections
# ------------------------
# An integer setting a limit on the number of new connection processes which
# PostgreSQL will create. Should be set to the maximum number of connections
# which you expect to need at peak load. Note that each connection uses
# shared_buffer memory, as well as additional non-shared memory, so be careful
# not to run the system out of memory. In general, if you need more than 200
# connections, you should probably be making more use of connection pooling.
#
# Note that by default 3 connections are reserved for autovacuum and
# administration, and more may be used by replication.
max_connections = 100 # small server
# max_connections = 500 # web application database
# max_connections = 40 # data warehousing database
...
つっつきボイス: 「MySQLだと、configはmy-huge.cnfあたりから引っ張ってきますね」「MySQLはソースからインストールすると/sharedの下にこの手の設定済みファイルがどっさり入ってくるんで、その中から環境に一番合うファイルを探して使うと: こういうのは自力で設定するもんじゃないw」
pgDash: PostgreSQLを詳しく監視する
- 元記事: Announcing pgDash - RapidLoop
- サイト: pgdash.io
JavaScript
consola: ちょっとカッコいいコンソールロガー(GitHub Trendingより)
- リポジトリ: nuxt/consola
数日で★1400超えです。
つっつきボイス: 「やけに★が多いなと思って」「JavaScriptユーザーはめちゃ多いからw」
puppeteer: ChromeのヘッドレスNode API
- リポジトリ: GoogleChrome/puppeteer
つっつきボイス: 「これたしか社内で使ってる人いますよね」「…使ってます」「karmaにしたかったけど画面をiframeにはめたりしてネイティブで動かしていない制約があったり云々(聞き取れず)」
V8エンジン6.6がリリース
Array#reduce
が速くなったというのがとりあえず目につきました。
CSS/HTML/フロントエンド
WebSocketsって、要る?(RubyFlowより)
JavaScriptとRustをWebAssemblyで(Awesome Rubyより)
- 元記事: JavaScript to Rust and Back Again: A wasm-bindgen Tale – Mozilla Hacks – the Web developer blog
# 同記事より
#![feature(proc_macro, wasm_custom_section, wasm_import_module)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet(name: &str) {
alert(&format!("Hello, {}!", name));
}
Mozilla Hackブログの記事です。
iOSでPWAする
つっつきボイス: 「PWA知見貯めたいです」「そういえば前にPWA記事翻訳したら結構読んでもらえましたね」「PWA記事は炎上しがち」
ブランディングのコツ(Hacklinesより)
つっつきボイス: 「非エンジニア向けにもいいかと思って」「うん、こういうのはいいですね: サービスの開発をするんだったらこういうブランドづくりの話も理解できるようにしておきたい」
その他
「最近のGo」コーナー
- issue: #18892 all: WebAssembly (“wasm”) support — Go言語のwasm対応が進行中
- 元記事: goroutine と並行処理の怖い話 · ww24.jp
参考: WebAssemblyとは何であり、何でないのか - yhara.jp
つながりありませんがここに貼りたくなったので↓。
仮想通貨を勝手にマイニングするChrome拡張をGoogleが全面禁止
参考: Google、仮想通貨を採掘するChrome拡張機能を全面禁止に - ねとらぼ
Linuxで楽しいのは/proc
ディレクトリ
つっつきボイス: 「/proc
探検はLinux初心者ならぜひやるべきですね」「そうそう: とりあえず雑にcat
したりrm
してみたり、それで何が起こっているのか見るのがオモシロイ」
Linuxの面白みを手っ取り早く知りたい方におすすめです、/proc
探検。
envison: ネットワーク可視化ツール(Ruby Weeklyより)
- リポジトリ: evait-security/envizon
つっつきボイス: 「内容はともかく、リポジトリのトップに書かれている”red / blue team”って何だったかなと思って」「つRed team」
「セキュリティ関連の書籍なんかでは、攻撃側をred team、防衛側をblue teamって呼ぶのが普通」「あ、AliceとBobとCharlieみたいな」「そうそう、セキュリティ界隈ではそう呼ぶことに決まってるので、単なる固有名詞以上の意味がある」「ちなみにこの3人は、頭文字がそれぞれABCなのがポイントですね」「カタカナに翻訳されるとわかんなくなるw」「悪いヤツはEで始まることになってるとか」「evilに通じるからですかね」
参考: レッドチーム(Red Team)とブルーチーム(Blue Team) 図解サイバーセキュリティ用語 – 図解サイバー攻撃 [Cyber Attack dot Net]
参考: Wikipedia-en Alice and Bob
番外
英語の5-7-5
haml.infoのトップにある俳句のことみたいです。
英語はシラブルの概念が日本語とまったく違うから、5-7-5の数字に囚われずにむしろラップをベースに小節数で考えたらいいのかな。
ナンプレ
ナンプレ本ってどんな田舎のスーパーの雑誌コーナーにも必ずあるのがちょっと不思議。
「安定な結婚の問題」
参考: Wikipedia-ja 安定結婚問題
もしかして記憶違いかもしれませんが、だいぶ前にシャプレーのこの手法の紹介を読んだときに「4人目の異性と付き合った時点で結婚するのが最適化が最も進む」と説明されていてなるほどと思いました。付き合う人数をそれ以上増やしてもベストマッチングには貢献しないと。
考えてみたら、一発目で最良の縁結びをしようなんてたいそう虫のいい考えかもしれませんね。大学入試や結婚もそうですが、転職などもそうなのかも。クラウドサービスなんかも4種類ぐらい試してから決める方がマッチング進むかも。
放送開始、もう20年前か
つっつきボイス: 「ざわ…」「ざわ…」
そろそろ脳に埋められるようになったっぽい
参考: 脳に埋め込み神経細胞と接続する電子プローブ――脳医学研究や生体信号によるロボット制御が狙い | fabcross for エンジニア
デスティニー
仏滅にデプロイしてコケたときには「ああやっぱり」と自分を責めずに済み、大安にデプロイしてコケたときには「大安でも勝てぬか…」と自らを慰める効果があります、きっと。
画面では今まで四捨五入してた(´・ω・`)
遠い遠い昔にニュートン・ラフソン法を(確かRubyだったと思いたい)お遊び実装で平方根を求めてみたら、手動で数回ループを回すだけでびっくりするぐらい高精度な結果が出て、確かにこれなら大昔の原始的な電卓の機械語でもすぐできるなと思ったのを思い出しました。収束、速!
https://www.maplesoft.com/support/help/maple/view.aspx?path=Student/Calculus1/NewtonsMethodより
今週は以上です。
おたよりコーナー
バックナンバー(2018年度)
- 20180312 Rails 5.2.0 RC2リリース、「サーバーレスなRubyが欲しい」、capybara風JSテストフレームワークCypressほか
- 20180316 Rails 5.2のドキュメント更新中、Value Objectの使い方、RubyがTIOBEトップテン復活、Rails「雪だるま」エンコーディングほか
- 20180309 RubyGems.orgのTLS 1.0/1.1接続非推奨、2年に1度のRailsアンケート、DockerのMoby Project、Ruby拡張をRustで書けるruruほか
- 20180302 Ruby 2.6.0-preview1とWebpack 4.0リリース、爆速検索APIサービスAlgolia、Clowneでモデルをクローンほか
- 20180223 Ruby25開催、Rails6のパラレルテスト、書籍「RSpecによるRailsテスト入門」更新ほか
- 20180216 Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか
- 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など)です。