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

週刊Railsウォッチ(20200428後編)Rubyのバックトレース順序が戻る、KubernetesでRailsをスケール、セキュリティソフト入れますか?ほか

こんにちは、hachi8833です。ついさっき見つけた記事がよかったので貼りました。

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

Ruby

Rubyのバックトレース順序が戻る


つっつきボイス:「@kamipoさんが超喜んでますね」「そう、これこれ!以前バックトレースの表示順序が変更されてからマジでやりづらいと思ってましたし😭」「今回の改定を喜んでいる人は@kamipoさん以外にもきっとたくさんいる😂」

以下は改定直前のツイートです。

「バックトレースの順序が変わることがあったんでしょうか?」「正確にはRubyのバックトレースが変わったけどRailsのバックトレースの順序は変わらなかった」「あ、そういうことでしたか😳」「Ruby 2.5の変更より前はバックトレースの順序は常に同じだったんですが、変わってからわかりにくくて😭」

「『バックトレースの順序が反転するという画期的なギミック』って超ワナですよ😇」「まあちょっと読めば順番が変わっているのはわかるんですけど」「RubyとRailsで順序が違うのが痛い😇」「みんな困ってないんだろうかって不思議だったし😆」

提案: Struct#initializeでキーワード引数もデフォルトで取れるようにしよう

# 同issueより
Post = Struct.new(:id, :name)

# 以下に加えて
Post.new(1, "hello") #=> #<struct Post id=1, name="hello">

# 以下の初期化もできるようにしよう
Post.new(id: 1, name: "hello") #=> #<struct Post id=1, name="hello">

つっつきボイス:「あ、Struct.newした後のnewでということか😳」「まあ名前は付いてますし、使いやすさ的には全然いいかなと思うけど🤔」

後で現行のRuby 2.7で実行すると以下のように引数が全部id:に入りました。

Post = Struct.new(:id, :name)
Post.new(id: 1, name: "hello")
=> #<struct Post id={:id=>1, :name=>"hello"}, name=nil>

「ちなみに自分はStructもOpenStructもあんまり使わない方で、Value Object作るならちゃんとクラス書きたい派😆」「😆」「今日はいないけどkazzさんが前にStructをちょくちょく使ってるのを見て『大変そうだな〜』って思いましたし😆」

参考: class Struct (Ruby 2.7.0 リファレンスマニュアル)
参考: class OpenStruct (Ruby 2.7.0 リファレンスマニュアル)

super_methodメソッドでRubyのDecoratorをテストする(Ruby Weeklyより)


つっつきボイス:「super_methodっていうメソッドがあるって知りませんでした😅」「途中の見出しが『The super super_method method』😆」「superで呼ばれるはずのメソッドをMethodオブジェクトにするみたいです」「Methodオブジェクトにsuper_methodメソッドがあるのは当然でしょうね☺️」「リフレクションするのに必要でしょうし☺️」

self 内で super を実行した際に実行されるメソッドを Method オブジェクトにして返します。
ruby-lang.orgより

「そのsuper_methodでDecoratorをテストするという記事か」「えぇ?、described_class.new.method(:info).super_method.callみたいなテストって書くかなぁ?😅」「わざわざsupoer_methodしてからcallするって、どういう観点のテストなのかわからん😆」「継承とは何ぞやと😆」

# 同記事より
RSpec.describe Address do
  describe '#info' do
    subject { described_class.new.info }

    it 'adds the phone number to the default address' do
      expect(subject).to include(phone_number: '123456789')
      expect(subject).to include(
        described_class.new.method(:info).super_method.call
      )
    end
  end
end

「呼べるか呼べないかで言えばたしかにsuper_methodは呼べますけど、こういうテストが欲しくなる状況がぱっと思いつかない😅」「記事はspecがシンプルになるということみたいだけど、ちゃんとテストできてるんだろうか🤔」「デバッグツールを作るのでトリッキーなことをしたいとかならともかく、普通のコードでsuper_methodを使うことはないんじゃないかな〜、普通は☺️」

クロージャでRubyコードを読みやすくする(Ruby Weeklyより)

参考: クロージャ - Wikipedia


つっつきボイス:「f.call()のショートハンドがf.()というのも今頃知りました」「f.()はカリー化の文脈とかで割とよく見るヤツですね☺️」「そうでしたか😅」「自分も見るたびに?って思いますし、あんまり好きな書式でもありませんけど、call()よりは短いですし😆」

