週刊Railsウォッチ(20180309)RubyGems.orgのTLS 1.0/1.1接続非推奨、2年に1度のRailsアンケート、DockerのMoby Project、Ruby拡張をRustで書けるruruほか

こんにちは、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_nameString#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?

あるクラスのbelongs_tohas_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


同リポジトリより

# 同リポジトリより
I18n.locale = :en
post.title # => Globalize rocks!

I18n.locale = :he
post.title # => גלובאלייז2 שולט!

つっつきボイス: 「これ某案件のGemfileに入ってる…」「Readmeにはi18nのデファクトって書いてありますね」

これまでウォッチに登場した他のi18n関連gemをとりあえずリストアップしてみました。

PodCast: React on RailsとWebpackerの話(Hacklinesより)

★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のシャーディング記事↓を翻訳したのを思い出しました」

ハンズオン: 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に書けって誘ってる気がする」

Rails: テスティングアンチパターン –後編(翻訳)

rack-reducer: Rackアプリで使えるURL書き換えgem(RubyFlowより)

# 同リポジトリより
# 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より)


同リポジトリより


つっつきボイス: 「Chromeのコンソールで見られるのはちょっと便利そうっすね: ところでこれはScoutのサービスから取ってきてるみたいだけど有料?」「リポジトリにはScoutのアカウントは不要って書いてるから大丈夫なのかな?」


github.com/scoutappより

faster_path gemが0.3.1になってさらに高速化(RubyFlowより)

昨年のウォッチで取り上げた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より)


同リポジトリより

# 同リポジトリより
#[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の使われ方などについてのアンケートです。


2016年度アンケートより


つっつきボイス: 「アンケート長いんで今は回答しなかったんですが、過去の回答が結構面白いかも」「おー、例外トラッキングツールはAirBrakeがトップ、とか↑」「GitHubの★とかとまた違った角度でいいかも」


planetargon.comより

その他Rails小物記事

Ruby trunkより

提案: ハッシュの値を省略できるようにしたい(継続)

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: 「マジック」と呼ぶのをやめよう(翻訳)

Ruby

RubyGems.orgがTLS 1.0/1.1を非推奨に(Ruby Weeklyより)


rubygems.orgより

OpenSSL versions 1.0.0t以下にリンクされたRubyや、JVM 6以下にリンクされたJRubyからRubyGems.orgに接続できなくなるそうです。

GitentialでGitHubリポジトリの昨年のRuby開発をビジュアル表示してみた(Awesome Rubyより)


同サイトより


同サイトより


つっつきボイス: 「見せ方が結構きれいだなと思って」「各コミッターの活動状況がわかるし」「オープンソースリポジトリのチェックによさそう」

ruby-advisory-db: bundler-auditとrubysec.comの脆弱性情報データベース

この間のウォッチで扱った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より)

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

ORMを使いこなすには(Hacklinesより)

最近読んだ本(主にRuby関連)(Hacklinesより)

pwned: haveibeenpwned.comのAPIにRubyでアクセス(Awesome Rubyより)


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-dev-serverはメンテナンスモードになったとのことです。

参考: webpack-dev-server の後継らしい webpack-serve について調べた - 備忘録β版

React-vis: React向けビジュアル表示ライブラリ


同リポジトリより

Uber製です。

dom-to-image: DOMノードから画像を生成(GitHub Trendingより)

# 同リポジトリより
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より)

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


propelml.orgより

Notebookでとりあえず動かせます。

CSS/HTML/フロントエンド

コンテナクエリの問題(Frontend Focusより)

「飢えたデザイナー」のための倫理

社内勉強会で触れられていたので。先週のウォッチで扱った「プログラマーの誓い」のデザイナー版みたいな位置づけです。

デザイン世界の「失われた世代」(Frontend Weeklyより)

長くてエモめの記事です。後で読んでみます。

Go言語

gofaas: AWS LambdaのGo向けテンプレート(GitHub Trendingより)

# 同リポジトリより
$ 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より)

ソースも1ファイルです。

Moby Project: Dockerが推進するコンテナシステムフレームワーク(GitHub Trendingより)


同リポジトリより

Dockerが生んだMobyは、車輪を再発明せずに特殊コンテナシステムを組み立てるためのオープンなフレームワークです。さまざまな標準コンポーネントの「LEGOセット」と、それらをカスタムプラットフォームとして組み立てるフレームワークが提供されます。Mobyの中核にあるのは、「コンポーネント」「ツール」「アセンブリ」を提供する特殊コンテナシステムを組み立てるフレームワークです。
mobyproject.orgより大意

Slack-term: CLIでSlackしたい人に(GitHub Trendingより)


同リポジトリより

とりあえず手元で動かしてみました。
リアクションが文字のままなのと、日本語と絵文字が接すると文字化けしましたが、軽快です。


つっつきボイス: 「社内でVimをSlackクライアントにしてた人いましたね、そういえば」「そういえば!」

その他

Google SpreadsheetをWebサーバーにする


つっつきボイス: 「日本語記事ですが一応」「GETとかPOSTとか扱えるんですね…ゴクっ」

参考: Content Service  |  Apps Script  |  Google Developers

codepilot.ai: ローカルやStackoverflowなどのコードを検索するアプリ


同サイトより


とりあえずダウンロードして動かしてみました。あのメソッドどこに書いたっけみたいなときにプロジェクト/言語横断的に検索するのによさそうな雰囲気です。

git-sizer: Gitリポジトリのファイルサイズを簡易アナライズ(GitHub Trendingより)

サイズに着目して、問題ありそうなファイルを見つけるツールです。

# 同リポジトリより
$ 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より)

内部で文字列をcopy-on-writeしているというのが気になったので。CRDTは「Conflict-Free Replicated Data Types」のことだそうです。


同リポジトリより

参考: rgasplit-group2016-11.pdf(CRDTの論文)

いいプルリクの書き方(Hacklinesより)


  • 読む側に考えさせない
  • 相手の立場に立てることが開発者として最強
  • 出発点と道筋を示す
  • どこが問題かをはっきり示す
  • 必要な情報(コンテキスト)をちゃんと添える
  • スクショや図を添える
  • etc.

番外

SATySFiはLaTexを超えるか

TextPathView: 筆順をアニメーション表示(GitHub Trendingより)

筆順というより輪郭ですが。
ちなみに日本と中国で漢字の筆順は結構違ってるそうです。

参考: いわゆる「正しい筆順」の幻想


今週は以上です。

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

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

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

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

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

Awesome Ruby

Random Ruby

Ruby on Rails Security Project

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

Frontend Weekly

frontendweekly_banner_captured

Frontend Focus

frontendfocus_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured

Github Trending

160928_1701_Q9dJIU

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