週刊Railsウォッチ(20180406)ruby-sass gemが非推奨に、Roda gem、paiza.ioは便利、Linuxは/procで遊ぼうほか

こんにちは、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で回していたのをrejecteachに変えたと」「呼び出し多いだろうから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なんだか」

Rubyのパラメータと引数の対応付けを理解する(後編)

不要な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が非推奨に


sass/dart-sassより


つっつきボイス: 「今日Slackに流してもらった情報ですね」「しばらくちょい面倒なことになりそうな気がする: sass-railssassc-railsの両方に依存してたらどうなっちゃうんだろうとかw」「LibSassはC/C++で速そうではある」「しかしRuby版がなくなるのはちょっと悲しいなー: マイナーなアーキテクチャ上でちょっとした処理するときとか便利だったんで」

Webpacker 4 pre版リリース(Hacklinesより)


つっつきボイス:Webpack 4はこないだ出てる(ウォッチで既報↓)から、Webpacker gemも追随してるということですね」「割と紛らわしい…WebpackとWebPacker」「もうpre2になってるし↓」「まあまだしばらくかかるかな」


github.com/rails/webpackerより

週刊Railsウォッチ(20180302)Ruby 2.6.0-preview1とWebpack 4.0リリース、爆速検索APIサービスAlgolia、Clowneでモデルをクローンほか


webpack.js.orgより

Rails 5.2のcredentialをKubernetesで使う(Ruby Weeklyより)

Kubernetesは最近「クバ」とか「クーバァ」みたいにじわじわ略されつつあるような雰囲気?


つっつきボイス: 「確かにそろそろ呼び方統一してもいいんじゃね?」「記事の方は、Railsのcredentialsはそもそもマイクロサービス的なコンテナを意識したソリューションだから当然できますね」「確かに: 記事短いし、『やってみたらできた!うれしい!』という感じ」

マイグレーション支援gem 4種

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: プラグイン方式の柔軟で強力なルーティングエンジン


roda.jeremyevans.neより

y-yagiさんが最近好きなフレームワークだそうです↓。近々READMEの翻訳をTechRachoで公開しようと思います。


techplay.jpより

なお、以前翻訳したRodauthもRodaを全面的に使っています。Developers Meetupのアフターパーティで「RodauthのREADMEは名ドキュメント」とy-yagiさんとうなずきあいました。

Ruby: 認証gem ‘Rodauth’ README(翻訳)


つっつきボイス: 「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」「それだっ」

参考: action_dispatch/journey

「線路」と「旅」としゃれたんでしょうね。

Hanami 2.0でRodaを採用しようという提案も出されてるんですよ: breaking changeを承知で」「Roda、きれいに書けるしHanamiに入るのはいいんじゃないかな」

Railsのルーティングを極める(前編)

GoCD: デプロイをビジュアル管理するサービス(Ruby Weeklyより)


gocd.orgより

サイトの図のデザインがかわゆくて個人的に好きです。図がどうもカッコよく作れない人は、描線を思い切って太くするだけで相当印象変わるとこっそり思っています。


gocd.orgより


つっつきボイス: 「最近こういう感じのをよく見かけますね: ↓これ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に切り出されたんですね

Rails3のfind系メソッドと注意のまとめ

まったく個人的にですが、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でからあげエンジニアことささたつさんのプレゼンで、彼がやっているClassidb:migrateがすごく時間かかるという話をしてたんですが、そういう状況ではこういう形のasyncマイグレーションというのは検討の余地あるかも」「Classiさんはこの分野でけっこうシェアを伸ばしているそうでスゴイ」

その後、学校とインターネット接続の話題でしばし盛り上がりました。


classi.jpより

その他記事など

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より)

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.ioより


つっつきボイス: 「Paizaこういうのを始めたのか」「そうそう、paiza.ioはいいですよー、面接相手に使ってもらうときなんかにとっても便利!: ログインいらないし対応言語豊富だしIDEっぽいことたいていできるし」「Chromebookとかで使ってもらえば後始末もいらなくてさらに安心」

久々に🌟を進呈いたします。おめでとうございます。

その他記事など

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を詳しく監視する


pgdash.ioより

JavaScript

consola: ちょっとカッコいいコンソールロガー(GitHub Trendingより)


同リポジトリより

数日で★1400超えです。


つっつきボイス: 「やけに★が多いなと思って」「JavaScriptユーザーはめちゃ多いからw」

