週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか

こんにちは、hachi8833です。先週のAWSに続いておととい3/8に東日本のAzureもコケたようです(参考: Qiita記事)が、全然使ってないので様子がわかりません。ざっくり検索した限りでは一般の反応が非常に少ないのが不思議です。

同じ頃に発生した「マルタ名所「アズール・ウィンドウ」が崩壊 強風と高波で」は全然関係ないニュースですが、思わずタイトルに釣られそうになりました。

季節の変わり目なので皆さまも体調と脳のコンディションにはお気をつけください。それでは今週もいってみましょう。

臨時ニュース: Unicode 10.0.0ドラフトが発表

Unicode Consortiumの皆さまお疲れさまです。まだまだTBDだらけですが、今年の6月に固めたい意向のようです。以下のドラフトが目につきました。黄色が目にまぶしいです。

セキュリティメカニズムではUnicode spoofingの防止策が提案されています。国際化ドメイン名(IDN)を悪用した攻撃などが想定されているようです(参考: Wikipedia_en: IDN homograph attack)。


Wikipedia_en: IDN homograph attackより

homographは本来「同形異義語(弓のbowとお辞儀のbowなど)」を意味しますが、ここでは違う言語のそっくりな文字に差し替えることなどを指しています。上の画像ではeとaがこっそりキリル文字に差し替えられています。単純ですがドメイン名をなまじ目視チェックするとひっかかってしまいそうです。

