読者です 読者をやめる 読者になる 読者になる

nil による NoMethodError を回避する(Ruby)

Ruby のメソッドで例外に nil を返すものは多く、NoMethodError が出て処理が止まることがあります。面倒なので回避するメソッド Object#nil_trans を書きました。self が nil 以外のときは self をそのまま返し、nil のときは引数(デフォルトは空文字列)…

Ruby で Generator の実装

Python に Generator というのがあります。Ruby では Enumerator でほぼ同じことができますが、引数の与え方がいまひとつよくわかりません。でというわけでもないのですが、勉強のために頑張って Fiber で実装してみました。Generator#args で引数を与えます…

Python の内包表記と Ruby の each_with_object

kiito.hatenablog.comこの記事は勉強になりました。Python の内包表記で def create_url_table(urls) return {url: get_title(url) for url in urls if 'google' not in url} と書くのを、Ruby の each_with_object を使うと def create_url_table(urls) url…

HTML5の markタグ

aaaaa強調するbbbbb aaaaa<mark>強調する</mark>bbbbb

cairo と Ruby で遊んでみる

cairo は二次元画像を描くためのライブラリです。これと Ruby でちょっと GIFアニメを作って遊んでみました。 cairo は Linux ならたぶん最初から入っているようです。Linux Mint 17.2 には既に入っていたので、それを使いました。 Ruby で cairo を使うには…

Rubyは末尾呼び出し最適化をサポートしている

Ruby でこれはスタックオーバーフローします。 def add(n, a = 0) return a if n.zero? add(n - 1, n + a) end puts add(10000) #=>a.rb:2:in `add': stack level too deep (SystemStackError) 例えばこう対策します。 obelisk.hatenablog.com 上のとおり以…

構造体を継承する(Ruby)

アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディア: 大型本この商品を含むブログ (9件) を見る上の本を読んでいたところ…

外部イテレータで素数生成(Ruby)

標準添付ライブラリに Prime がありますが、自分でやってみました。めっちゃ素朴な実装です(数が大きくなると急速に遅くなります)。 gen_primes = Enumerator.new do |y, i = 2| loop do catch do |jp| 2.upto(i - 1) {|j| throw(jp) if (i % j).zero?} y <…

Linux Mint(Ubuntu)で Swift を使ってみる

Swift ってよさそうな言語だけれど、Apple のみかと思っていたら、一応 Ubuntu でも動くのですね。インストールは以下のサイトを参考にしました。 gihyo.jpDocker を使ってやってみました。Linux Mint 17.2 で動作確認。 $ sudo docker pull swiftdocker/swi…

Scheme(Gauche)でフィボナッチ数列

こんな感じでしょうか。 (define (sub a b co n) (if (= co n) a (begin (print a) (sub (+ a b) a (+ co 1) n)))) (define (fibonatti n) (print (sub 1 1 1 n))) (fibonatti 10) Scheme って while 文も for 文もないのですね。繰り返しは do 文でやるか、…

Linux Mint(Ubuntu)でScheme(Gauche)を使う

先日 Scheme 処理系はとして Guile を入れてみたのですが、どうも Gauche の方がメジャーみたいですね。ということで入れてみました。 $ sudo apt-get install gaucheついでに $ sudo apt-get install rlwrapをしておくといいかも知れない。$ rlwrap gosh で…

シンプソンの公式による数値積分(Ruby)

Rubyによる情報科学入門作者: 久野靖出版社/メーカー: 近代科学社発売日: 2008/12メディア: 単行本 クリック: 5回この商品を含むブログ (13件) を見る f(x) = x^2 を [1, 10] の区間で数値積分してみます。ここでは区間を100分割します。ちなみに、正しい答…

1変数方程式を数値計算で解く(Ruby)

Rubyによる情報科学入門作者: 久野靖出版社/メーカー: 近代科学社発売日: 2008/12メディア: 単行本 クリック: 5回この商品を含むブログ (13件) を見る方程式 f(x) = 0 を ある区間 [a, b] において、f(x) が単調増加、連続、f(a) 0 であるとして、数値計算で…

