Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20200609後編)Rubyにカスタマイズ可能な軽量fiberスケジューラを実験導入、RailsとGraphQL、DBについて知って欲しいことほか

こんにちは、hachi8833です。

追記(20200612): 冒頭セクションにおけるツイートの引用方法がツイートの意図と異なるというご指摘をいただきました。大変申し訳ございません🙇‍♂️。
該当セクションを削除いたしました。削除前のスクショ: 12


  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄

Ruby

Rubyに軽量なfiberスケジューラを実験的に導入(Ruby Weeklyより)


つっつきボイス:「お、スケジューラーの話😋」「Matzも関心を持っているようです」「どうやらスケジューラーの汎用的なインターフェースを用意して、インターフェースを実装すれば使えるみたい👀」

提案:

  • スケジューラーのインターフェース: ユーザーが提供するイベントループにフックする
  • ノンブロッキングFiber: スケジューラーが利用できるときは呼び出し、そうでないときはブロックする
    同issueより
# 同issueより
class Scheduler
  # 指定のファイルディスクリプタがreadableになるまで待つ
  def wait_readable(io)
  end

  # 指定のファイルディスクリプタがwritableになるまで待つ
  def wait_writable(io)
  end

  # 指定のファイルディスクリプタが、指定のタイムアウト時間内に指定のイベントとマッチするまで待つ
  # @param event [Integer] IO::WAIT_READABLE、IO::WAIT_WRITABLE、IO::WAIT_PRIORITYのビットマスク
  # @param timeout [#to_f] イベント待ちの総時間
  def wait_any(io, events, timeout)
  end

  # 現在のタスクを指定の期間スリープさせる(指定なしの場合は無限)
  # @param duration [#to_f] スリープ総時間
  def wait_sleep(duration = nil)
  end

  # Ruby VMがシステムレベルブロッキング操作に入る
  def enter_blocking_region
  end

  # Ruby VMがシステムレベルブロッキング操作を完了した
  def exit_blocking_region
  end

  # ノンブロッキングFiberの作成をインターセプトする
  def fiber(&block)
    Fiber.new(blocking: false, &block)
  end

  # スレッドが存在する場合は呼び出す
  def run
    # ここにイベントループを実装する
  end
end

ブロッキング操作でノンブロッキングfiber切り替えを有効にする手順:

  • スケジューラーを指定する: Thread.current.scheduler = Scheduler.new
  • ノンブロッキングfiberが複数作成される: Fiber.new(blocking:false) {...}
  • メインfiberが存在するのでThread.current.scheduler.runが呼び出される。これはイベントループの実行を開始し、すべてのfiberが完了するまで継続する。
    同issueより

「ちょうどこのあたり↑がそうでしょうね: スレッドごとにそのスレッド以下のfiberスケジューラを任意で作れるようにしようという提案😋」「おぉ?」「スケジューラーをこんなふうに指定できるようになると、この処理ではこのスケジューラー、別の処理では別のスケジューラーを、みたいにプラガブルに使えるんじゃないかな🧐」「ほほぅ😋」「いいじゃないのこれ!❤️」「よさそう😍」

「Matzもこの実験にGoサイン出してますね」「普通にコードを書いていてこの機能が欲しくなることはまずないとは思いますけど、たとえばライブラリで特定用途の機能をカリカリにチューニングしたいときなんかだと、別のスケジューラーを使いたくなることは往々にしてありますので☺️」「なるほど〜😋」「どんな場合でもうまくいくスケジューラーアルゴリズムというものは存在しませんし😆」「スケジューラーを差し替えられるようになるだけでもありがたいですね🙏」「期待できそう😋」「これはいい機能だと思います👍」

「機能名はまだふわっとしているというか審議中みたいです」「スレッドスケジューラーとかにする方が誤解は少ないのかも?🤔」

スモウルビー3がScratch 3.0ベースに

  • スモウルビー3GUIサイト: Smalruby

YassLabの安川さんに教えていただきました🙇。


yasslab.jpより


つっつきボイス:「ちょっといっぱい貼りすぎちゃいましたけど😅、少し前にスモウルビーのGUIがScratch 3.0ベースになったそうです」「あのScratchとRubyがついに接近してきたんですね❤️」「ガワはScratch」「子ども向けのプログラミング分野だとScratchが圧倒的なシェアらしいので、Rubyが参入しやすくなりそう😋」

