タグ

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

  • RubyKaigi 2017 の予稿:An introduction and future of Ruby coverage library - まめめも

    RubyKaigi 2017 の 2 日目に "An introduction and future of Ruby coverage library" というタイトルで発表します。事前資料の公開が推奨されていたので、簡単ですがどんな内容かを書いておきます。 要約 カバレッジ(テストカバレッジ、コードカバレッジ)は、ソースコードのどの程度の割合がテストによって実行されたかを表す指標で、「テストの良さ」に関するヒントを与えてくれるものです。Rubyでは、品質を保証する手段がいまのところテストしかないので、カバレッジをうまく使うことは重要です。 発表では、我々が経験や見聞を通じて得たカバレッジとの付き合い方を紹介します。簡単に言うと、カバレッジは「コードに対する網羅率」に過ぎず、「仕様や設計に対する網羅率」ではないことを理解した上で、前者だけでなく後者も上げるためのヒントとしてカバレッジを活

    RubyKaigi 2017 の予稿:An introduction and future of Ruby coverage library - まめめも
  • 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 で学ぶ Ruby』非公式あとがき - まめめも

    ref: http://ascii.jp/elem/000/001/230/1230449/ 「RubyRuby を作りながら Ruby を学ぼう!」という ascii.jp の連載、おかげさまでほぼ予定通りに無事に終わりました。執筆の経緯を書いておきます。 昨年の 6 月ごろ、「抽象によるソフトウェア設計」や「型システム入門」のときにおせわになった編集者の鹿野さんに声をかけて頂きました。「ふつうの Ruby 入門はもうたくさんあるので、ちょっと変わった Ruby 入門を書けないか」という話でした。 それを聞いた瞬間、「Ruby インタプリタの開発を通して Ruby を学ぶ」という構想が湧きました。Ruby は主に Web やテキスト処理を対象としているので、言語処理系や記号処理を題材にした入門は目新しそうだし、なによりそういうのに興味を持つ Ruby ユーザがもっと増えてほしい。

    『Ruby で学ぶ Ruby』非公式あとがき - まめめも
  • 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: 自分自身へのリンクを持つ再帰的ツイート - まめめも
  • 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 細かすぎる - まめめも
  • 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 で書かれたファミコンエミュレータ - まめめも
  • Writing Qlock - まめめも

    俺の卒業制作 書き時計 pic.twitter.com/NSBi45Lj77— K / $uzuki (@BellTreeNursing) 2016, 2月 7 うわーすごいなーと思ったので、パクリ インスパイアされてみました。Ruby プログラムで書き時計。 eval(T=%(eval(%(E=27.chr;Z=32.chr;$ ><<E+"[2J";K=->q{(q-q*(1-3844.0/q.abs2)**0.5) /2};I=->f,a,b,z,t=p{(a-b).abs>(f<1?1:1-(K[a]-c=K[b]). abs)?I[f,c= (a+b)/2,b,I [f,a,c,z,t],t :''''''''''''''''''''''''''''''': ]:f<1?(x,y=b. rect;d="'."[y%2 : : ];c=z[y/2+5];c[ x+=58]=t||(

    Writing Qlock - まめめも
  • TRICK 2015 結果発表 - まめめも

    RubyKaigi 2015 で発表させていただきました。 入賞作品はこちら。 https://github.com/tric/trick2015 発表資料はこちら。 http://www.slideshare.net/mametter/trick2015-results たくさんの投稿ありがとうございました!今回の入賞作は、発表会場でパッと見てうおおお!って言うのよりは、じっくり解析することでジワジワとスゲースゲーってなるのがたくさん入賞したので、ぜひ解析してみてください。 前回と比べて 2 倍程度の投稿があり、どれも面白いものばかりだったので、全部選べないのがとても残念でした。 他の審査員の方々もありがとうございました(ココ見てるかわかりませんが)。あと、投稿受け付けの事務局的なことからスライドのデザインまで、@hirekoke さんがやってくれました。感謝。 随時追記:観測した参加者

    TRICK 2015 結果発表 - まめめも
    TokyoIncidents
    TokyoIncidents 2015/12/11
    冬休みの宿題が増えた
  • [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 の特大の非互換について - まめめも
    TokyoIncidents
    TokyoIncidents 2015/10/04
    問題6に禿同。こんな変更入ったら Ruby を捨てても良い
  • 放射線耐性 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) - まめめも
  • ICFP Programming Contest 2013 Judges' Prize 受賞しました - まめめも

    わーい。 ICFPc での受賞は 7 年ぶり 2 回目 (前回) 。*1 コンテストの内容と自分の戦略はすでに書いた通りです。特に以下の点が評価されたそうです。 スクリプト言語 (Ruby) でコンパクトかつエレガントに書かれていること そのわりに、今回のような計算速度が要求される課題で他に劣らない性能だったこと Ruby 2.1 搭載予定の世代別 GC の性能を実証したこと (笑) *2 要約すると、「Ruby のくせにやるじゃん」という受賞理由のような……。喜んでいいのかね? まあ、Judges' Prize は何が選ばれるかわからないということで。もっと奇抜な戦略をとったチームが選ばれると思ってましたが、上位陣はみんな似たような戦略だったのかな。 スコア的には 14 位なので、すっかり諦めていた分、喜びもひとしおです。そういえば、ICFPc の Judges' Prize って日

    ICFP Programming Contest 2013 Judges' Prize 受賞しました - まめめも
  • Ruby と抽象構文木 - まめめも

    PEG を作ってて思ったこと。 Haskell や OCaml に比べて、Ruby は抽象構文木を扱うのがすごく苦手だと思います。一つの大きな理由はパターンマッチがないことですが、それだけでは無いような気がします。 Haskell の場合、 -- 抽象構文木を定義する data AST = Foo AST | Bar AST | Baz -- 処理 1 foo (Foo x) = ... foo (Bar x) = ... foo Baz = ... -- 処理 2 bar (Foo x) = ... bar (Bar x) = ... bar Baz = ... -- 処理 3 bar (Foo x) = ... bar (Bar x) = ... bar Baz = ... と言うように処理を同じ箇所にまとめて書けますが、Ruby の場合 # 抽象構文木を定義する class AST;

    Ruby と抽象構文木 - まめめも
    TokyoIncidents
    TokyoIncidents 2013/09/20
    え、これ 2007 年のエントリーなの?haskell ってこの頃からあったんだ!
  • 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 リレー - まめめも
  • Type-level Quine (未完) - まめめも

    「型システム入門」(TAPL 日語版)の発売を記念して、型にまつわる何かを書こうと思い、とりあえず型レベルプログラミングでの Quine に挑戦して見ました。 TAPL の内容には全く関係ありません。型クラスは発展的なものなので、入門書である TAPL には名前しか出てきません *1 。型クラスまで書かなくても 500 ページ超のになるので、型の世界は奥が深いですね。 デモ ソースはこちら。 ref: https://github.com/mame/type-level-quine/blob/master/type-level-quine-poc.hs 最後の 2 行に注目。 main = putStr $ show quine quine = undefined :: Q X0 b (...) => b わけわからん型注釈がついてますが、要は quine = undefined なこ

    Type-level Quine (未完) - まめめも
  • 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 の訳本「型システム入門 -プログラミング言語と型の理論-」が発売されます - まめめも
  • Merry Quine-mas 2012 - まめめも

    今夜は、年に一度の W. V. Quine の命日イブです。(もう日が変わってますが) %;';;eval$s=%q{eval(%w~i=1;T="$)*L)L)))0)E(E(0(7(>'>'7&E&0&7&>%L%)%0%E*)$L$)* L)L)))0 )E(E(0(7(>' >'7&E&0&7&>%L%)%0%E5&$L%#8C5G7/530L2B1*/'19-D03 #E*&,1). *G'6#3*>5 &'F'#)E(L)0*)'L'?(#)#)7(E'0&E&#(0%0&L%7&0':+)%E# {"4F"*18} 3F4F5F4 F4@493@1@5@7@6@692@2939325952425+4+3+3F4$5F4F".by tes.each_s lice( 2).map{|s,c|[s*3-99,c/7*3-13-i=-i,c%7+41]};$><<"'# {e=27.

    Merry Quine-mas 2012 - まめめも
  • 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) - まめめも
  • みんなのホームディレクトリ下の構成を教えてください - まめめも

    初めて Unix のアカウント貰ってログインしたとき、まっさらなホームディレクトリをどう使えばいいか悩みませんでした? もちろん好きにすればいいんですが、ベストプラクティスを知りたいなあと思いました。とりあえず自分のを晒してみます。 /home/*/local/ 個人用途のツールをインストールするディレクトリ。 apt にパッケージがないもの (あっても古すぎるもの) で、常用する確信があるものが対象。ちょっと試してみたいだけなら、後述の /home/*/work/local/ を使う。 個人用途のツールを /usr/local/ にインストールすることはない。むやみに sudo したくないので。*1 ぼくの場合は、主に ruby 関係のファイル (リリース版) が占める。 $ ls local bin include lib share $ ls local/bin bundle erb

    みんなのホームディレクトリ下の構成を教えてください - まめめも
  • Merry Quine-mas 2011 - まめめも

    今夜は W. V. Quine の命日です。 eval$s=%q(eval((%w(A="+_Sing_do,_re,_mi_to_the_mike!*z+_Do!*{+_Re!*|+_Mi!__OK !_Let's_sing_Silent_Night!*~+_Sxi~lent_|night!_~Hxo~lY_|night!*{+_All_is_ycal m,_zall_is_~bright,*x+_Round_You_zViyrxgin_~Moxther_~and_|Child!*x+_HolY_ziny fant_xso_~tenxder_~and_|mild,*{+_Sleep_in_}heav{enylY_zpea|ce,*z+_Slee~p_|in_ ~heav}en{lY_zpeace.**";T=-Math::PI/N= 2**10;F=proc{|n,t,a|n/=2;r=

    Merry Quine-mas 2011 - まめめも
  • 山手 quine - まめめも

    t="+,m-n./mAm0o1p23a4q56r7sBt89u-t-1:v;A<w4x=y1z>[?]A^@CD_ CD_EsF`GHmIJbKa*l";eval$s=%w{F=%q{ceY8#<DvO1=x&t9CSOqMYkzH U.kCpz+Vo8hB.1AF&tq21+$/IrMY]U.aDd!-1y!4MMGQm6m?bYh($QMYpX s4g,x1UlbNKH?>NzbisMn?sT@m3,F.Abb`xW!r%'%Ybee>xkUfjf[(*^Nd Xo_"@hQh%Fx*q[iB7EM"suSG8GVOIzceg/O=4CL,d[-k]twgVP`&wcfaT` 2M)j8sFY?(HKzOrVCHO_694[Uq8g @i/i;tMBG#;-;B]rV[])`3'<os^. OV(SA<=ok%m[iV#qt[&dJ7SIdB;/ VUnVIrH;hEJ*QWD"E+

    山手 quine - まめめも