Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20190115)Rubyの<=でクラス同士を比較、Rubyの記号の読み方いろいろ、Ruby C API解説サイトほか

こんにちは、hachi8833です。一部のIME限定のようですが、こんなVim風の矢印入力方法↓があるとは知りませんでした😲。昨年知ったMacの「+Ctrl+spaceで絵文字を表示できる技」以来のびっくりです。


つっつきボイス:「zに続けてhjklを入力して変換すると←↓↑→になるそうです」「たまにこういう技隠れてる」「まあIMEの辞書に登録しちゃえばいいと言えばそれまでですが☺️」「それではぼちぼち始めま〜す」

今回は2019年度初の新春公開つっつき会でした。お集まりいただいた皆さま、ありがとうございます!🙇

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

臨時ニュース: Railsdmのチケットが本日から発売

ウォッチを公開する頃には売り切れるかもですました。

注目情報です↓。

Rails: 先週の改修(Rails公式ニュースより)

コミットログはRails 6に向けて正月から動き出していますね。

Relation#updateにidを与えずに使える機能を導入

# activerecord/lib/active_record/persistence.rb#L99
-     def update(id, attributes)
+     def update(id = :all, attributes)
        if id.is_a?(Array)
          id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
            object.update(attributes[idx])
          }
+       elsif id == :all
+         all.each { |record| record.update(attributes) }
        else
          if ActiveRecord::Base === id
            raise ArgumentError,
              "You are passing an instance of ActiveRecord::Base to `update`. " \
              "Please pass the id of the object by calling `.id`."
          end
          object = find(id)
          object.update(attributes)
          object
        end
      end

つっつきボイス:「デフォルトとしてid = :allが追加されてる」「これ前からできてた気がするな🤔」「実は2013年に#34836で導入されていて、ドキュメントもテストもないままだったそうです」「なるほど、サロゲートキーを使わないこういうupdateを書いた覚えあるし」「updateならバリデーションもちゃんと走るし」

「プルリクにも書いてあるけど、どっかでデグレったっぽいですね」「ほんとだ」「5c65688の方は修正してあったけどクラスレベルの方が対応漏れてたと」

「idなしでいきなり値でアップデートする感じでしょうか?」「というよりは、whereが付いているActiveRecord::Relationに対して一括アップデートする」「あ、なるほど😋」

「しかしこのコードだとall.eachになってるから、レコードの数だけUPDATE文を発行することになるし」「効率は悪そう」「バリデーションの都合とかもあるのかも?DAOも使ってるし、ならしょうがないのかな🤔」

参考: Data Access Object - Wikipedia

「気持ち的にはUPDATE文1個でバルクアップデートやって欲しいところではあるけど」「できるというだけなのかも😆」「バルクにしたい人は生SQLでやっとくれだったりして😆」

ActiveRecordのReaperのテストを修正

# activerecord/test/cases/reaper_test.rb#L45
      def test_some_time
        fp = FakePool.new
        assert_not fp.reaped

        reaper = ConnectionPool::Reaper.new(fp, 0.0001)
        reaper.run
-       until fp.reaped
+       until fp.flushed
          Thread.pass
        end
        assert fp.reaped
        assert fp.flushed
      end

つっつきボイス:「Reaperというクラスを初めて見たので」「Active Recordのコネクションプールに関連してるのか」「frequency秒に1度reapしてflushすると」「reaperが『(麦類の)刈取機』というのが一番近そうですね」「コネクションプールをkeepするのかと思ったら定期的に刈り取るのね🍞」

参考: ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper
参考: ActiveRecordのコネクションプーリングを完全に殺す - 動かざることバグの如し

「Reaperという語はどっかで見たというか、Rails以外の他のところでも使われてる語な気がする: こういうワーカープールを管理するような文脈で」「私は初めて聞きましたー」

参考: IBM Knowledge Center - Connection pool settings -- 「Reap time」という語が出てきます

ActionMailer::MailDeliveryJobをRails 6.0のデフォルトジョブに移動

# actionmailer/lib/action_mailer/base.rb#L462
    helper ActionMailer::MailHelper

-   class_attribute :delivery_job, default: ::ActionMailer::MailDeliveryJob
+   class_attribute :delivery_job, default: ::ActionMailer::DeliveryJob

参考: Class: ActionMailer::DeliveryJob — Documentation for rails/rails (master)


つっつきボイス:「ActionMailerといえば...と思ったらこの間6.0に導入されたのはActionMailboxの方か🙃」「ちょっとだけ紛らわしいですね」

週刊Railsウォッチ(20181225)Rails 6新機能第2弾「Action Mailbox」、url_forは慣れが要る、Ruby製サーバーレスフレームワークJetsほか

「んお?このコード↓の@mailer_class.delivery_job <= MailDeliveryJob<=って何??」「れれ?」「何を比較してるんだろう?job idの比較?じゃなさそうだし🤔」「<=は、継承しているかどうかを比較するものですね🧐」「え、そうだったんですか?🤯」「クラス同士だったらそうなります: DeliveryJobが何なのかはわかりませんが」「<=ってRubyの機能ー?」

