Rubyでスレッド使うときの雛形みたいなやつ

スレッド間の変数の扱いとかスレッド管理とかチェックしたついでに。
重たい処理を何度も実行する必要があって、並列に処理したい場合を想定。
スレッドが終了しないうちに新しい処理が来て間に合わない。のでスレッドオブジェクトを配列に貯めておいて、順番に並列に処理するようにする。
1つのスレッドが終わるまでの時間と、配列に溜まっていくスレッドオブジェクト達とのバランス調整が必要。
Producer-Consumerパターンとか言うらしい。
使うときはこっち。Rubyでスレッドを簡単に扱うための何か - juntkの日記

# encoding: utf-8
# ruby -v => 1.8.7
require "thread"

class ThreadTest
    def initialize()
        # スレッド管理用
        @t = []
        # スレッドの並列度(同時実行数)
        @threadConcurrency = 2
    end
    def addThread(aObject = nil)
        # スレッド管理用の配列にスレッド入れる
        @t << Thread.new do
            # Thread#wakeupでスレッドを開始したいので、スレッドを止めとく
            # Thread#stopするとThread#statusは"sleep"になる
            Thread.stop
            # なんか重い処理
            worker(aObject)
        end
    end
    def controlThread()
        # スレッドの並列実行数の調整と終了したスレッドの破棄
        begin
            # 実行中のスレッド数のチェック用
            runThreadNum = 0
            # 停止中のスレッドリスト
            stopThreadList = []
            @t.each_with_index do |v,i|
                # 終了したスレッドをスレッド管理用配列から破棄
                # Thread#statusがfalseのときスレッドが正常終了してる
                if v.status == false or v.status == "abort" or v.status == nil then
                    @t.delete_at(i)
                elsif v.status == "run" then
                    runThreadNum += 1
                elsif v.status == "sleep" then
                    # Thread#stop?は終了(dead)または停止(stop)のときにtrueを返す
                    #   -> これ、スレッドで行う処理の中にsleep 10とかあるとtrueが返ってきます。
                    stopThreadList << v
                else
                end
            end
            # 実行中のスレッド数と停止中のスレッドが分かったので
            # 並列実行度を元に停止状態(stop)のスレッドを実行可能状態(run)にする。
            (@threadConcurrency - runThreadNum).times do |t|
                # 雑というか無駄すぎる^^;
                if stopThreadList.size > 0 then
                    stopThreadList.shift.run
                end
            end
        rescue error
            p error
        end
    end
    def loop()
        # ゲームとかグラフィック描画とかのループメソッドを想定
        begin
            # canvasDrawとか
            # 座標情報とか?
            point = [10,10]
            # addThreadの引数はThreadとは関係なし
            # Workerで使うデータとか渡すといいよね
            addThread(point)
            # スレッドの管理
            controlThread()

            puts "loop"
            p @t
            sleep 1
        end while true
    end
    def worker(aObject=nil)
        # スレッドで行う処理
        # 注意!このメソッド中ではsleep nが使えません。
        #   使うとThreadが落ちます。例外も出ないよ
        
        # テキトーに重い処理
        1000000.times do |t|
            a = Math.sqrt(Math.sqrt(t) * Math.sqrt(t))
        end
    end
end

ThreadTest.new().loop()

QueueとSizedQueueとThread.listとThread#joinを使えばもっと簡単に書けた、というオチ。
Rubyでマルチスレッドプログラミング

なにこれ

なにこれ1

MacBook-Pro:Downloads ***$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):003:0> require 'opengl'
[BUG] cross-thread violation on rb_gc()
(null)

Abort trap: 6

なにこれ2

MacBook-Pro:rubybox ***$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'box2d'
LoadError: dlopen(/opt/local/lib/ruby/gems/1.8/gems/box2d-1.4.3/ext/box2d.bundle, 9): no suitable image found.  Did find:
	/opt/local/lib/ruby/gems/1.8/gems/box2d-1.4.3/ext/box2d.bundle: mach-o, but wrong architecture - /opt/local/lib/ruby/gems/1.8/gems/box2d-1.4.3/ext/box2d.bundle
	from /opt/local/lib/ruby/gems/1.8/gems/box2d-1.4.3/ext/box2d.bundle
	from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
	from (irb):2

Google Code Archive - Long-term storage for Google Code Project Hosting.こっからbox2d持ってきてmake&installするんだけど、cmake(クロスプラットフォームなmake)が必要なんだってさ。

sudo port install cmake

MyGame

SDL_TTFが要る。

最小二乗法でなめらかな曲線を描く


適当にラインを引いて(白)、最小二乗法で多項式曲線()の近似をしてみた。
ソースコード(あとで)

ajaxとかhtml5のcanvasとか使って適当に

TumblrAPI V1廃止のため終わり。
久しぶりにcanvas使ったらcontext.flush();とか書いてた。
Tumblrから画像を持ってきてCoreserverにキャッシュして表示するだけ。
セルで枠組みを作ってから配置したら色々と捗った。
cellTumblr

メモ

ネーミング規約とか。
JavaScript style guide - Mozilla | MDN
iPhoneでタッチしてもonmousedownイベントが反応しなかったので。
iPhone/iPadでPCと同じJavaScriptのイベントを実装する - to-R

AjaxなWebアプリ

TumblrAPI V1廃止のため終わり。

coreserver.jpでサーバーを借りたので、試しにAjaxなWebアプリを書いてみた。
TumblrDashboardに流れてくる画像を表示するだけ。
オートリロードとサムネクリックでがちょっと便利。
http://juntk.net/tumblr/