Linux Mint(Ubuntu)で Guile(Scheme)を使う

Linux Mint 17.2 で確認しました。Guile は Scheme の実装のひとつです。処理系は「ソフトウェアの管理」で guile-2.0 と guile-2.0-dev を入れました。バージョンは多少古く、guile 2.0.9 が入ります。 $ guile で対話型インタプリタが起動します。 tomoki@…

どれくらいの再帰呼び出しでスタックオーバーフローになるか

d.hatena.ne.jp上のサイトで実験しているのに、Ruby と Python を追加しました。 OSは Linux Kernel 3.19.0、メモリは 7.7GB。Python 3.4 ctr = 0 def testfunc(): global ctr ctr += 1 print ("%sth function call." % (ctr)) testfunc() testfunc() Ruby 2…

末尾再帰をスタックオーバーフローせずに実行する(Ruby)

あるプログラムを書いていて、再帰がいわゆる「スタックオーバーフロー」するのに悩まされました。結局そのプログラムはカスだったのですが、スタックオーバーフローをおもしろい方法で回避することを知ったので、メモしておきます。まず、1 から n までを単…

Ruby の第一級関数としての Proc

不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリーはてなブックマーク- 不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー たまたま上のブログ記事を読んでいて、次のような記述が…

Linux Mint(Ubuntu)で Logicool のマウスを使う

Linux その他で使おうと、Logicool のマウスを買いました。Logicool ロジクール ワイヤレスマウス M235r ブルー出版社/メーカー: ロジクール発売日: 2013/02/01メディア: Personal Computersこの商品を含むブログを見る ワイヤレスマウスなので、小さい受信…

単純なソートのおさらい(Python)

以前に Ruby でバブルソート、選択ソート、挿入ソートを実装してみました(参照)が、Python でもやってみました。リストの(浅い)コピーってどうやるのかと思った。それから、Python は Ruby とちがって「モンキーパッチ」ができないのですね。あと、range…

Ruby/Tk と Green Shoes

ここで Ruby/Tk を使って作られている GUI は、Green Shoes ならばどう書けるか考えた。いちばん簡単には require 'bundler/setup' require 'green_shoes' Shoes.app width: 150, height: 100 do button("イヌ") {puts "わんわん"} para "吾輩はイヌである" …

「rscの日記」さんが紹介されていた問題を解く(Ruby)

またまた「rscの日記」さんが紹介されていた問題を Ruby で解いてみました。問題はこちらです。 A~Eの5人はある事業所に勤務する派遣社員である。この5人のある月曜日から金曜日までの出勤状況について次のことがわかっているとき、正しくいえるのはどれ…

Green Shoes で落書きパッドを作る

阿呆な落書きパッドを作りました。マウスのドラッグで描き、スペースキーで画面を保存します。スクリーンショットを行うシステムのコマンドを使っているので、Linux(gnome)専用です。 require 'bundler/setup' require 'green_shoes' Shoes.app width: 600…

Green Shoes で動くものを作る

クリックして生成された円が動き回ります。ぶつかると完全弾性衝突をします。端に到達すると跳ね返ります。ここの JavaScript で書かれたプログラムとほぼ同じように動作します。JavaScript 版の方はこちらで実行できます。遊んでみて下さい。 require 'bund…

RMagick を使ってGIFアニメ(Ruby)

メソッド gifanme(delay, dir) です。dir は素材画像の入っているディレクトリ、delay は待ち時間(1/100秒単位)です。gifanime.gif という名前で出力されます。アニメーションされる順番はディレクトリ内のファイルのアルファベット辞書順になります。例え…

カジノゲーム「クラップス」のシミュレーション(Ruby)

ギャンブルのゲームで「クラップス」というのがあるそうで、カジノではとても盛り上がるらしいです。T_NAKA さんのブログ(参照)でこの「クラップス」のシミュレーションをやってあったのを拝見して、おもしろそうなので自分も Ruby でやってみました。T_NA…

ブロックと proc(Ruby)