# actionmailer/lib/action_mailer/parameterized.rb#L154
+       def delivery_job_class
+         if @mailer_class.delivery_job <= MailDeliveryJob
+           @mailer_class.delivery_job
+         else
+           Parameterized::DeliveryJob
+         end
+       end

(ググって)「ホントだ↓...😳」「へー!!😳」「初めて見る書き方ー」「マジ知らなかった...」「これをご存知とはタダモノジャナイですね」「☺️」

参考: What is the <= operator on Ruby Classes? - Stack Overflow
参考: <= -- Class: Module (Ruby 2.6)
参考: instance method Module#<= (Ruby 2.6.0)


ruby-doc.orgより

「んーまだよくわかってない😅」「要するに#is_a↓みたいなものと思えばいいですね」「あ、なるほど😋」

参考: instance method Object#is_a? (Ruby 2.6.0)

<=で継承をチェックするのって正当な方法なんでしょうか?」「自分なら#is_a使うかなー」「#is_aインスタンスとクラスを比較する場合に使うもので、<=クラスとクラスを比較するときに使いますね🧐」「おぉ、#is_aと違うのか‼️」「つまり<=#is_aは完全互換じゃないと↓」「クラスとクラスを比較したくなる気持ちはわかるけどなー😅」

class Foo
end

class Bar < Foo
end

a = Bar.new
#» #<Bar:0x000055fba3169618>

a.is_a? Foo    #» true
Bar.is_a? Foo  #» false
Bar <= Foo     #» true

「それにしても<=って少々直感に逆らう感: 知らずにコードレビューで見かけたらきっと考え込む」「代入してるようにも見えるし😆」「包含関係のにしたかったのかも😆」「Matzがis_a?kind_of?を推してないのをちょっと思い出した」

参考: 部分集合 - Wikipedia

「でコミットの方はというと、リファクタリングっぽくも見えるけど、あまり触ったことのないあたりだなー: DeliveryJobがdeprecatedになるのか」

パラメータ付きメールや通常のメールの送信にはActionMailer::MailDeliveryJobを使うこと

従来デフォルトのデリバリージョブだったActionMailer::DeliveryJobはRails 6.1で削除される予定。
この設定は、Railsの昔のバージョンとの後方互換性を持たない。
メールをバックグラウンド送信する場合、ジョブワーカーがあらゆるデリバリージョブを正しく処理するためにMailDeliveryJobのコピーを必要とする。
この設定を使う場合は、アプリ全体を6.0に移行して安定稼働させてからにすること。
Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
#34692より大意

Range.new(x, y).step(Duration).each { ... }を高速化

# activesupport/lib/active_support/duration.rb#L216
    def coerce(other) #:nodoc:
-     if Scalar === other
+     case other
+     when Scalar
        [other, self]
+     when Duration
+       [Scalar.new(other.value), self]
      else
        [Scalar.new(other), self]
      end
    end

つっつきボイス:「tenderloveさんのコミットです」「上のコード↑は特定の場合のwhenを追加していくという、わかりやすい高速化手法ですね☺️」

なぜかRuby 2.6よりRuby 2.5の方が速いらしく、とりあえず2.6で少しでも取り返すためのつなぎだそうです。修正した当人も「果たしてこれでいいんだろうか」と思っているようです。

番外: Capistranoをデプロイ方法として前面に出さないことにした

# railties/lib/rails/generators/rails/app/templates/Gemfile.tt#L21
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
<% unless skip_active_storage? -%>
# Use ActiveStorage variant
# gem 'image_processing', '~> 1.2'
<% end -%>

-# Use Capistrano for deployment
-# gem 'capistrano-rails', group: :development
-
<% if depend_on_bootsnap? -%>
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false
<%- end -%>

つっつきボイス:「Gemfileのコメントからcapistranoの記述を消したのね」「Gemfileに書いてなくてもcapistranoを使う人は使うだろうし」「コメントだし普段から特に気にしてないし😆」「DHH自らのコミットで、しかもdominant forceではなくなったと書かれてると、じゃ今まではdominant forceだったんだろうかと思ってしまいました😅」


capistranorb.comより

「最近だとDockerでBlue-Green Deploymentやる人が増えてきたし、その場合はCapistranoが要らないから、コメントを消すのは今なら妥当かも😋」「別にcapistranoがオワコンだからとかそういう理由じゃないと思(う|いたい)けど😆: 自分も使ってるし」「😆」

参考: Docker 再入門 (4) 〜 コンテナ連携その2 簡単なBlue-Green Deployment | Tech Blog | 株式会社INDETAIL - インディテール

「考えてみればcapistrano自体がRailsのgemの中に入っている必然性はそれほどないかも」「デプロイ用ですしね」「でもRailsには意外にもデプロイツールは組み込まれてない(たとえばPHPのSymfonyフレームワークだとsymfonyコマンドでデプロイできます)ので、サジェスチョンという意味でcapistranoというものがあることをこれで知らせていたんでしょうね」「そういえばRailsにはありませんね」「Railsってあれだけいろんなものが入っているんだからcapistranoぐらいデフォルトで入っててもおかしくないぐらいだし☺️」

Rails

Bundler 2.0リリース


