こんにちは、hachi8833です。スマホを電車に置き忘れてしょんぼりしてます(´・ω・`)。
3月のウォッチ、いってみましょう。今回はつっつき成分は少なめです。
Rails: 今週の改修
5.2リリース直前だけに、大きな修正は見当たらない感じでした。5.2-stableと6.0向けmasterの両方に多数の同じ修正が当たっています。
まずは5.2-stableから。
関連付けの作成と検索の挙動を一貫させた
これは#29722の別案で、かつ#29601と#a1fcbd9の復活です。
現時点では、関連付けの作成と通常の関連付け探索ではstore_full_sti_class
が反映されておらず、eager loadingとpreloadingはこの設定を考慮しています。これでは、store_full_sti_class = false
の場合にeager loadingやpreloadingではポリモーフィックなレコードが作成されても検索できなくなります。
関連付けの作成と検索の挙動は一貫すべきです。
同PRより
# activerecord/lib/active_record/associations/preloader/association.rb#:121
if reflection.type
- scope.where!(reflection.type => model.base_class.sti_name)
+ scope.where!(reflection.type => model.base_class.name)
end
# activerecord/lib/active_record/reflection.rb#L196
if type
- klass_scope.where!(type => foreign_klass.base_class.sti_name)
+ klass_scope.where!(type => foreign_klass.base_class.name)
end
つっつきボイス: 「store_full_sti_class
ってメソッドかなと思ったら設定(属性)だったんですね」
# activerecord/lib/active_record/inheritance.rb#L43
module Inheritance
extend ActiveSupport::Concern
included do
# Determines whether to store the full constant name including namespace when using STI.
# This is true, by default.
class_attribute :store_full_sti_class, instance_writer: false, default: true
end
その後#sti_name、String#demodulize
と追ってみました。
「demodulize
は名前空間の部分を取り払うメソッドか↓」
'ActiveSupport::Inflector::Inflections'.demodulize # => "Inflections"
'Inflections'.demodulize # => "Inflections"
'::Inflections'.demodulize # => "Inflections"
''.demodulize # => ''
cookie内の期限切れ情報の問題を修正
# actionpack/lib/action_dispatch/middleware/cookies.rb#L491
private
def expiry_options(options)
- if options[:expires].respond_to?(:from_now)
- { expires_in: options[:expires] }
+ if request.use_authenticated_cookie_encryption
+ if options[:expires].respond_to?(:from_now)
+ { expires_in: options[:expires] }
+ else
+ { expires_at: options[:expires] }
+ end
else
- { expires_at: options[:expires] }
+ {}
end
end
期限切れ情報を無効にするときにuse_authenticated_cookie_encryption
をチェックするようになりました。
Capybara 3.xに対応
# Gemfile#L16
-gem "capybara", "~> 2.15"
+gem "capybara", ">= 2.15", "< 4.0"
つっつきボイス: 「今のCapybaraは3.0.0.rc1がついこの間出たところなんですね」
PDFプレビューとしてmutoolsの他にPopplerも提供
MuPDFツールのライセンスが厳しいので、GPLライセンスのPopplerも使えるようにしたそうです。なお、検索してたらMUTOOLSという無関係な音楽制作ツールが出てきました。
# activestorage/lib/active_storage/engine.rb#L16
config.active_storage = ActiveSupport::OrderedOptions.new
- config.active_storage.previewers = [ ActiveStorage::Previewer::PDFPreviewer, ActiveStorage::Previewer::VideoPreviewer ]
+ config.active_storage.previewers = [ ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer ]
config.active_storage.analyzers = [ ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer ]
config.active_storage.paths = ActiveSupport::OrderedOptions.new
参考: Poppler : PDFのコマンドラインツール | PDF
ActiveStorageで自分自身の置き換え時に添付blobがパージされないように修正
ここからはmasterブランチです。
# activestorage/lib/active_storage/attached/one.rb#L65
private
def replace(attachable)
- blob.tap do
+ unless attachable == blob
+ previous_blob = blob
+
transaction do
detach
write_attachment build_attachment_from(attachable)
end
- end.purge_later
+
+ previous_blob.purge_later
+ end
end
has_one
/belongs_to
リレーションシップのdependent:
を修正 => reject?
- commit: #a286c32 Fix dependence on has_one/belongs_to relationships
- issue: #32022 throw :abort does not propagate to parent class
あるクラスの
belongs_to
やhas_one
リレーションシップでdependent: :destroy
オプションを有効にした場合は、依存先クラスが削除された場合にこのクラスを削除すべきではない。
同commitより
# 同issueの再現手順より
class Parent
has_one :child, dependent: :destroy
end
class Child
belongs_to :parent, inverse_of: :child
before_destroy { throw :abort }
end
c = Child.create
p = Parent.create(child: c)
p.destroy
# 期待する動作 子がabortされても親はdestroyされない
p.destroyed? # false
p.child.destroyed? # false
# 実際の動作
p.destroyed? # true #親がdestroyされてる
p.child.destroyed? # false
URI.unescape
でエスケープありなしのUnicodeを混在できるように修正
# 同commitより
URI.unescape("\xe3\x83\x90") # => "バ"
URI.unescape("%E3%83%90") # => "バ"
URI.unescape("\xe3\x83\x90%E3%83%90") # =>
# Encoding::CompatibilityError
# activesupport/lib/active_support/core_ext/uri.rb#L13
# YK: My initial experiments say yes, but let's be sure please
enc = str.encoding
enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
- str.gsub(escaped) { |match| [match[1, 2].hex].pack("C") }.force_encoding(enc)
+ str.dup.force_encoding(Encoding::ASCII_8BIT).gsub(escaped) { |match| [match[1, 2].hex].pack("C") }.force_encoding(enc)
end
つっつきボイス: 「\xe3\x83\x90%E3%83%90
を復元できてなかったのか」「引用符がバ
にかかってて読みにくいですねー」
Rails起動時の明示的なハンドラオプション-u
を追加
ハンドラ(PumaとかThinとか)の指定と環境の指定-e
が混じってやりにくかったからだそうです。
$ bin/rails server thin # 従来
$ bin/rails server -u thin # 今後
Rails
globalize: ActiveRecordをi18n化するgem
- リポジトリ: globalize/globalize
- 元記事: How to write complex queries using Globalize gem in Rails applications - Fatos Morina
- サイト: https://www.reactrails.com/
# 同リポジトリより
I18n.locale = :en
post.title # => Globalize rocks!
I18n.locale = :he
post.title # => גלובאלייז2 שולט!
つっつきボイス: 「これ某案件のGemfileに入ってる…」「Readmeにはi18nのデファクトって書いてありますね」
これまでウォッチに登場した他のi18n関連gemをとりあえずリストアップしてみました。
- svenfuchs/i18n-active_record
- shioyama/mobility
- brainspec/enumerize
- aderyabin/localer — ローカライズ漏れ検出
- glebm/i18n-tasks — ローカライズ静的解析
PodCast: React on RailsとWebpackerの話(Hacklinesより)
- 元記事: RR 352: React on Rails and Webpacker with Justin Gordon and Rob Wise - Devchat.tv
- リポジトリ: shakacode/react_on_rails
★3700超えです。npmからyarnを使うように変わっています。react_on_railsのリポジトリを見ると「Webpacker 3.0に対応」とあります。先週4.0が出たばかりでしたね。
参考: react_on_rails導入
activerecord-turntable: シャーディングgem(Awesome Rubyより)
# 同リポジトリより
+-------+
| App |
+-------+
|
+---------+---------+---------+---------+
| | | | |
`--------` `-------` `-------` `-------` `-------`
| Master | |UserDB1| |UserDB2| |UserDB3| | SeqDB |
`--------` `-------` `-------` `-------` `-------`
development:
clusters:
user_cluster: # <-- cluster name
algorithm: range_bsearch # <-- `range`, `range_bsearch` or `modulo`
seq:
user_seq: # <-- sequencer name
seq_type: mysql # <-- sequencer type
connection: user_seq_1 # <-- sequencer database connection setting
shards:
- connection: user_shard_1 # <-- shard name
less_than: 100 # <-- shard range(like mysql partitioning) If you are using a modulo algorithm, it doesn't need it.
- connection: user_shard_2
less_than: 200
- connection: user_shard_3
less_than: 2000000000
つっつきボイス: 「ドリコムさんのgemです」「ドリコムさんはこういうのをgemに切り出す文化があるって聞いたことありました」「請負開発だと難しいところ…」「以前にPostgreSQLのシャーディング記事↓を翻訳したのを思い出しました」
be_json
などのJSON向けRSpecマッチャー(RubyFlowより)
★はまだ少ないですが。
# 同記事より
expect(response).to be_json('meta' => {})
expect(response).to be_json include('meta' => include('next' => end_with('offset=200')))
expect(response).to be_json hash_excluding('total')
つっつきボイス: 「こういうマッチャーが欲しい気持ちってむちゃくちゃよくわかりますね: レスポンスをこうやってjqっぽくテストするみたいな」「jqは癖強いけど速くて好きです♡」「be_json
ってメソッド名、JSONであるかどうかをチェックする、みたいに見えてちょい紛らわしいかも」
「ところでRSpecって何とかして英語的にしようとしてむしろハマっているような気がしません?」「もしかするとminiTestでよかったんじゃないかみたいな: この間のRuby25のMatzの対談でもそんな話が出てましたね: RSpecのマッチャーはいいと思いますが」「RSpecのマッチャーってそのままminiTestには持っていけないんですよね?」「やったことないけどできなさそうな気がします」「RSpecの構文ってDRYに書けDRYに書けって誘ってる気がする」
@a_matsuda @shyouhei @sora_h @unak エコシステムはでかいと思うんだけど、その原動力は「なんかかっこえー」ってところだったんですかね
— _ko1 (@_ko1) April 17, 2014
rack-reducer: Rackアプリで使えるURL書き換えgem(RubyFlowより)
- リポジトリ: chrisfrank/rack-reducer
# 同リポジトリより
# app/controllers/artists_controller.rb
class ArtistsController < ApplicationController
def index
@artists = Artist.reduce(params)
@artists.all.to_json
end
end
# app/models/artist.rb
class Artist < ActiveRecord::Base
extend Rack::Reducer # makes `self.reduce` available at class level
# Configure by calling
# `reduces(some_initial_scope, filters: [an, array, of, lambdas])`
#
# Filters can use any methods your initial dataset understands.
# Here it's an ActiveRecord query, so filters use AR query methods.
reduces self.all, filters: [
->(name:) { where('lower(name) like ?', "%#{name.downcase}%") },
->(genre:) { where(genre: genre) },
->(order:) { order(order.to_sym) },
]
end
つっつきボイス: 「Rackミドルウェアかと思ったら、Rackを使うアプリで使えるgemですね: Sinatraでも使えるとか」「あ、ほんとだ」「でもこの名前だとRackミドルウェアかと思っちゃう(汗」
Service Objectがアンチパターンな理由(RubyFlowより)
# 同記事より
class Rating < ActiveRecord::Base
belongs_to :user
belongs_to :media
def self.rate(user, media, rating)
rating_record = Rating.find_or_initialize_by(user: user, media: media)
rating_record.rating = rating
rating_record.save
# do some extra stuff here like run algorithmic data processing,
# add social activities to timelines, etc.
end
end
# And the updated controller code:
media = Media.find(params[:media_id])
rating = params[:rating].to_i
Rating.rate(current_user, media, rating)
つっつきボイス: 「結論はconcernsとPOROにしようってことみたいです」「この記事にもモーフィアスの絵が」「みんな好きですねー」
「先月の社内勉強会で『Service Objectは実は1種類ではないのでは』『少なくとも2種類あるのではないか』って話が出ましたけど、今のところそういう記事を英語圏でも見かけないんですよ」「推理小説の犯人が実は2人いる!とかみたいな?」「11人いる!とかw」
ruby_server_timing: RailsのサーバーメトリックスをChrome’s Developer Toolsで(GitHub Trendingより)
- リポジトリ: scoutapp/ruby_server_timing
つっつきボイス: 「Chromeのコンソールで見られるのはちょっと便利そうっすね: ところでこれはScoutのサービスから取ってきてるみたいだけど有料?」「リポジトリにはScoutのアカウントは不要って書いてるから大丈夫なのかな?」
faster_path gemが0.3.1になってさらに高速化(RubyFlowより)
- リポジトリ: danielpclark/faster_path
昨年のウォッチで取り上げたfaster_path gemです。Rustで書かれています。
FasterPath Rust Implementation | Ruby 2.5.0 Implementation | Time Shaved Off |
---|---|---|
FasterPath.absolute? |
Pathname#absolute? |
91.9% |
FasterPath.add_trailing_separator |
Pathname#add_trailing_separator |
31.2% |
FasterPath.children |
Pathname#children |
13.2% |
FasterPath.chop_basename |
Pathname#chop_basename |
54.5% |
FasterPath.cleanpath_aggressive |
Pathname#cleanpath_aggressive |
73.8% |
FasterPath.cleanpath_conservative |
Pathname#cleanpath_conservative |
70.7% |
FasterPath.del_trailing_separator |
Pathname#del_trailing_separator |
80.6% |
FasterPath.directory? |
Pathname#directory? |
11.3% |
FasterPath.entries |
Pathname#entries |
8.4% |
FasterPath.extname |
File.extname |
41.2% |
FasterPath.has_trailing_separator? |
Pathname#has_trailing_separator |
67.6% |
FasterPath.plus |
Pathname#join |
66.4% |
FasterPath.plus |
Pathname#plus |
81.4% |
FasterPath.relative? |
Pathname#relative? |
84.1% |
FasterPath.relative_path_from |
Pathname#relative_path_from |
69.8% |
同リポジトリより
つっつきボイス: 「これは速い: 置き換えは自分でやらないといけないんですかね?」「refinementできるみたいです↓」
require "faster_path/optional/refinements"
using FasterPath::RefinePathname
ruru: Rustで書けるRuby拡張(RubyFlowより)
- リポジトリ: d-unseductable/ruru
# 同リポジトリより
#[macro_use]
extern crate ruru;
use ruru::{Boolean, Class, Object, RString};
methods!(
RString,
itself,
fn string_is_blank() -> Boolean {
Boolean::new(itself.to_string().chars().all(|c| c.is_whitespace()))
}
);
#[no_mangle]
pub extern fn initialize_string() {
Class::from_existing("String").define(|itself| {
itself.def("blank?", string_is_blank);
});
}
つっつきボイス: 「こんな感じで書けるんですねRust」「extern
とかマクロとかあって心がちょっとざわつく」「Ruby本家がさっきのfaster_pathみたいなのを標準で取り込んだりしないかなと思ったり: やらないだろうけど」
参考: プログラミング言語Rust
Railsについてのアンケート募集: 第5回(Hacklinesより)
Planet Argon社が、2年に一度ぐらいのペースで取っているRailsの使われ方などについてのアンケートです。
つっつきボイス: 「アンケート長いんで今は回答しなかったんですが、過去の回答が結構面白いかも」「おー、例外トラッキングツールはAirBrakeがトップ、とか↑」「GitHubの★とかとまた違った角度でいいかも」
その他Rails小物記事
Ruby trunkより
提案: ハッシュの値を省略できるようにしたい(継続)
- feature: #14579 Hash value omission
x = 1
y = 2
h = {x:, y:}
p h #=> {:x=>1, :y=>2}
def login(username: ENV["USER"], password:)
p(username:, password:)
end
login(password: "xxx") #=> {:username=>"shugo", :password=>"xxx"}
つっつきボイス: 「2つ目のはワカル気がしますけど、1つ目はどうかなー?」「こういうことができる実装の言語がどこかにあったような気がする…ES6かなと思ったら違った」
実際にはないメソッドがRandom::Formatter
ドキュメントにある
Range#===
内部でinclude?
じゃなくてcover?
を使うようにしたい(継続)
#12612とかぶっているのを承知で再度上げています。こういうのを#===
で書きたいようです。
IPAddress("172.16.10.1")..IPAddress("172.16.11.255")
参考: Range#cover?
つっつきボイス: 「このzverokさんの記事は何度か翻訳したことがあったので↓」
Ruby
RubyGems.orgがTLS 1.0/1.1を非推奨に(Ruby Weeklyより)
OpenSSL versions 1.0.0t以下にリンクされたRubyや、JVM 6以下にリンクされたJRubyからRubyGems.orgに接続できなくなるそうです。
GitentialでGitHubリポジトリの昨年のRuby開発をビジュアル表示してみた(Awesome Rubyより)
- サイト: https://gitential.com/
- デモ: Gitential ® software development analytics and monitoring tool using source code analysis — うまく見えないときはブラウザの「シークレットモード」で開いてみてください
つっつきボイス: 「見せ方が結構きれいだなと思って」「各コミッターの活動状況がわかるし」「オープンソースリポジトリのチェックによさそう」
ruby-advisory-db: bundler-auditとrubysec.comの脆弱性情報データベース
- リポジトリ: rubysec/ruby-advisory-db
- サイト: https://rubysec.com/
- リポジトリ: rubysec/bundler-audit
この間のウォッチで扱ったhttps://rubysec.com/サイトの脆弱性情報がここに集められているそうです。
RSpecを自作してDSLを理解する(Ruby Weeklyより)
# 同記事より
class Describe
attr_reader :context_name
def initialize(context_name, &block)
@context_name = context_name
instance_eval &block
end
def describe(context_name, &block)
Describe.new(context_name, &block)
end
def it(context_name, &block)
end
end
def describe(context_name, &block)
Describe.new(context_name, &block)
end
describe NumberService do
describe '#number' do
it 'returns 12' do
end
end
end
Ruby言語の関数型プログラミング的側面(Hacklinesより)
高階関数やカリー化↓などをRubyでやってみる記事です。
Rubyで遺伝的アルゴリズム(Hacklinesより)
CAPACITY = 20
def fitness
weights = [2, 3, 6, 7, 5, 9, 4]
values = [6, 5, 8, 9, 6, 7, 3]
w = weights
.map
.with_index { |w, idx| value[idx].to_i * w }
.inject(:+)
v = values
.map
.with_index { |v, idx| value[idx].to_i * v }
.inject(:+)
w > CAPACITY ? 0 : v
end
つっつきボイス: 「chromosome(染色体)とかsurvival of fittest(適者生存)とかそっち系の用語が出てきますね」「遺伝的アルゴリズムって言葉を久々に聞いた気がしました」
参考: Wikipedia-ja 遺伝的アルゴリズム
TensorFlowとRubyでCAPTCHAを解かせる(Awesome Rubyより)
CAPTCHAは機械学習で突破できるようになってしまったから昨今はもう意味がないという記事をこの間見かけましたが、さもありなんでした。
# 同記事より
require 'tensorflow'
# Loading Saved Model
saved_model = Tensorflow::Savedmodel.new
saved_model.LoadSavedModel(Dir.pwd + '/break-captcha-protobuf', ['serve'], nil)
# Read the image file and specify the image contents in a Tensor
image_file = File.new(Dir.pwd + '/break-captcha-protobuf/captcha-1.png', "r")
feeds_tensor = Tensorflow::Tensor.new(image_file.read)
参考: TensorFlow
参考: 機械学習を使ってCAPTCHAをわずか15分で突破するチャレンジが行われる - GIGAZINE
steep: Ruby 2.5を型付けするgem(Ruby Weeklyより)
- リポジトリ: soutaro/steep
class Foo
# @implements SuperFoo
# @type const Helper: FooHelper
# @dynamic name
attr_reader :name
def do_something(string)
# ...
end
def bar(symbol = :default, size:)
Helper.run_bar(symbol, size: size)
end
end
$ steep check lib/foo.rb
foo.rb:41:18: NoMethodError: type=FooHelper, method=run_bar
foo.rb:42:24: NoMethodError: type=String, method==~
つっつきボイス: 「作者のSoutaro Matsumotoさんは昨年のRubyKaigiでもRubyの型付けについて発表してて↓、論文の形でも発表してたりします」「アノテーションとかで型を指定する感じなんですね: こういうのをしなくていいのがRubyのいいところなのに、と思ったりもしますが」
週刊Railsウォッチ(20170922)特集: RubyKaigi 2017セッションを振り返る(1)、Rails 4.2.10.rc1リリースほか
image_optim: 外部ツールを使い分けて画像を最適化するgem(Ruby Weeklyより)
- リポジトリ: toy/image_optim
ORMを使いこなすには(Hacklinesより)
- 元記事: Winning An ORM
最近読んだ本(主にRuby関連)(Hacklinesより)
- 元記事: I read books
pwned: haveibeenpwned.comのAPIにRubyでアクセス(Awesome Rubyより)
- リポジトリ: philnash/pwned
- サイト: https://haveibeenpwned.com/
# 同リポジトリより
password = Pwned::Password.new("password")
password.pwned?
#=> true
password.pwned_count
#=> 3303003
haveibeenpwned.comは、メアドを入力するとそのパスワードが抜かれているかどうかを調べるサイトのようです。前からあるようですが、自分のメアドを入れるのはちょっと勇気が要りそう。
参考: 自分のメアドが流出していないか確認できるウェブサービス「Have I been pwned?」 | YoutaChannel
GrpcをRubyで理解する(RubyFlowより)
Grpcサーバーとクライアントの動かし方を紹介しています。
# 同記事より
server = GRPC::RpcServer.new
server.add_http2_port("0.0.0.0:50051", :this_port_is_insecure)
server.handle(Handler.new)
server.run_till_terminated
ウィーンで開催のEuRuKo 2018 CFP募集
昨年のウォッチでも取り上げたEuRuKo、2017年度はこんな感じでした。
SQL
あなたの知らないPostgreSQL 10: CREATE STATISTICS
編(Postgres Weeklyより)
Explainのテクニックをいくつか紹介しています。
# 同記事より
EXPLAIN ANALYZE SELECT * FROM tbl where col1 = 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------
Seq Scan on tbl (cost=0.00..169247.80 rows=9584 width=8) (actual time=0.641..622.851 rows=10000 loops=1)
Filter: (col1 = 1)
Rows Removed by Filter: 9990000
Planning time: 0.051 ms
Execution time: 623.185 ms
(5 rows)
つっつきボイス: 「これ翻訳打診してみますね」
PostgreSQLでMeltdown脆弱性をベンチマーク(Postgres Weeklyより)
つっつきボイス: 「retpolineっていうのがパッチの名前なのか」
以下によると、”return”と”trampoline”の造語だそうです。
参考: Retpoline – Google’s fix for Spectre
JavaScript
webpack-server: webpack-dev-serverの後継
- リポジトリ: webpack-contrib/webpack-serve
- リポジトリ: webpack/webpack-dev-server
webpack-dev-serverはメンテナンスモードになったとのことです。
参考: webpack-dev-server の後継らしい webpack-serve について調べた - 備忘録β版
React-vis: React向けビジュアル表示ライブラリ
Uber製です。
dom-to-image: DOMノードから画像を生成(GitHub Trendingより)
- リポジトリ: tsayen/dom-to-image
# 同リポジトリより
var node = document.getElementById('my-node');
domtoimage.toPixelData(node)
.then(function (pixels) {
for (var y = 0; y < node.scrollHeight; ++y) {
for (var x = 0; x < node.scrollWidth; ++x) {
pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);
/* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */
pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);
}
}
});
つっつきボイス: 「サンプルやデモが見当たらないっすね」「画像見たいのにー」
Propel ML: numpy風differentialプログラミングライブラリ(JavaScript Weeklyより)
- サイト: Propel ML
- Notebook: Notebook
- リポジトリ: propelml/propel
import { grad, linspace, plot } from "propel";
f = x => x.tanh();
x = linspace(-4, 4, 200);
plot(x, f(x),
x, grad(f)(x),
x, grad(grad(f))(x),
x, grad(grad(grad(f)))(x),
x, grad(grad(grad(grad(f))))(x))
Notebookでとりあえず動かせます。
CSS/HTML/フロントエンド
コンテナクエリの問題(Frontend Focusより)
「飢えたデザイナー」のための倫理
社内勉強会で触れられていたので。先週のウォッチで扱った「プログラマーの誓い」のデザイナー版みたいな位置づけです。
デザイン世界の「失われた世代」(Frontend Weeklyより)
長くてエモめの記事です。後で読んでみます。
Go言語
gofaas: AWS LambdaのGo向けテンプレート(GitHub Trendingより)
- リポジトリ: nzoschke/gofaas
# 同リポジトリより
$ make deploy
make_bucket: pkgs-572007530218-us-east-1
Uploading to 59d2ea5b6bdf38fcbcf62236f4c26f21 3018471 / 3018471.0 (100.00%)
Waiting for changeset to be created
Waiting for stack create/update to complete
Successfully created/updated stack - gofaas
ApiUrl https://x19vpdk568.execute-api.us-east-1.amazonaws.com/Prod
one-file-pdf:ワンバイナリでPDF一発生成(GitHub Trendingより)
- リポジトリ: balacode/one-file-pdf
ソースも1ファイルです。
Moby Project: Dockerが推進するコンテナシステムフレームワーク(GitHub Trendingより)
- サイト: https://mobyproject.org/
- リポジトリ: moby/moby
Dockerが生んだMobyは、車輪を再発明せずに特殊コンテナシステムを組み立てるためのオープンなフレームワークです。さまざまな標準コンポーネントの「LEGOセット」と、それらをカスタムプラットフォームとして組み立てるフレームワークが提供されます。Mobyの中核にあるのは、「コンポーネント」「ツール」「アセンブリ」を提供する特殊コンテナシステムを組み立てるフレームワークです。
mobyproject.orgより大意
Slack-term: CLIでSlackしたい人に(GitHub Trendingより)
- リポジトリ: erroneousboat/slack-term
とりあえず手元で動かしてみました。
リアクションが文字のままなのと、日本語と絵文字が接すると文字化けしましたが、軽快です。
つっつきボイス: 「社内でVimをSlackクライアントにしてた人いましたね、そういえば」「そういえば!」
その他
Google SpreadsheetをWebサーバーにする
つっつきボイス: 「日本語記事ですが一応」「GETとかPOSTとか扱えるんですね…ゴクっ」
参考: Content Service | Apps Script | Google Developers
codepilot.ai: ローカルやStackoverflowなどのコードを検索するアプリ
とりあえずダウンロードして動かしてみました。あのメソッドどこに書いたっけみたいなときにプロジェクト/言語横断的に検索するのによさそうな雰囲気です。
git-sizer: Gitリポジトリのファイルサイズを簡易アナライズ(GitHub Trendingより)
- リポジトリ: github/git-sizer
サイズに着目して、問題ありそうなファイルを見つけるツールです。
# 同リポジトリより
$ git-sizer --verbose
Processing blobs: 1652370
Processing trees: 3396199
Processing commits: 722647
Matching commits to trees: 722647
Processing annotated tags: 534
Processing references: 539
| Name | Value | Level of concern |
| ---------------------------- | --------- | ------------------------------ |
| Overall repository size | | |
| * Commits | | |
| * Count | 723 k | * |
| * Total size | 525 MiB | ** |
| * Trees | | |
| * Count | 3.40 M | ** |
| * Total size | 9.00 GiB | **** |
| * Total tree entries | 264 M | ***** |
| * Blobs | | |
| * Count | 1.65 M | * |
| * Total size | 55.8 GiB | ***** |
Xray: Rustで書かれたElectronベースの実験的テキストエディタ(GitHub Trendingより)
- リポジトリ: atom/xray
内部で文字列をcopy-on-writeしているというのが気になったので。CRDTは「Conflict-Free Replicated Data Types」のことだそうです。
参考: rgasplit-group2016-11.pdf(CRDTの論文)
いいプルリクの書き方(Hacklinesより)
- 読む側に考えさせない
- 相手の立場に立てることが開発者として最強
- 出発点と道筋を示す
- どこが問題かをはっきり示す
- 必要な情報(コンテキスト)をちゃんと添える
- スクショや図を添える
- etc.
番外
SATySFiはLaTexを超えるか
SATySFi を使ってみた – https://t.co/6DaiLovxN0
数学専攻計算機系の合宿で SATySFi を使ってみた話をしました
— スマートコン (@mr_konn) March 5, 2018
- リポジトリ: gfngfn/SATySFi
TextPathView: 筆順をアニメーション表示(GitHub Trendingより)
- リポジトリ: totond/TextPathView
筆順というより輪郭ですが。
ちなみに日本と中国で漢字の筆順は結構違ってるそうです。
参考: いわゆる「正しい筆順」の幻想
今週は以上です。
バックナンバー(2018年度)
週刊Railsウォッチ(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など)です。