ひとつのメソッドでブロックを使っても、 proc を引数にしても実行できる。 def output(&bk) bk.call end output {puts "test1"} a = proc {puts "test2"} output(&a) bk.call は yield でもいい。

OpenGLの座標系覚書き

OpenGL の五つの座標系 ローカル座標系(オブジェクト座標系、ボディ座標系、モデリング座標系) ワールド座標系 視点座標系(ビュー座標系) 投影面座標系(クリップ座標系、表示範囲) ウィンドウ座標系(スクリーン座標系、ビューポート) 我々がコマンド…

OpenGL のラッパーモジュール Opal を書いた(Ruby)

Ruby で OpenGL 遊びをしているうち、同じことを繰り返し書くのに飽きたので、せっかく Ruby を使っているのだから少しだけ Ruby っぽくするラッパーモジュール「オパール Opal」を書いた。Gem 'OpenGL' は、C言語のコードを移植するには便利なのだが。なお…

ライブラリ作成覚書(Ruby)

ちょっと考えてみた。デザインパターンっぽいのだけれど、何だろう。 module App class A def display=(st) puts st end def <<(st) puts st end def output(st) puts st end end def self.exec(&bk) A.new.instance_eval(&bk) end end App.exec do |x| x.di…

OpenGLで三次元表示(Ruby)

詳しくはこちら。下は画像キャプチャして GIFアニメにしたもの。ぐるぐる回っています。

Linux Mint 17.2 に Docker を導入

ここの情報が有用でした。以下、同じことを書きます。Linux のカーネルのバージョンが 3.10 以上であることを確認。 $ uname -r wget を使って Docker をインストールする。apt-get でやると古いバージョンがインストールされるのでダメ。 $ wget -qO- https…

Linux Mint 17.2 で IRuby と jupyter notebook(IRuby notebook)を使う

IRuby を使おうと思ったのですが、できるまでにかなり苦労したのでメモ。 環境は Linux Mint 17.2. Ruby 2.2.3.まず、iPython を入れないといけないので、Python のインストールが必要です。僕は既に virtualenv を使って Python 3.4 をインストールしていま…

Green Shoes でメモ帳を作る

やってみました。 require 'bundler/setup' require 'green_shoes' Shoes.app title: "Shoes Notepad", width: 600, height: 370 do ebox = nil text = "" read_text = "edit area" background papayawhip flow width: 1.0, height: 0.1 do button "読み込み…

OpenGLでGIFアニメ(Ruby)

OpenGL の画像キャプチャ(参照)を使って、簡単な GIFアニメを作ってみました。 Ruby で書いたソースはこことここ。 GIFアニメは、Web サービスなどで簡単に作れます。例えばここ。 キャプチャされた画像は bmp ファイルなので、これを使って jpg 画像へ一…

Green Shoes で落書きを真似る

ここで Ruby/Tk を使って描いてある画像がきれいだったので、Green Shoes で真似してみました。 ちなみにこのサイトでは Ruby/Tk に悪戦苦闘されていて(参照)、とても感動的(?)です。僕は好きですね。 require 'bundler/setup' require 'green_shoes' i…

Ruby で外部イテレータを使う

ソートされた2つの配列を、ソートされた配列としてマージ(結合)します。 class Array def sorted_merge(ar) (self + ar).sort end end というのは(むりやりなので)なしです。 class Enumerator def next_be? begin peek rescue StopIteration return fal…

野良Gem のバージョンアップ