bundler.ioより


つっつきボイス:「ようやく出た🎉」「長かった〜」「ここまでいろんなことがありましたね」「次のRubyKaigiに間に合わせたかったのかも😆」


rubykaigi.orgより

「というのも、去年だか一昨年だったかのRubyKaigiでBundler 2の話↓が出てたので」「あのときwill be released soonとか言ってたような😆」

参考: Bundler 2 - RubyKaigi 2017

「Bundler 2、もう動かした人います?」「オレオレアプリはローカルで一応動いた↓というレベルです」

「Bundler 2のbreaking changeってそんなに大きくなかった気はする」「一部のgemが非互換なんでしたっけ?」「gemそのものじゃなくてGemfileあたりの書式に一部非互換があるということだったかと」「Ruby 2.3以前とRubyGems 3.0.0以前はサポート終了😢」「HerokuでもBundler 2使える!」「GemfileとGemfile.lockがちゃんとしていてRubyやRubyGemsのバージョンが古くなければたいてい大丈夫な気がする🤔」

「やべえ、そういえばRuby 1.9で動いてるアプリまだあるし🤡」「マジで?!😆」「😆」「ということはRailsのバージョンは...」「3.0だったと思う😆」

RSpecユーザーがRails 5.1とシステムテストを知るべき理由(Ruby Weeklyより)


つっつきボイス:「Rails 5.1で導入されたシステムテストを使ったことない人は使おうよという感じの記事でした」「お、Cucumberなんて懐かしいものが🥒」


docs.cucumber.ioより

「CucumberとかTurnipって、BDDが流行ったときに割と使われてた印象あるけど最近はどうなんだろう?🤔」「Cucumber、知ってるけど使いません😆」「3年前にCucumberとTurnipちょっと使いました」「自分も意識高まったときに書いてみたけど、高まった意識の割につらかったのは、きっと日本語で書くのに向いてないんだな😅」

参考: ビヘイビア駆動開発 - Wikipedia

「CucumberとかTurnipとかは、もともと日本語を含む自然言語で要件を記述するとそのままテストコードとして使える、という一種の夢を叶えるためのツールなんですが、いかんせん日本語だと助詞とか語尾とかがちょっと違うだけでもう定義が変わってしまう😭」「てにをはの違いとか、『〜する』と『〜します』の違いとかが別物になる感じなんですね」「それそれ😢: 文字が違うから違ってくるのは当たり前なんですが」

参考: 日本語でCucumberのフィーチャ書くときのキーワード - Qiita

「Cucumber、日本でも一時期流行りそうではあったんだけど、結局システムテストぐらいでよかったんじゃね?という風潮なのかな今は」「システムテストがよくできてたということだったんでしょうか?」「いやー単にシステムテストがわかりやすかったということではないかと😆」

「そうそう、いっときこういう感じで日本語フィーチャーテスト↓書いてた☺️」「私もちょっとだけ書いた」

参考: Cucumber のフィーチャの文法 - Gherkin | そんなこと覚えてない

# blog.eiel.infoより
# language: ja
@blog
フィーチャ: ブログを書く
  ブログを書くには本人のやる気と書く時間が必要です。
  アウトプットは次のインプットに繋がるので積極的に行なうべきです。

  # これはコメントでタグの後にはかけない
  # @ではじまるのはタグ
  @good
  シナリオ: ブログが書ける
    ブログが書ける場合はやる気と時間があるのです。

    # ネタがないとかけないです。
    前提 ネタがある
    # 時間がないとかけないです
    かつ 納期に終われていない
    # 先輩とかいないですけど
    もし 先輩にブログを書けと言われた
    # オチがない
    ならば ブログが書けている

  @bad
  シナリオ: デスマ中はブログが書けない
     デスマ中ダトソレドコロジャナインダ!!

     前提 ネタがある
     かつ デスマ中
     もし 先輩にブログを書けと言われた
     ならば ブログが書けていない

「CucumberとかTurnipのようなBDDの世界では、(エンジニアではなく)上流工程の担当者とか受け入れ側が記述するという理想というか夢を描いていたわけですが、結局誰も書いてくれなかったという😭」「やっぱりそうなるのか...」「こういう日本語テストをプログラマーが書いていると意味のなさが半端ない感🤣」「日本語テストをエンジニアが書くんだったら使う意味ないし🤣」

Railsパフォーマンスワークショップに参加したときのメモ(RubyFlowより)


つっつきボイス:「パフォーマンスワークショップの内容はまあ王道を行く感じかな」「そんなに目新しいものはなさそう」

「そういえばRack Mini Profiler↓って今も使われてるのかな?」「使ってるー」「普通に使ってます😋」「入れとくだけでdevelopment環境で使えるし❤️」「Rack Mini Profilerでフレームグラフを表示できるのも昔から変わってない: 変わらないツールが使えるというのはそれはそれでありがたいかも☺️」「ある意味定番かも」


元記事より

[Rails 5] rails newで常に使いたい厳選・定番gemリスト(2017-2018年版)