スモウルビーでは、Scratchの形式で書いたプログラムをRubyのソースコードに変更したり、あるいはRuby文法で書いたプログラムをScracthのプログラムと同期することもできるのです。
同記事より

「自分は大学でのプログラミング教育については仕事柄ずっと追っているんですけど、初等教育でのプログラミング教育についてはほとんど知らなくて、いまどういう感じなんですかね?」「だいたいScratchという印象ですね: こういうビジュアルプログラミングだとコンパイルエラーが起きないから子どもにとってはやりやすいですヨ」

「論理的につなげない部品は、形がそもそもつながらないようになってますし」「ああ、部品の出っ張りと引っ込みの形がですね😆」「こういうのを見るとついLEGO MINDSTORMSを授業で使ったときのトラウマが😅」「昔のHTMLのホームビルダーみたいなのを思い出します😆」「Dreamweaverとか😆」

「こういうScratchとかは言語としての表現力やボキャブラリーって、やっぱり元の言語のサブセットになる感じ?」「そうですね、触ってみた感じではかなり小さいサブセットで、たとえば文字列結合は部品だとやれませんでしたし😅」「たぶんビジュアルとコードをある程度は相互変換できそう」「スモウルビーの「ルビー」タブをクリックするとRubyコードに変換されます: なおそっちでコードを書き足すと割とバックコンバートでエラーになりました😅」

「自分はビジュアルベースでプログラミングできる気がしない😆」「自分も😆」「大学でMINDSTORMS使ったときも、絵柄からロジックを読めなくて往生しましたし😅」「逆にコンピューターにまったく縁のなかった学生にしてみれば、文字で書かれたコードで思ったとおりに作れる気になかなかなれないでしょうし」「まさにごもっとも!」「まあ自分はこの方面に近寄らないつもり😆」「プロ開発者ならそうですよね☺️」

「大学で教えていると、学生が困るのはたいていコンパイルエラーですよね😆」「そうそう、たいていはtypo、あと『英語読めません』問題🤣」「それです🤣」「マジで?🤣」「英語読めませんは教育現場で筆頭ですヨ😭」「英語、絶対読めるはずなのに読まないという😆」「頭でわかってても目が英語メッセージを読むのを拒否しちゃうんでしょうね」「子どもたちは字を読まなくても、適当に部品をくっつけて試行錯誤で動かしちゃいますけど」

eturem: Rubyのエラーメッセージを日本語化(多言語化)


つっつきボイス:「Rubyのエラーメッセージを日本語化(多言語化)するツールで、今のスモウルビーで使えるそうです」「日本語エラーメッセージ、自分は要らないな〜😆」「でもこれが福音となる人はいると思いますヨ」「すっごくわかりますけど、自分は要らない😆」「日本語になるだけで泣いて喜ぶ人いますよきっと😂」

「エラーメッセージの多言語化には悩ましい点があって、ググっても見つけにくくなること」「ああっ😳」「逆にググる環境がない人やググり方をまだ知らない人には、エラーメッセージが日本語の方が絶対いいと思います😋」「ググれる人にとっては英語メッセージの方がまともな情報にたどり着く可能性がずっと高いんですよ☺️」

「それ以前の段階の人が、エラーメッセージを自分で読んで考えて調べる気になるかどうか、そこが分かれ目かなとも思いますし」「調べる気のない人には日本語メッセージがいいでしょうね」「日本語メッセージだったら調べる気になる人もいるかなとちょっと思ったり😆」

「eturem、どうやら単なる日本語化じゃなくて、did you mean的なこともやってくれるみたい」「おぉ😋」「でも初心者だと一番最後のエラーメッセージだけ読んだりしがちで、だけどエラーは単独じゃなくて他のエラーから次々に派生したりすることが多いから、やっぱり読んでくれなかったりして😅」「いっそ最終的なエラーだけ表示してあげるとか😆」「それはそれで賽の河原みたいでつらいですけど😆」

「教育現場で脱落者をなるべく出さないようにするのはやっぱり難しいですね...」「難しいです😭」「その意味でScratchみたいなものは必修の科目で脱落者を減らすうえで大事だと思います🧐」「たしかに!」「選択科目みたいに最悪でも単位あげなければいい授業なら他のやりようがありますけど、必修科目はそういうわけにいきませんし🎓」「取らないと卒業できない科目😅」