def bar(f)
  f.()
end
bar(method(:foo)) # => hello from foo

「記事にも『f.()はビジネスロジックではめったに見かけないがオープンソースではよく見かける』ってありますね」「カリー化がビジネスロジックでめったに使われないからでしょう、きっと😆」「まあ😆」「もちろんビジネスロジックでカリー化がふさわしいこともありますし、それなら別にいいんですけど、呼び出しが増えると遅くなりがちなので☺️」

参考: カリー化 - Wikipedia

「ともかく.()は随分昔からちゃんとしたRuby入門には書いてあると思いますヨ😋」「探します👁」

ありました↓。

.()は、メソッド名のないメソッド呼び出しのように見える。これは定義できる演算子ではなく、callメソッドを呼び出すための構文糖である。この記法は、Proc オブジェクトに限らず、callメソッドを定義するすべてのオブジェクトで使える。
『プログラミング言語Ruby』(オライリー)p202より

Rubyのlambda呼び出し

「...Rubyだとlambdaでインラインメソッド的なものを書くときに何だかキモチヨクナイ気がします😆」「はいわかります😆」「C++でもJavaScriptでもかっこ()だけつけて関数と同じように呼べるのに、Rubyはこの.()という書き方のせいで普通の関数とlambdaが区別されるので、一時的な関数を作る気力が削がれそう😇」「それはある😆」「すっごくわかる😆」「普通に()で呼びたいのに😢」「いろんな互換性に配慮した結果そうなっているのはわかるんですが😅」「言語仕様上しょうがないんですけど😅」

後で自分でもやってみました。Rubyだと.()ですね。

// JavaScript
let foo = num => { return num * 2 };
foo(7);  // 14
// C++
auto foo = [](auto num) { return num * 2; };
printf("%d", foo(7)); // 14
# Ruby
foo = ->(num) { num * 2 }
foo.(7)  # 14

RailsのHashWithIndifferentAccessがRubyにないのはなぜ?