「ワークショップの講師をやってるNate Berkopecさんが『呼んでくれれば世界中どこでもワークショップやるよ!』と言ってますね😍: 『The Complete Guide to Rails Performance』を書いた人です」「お、どっかで見たことある表紙だと思ったらあの本」「ウォッチでも2回ぐらい取り上げましたね」


同サイトより

TechRachoでもNate Berkopec氏の記事を何本か翻訳いたしました。

新しいRubyアプリサーバー「NGINX Unit」を調べてみた(翻訳)

Rails: Puma/Unicorn/Passengerの効率を最大化する設定(翻訳)

「NGINX Unit↑の記事書いた人かー」「この記事すごくバズりました🥰」「結局NGINX Unitを使ってる人って、まだそんなにいなさそうかな😆」「実は最近WordPressでNGINX Unit使おうとしてハマってます😅わかんないよ〜」

「自社サービスで大量のアクセスをさばかなければならないようなところならNGINX Unitを試してみたくなりますよね☺️」「以前に比べて、自社サービスやってるところがミドルウェアで割とアグレッシブなこと試すことが増えている印象🤔: H2O↓とか使ってるところ増えてるし、Go言語でミドルウェア書いたりとかもあるし、かつての『Webサーバーは枯れているものを使うべし』の時代だったら考えられない😆」

参考: H2O - the optimized HTTP/2 server

「H2Oってデフォルトでmruby使うんですよね」「そうそう」「NGINXよりは設定が楽そう😍」「BPSのように受託開発がメインだと、うまくいくかどうかわからない新技術の投入には慎重にならざるを得ないし、顧客の説得も当然必要になってきますが、本当に困ってきたときにはNGINX Unitとかはいい選択肢かもしれませんね☺️」

smart_init: Service Objectの初期化用定形コードを減らすgem(RubyFlowより)

# 同リポジトリより: smart_init導入前
def initialize(network_provider, api_token)
  @network_provider = network_provider
  @api_token = api_token
end

def self.call(network_provider, api_token)
  new(network_provider, api_token).call
end
# 同リポジトリより: smart_init導入後
class ApiClient
  extend SmartInit

  initialize_with :network_provider, :api_token
end

object = ApiClient.new(network_provider: Faraday.new, api_token: 'secret_token')
# <ApiClient:0x007fa16684ec20 @network_provider=Faraday<...>, @api_token="secret_token">

つっつきボイス:「あーなるほど、よくある初期化やcallrunなんかを自動で作りたいのね☺️」「Service Objectに限らないのかもしれませんが」「こういうのってRailsに限らないCommandパターンのショートハンドだから、同じようなものを作ってる人がいっぱいいそう😆」「メインのコードも短いし、何だか自分でも書けそうな気がしてきた」「あ、こういうのを練習で書いてみるのはとてもいいと思います👍」

その他Rails


つっつきボイス:「へー、--no-rdocってなくなったんだ」「Ruby 2.6でなくなったらしいので、Ruby 2.6をxbuildでインストールするときにコケました😇」「これですね↓👍」「いかにもありそう☺️」

参考: xbuildでruby-install 2.6.0やるとinvalid options are ignored | srockstyle

「xbuildってRubyのビルドに使うんでしょうか?」「Rubyに限らずいろいろビルドできますね」「Rubyなら自分でランタイムを定義すればxbuildでがんばらなくてもいいかも?🤔」

「あ、xbuildはtagomorisさんの書いたツールなのか」「Rubyのところはボクもちょっとコミットしました🤩」「おースゲー😍」

Ruby

Rubyのあの記号が何と呼ばれているか片っ端から集めてみた


つっつきボイス:「この記事危うく貼り忘れるところでした😅」「おーこれはw😆」「これってどこまでコンセンサスを得られるのやら😆」

What? Name
=> hashrocket
=> heavy arrow
=> fat arrow
=> fat comma
=> rocket dagger
<=> spaceship
<=> ufo

同リポジトリより

「正式かどうかとは別に、いろんな読み方を集めてみたってことなのかな🤔」「=>がheavy arrowって何それ😆」「同じものがfat commaと呼ばれてるのも謎: どこがカンマ...?」「さぁ〜😅」「rocket daggerはちょっとカッコイイ⚔️」

<=>がspaceshipとかUFOって呼ばれてるのは見たことある」「===がreally really really equalsというのも😆」

=~もいろいろあるし: kind of equalsとか」「tadpoleはオタマジャクシですね: 形がそれっぽいからか」「cigarette operatorも聞いたことあるし」「たしかにそれっぽい」「bacon cannon😆」「なぜベーコン😆」「~がベーコンを表すんだろな」「みんなこれからは~をベーコンと呼ぼう🤣」「🤣」「🤣」

「日本だと~をニョロって読む人結構いますね」「いるいるー」「あるあるー」「昔いた会社でドット.をポツって呼んでた人がいて思わず聞き返したことあります」「ポツとかポチって読む人そこそこいますね」「*を雪印って呼んでた剛の者もいたらしい😆」「😆」

~>もいろいろ: harpoonとか」「ハープーンミサイルなんでしょうね」「実際に誰が使ってるのやら😆」「~>をspermとかspermy operatorってひどい🤣」「おおっぴらに言えない感🤣」「下手したらセクハラ😆」「eating baconってのも: みんなベーコン好きすぎる😆」「ベーコン食べてるように見えなくもないというか」「ハッカー用語的なのかも🤓」