SqueakとSmalltalk

「その昔Squeakというこの手の走りのような環境を大学で導入したときは、プロフェッショナルな先輩方に随分白い目で見られたのを思い出しましたよ😢」「スクイークって何ですか?」「SqueakってSmalltalkベースのビジュアルプログラミング環境ですよね」「ですです、今となっては昔ですけど自分はSqueak好きでしたし😍」「ググったらなつかしのリスの顔が出てきた🐿」

参考: Squeak - Wikipedia

「自分もSqueakは、その昔Smalltalkの勉強をしていて知りましたね: 当時はこれがオブジェクト指向かって思いましたし☺️」「Smalltalk最高ですよね😋」「さすがにSmalltalkでまともなコードは書いたことありませんけど😆」「SmalltalkといえばRubyのご先祖のひとつですよね⛩」

「Smalltalkといえばオブジェクト指向の草分けですけど、どちらかというとメッセージパッシング型のプログラミングという趣でしたね」「そうそうメッセージパッシング😋」「そういうパラダイムを学ぶうえではSmalltalkはとても分かりやすかった❤️」

「よく『オブジェクト指向と名付けたのがよくなかった』みたいなこと言われますけど、あれはむしろメッセージパッシング指向でしょうと」「あ〜そうですよね」「その意味で、オブジェクト指向プログラミングの勉強をしたあとにSmalltalkを勉強すると、オブジェクト指向プログラミングが本来目指してたのは何だったのかが垣間見えてきますね🧐」

「メッセージパッシングに重きを置けばよかったのに、継承に重きを置いて教えるようになってしまったのがよくなかったと自分も思います😆」「そうそう、名詞のように形のあるオブジェクトに注目してしまったためにメッセージパッシングの概念が横に押しのけられた感はありますね😆」

「Smalltalkって文法要素が少なくてとっても美しい言語だと思います✨」「パラダイム違いますよね: 特に、相手がメッセージを受けられなくても投げることはできるというのが面白い😋」「あ〜なるほど!」「原理的にはどんなオブジェクトでもメッセージを受け取ることが可能ですし、未定義なら何もしないので、JavaやRubyのように実行時エラーにならない😆」「まあまともに構築したらエラーを出すようにつくりますけど😆」(以下Objective-Cの話など延々)

prophet: Rubyで時系列の未来を予測(Ruby Weeklyより)

FacebookのprophetというPythonライブラリをRubyに移植したそうです。


つっつきボイス:「これもankaneさんのgemですね」「前に似たようなものを見た気がしますね」「自分もそう思ったんですけどこれは初めてでした」「何というか、Excelのオートフィル的にデータを増やしてくれるヤツ」「前に取り上げたのはもっと数学寄りだったと思いますけど、このgemはそういうデータ処理っぽい感じですね」

# 同リポジトリより
df = Rover.read_csv("example_wp_log_peyton_manning.csv")
df.head
ds  y
2007-12-10  9.59076113
2007-12-11  8.51959031
2007-12-12  8.18367658
2007-12-13  8.07246736
2007-12-14  7.89357207

「こういうgemを書く動機って何なんでしょう?😅」「たぶん大量のダミーデータが欲しいときでしょうね🧐」「あ〜なるほど!」「1週間分のデータがあれば1年分に増やせるでしょうし、しかもこのグラフ↓のように、まったく同じデータの繰り返しにはならないようにできると」「たしかにコピペで増やしたら境目が露骨にわかっちゃいますね」


同リポジトリより

「ほら、データベースにダミーデータを突っ込むときに、月だけ変えたデータを使うと変なインデックスがかかったりするじゃないですか😆」「あるある😆」「あったらおかしいカーディナリティがかかっちゃったり😆」「😆」「そういうことが起きないためにもprophetみたいなツールが必要ということですね☺️」「なるほど納得😋」「こうやって簡単に使えるツールがあれば使いたいですよね👍」

参考: カーディナリティ - オラクル・Oracleをマスターするための基本と仕組み

RuboCopという名前


つっつきボイス:「今日社内Slackに貼った記事で、今米国で警官(cop)の評判が落ちているからRuboCopという名前を変えませんかというissueが立って、作者の@bbatsovさんが辛抱強く『変えないことにします』と返答してcloseしたというものです」「そうそう、こういう対処に困るようなissueにも対応しないといけないオーナーは大変だと思います🙏」「今の時期、対応を一歩間違えたらえらいことになりかねませんし😅」「自分だったらそんなこと言われても困っちゃいます😅」「中の人、本気でお疲れさまです🙇」


