タグ

ブックマーク / mametter.hatenablog.com (17)

  • Go言語の不満 - まめめも

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

    Go言語の不満 - まめめも
    gfx
    gfx 2023/02/13
  • 6x6リバーシの神 - まめめも

    絶対に勝てない6x6リバーシを作りました。あなたは黒番、AIが白番です。 絶対に勝てない6x6リバーシを作りました! ぜひ挑戦してみてくださいhttps://t.co/Ul5n3q9jMp— Yusuke Endoh (@mametter) December 30, 2021 これは何? 6x6の盤面のリバーシは後手必勝 *1 であることが知られています。 このAIは白番(後手)で完璧にプレイします。つまり黒番のあなたは絶対に勝てません。無力感を楽しんでください。 技術的な話 このAIWebAssemblyになっているので、全部あなたのブラウザの上で動いてます。真のサーバーレスです。 AIのソースコードはRustで書きました。わりと堅実なゲーム木探索になってます。UIは普通にTypeScriptとthree.jsで実装しました。 github.com 作った順に説明します。 盤面の表現

    6x6リバーシの神 - まめめも
    gfx
    gfx 2021/12/30
    AIをRustで実装してwasmにしてブラウザで動かすアプリ。
  • CPU律速なRuby/Pythonコードはデフォルト設定のdocker上で遅くなる - まめめも

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

    CPU律速なRuby/Pythonコードはデフォルト設定のdocker上で遅くなる - まめめも
    gfx
    gfx 2020/05/23
  • 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-random/test/ruby/test_m17n.rb:311:in `inspect' /tmp/ruby/v2/src/trunk-test-random/test/ruby/test_m1

    Rubyのテストのややこしい失敗を直した話 - まめめも
    gfx
    gfx 2020/03/24
  • パイプライン演算子の歴史 - まめめも

    (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)が逆でわかりにくいとされます。この問題は、特に、関数が大きくなったときに顕著になります。 wonderful_process_h( marvelous_process_g( fantastic_process

    パイプライン演算子の歴史 - まめめも
    gfx
    gfx 2019/06/15
  • emruby: emscripten でブラウザで動く MRI - まめめも

    (この記事は Ruby 25th anniversary のための寄稿です) Ruby をブラウザで動かすというと Opal ですが、他の選択肢として、C で書かれた Ruby 処理系を emscripten で JS に変換するという選択肢もあります。 しかし調べてみたところ、mrubyWebAssembly に変換した記録は見つかりましたが、MRI でやった例が見つけられなかったので、やってみました。 デモ https://mame.github.io/emruby/ 手順 https://github.com/mame/emruby/ に書いてあるとおりです。 ビルドコマンドは次の通り。 $ emconfigure ./configure CFLAGS="-m32 -s EMULATE_FUNCTION_POINTER_CASTS=1" $ emmake make V=1 mi

    emruby: emscripten でブラウザで動く MRI - まめめも
    gfx
    gfx 2018/02/15
    “MRI は関数ポインタについてあまり行儀がよくない(3 引数の関数に 4 つの引数を渡すとかがそこらじゅうにある)”
  • "Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます - まめめも

    純粋関数型データ構造posted with amazlet at 17.03.16Chris Okasaki KADOKAWA (2017-04-28) 売り上げランキング: 266 Amazon.co.jpで詳細を見る 伝説の名著、"Purely Functional Data Structures"(通常 PFDS)を翻訳しました。4 月末にアスキードワンゴから発売されます。 『20分でわかる Purely Functional Data Structures』などを通じて日に PFDS を布教した @kinaba との共訳です。ちなみに編集さんはアスキードワンゴ編集長の鈴木嘉平さん。 関数型プログラマ向けの紹介 「リストの結合が O(n) で遅いな」とか「まともなキューはどうやって作るの」とかいった問題に一度は直面したことがありますよね。純粋関数型プログラミングではどうしても無理、

    "Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます - まめめも
    gfx
    gfx 2017/03/18
  • Quine Tweet: 自分自身へのリンクを持つ再帰的ツイート - まめめも

    This tweet is recursive. https://t.co/bZISaPd3Ts— Quine Tweet (@quine_tweet) 2016年9月19日 「このツイートはありません」となっていますが、URL をクリックすれば自分自身に飛べます。 以下、このツイートが生まれるまでの経緯を長々と書きます。 問題設定 そのツイート自身の URL を埋め込んだツイートを作ります。ツイートの URL はツイートをした後でないと決まらないし、ツイート文面を後から更新する手段はない(と思う)ので、単純ですが意外に難しい問題です。 調査 ご存知のように、現在のツイートの URL は次のような形式です。 https://twitter.com/<username>/status/<id>username はそのままなので、id を事前に予測できれば解決です。*1 調べてみるとこの id

    Quine Tweet: 自分自身へのリンクを持つ再帰的ツイート - まめめも
    gfx
    gfx 2016/09/20
    "期待値で言うと 200 万回のツイートで 1 回成功する計算になります"
  • Optcarrot: Ruby で書かれたファミコンエミュレータ - まめめも

    ウソみたいな当の話。Ruby でファミコンエミュレータを書いてみました。 気になる速度ですが、自分の環境では 20 fps ちょっと出ます。ファミコンは 60 fps なので、実速の 1/3 です。Ruby3x3 (Ruby 3 は Ruby 2 の 3 倍速い)という matz の宣言が実現すれば、実速が達成されることになりますね! 試してみたい人はこんなふうに実行してください。 $ gem install ffi $ git clone http://github.com/mame/optcarrot.git $ cd optcarrot $ bin/optcarrot examples/Lan_Master.nesSDL2 か SFML が適切にインストールされている必要があります。Debian/Ubuntu なら apt-get install libsdl2-dev で。 Ru

    Optcarrot: Ruby で書かれたファミコンエミュレータ - まめめも
    gfx
    gfx 2016/04/01
    情報量が多すぎて頭が追いつかないぞ…。
  • ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも

    明日から RubyKaigi なので、ちょっとした小ネタを一つ。 例えば、0 から 9999 までをハッシュに順に入れます。 h = {} 10000.times do |n| h[n] = true end このとき、h[9998] や h[9999] は、h[0] や h[1] より高速です。 どのくらい高速かというと、 1_000_000_000.times { h } # 40.8 sec (ループ自体の速度) 1_000_000_000.times { h[9999] } # 57.2 sec 1_000_000_000.times { h[0] } # 89.1 sech[0] は 89.1 - 40.8 = 48.3 nsec 、h[9999] は 57.2 - 40.8 = 16.4 nsec ということになります。なんと 3 倍も速い。*1 なぜこんなことが起きるのか ハ

    ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも
    gfx
    gfx 2015/12/10
  • [Ruby] Ruby 3.0 の特大の非互換について - まめめも

    タイトルは釣りです。すみません。Ruby 3.0 はかなり先の将来の話なので、最終的にどうなるかはわかりません。でも Ruby 3.0 に重大な変更が予定されているのは事実なので、一緒に考えて欲しいと思います。 immutable string literal Ruby 3.0 では文字列リテラルをデフォルトで immutable (破壊的変更不可) にする、という方針が『決定』しました。(Feature #11473: Immutable String literal in Ruby 3) つまり、次のようなプログラムが動かなくなります。(当チケットから少し改変して引用) sql = "SELECT #{sec_id}, pt.path, st.doc_count " sql << "FROM #{stats_tablename} AS st " #### ←ここで例外: can't m

    [Ruby] Ruby 3.0 の特大の非互換について - まめめも
    gfx
    gfx 2015/10/05
  • TAPL の訳本「型システム入門 -プログラミング言語と型の理論-」が発売されます - まめめも

    プログラミング言語の「型」の定番書と言われる Types and Programming Languages (通称 TAPL) の翻訳が、ついに 3 月 26 日に発売されます。 型システム入門 −プログラミング言語と型の理論−posted with amazlet at 13.03.01Benjamin C. Pierce オーム社 売り上げランキング: 598 Amazon.co.jpで詳細を見る (↑アフィリエイトなのでクリックするなよ!) (個人的に) 読んで欲しい人たちへ 「型」の教科書ということで、わりと Ruby の対極にあるような内容ですが、Ruby ユーザ (動的型付き言語しか知らない人) にこそ読んで欲しいと思ってます。 PHP しか知らない人が PHP の良さを語るのが滑稽なように *1 、型がないことのメリット・デメリットを語るには、気で型がある言語の考え方を

    TAPL の訳本「型システム入門 -プログラミング言語と型の理論-」が発売されます - まめめも
    gfx
    gfx 2013/03/02
    Kindle版はまだかなー
  • gcov の使い方 - まめめも

    concov のドキュメントを書こうと思ったけれど、何から書くか困ったので、とりあえずその前に gcov の使い方とはまりどころを書いてみます。 gcov とは C 言語で書かれたプログラムのカバレッジを測定するツールです。gcc に付属しています。 基的な使い方 こういうコードがあるとする。 /* test.c */ #include <stdio.h> int foo(int x, int y) { return x + y; } int bar(int x, int y) { return x - y; } int main(void) { printf("%d\n", foo(2, 3)); printf("%d\n", foo(3, 4)); return 0; } コンパイルする。-coverage をつけると gcov 用のオブジェクトファイルが生成される *1 。 $ g

    gcov の使い方 - まめめも
  • Ruby の例外クラスは分類が粗すぎる or 細かすぎる - まめめも

    と思いません? def foo(x) end foo(1, 2) #=> wrong number of arguments (2 for 1) (ArgumentError) 1.step(10, 0) { } #=> step can't be 0 (ArgumentError) a = []; a << a a.flatten #=> tried to flatten recursive array (ArgumentError) 確かにどれも Argument に関する Error ではあるんだけど *1 、全部同じ例外クラスというのは粗すぎですよね。メッセージ読めば意味はわかるからデバッグには困りませんが、ArgumentError の中の特定の例外だけ拾いたいときに困ります。 具体的には、テストです *2 。例えば foo(1, 2) で wrong number of arg

    Ruby の例外クラスは分類が粗すぎる or 細かすぎる - まめめも
  • rope ライブラリ - まめめも

    ICFPC で話題になった rope/cord ですが、特定の言語環境でしか使えないのはもったいない話です。そこで Ruby の拡張ライブラリとして実装しようとしました。 rope とは 以下の特徴を持った文字列の実装です。 文字列と文字列の結合が速い (O(log n)) らしい 部分文字列の切り出しが速い (O(log n)) らしい 部分の書き換えはできない 指定位置からの文字の取り出しは遅い (O(log n)) でも一文字ずつ順にたどるのは実用上は O(n) らしい 詳しい話はいなばさんの解説なり元論文なりを見てください *1 。 実装方針 Boehm GC 付属の Cord のコードを Boehm GC なしで動くようにする (リファレンスカウントを実装する) 。 Ruby 側のインターフェイスは String 互換 (ただし破壊的操作と正規表現機能はなし) ただ、C の文字列

    rope ライブラリ - まめめも
    gfx
    gfx 2011/08/21
  • Quine ruBy - まめめも

    略して QB 。 eval s||= %q(1;t= %w(s.gs ub!(/\e.* ?m/,"");[ [ 0x26e885c a844a879e27 a,519,48, 5 , 9],[20182686,600,48,5,1],[4366,611,48 , 5 ,15],[432803624050570,533,0]].map { | r,m,*d|s[m+=r%74,0],r="\e[#{d*";"}m", r /74while(r>0)};puts((z=32.chr)*5+"eval#{z *39}s||=\n#{z*5}%q(#{(1+n=s.to_i)%3}#{s[1 ..- 1]})\n\n"+z*9*n+"5YOV44GvUnVieWlzdO OBq +OB quOBo+OBpuOBj+OCjOOBo+OBpuOAgeOBjeOBo eOC k+OB qOOBi um

    Quine ruBy - まめめも
    gfx
    gfx 2011/04/13
    なにこれどうなってるの!!!
  • ruby 1.9 を日常的に使うぼくが 1.9 の新機能を寸評する - まめめも

    なんか偉そうな見出しですが、ruby 1.9 を主に使うようになって 1 年ちょっと経ったので、1.9 の新機能に思うところや注意点などを書き残そうと思うのです。さらに 1 年後に見たとき、「あのころはあんなふうに考えてたなあ」などと感慨にひたる予定です。 あらかじめ断っておくと、ぼくの ruby 1.9 経験はすべて趣味範囲なので、エンタープライズとかシステム運用の問題とかは知りません。あとぼくは ruby のコミッタなので、色眼鏡もあると思います。あしからず。 YARV VM 実行になったという話。一般的には「速い」という文脈で語られます。1.8 と比べると確かに速いです。でも、1.9 ばかり使い出すとなんとも思わなくなるはずです。速さなんて相対的な価値ですから、当然ですけどね。好意的に考えれば、「なんとも思わない程度に、遅くて困ることが減った」のかもしれない。 コンパイルフェーズを挟

    ruby 1.9 を日常的に使うぼくが 1.9 の新機能を寸評する - まめめも
    gfx
    gfx 2009/01/28
  • 1