週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか

こんにちは、hachi8833です。今年もあとわずか、Railsウォッチ今週もいってみましょう。BPSアドベントカレンダー2016ラストを兼ねました。

今回より、記事の構成をニュースソース単位からトピック単位に変更しました。

Ruby 2.4で予定されていたFloat#roundの動作変更を取り消し

お喜びください。先週のRailsウォッチでお伝えしたFloat#roundのデフォルト動作変更は取り消されました。Railsウォッチつっつき会でも安堵の声が続々あがっておりました。今日の時点で11日前なのでお知らせがワンテンポ遅れてしまいました。

#16では、今回の動作変更はあんまりだ、なんでわざわざ他の言語と違う動作にするんだと不満たらたらです。

#16

しめくくりはmatzの一声でした。

matz finalization

Rais 5.0.1リリース

なぜか公式よりも先にニュースが出てます。詳しくはリリースノートを。

早速5.0.1でrails newしてみました。

rails5.0.1

Ruby 2.4.0-rc1リリース

ご紹介が少々遅れましたが、2.4.0-rc1がリリースされました。いくつかの新機能はRailsウォッチで既にご紹介しているので、未紹介のものだけ。

Array#maxArray#minの導入

a = [*1..10000]; 100000.times { a.max }

上のコードは、Array#maxArray#minでは#eachを呼ばないのでEnumerable#maxと比べて10倍以上速くなるとのことです。

パッチなし
22.424s
Array#maxを定義した場合
1.740s

Array#maxが定義されれば、opt_newarray_maxのようなメソッドを作って最適化することでさらに高速化が期待できます。

x, y = 1, 2; 10000000.times { [x, y].max }
パッチなし
2.799s
Array#maxを定義した場合
1.224s
opt_newarray_max
0.555s

Regexp#match?の改良

Ruby 2.3.1で導入されたRegexp#match?の結果を$~に反映しないようになりました。

その他にも2.3.1以降で行われた以下のような変更も含まれます。

  • OpenSSL 1.1.0のサポート(0.9.7未満はサポート終了)
  • ext/tkをstdlibから削除: #8539
  • XMLRPCをstdlibから削除: #12160

Railsのセキュリティ関連の話題10選

2013年の記事の更新版だそうです。英語圏はこの手の記事がやたら多いですね。

  • マスアサインメント(Mass assignment)
  • XSS攻撃(XSS attacks)
  • 任意のコード実行(Executing arbitrary code)
  • SQLインジェクション(SQL injections)
  • フォームハイジャック(Form hijacking)
  • 機密データをログに吐く(Logging private data)
  • プライベートトークンの露出(Revealing private tokens)
  • IFrameを使った邪悪なサイトの埋め込み(Embedding a site via IFrame)
  • 実行ファイルのアップロード(Uploading executable files)
  • Brakemanでの問題検出(Using Brakeman to detect possible problems)

Brakemanは言わずと知れたRailsのセキュリティ問題検出用gemですね。brakemanscanner.orgにはBrakemanの更新情報のほか、主要なセキュリティ情報も掲載されているので便利です。

有料のBrakeman Proも使ってみたいものです。

つっつきながら、プライベートトークンに関して「昨今は秘密鍵のようなクリティカルな情報はファイルに保存せず、起動オプションや環境変数で与えるのが基本」という話にもなりました。

WindowsでRubyコードを動かすには

そんなに難しくないと言ってます。morimorihogeさんは「今ならBash on Ubuntu on Windowsでいいんじゃないの?」と。

私の思い出ですが、Rubyでツールを作った後、社内ユーザーなどに配布するときに意外と困るのがRubyそのもののインストールだったりしました。デフォルトでインストールされていない環境はエンドユーザーに嫌がられやすいので。

ActiveRecord::UpdatedAtでデータを常に同期するには

active_record-updated_at gemをインストールすると、デフォルトではtouchしない以下のメソッドがupdated_atをtouchするようになるそうです。

  • ActiveRecord::Base#update_column
  • ActiveRecord::Base#update_columns
  • ActiveRecord::Relation#update_all