この件に関して、その後@bbatsovさんが以下の記事を出していました。結論は同じです。

参考: The RuboCop Name Drama Redux | Meta Redux

以下はつっつき後に見つけたツイートです。

その他Ruby


DB

データベースについて開発者にもっと知ってほしいこと(DB Weeklyより)

この記事翻訳したいです😋。


つっつきボイス:「割と量ある😆」「データベース周りの常識を押さえるのによさそう😋」

RDBMSをいつどこで勉強したか

「ところで、いわゆるRDBMSのこういうトランザクション分離レベルみたいな詳細な知識って、世の中のエンジニアはどういうタイミングで勉強しているんでしょうね?🤔」「自分は昔の情報処理技術者試験にあったテクニカルエンジニアのときにひととおりやりました😋」

参考: テクニカルエンジニア試験 - Wikipedia

「大学は情報系だったんですけど、この記事みたいにデータベースについてこんな細かく授業でやりませんでしたね」「そもそも誰かにまとめて教えてもらった記憶がありません😆」「となると、やっぱり自分で勉強したり情報処理技術者試験のテキスト読んだりしてから、詳解MySQLあたりを読むみたいな感じでしょうかね😆」「本以外だと、コードレビューでびしびし叩かれて学びました😆」「つまり経験と知識のある人に教わると」「だと思います」「自分もあまり人に教わってないな〜」

「あとはRailsのhas_manyだとかbelongs_toあたりを知ったときに『RDBMSってこうなってるんだ!』みたいな感じで目を開かれました👁」「自分も強い人とそういう話をたまにすることはありましたけど、RDBMSについては結局ほぼすべて自力で学んだな〜🎓」

参考: Active Record の関連付け - Railsガイド

「実際みんなどうやって勉強してるんでしょ?😆」「みんなの学び方が想像できない😆」「昔だとソースコードの中にSQL文を生書きしてましたけど、今みたいにActive Recordのお世話になっているとSQLを生書きする機会がめったにないから、ますます想像しにくいですよね」「たしかに」「今の自分たちは、この記事にあるようなことはだいたい知ってますけど、新しく勉強するエンジニアたちは一体どうしてるのか謎ですね🤔」「SQL構文とかはともかく、RDBMSの実践的な知識って本当にどう学んでるんでしょうね?」

「その意味だとSIerの人たちの方がRDBMSについて学ぶ機会が多いかも: Railsみたいなフレームワークを使ってると生SQLを書く機会がめったにありませんし」「自分がやってたみたいにMySQLをソースからコンパイルしてみるとか?😆」「そういうのあったあった😆: MySQLのとてもシンプルなレプリケーションメカニズムとかは見てみるといいと思いますし、壊れたらどうなるかも身を持ってわかりますし😆」「今の若い子はそういうことしなさそうですし☺️」「今ならボタンぽちでレプリケーションできますし」

「PHPやってた頃はデータベースアダプタを自力で書きましたし🧐」「PHPで?」「それスゴい」「そのときはラッピングしているライブラリがイマイチで、ちょっと複雑なことをしようとすると結局生SQLを書くしかなかった、みたいなことは当時よくありましたし😅」「それってPHP 4の頃でしょうか?」「4の頃😆」「PEARとかあった頃😆」「ペア〜ありましたね😆」

参考: PEAR - Wikipedia

「今となってはですけど、壊れたデータベースのbinlogを追いかけて修復するみたいな修羅場を今の若い人たちがわざわざ経験する必要はもうないと思います👹」「はい、おっしゃるとおりです😆」「binlogがdisk fullでぶっ壊れるとかマジつらいですよ😭」「それをviでこじ開けて修正するとかやりましたし😇」「もうやりたくない〜😆」「かつては誰もがそういう経験してましたけど、もうそんな地獄は見なくていいと思いますし☺️」「まあそういう目にあったからこそ鼻が利くという面もありますけど😆」(以下延々)

クラウド/コンテナ/インフラ/Serverless

Lambda Functionsについて知っておけばよかった3つのこと(Serverless Statusより)


つっつきボイス:「こちらも知っておけばよかった記事です😆」「ああ、Lambda Functionsにこういうコンテキストの設定↓ってありますね」

