2014-02-01 :-)
_ 読書メーター
2014年1月の読書メーター
読んだ本の数:4冊
読んだページ数:1379ページ
ナイス数:8ナイス
学戦都市アスタリスク 04. 追憶闘破 (MF文庫J)の感想
綾斗がもう覚醒してしまった。もうしばらく剣術で勝ち進んでほしかった。剣術では綺凛が最強か。他校の対戦相手に序列1位2位が参加してないのはやはり今後の大会に備えて控えてるんでしょうかね。
読了日:1月5日 著者:三屋咲ゆう
Java言語で学ぶデザインパターン入門 マルチスレッド編の感想
マルチスレッド設計集。実装はJavaだけど一般化して捉えれば何にでも応用できる。読めば「あー、アレのことか」というのが分かる(Worker ThreadはApache web serverでもお馴染みだし、Producer Consumerはタスク管理だ)。スレッドローカルストレージとかよく分かってなかったんだけど腑に落ちた
読了日:1月4日 著者:結城浩
日本軍艦ハンドブック (光人社NF文庫)の感想
軍艦の一覧。写真は冒頭にいくつかある。各艦の説明は文章で数行。当たり前だがほとんどの艦は「沈没」「消息不明」など沈んでいるので読むのが辛い。駆逐艦の名前を眺めると日本人の自然に対する感性の多さに感嘆する。日本語は美しいな
読了日:1月1日 著者:雑誌「丸」編集部
学戦都市アスタリスク 03 鳳凰乱武 (MF文庫J)の感想
相変わらずレスターが噛ませ役じゃないですか
読了日:1月1日 著者:三屋咲ゆう
読書メーター
2014-02-02 :-)
_ 買い物
iTunes Store
いろいろ衝動買いした。misterioso なんて聞いてるだけで涙が出てくる。
- ClariS「CLICK - EP」 ニセコイ OP
- ClariS「カラフル - Single」 劇場版 魔法少女まどかマギカ[新編]叛逆の物語 OP
- Kalafina「君の銀の庭 - Single」 同 ED
- Kalafina misterioso 同 挿入歌
- あおい(CV:井口裕香) ひなた(CV:阿澄佳奈)「スタッカート・デイズ - EP」 ヤマノススメ ED
- 藍井エイル「シリウス - Single」 キルラキル OP
- Ray「lull ~そして僕らは~ - EP」 凪のあすから OP
- 河野マリナ「たからもの - EP」 夏目友人帳 肆 ED
- ChouCho「優しさの理由 - Single」 氷菓 OP
- 白浜坂高校合唱部「潮風のハーモニー - Single」 TARI TARI ED
2014-02-03 :-(
2014-02-04 :-(
_ 午後
1300 デバッグしTARI
_ 「ビジネスモデル創造こそ究極の設計だ!!!」というとで体験と気づき - 山本大@クロノスの日記
100 万回読んでおく。
- 「提供する価値」で強いものを持っていると軸になるので模索のブレが少ない
- 「※ただし摩擦係数は0と考える」な企画では通用しない、動きださないと企画ですらない
- 正解が成功するとは限らない
- 関わる1人だけが必要性を感じてるようなものでは、成り立たない
- 「課題」が強ければ強いほど解決する意味がある
- 顧客に価値を伝えるには、提案書だけでは響かない。実感してもらうのが強い
2014-02-05 :-(
_ 午後
1300 デバッグしTARI
_ ココロコネクト
Microsoft Windows 7 Proffesional な OS において
- python で smtp するとメール送信可能
- ruby で smtp するとメール送信失敗
という現象があり、結局 connect(2) が EPERM で失敗している。ようだ。
ruby と python のコード( C のコード )を見比べても差異はなさそうなんだがよく分からん。
_ KAMATA ANGELUS
RIDGE RACERS2 - スペシャルマシン - バンダイナムコゲームス公式サイト
リッジレーサー7 の ANGELUS は【お察しください】なのでこっち。
アルティメットまどかのシルエットに似ているとか似ていないとかというツッコミ[ 20131123#c01 ]があったので見てみたが
むしろレインを思い出す(via. トレジャーハンターG - adovoの日記 )
2014-02-07 :-)
_ 午後
1300 デバッグしTARI
_ [ワーグナー][ニーベルングの指輪][ドラゴンクエスト][すぎやまこういち]すぎやまこういちのドラゴンクエストvsワーグナーのニーベルングの指輪
@東京芸術劇場 コンサートホール
ゲストに堀井雄二! ということで平日だけど脊髄反射でチケットを買ったら、前から 2 列目だった。すぎやまこういちと堀井雄二なんて、すげえ組み合わせなのにこんなものか。まあいいや。
ニーベルングの指輪は飯守泰次郎指揮。すぎやまこういちはドラクエ指揮。指揮を交代しながらドラゴンクエストの曲とニーベルングの指輪を演奏する。
ニーベルングの指輪は先日ラノベで「ジークフリート」の部分だけ読んだ程度のゆとり教育のおっさんですが、ニーベルングの指輪はすべての話を見ると西洋の他の神話と同じように基本的に神がクズである。女にだらしないというか、それにより嫉妬などで揉め事が起きて殺人(殺神?)に発展するという安定の流れです。カンピオーネ!では「神は傍若無人であり自分勝手に行動し周囲にとてつもない影響を及ぼす。迷惑そのものだ」などと表現していた。
曲とか
- 序曲(DQ1)
- 演奏対決1 駆けめぐる
- 広い世界へ~大平原のマーチ(DQ7)
- ワーグナー ワルキューレの騎行~楽劇「ワルキューレ」第3幕から
- 演奏対決2 不気味なキャラクター
- 洞窟に魔物の影が(DQ5)
- 大魔王(DQ5)
- ワーグナー ジークフリートの角笛と目を覚ます洞窟の大蛇~楽劇「ワルキューレ」第2幕から
- 演奏対決3 戦い
- ワーグナー ジークフリートと大蛇の戦い~楽劇「ワルキューレ」第2幕から
- 戦闘のテーマ~アレフガルドにて~勇者の挑戦(DQ3)
- ドラクエの生みの親 堀井雄二氏とすぎやまこういち氏のスペシャルトークコーナー
- 演奏対決4 ファンタスティックなシーン
- ワーグナー 森のささやき~楽劇「ワルキューレ」第2幕から
- おおぞらをとぶ(DQ3)
- 演奏対決5 旅
- 冒険の旅(DQ3)
- 海図を広げて(DQ4)
- ワーグナー 夜明けとジークフリートのラインへの旅~楽劇「神々のたそがれ」序幕と第1幕から
- 演奏対決6 エンディング
- そして伝説へ(DQ3)
- ワーグナー フィナーレ~楽劇「神々のたそがれ」序幕と第3幕から
- アンコール
- この道わが旅(DQ2)
トーク
飯守泰次郎「私もドラゴンクエストは好きです。それが今回一緒にやれるということで嬉しい」
すぎやまこういち「僕はワーグナーなんて恐れ多い。ワーグナーとドラゴンクエストの出会い {だっけ} くらいでやりましょう」
すぎやまこういち「僕はワーグナーの CD は持ってないんですが、学生のころ、昭和 26 年という終戦後すぐなんですが。この会場に昭和 26 年はまだ生まれてなかったひと、手を上げて。1236 人ですね笑 まあその昭和 26 年にオーケストラやるからこの指止まれ と言ったら 40 人集まりまして。すごいです。さすがボンボン。僕は奨学金で入学したんですが、みんな金持ちだから奨学金が全然使われなかったそうです。僕が奨学金を使うと言ったら喜ばれました笑」
トーク
飯守泰次郎「ニーベルングの指輪は全部で 15 時間くらいの演奏があります。今回はダイジェストでお送りします。ドラゴンクエストもけっこう長いのではないですか?」
すぎやまこういち「ドラゴンクエストの曲は 11 時間あります。」
トーク
すぎやまこういち「僕ももう 83 歳になります。長い旅です。ドラゴンクエストには若い女の子とおじいさんも登場して、『ピチピチギャルはええのう』なんて言ったりするんですが、その気持が分かりました」
堀井雄二とすぎやまこういち
堀井雄二がスライムのぬいぐるみを抱えて登場( 超ビッグなスライムぬいぐるみLLサイズが登場!! )
すぎやまこういち「ゲーム作家の堀井雄二さんです。スライムというと海外だとオドロオドロしい絵ですよね。このスライムは堀井さんがそういう絵にしたんですか?」
堀井雄二「いえ。僕も最初はドロドロした絵を書いたんです。それが鳥山さん(鳥山明)から返ってくると、こうなった」
すぎやまこういち「先ほど女の子の話題を出したんですが、堀井さんは一番最初の女の子との出会いは何でしたか?」
堀井雄二「いろいろインタビューされてきましたけど、こんな質問されるのは初めてです笑 小学生のころに同級生の女の子ですね。活発な子でした。」
すぎやまこういち「でも成果は無しと笑」
堀井雄二「ありませんでしたね笑」
すぎやまこういち「堀井さんは学生のころ何をやっていたんでしょう { すぎやまこういちが学生のころ音楽やってたから、その流れだったかな }
堀井雄二「僕は漫画家になろうとしてたんです。それで高校のころも漫画を書いてて {だったかな} 大学に行って漫画研究部に入った」
すぎやまこういち「その漫画の経験がドラゴンクエストにも活かされているんですね。ドラゴンクエストはセリフが少ない。最低限のセリフだけで話が分かる」
堀井雄二「漫画はセリフで話が進むんですが、ドラゴンクエストもセリフを少なくするようにしました。長いセリフは読まないですから {とかなんとか}」
トーク
アンコール
すぎやまこういち「たくさんの拍手に応えて、アンコールやります。『この道わが旅』83年です。」
最後の挨拶
終演後 再びスライムのぬいぐるみを持って現れた堀井雄二が客席先頭のひとにぬいぐるみを渡していた。いいなあ
2014-02-10 :-(
_ 午後
1300 デバッグしTARI
_ 夜
1700 残業アワー
1800 退勤 || 客先へ報告メールを投げた直後に「違う。問題の本質はそこじゃない」ということに気づいたんだが気づいたときには既に敷地の改札口を出ていた
1900 川崎
2100 飯
2200 読書
_ [ruby][queue]queue (1)
がんばって自力で
#: coding: utf-8 class Queue def initialize(size) @queue = Array.new(size) @head = 0 @tail = 0 end def get() item = @queue[@head] @head = (@head + 1) % @queue.length return item end def put(item) @queue[@tail] = item @tail = (@tail + 1) % @queue.length end def size() return @queue.length end end def main(argv) max = 5 queue = Queue.new(max) 0.upto(max - 1) {|n| queue.put(n) } 0.upto(queue.size() - 1) {|n| puts queue.get() } end main(ARGV)
>ruby queue0.rb 0 1 2 3 4
_ [ruby][queue]queue (2)
Array が全部持ってるわけですが
#: coding: utf-8 class Queue def initialize() @queue ||= [] end def get() return nil if @queue.empty? return @queue.shift() end def put(item) @queue.push(item) end end def main(argv) max = 5 queue = Queue.new() 0.upto(max - 1) {|n| queue.put(n) } 0.upto(max -1) {|n| puts queue.get() } end main(ARGV)
>ruby queue1.rb 0 1 2 3 4
_ 尽きる
たまに聞くと心が安らぐ。
2014-02-11 :-)
_ [NetBSD][マニュアル][man][PDF]NetBSD マニュアルの PDF を作成する
hubertf が「マニュアル印刷して持ち歩こうぜ」と言っていた[ 20140117#p06 ]のでやってみた。
とりあえず make
% cd /usr/src/share/man/man0 % make /bin/sh mkman Preparing data ... : Chewing on man7pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found ps2pdf: not found Chewing on man8pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found ps2pdf: not found Chewing on man9pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found ps2pdf: not found
エラー
ps2pdf ってなんだよ
ググる
pkgsrc.se - ./meta-pkgs/netbsd-www
netbsd-www ぽい?
cd /usr/pkgsrc/meta-pkgs/netbsd-www
Makefile を見たらそれっぽいのあった。これらしい。
USE_TOOLS+= perl:run ps2pdf:run
netbsd-www を make する。
: /bin/sh ./config.status --recheck CXX libgv_lua_la-gv_lua.lo In file included from gv_lua.cpp:1525:0: ../../config.h:568:0: warning: "NO_POSTSCRIPT_ALIAS" redefined <command-line>:0:0: note: this is the location of the previous definition gv_lua.cpp:5733:1: error: elements of array 'const luaL_reg swig_commands []' have incomplete type gv_lua.cpp:5733:1: error: storage size of 'swig_commands' isn't known gv_lua.cpp: In function 'int luaopen_gv(lua_State*)': gv_lua.cpp:6029:19: error: 'LUA_GLOBALSINDEX' was not declared in this scope *** Error code 1 Stop. make: stopped in /usr/pkgsrc/graphics/graphviz/work/graphviz-2.34.0/tclpkg/gv *** Error code 1 Stop. make: stopped in /usr/pkgsrc/graphics/graphviz/work/graphviz-2.34.0/tclpkg/gv cd .. && /usr/bin/make am--refresh /bin/sh ./config.status --recheck make: don't know how to make gv/pkgIndex.tcl. Stop make: stopped in /usr/pkgsrc/graphics/graphviz/work/graphviz-2.34.0/tclpkg *** Error code 1 Stop. make: stopped in /usr/pkgsrc/graphics/graphviz/work/graphviz-2.34.0/tclpkg
おこなの
「pkgsrc でエラーになるならバイナリパッケージを入れればいいじゃない」( Re: meta-pkgs/xfce4 XML::Parser... configure: error ) と言われたこともあるので pkg_add する。
設定
PATH="/usr/pkg/sbin:$PATH" PKG_PATH="ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/6.1.2/All/" export PATH PKG_PATH
以降 エラーになるやつはすべて pkg_add していく。netbsd-www も pkg_add すればいいじゃない とか言わない。
pkg_add graphviz-2.34.0nb5 pkg_add doxygen-1.8.5 pkg_add boehm-gc-7.2e pkg_add jasper-1.900.1nb7 :
netbsd-www を入れ終えたら再度作る。
作ってみたものの PDF が 3KB しかなかった。
make のログを見たら怒られていた。
: grops:<standard input> (<standard input>):459122: duplicate `x res' command grops:<standard input> (<standard input>):459122:warning: too many arguments on current line grops:<standard input> (<standard input>):459123: duplicate `x init' command grops:<standard input> (<standard input>):460678:warning: no final `x stop' command for i in 1 2 3 4 5 6 7 8 9 ; do echo Chewing on man${i}pages.pdf ; /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed -e '/^\/level0 0 def/d' -e '/^\/level0 save/d' -e '/^level0 restore/d' <man${i}pages.ps >man${i}pages.ps.tmp ; ps2pdf man${i}pages.ps.tmp man${i}pages.pdf ; rm man${i}pages.ps.tmp ; done Chewing on man1pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man2pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man3pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man4pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man5pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man6pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man7pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man8pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found Chewing on man9pages.pdf sh: /usr/src/tooldir.NetBSD-6.1.2-i386/bin/nbsed: not found
nbsed が無いらしい。nbsed は /usr/src/tooldir にあるらしいので tools を作る。なぜ tools の sed なんて使うんだ?と思ったが man0 が /usr/src/share/man/man0 にあるから tools に依存させてるのか。
% cd /usr/src % ./build.sh tools
再度 make
% cd /usr/src/share/man/man0 % make
今度こそ ok
2014-02-12 :-(
_ 午後
1300 デバッグしTARI
_ 買い物
iTunes Store
- 坂本真綾 Be mine! 「世界征服~謀略のズヴィズダー~」OP
- 悠木碧 ビジュメニア 世界征服~謀略のズヴィズダー~」ED
坂本真綾の曲を買うのは 10 年ぶりくらいか。
たぶんこの辺が最後。2003 年リリースだからほんとに 10 年だった。まあいろいろあった
B0035NO6LI
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Single Threaded Execution - この橋を渡れるのは、たった一人
写経するために Ruby で書きなおしてみた。Java から Ruby へ
Ruby ぽく書ける箇所は多々あるんだろうけど愚直に 1 対 1 対応させる。
Java の Synchronize は Ruby には無いので Monitor を使う。
同時に 1 つのスレッドのみが処理を実行できる。クリティカルセクションとか呼ばれる
コード
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Single Threaded Execution - この橋を渡れるのは、たった一人 # require 'thread' require 'monitor' class Gate def initialize() @counter = 0 @name = "Nobody" @address = "Nowhere" @lock = Monitor.new end def pass(name, address) @lock.synchronize { @counter += 1 @name = name @address = address check() } end def to_s() @lock.synchronize { return "No. #{@counter}: #{@name} #{@address}" } end def check() puts to_s() if @name[0] != @address[0] puts "***** BROKEN ***** " + to_s() end end end class UserThread < Thread def initialize(gate, myname, myaddress) @gate = gate @myname = myname @myaddress = myaddress super() { puts @myname + " BEGIN" while true @gate.pass(@myname, @myaddress) sleep(1) end } end end def main(argv) gate = Gate.new threads ||= [] threads << UserThread.new(gate, "Alice", "Alaska") threads << UserThread.new(gate, "Bobby", "Brazil") threads << UserThread.new(gate, "Chris", "Canada") threads.each {|t| t.join() } end main(ARGV)
% ruby SingleThreadedExecution.rb Alice BEGIN No. 1: Alice Alaska Bobby BEGIN No. 2: Bobby Brazil Chris BEGIN No. 3: Chris Canada No. 4: Alice Alaska No. 5: Bobby Brazil No. 6: Chris Canada No. 7: Chris Canada No. 8: Bobby Brazil No. 9: Alice Alaska No. 10: Chris Canada No. 11: Alice Alaska No. 12: Bobby Brazil No. 13: Alice Alaska No. 14: Bobby Brazil No. 15: Chris Canada No. 16: Chris Canada No. 17: Alice Alaska No. 18: Bobby Brazil 以下略
著作権
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-13 :-(
_ 午後
1300 デバッグしTARI
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Immutable - 壊したくとも、壊せない
インスタンスが不変であることを保証する。Synchroinze を使わずとも複数のスレッドから読まれても OK (書く手段を提供しないため)
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Immutable - 壊したくとも、壊せない # require 'thread' require 'monitor' class Person def initialize(name, address) @name = name @address = address end def getName() return @name end def getAddress() return @address end def to_s() return "[ Person: name = #{@name} address = #{@address} ]" end end class PrintPersonThread < Thread def initialize(person, name) @person = person @name = name block = Proc.new() { while true puts "Thread-#{@name} prints #{@person}" end } super(&block) end end def main(argv) alice = Person.new("Alice", "Alaska"); th ||= [] th << PrintPersonThread.new(alice, 0) th << PrintPersonThread.new(alice, 1) th << PrintPersonThread.new(alice, 2) th.each {|t| t.join() } end main(ARGV)
% ruby Immutable.rb Thread-0 prints [ Person: name = Alice address = Alaska ] Thread-0 prints [ Person: name = Alice address = Alaska ] Thread-0 prints [ Person: name = Alice address = Alaska ] Thread-0 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-1 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] Thread-2 prints [ Person: name = Alice address = Alaska ] 以下略
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-14 :-)
_ 午後
1200 CP+
_ [CP+]CP+2014
@パシフィコ横浜
行ってきた。
CP+ 技術アカデミーを受講してきたんだけど商品紹介ばかりであった。もう受講しなくていいなあ。
雪景色
働くおじさん
ホテルのラストダンジョン感がヤバい。
パナソニック
撮り損ねた。写真なし。
4K カメラで動画を撮影したけど TFT で再生してもまったく嬉しくない。パナソニック「LUMIX GH4」登場、4K動画撮影できる初めてのミラーレス一眼 : ギズモード・ジャパン
オリンパス
撮り損ねた。写真なし。
イーグルズアイを見たかったけど確認できず。あったのかしら オリンパスからLEDドットサイト照準器つきカメラSTYLUS SP-100EE、光学50倍ズーム望遠撮影用 - Engadget Japanese
DJI
なんかラジコンが飛んでた。Phantom という名前らしい。設計したひとはゼビウスのファンに違いない スーパーゼビウス ガンプの謎 - Wikipedia
シグマ
シグマのこれ触ってきた。ああ、うん....?
ハッセルブラッド
「ハッセルブラッドに行ってみるがいい」と Twitter で replay を貰ったので行ってみた。高級品らしい。外人ばかりでこわかった。これは欲しいな(形状だけ)s
キヤノン
キヤノンのブースに行ったらちょうどトークショーが開始されるところだったので眺めていた。Power Shot G1 X Mark II でローアングルがいいですよ!とのこと。
EOS M2 を触ってみたけど、ライブビューがすげえ重いんですが。AF もそんなに速くなってるように見えん。うーん
MREAL とやら( 現実と仮想を融合する -Mixed Realityシステム MREAL- ) AR と同じようなもんだろうと思うんだけどどうやって自分の位置を把握してるのかと思ったらてっぺんに付いてるのが磁気センサーらしく、すぐ脇に設置してあった棒状の物との位置関係で把握するんだそうだ。
シネマなんとか
シネマなんとか。超高そうなので怖くて触らなかった。CINEMA EOS SYSTEM|EOS-1D C
CP+ 技術アカデミー
Nikon 1 AW1の開発
八木成樹(株式会社ニコン)
- 商品企画
- あらゆるシーンで使えるカメラを作る
- 耐久性
- 日常での携帯性
- 高級感
- とかいろいろ
- あらゆるシーンで使えるカメラを作る
LUMIX一眼動画の取組み
前川直也(パナソニック株式会社)
- 経歴
- 学生時代
- 映像のスタジオでバイトしてた
- パナソニックへ転職
- 最初に映像機器に配属された
- 次にデジタルカメラに配属された
- ソフトウェア指揮ってる
- いま GH4
- 学生時代
- Panasonic LUMIX GH4
- ヴィーナスエンジン
- 新規開発した
- 大変だった
- 1 機種作って
- プラットホーム作って
- GH4 に展開した
プロトタイプを作ってノウハウを蓄えてライブラリ化して展開。ということかな
- 動画撮影機器
- あるカメラマン曰く
- 一眼を作ってるところの動画カメラだから買う
- 業務用の動画カメラは高価だし
- 一眼なら同じ金額で 2 台買えるし
- 一眼のノウハウ(ホワイトバランスとかシャッタースピードとか)が活かされている
そうなん?動画も結局は静止画の集まりなのだからその辺のノウハウは共通してそうなんだけど。
- PAL/NTSC 切り替え
- 切り替え時にカメラの電源を OFF→ON させるようにしている
- ソフトウェアとしては電源を入り切りする必要はないのだが
- 業務用のカメラは電源 OFF→ON させるようになっている
- 映像業界の人達も PAL/NTSC 切り替え時に電源 OFF→ON することが習慣になっている
- その習慣にならって GH4 も電源を OFF→ON させるようにしている
すげえ無駄な...
全天球画像撮影デバイス"RICOH THETA"の開発
竹中博一(株式会社リコー)
画像処理担当
- 2 眼で撮影し
- パターンマッチングで 2 画像を処理し
- 繋ぎ合わせる
- 左目の画像と右目の画像を基準画像と比較画像としてパターンマッチング
- 左目と右目で視点が異なる
- 視差が起きる
- 写す対象が異なるので対象までの距離が異なる
普通にパターンマッチングらしい
2014-02-15 :-)
_ 夜
1700 ぐったり。部屋の那珂が温まらないのでオフトゥン.in
2100 飯。アジの開き
2200 おやつ。クラシックショコラ( ref. ちゃんと作れるスイーツ pp.26-27 ) 最近作ってなかった。
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Guarded Suspension - 用意できるまで、待っててね
リクエストが put されるまで get はブロックする。待機する。
スピンロックなどとも言う。
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Guarded Suspension - 用意できるまで、待っててね # require 'thread' require 'monitor' class Request def initialize(name) @name = name end def getName() return @name end def to_s() return "[ Request #{@name} ]" end end class RequestQueue def initialize() @lock = Monitor.new() @cond = @lock.new_cond @queue ||= [] end def getRequest() @lock.synchronize { while @queue.empty? == true begin @cond.wait() rescue end end return @queue.pop() } end def putRequest(request) @lock.synchronize { @queue.push(request) @cond.broadcast() } end end class ServerThread < Thread def initialize(requestQueue, name, seed) @requestQueeu = requestQueue @random = Random.new(seed) block = Proc.new { 0.upto(10) {|i| request = requestQueue.getRequest() puts "#{self} handles #{request}" begin sleep(random.rand(10)) rescue end } } super(&block) end end class ClientThread < Thread def initialize(requestQueue, name, seed) @requestQueue = requestQueue @random = Random.new(seed) block = Proc.new { 0.upto(10) {|i| request = Request.new("No. #{i}") puts "#{self} requests #{request}" @requestQueue.putRequest(request) begin sleep(random.rand(10)) rescue end } } super(&block) end end def main(argv) th ||= [] requestQueue = RequestQueue.new() th << ServerThread.new(requestQueue, "Bobby", 6535897) th << ClientThread.new(requestQueue, "Alice", 3141592) th.each {|t| t.join() } end main(ARGV)
ruby GuardedSuspension.rb #<ClientThread:0x000000002fbde0> requests [ Request No. 0 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 1 ] #<ServerThread:0x00000002abd608> handles [ Request No. 0 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 2 ] #<ServerThread:0x00000002abd608> handles [ Request No. 1 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 3 ] #<ServerThread:0x00000002abd608> handles [ Request No. 2 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 4 ] #<ServerThread:0x00000002abd608> handles [ Request No. 3 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 5 ] #<ServerThread:0x00000002abd608> handles [ Request No. 4 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 6 ] #<ServerThread:0x00000002abd608> handles [ Request No. 5 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 7 ] #<ServerThread:0x00000002abd608> handles [ Request No. 6 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 8 ] #<ServerThread:0x00000002abd608> handles [ Request No. 7 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 9 ] #<ServerThread:0x00000002abd608> handles [ Request No. 8 ] #<ClientThread:0x000000002fbde0> requests [ Request No. 10 ] #<ServerThread:0x00000002abd608> handles [ Request No. 9 ] #<ServerThread:0x00000002abd608> handles [ Request No. 10 ]
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-16 :-)
_ [NetBSD][jenkins][pkgsrc]Jenkins をインストールしてみた
% cd /usr/pkgsrc/devel/jenkins % cmake install clean clean-depends : =========================================================================== $NetBSD: MESSAGE,v 1.1.1.1 2011/12/08 14:09:25 ryoon Exp $ To use jenkins with apache tomcat, you will need to perform the following steps. Of cource you can run jenkins with builtin winstone web server. 1. Install apache tomcat server, for example apache-tomcat7 # cd www/apache-tomcat7 # make install 2. Set jenkins location to apache tomcat $ sudo vi /usr/pkg/share/tomcat/conf/server.xml Add <Context path="/jenkins" docBase="/usr/pkg/share/jenkins" debug="0" reloadable="true"> </Context> in <Host> tag 3. Set URI Encoding as UTF-8 $ vi /usr/pkg/share/tomcat/conf/server.xml You should have URIEncoding="UTF-8" in <Connector/> tag. For example, you should have the following lines. <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 4. Start apache tomcat and access http://localhost:8080/jenkins/ ===========================================================================
ok
tomcat を使うらしいので上の手順どおりに作業する。
終わったら
rc ファイルをコピー。
% sudo cp /usr/pkg/share/examples/rc.d/tomcat /etc/rc.d
/etc/rc.conf に追加
tomcat=yes
起動
% sudo /etc/rc.d/tomcat start Using CATALINA_BASE: /usr/pkg/share/tomcat Using CATALINA_HOME: /usr/pkg/share/tomcat Using CATALINA_TMPDIR: /usr/pkg/share/tomcat/temp Using JRE_HOME: /usr/pkg/java/openjdk7 Using CLASSPATH: /usr/pkg/share/tomcat/bin/bootstrap.jar:/usr/pkg/share/tomcat/bin/tomcat-juli.jar Using CATALINA_PID: /var/run/tomcat/catalina.pid
http://localhost:8080/jenkins/ にアクセスしてみる。
ok
pf
当初は http://localhost:8080/jenkins/ にアクセスしてもつながらなかった。結局 pf で弾いていたからなんだけど
以下その作業ログ
タイムアウト
http://localhost:8080/jenkins/ にアクセスしてみる。
タイムアウトした。
ログを見る。
/var/log にログが見当たらない。
ログはどこだ。
/etc/rc.d/tomcat で以下のように起動している。
tomcat_start() { cd $CATALINA_HOME/logs /usr/bin/su ${tomcat_user} -c "${command} start" }
CATALINA_HOME は /usr/pkg/share/tomcat として定義されている。
移動してみる。
% cd /usr/pkg/share/tomcat/logs
いくつかファイルがある。
% ls catalina.2014-02-16.log host-manager.2014-02-16.log localhost_access_log.2014-02-16.txt catalina.out localhost.2014-02-16.log manager.2014-02-16.log
とりあえず片っ端から見る。
例外が起きてる?
% tail catalina.out at javax.jmdns.JmDNS.create(JmDNS.java:60) at hudson.DNSMultiCast$1.call(DNSMultiCast.java:32) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 2 16, 2014 12:03:57 午前 hudson.WebAppMain$2 run 情報: Jenkins is fully up and running
例外が起きているものの、top を見ると java が起動している。死んでるわけではないらしい。よく分からん。
同じホスト( mogu )から http://localhost:8080/jenkins/ へアクセスしてみる。
起動してた。
ということは jenkins (のウェブサーバー)の待ち受けアドレスをどうにかすればいいのか。
どこで設定してるんだ。
grep してみる。
% cd /usr/pkg/share/tomcat/conf % sudo grep -r Listen * server.xml: <Listener className="org.apache.catalina.security.SecurityListener" /> server.xml: <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> server.xml: <Listener className="org.apache.catalina.core.JasperListener" /> server.xml: <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> server.xml: <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> server.xml: <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
いやー、その Listener は違うっしょ。イベントの受け口としてのリスナでしょ。
分からん。
pkgsrc でインストールしたときのログをちゃんと見てみると...おや?
To use jenkins with apache tomcat, you will need to perform the following steps. Of cource you can run jenkins with builtin winstone web server.
winstone web server is 何
公式に文書があるじゃないか。
Starting and Accessing Jenkins - Jenkins - Jenkins Wiki
The easiest way to execute Jenkins is through the built in Winstone servlet container.
「Jenkins は簡単に起動できる。そう、Winstone ならね。」
ああ、そういうこと。
FreeBSD についての文書もあったのでパクる。
FreeBSD - Jenkins - Jenkins Wiki
待ち受けアドレスとポートはデフォルトで 0.0.0.0 8080 らしいので指定しない。
% JAVA_HOME=/usr/pkg/java/openjdk7 /usr/pkg/java/openjdk7/bin/java -jar /usr/pkg/share/jenkins/jenkins.war --webroot=/usr/pkg/share/jenkins/war --prefix=/jenkins
やはり同じホストからしかアクセスできない。
ということは pf か!
とりあえず pf を停止
% sudo /etc/rc.d/pf stop
別のホストからアクセスしてみる。
ok
動作確認できたので /etc/pf.conf にポート 8080 を追加しておく。
tcp_services = "{ ssh, www, smtp, domain, munin, netbios-ssn, microsoft-ds, 6667, 8080 }"
しかし 8080 は redmine とかでも使っていたような記憶があるから 8080 から変えたほうがいいんだろうなあ。
_ [文書][ドキュメント][マニュアル]文書陳腐化問題
入門者向け文書
右も左も分からない開発者のこと。とする
チュートリアルとか get started 的なものが欲しい。
e.g.
- Getting Started - MinGW
- Clang - Getting Started
- Getting started - Grunt: The JavaScript Task Runner
- Getting Started with Android Studio - Android Developers
- Getting Started with Rails - Ruby on Rails Guides
- Getting Started - The Go Programming Language
- Getting Started with Heroku - Heroku Dev Center
中級者向け文書
右や左は分かるようになった開発者のこと。とする
何が居るだろうか。
- リファレンス?
- 内部構造?
- wiki のような散文?
- デバッグ方法?
e.g.
陳腐化
BSD BoF[ 20131221#p04 ] のときに「翻訳文書がメンテナンスされない」という話題があったけど結局 解は無かったし(無かったよね)、佐藤広生さん(FreeBSD の偉い人) は
「10年ほど観測して、自然発生的に日本語ドキュメントが書かれたりコミュニティが活発になるのを期待するのは無理だと分かった」
と言っていたし、対策として専任のライターをつける と言っていたし。
Ruby も「リファレンスマニュアル刷新計画」(るりまプロジェクト) として体制を作ってるし。
開発者たちが片手間に文書をメンテナンスするのは無理なのか。
2014-02-17 :-(
_ 午後
1300 デバッグしTARI
_ ,
むしろ葛西紀明がまだ現役だったことに驚いた。レジェンド
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Balking - 必要なかったら、やめちゃおう
仕事しようとして条件が満たされてなかったら保留。
- もういいかい?
- まだだよ ←ガード
- もういいかい?
- まだだよ ←ガード
- もういいかい?
- もういいよ
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Balking - 必要なかったら、やめちゃおう # require 'thread' require 'monitor' class BData def initialize(filename, content) @filename = filename @content = content @changed = true @lock = Monitor.new() end def change(newContent) @lock.synchronize { @content = newContent @changed = true } end def save() @lock.synchronize { if @changed == false return end doSave() @changed = false } end def doSave() puts "#{Thread.current} calls doSave, content = #{@content}" File.open(@filename, "wb") {|f| f.write(@content) } end end class ChangerThread < Thread def initialize(name, data) @data = data @random = Random.new() block = Proc.new { i = 0 begin while true @data.change("No. #{i}") sleep(1) @data.save() i += 1 end rescue => ex puts ex end } super(&block) end end class SaverThread < Thread def initialize(name, data) @data = data block = Proc.new { begin while true @data.save() sleep(2) end rescue => ex puts ex end } super(&block) end end def main(argv) th ||= [] data = BData.new("data.txt", "(empty)") th << ChangerThread.new("ChangerThread", data) th << SaverThread.new("SaverThread", data) th.each {|t| t.join() } end main(ARGV)
>ruby Balking.rb #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 0 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 1 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 2 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 3 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 4 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 5 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 6 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 7 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 8 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 9 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 10 #<ChangerThread:0x00000002b7e218> calls doSave, content = No. 11 #<SaverThread:0x000000002fbdb8> calls doSave, content = No. 12
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
_ ドッグフードを食べる
Windows NT 開発時のデビッド・カトラーによるメソッドなわけだが
デビッド・カトラー コンピュータ偉人伝 ちえの和WEBページ
ドッグフードを食べる
WindowsNTの最初のバージョンは560万ステップにおよぶコードが書かれたという話だ。その想像を絶する開発の内輪話は参考文献で読んでほしい。 NTの開発には当初OS/2環境が使われていたが、NTのカーネルの部分ができてくると、 NTの開発にNTを使うようにしたらしい。こうするとイヤでもバグを直さざるをえないからだ。このことをドッグフードを食べるといったらしい。それと、毎日その日までのバージョンをビルドするということをカトラーはやった。こうしたことは我々にも非常に参考になる。
「ドッグフードを食べましょう」と云うからには開発コードはもちろんそうだし、自分たちが世に送り出した製品も自分で使っているのは当たり前 なわけですが、まったくそのようになっていないので食べます。といったことを上司に投げるなど。
_ ,
mixi も Twitter もやめた友人が Tumblr には住み着いている。Tumblr は最後の楽園である。
_ ,
tabesugi.net のひとが英語で日記を書くようになってから 2, 3 年経過した。あのひとのエアメールをもらうのが楽しみなので欠かさずにチェックしないといけない( MUST ) 会ったことないけど
2014-02-18 :-(
_ 午後
1300 デバッグしTARI
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Producer-Consumer - わたしが作り、あなたが使う
生産者と消費者
供給と需要
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Producer-Consumer - わたしが作り、あなたが使う # require 'thread' require 'monitor' class Table def initialize(count) @buffer = Array.new(count) @head = 0 @tail = 0 @count = 0 @lock = Monitor.new() @cond = @lock.new_cond() end def put(cake) @lock.synchronize { puts "#{Thread.current} puts #{cake}" while @count >= @buffer.length @cond.wait() end @buffer[@tail] = cake @tail = (@tail + 1) % @buffer.length @count += 1 @cond.broadcast() } end def take() @lock.synchronize { while @count <= 0 @cond.wait() end cake = @buffer[@head] @head = (@head + 1) % @buffer.length @count -= 1 @cond.broadcast() puts "#{Thread.current} takes #{cake}" return cake } end end class EaterThread < Thread def initialize(name, table, seed) @table = table @random = Random.new(seed) block = Proc.new { begin cake = table.take() sleep(@random.rand(5)) rescue => ex puts ex end } super(&block) end end class MakerThread < Thread def initialize(name, table, seed) @random = Random.new(seed) @table = table @lock = Monitor.new @@id = 0 # ケーキの通し番号(コックさん全員共通) block = Proc.new { begin sleep(@random.rand(5)) cake = "[ Cake No. #{nextid()} by #{Thread.current} ]" table.put(cake) rescue => ex puts ex end } super(&block) end def nextid() @lock.synchronize { @@id += 1 return @@id } end end def main(argv) th ||= [] table = Table.new(3) th << MakerThread.new("MakerThread-1", table, 31415) th << MakerThread.new("MakerThread-2", table, 92653) th << MakerThread.new("MakerThread-3", table, 58979) th << EaterThread.new("EaterThread-1", table, 32384) th << EaterThread.new("EaterThread-2", table, 62643) th << EaterThread.new("EaterThread-3", table, 38327) th.each {|t| t.join() } end main(ARGV)
ruby Producer-Consumer.rb #<MakerThread:0x0000000046bd38> puts [ Cake No. 1 by #<MakerThread:0x0000000046bd38> ] #<EaterThread:0x0000000046b630> takes [ Cake No. 1 by #<MakerThread:0x0000000046bd38> ] #<MakerThread:0x0000000046b978> puts [ Cake No. 2 by #<MakerThread:0x0000000046b978> ] #<EaterThread:0x0000000046b248> takes [ Cake No. 2 by #<MakerThread:0x0000000046b978> ] #<MakerThread:0x00000002c4c758> puts [ Cake No. 3 by #<MakerThread:0x00000002c4c758> ] #<EaterThread:0x0000000046b4a0> takes [ Cake No. 3 by #<MakerThread:0x00000002c4c758> ]
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-19 :-(
_ 午後
1300 コード読んだり
_ 古めかしい世界感がある。「教会旋法」が使われている楽曲10選 - NAVER まとめ
7年くらい前に友人が「梶浦由記の曲聞いたら教会旋法使ってた」的なことを言っていた。ような気がする
cerbe のことですが
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Read-Write Lock - みんなで読むのはいいけれど、読んでる間は書いちゃだめ
誰かが読んでる間は誰でも読める。けど書けない。
誰も読み書きしていない間に書ける。
Data という名前は Ruby の組み込みクラスかしら。怒られたので名前を変えた。
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Read-Write Lock - みんなで読むのはいいけれど、読んでる間は書いちゃだめ # require 'thread' require 'monitor' class ReadWriteLock def initialize() @lock = Monitor.new() @cond = @lock.new_cond() @readingReaders = 0 # (A) 実際に読んでいる最中のスレッドの数 @waitingWriters = 0 # (B) 書くのを待っているスレッドの数 @writingWriters = 0 # (C) 実際に書いている最中のスレッドの数 @preferWriter = true # 書くのを優先するならtrue end def readLock() @lock.synchronize { while ((@writingWriters > 0) or (@preferWriter and (@waitingWriters > 0))) @cond.wait() end @readingReaders += 1 # (A) 実際に読んでいるスレッドの数を1増やす } end def readUnlock() @lock.synchronize { @readingReaders -= 1 # (A) 実際に読んでいるスレッドの数を1減らす @preferWriter = true @cond.broadcast() } end def writeLock() @lock.synchronize { @waitingWriters += 1 # (B) 書くのを待っているスレッドの数を1増やす begin while ((@readingReaders > 0) or (@writingWriters > 0)) @cond.wait() end rescue ensure @waitingWriters -= 1 # (B) 書くのを待っているスレッドの数を1減らす end @writingWriters += 1 # (C) 実際に書いているスレッドの数を1増やす } end def writeUnlock() @lock.synchronize { @writingWriters -= 1 # (C) 実際に書いているスレッドの数を1減らす @preferWriter = false @cond.broadcast() } end end class BData def initialize(size) @lock = ReadWriteLock.new() @buffer = Array.new(size) @buffer.fill('*') end def read() @lock.readLock() begin return doRead() rescue ensure @lock.readUnlock() end end def write(c) @lock.writeLock(); begin doWrite(c) rescue ensure @lock.writeUnlock() end end def doRead() newbuf = @buffer.clone() slowly() return newbuf end # @buffer を埋めるなら fill() すればいいんだけど # 1 文字ごとに slowly() させるのでループしておく def doWrite(c) 0.upto(@buffer.length - 1) {|i| @buffer[i] = c slowly() } end def slowly() begin sleep(0.5) rescue => ex puts ex end end end class WriterThread < Thread def initialize(data, filler) @data = data @filler = filler @index = 0 @random = Random.new() block = Proc.new { begin while true c = nextchar() @data.write(c) sleep(@random.rand(3)) end rescue => ex puts ex end } super(&block) end def nextchar() c = @filler[@index] @index += 1 if @index >= @filler.length @index = 0 end return c end end # Thread.current だと分かりづらいので名前をつける class ReaderThread < Thread def initialize(data, n) @data = data @name = "reader #{n}" block = Proc.new { begin while true readbuf = @data.read puts "#{@name} reads #{readbuf}" end rescue => ex puts ex end } super(&block) end end def main(argv) th ||= [] data = BData.new(10) th << ReaderThread.new(data, 0) th << ReaderThread.new(data, 1) th << ReaderThread.new(data, 2) th << ReaderThread.new(data, 3) th << ReaderThread.new(data, 4) th << ReaderThread.new(data, 5) th << WriterThread.new(data, "ABCDEFGHIJKLMNOPQTSTUVWXYZ") th << WriterThread.new(data, "abcdefghijklmnopqrstuvwxyz") th.each {|t| t.join() } end main(ARGV)
スレッドごとの print は同期できないか
ruby Read-Write-Lock.rb reader 2 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"] reader 5 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"]reader 1 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"] reader 4 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"] reader 3 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"] reader 0 reads ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"] reader 5 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"] reader 3 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"]reader 1 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"] reader 4 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"] reader 0 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"] reader 2 reads ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"] reader 5 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 2 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 3 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 0 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 4 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 1 reads ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"] reader 2 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"] reader 5 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"] reader 1 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"] reader 4 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"]reader 3 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"] reader 0 reads ["B", "B", "B", "B", "B", "B", "B", "B", "B", "B"] reader 0 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] reader 2 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] reader 1 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"]reader 5 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] reader 4 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] reader 3 reads ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] reader 2 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"] reader 5 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"] reader 1 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"]reader 3 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"] reader 4 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"] reader 0 reads ["C", "C", "C", "C", "C", "C", "C", "C", "C", "C"] reader 0 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"] reader 4 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"] reader 1 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"]reader 5 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"] reader 3 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"] reader 2 reads ["c", "c", "c", "c", "c", "c", "c", "c", "c", "c"] reader 4 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"] reader 3 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"]reader 5 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"] reader 1 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"] reader 2 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"] reader 0 reads ["D", "D", "D", "D", "D", "D", "D", "D", "D", "D"]
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-20 :-(
_ 午後
1300 コード読んだり
_ 訃報
父方の祖母が亡くなった
_ ,
irb(main):005:0> 5 & 6 => 4 irb(main):006:0> 5 | 6 => 7 irb(main):007:0> 10 & 13 => 8 irb(main):008:0> 10 | 13 => 15 irb(main):009:0> 30 | 40 => 62
2014-02-21 :-)
_ 私の熱い独身活動 ドクカツ! 始まります! フフッヒ
飯を作る気力がないのでインスタントにするなど怠惰なセイカツをしている。
_ ,
ツッコミ spam 増えたなあ。ksg
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Thread-Per-Message - この仕事、やっといてね
メッセージごとにスレッドを起動して処理する。
(起動済スレッドへメッセージを投げるのは Worker-Thread パターン)
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Thread-Per-Message - この仕事、やっといてね # require 'thread' require 'monitor' class Host def initialize() @helper = Helper.new() end def request(count, c) puts " request(#{count}, #{c}) BEGIN" t = Thread.new() { @helper.handle(count, c) } puts " request(#{count}, #{c}) END" return t end end class Helper def handle(count, c) puts " handle(#{count}, #{c}) BEGIN" 0.upto(count) {|i| slowly() printf c } puts "" puts " handle(#{count}, #{c}) END" end def slowly() begin sleep(2) rescue => ex puts ex end end end def main(argv) th ||= [] puts "main BEGIN" host = Host.new(); th << host.request(10, 'A') th << host.request(20, 'B') th << host.request(30, 'C') th.each {|t| t.join()} puts "main END" end main(ARGV)
>ruby Thread-Per-Message.rb main BEGIN request(10, A) BEGIN request(10, A) END request(20, B) BEGIN request(20, B) END request(30, C) BEGIN request(30, C) END handle(10, A) BEGIN handle(20, B) BEGIN handle(30, C) BEGIN ACBCABCABCABCBAACBBCACABCBACABCBA handle(10, A) END BCCBBCCBCBCBBCBCBCB handle(20, B) END CCCCCCCCCCC handle(30, C) END main END
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-22 :-)
_ コートのファスナーが壊れた
2002 年の國府田マリ子 Mariko Kouda 2002 NEW YEAR LIVE で買ったはず。ファッションを気にしない場合(通勤とか通勤とか通勤とか)に使っている。10 年以上使ってるのか。
2014-02-23 :-)
_ 祖母の葬儀
結局私は行かず。両親のみ行ってきた。(宮崎である)
_ [NetBSD][pkgsrc][pkg_add]バイナリパッケージをインストールする
Chapter 4. Using pkgsrc - 4.1.2. Installing binary packages
NetBSD 6.1.2 / i386 とする
配布元 http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/
たとえばここ:
http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/6.1.2/All/
設定
PATH="/usr/pkg/sbin:$PATH" PKG_PATH="ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/6.1.2/All/" export PATH PKG_PATH
インストール
pkg_add gimp-2.8.10 pkg_add mng-2.0.2
_ [ImageMagick][CR2][JPEG]ImageMagick で Canon CR2 ファイルを JPEG へ変換する
環境
NetBSD 6.1.2 / i386 (core i5 の VMWare)
インストール
% cd /usr/pkgsrc/graphics/ImageMagick/ % make install clean clean-depends
Canon CR2 を JPEG へ変換する
ここに 29MB くらいの CR2 があるじゃろ
% /bin/ls -lM total 57,696 -rwxr--r-- 1 rin users 29,516,818 Feb 22 19:26 IMG_1332.CR2
それを
こうじゃ
% time convert IMG_1332.CR2 IMG_1332.jpg convert IMG_1332.CR2 IMG_1332.jpg 34.62s user 39.42s system 48% cpu 2:33.14 total
35秒くらい。Digital Photo Professional でもそのくらい時間かかったような気がするので、まあこんなものか。
まとめるとこうか。ファイル名の大文字と小文字区別は tr とか使えば出来るけどまあ。出力先を指定するよりもディレクトリを移動すると楽だからついサブシェル使ってしまうんだけどダサい。
#!/bin/sh if [ -z $1 ]; then echo "convCR2toJPEG.sh <image directory>" exit fi image_dir=$1 convert_cmd=/usr/pkg/bin/convert { cd ${image_dir} find . -type f -name "*.CR2" | while read f; do jpg=$(basename ${f} .CR2)".jpg" echo ${f} "=>" ${jpg} $convert_cmd ${f} ${jpg} done }
% ./convCR2toJPEG.sh ./ ./IMG_1332.CR2 => IMG_1332.jpg ./IMG_1334.CR2 => IMG_1334.jpg ./IMG_1333.CR2 => IMG_1333.jpg
ufraw
なおインストールした直後は以下のように怒られた。
% convert ./IMG_1332.CR2 ./IMG_1332.jpg convert: delegate failed `"ufraw-batch" --silent --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i"' @ error/delegate.c/InvokeDelegate/1065. convert: unable to open image `/var/tmp/magick-175238px9Jm17523d.ppm': No such file or directory @ error/blob.c/OpenBlob/2643. convert: no images defined `./IMG_1332.jpg' @ error/convert.c/ConvertImageCommand/3127.
前提を確認。
Canon の RAW ファイルについて読み込みはサポートしている。
% convert -list format | grep -i canon CR2 r-- Canon Digital Camera Raw Image Format CRW r-- Canon Digital Camera Raw Image Format
ImageMagick をビルドしたときの設定はこう。-ljpeg とかあるよなあと。
% convert -list configure Path: /usr/pkg/lib/ImageMagick-6.8.6//config-Q16/configure.xml Name Value ------------------------------------------------------------------------------- CC gcc CFLAGS -pthread -I/usr/pkg/include/OpenEXR -I/usr/pkg/include/freetype2 -I/usr/pkg/include -fopenmp -O2 -I/usr/include -I/usr/pkg/include -I/usr/pkg/include/freetype2 -Wall -pthread -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 CODER_PATH /usr/pkg/lib/ImageMagick-6.8.6/modules-Q16/coders CONFIGURE --without-dps --without-fpx --without-gvc --without-jbig --without-lqr --without-modules --disable-assert --with-fontconfig --with-ltdl-include=/usr/pkg/include --with-ltdl-lib=/usr/pkg/lib --with-xml=yes --without-perl --sysconfdir=/usr/pkg/etc --without-x --without-jp2 --without-djvu --without-gslib --without-wmf --prefix=/usr/pkg --build=i486--netbsdelf --host=i486--netbsdelf --mandir=/usr/pkg/man CONFIGURE_PATH /usr/pkg/etc/ImageMagick-6/ COPYRIGHT Copyright (C) 1999-2013 ImageMagick Studio LLC CPPFLAGS -I/usr/pkg/include/ImageMagick-6 CXX c++ CXXFLAGS -O2 -I/usr/include -I/usr/pkg/include -I/usr/pkg/include/freetype2 -pthread DEFS -DHAVE_CONFIG_H DELEGATES bzlib fftw fontconfig freetype jng jpeg lcms openexr png ps tiff webp xml zlib DISTCHECK_CONFIG_FLAGS 'CC=gcc' 'CFLAGS=-O2 -I/usr/include -I/usr/pkg/include -I/usr/pkg/include/freetype2' 'CPPFLAGS=-I/usr/include -I/usr/pkg/include -I/usr/pkg/include/freetype2' 'CXX=c++' 'LDFLAGS=-L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib' 'LIBS=' --disable-deprecated --with-quantum-depth=16 --with-umem=no --with-autotrace=no --with-dps=no --with-djvu=no --with-fpx=no --with-gslib=no --with-fontpath= --with-gvc=no --with-jp2=no --with-lqr=no --with-mupdf=no --with-rsvg=no --with-wmf=no --with-perl=no DOCUMENTATION_PATH /usr/pkg/share/doc/ImageMagick-6 EXEC-PREFIX /usr/pkg EXECUTABLE_PATH /usr/pkg/bin FEATURES DPC OpenMP FILTER_PATH /usr/pkg/lib/ImageMagick-6.8.6/modules-Q16/filters HOST i486--netbsdelf INCLUDE_PATH /usr/pkg/include/ImageMagick-6 LDFLAGS -L/usr/pkg/lib -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib LIB_VERSION 0x686 LIB_VERSION_NUMBER 6,8,6,9 LIBRARY_PATH /usr/pkg/lib/ImageMagick-6.8.6 LIBS -lMagickCore -llcms2 -ltiff -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lfreetype -ljpeg -lpng16 -lfftw3 -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lfontconfig -lfreetype -lwebp -lbz2 -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lxml2 -lz -lm -lgomp NAME ImageMagick PCFLAGS -fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 PREFIX /usr/pkg QuantumDepth 16 RELEASE_DATE 2014-02-22 SHARE_PATH /usr/pkg/share/ImageMagick-6 SHAREARCH_PATH /usr/pkg/lib/ImageMagick-6.8.6/config-Q16 SVN_REVISION 13089 TARGET_CPU i486 TARGET_OS netbsdelf TARGET_VENDOR VERSION 6.8.6 WEBSITE http://www.imagemagick.org Path: [built-in] Name Value ------------------------------------------------------------------------------- FEATURES OpenMP NAME ImageMagick QuantumDepth 16
いろいろググると、ufraw をインストールしてから ImageMagick をリビルドしろというのを見つけた。
入れる。
% cd /usr/pkgsrc/graphics/gimp-ufraw % make install clean clean-depends
ImageMagick をリビルド。make update でもいいかもしれず。
% cd /usr/pkgsrc/graphics/ImageMagick % make deinstall % make install clean clean-depends
結局これでイケた。
_ [Plagger][Automatic Ruby]汎用自動処理フレームワーク Automatic Ruby とは - 774::Blog
Plagger らしきもの。
手順どおり
もちろん開発版を入れる。
% git clone git://github.com/automaticruby/automaticruby.git % cd automaticruby % bundle install --path vendor/gems % bin/automatic scaffold % bin/automatic -c ~/.automatic/config/example/feed2console.yml
さて、何に使おうか。
2014-02-24 :-(
_ 午後
1300 デバッグしTARI
_ [カメラ][レンズ][レンズ沼][シグマ]CP+シグマブース「レンズ沼にハマらない写真術」 - YouTube
- 原則レンズを決める
- 画角を身につける
- 絶対画角感
- 自分の中の基準となる
- 例 ラの音を一日中聞かせれば絶対音感が身につく ほんとか
- 原則レンズで10000枚撮る
- そのレンズでは撮れないものが分かってくる
- レンズの解像度以上の写真は撮れない
- レンズを生かす
- ピントを合わせる
- 面で考える
- カメラのセンサーの面かピントとなる
- 手前も奥も合わせる
- 構図も重要だけどピントも重要
- 日の丸構図のありふれた構図であってもピント合ってないと台無し
- 例 結婚式から披露宴まで1504枚撮影
- ちなみに私の場合は
- 結婚披露宴 2009-09-20 - a set on Flickr 17 枚
- 結婚披露宴 2010-04-10 - a set on Flickr 20 枚
- 応用レンズを選ぶ
- さらに表現の幅を広げる
「写真は場数です」
量が質に転化する!
写真 1 万枚撮影する、というのは同じことを昔聞いたんだが誰から聞いたのだったか。
_ [カメラ][一眼レフ][ミラーレス]レフレックス
レンズから入った撮像を光学ファインダーへ反射させるための仕組みのこと。
一眼レフカメラの「レフ」である。
この「レフ」が無いのが「ミラーレス」である。
よってミラーレスは一眼「レフ」ではない。
_ ,
富士フイルムは「ミラーレスとは呼ばないで」と言っている。
2012 International CES:ミラーレスと呼ばないで欲しい――「FUJIFILM X-Pro1」とは何か (1/4) - ITmedia デジカメプラス
2014-02-25 :-(
_ 午後
1300 デバッグしTARI
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Worker Thread - 仕事が来るまで待ち、仕事が来たら働く
予め起動しておいたスレッドへ仕事を投げる。
apache web server とかでもお馴染み。
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Worker Thread - 仕事が来るまで待ち、仕事が来たら働く # require 'thread' require 'monitor' MAX_REQUEST = 100 class Channel def initialize(threads) @lock = Monitor.new() @cond = @lock.new_cond() @requestQueue = Array.new(MAX_REQUEST) @head = 0; # 次にtakeRequestする場所 @tail = 0; # 次にputRequestする場所 @count = 0; # Requestの数 @threadPool = Array.new(threads) end def startWorkers() # join() するとブロックするのでやってはいけない 0.upto(@threadPool.length - 1) {|i| @threadPool[i] = WorkerThread.new("Worker-#{i}", self) } end def putRequest(request) @lock.synchronize { while (@count >= @requestQueue.length) begin @cond.wait() rescue => ex puts ex end end @requestQueue[@tail] = request @tail = (@tail + 1) % @requestQueue.length @count += 1 @cond.broadcast() } end def takeRequest() @lock.synchronize { while (@count <= 0) begin @cond.wait(); rescue => ex puts ex end end request = @requestQueue[@head] @head = (@head + 1) % @requestQueue.length; @count -= 1 @cond.broadcast() return request } end end class Request def initialize(name, number) @name = name # 依頼者 @number = number # リクエストの番号 end def execute() puts "#{Thread.current} executes #{to_s}" begin sleep(0.1) rescue => ex puts ex end end def to_s() return "[ Request from #{@name} No. #{@number} ]" end end class ClientThread < Thread def initialize(name, channel) @channel = channel @name = name block = Proc.new { begin i = 0 while true request = Request.new(@name, i); @channel.putRequest(request) sleep(0.1) i += 1 end rescue => ex puts ex end } super(&block) end end class WorkerThread < Thread def initialize(name, channel) @channel = channel block = Proc.new { while true request = @channel.takeRequest() request.execute() end } super(&block) end end def main(argv) th ||= [] channel = Channel.new(5); # ワーカースレッドの個数 channel.startWorkers() th << ClientThread.new("Alice", channel) th << ClientThread.new("Bobby", channel) th << ClientThread.new("Chris", channel) th.each {|t| t.join() } end main(ARGV)
>ruby WorkerThread.rb #<WorkerThread:0x00000002bc7760> executes [ Request from Alice No. 0 ] #<WorkerThread:0x0000000031bde8> executes [ Request from Bobby No. 0 ] #<WorkerThread:0x0000000031bb18> executes [ Request from Chris No. 0 ] #<WorkerThread:0x0000000031b690> executes [ Request from Chris No. 1 ] #<WorkerThread:0x00000002bc7760> executes [ Request from Alice No. 1 ] #<WorkerThread:0x0000000031bb18> executes [ Request from Bobby No. 1 ] #<WorkerThread:0x0000000031bde8> executes [ Request from Alice No. 2 ] #<WorkerThread:0x0000000031b690> executes [ Request from Chris No. 2 ] #<WorkerThread:0x0000000031b8c0> executes [ Request from Bobby No. 2 ] #<WorkerThread:0x0000000031bde8> executes [ Request from Chris No. 3 ] #<WorkerThread:0x0000000031bb18> executes [ Request from Alice No. 3 ] #<WorkerThread:0x0000000031b690> executes [ Request from Bobby No. 3 ] #<WorkerThread:0x0000000031bb18> executes [ Request from Alice No. 4 ] #<WorkerThread:0x00000002bc7760> executes [ Request from Chris No. 4 ] #<WorkerThread:0x0000000031b8c0> executes [ Request from Bobby No. 4 ] #<WorkerThread:0x0000000031b690> executes [ Request from Alice No. 5 ] 以下略
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
2014-02-26 :-(
_ 午後
1300 デバッグしTARI
_ 夜
1700 退勤
1730 仕事場のプール && 冬になってから行ってなかった && 片道 25m 泳ぐだけで息が切れるというか心臓がバクバクいうんだけど
1900 ウェブ巡回
2000 飯
2100 はてなブックマークがどうのこうの
_ 買い物
iTunes Store
_ [Java][Ruby][マルチスレッド][デザインパターン]Java言語で学ぶデザインパターン入門マルチスレッド編 Future - 引換券を、お先にどうぞ
先に発注だけおこないあとで成果物を受け取る。
# coding: utf-8 # # 『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』 http://www.hyuki.com/dp/dp2.html # # Future - 引換券を、お先にどうぞ # require 'thread' require 'monitor' class BData def getContent() end end class RealData < BData def initialize(count, c) @content = "" puts " making RealData(#{count}, #{c}) BEGIN" buffer = Array.new(count) 0.upto(count - 1) {|i| buffer[i] = c begin sleep(0.1) rescue => ex puts ex end } puts " making RealData(#{count}, #{c}) END" @content = buffer.join() end def getContent() return @content end end class FutureData < BData def initialize() @lock = Monitor.new @cond = @lock.new_cond() @realdata = nil @ready = false end def setRealData(realdata) @lock.synchronize() { if @ready return # balk end @realdata = realdata @ready = true @cond.broadcast() } end def getContent() @lock.synchronize() { while @ready == false begin @cond.wait() rescue => ex puts ex end end return @realdata.getContent() } end end class Host def initialize() end def request(count, c) puts " request(#{count}, #{c}) BEGIN" # (1) FutureDataのインスタンスを作る future = FutureData.new() # (2) RealDataを作るための新しいスレッドを起動する t = Thread.new() { realdata = RealData.new(count, c) future.setRealData(realdata) } # join() するとここでブロックするのでやってはいけない # t.join() puts " request(#{count}, #{c}) END" # (3) FutureDataのインスタンスを戻り値とする return future; end end def main(argv) puts "main BEGIN" host = Host.new() data1 = host.request(10, 'A') data2 = host.request(20, 'B') data3 = host.request(30, 'C') puts "main otherJob BEGIN" begin sleep(2) rescue => ex puts ex end puts "main otherJob END" puts "data1 = #{data1.getContent()}" puts "data2 = #{data2.getContent()}" puts "data3 = #{data3.getContent()}" puts "main END" end main(ARGV)
>ruby Future.rb main BEGIN request(10, A) BEGIN request(10, A) END request(20, B) BEGIN request(20, B) END request(30, C) BEGIN request(30, C) END main otherJob BEGIN making RealData(10, A) BEGIN making RealData(20, B) BEGIN making RealData(30, C) BEGIN making RealData(10, A) END making RealData(20, B) END main otherJob END data1 = AAAAAAAAAA data2 = BBBBBBBBBBBBBBBBBBBB making RealData(30, C) END data3 = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC main END
ライセンス
Copyright (C) 2002,2006 Hiroshi Yuki. http://www.hyuki.com/dp/dp2.html hyuki@hyuki.com This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.
参考
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
4797331623
_ Fryght [欲しいものほど出ない、物欲センサーの性能は我々の予想をはるかに上回っております。]
_ みわ [46cm いらない!]