- 開発
週刊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月に固めたい意向のようです。以下のドラフトが目につきました。黄色が目にまぶしいです。
- 8,518文字(56の絵文字含む)が追加され、計136,690文字になる
- Unicodeのcollationアルゴリズム
- Unicodeセキュリティメカニズム
- Unicode IDNA互換性プロセス
セキュリティメカニズムではUnicode spoofingの防止策が提案されています。国際化ドメイン名(IDN)を悪用した攻撃などが想定されているようです(参考: 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)のトップに掲載されていたと思ったのですが、微妙に違う位置に移動しています。
- 記事: Google Summer of Code 2017
- 公式サイト: Google Summer of Code
- 学生向けマニュアル: GSoCStudentGuide
大学生・院生など(18歳以上)を対象に、夏休みの自由研究ならぬオープンソースプロジェクトへの貢献を推進する企画だそうです。詳しく読んでませんが、賞金も出るようです。学生の参加資格には「米国との通商が禁じられている国に居住してないこと」とあるので、日本在住の日本人大学生でも参加できます。
これやってくれたらうれしいリストの中に「ActionViewテンプレートのeager loading化」というのがあります。言われてみればRailsのビューテンプレートはlazyなんですね。
RailsGirls企画もあります( ^ω^)ワクワク
⭐Ctop: topコマンド風にDockerコンテナを監視⭐
- 公式: https://bcicen.github.io/ctop/
- リポジトリ: bcicen/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より)
- ニュースソース: Chain RSpec Matchers for Improved Test Readability
- 元記事: Chain RSpec Matchers for Improved Test Readability
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より)
- ニュースソース: Monica Clay: Eight most essential qualities of Ruby on Rails Developer
- 元記事: Top 8 Most Essential Qualities of Ruby On Rails Developer
「またか」と思いつつ「今度こそいいこと書いてあるかも」とつい開いてしまいがちなPV集め系記事ですね(開いてしまいました)。以下の8つがリストアップされています。
- 開発への情熱
- フロントエンドの開発スキル
- コードの品質の高さ
- 自分でスキルを高められる
- 地のプログラミング能力の高さ
- データベース技術の知識
- コミュニケーション能力
- ベストプラクティスに沿って開発できる
記事末尾では以下のリンクも紹介されています。Quoraの方には「事前に手を打てる戦略性の高さ」というのもあり、私の年だと真田さんや岸和田博士の得意のセリフ「こんなこともあろうかと」を連想してしまいました。失礼しました。
参考
Unibits gem: CLIで使う文字コードバリデータ(RubyFlowより)
- リポジトリ: janlelis/unibits
GitHub Trendingでも上昇中の、Unicode系文字コードをCLIやRubyコード内でバリデーションするツールです。コードが壊れていると赤く表示されます。
表示が美しくてうれしくなります。Shift_JIS? EUC? 知らない子ですね。
作者のjanlelis氏は他にもUnicode関連のgemを大量にこしらえています。ここまで多いと恐怖すら感じますが、文字コード厨のわたくしは思わずフォローしてしまいました。
ところでエラーの赤以外のカラーリングの根拠がよくわからなかったので掘ってみると、unicolors gemなるものを使っています。しかしこのgemがネットのどこにも見当たりません。作者のローカルgemサーバーにいるのか、公開準備中なのかもしれません。
Rubyで強力なCLIツールを作る(RubyWeeklyより)
- ニュースソース: RubyWeekly #338
- 元記事: Creating Powerful Command Line Tools in Ruby
記事後半の「プラットフォーム間互換性をどうにかする」あたりが個人的に興味ありました。
Ruby標準のRbConfigモジュールを使って動作環境を取得できます。でも結局場合分けが必要なんですね。
RbConfig::CONFIG['target_os'] #=> "darwin16"(MacOSの場合)
コンソールのクリアコマンドがLinux/Macだとclear
なのがWindowsだとcls
なので、エスケープシーケンスを直接吐いて強引にクリアを実行するなど、マルチプラットフォームにしようとすると主にファイルパス周りで涙ぐましい努力が必要になってしまいますね。誰を恨めばいいのでございましょうか。誰を誰を誰を誰を
RubyのオブジェクトをHashキーにする(RubyWeeklyより)
- ニュースソース: RubyWeekly #338
- 元記事: Objects as Ruby Hash Keys
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を動かすところを手っ取り早く見たい方にはよいと思います。
Ruby+OMRによるJITコンパイラの今後(RubyWeeklyより)
- ニュースソース: RubyWeekly #338
- 元記事: Ruby+OMR JIT Compiler: What’s next?
IBMのブログ記事です。OMRって何だろうと思ったら、Eclipseで任意の言語向けの実行環境を構築するための仮想マシンツールキットだそうです。なおOMRは略語ではなく単なるプロジェクト名だそうです(参考)。
公開されたrubyomr-preview/rubyの☆はまだそれほどありませんが、Forkは3000件を超えています。Forkが多すぎてクリックしても表示できませんでした(´・ω・`)。
JITコンパイラの成果はRuby 3X3に反映されると見込まれます。IBMがRuby 3x3を強力に支援していることがよくわかりました。
Railsチュートリアル英語版が怒涛のシリーズ化
- サイト: learningenough.com
Railsチュートリアルの原著者としておなじみのMichael Heartl氏が、いつの間にかシェル/HTML/CSS/JavaScriptなどをカバーする入門書籍を大量生産しています。CSSやJavaScriptはまだ執筆中ですが、Railsチュートリアル同様ネットでは無料で全文公開されています。
- コマンドライン
- テキストエディタ
- Git
- HTML
- CSS(執筆中)
- JavaScript(執筆中)
- Railsチュートリアル
- Action Cable
従来のRailsチュートリアルで「HTMLはこれ読め」「シェルはこれ読め」で泣く泣く済ませていた部分を全部自分でカバーしようとしているようです。ノリノリですね。
中でもAction Cableはよさそうです。
Grimore.js: 日本発のWebGLフレームワーク
- 公式サイト: https://grimoire.gl/
- リポジトリ: 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/linguist
↑GitHubリポジトリでプログラミング言語を自動判定するのに使われているそうです。皆さまのフィードバックをお待ちしています。
こんな使い方はいかが
これまたkazzさんから「受け取ったソースコードにどんな言語が使われているのかをさくっとチェックするのにいいかも」というアイデアが飛び出しました。
Linguist gemはgem install github-linguist
でインストールできますが、CMakeがないとビルドに失敗します(参考: MacOSXでcmakeのコマンドライン版を使えるようにする)。
linguist --breakdown
で無事チェックできました(∩´∀`)∩ワーイ。
OSPTF: オープンソースのペネトレーションテストフレームワーク
ついさっき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より)
- 元記事: Lithium-Ion Battery Inventor Introduces New Technology for Fast-Charging, Noncombustible Batteries
発明者のJohn Goodenough氏は御年94歳です。
ところで一部業界では「ガラスは液体」派と「ガラスは固体」派が長らく争っているそうですが、最近はガラス固体説がやや有利なようです。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
- 週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか
- 週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか
- 週刊Railsウォッチ(20161209)Active Supportの非推奨メソッド廃止、RailsのjQueryへの依存を廃止ほか
- 週刊Railsウォッチ(20161125)Railsのデータベース・ベストプラクティス、SQLインジェクション解説ほか
- 週刊Railsウォッチ(20161117)DockerホスティングのHyper.sh、accepts_nested_attributes_for殺すほか
- 週刊Railsウォッチ(20161109)bundler audit gemは超おすすめ、CIAのFactbook gemほか
- 週刊Railsウォッチ(20161102)HTML 5.1正式勧告、CSS中央揃えに便利なサイトほか
- 週刊Railsウォッチ(20161027)LinuxカーネルのDirty COW脆弱性、DeviseはWikiを読めほか
- 週刊Railsウォッチ(20161019)ObjectSpaceモジュール活用法、Capybara統合、コミッターを撮影するソフト
- 週刊Railsウォッチ(20161012)RubyのHashの詳細、RethinkDBの会社が終業ほか
- 週刊Railsウォッチ(20161005)Mac OS SierraとRubyの問題、Learning Gitほか
- 週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか
- 週刊Railsウォッチ(20160921)クールなHTMLエディタ「Mozilla Thimble」他
- 週刊Railsウォッチ(20160913)MySQLの脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。