/* my-lambda-function.js */
exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
}

「そうそう、Lambdaレイヤの250MBという制限!これはRubyを使うときにマジでキツいです😭」「あ〜😳」「特にバンドルしたgemが増えるとこのリミットに近づくんですよ、gemにもよりますけど」「割と簡単に超えちゃいそう😅」「Lambda書くときにこの辺意識したことなかった...」

「なおrdoc入れると超えやすいです😆」「rdocかさばりますよね😅」「Rubyでgemを使うとLambdaの250MB制限はキツい😇」

「まあやってみれば踏むのですぐわかりますし」「だからあらかじめ知っておきたかったんでしょうね😆」「まあ踏まないとわからないこともありますので☺️」

参考: library rdoc (Ruby 2.7.0 リファレンスマニュアル)


見出しより:

  • 実行コンテキストの残留
  • ネットワーク接続のタイムアウト
  • Lambdaレイヤの制約

行政とオープンソース


つっつきボイス:「IMIツールはいいですよね❤️」「いろいろ眺めた感じでは、まだ完璧なツールとまではいかないようですけど👀」「国の動きとしてはとてもいいですよね😋」「こういうのは国や公共機関が提供すべきだと思いますし😆」「賛成😋」「こういうのはもっともっとやって欲しいです😍」

「これであのKEN_ALL.csvとおさらばできるかな😆」「幸せになりましょう😆」「さよならっKEN_ALL.csv👋」

「今回のは、国が実装も公式に提供してくれているのがとてもありがたい🙏: 仕様が公開されていても実装がないとやりづらくて😅」「これなら『この機能にはこのライブラリを使います、なぜなら国がこのライブラリ実装を提供しているからです』ってクライアントへの説明がものすごく楽になりますし❤️」「サイコーです😋」「なんてったってジャパンオフィシャル🇯🇵」

「APIと仕様だけ国が提供してても足りないんですね」「特に住所のように、入力するものの振れ幅が大きくなりがちなデータは、実装とセットになっていないと仕様に抜けやあいまいさがあったときの対応が大変なんですよ😅」「うんうん」「人間なら普通こう入力すると思われていても、実際にはいくらでも予想の斜め上を行くようなフォーマットで住所が入力されますし」「今までだと『そんなの簡単に処理できるでしょ』と思われたりしがちで、対応しようにもオフィシャルな実装がないとひたすら苦労しますし😭」「京都の地名とか😆」「やめて〜😆」

「こうやって国が実装まで公開してくれれば、そういうときでも『行政で使われていますのでこれ使います。以上』で説明できますし😋」「やっぱりサイコー❤️」

JavaScript

Vue 3はTypeScript採用の予定(JavaScript Weeklyより)


つっつきボイス:「今までは素のJSだったんですね」「VueもTypeScript使う方向でいいと思います👍」

GraphQLとRails

「ちょっとRails方面の話になるんですけど、最近GraphQL使っているうちに、RailsはもうGraphQLサーバーとして使えばいいんじゃね?って割と思うようになりましたね☺️」「お〜」「RailsはGraphQLと管理画面だけ提供して、フロント側はもうVueでも何でも自由にやってくれればいいと思い始めました😆」

「実は自分もこっそりそう思い始めているんですけど、GraphQLの理解度が😅」「GraphQLはちょっと腰を据えて勉強するといいと思います👍」

「今の世の中に出回っているGraphQLの情報って、ほとんどがクライアント側の情報なんですよ」「あ〜そうかも!😳」「サーバー側はGraphQLのときどうしたらいいの?みたいな情報があんまりなくて😢」「たしかに少ないですね、クライアント側で使った、よかった、うれしいみたいな記事ならいくらでもあるんですけど😆」「ほんにそれ😆」

「だからこそ、Railsの人が今GraphQLをしっかり勉強しておく意味はあるだろうなと思います❤️」「言い換えるとクライアント側はそれだけラクだということですね😆」

「サーバー側のGraphQLは、エンドポイントが基本的に1個というところがちょっと扱いづらいんですよ😢」「お〜」「あと、GraphQLのAPIが大量にあるとスキーマがどんどん大きくなっていくのもまだちょっとイケてないと思いますし🌋」「わかる気がします😅」

参考: GraphQLを最速でマスターするための意識改革3ヶ条 - Qiita