harpoon: (捕鯨用の)銛

||=がbirthday cake operator😆」「なぜ😆」「横に倒して見るとケーキにろうそくが立ってるってことか🎂」「||=は or equalとしか読んだことなかったし😆」「t-square」「T定規だったのね」「duck operatorとかrobot duckなんてのも」「アヒルに見えるっちゃ見えるけど😆」

「おー<%=はクトゥルーか👻」「ホントだ!cthulhu...」「わかるようなそうでもないような」「無理やりにもほどがある😆」「名前が思い浮かばなかっただけだったりして😆」

クトゥルフ - Wikipedia

!はwowですって」「ワウ!🐶」

「もしかしたらですが、この謎の用語集が一番うれしいのは翻訳するときかもしれない: こういう言い回しが出てくることがたまによくあるので」「エンジニアが直接使ってうれしいものでもなさそうだし」「英語圏の人のスピーチとか直接会話しているときなんかにこういう言い回しされたりすると、一瞬マジでわからなくなったりしますよね😅」「あるあるー😅」「こういう用語集を一度ざっとでも眺めておくと、そういうときに助かるかもしれない☺️」「スライド発表のときならまだしも、質疑応答のときにこれ使われまくったら同時通訳もついていけなさそう」「これは通訳つらそう😭」

?:がelvisとか、もう知らんとしか言いようがないし😆」「elvis謎すぎ🤔」「でもうっすら聞き覚えある」「**_がモスキートというのも何がなんだか😆」

後で調べたらありました↓😱。?:Jを横にしてみると、リーゼントで不敵に笑うプレスリーに見えなくもないかも...米国にはプレスリーのそっくりさんが今でも数百人はいるそうなので、プレスリーならどこでも通じるよねって思っている米国人がいっぱいいそうです。

参考: エルビス演算子 - Wikipedia

エルビス演算子はエルビス・プレスリーの顔文字(emoticon)に形が似ていることからこう呼ばれる
Wikipediaより

参考: Elvis Presley | Emoticon wiki | FANDOM powered by Wikia

!!!がYoda operatorってのも、いかにも感」「ヨーダ?!」「あー、ヨーダの名台詞のもじりか↓」「だからTri-notか」「一般的とはとても思えない😆」

参考: Do, or do not. There is no try. - 英会話で使いたい英語の決め台詞【No.175】 | 英会話ビギナーズWEB

「いやー、実用性はナニだけどとっても面白い😆」「翻訳の肥やしにします☺️」「Rubyではこういう呼び方を特に定めてないんでしょうね」「Ruby以外でもことさら定めてないんじゃないかと🤣」「ググりにくい記号を検索するのに使えるかも🤔」

各社が利用する言語やインフラ集

employment.en-japan.comにはいい記事がちょくちょくある印象です。


つっつきボイス:「あれ?次のツイートと同じものが貼ってある」「やや、貼り間違え失礼しました🙇」

遅ればせながら上はつっつき後に貼り直しました。

Rubyがサーバーサイド言語2018の1位に


同サイトより


つっつきボイス:「オブ・ジ・イヤーじゃなくてオブ・ザ・イヤーが狙ってる感😆」「えっこんなランキングあったんだスゲー😍」「いろいろ面白い😋」「これはどこのランキング?」「w3techs.comというサイトです」「サーベイ方法をざっと見ると、数千万台のWebサイトの調査に加えてAmazon Alexaの人気ランキングもチェックしてるそうです」

「Web Server of the Year 2018は10年連続でNginxが1位🤴ですって」「もう一人勝ち😆」「CMS部門のWordPressも強すぎ」

「しかしOperating System of the Year 2018の1位がUnixってひどくね?😆」「😆」「UnixとUbuntuが同じランキングに😆」「カテゴリーエラー感」「混ぜるな危険🔥」

「お、Reverse Proxy Provider of the Year 2018にFastlyがランク入りしているのは中々健闘しているし」「FastlyってCDNですよね?」「だからリバースプロキシーですね」「あそっか😅」「Akamaiとかより有名とは」「なんであれだけ規模の大きいAkamaiが入ってないんだろう?🤔」「Akamaiは小売りよりも卸売的というか、まさにCloudFlareとかを相手に売ってるからじゃないかな?」「プロバイダのプロバイダ的な」


同記事より

Ruby C API解説サイト

ざっとググった限りでは、少なくとも2014年にRedditでスレが上がっていました↓。silverhammermbaさんはどういう方なんだろう?

参考: The Definitive Guide to Ruby's C API : ruby


つっつきボイス:「これは偉大な仕事感: よく頑張って書いたと思うし👍」「まずCからRubyを呼ぶ方法がみっちり解説されてる: これでCRubyをコンパイルしてshared linkとかすれば、Cの中からRubyが呼べるようになるぞと💎」「へー😳」「それで何かをするというよりは、RubyのC関数とか構造体とかを学ぶのによさそうかなと」

/* 同サイトより */
VALUE obj;

