タグ

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

  • 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リバーシの神 - まめめも
  • アニメ「Sonny Boy」の『難解』プログラムの解説 - まめめも

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

    アニメ「Sonny Boy」の『難解』プログラムの解説 - まめめも
  • 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.104s user 0m36.952s sys 0m0.333s 変更後: $ time ruby -I lib bin/gem install --no-doc aws-sdk Successfully

    rubygems を 1.5 倍に高速化した方法(stackprof --d3-flamegraph の使い方) - まめめも
    rochefort
    rochefort 2020/09/14
    確かにインスタンスの生成しすぎというのは、よくありそう。
  • カロリーメイトリキッドの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_quine.rb をするだけでも楽しめますが、自分のパソコンに保存するとより楽しめます。 まず、cat CML_quine.rb した中身をまるごとコピーしてください。 n=2;で始まる行の頭から、'

    カロリーメイトリキッドのQuineを書きました - まめめも
    rochefort
    rochefort 2020/08/09
    すごすぎ // exit のときもかっこいい
  • 超簡単に Ruby プログラムを exe にする新しい方式 (構想) - まめめも

    exerb は 1.9 に対応してないし、いろいろオーバースペックだと思う。ocra はテンポラリフォルダに展開して実行するのがダサすぎて論外。(参考) ということで、すごくシンプルに Ruby プログラムを exe 化する方式を考えてみました。 デモ # t.rb puts "test!"これを exe にしたい。こうします。 C:\Ruby>copy /B ruby.exe+t.rb t.exe ruby.exe t.rb 1 個のファイルをコピーしました。実行する。 C:\Ruby>t test!動いた! つまり、インタプリタとスクリプトをファイル結合するだけで exe にできてしまいます。 実装 Ruby にパッチをあててビルドする必要があります。やってることは自己解凍書庫と同じ感じです。 ruby.exe のファイルサイズをバイナリリソースとして ruby.exe 自身に持たせて

    超簡単に Ruby プログラムを exe にする新しい方式 (構想) - まめめも
    rochefort
    rochefort 2017/01/11
    こんなことできるのか
  • 『Rubyで学ぶRuby』連載開始 - まめめも

    RubyRuby を作りながら Ruby を学ぼう!」というトンデモ連載企画、『Ruby で学ぶ Ruby』を ascii.jp で始めました。 ref: http://ascii.jp/elem/000/001/228/1228239/ 何を言ってるかわからないかもしれないので補足すると、「Ruby(言語)で Ruby(のインタプリタ)を作りながら Ruby(でのプログラミング)を学ぼう!」ということです。Ruby でのプログラミングを学ぶなら、Ruby インタプリタ以上の題材はありません(断言)。Ruby というプログラミング言語の質を、外側(ユーザ視点)と内側(処理系実装者視点)の両面で見ていきます。 対象読者は「Rubyを学びたいプログラミング初心者」です。Ruby 言語について最低限のことを伝えるところから始めるので、すでに Ruby を知っている人はダルく感じるかもし

    『Rubyで学ぶRuby』連載開始 - まめめも
  • 川崎 Ruby 会議 01 で基調講演しました - まめめも

    8/20 (土) に、川崎教育文化会館で川崎 Ruby 会議 01 が行われました。恐れながら、基調講演なるものをさせて頂きました。 Ruby で高速なプログラムを書く from mametter 内容は、東京 Ruby 会議 05 で話した Optcarrot の完全版でした。基調講演というと「その会合や分野の基方針を示す講演」ですが、Ruby 会議関係の基調講演で(Matz の発表以外で)そういう感じの発表を見たことがなかったので、単に好きなことを話しました。 東京 Ruby 会議 05 の方では細かい実装技法の話しかしなかったので、我ながら偉そうだなーと思いながらも「最適化についての心構え」なるものを語ってみました。こんな感じ。 目標値を決めろ:最適化とはコードを汚すことなので、どこまで汚すかを事前に決めるべき。 ボトルネックをいじれ:ボトルネック以外をいじるな。(ボトルネックを特

    川崎 Ruby 会議 01 で基調講演しました - まめめも
    rochefort
    rochefort 2016/09/08
    rubyの話ししたら負けなのか
  • ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも

    明日から 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 なぜこんなことが起きるのか ハ

    ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも
    rochefort
    rochefort 2015/12/14
    へー
  • Ruby 2.0 リリース週記 (2012/05/21 - 27) - まめめも

    今週も、今週入ったばかりの新機能を紹介します。ちょっと地味というか、細かい話ですが。 今週のニュース: caller の改善で文字列のパースが不要に 背景 かつてより、コールスタックを配列として取り出す機能 Kernel#caller があります。 def foo caller(0).each {|x| p x } end def bar foo end def baz bar end baz $ ./ruby test.rb "test.rb:2:in `foo'" "test.rb:6:in `bar'" "test.rb:10:in `baz'" "test.rb:13:in `<main>'"こんな感じ。ここからファイル名だけを取りたいと思ったら、文字列の先頭からコロンまでを切り出す処理が必要です (そういう処理をパースといいます) 。Ruby ではパースは正規表現で簡単にできるも

    Ruby 2.0 リリース週記 (2012/05/21 - 27) - まめめも
    rochefort
    rochefort 2012/05/28
    caller(0).each {|x| p x }
  • Ruby 2.0 リリース週記 (2012/05/14 - 20) - まめめも

    Ruby 2.0.0 のリリースに向けた活動について、毎週くらいのペースで書きたいなあと思ったので始めます。飽きたらやめます。 ユーザ視点で面白そうな機能や、リリースに向けた進捗について書くつもりです。コミット単位の詳しいニュースは nagachika さんの ruby-trunk-changes を見るといいです。 Ruby 2.0 について Ruby 1.8 、1.9 に続く Ruby の新系統です。 新系統といっても、RubyKaigi 2010 の開発者会議にて、まつもとさんから「100% 互換」のスローガンが発表されていますので、原則として仕様変更は入らない予定です。*1 今のところ 2.0 に入ることが発表されている大きめの新機能は、 Module#prepend キーワード引数 の 2 点です。[ruby-core:39837] それぞれの詳細は、そのうち説明したいと思います

    Ruby 2.0 リリース週記 (2012/05/14 - 20) - まめめも
  • enumerabler.rb: Enumerable の遅延評価版メソッドライブラリ - まめめも

    たとえば整数の配列から、条件に合う要素のうち、最初に現れる 10 個だけ拾いたいとき、どうしますか? ary.select {|x| x.even? }.take(10) ↑これは非常に明瞭なプログラムです。しかし select は、最初の 10 個だけでなく全要素をチェックしてしまうため、ary が大きいと無駄にループします。また、select の戻り値となる中間配列も無駄です。 ret = [] ary.each do |x| ret << x if x.even? break if ret.size == 10 end ↑これなら 10 個見つかった時点で終了してくれるし、無駄な配列確保もありません。しかし非常に強引で原始的で煩雑なプログラムであり、Ruby 1.9 の時代を迎えた新人類である我々には、可読性やメンテナンス性に問題があると言わざるを得ない。一言で言うと品がないのです。

    enumerabler.rb: Enumerable の遅延評価版メソッドライブラリ - まめめも
  • RubyKaigi 2010 終了 - まめめも

    参加してました。 「超絶技巧 Ruby プログラミング」の発表資料と、発表で使ったソースコードを以下に置いておきます。 ref: http://dame.dyndns.org/misc/rubykaigi2010/rubykaigi2010-endoh.ppt ref: http://dame.dyndns.org/misc/rubykaigi2010/rubykaigi2010-endoh.zip 追記: slideshare にもアップロードしました。でも一部崩れてるので、なるべく ppt でご覧ください。 @mrkn さんに「pdf に直してからアップロードすればよい」と教えてもらいました! 超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby ProgrammingView more presentations from mametter. 動

    RubyKaigi 2010 終了 - まめめも
  • Ruby とすてきな難読化 - まめめも

    (これは Ruby Advent Calendar jp: 2009 の 16 日目の記事です。) Ruby は読みやすいプログラムを簡単に書ける言語ですが、読みにくいプログラムも簡単に書けます。 今回は、Ruby でできるかんたんな難読化のテクニックを 4 つ紹介します。 1. Integer#to_s を使う方法 Integer#to_s *1 は、何進数として文字列化するかを引数で指定できます。普通は 2 、10 、16 くらいしか使わないと思いますが、実は 36 まで指定できます。 0.to_s(36) #=> "0" 1.to_s(36) #=> "1" ... 8.to_s(36) #=> "8" 9.to_s(36) #=> "9" 10.to_s(36) #=> "a" 11.to_s(36) #=> "b" ... 34.to_s(36) #=> "y" 35.to_s(

    Ruby とすてきな難読化 - まめめも
    rochefort
    rochefort 2009/12/16
    難読化。すごいけど、、
  • Ruby で png 画像を自力で生成する - まめめも

    「png のフォーマットは gif に比べて難しい」などと聞いたことがありましたが、zlib が使える処理系なら、簡単な png 画像はそこそこ簡単に (ビット演算など不要で) 作れるみたいです。 2015/03/12追記:この記事は単なる知的好奇心で自力 png 生成しているに過ぎません。以下のサンプルコードもデモに過ぎないので、実用目的で使うことはおすすめしません。Ruby でベタデータの png 化をしたい人は chunky_png を、綺麗な絵を書きたい人は rcairo を使うといいと思います。 まずはサンプルコード 黒から赤へのグラデーション画像を作るプログラム。 # coding: UTF-8 require "zlib" width, height = 100, 20 depth, color_type = 8, 2 # グラデーションのベタデータ line = (0...

  • Ruby 1.9 の新機能もうひとめぐり (前編) - まめめも

    ref: Ruby Freak Lounge 第1回 Ruby1.9の新機能ひとめぐり(前編):YARV,Fiber,配列処理の強化 の補足など。 YARV (Yet Another Ruby VM) による高速化 いきなり編とあまり関係ないんだけど、高速化のまめ知識をひとつ。 YARV では while や if のようなプリミティブの構文が最適化されています (というか、Ruby の中で数少なく最適化の余地があったところ) 。そのため、1.9 では C メソッドやブロックを呼び出すより while を使ったほうが速いです。 # 1.8 で 13 秒、1.9 で 2.4 秒 n = 0 while n < 50000000 n += 1 end # 1.8 で 6.5 秒、1.9 で 5.0 秒 50000000.times {|n| } # 1.8 で 4.3 秒、1.9 で 4.8

    Ruby 1.9 の新機能もうひとめぐり (前編) - まめめも
  • 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 の新機能を寸評する - まめめも
  • 1