10.0の文字データベースはUNICODE CHARACTER DATABASE(Annex #44)に掲載される予定です(まだないっぽい)。

調べているうちに、絵文字の提案フォームを見つけました。どなたか勇者はいませんか。

GoogleのSummer of Code 2017にRuby on Railsが正式参加を認められた(Rails公式より)

当初Rails公式ニュース(/news)のトップに掲載されていたと思ったのですが、微妙に違う位置に移動しています。


https://summerofcode.withgoogle.com/より

大学生・院生など(18歳以上)を対象に、夏休みの自由研究ならぬオープンソースプロジェクトへの貢献を推進する企画だそうです。詳しく読んでませんが、賞金も出るようです。学生の参加資格には「米国との通商が禁じられている国に居住してないこと」とあるので、日本在住の日本人大学生でも参加できます。

これやってくれたらうれしいリストの中に「ActionViewテンプレートのeager loading化」というのがあります。言われてみればRailsのビューテンプレートはlazyなんですね。

RailsGirls企画もあります( ^ω^)ワクワク

⭐Ctop: topコマンド風にDockerコンテナを監視⭐


https://bcicen.github.io/ctop/より

一昨日にmorimorihogeさんが発見して社内Slackに流してくれました。実用はもちろん、この美しさだけで既に勝利してますね。

昨日夜の時点では公開後10日で☆80個でしたが、今見たら☆1,100個超えていました。

私どもからも久しぶりの⭐を進呈いたします。おめでとうございます。

機能追加: ルーティングのカスタムURLヘルパーとポリモーフィックマッピング(Rails公式より)

先週のTechRacho記事「5.1 beta1リリースノートに見るRails 5.1の姿」で既に#23138をご紹介していました。Railsの新機能関連IssueはTechRachoでだいぶ先回りしてしまったので今週は少なめです。

機能改善: Railsアプリの秘密情報を使ってより強力なAES-128-GCM暗号化アルゴリズムを利用できるようにする(Rails公式より)

これも「5.1 beta1リリースノートに見るRails 5.1の姿」でご紹介した#23038: Add encrypted secretsに関連しています。

改修はシンプルで、暗号化方式の変更のついでに従来OpenSSL::Cipher.new("aes-256-cbc")とリテラルで書いていたのをCIPHER = "aes-128-gcm"と定数化しています。

#pack("H*")

一同で上のコードをつっついていて、ふと#pack(“H*”)って何じゃらほいという話題になりました。

def key
  [(ENV["RAILS_MASTER_KEY"] || read_key_file || handle_missing_key)]
  .pack("H*")
end

当初私は単なるzip/unzipみたいなものかなと想像していたのですが、どうやらさまざまなバイナリ的変換を行うメソッドのようです。Rubyリファレンスマニュアル: Array#packをこわごわ開いてみるとunsignedだのビッグエンディアンだのと生々しい記述だらけです。Hはhexadecimalだったんですね。

Webチームのkazzさんが「これはC言語由来だったはず」と教えてくれました。どうにかC言語のコードらしきものを見つけてみると#pragmaが使われていて、リファレンスにあるとおりシステム環境に依存することを実感できました。速そうですがあまり直接触りたくない感じです。

packはRubyのみならずPerl/PHP/Pythonなどでも広く変換に使われているようです。

RSpecマッチャをチェインしてテストコードを読みやすくする(OpenRubyより)

RSpecのマッチャを書くときの参考になります。短いのですぐ読めます。

# https://robots.thoughtbot.com/chain-rspec-matchers-for-improved-test-readability より
expect(page).to have_css("dd ul li", count: 2)
expect(page).to have_css("dd ul li", text: "I read the New York Times every day")
expect(page).to have_css("dd ul li", text: "I read the Washington Post every day")

マッチャを自作して、元のテストコード(上)を下のように書けるようにしたそうです。

# https://robots.thoughtbot.com/chain-rspec-matchers-for-improved-test-readability より
expect(page).to have_multiple_choice_responses(
  "I read the New York Times every day",
  "I read the Washington Post every day"
)

「こういうテストを大量に書かないといけないんでなければ、別に元のまんまでもいいじゃないかなーw」という声もありました。

Rails開発者に求められる8つの資質(OpenRubyより)

「またか」と思いつつ「今度こそいいこと書いてあるかも」とつい開いてしまいがちなPV集め系記事ですね(開いてしまいました)。以下の8つがリストアップされています。

  1. 開発への情熱
  2. フロントエンドの開発スキル
  3. コードの品質の高さ
  4. 自分でスキルを高められる
  5. 地のプログラミング能力の高さ
  6. データベース技術の知識
  7. コミュニケーション能力
  8. ベストプラクティスに沿って開発できる

記事末尾では以下のリンクも紹介されています。Quoraの方には「事前に手を打てる戦略性の高さ」というのもあり、私の年だと真田さん岸和田博士の得意のセリフ「こんなこともあろうかと」を連想してしまいました。失礼しました。

参考

Unibits gem: CLIで使う文字コードバリデータ(RubyFlowより)

GitHub Trendingでも上昇中の、Unicode系文字コードをCLIやRubyコード内でバリデーションするツールです。コードが壊れていると赤く表示されます。

表示が美しくてうれしくなります。Shift_JIS? EUC? 知らない子ですね。

作者のjanlelis氏は他にもUnicode関連のgemを大量にこしらえています。ここまで多いと恐怖すら感じますが、文字コード厨のわたくしは思わずフォローしてしまいました。

ところでエラーの赤以外のカラーリングの根拠がよくわからなかったので掘ってみると、unicolors gemなるものを使っています。しかしこのgemがネットのどこにも見当たりません。作者のローカルgemサーバーにいるのか、公開準備中なのかもしれません。

Rubyで強力なCLIツールを作る(RubyWeeklyより)

記事後半の「プラットフォーム間互換性をどうにかする」あたりが個人的に興味ありました。

Ruby標準のRbConfigモジュールを使って動作環境を取得できます。でも結局場合分けが必要なんですね。

RbConfig::CONFIG['target_os'] #=> "darwin16"(MacOSの場合)

コンソールのクリアコマンドがLinux/MacだとclearなのがWindowsだとclsなので、エスケープシーケンスを直接吐いて強引にクリアを実行するなど、マルチプラットフォームにしようとすると主にファイルパス周りで涙ぐましい努力が必要になってしまいますね。誰を恨めばいいのでございましょうか。誰を誰を誰を誰を

RubyのオブジェクトをHashキーにする(RubyWeeklyより)

Rubyで書かれた任天堂NES(≒ファミコン)エミュレータoptcarrotのコードで著者が見つけた問題点とその解決法を紹介しています。任意のRubyオブジェクトをHashキーにするテクニックです。

ポイントはHashでメモ化(memoization)を使ってMethodオブジェクトが無駄に複製されるのを防ぐことです。Rubyではこういったメモ化を||=で実に簡単に行えるのがいいよね、と盛り上がりました。ifで律儀に3行も使って書かなくてもよいので。

Rubyのメモ化の合言葉は「たてたてイコール」です。はいみなさんもご一緒に。

ところでoptcarrot、READMEがないお(´・ω・`)。

[動画] 12分で理解できるRails 5.1の変更点と新機能(RubyWeeklyより)

動画ですがコードも表示されています。内容的には「5.1 beta1リリースノートに見るRails 5.1の姿」で足りますが、WebPackを動かすところを手っ取り早く見たい方にはよいと思います。


#69 Ruby on Rails 5.1.0 Changes and New Featuresより

Ruby+OMRによるJITコンパイラの今後(RubyWeeklyより)

IBMのブログ記事です。OMRって何だろうと思ったら、Eclipseで任意の言語向けの実行環境を構築するための仮想マシンツールキットだそうです。なおOMRは略語ではなく単なるプロジェクト名だそうです(参考)。

公開されたrubyomr-preview/rubyの☆はまだそれほどありませんが、Forkは3000件を超えています。Forkが多すぎてクリックしても表示できませんでした(´・ω・`)。

JITコンパイラの成果はRuby 3X3に反映されると見込まれます。IBMがRuby 3×3を強力に支援していることがよくわかりました。

Railsチュートリアル英語版が怒涛のシリーズ化

Railsチュートリアルの原著者としておなじみのMichael Heartl氏が、いつの間にかシェル/HTML/CSS/JavaScriptなどをカバーする入門書籍を大量生産しています。CSSやJavaScriptはまだ執筆中ですが、Railsチュートリアル同様ネットでは無料で全文公開されています。

従来のRailsチュートリアルで「HTMLはこれ読め」「シェルはこれ読め」で泣く泣く済ませていた部分を全部自分でカバーしようとしているようです。ノリノリですね。

中でもAction Cableはよさそうです。


https://www.learnenough.com/action-cable-tutorialより

Grimore.js: 日本発のWebGLフレームワーク


https://github.com/GrimoireGL/GrimoireJSより

見出しのとおり、日本で開発されたJavaScriptのWebGLフレームワークなのでドキュメントもチュートリアルも全部日本語で読めます。こんな風に書くだけでグリグリモアモアと動き出します

<!-- https://grimoire.gl/example/example-008.html より-->
<goml width="fit" height="fit">
  <renderer camera=".camera" viewport="0,0,100%,100%">
    <render-scene/>
  </renderer>
  <scene>
    <camera class="camera" near="0.01" far="40.0" aspect="1.0" fovy="45d" position="0,12,17" rotation="-35,0,0" >
      <camera.components>
        <StareAt center="0,0,0" speed="0.007" zoom="5" zoomPhase="1.4"/>
      </camera.components>
    </camera>
  </scene>
</goml>

Rubyで学ぶSOLID設計

SOLIDについてはTechRacho記事「Rubyスタイルガイドを読む: クラスとモジュール(2)クラス設計・アクセサ・ダックタイピングなど」でも紹介しましたが、こちらにも再録しました。

そこそこ長いですが大半はコードなので、時間ができたときにどうぞ。

重要でない文字列をPostgreSQLのJSONB型を使ってデータベースに保存する

文中の「Just wing it」は英語圏の流行語です。

Tシャツのサイズ「”S,M,L,XL”」のような表示にしか使わない付加的な情報のために、わざわざモデルを作って多対多でリレーションして、みたいなことは避けたいと思うのが人情です。

カンマ区切りの文字列をカラムに保存しておいて#splitで切り分けて使うのがよくある回避方法ですが、PostgreSQLのJSONB型を使えば["S", "M", "L", "XL"]といったArrayをまるっと保存できるので#split要らずで便利だよ、という記事です。

なお同記事のコメントに「この場合JSONBいらなくね? PostgreSQLならarray: trueだけでできるお↓」とツッコミが入っていました。

# http://jeromedalbert.com/jsonb-plus-rails-to-store-glorified-strings-in-your-db/ より
class AddSizesToProducts < ActiveRecord::Migration
  def change
    add_column :products, :sizes, :text, array: true, default: []
  end
end

念のためStackoverflowを見るとPostgresのArray型は一応インデックス化できるようですが、そういう使い方はあまりよくない気がします。

これまたStackoverflowによると、MySQLにはArray型はないそうです。MySQLのタスクリストを見ると2007年以来アサインすらされていません(´・ω・`)。

Linguist gem: プログラミング言語の種類を自動判定(GitHub Trendingより)

↑GitHubリポジトリでプログラミング言語を自動判定するのに使われているそうです。皆さまのフィードバックをお待ちしています。

こんな使い方はいかが

これまたkazzさんから「受け取ったソースコードにどんな言語が使われているのかをさくっとチェックするのにいいかも」というアイデアが飛び出しました。

Linguist gemはgem install github-linguistでインストールできますが、CMakeがないとビルドに失敗します(参考: MacOSXでcmakeのコマンドライン版を使えるようにする)。

linguist --breakdownで無事チェックできました(∩´∀`)∩ワーイ。

OSPTF: オープンソースのペネトレーションテストフレームワーク


https://howucan.grより

ついさっきTwitterで見つけました。そのまんまの名前です。

ペネトレーションテストはサーバーのセキュリティチェックで使われますが、オープンソースなのがありがたいですね。

なおpenetration testはもともと防弾チョッキの性能を試すための銃撃テストを指します。

人気の割にビジネス利用が進まないGo言語

Go言語ファン3,595人を対象にしたアンケート調査によると、「Go言語を他の人にも勧めたい」「仕事でもプライベートでも使ってる」というラブラブな回答は非常に多かったにもかかわらず、「Goは会社の成功には欠かせない」と考えている人は皆無だったそうです。Go言語の使いみちもほとんどが「CLI」「HTTPサーバ」「マイクロサービス」でした。

私自身も、Go言語は主役ではなく、懐刀や頼りになる参謀という位置づけがふさわしい気がします。速度の必要なバッチ処理や単機能のマイクロサービス、マルチプラットフォームのシェルスクリプト的に使うのがいいのかも。なにしろクラスがないので。

Go言語でRuby gemのネイティブエクステンションを書く試みがいくつかあるのでそっち方面に期待したいのですが、cgoやMakefileを使わずにgemらしくきれいに書く方法はまだなさそうです。

Peardrop: LSI設計ツール

英国のスタートアップ企業です。最近めっきり見かけなくなった「何も足さない・何も引かない」Webページですね。漢(おとこ)らしいと思います。

と思ったらPeardropは2015年に解散してました

リチウムイオン電池の発明者が今度は電解液をガラスに替えて不燃性の高速充電バッテリーを考案(HackerNewsより)

発明者のJohn Goodenough氏は御年94歳です。

ところで一部業界では「ガラスは液体」派と「ガラスは固体」派が長らく争っているそうですが、最近はガラス固体説がやや有利なようです。

今週は以上です。

関連記事

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

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

Rails公式ニュース

Ruby Weekly

OpenRuby

RubyFlow

160928_1638_XvIP4h

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