switch (TYPE(obj))
{
    case T_NIL:
        /* handle NilClass */
        break;
    case T_FIXNUM:
        /* handle Fixnum */
        break;
    case T_STRING:
        /* handle String */
        break;
    /* ... */
}

「Rubyコミッター志望者にとってありがたそうですね😋」「あとはRubyのデバッグとか高速化でしょうね: RubyKaigiでよく話されるようなRubyをカリカリにチューンアップしたいときなんかによさそう😍」「Rubyは後からまともに追いかけるのが不可能に近いぐらい巨大化しているので、こういうまとまった情報に目を通してからRubyのソースを読めば、わからん度合いが100%から80%ぐらいに下がってくれるかも☺️」

「他にもRunning Ruby in CとかRunning C in Rubyなんてのもありますね: 後者はRubyでC拡張を呼んだりするヤツだから割と普通かな🧐」「公式かなと思ったら違うようでした」「自分でソースを追いかけながら書いたとかそんな感じなんでしょうね😌」

Ruby trunkより

Ruby 2.6のアップデートが早々に出そう


つっつきボイス:「お、@mametterさんのツイート」「ruby -e 'p "㍻".unicode_normalize(:nfkc)'で合字をばらしたときの挙動は新元号が出ないと実装できないからでしょうね」「この合字をバラしたくなることってあるんでしょうか😆」「Unicodeの仕様上はできるはずだから、想定と挙動が変わるのはよくないということなのかも」

「こういう対応が可能なのは、やっぱりRubyが日本生まれというのが大きいなと思いますね☺️」「他の言語だったらまずスルーされそうだし」「自分でやっとくれとか言われそう😅」「下手するとリジェクト❌」

クラウド/コンテナ/インフラ/Linux/Serverless

GitHubとGitLabの動向


つっつきボイス:「1つめはGitHubのプライベートリポジトリが無料になったヤツですね」「3人まで無料でしたっけ」「プライベートリポジトリそのものはunlimitedで、そこに3人まで無料で参加できる」「最近のマイクロソフトのきれいさは半端ない✨」「そっかマイクロソフトなんだな今は😳」「今までは無料のプライベートリポジトリと言うとBitBucketというイメージだったけど😅」


bitbucket.orgより

「無料のプライベートリポジトリって、大学の授業で使うときにいろいろ便利なんですよね: 今はGitHub使ってるんですが、学生にお金払わせるわけにもいかないのでパブリックリポジトリになってて、すると個人情報的なコミットをプッシュしたりしないかと気を遣うので😅」「あーたしかに」

「2つ目のGitLabですが、GitLab Serverlessっていうのが前からあったんですね」「ちょっと前くらいだったかと」「社内で使うことはありそうですか?」「うちでは特にないかなー🤔: ちょっと試してみたりするにはいいかも」

「そうそう、このKnative↓っていうのが核心にあるみたい」「くなてぃぶ?けいねいてぃぶ?」「どうやらけいねいてぃぶみたい」「GitLabって、他のプロダクトを買収したり統合したりして大きくなっているんですよ」「へー!」「だからGitLab Serverlessという名前は付いているけど、中身はKnativeということでしょうね😆」

次のLinuxは5.0になりそう


つっつきボイス:「もう5.0ですか〜、早いもんだな〜👴」「ほんに👵」

「これ見てて気づいたんだけど、最近はI3Cなのかな?」「あ、私もそれが何なのか気になってました」「しばらく追いかけていない間にI2Cの次が出ていたとは」「そもそもI2Cがわからないという😅」「ワイも😅」

参考: MIPI Alliance、MIPI I3C Sensor Interfaceを正式に公開 (1) I3Cとはなんなのか? | マイナビニュース
参考: I2C - Wikipedia

「I2Cはセンサーサブシステムの一種で、それこそ温度センサーとかADコンバーターとかのポートをひととおり備えていて、いわゆるサウスブリッジの方に属するヤツですね: CPUの温度を測ったりとか」

参考: サウスブリッジ - Wikipedia

「この記事↓を見てみると、I3CはI2Cとも共存できるし、ホットジョインなんかもできるのかー、へー」「知らない世界...」「昔この辺を触っていたことがあって、I2Cのパネルモジュールなんかをいじったりとか、I2Cからデバイスファイルを出してそこ経由で怪しげなデバイスにアクセスしたりとかしてたので」「おー」

参考: MIPI I3C

「そういえば上の記事がきっかけで、初めてLinuxのリポジトリを見ました↓」「今もkernel.orgだよね?」「ですです」「GitHubよりもずっと前からkernel.orgにありますね😎」

SQL

Amazon DocumentDBとは


つっつきボイス:「知人がこのニュースで色めき立ってたんですが、NoSQL系を知らないので💦」「まあ自分はMongoDB使ってないし😆: MongoDBがマッチする案件があればいいんだろうけど」「AWSのSimpleDBなら使ったことあるけど」「何となくだけど、MongoDBって他のNoSQL系データベースに比べて案件にマッチする範囲が狭いような気がする😆: XMLデータの外部リンクしまくったチェインをデータベース構造に入れたいときとか(知らんけど)」