ちなみに以下はmorimorihogeさんおすすめの記事です。

エディタで1行ずつコードをevalできるseeing_is_believing gem

ファイル中のRubyコードを1行ずつ評価して結果を記録できるgemです。ちょっと手元が狂ったらフリーズしそうだとの声も。Seeing is believingは「百聞は一見にしかず」と学校で習ったような覚えがあります


Seeing Is Believing: Displays Results of Each Code Lineより

。このコードをつっついているときにmorimorihogeさんがこんなのを掘り当てました↓

frog

Ruby 2.4の新メソッド: Comparable#clamp

引数を2つ与えると、範囲から外れた場合にレシーバーに近い方に寄せた値を返します。数値でも文字列でも同じように扱えるのがポイントです。ちょっと賢い四捨五入的なメソッドですが、果たしてどんな使い道があるでしょうか。

10.clamp(15, 20)
=> 15

"e".clamp("f", "s")
=> "f"

clampはあっちの方ではなく、ここでは「留め金をかける」みたいな意味ですね。日本語でどう表すかですが、ここでは「寄せる」がしっくりくる気がします。

Railsのschema cacheとは何か

ロシア発。Railsのschema cacheについての解説です。短いのでがんばらなくても読めます。

ポイント:

  • スキーマ関連のデータ(テーブル、カラム、型)をシリアライズしてファイルに保存する
  • そのファイルをアプリケーション・サーバー全体に分散する
  • データをそのファイルから読み出すことでデータベース・アクセスを避ける

Ruby 2.4でFixNumとBigNumにも#infinite?と#finite?を追加

# 2.3: Float と BigDecimalのみfinite?/infinite?を実装
5.infinite?
#=> NoMethodError: undefined method `infinite?' for 5:Fixnum

# 2.4: FixNumとBigNumにもfinite?/infinite?を実装
5.infinite?
=> nil
5.finite?
=> true

これで動作が一貫しましたね。

参考

Rubyでコマンドラインプログラム: tty-prompt gem

コマンドラインで対話するプログラムをRubyでさっと作れるようです。Linux環境などのdialogコマンド的に使えるのかなと思いました。

require 'tty-prompt'
prompt = TTY::Prompt.new

prompt.ask('あなたのお名前なんてえの?', default: ENV['USER'])
# => あなたのお名前なんてえの? (piotr)

prompt.yes?('Rubyはお好きで?')
# => Rubyはお好きで?? (Y/n)

prompt.mask("ア・ナ・タ・の・ひ・み・つ・は?")
# => ア・ナ・タ・の・ひ・み・つ・は? ••••

scaffold picoで、変わり映えのしないscaffoldとおさらば


github.com/gudata/scaffold_picoより

Railsのscaffoldの改良版です。Material Designが使えるところにちょっと惹かれました。

ちなみにRailsのscaffold部分のコードはやばいくらい入り組んでいるそうです。

マーク・ザッカーバーグ自らAIをこしらえる

IronmanのJarvisみたいなのが欲しかったんだと。

太陽光発電は本当にイケるのか

「太陽光発電は今や風力発電並にコストが下がった」「石炭の半額」「太陽光発電は今や石油よりも投資対効果が大きい」などと景気のよさそうな話ですが、石油業界が慌てふためいているようにも見えません。

GCC-Explorer: GodBolt.org?

C++で書いたコードをアセンブラで表示するWebサイトです。もちろんGitHubリポジトリもあります: mattgodbolt/gcc-explorer

今気づきましたが、Google+のページもあります。

GodBolt

コンパイラをプルダウンから自由に選べるわ、リアルタイムでシンタックスハイライトはされるわ、オプションは表示されるわと盛りだくさんです。morimorihogeさんが最適化オプションを-O0から-O9まで変えてみると、アセンブラがみるみる短くなりました。

morimori comment

かっこよすぎです。今週の?を進呈いたします。おめでとうございます!

GitHubが9か月で6600万ドルの損失

直接関係ありませんが、数年前にGitHubでハラスメント騒ぎがあったのをつっつき会で初めて知りました。

