まめめも
フィード

「型システムのしくみ」発売のお知らせ
93

まめめも
「型システムの仕組み - TypeScriptで実装しながら学ぶ型とプログラミング言語」という本を書きました。 かんたんな型チェッカを自作してみることで、型システムの仕組みを概観する本です。 型チェックする対象の言語はTypeScript(のサブセット言語)、型チェッカを実装するための言語もTypeScriptです。 たとえば、次のようなプログラムが型チェックできます。const add = (x: number, y: number) => { return x + y; } const a = add(1, 2); const b = a + true;
9日前

TypeScriptは型安全じゃないからすばらしい
まめめも
「TypeScriptではじめる型システム」という記事をn月刊ラムダノートに寄稿しました。 新刊を発売しました "『n月刊ラムダノート』Vol.4 No.3(2024)発行のお知らせ https://t.co/PGppk1aRRA— lambdanote (@lambdanote) 2024年10月4日 どんな内容? TypeScriptの極小サブセットに対する型検査器を書き、それを通して型システムを体感してみよう、という内容です。 詳しく言うと、boolean型とnumber型と関数型しかないTypeScriptサブセット言語がターゲットです。 型検査器の実装言語にもTypeScript(処…
6ヶ月前

RubyでSlackのボットを書く方法(なるべく自力で)
まめめも
RubyでSlackのボットを書くには、slack-ruby-client gemやruboty gemなどを使うのが一般的だと思います。 しかし個人的には、Slackボット程度でgemを使うのは好みでないので、なるべく素のRubyだけで書くようにしています。 その方法をまとめておきます。 Slack appを登録する まず、https://api.slack.com/appsで"Create New App"して、適当に設定をします。 次のYAMLを"App Manifest"に貼ってSave Changesすると一気に設定できます。 display_information: name: S…
10ヶ月前

継承はなんでダメ?
まめめも
「オブジェクト指向の継承を使うな」という主張が広まっているようです。なんでダメになったんでしょうか。 インターネットで見かけた「継承はダメ」という主張をいくつか眺めて、友人と議論しつつ、考えてみました。 「コードが読みにくくなる」 継承があると、メソッド呼び出しが実際にどのメソッド定義を呼び出すのか字面でわからない。 デバッガを使って、親クラスのメソッドに飛んだり、子クラスに飛んだりするのを追いかけないと行けない。 つらい。という主張。 めっちゃわかる。わかるんですが、これは「高度に共通化されたコードは読みにくい」という一般的な側面がかなり大きいような。 たとえば継承の代わりに高階関数を使うと…
1年前

ブラウザでRubyを動かす夢
まめめも
何に使うわけでもないけど、とにかくブラウザで Ruby を動かしたかったんです。 その夢が、ついにかなった気がします。 長年の念願だった Emscripten と xterm.js でブラウザで irb を動かすやつがついに(一応)できたhttps://t.co/ubentOzj7p— Yusuke Endoh (@mametter) 2024年1月27日 振り返ってみると、ここに来るまで 6 年もかかったようです。ちょっと嬉しくなったので経緯を書き残します。 Emscripten で Ruby をビルドする 2018 年、ふと思い立って、Emscripten で Ruby をビルドできるよう…
1年前