「MongoDBとかにコーパスみたいなテキストを大量に保存するのは違う感じでしょうか?」「うーん、ドキュメントデータベースの特徴はデータを構造化せずに保存しつつ、ある程度構造的に扱えるところかなと思っているので、そういうテキストを大量に保存したいならむしろElasticsearchとかの方が得意そうな気がする」「おー」「何にしろMongoDB使う機会なかったし、そこらへんはよくわからないっ😆」

Redisはマルチモデルを目指している?(DB Weeklyより)


つっつきボイス:「元々Redisはちょっと特殊なこともできるKVSというところから始まっているので、人によってはその印象が残っているせいか、今でもRedisをMemcachedとかと並べてKVSとして扱おうとしていることがありますよね」「あーわかる」「想像ですが、Redisとしてはその印象を拭い去りたいんじゃないかな🤔: 技術的には随分前から単なるKVSを超えたものになってるけど」「『KVSと呼ぶな!』みたいな😆」

参考: memcached - Wikipedia

「今のRedisはどちらかというと、RDBMSが苦手とするものは何でもやれるものになりつつある感😎: プッシュ通知なんてまさにそうだし」「あーたしかに!」「RedisにはPub/Subもとっくに入ってますし」「記事↓でも同じようなこと言ってる: ここでいうマルチモデルは、色んな用途に使えるマルチロール的な意味合いなんでしょうね」

その結果、コミュニティとRedis Lab社員の双方から、Redisを効果的に拡張してマルチモデルデータベースに変えられるおびただしい新モジュールが生み出された。
Redisの強みのひとつとして、文字列のほかにリストや文字列セット、ハッシュテーブル、地理座標、確率的データ構造といった抽象データ型をも保存できるというのがある。この柔軟性とRedisのシンプルさの組み合わせは、Redisがマルチモデルを目指すうえで重要である。
同記事より大意

「しかしこのパラグラフ↑みたいなストーリーをオレはどこかで聞いたゾ: PostgreSQLとかいうヤツ🤣」「🤣」「PostgreSQLというRDBMSも割と何でもできた気がするなっ🤣: 何かモジュールを入れればRedisみたいなこともかなりできちゃいそうだしっ」「いつか両雄が最終対決するんでしょうか🤣」「ハルマゲドン⚡️」

「余談なんですが、記事の途中に出てきた「spinach problem」が何を指すのか謎でした: そういう名前の数学の問題とかコンピュータ系の有名な問題があるのかと思ったらそうでもなさそうなので、以下のどれかなのかな思ってメモしました↓」

JavaScript

Underscore.js: JSの関数型プログラミング支援ライブラリ


同サイトより

ビルトインのJSオブジェクトを一切拡張しないのだそうです。


つっつきボイス:「上のw3techs.comランキングで知りました」「Underscore.js、なつかし〜」「そんなに前からあったんですね😅」「そうそう、こうやってフィルタとかできる↓」

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]

「今もランク入りするぐらいだから便利なんでしょうね」「副作用が少なくて、しかも便利だから使われてるんでしょうね: ちょうどRailsのActive Supportとか、dry-rbみたいな感じ」「わかりやすい!😋」「フレームワークとかじゃなくて、純粋なライブラリということか」

Ruby: Dry-rb gemシリーズのラインナップと概要

「だからUnderscore.jsは今でも続いているのかなー」「カバーする範囲を無理に広げなかったのがよかったのかも: もし機能を後から追加しまくったら、みんなそれに嫌気がさしてlightweight underscore.jsみたいなのを一斉に作り始めたりして😆」「あーわかりみ😆」「JSで何度繰り返されたかわからない歴史😆」「jQueryより軽量と称したライブラリがいくつも出現したみたいな☺️」

CSS/HTML/フロントエンド/テスト

Station: 複数のWebアプリを左タブ化するアプリ

同サイトより

参考: 追伸。そろそろおまえもstationでslackやWebアプリを一括管理をするように。 母より - Qiita


つっつきボイス:「社内で早速気に入って使ってる人がいました」「お、いかにもElectronアプリっぽいけど、これはもしかして左タブごとにセッションを分けられるのかな?」「あー、どうでしょう?」「だとしたら、AWSアカウントごとにタブを分けたいなー🥰」「というと?」「いろんな案件を扱っているのでAWSのアカウントが物凄い数になってて、切り替えがめんどくて😭」「それはつらそう😓」「複数のAWSアカウントを見比べたいときなんか、1つはChromeで、もう1つはFirefoxで、もう1つ開くときはシークレットモードにするとか😇」「うへ~😨」

(つっつき終了後、しばしその場で動かしてみる)

「うーん残念、タブごとにセッションは分かれてないようだ😢」「全タブで共通...」「惜しいですね...😔」


electronjs.orgより

言語

Red言語: コンパクトかつマルチプラットフォームのコンパイラ言語


red-lang.orgより


つっつきボイス:「ちょっとだけRedを動かしてみました↓: 単体のバイナリをダウンロードしてからにコマンドラインで最初に実行すると何やらライブラリとのバインドを開始して、終わると使えるようになったんですが、何されてるかよく見えなくてちょっぴりコワい😅」「ほほー☺️」

