- Ruby / Rails関連
週刊Railsウォッチ(20190115)Rubyの<=でクラス同士を比較、Rubyの記号の読み方いろいろ、Ruby C API解説サイトほか
こんにちは、hachi8833です。一部のIME限定のようですが、こんなVim風の矢印入力方法↓があるとは知りませんでした😲。昨年知ったMacの「⌘
+Ctrl
+space
で絵文字を表示できる技」以来のびっくりです。
つっつきボイス:「z
に続けてhjklを入力して変換すると←↓↑→になるそうです」「たまにこういう技隠れてる」「まあIMEの辞書に登録しちゃえばいいと言えばそれまでですが☺️」「それではぼちぼち始めま〜す」
今回は2019年度初の新春公開つっつき会でした。お集まりいただいた皆さま、ありがとうございます!🙇
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓臨時ニュース: Railsdmのチケットが本日から発売
ウォッチを公開する頃には売り切れるかもですました。
チケットの販売は明日1/15(火)10:00開始となります。DHHのオンラインでの質疑応答の特別講演や、Rails Core TeamのJeremy Daer氏も来日する、3トラック並行で全69セッションが行われる、史上最大規模の Rails カンファレンスとなります。ぜひご参加ください。 #railsdm2019https://t.co/wlt5BeyKC5
— Railsdm (@railsdm) January 14, 2019
注目情報です↓。
領収書の発行について: 領収書発行不可と記載しておりましたが、Stripeから領収書を送信できることがわかりましたので、発行いたします。つきましては後日、領収書の発行を希望される方向けのGoogle フォームを用意しますので、しばしお待ち下さいませ。 #railsdm2019
— Railsdm (@railsdm) January 15, 2019
⚓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)
「んーまだよくわかってない😅」「要するに#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をデプロイ方法として前面に出さないことにした
- commit: Capistrano is no longer a dominant force in the deployment strategy f… · rails/rails@2584762
# 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だったんだろうかと思ってしまいました😅」
- リポジトリ: capistrano/capistrano
「最近だと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: Announcing Bundler 2.0
- リポジトリ: bundler/bundler
つっつきボイス:「ようやく出た🎉」「長かった〜」「ここまでいろんなことがありましたね」「次のRubyKaigiに間に合わせたかったのかも😆」
「というのも、去年だか一昨年だったかの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なんて懐かしいものが🥒」
- サイト: Cucumber
- リポジトリ: cucumber/cucumber-rails
「CucumberとかTurnipって、BDDが流行ったときに割と使われてた印象あるけど最近はどうなんだろう?🤔」「Cucumber、知ってるけど使いません😆」「3年前にCucumberとTurnipちょっと使いました」「自分も意識高まったときに書いてみたけど、高まった意識の割につらかったのは、きっと日本語で書くのに向いてないんだな😅」
- リポジトリ: jnicklas/turnip
「CucumberとかTurnipとかは、もともと日本語を含む自然言語で要件を記述するとそのままテストコードとして使える、という一種の夢を叶えるためのツールなんですが、いかんせん日本語だと助詞とか語尾とかがちょっと違うだけでもう定義が変わってしまう😭」「てにをはの違いとか、『〜する』と『〜します』の違いとかが別物になる感じなんですね」「それそれ😢: 文字が違うから違ってくるのは当たり前なんですが」
参考: 日本語でCucumberのフィーチャ書くときのキーワード - Qiita
「Cucumber、日本でも一時期流行りそうではあったんだけど、結局システムテストぐらいでよかったんじゃね?という風潮なのかな今は」「システムテストがよくできてたということだったんでしょうか?」「いやー単にシステムテストがわかりやすかったということではないかと😆」
「そうそう、いっときこういう感じで日本語フィーチャーテスト↓書いてた☺️」「私もちょっとだけ書いた」
参考: Cucumber のフィーチャの文法 - Gherkin | そんなこと覚えてない
# blog.eiel.infoより
# language: ja
@blog
フィーチャ: ブログを書く
ブログを書くには本人のやる気と書く時間が必要です。
アウトプットは次のインプットに繋がるので積極的に行なうべきです。
# これはコメントでタグの後にはかけない
# @ではじまるのはタグ
@good
シナリオ: ブログが書ける
ブログが書ける場合はやる気と時間があるのです。
# ネタがないとかけないです。
前提 ネタがある
# 時間がないとかけないです
かつ 納期に終われていない
# 先輩とかいないですけど
もし 先輩にブログを書けと言われた
# オチがない
ならば ブログが書けている
@bad
シナリオ: デスマ中はブログが書けない
デスマ中ダトソレドコロジャナインダ!!
前提 ネタがある
かつ デスマ中
もし 先輩にブログを書けと言われた
ならば ブログが書けていない
「CucumberとかTurnipのようなBDDの世界では、(エンジニアではなく)上流工程の担当者とか受け入れ側が記述するという理想というか夢を描いていたわけですが、結局誰も書いてくれなかったという😭」「やっぱりそうなるのか...」「こういう日本語テストをプログラマーが書いていると意味のなさが半端ない感🤣」「日本語テストをエンジニアが書くんだったら使う意味ないし🤣」
⚓Railsパフォーマンスワークショップに参加したときのメモ(RubyFlowより)
つっつきボイス:「パフォーマンスワークショップの内容はまあ王道を行く感じかな」「そんなに目新しいものはなさそう」
- パレートの法則
- ベンチマーク
- リトルの法則 - Wikipedia
- マイクロベンチマーク
- プロファイリング
- RubyのメモリアロケーションとGC
- rack-mini-profiler
- Chrome Dev Tools
「そういえばRack Mini Profiler↓って今も使われてるのかな?」「使ってるー」「普通に使ってます😋」「入れとくだけでdevelopment環境で使えるし❤️」「Rack Mini Profilerでフレームグラフを表示できるのも昔から変わってない: 変わらないツールが使えるというのはそれはそれでありがたいかも☺️」「ある意味定番かも」
「ワークショップの講師をやってるNate Berkopecさんが『呼んでくれれば世界中どこでもワークショップやるよ!』と言ってますね😍: 『The Complete Guide to Rails Performance』を書いた人です」「お、どっかで見たことある表紙だと思ったらあの本」「ウォッチでも2回ぐらい取り上げましたね」
TechRachoでもNate Berkopec氏の記事を何本か翻訳いたしました。
「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より)
- リポジトリ: pawurb/smart_init
# 同リポジトリより: 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">
つっつきボイス:「あーなるほど、よくある初期化やcall
やrun
なんかを自動で作りたいのね☺️」「Service Objectに限らないのかもしれませんが」「こういうのってRailsに限らないCommandパターンのショートハンドだから、同じようなものを作ってる人がいっぱいいそう😆」「メインのコードも短いし、何だか自分でも書けそうな気がしてきた」「あ、こういうのを練習で書いてみるのはとてもいいと思います👍」
⚓その他Rails
RubyGemsをバージョン3に上げると、RubyMineのdebug用gemのインストールに失敗する。理由は--no-rdocというすでに削除されたインストールオプションをRubyMineが使おうとするから。この問題が修正されるのはRubyMine 2018.3.3や2019.1になる予定らしい。早く直して〜!https://t.co/bzF16Idux4
— Junichi Ito (伊藤淳一) (@jnchito) January 8, 2019
つっつきボイス:「へー、--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...」「わかるようなそうでもないような」「無理やりにもほどがある😆」「名前が思い浮かばなかっただけだったりして😆」
Cthu' ya gonna call? pic.twitter.com/0akXkvjXCI
— Worship Cthulhu (@Worship_Cthulhu) January 31, 2015
「!
はwowですって」「ワウ!🐶」
「もしかしたらですが、この謎の用語集が一番うれしいのは翻訳するときかもしれない: こういう言い回しが出てくることがたまによくあるので」「エンジニアが直接使ってうれしいものでもなさそうだし」「英語圏の人のスピーチとか直接会話しているときなんかにこういう言い回しされたりすると、一瞬マジでわからなくなったりしますよね😅」「あるあるー😅」「こういう用語集を一度ざっとでも眺めておくと、そういうときに助かるかもしれない☺️」「スライド発表のときならまだしも、質疑応答のときにこれ使われまくったら同時通訳もついていけなさそう」「これは通訳つらそう😭」
「?:
がelvisとか、もう知らんとしか言いようがないし😆」「elvis謎すぎ🤔」「でもうっすら聞き覚えある」「**_
がモスキートというのも何がなんだか😆」
後で調べたらありました↓😱。?:J
を横にしてみると、リーゼントで不敵に笑うプレスリーに見えなくもないかも...米国にはプレスリーのそっくりさんが今でも数百人はいるそうなので、プレスリーならどこでも通じるよねって思っている米国人がいっぱいいそうです。
エルビス演算子はエルビス・プレスリーの顔文字(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以外でもことさら定めてないんじゃないかと🤣」「ググりにくい記号を検索するのに使えるかも🤔」
⚓各社が利用する言語やインフラ集
Link: 【46選】あのサービス・アプリのアーキテクチャ・プログラミング言語・フレームワークを大調査!〔2019年始版〕 - エンジニアHub|若手Webエンジニアのキャリアを考える!: https://t.co/4tQ2SlwQxw
— Yukihiro Matz (@yukihiro_matz) January 8, 2019
employment.en-japan.comにはいい記事がちょくちょくある印象です。
つっつきボイス:「あれ?次のツイートと同じものが貼ってある」「やや、貼り間違え失礼しました🙇」
遅ればせながら上はつっつき後に貼り直しました。
⚓Rubyがサーバーサイド言語2018の1位に
Link: サーバサイドプログラミング言語・オブ・ザ・イヤー2018はRuby | マイナビニュース: https://t.co/oWrV2jgCJQ
— Yukihiro Matz (@yukihiro_matz) January 8, 2019
つっつきボイス:「オブ・ジ・イヤーじゃなくてオブ・ザ・イヤーが狙ってる感😆」「えっこんなランキングあったんだスゲー😍」「いろいろ面白い😋」「これはどこのランキング?」「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解説サイト
- 元記事: The 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のアップデートが早々に出そう
新元号の発表に合わせて Unicode 12.1 や Ruby 2.6.2(多分)がリリースされる予定。新元号のコードポイント自体は U+32FF と決まっているのに、なぜ急いでリリースする必要があるのかというと、次の挙動のためです
$ ruby -e 'p "㍻".unicode_normalize(:nfkc)'
"平成"— Yusuke Endoh (@mametter) December 28, 2018
つっつきボイス:「お、@mametterさんのツイート」「ruby -e 'p "㍻".unicode_normalize(:nfkc)'
で合字をばらしたときの挙動は新元号が出ないと実装できないからでしょうね」「この合字をバラしたくなることってあるんでしょうか😆」「Unicodeの仕様上はできるはずだから、想定と挙動が変わるのはよくないということなのかも」
「こういう対応が可能なのは、やっぱりRubyが日本生まれというのが大きいなと思いますね☺️」「他の言語だったらまずスルーされそうだし」「自分でやっとくれとか言われそう😅」「下手するとリジェクト❌」
せっかく天皇陛下が事前に元号が変わる事をお伝えになったにも関わらず「盛り上がりが重要」という頭の悪そうな配慮でシステムでの対応期間をギリギリまで狭めてしまう日本政府。
— mattn (@mattn_jp) January 10, 2019
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓GitHubとGitLabの動向
- 元記事: New year, new GitHub: Announcing unlimited free private repos and unified Enterprise offering | The GitHub Blog
- 元記事: GitLab Serverlessを搭載したGitLab 11.6がリリース。Knativeをベースに、どのクラウドでも使えるサーバレスの実現へ - Publickey
つっつきボイス:「1つめはGitHubのプライベートリポジトリが無料になったヤツですね」「3人まで無料でしたっけ」「プライベートリポジトリそのものはunlimitedで、そこに3人まで無料で参加できる」「最近のマイクロソフトのきれいさは半端ない✨」「そっかマイクロソフトなんだな今は😳」「今までは無料のプライベートリポジトリと言うとBitBucketというイメージだったけど😅」
「無料のプライベートリポジトリって、大学の授業で使うときにいろいろ便利なんですよね: 今はGitHub使ってるんですが、学生にお金払わせるわけにもいかないのでパブリックリポジトリになってて、すると個人情報的なコミットをプッシュしたりしないかと気を遣うので😅」「あーたしかに」
「2つ目のGitLabですが、GitLab Serverlessっていうのが前からあったんですね」「ちょっと前くらいだったかと」「社内で使うことはありそうですか?」「うちでは特にないかなー🤔: ちょっと試してみたりするにはいいかも」
「そうそう、このKnative↓っていうのが核心にあるみたい」「くなてぃぶ?けいねいてぃぶ?」「どうやらけいねいてぃぶみたい」「GitLabって、他のプロダクトを買収したり統合したりして大きくなっているんですよ」「へー!」「だからGitLab Serverlessという名前は付いているけど、中身はKnativeということでしょうね😆」
- サイト: Knative | Google Cloud
- リポジトリ: Knative
⚓次のLinuxは5.0になりそう
つっつきボイス:「もう5.0ですか〜、早いもんだな〜👴」「ほんに👵」
「これ見てて気づいたんだけど、最近はI3Cなのかな?」「あ、私もそれが何なのか気になってました」「しばらく追いかけていない間にI2Cの次が出ていたとは」「そもそもI2Cがわからないという😅」「ワイも😅」
参考: MIPI Alliance、MIPI I3C Sensor Interfaceを正式に公開 (1) I3Cとはなんなのか? | マイナビニュース
参考: I2C - Wikipedia
「I2Cはセンサーサブシステムの一種で、それこそ温度センサーとかADコンバーターとかのポートをひととおり備えていて、いわゆるサウスブリッジの方に属するヤツですね: CPUの温度を測ったりとか」
「この記事↓を見てみると、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と呼ぶな!』みたいな😆」
「今のRedisはどちらかというと、RDBMSが苦手とするものは何でもやれるものになりつつある感😎: プッシュ通知なんてまさにそうだし」「あーたしかに!」「RedisにはPub/Subもとっくに入ってますし」「記事↓でも同じようなこと言ってる: ここでいうマルチモデルは、色んな用途に使えるマルチロール的な意味合いなんでしょうね」
その結果、コミュニティとRedis Lab社員の双方から、Redisを効果的に拡張してマルチモデルデータベースに変えられるおびただしい新モジュールが生み出された。
Redisの強みのひとつとして、文字列のほかにリストや文字列セット、ハッシュテーブル、地理座標、確率的データ構造といった抽象データ型をも保存できるというのがある。この柔軟性とRedisのシンプルさの組み合わせは、Redisがマルチモデルを目指すうえで重要である。
同記事より大意
「しかしこのパラグラフ↑みたいなストーリーをオレはどこかで聞いたゾ: PostgreSQLとかいうヤツ🤣」「🤣」「PostgreSQLというRDBMSも割と何でもできた気がするなっ🤣: 何かモジュールを入れればRedisみたいなこともかなりできちゃいそうだしっ」「いつか両雄が最終対決するんでしょうか🤣」「ハルマゲドン⚡️」
「余談なんですが、記事の途中に出てきた「spinach problem」が何を指すのか謎でした: そういう名前の数学の問題とかコンピュータ系の有名な問題があるのかと思ったらそうでもなさそうなので、以下のどれかなのかな思ってメモしました↓」
- Destiny2というゲームのエラーメッセージか、
- ほうれん草の育て方の問題か、
- The Spinach Problemという詩か
⚓JavaScript
⚓Underscore.js: JSの関数型プログラミング支援ライブラリ
- サイト: Underscore.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みたいな感じ」「わかりやすい!😋」「フレームワークとかじゃなくて、純粋なライブラリということか」
「だからUnderscore.jsは今でも続いているのかなー」「カバーする範囲を無理に広げなかったのがよかったのかも: もし機能を後から追加しまくったら、みんなそれに嫌気がさしてlightweight underscore.jsみたいなのを一斉に作り始めたりして😆」「あーわかりみ😆」「JSで何度繰り返されたかわからない歴史😆」「jQueryより軽量と称したライブラリがいくつも出現したみたいな☺️」
⚓CSS/HTML/フロントエンド/テスト
⚓Station: 複数のWebアプリを左タブ化するアプリ
- サイト: Station
同サイトより
参考: 追伸。そろそろおまえもstationでslackやWebアプリを一括管理をするように。 母より - Qiita
つっつきボイス:「社内で早速気に入って使ってる人がいました」「お、いかにもElectronアプリっぽいけど、これはもしかして左タブごとにセッションを分けられるのかな?」「あー、どうでしょう?」「だとしたら、AWSアカウントごとにタブを分けたいなー🥰」「というと?」「いろんな案件を扱っているのでAWSのアカウントが物凄い数になってて、切り替えがめんどくて😭」「それはつらそう😓」「複数のAWSアカウントを見比べたいときなんか、1つはChromeで、もう1つはFirefoxで、もう1つ開くときはシークレットモードにするとか😇」「うへ~😨」
(つっつき終了後、しばしその場で動かしてみる)
「うーん残念、タブごとにセッションは分かれてないようだ😢」「全タブで共通...」「惜しいですね...😔」
⚓言語
⚓Red言語: コンパクトかつマルチプラットフォームのコンパイラ言語
Red 言語初めて知ったけどなんかすごい.Windows/Linux/macOS/FreeBSD/Android ターゲットのネイティブコードにコンパイルできる汎用言語.1MB のシングルバイナリをダウンロードしてくるだけですぐ使えるらしい.REBOL 言語ベースで構文はちょっと独特 | 'red/red' https://t.co/8vOuDgSVj4
— ドッグ (@Linda_pp) January 7, 2019
- サイト: Red Programming Language
- リポジトリ: red/red
つっつきボイス:「ちょっとだけRedを動かしてみました↓: 単体のバイナリをダウンロードしてからにコマンドラインで最初に実行すると何やらライブラリとのバインドを開始して、終わると使えるようになったんですが、何されてるかよく見えなくてちょっぴりコワい😅」「ほほー☺️」
「GUIキットも内蔵してるみたいで、以下の2行を書くとGTKっぽいウィンドウも開きました↓」
# 同サイトより: GUIデモ
Red [Needs: 'View]
view [text "Hello World!"]
「RedはREBOLという言語に影響を受けたそうです」「さすがに知らないし😆」
- サイト: REBOL Language
「実用とかはともかく、よくこんなにコンパクトに作れたなと思って」「マルチプラットフォームなのが売りか」「対応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はめっちゃ使ってるけど、新しいものを率先して使う気にはならないし😆」「違いがよくわからないし😆」
⚓その他
⚓深層学習に新たな展開か
特殊なニューロンを1つ足すだけで深層学習の全ての局所解が消えて、必ず全体最適になる!? NIPS 2018の"Adding One Neuron Can Eliminate All Bad Local Minima"の紹介を投稿しました。 https://t.co/w5ZVQnaL6T
— Yuta Koreeda (@koreyou_) January 7, 2019
「ニューロンを1つ足すだけで深層学習の全ての局所解が消えて、必ず全体最適になる!?」が普段使ってるニューラルネットワークにも使えるように!? うまくいかないことも? Kawaguchiらによる"Elimination of All Bad Local Minima in Deep Learning"の論文紹介を投稿しました。 https://t.co/4Rm4pv0dan
— Yuta Koreeda (@koreyou_) January 9, 2019
つっつきボイス:「ディープラーニング系ですか」「局所解が消えて全体最適になったとして、それが本当に全体最適なのかどうかというのはあるけど、たぶんそのへんも含めた話なんでしょうね☺️」「2つ目の記事がそれっぽいですね」
「局所解というと、山登りしてて途中の頂上で満足してそこから先に進んでくれないみたいなイメージあります🗻」「あそこに本当の頂上があるのになぜ止まるみたいな😆」「今登ってるのは富士山だけどエベレストを忘れてるぞみたいな😆」
⚓AIは判断の理由を説明できるようになるか
上の論文は、以下の記事の中で紹介されていました。
参考: 自然言語処理ってなに?課題は? 研究者に聞く、エンジニアが学術論文を読み解くための技術 - エンジニアHub|若手Webエンジニアのキャリアを考える!
この論文で提案されたモデルは、機械の判断の過程を示すことができると述べられています。ブラックボックス化している機械学習のシステムの中を見えるようにし、システムが判断した根拠が分かるようになる手法を提案しているのです。
人間が「A案とB案どっちがいいですか?」と問われたときは、根拠を示して説明することが重要ですよね。しかし現在のAIは判断の根拠を語るのが苦手です。
同記事より(強調は編集部)
つっつきボイス:「これをAIと呼ぶとちょっと主語が広すぎる感: ニューラルネットワークというならわかるけど🧐」「判断の根拠がなくても通用する世界もあるしなー」「根拠を説明して人間がそれで納得してくれるかどうかの方が敷居が高かったりして😆」
⚓番外
⚓商用量子コンピュータ「IBM Q System One」
参考: IBMが世界初となる商用量子コンピュータ「IBM Q System One」を発表 - GIGAZINE
つっつきボイス:「おー、量子コンピュータがついに商用化ですか😍」「デザインのはったりが効いてますね」「大きさがよくわからないので横にタバコとか置いて欲しいし😆」
「ちなみにIBMの製品ラインナップって、大昔から英文字1文字で表す慣例なんですよ: Iシリーズとか」「えー知らなかった!」「だからQシリーズというのはまったく新しいラインナップということになりますね☺️」
「すごく野暮なこと聞きますけどおいくら万円なんでしょう?💰」「それはもう『お問い合わせください』で😆」「NDAを結ばないと値段教えてくれなさそう」「設置する場所の条件とかどうなんだろう?: 冷却設備とか」「それもお問い合わせですね」
今回は以上です。
「今回はちょっと早めに終わりました」「皆さまお疲れさまでしたー」「皆さまお疲れさまでしたー」「つっつきご参加ありがとうございました!🙇」
おたより発掘
週刊Railsウォッチ(20190115)Rubyの<=でクラス同士を比較、Rubyの記号の読み方いろいろ、Ruby C API解説サイトほか
今週も面白かったー😋
バックナンバー(2019年度第1四半期)
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。