puppeteer: ChromeのヘッドレスNode API


つっつきボイス: 「これたしか社内で使ってる人いますよね」「…使ってます」「karmaにしたかったけど画面をiframeにはめたりしてネイティブで動かしていない制約があったり云々(聞き取れず🙇)」


karma-runner.github.ioより

V8エンジン6.6がリリース

Array#reduceが速くなったというのがとりあえず目につきました。


同記事より

CSS/HTML/フロントエンド

WebSocketsって、要る?(RubyFlowより)


同記事より

JavaScriptとRustをWebAssemblyで(Awesome Rubyより)

# 同記事より
#![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記事は炎上しがち」

WebサイトをPWA(Progressive Web App)に変える簡単な手順(翻訳)

ブランディングのコツ(Hacklinesより)


同記事より


つっつきボイス: 「非エンジニア向けにもいいかと思って」「うん、こういうのはいいですね: サービスの開発をするんだったらこういうブランドづくりの話も理解できるようにしておきたい」

その他

「最近のGo」コーナー

参考: WebAssemblyとは何であり、何でないのか - yhara.jp

つながりありませんが、なぜかムラムラとここに貼りたくなったので↓。

仮想通貨を勝手にマイニングするChrome拡張をGoogleが全面禁止

参考: Google、仮想通貨を採掘するChrome拡張機能を全面禁止に - ねとらぼ

Linuxで楽しいのは/procディレクトリ


つっつきボイス:/proc探検はLinux初心者ならぜひやるべきですね」「そうそう: とりあえず雑にcatしたりrmしてみたり、それで何が起こっているのか見るのがオモシロイ」

Linuxの面白みを手っ取り早く知りたい方におすすめです、/proc探検。

envison: ネットワーク可視化ツール(Ruby Weeklyより)


つっつきボイス: 「内容はともかく、リポジトリのトップに書かれている”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


en.wikipedia.org/wiki/Alice_and_Bobより

番外

英語の5-7-5

haml.infoのトップにある俳句のことみたいです。


同サイトより

英語はシラブルの概念が日本語とまったく違うから、5-7-5の数字に囚われずにむしろラップをベースに小節数で考えたらいいのかな。

ナンプレ

ナンプレ本ってどんな田舎のスーパーの雑誌コーナーにも必ずあるのがちょっと不思議。

「安定な結婚の問題」

参考: Wikipedia-ja 安定結婚問題

もしかして記憶違いかもしれませんが、だいぶ前にシャプレーのこの手法の紹介を読んだときに「4人目の異性と付き合った時点で結婚するのが最適化が最も進む」と説明されていてなるほどと思った覚えがあります。付き合う人数をそれ以上増やしてもベストマッチングには貢献しないと。

考えてみたら、一発目で最良の縁結びをしようなんてたいそう虫のいい考えかもしれませんね。大学入試や結婚もそうですが、転職などもそうなのかも。クラウドサービスなんかも4種類ぐらい試してから決める方がマッチング進むかも。

放送開始、もう20年前か


つっつきボイス: 「ざわ…」「ざわ…」

そろそろ脳に埋められるようになったっぽい

参考: 脳に埋め込み神経細胞と接続する電子プローブ――脳医学研究や生体信号によるロボット制御が狙い | fabcross for エンジニア

デスティニー

仏滅にデプロイしてコケたときには「ああやっぱり」と自分を責めずに済み、大安にデプロイしてコケたときには「大安でも勝てぬか…」と自らを慰める効果があります、きっと。

画面では今まで四捨五入してた(´・ω・`)


pc.watch.impress.co.jpより

遠い遠い昔にニュートン・ラフソン法で(確かRubyだったと思いたい)お遊び実装による平方根を求めてみたら、手動で数回ループを回すだけでびっくりするぐらい高精度な結果が出て、確かにこれなら大昔の原始的な電卓の機械語でもすぐできるなと思ったのを思い出しました。収束、速!


https://www.maplesoft.com/support/help/maple/view.aspx?path=Student/Calculus1/NewtonsMethodより


今週は以上です。

おたよりコーナー

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

週刊Railsウォッチ(20180330)春のリリースラッシュ: Rails 5.1.6/5.0.7とRuby 2.5.1など、Ruby 2.2は3月でメンテ終了ほか

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

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

Awesome Ruby

Ruby on Rails Security Project

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

JavaScript Weekly

javascriptweekly_logo_captured

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! 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探訪シリーズ