「GUIキットも内蔵してるみたいで、以下の2行を書くとGTKっぽいウィンドウも開きました↓」

# 同サイトより: GUIデモ
Red [Needs: 'View]

view [text "Hello World!"]

「RedはREBOLという言語に影響を受けたそうです」「さすがに知らないし😆」


rebol.comより

「実用とかはともかく、よくこんなにコンパクトに作れたなと思って」「マルチプラットフォームなのが売りか」「対応OSにMS-DOSってあるし↓😆」「えー、MS-DOS😆」「Windows XPまで😆」

MSDOS        : Windows, x86, console (+ GUI) applications
Windows      : Windows, x86, GUI applications
Windows XP   : Windows, x86, GUI applications, no touch API
Linux        : GNU/Linux, x86
Linux-ARM    : GNU/Linux, ARMv5, armel (soft-float)
RPi          : GNU/Linux, ARMv5, armhf (hard-float)
Darwin       : macOS Intel, console-only applications
macOS        : macOS Intel, applications bundles
Syllable     : Syllable OS, x86
FreeBSD      : FreeBSD, x86
Android      : Android, ARMv5
Android-x86  : Android, x86

同サイトより

mrubyがこんなふうに進化したらちょっと面白いかも」「GitHubの色分けを見るとRed自体の大半がRed言語で書かれてるっぽい」「バイナリサイズは1.3 MB程度か」「Go言語よりはずっとコンパクト」「もしかするとインタプリタ的なものを内蔵してるのかな🤔」「学生向けにちょっとしたコンパイラプログラミングの演習に使うのに向いてるかも😋」

GNU Bash 5.0がリリース(Publickeyより)

今さら気づきましたが、macOS MojaveのBashは4ですらありませんでした↓。

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)


つっつきボイス:「そうそう、Bashの5が出た」「Macが未だにBash 3ってそれって😆」「Ubuntuは4系だった気がする: 手元で見たら4.4.19だ」「Bashはめっちゃ使ってるけど、新しいものを率先して使う気にはならないし😆」「違いがよくわからないし😆」

その他

深層学習に新たな展開か


つっつきボイス:「ディープラーニング系ですか」「局所解が消えて全体最適になったとして、それが本当に全体最適なのかどうかというのはあるけど、たぶんそのへんも含めた話なんでしょうね☺️」「2つ目の記事がそれっぽいですね」

「局所解というと、山登りしてて途中の頂上で満足してそこから先に進んでくれないみたいなイメージあります🗻」「あそこに本当の頂上があるのになぜ止まるみたいな😆」「今登ってるのは富士山だけどエベレストを忘れてるぞみたいな😆」

AIは判断の理由を説明できるようになるか

上の論文は、以下の記事の中で紹介されていました。

参考: 自然言語処理ってなに?課題は? 研究者に聞く、エンジニアが学術論文を読み解くための技術 - エンジニアHub|若手Webエンジニアのキャリアを考える!

この論文で提案されたモデルは、機械の判断の過程を示すことができると述べられています。ブラックボックス化している機械学習のシステムの中を見えるようにし、システムが判断した根拠が分かるようになる手法を提案しているのです。
人間が「A案とB案どっちがいいですか?」と問われたときは、根拠を示して説明することが重要ですよね。しかし現在のAIは判断の根拠を語るのが苦手です
同記事より(強調は編集部)


つっつきボイス:「これをAIと呼ぶとちょっと主語が広すぎる感: ニューラルネットワークというならわかるけど🧐」「判断の根拠がなくても通用する世界もあるしなー」「根拠を説明して人間がそれで納得してくれるかどうかの方が敷居が高かったりして😆」

番外

商用量子コンピュータ「IBM Q System One」

参考: System One - IBM Q - US

参考: IBMが世界初となる商用量子コンピュータ「IBM Q System One」を発表 - GIGAZINE


つっつきボイス:「おー、量子コンピュータがついに商用化ですか😍」「デザインのはったりが効いてますね」「大きさがよくわからないので横にタバコとか置いて欲しいし😆」

「ちなみにIBMの製品ラインナップって、大昔から英文字1文字で表す慣例なんですよ: Iシリーズとか」「えー知らなかった!」「だからQシリーズというのはまったく新しいラインナップということになりますね☺️」

「すごく野暮なこと聞きますけどおいくら万円なんでしょう?💰」「それはもう『お問い合わせください』で😆」「NDAを結ばないと値段教えてくれなさそう」「設置する場所の条件とかどうなんだろう?: 冷却設備とか」「それもお問い合わせですね」


今回は以上です。

「今回はちょっと早めに終わりました」「皆さまお疲れさまでしたー」「皆さまお疲れさまでしたー」「つっつきご参加ありがとうございました!🙇」

おたより発掘

週刊Railsウォッチ(20190115)Rubyの<=でクラス同士を比較、Rubyの記号の読み方いろいろ、Ruby C API解説サイトほか

今週も面白かったー😋

2019/01/16 22:17

バックナンバー(2019年度第1四半期)

週刊Railsウォッチ(20190107)Railsのパフォーマンス改善Tips集、Rubyの`&:シンボル`ほか

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

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

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。