参考: ActiveSupport::HashWithIndifferentAccess`


つっつきボイス:「Redditにあったスレです」「よく持ち上がる話😆」「昔Matzがその辺の理由についてコメントしてたような覚えがあります」「『RubyがPHPみたいになるから』だったりして😆」「文字列とシンボルは全然違うものなのに、そこがRails方面にうまく伝わらなかったとかそんな感じ🧐」「へ〜」

「プログラミング言語全般ではたしかに文字列とシンボルは違いますし、自分もそう思うんですけど、Webの文脈だとその辺が厄介なんですよね😅」「うんうん」「Webだとどんなパラメータもいったん文字列になってしまうので、そういうのが間に挟まってHashWithIndifferentAccessができたのかなと思ってます☺️」「元PHPerとしてはHashWithIndifferentAccessって結構好きなんですけど😆、言語全般として考えたら一貫してないよねというのはワカル」

参考: Smalltalk と Ruby と LISP のシンボル - Smalltalkのtは小文字です

「でも最近のRubyだと文字列をfrozenにする動きがありますけど、それがデフォルトになったらHashWithIndifferentAccessと同じにしてもいいんじゃね?ってちょっと思いますね」「気持ちわかります」「もちろん文字列とシンボルは違うという主張はわかるんですけど、frozenがデフォルトの世界なら多少同一視してもいいのかなと😋」「探索速度とかを考えたら多少の同一視はありかも😋」


「...さっきのMatzのコメントは、どうやら以下の記事↓の記憶が自分の中で改ざんされてたらしき🤣」「自分で訳してて忘れてた😆」

Rubyのシンボルをなくせるか考えてみた(翻訳)

(Rubyの)シンボルはLispのシンボルを取り入れたもので、Lispのシンボルは文字列とは根本的に異なっていました。(Lispの)シンボルは文字列表現としてはイケてません(し速くもありません)が、Rubyはシンボルに関して独自路線を取ったため、シンボルと文字列の違いは(Rubyの)ユーザーからはそれほど認識されてこなかったのです。
同記事の引用より

「frozenなら事実上一意の値が与えられると考えてもいいんでしょうね」「frozenならそうだと思います☺️」「unfreezeしなければ😆」「シンボルって要は整数の定数だから、frozenなstringのアドレスだと思えばいいっちゃいいかも😆」「シンボルはto_sできますし」「個人的にはfrozen string literalをオフにできないことを前提にできるのなら文字列とシンボルを同一視してもいいかなと思います: でも今のRubyだとファイルごとにfrozen string literalをオンオフできるから同一視するとマズいのかもしれないけど☺️」「うーむ」

Rubyで線形回帰(Ruby Weeklyより)


同記事より


つっつきボイス:「ruby-linear-regressionというgemで線形回帰やってみた記事だそうです」「自分ならExcelでやれるところはExcelでやって、ExcelでできないところはPythonとかRでやっちゃうかな😆」「たしかにExcelでもできますね😆」「回数が多すぎなければ☺️」

# 同記事より
require 'csv'
require 'ruby_linear_regression'

x_data = []
y_data = []
csv = CSV.read("top50.csv")
csv.shift

# Load data from CSV file into two arrays -- one for independent variables X (x_data) and one for the dependent variable y (y_data)
# Row[0] = title
# Row[1] = BPM
# Row[2] = Popularity
csv.each do |row|
  x_data.push( [row[1].to_i] )
  y_data.push( row[2].to_i )
end

# 回帰モデルの作成
linear_regression = RubyLinearRegression.new

# 訓練データの読み込み
linear_regression.load_training_data(x_data, y_data)

# 正規方程式でモデルを訓練
linear_regression.train_normal_equation

# 計算コストを出力
puts "Trained model with the following cost fit #{linear_regression.compute_cost}"

# ある曲の人気を250 BPMで予測
prediction_data = [250]
predicted_popularity = linear_regression.predict(prediction_data)
puts "Predicted popularity: #{predicted_popularity.round}"

参考: 線形回帰 - Wikipedia

その他Ruby


つっつきボイス:「MatzのGitHub Sponsorsが今23人ぐらいになったそうです」「お、月10ドル払えばここのバッジに載せてもらえるのか🎫」「こういうのはいいですね〜😋」

その後見てみたらスポンサーが65人に爆増してました🎉。


なおRailsチュートリアルとRailsガイドでお馴染みのYasulabYassLab社も、招待制の法人向けGitHub Sponsorsの審査にパスしました🎉。

追記(2020/04/29): YassLab社のご指摘を受けて記事を修正いたしました🙇。

DB

PostgreSQL 13のinsert-onlyテーブルautovacuumを改善(Postgres Weeklyより)


つっつきボイス:「insert-onlyテーブルなんてのがあるのか」「ぽすぐれ何でもある😆」「UPDATEしないテーブルという意味でしょうか?」「いわゆるappend-onlyテーブルでしょうね🧐」「昔からあるんですね」

参考: Querying Append-Only Tables | Stitch Documentation

「autovacuum自体はPostgreSQLに昔からあるけど、それをinsert-onlyテーブル向けに賢くチューニングしたということみたい」「おぉ」「そもそも最近のPostgreSQLはvacuumを手動で実行しなくてもそれほど遅くならなくなったはずなので☺️」

autovacuumはテーブルの特定の値が上回ると常に実行される。この値は“autovacuum_vacuum_insert_threshold(デフォルトは1000)とautovacuum_vacuum_insert_scale_factor(デフォルトは0.2)から以下のように算出される。
insert_threshold + insert_scale_factor * reltuples
reltuplesは、pg_classカタログから取得したテーブルの行数の見積もり。
同記事より


見出しより:

  • insert-triggeredでautovacuumが動くしくみ
  • ユースケース1: insert-onlyテーブルでの「anti-wraparound」vacuum
    • insert-onlyテーブルでVACUUMが必要な理由
    • insert-onlyテーブルのanti-wraparound vacuumが問題になる可能性がある理由
    • 破壊的なanti-wraparound vacuumから身を守る方法
  • ユースケース2: insert-onlyテーブルでのindex-onlyスキャン
    • PostgreSQLのindex-onlyスキャンのしくみ
    • insert-onlyテーブルでのindex-onlyスキャンの問題点
    • insert-onlyテーブルでindex-onlyスキャンを取得する方法
  • ユースケース3: insert-onlyテーブルでの「hint bit」
  • 今後の改良
  • まとめ

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

KubernetesでRailsをスケールする(Hacklinesより)


つっつきボイス:「要はRailsをPodに押し込めろと😆」「ポッドというと...」「PodはKubernetesのコンテナの単位です🧐」「そういえばKubernetesを勉強中って話してましたね」「合間を見て、くばねて本をちまちまと😆」

参考: Podとノードについて - Kubernetes

「最近BPSのWebチームもDockerやdocker-composeの運用が定着してきたので、そろそろ普通のコンテナオーケストレーションツールで包んじゃおうかなと構想中📈」「お、いよいよですね😋」「AWSのECSやFargateを見てくれているメンバーがいるので、じゃ自分はくばねて方面をやろうかなと思ってます☺️」「なるほど〜」「BPS社内にあるDocker用のホスティングマシンが6個ぐらいできてきてそろそろややこしくなってきましたし😆」「前は4つだった気がしますけどさらに増えてるとは😳」「メモリが足りなくなると足す感じでやってます☺️」


見出しより:

  • スケールアップする
  • Autopilotでスケールする
  • タスクをJobsで実行する
  • productionのログファイルをinspectする
  • Podにログインする
  • その他の便利タスクたち

GitHubとGitLab


つっつきボイス:「GitHubとGitLabの機能リリースがいくつか出てたので」「GitHubもGitLabも、リポジトリ管理ツールというよりは開発プロジェクトの管理ツール&オーサリングツールに変化してきた感じはありますね🧐」「ところで以下の記事の見出しにGitLabのカンバン表示が書いてありますけど、カンバン表示は前からオープンソース版のGitLabにもあるんですよね😆」「そうですね😆」

参考: GitLab、有償版の機能をオープンソースへ移植すると発表。カンバン表示やカナリーデプロイ、複数のKubernetesクラスタの使い分けなど18機能 - Publickey

「まあGitLabは有料版とオープンソース版で元々そんなに違いはありませんでしたし、逆にオープンソース版にあるけど有償版の下の方にはなかった機能もあったりしましたし、一般に思われているほど差はないかなと思いますね☺️」「へぇ〜😳」


GitLab記事を見ると、以下のそれぞれのissueを足して18個になるようです。

  • 「Plan」「Create」「Verify」「Package」「Release」「Configure」「Defend」がオープンソースに移行した
    • Plan: 共同作業を同期する
    • Create: よりよいコードやブランチをビルドする
    • Verify: コードの品質をさらなる高みに
    • Package: パッケージのビルドや共有
    • Release: 継続的デリバリー(CD)をシンプルに
    • Configure: 複数のKubernetesクラスタをサポート
    • Defend: アプリケーションセキュリティ


about.gitlab.comより

GitLab自社運用のための注意点とノウハウ(2018/06版)

CSS/HTML/フロントエンド/テスト/デザイン

Periodic Background Syncとは


つっつきボイス:「例のjxckさんの記事です」「PWA(Progressive Web Apps)に関連するブラウザとかWebの仕様の話のようで、Service WorkerのBackground Syncとは違うことをやりたいという感じ」

参考: PWAをもっと簡単に初めてみる - Qiita
参考: サービスワーカー API - Web API | MDN
参考: ServiceWorkerのBackground Syncでオンライン復帰時にデータ送信 - Qiita

「お〜、『Webをインストールする』という言い方をしてますね」「Webをインストール?」「おそらくですがローカルで動くものとWebで動くものを区別しないで実行できるというような意味合いだと思います: 以下にあるように、Webアプリは本来インストールなしで実行できるけど、特定の機能が必要なときはインストールしてパーミッションを与えないといけないという感じ」「おぉ〜」

本来 Web は、インストールのような操作なく、 URL にアクセスするだけでページが読み込まれ、スクリプトが実行される。
ここで強力な機能(Powerful Features)がユーザの同意なく実行されると、意図しない問題が発生する可能性がある。
そのため、ここまでの機能は、その API の重要性に応じて User Gesture, Feature Policy, Permission Prompt などを使い分けてきた。
一方、 Native App は、強力な OS 機能の利用を、ユーザによる明示的なインストールという操作(とそこで発生する認証や追加許諾)によって許可してきた。
この考え方に合わせれば、 「Web もユーザが明示的に Install すれば、 Native と同等の機能を許可できるのではないか」という発想に至る。
同記事より

「Webアプリもインストールという明示的な操作を経れば、ブラウザで冒頭のPeriodic Background Syncみたいな動作を許可してもいいのでは、ということですね」「おぉ〜」「Windowsにもアプリのインストールでroot権限取るときにダイアログが出てくる機能があったけど、あれ何て名前だっけ?🤔」「...Windowsでぽーんと出るのはUACですね」「それそれ😋、Webのインストールはそういうのに近い考え方なのかなと思って」「Webをインストールするという言い方は何となくいい感じな気がします👍」「ですね😋」

参考: ユーザーアカウント制御(UAC) - Wikipedia

「ところで『Webをインストールする』って元記事の人独自の言葉なのかな?🤔」「引用されてるissue↓とかにもinstalled web appとかinstallableみたいな言い方があるから、そちらが元みたい」

「つい昔なつかしのActiveXみたいなものを想像してしまったんですが、たぶん違いますよね?😅」「Webをインストールするというのは、ブラウザの権限付与の文脈の中でインストールらしい動作を明示することで特定の操作の許可を得ることだと今のところ理解しているので、ActiveXでOSライブラリの実行を許可するのとは違うでしょうね🧐」「なるほど😅」

参考: ActiveX - Wikipedia

「まあPeriodic Background Syncがどのぐらい大事なのかはわかりませんが😆、Webをインストールするという考え方はキャッチーだし、なかなかいいと思いました😋」「はい😋」「今のService Worker周りは正しく使われてない度が高い気はしますけど🤣」「通知許可したことないです🤣」

Webプッシュ通知よもやま話

「最近通知の許可を求めてくる新聞系のサイトが多くて嫌になるじゃないですか😆」「たしかに😆」「あれを自動でオフにするChrome拡張とかもあるぐらいですし、ユーザーが速攻不許可にする感じになってますよね😆」「😆」「なのでインストールという考え方に移行して、もっとtrustedなしくみを導入するのはありなのかなと思いました☺️」「それはそれで悪用されたりして?😆」「まあ先のことはわかりませんが😆」

「...Webブラウザは昔からブラウザを閉じればすべてが終わるという大前提でやっていますけど、Service Workerとプッシュ通知が入ってきたあたりから変わりつつありますね: でもそこで昔からやっている人たちの機嫌を損ねないように、ものすごく慎重にバランスを取りながらやってるという印象あります🧐」「それはある」「それに何がセキュリティホールなのかは最早感触でしかないという側面もあるので、仕様が不評を買わないための落とし所を慎重に探している感じですね☺️」

「あの手の通知許可ダイアログ、あちこちで出くわす😆」「しょっちゅう出てくるあのダイアログは単なる通知の許可だと思います」「あれはService Workerの許可とは別でしたっけ?」「ブラウザのプッシュ通知は専用のAPIがありますね🧐」「つまりService Workerは通知そのものとは別なのか」「オフライン対応で広く裏で使われているとは思います: オフライン対応するならService Workerは必須です☺️」「なるほど」「たしかにそれがないと動かしようがないですし」

「実はあの通知がうざすぎるということでMozillaとGoogleがそれぞれ通知をおとなしくさせる予定になっていて、もうすぐアップデートが来るはずです」「それは大歓迎🎉」「プッシュ通知はフォーカスをダイアログに持っていかれるのが問題」「ほんとそれ!😤」「アンケート取ったらほとんどの人が読まずに通知のNoを押してることがわかったそうです🧐」「でしょうね🤣」「🤣」

「今リンク貼りました↓🩹」「非常に不人気🤣」「やはり🤣」「実装した人たちは乱用されると思わなかったんだろうか🤣」「許可が1%程度で48%は明示的に拒否ということは、残り50%は単に離脱しているということでは🤣」「もう即閉じ🤣」

参考: 非常に不人気な「Web Push通知」、Firefox 72以降ではポップアップを表示せずURLバーのアイコンで通知するのみに | スラド IT

「おとなしめの通知ではURLバーに通知が出るのか: それならまあいいかも☺️」「Webをインストール、覚えとこう😋」

言語・設計・ツール

セキュリティソフト入れますか?


つっつきボイス:「仕事のパソコンはセキュリティポリシー上の理由でウィルスチェッカー入れてるけど私物のパソコンはWindows Defenderで十分って徳丸先生が言ってますけど、そういうものなんでしょうか?」「あ、私もそうですよ: 私物PCはWindows Defenderだけです☺️」「おぉ」

参考: Windows セキュリティによる保護 - Windows Help

「...セキュリティソフトなんてセキュリティホールを増やすためのソフトじゃないですか🧐」「なんと🤣」「🤣」「セキュリティソフトがウィルスソフトって言われるのは、あれ言い間違いじゃないと思ってますから🧐」「そこまで🤣」「🤣」

「だいたいセキュリティソフトってセキュリティ上よくないことしかしないじゃないですか: 特権で勝手に動いてフルスキャンかけるし、SSLを通そうとして証明書のチェックをおざなりにしたりとか、そんなんばっかしです🧐」「お、おう😅」「まあそうですけど😆」

「まあ自分たちが業務用PCにセキュリティソフト入れてるのも徳丸先生と同じで、取引上の理由しかありませんし😆」「はい☺️」「セキュリティソフトに意味があるとすれば、うっかりミスを防ぐ効果でしょうね🧐」「あまり詳しくない人ほど効果が高い☺️」「Webカメラ止めてくれたりするのは実際ありがたいですし😋」

「でもセキュリティにこだわればこだわるほどセキュリティホールの比率は高まると思います😆」「セキュリティソフトがルート証明書入れてくる時点でどうかと思いますし🤣」「Windows Defenderで十分😋」「Macの場合どうしよう...😅」


以下はつっつき後のツイートです。

ソースコードブランチ管理のパターン


つっつきボイス:「Martin Fowlerさんの記事です」「この辺の図で何となくわかりそう😋」


同記事より

「ポリシーとしては上図の左のようにブランチを管理したいけど、だいたい右みたいになるという😆」「右が現実😆」「左はGit-flow↓で言えば下の線がmaster、その上がdevelop、その上がfeatureブランチに相当するんですけど、縦の下矢印は必ずmasterに一方向に向かっているのがポイント🧐」「ふむふむ」「本来こうあるべきなんですが、現実には右の下みたいに別のブランチが生えてきて一方向にならなくなってしまう、ということが言いたい図だと思います☺️」「なるほど!」

参考: git-flow cheatsheet

「どんなプロジェクトでもそうですけど、ブランチ管理はルールを制定することと、それを守らない人をリジェクトする強い心がないと徹底しないでしょうね🧐」「たしかに」

「以下の記事でもMartin Fowlerのfeature toggles(feature flag)を使ってやってるそうです」「feature flagも昔からあるやり方です😆」「ありゃ😅」

参考: フィーチャートグル - Wikipedia

Gitブランチ運用よもやま話

「ところで自分たちWebチームはGit-flow使ってますけど、アプリチームでは何を使ってます?」「...完全なGit-flowではないけどそれに近い使い方はよくやってます」「現行バージョンにでかい機能を入れるときは普通にfeatureブランチ切ります?」「メンテナンスブランチを伸ばしたくないので、master/develop/feature/hotfixで極力やりたいです☺️」

「クライアントごとにリポジトリを分けるとかはしませんか?」「極力やらないように努力してます😆」「納得😆」「やっちゃダメなヤツ😆」「そこが分岐してしまうと二度と元に戻れなくなると思うので、ソースは同じままでクライアントごとのソースを生成するビルドオプション作ってます」「なるほど」(以下延々)

その他ツール


つっつきボイス:「TweetDeck風にGitHubリポジトリをブラウズできるツールだそうです」「リポジトリのコミットを表示してるみたい」「そこまで頻繁にコミットされるんでしょうか😅」「オープンソースのコミッターなら使うかな?」

「22ドルだそうです😆」「高っ😆」「オープンソースでこれがないと困る人はむしろ金もらえる立場だったりして😆」

その他

古書通販


つっつきボイス:「古書店の人が本棚を動画撮影して、欲しい本を知らせてもらうという企画が評判よさそうなので」「たしかに書籍データを打ち込む手間を考えたら動画の方がラクですね😋」「カメラ移動をゆっくりで願いますという注文もありました😆」

「古書の背表紙だと第何版なのかまではわからないか🤔」「あ、たしかに」「初版じゃないとイヤとか😆」「背取らーとかなら版数も気にするでしょうし😆」「うちのK&R本は第200うん十刷までいってたかな😆」「そんなに😆」「今なら300ぐらいまでいってたりして😆」

参考: プログラミング言語C - Wikipedia

著者名の頭文字からしばしばK&Rと略される。
ja.wikipedia.orgより

番外

元素周期律表がリニューアル

以前からいろんな周期律表が考案されているようです。


後編は以上です。皆さまよい祝日を。

おたより発掘

バックナンバー(2020年度第2四半期)

週刊Railsウォッチ(20200421後編)Ruby 2.4サポート終了、Ruby 3の右代入演算子、GitHubコア機能無料化ほか

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

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

Ruby Weekly

Hacklines

Hacklines

Publickey

publickey_banner_captured

Postgres Weekly

postgres_weekly_banner


CONTACT

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