以前 Bundler と GitHub を使った野良Gem のバージョンアップについてまとめたのですが(参照)、もう少しちゃんとしたやり方がわかったのでメモしておきます。野良Gem 'Utils' を例にします。(バージョンアップではなく、野良Gem作成はここがわかりやすい…

Ruby の C拡張で約数を求めるメソッドを書いた

なぜか Ruby 本体には、約数を求めるメソッドがないようですので、C拡張で作ってみました。以前書いた Utilsc への機能追加です。コードは必要な部分だけ載せます。全体のコードはここ です。 #include "utilsc.h" #include "math.h" VALUE divisors(VALUE s…

Ruby の修飾子について

Ruby の if, unless, while, until は修飾子として使えますが、 puts i if (i = 1) #=>NameError: undefined local variable or method `i' for main:Object はこれ以前の行に i が出てこないかぎり、エラーなのですね。しかし i = 0 puts i if (i = 1) #=>1…

Linux Mint 17.2 に RMagick を入れる

ImageMagick を Ruby で使おうと、Bundler で RMagick という Gem を入れようと思ったのだが、エラーが出た。ImageMagick は入っているのだが。

GreenShoes を使って画像ファイルの変換 GUI を作ってみる

Ruby の GUI ツールである GreenShoes を使ってみました。 Linux mint 17.2 で確認しました。ImageMagick のインストールが必要です(Gem 'RMagick' は必要ありません)。 $ sudo apt-get install imagemagickGreenShoes についてはこちらも。 単独のファイ…

OpenGL のウィンドウを bmp 画像ファイルとして保存する(Ruby)

Ruby で OpenGL のウィンドウ・キャプチャをしようと苦労していたのですが、すばらしいライブラリを発見して成功しました。ウィンドウを BMP ファイルに落とします。Ruby で OpenGL を使うことについては、ここが参考になれば幸いです。RubyでBMPファイルを…

JavaScript で i 番目のボタンが押された時に処理をする方法

ここを読んでいて、(本文とはあまり関係がないけれど)では i 番目のボタンが押されたときに i を使って処理をするには、どうしたらよいかと考えた。ただし、HTML の中に onclick を書いて処理したくない(全部ちがう関数名にしないといけないので)。これ…

Ruby でプロトタイプベースのOOPは可能か

オブジェクト指向JavaScriptの原則作者: Nicholas C. Zakas,和田祐一郎出版社/メーカー: オライリージャパン発売日: 2014/06/18メディア: 単行本(ソフトカバー)この商品を含むブログ (4件) を見る JavaScript では以下のように書けます。 var person = { n…

Ruby の lambda は第一級オブジェクト(だと思う)

JavaScript の関数は第一級オブジェクト(第一級関数)だとよく言われますね。変数に代入できるし、関数の引数にすることができるし、関数の戻り値にすることもできます。以下のとおりです。 function a() { console.log("Hello!"); } function f(x) { x(); …

Ruby で OpenGL

Ruby でも OpenGL が使えるようですが、日本語ではぐぐっても古い情報が多いので、できるかやってみました。Linux Mint 17.2, Ruby 2.2.3 で確認しました。'OpenGL' という Gem(公式HP)を入れればいいのですが、その前に Linux の OpenGL 関係のライブラリ…

Ruby の C拡張でモンキーパッチ(オープンクラス)

なんと、C拡張でモンキーパッチまで可能だとは! ここが参考になりました。前記事の C拡張をオープンクラスで実現します。Bundler を使っています。ソースは以下。 #include "utilsc.h" long gcd(long x, long y) { long tmp; if (x < y) {tmp = x; x = y; y…

Ruby の C拡張を作ってみた

プロジェクト・オイラー(参照)の計算高速化のため、Ruby の C拡張に挑戦してへろへろに疲れました。参考にしたのはここ、ここなど。公式ページ(だと思う)がやはり詳しいです。ここも読むべきでしょう。(※追記 ここも追加。)とりあえずソース。 #includ…

プロジェクト・オイラーの Problem 68, 69

Problem 68。 def sum(i); @b[i].inject(:+); end max = 0 @b = Array.new(5) [10, 9, 8, 7, 6, 5, 4, 3, 2, 1].permutation(10) do |a| next unless a[0] == 10 or a[1] == 10 or a[2] == 10 or a[3] == 10 or a[4] == 10 @b[0] = [a[0], a[5], a[6]] @b[1]…

Python の os.walk もどきを Ruby で

Python に os.walk という関数があって、よく Python の入門書で自慢されているので、遊びで Ruby でマネしてみました。あるディレクトリ以下を再帰的にトラバースします。ただし、Python の実装そのままではなくて、面倒なのでマネだけにしてあります。同じ…