JenkinsのUI見直し: Blue Ocean

CIサポートツールは最近あんまり取沙汰されてないような気がするのは思い過ごしでしょうか。今では古株に近いJenkinsにもこういうのが表示されることになりそうです。

Blue Ocean
https://jenkins.io/projects/blueocean/より

コプロセッサ付きGameBoyカード: Wolf

コプロのおかげでGameBoyで3Dがヌルヌルサクサク動いてますね。

Goのマイクロサービスフレームワーク Goa

個人的にちょっとよさげに思えました。

goa
https://goa.design/learn/guide/より

「設計を元にコードを生成」って歴史上何度も登場しているようですが、このぐらいささやかならいいかなと。

GitHubのIssuesをファイルシステムにマウントする

ちょうど本日のBPSアドベントカレンダー記事「VimとGo言語でSlackすればみんなもっと輝ける」にも通じるというか、同じ病を患ってる感ありますね。

EtherCalc

EtherCalc
EtherCalcより

Node.jsベースの表計算Webサービスです。普通に検索して見つけました。これを即使う必要はなさそうですが、表計算をベースにゴリゴリ新しいサービスを作りたい人にはよいかも。

GitHubリポジトリ: audreyt/ethercalc

LEGOアーティスト作品

LEGStudio
LEGOStudioより

私の家族からのタレコミです。冗談系LEGO力作系LEGOなどいろいろやっていてうらやましいです。

労働拒否は、星新一のショートショートにまさにこの装置が登場したのを覚えています。タイトルは覚えていませんが傑作です。今ググったら『ひとつの装置(ネタバレ注意!)』でした。

私も小学校高学年までLEGOにはまりまくって何だかでかいのを作ったりしてましたが、真夜中にたまたま虫の居所の悪かった母親に蹴り壊されてしょんぼりしてしまったのを思い出しました。

AppleがATS化義務付けの延期を発表

morimorihogeさんからの情報です。

BPSでもこの作業を急いでた矢先に出鼻をくじかれました。ずこー。

アポロ11号のソースコードが公開

apollo11号のソースコードを読みつつが話題を呼んでますね。

ダークマター不要の新しい重力理論が一次テストをパス

個人的には断然こちらに金星進呈したいところですがぐっと我慢。

ここ5年ほど科学雑誌を買ってなかったせいかこのあたりを完璧に見逃してました。Wikipedia: エントロピック重力理論に「重力は「物質の位置に関連付く情報」の結果である」なんて震えがきちゃいます。

ヴァーリンデの新理論はニュートン理論とも一般相対性理論とも整合しているので、逆に実験での検証が難しいとされていたようです。

今週は以上です。

関連記事

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

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

Ruby 公式ニュース

RubyFlow

160928_1638_XvIP4h

Ruby Weekly

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

おまけ: アドベントカレンダーらしい何か

以下はまったく私個人の戯言です。

2000年もの間誕生日を祝ってもらい続けるって、考えてみたらすごいことですね。釈尊も花祭りとかで祝ってもらってますし。当時の開祖は、自分の作り出した体系(=システム)が2000年も使われることになるとまでは思いもよらなかったのではないでしょうか。

開発者の皆さまが日々作り出しているシステムやライブラリも、もしかしたら2000年とまでいかなくても数百年使われ続けるようなことがあるかもしれません。

1990年代前半、COBOLで社内の日付ライブラリをリンクしようとして分厚いバインダーを繰って調べていると(ええ、当時はそんな方法しかなかったんです)、有効範囲が「1999年12月31日まで」となっているのをたまたま見つけました。「これどうすんですか?」と先輩に聞いたところ「こんなのその頃には誰も使ってないから大丈夫だよ」とお茶を濁されたのでした。その後の結果は申し上げるまでもありません。

開発者にとって、目の前の問題を切り抜けるのが最優先課題には違いありませんが、たまにはそういうことに思いを馳せてみようかなと思った次第です。

クリスマスおめでとうございます。

草月流生花でございます。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! 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ウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