Rubyの全バージョンで動くQuine
まめめも
このプログラムは、Ruby 0.49(1994年リリース)からRuby 3.2.1(今月リリース)まで、現在確認されているすべてのCRubyで動作するQuineです。 eval($s=("t='eval($s=('+d=34.chr;s=3 2.chr+$s*i=8;v=$VERSION||eval('begin;v=V ERSION;rescue;v||RUBY_VERSION;end');f=('?'*8 +'A|'+'?'*20+'G?c'+'?'*15+'A@CXx@~@_`OpGxCxp@~pO xS|O~G?c?q?xC`AP|q?x_|C_xC_xO@H@cG?G?qA|_|_`…
2年前

Go言語の不満
まめめも
ちょっとバイナリ配布したいツール↓があったので、Go言語と戯れました。 zenn.dev ほぼはじめてGoを使ったので、にわかほど語りたがる法則に従って、Go言語の感想を書きます。 新しい言語にふれたときは、できることには気づきにくく、できないことに気づきやすいので、不満が多めです。主な比較対象はRuby、C言語、JS/TS、Rustあたりです。 よかったところ ひとことで言えば「便利になったC言語」という感じでした。結構低レベルなAPIも揃っていてよかった(デーモン化が素直にできなかったこと以外)。 Rustと比べたらストレスフリーです。思った通りに書くだけでとりあえず動いてくれる。すばらし…
2年前

6x6リバーシの神
まめめも
絶対に勝てない6x6リバーシを作りました。あなたは黒番、AIが白番です。 絶対に勝てない6x6リバーシを作りました! ぜひ挑戦してみてくださいhttps://t.co/Ul5n3q9jMp— Yusuke Endoh (@mametter) December 30, 2021 これは何? 6x6の盤面のリバーシは後手必勝 *1 であることが知られています。 このAIは白番(後手)で完璧にプレイします。つまり黒番のあなたは絶対に勝てません。無力感を楽しんでください。 技術的な話 このAIはWebAssemblyになっているので、全部あなたのブラウザの上で動いてます。真のサーバーレスです。 AIの…
3年前

アニメ「Sonny Boy」の『難解』プログラムの解説
まめめも
『Sonny Boy』というアニメが放送されています。学校が異次元に漂流してしまい、超能力に目覚めた生徒たちがサバイバルしながら、さまざまな奇妙な現象の裏にあるルールを解き明かし、元の世界に変える方法を探す、というストーリーです。ルールが分かったあとで何度も見直したくなります。 anime.shochiku.co.jp さて今回、『Sonny Boy』に、プログラムを寄稿しました。プログラムでおもしろいCGを作ったとかではなく、プログラムの実行の様子そのものが『Sonny Boy』の5話の中で放送されました。 こういうプログラムです。 nankai.rb このプログラムがどういうものだったかを…
4年前

IOCCC日本語ネタバレ解説 中間報告
まめめも
変態C言語プログラムコンテストであるIOCCCの全作品を日本語でネタバレ解説するサイトを書いてます。 mame.github.io 年初にIOCCC 1984の解説から書き始めて、先程IOCCC 2000の解説を公開したところです。 数えてみると、ここまで165作品を解説したようです。どれも面白いものばかりですが、その中でも特におすすめの作品を個人的な好みでピックアップ紹介してみました。 Brian Westleyの作品 初期のIOCCCを支えたwestleyの作品群。多彩で超絶技巧で、とにかくすごいです。絶対に見てほしい!ので、まずは彼の作品だけまとめます。 ネタバレ解説を書き始めたのは、す…
4年前

WSL2 + subsystemctlの設定メモ
まめめも
WSL2 + subsystemctlの設定メモ WSL2のおかげでLinuxからWindowsに移住できました。WSL2はデフォルトでsystemdが動いていないので、genieを使うのが定番ですが、自分はsubsystemctlを使っています。subsystemctlの設定方法はあまり見かけないので、メモを残しておきます。 インストール コンパイルからインストールまでのコマンドを一気に書きます。 sudo apt-get install cargo systemd-container binfmt-support git clone https://github.com/sorah/sub…
4年前

IOCCC ネタバレ解説はじめました & IOCCC 2020 に入賞したよ
まめめも
IOCCC の全作品のネタバレ解説を目指すサイトを作りました。 mame.github.io いまのところ、最初の 4 年分まで書いてます(IOCCC 1984 ~ IOCCC 1987)。週ペースで書き足していくつもりなのでご笑覧ください。 IOCCC は、「現存する世界最古のプログラミングコンテスト」と言われることもあります。つまり、現在も開催されているということです。今年の正月に、昨年の IOCCC 2020 の入賞作品が公開されました。自分のプログラムが 3 つ入賞したので、デモ動画と簡単な紹介を書いておきます。 endoh1 - Most explosive www.youtube.…
4年前

Rubyと型についてのポエム
まめめも
zenn.dev matz はじめコミッターの型に対する姿勢にも疑問を持っています。 というご意見が自分に刺さった気がしたので、他の話題はともかくこの点に関してだけ、ポエムを書きます。 「Rubyに型が欲しい」というのは、「もっと速い馬が欲しい」だと思っています。意味を知らない人は ヘンリー・フォード もっと速い馬が欲しい で検索してください。 これは批判でも皮肉でもありません。みんなが馬の乗り方を知っている世界では、誰も乗り方を知らない自動車より、速い馬のほうが確実で合理的です。まして、自動車が本当に実現できるかどうかわからない段階では。なので、他言語で型注釈を書くことによるプログラミング体…
4年前

設定情報をエレガントに管理する方法(解決なし)
まめめも
アプリケーションにはいろいろ設定があるものです。一般的な例では、production / development のようなモードや、ログレベルなど。プログラムを書くとき、こういうデータをどのように管理しますか? 大きく 2 種類の書き方があると思います。 グローバル変数(やそれに類するもの)に入れる クラス生成時にコンストラクタに引き回す どちらも一長一短があると思っています。 1. グローバル変数に入れる たとえば、$config = { mode: :development } などとするだけ。 Rubyの場合、グローバル変数だけでなく、定数に入れたり、クラスメソッドにしたり、single…
4年前

rubygems を 1.5 倍に高速化した方法(stackprof --d3-flamegraph の使い方)
まめめも
タイトルは釣りです。明日 ISUCON 10の予選があると小耳に挟んだので、Ruby で参加する人が絶対に抑えておくべき? Ruby 高速化の tips をひとつ。stackprof --d3-flamegraph のご紹介です。 例題 ちょうど今日、gem install aws-sdk にかかる時間を 37 秒から 24 秒ほどに高速化しました。 変更前: $ time ruby -I lib bin/gem install --no-doc aws-sdk Successfully installed aws-sdk-3.0.1 1 gem installed real 0m37.104…
5年前

カロリーメイトリキッドのQuineを書きました
まめめも
縁あって、カロリーメイトリキッドのプロモーション用にちょっとした Ruby プログラムを書かせてもらいました。 www.otsuka.co.jp ↑のリンクを開いて、cd .Quine したところにある CML_quine.rb がそれです。 cat CML_quine.rb とすると中身が見えます。ruby CML_quine.rb すると動きます。 CalorieMate-Liquid-Quine 実行してみましたか?サイト上で気楽に実行できるので、ぜひ試してみてください。 これがどういうプログラムなのか、簡単に解説しておきます *1 。 ローカルでの遊び方 サイト上で ruby CML_…
5年前

CPU律速なRuby/Pythonコードはデフォルト設定のdocker上で遅くなる
まめめも
English version 要約 dockerはデフォルトでセキュリティ機構(Spectre脆弱性の対策)を有効にします。この影響で、RubyやPythonのようなインタプリタは速度が劣化します。特にCPU律速なプログラムで顕著に遅くなります(実行時間が倍くらいになることがあります)。 現象 Rubyで1億回ループするコードを、直接ホスト上で実行する場合と、docker上で実行する場合で実行時間を比較してみます。 直接ホスト上で実行した場合: $ ruby -ve 't = Time.now; i=0;while i<100_000_000;i+=1;end; puts "#{ Time.…
5年前

Rubyのテストのややこしい失敗を直した話
まめめも
Ruby の CI 維持業というのはこんな感じという事例紹介。 CIを観察する RubyのCIがときどき次のように失敗していました。 1) Error: TestM17N#test_object_inspect_external: Encoding::CompatibilityError: incompatible character encodings: UTF-8 and UTF-16BE /tmp/ruby/v2/src/trunk-test-random/test/ruby/test_m17n.rb:311:in `encode' /tmp/ruby/v2/src/trunk-test…
5年前

山手Quineが高輪ゲートウェイをサポートしました
まめめも
2009年に、実行するたびに東京→神田→秋葉原→...と進んでいき、一周したら元に戻る『山手Quine』というのを作りました。 mametter.hatenablog.com あれから11年経ち、駅の方が増えるという理由で、まさかのバージョンアップをしました。 github.com 当時のソースコード(正確には、ソースコードのソースコード)は残ってなかったので、だいたい作り直し。高輪ゲートウェイの名称が発表された日にはできてたんですが、公開するのを忘れてました。 なお、「高輪ゲートウェイなんか見たくない」という人は、環境変数 NO_TGW=1 を設定すればスキップできます。 こういうプログラム…
5年前

パイプライン演算子の歴史
まめめも
(You can read this article in English.) Ruby の開発版にパイプライン演算子(pipeline operator)が試験的に導入されましたが、いろいろあってプチ炎上になっています(チケット)。 せっかくの機会なので、パイプライン演算子の歴史を調べてみました。付け焼き刃の調査なので、間違ってたら教えてください。 パイプライン演算子とは こんな感じのものです。 x |> f |> g |> h # h(g(f(x))) と同じ意味 h(g(f(x))) という関数適用の式は、関数が呼ばれる順序(f→g→h)と、プログラムの字面上の順序(h→g→f)が逆でわ…
6年前

新雑誌「n月刊ラムダノート」の『「コルーチン」とは何だったのか?』の草稿を公開します
まめめも
『Ruby でつくる Ruby』などでお世話になっているラムダノートが、新しい雑誌「n月刊ラムダノート」を創刊しました。 www.lambdanote.com コンピュータ関係の技術情報の記事だけが載るそうです。創刊号は、『TCPの再送制御機構』、『「コルーチン」とは何だったのか?』、『MLOpsの歩き方』、の 3 本です。 『TCP の再送制御機構』は、パケットを送ってから返事が来るまでの RTT (Round-Trip Time) を計測する方法や、RTT を使った再送のアルゴリズムや、RTT を使わない再送のアルゴリズムなど、TCP の再送に関する仕様・実装の歴史から最新提案までを、日本…
6年前

ruby 0.62 のソースコードを復活させた
まめめも
RubyKaigi の後夜祭で、akr さんが「327 種類の Ruby をビルドする方法 〜0.49 から 2.6.0-preview2 まで〜」という発表をされていました。RubyKaigi 2018 After Party で話したスライドです: 「327 種類の Ruby をビルドする方法 ~0.49 から 2.6.0-preview2 まで ~」https://t.co/J5MXgM2PNN— Tanaka Akira (@tanaka_akr) 2018年6月4日その中で、ruby-0.62.tar.gz と ruby-0.63.tar.gz のファイルは「gzip 形式じゃないと…
7年前

emruby: emscripten でブラウザで動く MRI
まめめも
(この記事は Ruby 25th anniversary のための寄稿です)Ruby をブラウザで動かすというと Opal ですが、他の選択肢として、C で書かれた Ruby 処理系を emscripten で JS に変換するという選択肢もあります。 しかし調べてみたところ、mruby を WebAssembly に変換した記録は見つかりましたが、MRI でやった例が見つけられなかったので、やってみました。 デモ https://mame.github.io/emruby/ 手順 https://github.com/mame/emruby/ に書いてあるとおりです。ビルドコマンドは次の通り…
7年前

SA-IS 法のメモ
まめめも
suffix array を線形時間で構築する SA-IS 法についてのメモです。SA-IS 法の解説はわりと世の中にいっぱいありますが、実際のプログラムにする方法がよくわからなったり、どうしてそれでうまく行くのか書かれてなくて気持ち悪かったりするものが多くて、自分の望む感じのものがありませんでした。アルゴリズムは当然プログラムで見たいし、厳密な証明は要らないけど直観的な理由は知りたい。ということで、自分なりの理解を書いてみました。 suffix array とは 文字列の suffix とは、文字列の途中から最後までの部分文字列のことです。題材の文字列を "mmiissiissiippii"…
7年前

『テスト駆動開発』を読んで
まめめも
テスト駆動開発posted with amazlet at 17.10.12Kent Beck オーム社 売り上げランキング: 563Amazon.co.jpで詳細を見るオーム社さまから電子書籍を贈本いただきました。ありがとうございます。本書はテスト駆動開発(TDD)の原典で、たいへん有名な本です。が、自分は食わず嫌いで読んだことがありませんでした。というか、TDD 自体もちゃんと理解したことがありませんでした。なんだろう、なんか怖かった。そんな自分が今回この本をいまさら読んでみたら、なるほどこれは確かにいい本でした。なんというか、語りたくなる感じ。ということでご紹介。 紹介 テストとプログラ…
8年前

RubyKaigi 2017 の予稿:An introduction and future of Ruby coverage library
まめめも
RubyKaigi 2017 の 2 日目に "An introduction and future of Ruby coverage library" というタイトルで発表します。事前資料の公開が推奨されていたので、簡単ですがどんな内容かを書いておきます。 要約 カバレッジ(テストカバレッジ、コードカバレッジ)は、ソースコードのどの程度の割合がテストによって実行されたかを表す指標で、「テストの良さ」に関するヒントを与えてくれるものです。Rubyでは、品質を保証する手段がいまのところテストしかないので、カバレッジをうまく使うことは重要です。本発表では、我々が経験や見聞を通じて得たカバレッジとの…
8年前

『Ruby でつくる Ruby』の購入方法
まめめも
書籍『Ruby でつくる Ruby』が発売されて 2 月ほど経ちました(当時の告知)。いろいろなところでわりと好意的な感想が聞こえてくるので、うれしい限りです。 本書はラムダノートにとっての最初の出版ということで、発売当初は直販サイトでしか入手できませんでした。しかし最近は、販路開拓が進んだようで購入手段が増えてきました。まだ買ってない人のために、簡単にご紹介。 ラムダノート直販サイト ref: https://www.lambdanote.com/products/ruby-ruby 直販サイトです。よく知らないサイトで物を買うのは不安かもしれませんが、実体は Shopify という有名なオ…
8年前

"Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます
まめめも
純粋関数型データ構造posted with amazlet at 17.03.16Chris Okasaki KADOKAWA (2017-04-28)売り上げランキング: 266Amazon.co.jpで詳細を見る伝説の名著、"Purely Functional Data Structures"(通常 PFDS)を翻訳しました。4 月末にアスキードワンゴから発売されます。『20分でわかる Purely Functional Data Structures』などを通じて日本に PFDS を布教した @kinaba との共訳です。ちなみに編集さんはアスキードワンゴ編集長の鈴木嘉平さん。 関数型プ…
8年前

書籍『Ruby でつくる Ruby』が発売されます
まめめも
RubyでつくるRuby ゼロから学びなおすプログラミング言語入門www.lambdanote.comおかげさまで、ASCII.jp で連載していた『Ruby で学ぶ Ruby』が紙の本になる運びとなりました。わーい。『Ruby でつくる Ruby ― ゼロから学びなおすプログラミング言語入門』と微妙にタイトルが変わったので注意。一番大切なことを先に言っておくと、書店に並ぶ予定はありません。ラムダノート株式会社という出版社の直販サイトで購入できます。アスキーじゃないの?と聞かないでください。追記:今はいろいろ購入方法が増えました。『Ruby でつくる Ruby』の購入方法をご参照ください。ラム…
8年前

どうぶつしょうぎ名人
まめめも
どうぶつしょうぎ AI を作りました。絶対に勝てません。無力感を味わってください。ref: http://mame.github.io/dobutsu-shogi-master どうぶつしょうぎとは 3 マス x 4 マスの単純化された将棋です。ライオン(王相当)、ぞう(1 マスしか進めない角行)、キリン(1 マスしか進めない飛車)、ひよこ(歩相当、にわとりに成ったら金相当)の 4 種類の駒を動かして、相手のライオンを取るか、トライ(ライオンを一番奥の行まで運ぶ、ただし直後に取られる場合はだめ)に成功すれば勝ちです。詳しくは Wikipedia の記事を見てください。 どうぶつしょうぎは後手必…
8年前