「VueからなぜかRailsとGraphQLの話になりましたけど😆、Vueを使おうとReactを使おうと、やっぱりWebの見た目はクライアント側でやりたいと思いますし: そういう意味ではRailsがCSSを吐くとかはもうやらなくていいのかな、なんて😆」「CSSやめてもいいかも😆」「Actionなんちゃらが今後減ったりして」

「ただRailsの管理画面なんかは今のまま残しておいていいと思います」「たしかに」「昔はフロントエンドを専任でやる人ってあまりいなかったんですけど、フロントエンドをやる人が増えてきたこともあって、最近そういうことを考えるようになりましたね☺️」

「むしろ最近サーバーサイドやる人が減ってたりして?」「観測範囲が狭くてわかりませんけど😅」「自分の周りは少しその気があるかも?🤔」

「サーバーサイドで最近求められているスキルって、Railsでちょろっと何か書いてできるようなものではだんだんなくなっているところがありますよね: 求められているのはどちらかというとさっきのデータベース周りだとかパフォーマンスチューニングみたいな、より面倒なことにシフトしつつあるかなって」「そうかも😳」「今はサーバーサイドでしかできないことをやれる人としてサーバーサイドエンジニアが求められている感じなので、フロントエンドでやれることはフロントエンドでやりましょうよ、という雰囲気になりつつある気がします🧐」「ふ〜む🤔」

CSS/HTML/フロントエンド/テスト/デザイン

CSS変数ユーザーズガイド(Frontend Focusより)

// 同記事より
var root = document.documentElement;

document.addEventListener("mousemove", evt => {
    let x = evt.clientX / innerWidth;
    let y = evt.clientY / innerHeight;

    root.style.setProperty("--mouse-x", x);
    root.style.setProperty("--mouse-y", y);
});

つっつきボイス:「またの名をカスタムプロパティ」「CSSにどうして変数がないんだろう、同じ数字を何回も入れないといけないんだろうって昔から気になってました😆」「CSSがその名の通りカスケーディングで値を伝搬させていくから、calc()ぐらいならまだしも、変数みたいに値の変わるものってCSSに向かない気はしますね🧐」「定数みたいにイミュータブルならともかく、変数の変更が連鎖するとどうなるのかなって🤔」「たしかに連鎖しますよね😅」

参考: CSS カスタムプロパティ (変数) の使用 - CSS: カスケーディングスタイルシート | MDN
参考: css variable -- Can I use... Support tables for HTML5, CSS3, etc

「CSS変数、ちょっと使ってみたいという気持ちはわかりますけど、変更可能であるがゆえの不便さもありそうな気はしますね☺️」「読み込み順序の問題もあるでしょうし」「あ〜😳」「CSSって上から順に処理するようになっていますけど、CSSが並列読み込みされると、そこに変数が含まれている可能性もあるわけだから、ひととおり読み込まないとレンダリング開始できなさそうですし、効率悪そうですけどね🤔」

「まあレンダリングエンジンがめちゃ強力になってるかもしれないし、使ってみないとわかりませんけど😆」「ひとりで開発するならCSS変数使ってもいいかもしれませんけど、チームでやってると他の人から悲鳴があがったりして😆」

「なおCSSのcalc()は超有用ですけどね👍」「ないと生きていけません😂」

参考: calc() - CSS: カスケーディングスタイルシート | MDN

言語/ツール/OS/CPU

10行で


つっつきボイス:「10行でとこぷよ(とことんぷよぷよ)が遊べるらしい💨」「ほんとにこれだけなんですね😳」「変数短かっ😆」

// 同記事より
for (M = N = [i = 113]; --i; M[i - 1] = i % 8 <
    2 | i < 8)
