タグ

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

  • 告知:「超絶技巧プログラミング」の本を書いてます - まめめも

    突然ですが告知です。今までこの日記とかで公開してきた奇妙なプログラムを集めて、を書くことになりました。今日はエイプリルフールではありません。 コンセプトは、「実務に役立たないプログラミング」です。誰得?という声が聞こえてきそうですが、手段としてのプログラミングしか知らない人に、一味違うプログラミングの楽しさを知ってもらうきっかけになればいいなとか考えてます。 という建前ですが、内容は完全にアレです。新作を含む30以上のプログラム紹介と、その開発技法の解説をとうとうと語っています。当に誰得なですが、Qlobe とか Merry Quine-mas とか Quine リレーとか ASCII Fluid とか小文字だけ Ruby プログラムとか放射線耐性 Quine とかについて、ネタバレを知りたい人 (誰?) や自分でも書いてみたい人 (誰?) は必読です。 あと、どんな風にネタを考

    告知:「超絶技巧プログラミング」の本を書いてます - まめめも
  • 放射線耐性 Quine (1 文字消しても動く Quine) - まめめも

    ref: https://github.com/mame/radiation-hardened-quine 放射線はメモリエラーを引き起こすらしいです。そんな放射線が飛び交う過酷な環境でも、できることなら Quine したい。 ということで、プログラム内の 1 文字をランダムに消しても元のプログラムを出力する、なんともロバストな Quine を書きました。*1 何を言っているかわからないと思いますが、こんなふうに動くものです。 # ランダムに 1 文字消すスクリプト $ cat mutate.rb src = $<.read src[rand(src.size), 1] = "" print src # rrquine.rb からランダムに 1 文字消したプログラムを生成する $ ruby mutate.rb rrquine.rb > broken.rb # 壊れたプログラムを実行する (

    放射線耐性 Quine (1 文字消しても動く Quine) - まめめも
  • SAT ソルバで数独を解く方法 - まめめも

    数独は非常に SAT に変換しやすい問題です。全部参考文献 *1 に載っている内容ですが、なるべくわかりやすく説明してみます。ちょっと長いです。 SAT とは まず SAT をごく簡単に説明します。すでに SAT を知っている人はここは読み飛ばしてください。 命題論理式の形の一つに乗法標準形のというのがあります。変数か変数の否定 (リテラルと言います) を or だけでつないだ式 (節と言います) を and だけでつないだ論理式のことを言います。つまり以下みたいな形です。 ( a1 or !a2 or ... or an) and ( b1 or !b2 or ... or !bn) and ... and (!z1 or z2 or ... or !zn)SAT は「a1 や zn などの変数にうまく true か false を代入して、上の式全体を true にできるか」という問題

    SAT ソルバで数独を解く方法 - まめめも
  • Quine リレー - まめめも

    ref: https://github.com/mame/quine-relay/ 以下は、自分自身を出力する REXX プログラムを出力する Python プログラムを出力する R プログラムを出力する (...略...) を出力する Scala プログラムを出力する Ruby プログラムです。合計 50 言語を使います。 eval$s=%q(eval(%w(B=92.chr;N=10.chr;n=0;e=->(s){s.gsub(/[#{B+B+N}"]/){B+(N==$&??n:$&)}};E=->(s){'("'+e[s]+'")'} ;d=->(s,t=?"){s.gsub(t){t+t}};D=->(s,t=?@){s.gsub(B){t}};Q=->(s,t=?$){s.gsub(t){B+$&}};puts(eval(%q("objectXQRX extendsXApp{

    Quine リレー - まめめも
  • メジャーな数学関数を自力計算する - まめめも

    三角関数や対数などの近似計算の方法を短い Ruby コードでご紹介。だいたいマクローリン展開です。 子供のころ何気なく sin とか log とか使っていて、ふと「コンピュータはどうやってこの値を計算してるんだろう」と思ったものです。そんな昔の自分に見せてあげたいエントリ。と言っても、今時のコンピュータは FPU 持ってるんでこんな計算してませんが。 なお、ちゃんとテストしてません。 三角関数 0 に近い方が精度高いです。99 とか 98 とかは適当に大きな数字。 def sin(x) r, f = 0, 1 1.step(99, 2) do |i| r += x ** i / f f *= -(i+1)*(i+2) end r end def cos(x) r, f = 0, 1 0.step(98, 2) do |i| r += x ** i / f f *= -(i+1)*(i+2)

    メジャーな数学関数を自力計算する - まめめも
  • 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 の訳本「型システム入門 -プログラミング言語と型の理論-」が発売されます - まめめも
  • 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) - まめめも
    nsyee
    nsyee 2012/05/22
  • 超簡単に 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 にする新しい方式 (構想) - まめめも
  • 音声の波形からピッチを検出するアルゴリズム - まめめも

    去年のクリスマスに公開したカラオケ機能つき Quine の仕組みについて。 ref: 声の高さで操作するゲームを作ってみた で解説されている内容と同一です。おわり。 で終わるのもつまらないので、簡単に解説します。でも思いだしながら書いているので嘘書いてたらごめんなさい。動画には図とかあるので、やはりそっち見た方がいいと思うけど。 「ピッチ検出なんて FFT するだけでしょ」と思ってる人は素人で、音叉みたいにきれいな正弦波を測りたいならともかく、声や楽器の音など倍音を含んだ音では誤判定が起きまくるようです。偉そうなこと言ってる私も素人です。そこで、Wikipedia の Pitch detection algorithm で挙げられている、MPM アルゴリズムを調べて実装してみました。以下の論文。 ref: P. McLeod and G. Wyvill. A smarter way to

    音声の波形からピッチを検出するアルゴリズム - まめめも
  • Ruby に callcc を公式にサポートさせよう - まめめも

    Ruby の callcc というと、 現在の Ruby の Continuation は欠陥品で、まともに利用できないシロモノです。具体的には、dynamic-wind 相当の機能がありません。 (略) ちなみに、dynamic-wind 相当の機能を入れるのは、拡張ライブラリを全部 callcc safe にする作業に相当しますので、現実的じゃないんじゃないかなぁ、と思っています。 ruby-dev:30988 という話があって、「そっかー欠陥品なのかー」「直すのも難しいのかー」と悲しんでいました。 が、dynamic-wind を実装するだけなら広範囲の修正は不要なことに気がつきました。つまり直すのは簡単。というエントリ。 その前に: dynamic-wind とは dynamic-wind とは、継続呼び出しで指定した範囲に突入したり脱出したりするときに起動するハンドラを設定する関

    Ruby に callcc を公式にサポートさせよう - まめめも
  • Software Abstraction 翻訳本のレビュワー募集 - まめめも

    Alloy とかいう形式仕様記述言語があります。ソフトウェアの仕様を形式的に記述して検証とかして、上流設計をうまいことこなしちゃおう、とかいうアレです。 で、Alloy の教科書とされる「Software Abstractions: Logic, Language, and Analysis」というがあります。 Software Abstractions: Logic, Language, and Analysisposted with amazlet at 11.02.09Daniel Jackson The MIT Press 売り上げランキング: 28680 Amazon.co.jp で詳細を見る ↑ここぞとばかりにアフィリエイト入ってみた。みんな絶対買うなよ! で、最近このの翻訳に関わってました。bonotake さんや masahiro_sakai さんのお手伝い的な感じに。

    Software Abstraction 翻訳本のレビュワー募集 - まめめも
    nsyee
    nsyee 2011/02/10
  • concov 0.1 リリース - まめめも

    デモ: http://dame.dyndns.org:7001/ ソース: http://github.com/mame/concov/ 時系列に注目したコードカバレッジビューア concov をリリースします。concov は continuous coverage (造語) の略で、コードカバレッジの変化の追跡が簡単にできます。 背景 Ruby のテストメンテナ (自称) としての実体験として感じたことですが、コードカバレッジというのはテストを書けば一旦は上がりますが、その後何もしないとさまざまな要因で徐々に下がっていきます *1 。対策として、実行 (カバー) されなくなる箇所が発生したらそこをカバーするようなテストを継続的に足していく (テストをメンテナンスする) ことが有効ですが、カバーされなくなった箇所を同定するのは非常に面倒な作業でした。 concov とは? カバーされなく

    concov 0.1 リリース - まめめも
  • exhaustive な switch - まめめも

    OCaml ではパターンマッチの抜けを警告してくれます。Haskell より OCaml の方が好きな点の 1 つです*1。 type t = Foo | Bar | Baz let f = function Foo -> "foo" | Bar -> "bar" $ ocamlc pat-test.ml File "pat-test.ml", line 2, characters 8-44: Warning P: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: Baz今日気がついたのですが、gcc でも enum に対して同様のチェックをしてくれるようです。 enum t { foo, bar, baz }; char *f(enum t x) { sw

    exhaustive な switch - まめめも
  • 日本語の Coq 情報 - まめめも

    ついでに、主に日語の Coq 情報を (10 分で思い出せる範囲で) まとめてみます。順不同。 公式に近い情報 家 Coq'Art (Coq の教科書) Cocorico! (家 Coq wiki) CiteSeer (笑) Coq のことをまとめようとしている wiki 菊さんの Coq wiki Tossy-2 の Coq wiki たまに Coq のことが書いてあるブログ yoshihiro503 さんのブログ (LL 魂で Coq の発表をされた方、Coq の話ばっかり) いまいけいごさんのブログ 菊さんのブログ Tossy-2 のブログ あろはさんのブログ (2006/04 〜 05 頃) 他にもちらほら見かけるはずなのですが、ちゃんとメモしてなかったので思い出せません。見つけたら自発的に適宜追加するかもしれませんが、教えてもらえると助かります。

    日本語の Coq 情報 - まめめも
  • 猿でも持ち上げられるモナド - まめめも

    最近やっとモナドの持ち上げ方を理解した気分になりました。StateT + IO 限定で。 State モナドを使って以下のようなコードを書いていたとき、 module Main(main) where import Control.Monad.State -- 階乗計算 fact :: State (Int, Int) Int fact = do (a, b) <- get -- (A) if a == 0 then return b else do modify $ \(a, b) -> (a-1, a*b) fact main :: IO () main = do let x = evalState fact (10, 1) print x コメントの (A) の位置で (a, b) の値を表示したくなったときに使える技です。 module Main(main) where impor

    猿でも持ち上げられるモナド - まめめも
  • グローバル変数のモジュール性 - まめめも

    StateT が使えるようになったらグローバル変数みたいなものが簡潔に書けるのかなーと考えました。グローバル変数たちを集めた data 型を定義して、トップレベルは基的に StateT GlobalVars IO () 型にする感じ。 module Main(main) where import Control.Monad.State -- グローバル変数たち data GlobalVars = GlobalVars { fooField :: Int , barField :: Int } deriving Show -- トップレベルの型 type GlobalM = StateT GlobalVars IO -- トップレベル myMain :: GlobalM () myMain = do foo <- gets fooField -- foo を読み出す modify $ \g

    グローバル変数のモジュール性 - まめめも
  • brainfuck interpreter in Coq - まめめも

    Haskell 、Erlang の次のブームは Coq に違いありません。とりあえず基ということで、Coq でひねりのない brainfuck インタプリタを書いてみました。動作例。Coq のコードが色づけできないとは何事か。 Eval compute in (finite_execute " +++++++++[>++++++++>+++++++++++>+++++<<< -]>.>++.+++++++..+++.>-.------------.<++ ++++++.--------.+++.------.--------.>+. " "" 500). = "Hello, world!"%string : string 残念ながら (?) Coq では停止性が保障された関数しか定義できません。ここでは最大評価ステップを指定しないといけないという仕様にしてごまかしています (引数の 50

    brainfuck interpreter in Coq - まめめも
  • 1