function Y() {
    e++;
    if (e %= 10)
        for (N = [K - 2 ? K - 50 ? h -= M[h + l - K] | M[h - K] ? 0 : K : M[h + p] ||
                (x = p, p = -l, l = x) : e = 0
            ], K = 0; ++i < 113; N[i] = M[i]) N[h] = B >> 2, N[h + l] = B % 4 - B % 1 + 2;
    if (!e && (h -= 8, !g || M[h] + M[h + l])) {
        C = [M = N];
        for (i = g = 1; ++i < 103; !M[i] * n && (M[i] = n, g = M[i + 8] = 0)) n =
            M[i + 8];
        for (; --i;) {
            n = c = 0;
            for (E = [i]; g & M[i] > 1 & n >= c >> 2; t > 102 | C[t] | M[i] - M[t] || (E[++n] = C[t] = t)) t = p, p = -l, l = t, t += E[c++ >> 2];
            for (; c > 16 && n;) g = M[E[n--]] = 0
        }
        B = g ? Math.random(h = 100, l = 8, p = -1) * 16 + 8 : --e
    }
    for (i = 104, S = ""; i--; S += n-- ? n ? "<a style=color:#" + (248 * n) + ">●" + "</a>" : i % 8 ? "■" : "■<br>" : "_") n = N[i];
    D.innerHTML = S;
    M[100] * g || setTimeout(Y, 50)
}
Y(g = h = e = 9, l = p = K = 0)

「ちゃんと遊べるんだ〜」「ぷよぷよの基本的な消滅ロジックはシンプルだからこれでやれるでしょうね: 隣り合ったぷよ同士がくっつくアニメーションとかやり始めたら大変でしょうけど😋」「余韻なしでぷよが消えるのがやりづらそう😆」「まあ10行ですから☺️」「ぷよぷよやりたくなってきた😆」「Rubyで書き直してみようかな😋」


「そういえば最近ビッグテトリスなんてのが密かに流行ってますね↓」「100人テトリスではなくて?」「動画見るとわかりますけど、ピースがすごくでかい↓」「おわ〜一瞬も油断できない😆」「要するにめちゃ狭い😆」「心臓に悪い😆」「配牌が悪いと一瞬で詰みますし😇」

その他

机型PCケース


つっつきボイス:「これ個人的にちょっとソソられます❤️: 高さ変えられるみたいですし」「しかも電動で😆」「電動いらんでしょう😆」「Macが丸ごと入るなら欲しいかも😋」「とりあえずスペースインベーダーやるかな😆」「そう思いますよね😆」「天板がディスプレイかと思ったら違うみたい😳」「ああいう筐体を思い出すのは相当なおっさんしかいないでしょう🤣」「喫茶店では見たことありませんけど😆」「物心ついたときにかろうじて👶」「...あります😅」

参考: スペースインベーダー - Wikipedia

重機をリモートで


つっつきボイス:「後からアタッチメントとして取り付けもできるみたいです」「前からありそうですけど?」「購入者が金を払わないときにリモートでエンジンをかからなくするというのは聞いたことあります😆」「自動化だけならいくらでもできるでしょうけど、ちゃんと安全にやれるかどうかが常に問題ですよね」「自分もそれが一番気になります😅」「子どもが駆け寄ってきたらどうするとか😱」「リモート手術なんかもそうですけど、こういうのは法律の壁と安全面がポイントでしょうね☺️」

「無人を保証できる環境ならいけるかも」「それこそ原子炉周りの作業とか☢️」「福島原発のときもロボットが大量に投入されましたけど、実際に投入してみるとCPUが放射線で動かなくなることがわかったりしましたけど」「あ〜」「一説には宇宙よりも過酷な環境とも言われますね☺️」

参考: 「原発ロボット」故障の深層 「放射線のせい」報道を追う: J-CAST ニュース【全文表示】

番外

デニソワ人の痕跡はゲノム分析で初めて発見された

参考: 『交雑する人類』 古代DNAが世界史を書き換える! - HONZ
参考: デニソワ人 - Wikipedia


つっつきボイス:「デニソワ人?」「まだ読み中の本なんですけど、ネアンデルタール人とパラレルに存在していたという古代人が、ゲノム分析で初めて浮かび上がって、その後本当に発見されたんだそうです」「へぇ〜」「この本はここ10年のゲノム分析の成果をいろいろ紹介してて、面白さがヤバいです😋」「パンゲアはなかった的な話もあったりして😆」「実際に古代人に関する従来の説が今もどっかんどっかんひっくり返されているそうです」「学校で習ったときとえらく変わってそう😆」「恐竜なんかも説が大きく変わってたりしますし🦖」


後編は以上です。

おたより発掘

バックナンバー(2020年度第2四半期)

週刊Railsウォッチ(20200526後編)Rubyでよくやるスレッドバグ、Kubernetesでよくあるミス10、CSS/SVG/Canvasの使い分けほか

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

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

Ruby Weekly

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

Frontend Focus

frontendfocus_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured


CONTACT

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