コミュニティ: mixi || ☆たるさんのパソコンフィールド | Ando's Processor Information Page | Google IT勉強会カレンダー
番組: || NHK SPECIAL | TOP RUNNER | BSマンガ夜話 | BSアニメ夜話 | NHKアニメワールド | テレビ東京 - Anime X-press
第19回 Ruby/Rails勉強会@関西のプログラムを募集します。
日時 2007 年 9 月 29 日 (土) 13:00〜17:00頃(予定)
場所 京都女子大学
Scalaネタとかしたら怒られるかしら.
「Ruby(動的型言語)からみたScala(静的型言語)とか」
まぁネタがねたなんで30分くらいしかしゃべれませんけど(^^;
追記: 応募してみました:-).
実はコア部(APIやランタイム)は相変わらずJavaなのですが,一部実装をScalaで書き始めました.
どちらかというと機能の一部とか切り離しができるPlug-inとかそういう雑多なものなのですが,必要なものなので結構重要です.
もちろんScalaでは実現できないこともあるでしょうし,バグなどでトラブルに見舞われることもあるでしょうから,その場合はJavaに移植しなおすかもしれませんが,今のところコンストラクタとbreakの問題以外はなんとかなっています.
特にXMLなどのデータコンバージョン部分や雑多なロジックが多いGUI部分などで,比較的に簡潔にすっきりかけて重宝しています.3Dと相性が良いかもしれません.まぁいくつか型で悩むところも合ったりするわけですが(^^;.
またScalaはscalacでクラスファイルへコンパイル可能のため,Javaとの親和性がかなり高く組み込んで使う用途には最適です.現状ではJRubyではjrubycの完成度が低い事を考えるとScalaが私には一番の選択肢に思えます.Groovyもあったりするのですが,Scalaはパフォーマンスもいいのでいろんな意味で都合がよかったりします.
さっさと作ってしまえるところがさすがだな.
Rubyの例:
puts "--"
i = 1
Dir.glob("*.scala") {|file|
puts file.gsub(/\.scala/, "-" + i + ".scala")
i += 1
}
puts "--"
Dir.glob("*.scala") {|file|
puts file[/^[^.]+/]
}
Scalaの例:
これは既にあるコードとして無視することw.
import scala.collection.mutable._
import java.io._
import java.util.regex._
class Dir(pathname: String) {
val path = new File(pathname)
def glob(regex: String): Array[File] = {
val pattern = Pattern.compile(regex)
val result = new ArrayBuffer[File]
for(file <- path.listFiles)
if(pattern.matcher(file.getName).matches()) result += file
result.toArray
}
}
def regex(pat: String): Pattern = Pattern.compile(pat)
def gsub(str: String, pat: String, rep: String): String =
regex(pat).matcher(str).replaceAll(rep)
def matched(str: String, pat: String): String = {
val matcher = regex(pat).matcher(str)
if(matcher.find) str.substring(matcher.start, matcher.end)
else ""
}
以下が大事なところ.
println("--")
var i = 1
for(file <- new Dir(".").glob(".*\\.scala")) {
println(new File(
file.getParentFile, gsub(file.getName, "\\.scala", "-" + i + ".scala")))
i += 1
}
println("--")
for(file <- new Dir(".").glob(".*\\.scala")) {
println(new File(
file.getParentFile, matched(file.getName, "^[^.]+")))
}
まぁRubyのライブラリにあわせたからね,前半のコードは既にあるものとしてみれば,そう冗長でもない.
実は,Scala版の方がいろんな意味で優れていると思うけど,まぁそれはそれ.
ただ正規表現で困るのは,エスケープする時に\\になっちゃうことだろうか....これはかなり泣けると思ふ.またこのコード程度だとJavaとそう変わらない...(Javaも拡張for文があるし).
scaladocをそろそろ使おう.
package jp.ne.cappuccino.keisuken.test.scala
/**
* Foo class.
* @author NISHIMOTO Keisuke.
*/
class Foo {
/**
* No operation.
*/
def nop {}
/**
* Is odd?
* @param a target value.
* @return if odd then true.
*/
def odd(a: int): boolean = (a % 2) != 0
}
基本的にJavaと同じみたい.混乱せずに済むのはありがたい.
やはり天下のWikipediaでもScalaについては情報不足か....
ああ,なるほど,まぁ私自身もCommonsはそうそう使わないのだけど,Virtual File System(VFS)とかFileUpload関連とかは,自分で作ってるものより使いやすくて信頼性のあがっているものはそのまま使ってます.
ただartonさんと私って似ているところもあるのかな,基本的に自分が使いたい機能に絞って自分用のライブラリを書くことが多いです.たぶん他の人がやっていない分野に手を出している事が多いからだと思いますし,ブラックボックスの欠点(仕様が明確ではない)もある程度わかっていてとのことです.
さて,この問題は私はいくつか要点があるように感じてます.
まとまってませんが,こんなことを感じているところです.
私にとって「Javaが好きになれない」理由は,やはり標準APIの難しさ・面倒臭さです.そんなに過激な事は言っていないのですが,あまり開発者に優しくないんですよね.そこが嫌いなところです.
Commonsについてはどちらかというと肯定なのですが(もちろん嫌いなプロダクトもあります),リスクもあるわけですし,artonさんのおっしゃる通りチーム内の教育にはよくないという気持ちはよくわかります.
また充実したAPIやライブラリを備えていても,(その場面に合わせた)ユーティリティクラスを作る事は常にあるわけですから,それらを否定するつもりはないのですが,どうも程度の問題でJavaのソレは「レベル低すぎ」と思ってしまうんですよね(^^;.今回の動機はそこに集約されています.
ああ,まとまってないや,まぁいいや.
東京駅を目的地にして計算してみる.
飛行機の場合:
40分: 自宅-駅 40分: 駅-空港 30分: 登場手続き 70分: 飛行機 20分: 羽田チェックアウト 30分: モノレール 20分: 浜松町-東京駅 計: 250分=4:10 1020: 自宅-空港 15200: 飛行機運賃 特割1 470: モノレール 150: 浜松町-東京 計: 16840円
新幹線の場合:
40分: 自宅-駅 210分: 駅-東京駅 計: 250分=4:10 340円: 自宅-駅 16660円: 駅-東京駅 のぞみ 計: 17000円
うーん,時間もコストも変わらないな.
やはり時間的・手荷物の制限が緩い新幹線がいいなぁ.
何しろこの前飛行機で行って逆に到着時刻が遅くなってしまった経験をしてしまったので飛行機という選択肢はあんまし考えられないや.
やはり沖縄とか北海道とか遠隔地でないとあんまり意義を感じない.
うーん,思ったほどActorの性能はよくないみたいだけど(Erlangと比べて),それはそれとしても,結構読みにくいコードになっちゃうな.
まぁ慣れていないからだろうけど....
それからScalaに手馴れた人が書くと,コードも違ったものになるなぁ.例えばArrayのメソッドと関数オブジェクトを利用してみたり(ex: Iterable#foreach),シンボルを使ってみたり(ex: case: 'write),演算子メソッドを多用してみたり(これは可読性がいいのか悪いのかわからない),参考になるな.追記: ErlangのActorとScalaのActorはほぼ同じものと考えていいらしい.しかし実装はかなり違っているみたい.ScalaはThreadと併用しているように思われる.
いまいちわかってない.Scalaのソースを見てると定数として使われているところもある.それはなるほどと思ったけど(match caseできるので).
一方定数なのだけど,公開する場合はやはりobjectで公開するのが吉なのかな.内部公開ならtraitでもabstract classでもなんでもいいのだけど.
その辺実用的なプログラムを組もうと思うと別の言語であるために悩むことも多い.
objectとclassが分かれるのもまぁ戸惑ったりするところなんだけどね.
実はあんまり知らない.実装もちょっと眺めておいた方がいいのかなぁ.
やはり実装されたご本人の説明が参考に.
むー,Actorとは違うような気もするけど,基本はそう変わらないのかな.
なるほど,最近Scalaになれているせいか,Rubyのコードが読みにくくなってる(ALGOLぽい表記を受け付けなくなってる(^^;).
有効に使うためには,ブロックされないIOを使う必要があるとか,処理単位である程度処理の粒度を考える必要はありそうだね.
ScalaのActorがもうちょっと強いものだったら面白いものにありそうなんだけど,今のところどうなんだろうね.ちょっと遊んで見なきゃ.
JavaだとconcurrentなAPIがあったりnon-block IOとかあったりするので,むしろ有利そうだけど,ScalaのActorはまだリソース面で不安がありそうだから,記述のしやすさそのものが有効なのかも.
RubyのFiberは比較的多めに生成してもちゃんと動くみたいなので,面白い事ができそう.
いろいろ調べてみるとWindows上ではjava.io.Fileは遅いのだけど,File#listFilesなどはNTFS上ではどうも遅くないっぽい(こちらの実測ではあまり変わらないように思う).
FastFileを作られたK.Takata氏もおっしゃってるけど,NTFSではOS上での検索アルゴリズムが変わっているらしく,ファイルの抽出は比較的コストが低いかもしれないとのこと.
でもそれ以外にもあってFileのメタ情報である,名前・更新日付・サイズなどの情報の取得にはそれなりにコストがかかるらしく,画像ビューアであるCaffeineViewerではそこがボトルネックになっているようだ.
既に対処済みなのだけど,そのメタ情報をキャッシュするようにするだけでも,ソーティングなどが大幅に効率的になるのがその証拠だ.
しかしその状態でもjava.io.Fileを使わずFastFileに変えるだけでも30%ほどパフォーマンスが上がる.
逆に言うと,現時点ではNTFS上・Windows 2000以降であれば,java.io.Fileでも思ったほど遅くないと思う.
といっても,CaffeineViewみたいにただ単にFile#listFilesするだけではなく,listFilesしたリストからメタ情報まで取得するような状況ではあまりかわらないのであって,jFDのような場合は違うのかもしれない.
でもそろそろJava 6上でちゃんとベンチマークしてみるべきかもしれない.
なんだかなぁ.エンジニアに大切なところはたぶんそんなところじゃないよ.
たとえば個室.個室には仕事を集中できるというメリットがある.一方で低いパーティションで仕切られる日本式の仕事場にもメリットがあって,人が常に近くにいるという状況も仕事を進めるにあたっていい環境となることが多い.
うまい飯をただで食わせるというのもあんまり関係ないんじゃないかなぁ.まぁ家族がいてかつ給与面に不安があると,仕事に集中できないだろうから,働いた分の給与を与える必要はあるだろうけど.
でも賛成したいところは個室とかそんなところではなくて,「少数精鋭」というところだ.基本的にプロジェクトがうまくいく基準は5人前後といわれていて,それ以上になると破綻することが多いと思う.もちろん実働部隊が5人だけですまない場合が多いわけだが,コアメンバーや小隊の人数は少なくすべきだ.
ということでこの記事はあくまでも参考程度に読む必要がある.
うーん,おもいっきりかぶるな.しかも本気ならかなうはずもないくらい完成度が高いだろうし.
Java SE 6でもある程度改善が見られるようですね....でもまだ改善の余地がある.
サードパーティ製のセンサーバ、なかなかよさそうですよ。プレゼン用に買っておきたいところ。
時間でオフタイマーを試してみたが、ほぼ1時間でセンサーバーの電源が切れた。ただし、なんの前兆も告知もなく、いきなりLEDが消灯してしまうため、ゲーム中だと突然操作ができなくなる可能性が高い。これはちょっといかがなものか? また、電源ONのまま切り忘れてしまったときに防止機能もないため、使っているときは注意したい。
これってプレゼン用途を考えてですよねww(違う.
って,簡単に言えばこんなところなのかな.
用は,コンテンツ本体だけではなくてメタデータをどう扱うかがCMSの本質なんだろうな.
んーとそれほど面白い記事ではないのだけど,でも興味深い.
最初はお手製の道具で測ってうまくいかず,専用の道具でもうまくいっていない.いや測れてはいるけど誤差が大きい.
この手のちゃんとした計測器でもちょっとした不注意で誤差を生む.
そういう経験を子供たちにもさせてあげたいなと思った次第.ちゃんとした計測器を貸し出して地域の建物などを計測する課題とか面白そうじゃない.夏休みの課題にぴったり?
興味深い記事.基本的にLPに高い周波数を含めた情報を入れ込むことは可能だろうけど,再生するのはかなり難しそう.何せ物理法則には逆らえないので,共振・慣性・ヒステリシス・その他の原因から思ったほど情報は引っ張れ出せないように感じる.
さて気になったのはCDの方で,シャノンの定理からサンプリングは3倍とか5倍の奇数でかつもっとオーバーサンプリングな周波数でサンプリングせよとのお達しなので,44.1KHzでぶった切るという行為自体かなりナンセンスだと思う.少なくとも10KHz以上の周波数はまともにサンプリングできていない(フィルタの特性とかどうのこうの以前の問題).
今ならハードの進歩でもっと高い周波数で取れるだろうし,比較的効率のよい可逆圧縮と併用すればCDと同じ媒体でももっと情報を詰め込む事は出来るだろう.
またSACDみたいにもっと高い周波数でビットストリーム(1bitノイズシェーピング)で記録するという方式もあるから,いろんな意味でCDはマニア向きな特性の媒体にはなっていない.
しかしじゃぁCDの音質が悪いかというと,やはり高音は不自然な感じはするが,今時の高次のデジタルフィルタとDAコンバータは安価でもなかなかいい性能を出すので,気になるほどではない(少なくとも一般人には).
結局のところ当時の技術ではなかなかいい線で規格された媒体だったということなんだろうな.
それから人間の耳は高音(20KHz以上)の音はあまり聞き取れない性質があるが,倍音は聞き取れているという研究結果もあるので,20KHz以上の高周波部分も情報としてあったほうがいいらしい.
たぶんそういう前提があってSACDが作られたのだろう.1bitのノイズシェーピングは,高音になるほど分解能が劣化するが,ある意味合理的な特性になっていると思う.
こちらの記事.
Results ray.java 12.89s ray.scala 11.224s ray.groovy 2h 31m 42s
Scalaの実装を眺めてみたりクラスファイルを逆アセンブルしている人間としては当然の結果かなぁと思うけど,Groovy大敗.ここまでとは思わなかった.
原因はScalaはほぼクラスに1:1で,なるべく静的に解決しようとしているのに対して,Groovyは動的に解決していることが多いというのが起因でしょうね(リフレクションを多用してそうだし,実行時まで決まらない型はインタプリタ的な扱いになってるだろうし).
たぶんjijixiさんの心配なされているようなコードの悪さじゃないと思います(チューニングすれば数倍は速くなるかもしれませんが).
それから若干javacのよりscalacの方が速いのも面白いところですね.
追記: groovycは使ってないとのこと.どうもインタプリタでもバイトコードにコンパイルされて実行されるらしいので大きな問題ではないらしい(2から3秒程度違うだけとのこと).
追記2: Groovyの小数点演算がdoubleで(だけで)はない事がかなり大きいのかも.内部でBigDecimalで計算されていれば,もちろんけた違いに遅くなりそうなので,ちょっと可哀想ではありますね.一応"d"付でコードを書いているようですのでdoubleで計算することを期待したコードにはなっているようですが.
![[写真: 滑走路] [写真: 滑走路]](http://cappuccino.jp/keisuken/logbook/images/20070907_0.jpg)
![[写真: 管制塔] [写真: 管制塔]](http://cappuccino.jp/keisuken/logbook/images/20070907_1.jpg)
サイクリングがてら近くの空港まで.
なんにもない土地にこれだけ広大な施設があるとなかなか圧巻.
近くとはいえ朝でも汗が出るほどの運動量があるのでちょうどいいサイクリングコースなのかも.
Twitter@kmizuより,
object ClassName {
def unapply(c: java.lang.Class) = Some(c.getName())
}
object MethodName {
def unapply(m: java.lang.reflect.Method) = Some(m.getName())
}
val c = "hola".getClass()
val m = c.getMethods()(0)
for(ref <- Array(c, m)) {
ref match {
case ClassName(name) =>
System.out.println("The class name is " + name)
case MethodName(name) =>
System.out.println("The method name is " + name)
}
}
不思議なコードだ,というよりかなり解りにくい.case ClassName(name)で,ClassName#unapply(c)が呼ばれてるって事だな.でnameとして返り値が帰ってくると.
でunapplyの引数がClassタイプかMethodタイプかを判断してるってところか.
ちなみに,Someは,
case final class Some[+A](val x : A) extends Option[A]
てな事(case class)になってるので,match { case ...} でパターンマッチングできると.
で,我らが先輩であるjijixiさんによると,
なるほどそういう風に使うのか.
applyメソッドを使うと,Array(...)の様に,返り値を持った関数の様にも使える.
object Length {
def apply(s: String): int = s.length
}
println(Length("Foo"))
とすれば,3が帰ってくる.Length.apply()とLength()が等価.
利点は簡単で,importすれば,objectを関数代わりに使えるという事.ユーティリティメソッド代わりにできるかな.
もう1つは,クラスそのものを関数オブジェクトの様にも使えるという事.
class Name(name: String) {
def apply(): String = name
}
val name = new Name("Foo")
println(name())
これを実行すると"Foo"が表示される.
なんか,かなり重要なところは抑えたつもりだけど,まだまだ調査する事が多いな.Scalaはカオスだけど,覚えれば覚えるだけ楽が出来る.
追記: jijixiさんの同じ日の日記を読んでると,PartialFunctionというのもあるのか.いきなりパターンマッチング書けるというのは便利そう.
いろいろあるんだけど,いろんな意味でかっこいいよねぇ.
やっぱり押井守は監督やっちゃいけないなと思ってしまった(何人かの方に怒られそうだけど(^^;).
2nd GIGでは押井守はストーリーコンセプトをしていて,基本的に監督はやってない.監督はS.A.C.と同じく神山健治で,S.A.C.の良さをそのまま引き継いでくれた.
と共に,ストーリーコンセプトに押井守が参加することによって重みや深みが出ている.
いや何が言いたいのかというと,押井守には2段ほどクッションが必要だということだ.一般向けならなおさらで,自身が監督するのはあまり好ましくないと思っている.
もちろん,GHOST IN THE SHELL / 攻殻機動隊,イノセンス,ビューティフルドリーマー,パトレイバーシリーズなどは好きだし,面白いと思ったが,やはりあくまでもマニア向きだよなと思う(唯一一般向けだったのはビューティフルドリーマーか).
それはともかく,一番気になったのは丸いヤツラだったわけだが,人工衛星にアレを積むのは無理な設定だ.遠隔で機械を制御するのに一番のネックは通信で,遅延と妨害が問題になる.
静止衛星なら常に通信ができるだろうが,遅延がかなり大きい.周回軌道なら遅延は無視できるだろうが,今度は周期的に直接通信ができなくなる.
もちろん地上のネットワークと併用すれば常に通信は可能だろうが,遅延が周期的に変わり,機械制御はかなり難しくなる.
また遠隔制御の場合,大深度地下など通信が出来ない場所では運用がそもそもできないから,エトロフでのげふげふな作戦なんか実行できなかったはずだ(実際には通信設備が設置されていたみたいだが).
まぁそれをいえばイノセンスだって後半のドンパチで素子が衛星でドールを動かしていたわけだけど,あれは中継する衛星を動的に変えるだけでいいし,遅延は少なかったはず.また自身の一部をダウンロードしていたというシーンもあったので,あっちはさほど問題じゃない.あれより今回のアレはもっと難しいということだ.
それが気になってあんまり後半は集中できなかった事だけ書いておくね(^^;.
ちなみに素子が人工衛星にアレを積んだのは,もう2度と失わないようにとの措置なのだろうけど,人工衛星はいづれ壊れるし,耐久時間が短いからちょっとなぁ,というのもありました.
まぁ最後はアレ自身が自分のコピーをどこかにしてたからふがふがするんだろうけど(^^;.
@html(lang: ja-JP) {
@head {
@title {へろーわーるど}
}
@body {
@p(class: foo, alt: "だんらく") {
だんらく
}
@p あいうえお@strong{か}きくけこ
}
}
JSONぽい記述がいいのかなぁと画策中.このアイデアは結構前から.
利点は,終了タグが冗長でないこと位かな.欠点はWikiよりも読みにくくなることかも.
Wikiと比べると利点はかなりあって,行指向ではないので要素の階層化が出来る事(Wikiでは階層化は限定的)かな.
いちおう行指向記述も用意しておく.
Wiki記法としてはもうちょっと簡単な方がいいので,
! あいうえお
あいうえお'''か'''きくけこ
@div(class: figure) {
@img(src: cover-title.jpg)
}
<H1>あいうえお</H1> <P>あいうえお<STRONG>か</STRONG>きくけこ</P> <DIV class="figure"> <IMG src="cover-title.jpg"> </DIV>
とかできたらいいのかな.Parsingが面倒臭そう.
興味深い.DRUMは明らかにメソッド呼び出しが遅いので(Socketを使っているので),Rjbが有利.ただしThreadを使う場合は完全にプロセスが分かれているので問題にはならないのだが....
今のところ素のRubyとしてはJRubyの完成度が上がってきているが,まだC Rubyには及ばないところがあるから,RubyからJavaと連携したい場合はJRubyかRjbかになると思います.
私の場合は最近ScalaからJavaを呼び出すことばっかりやってるが(何しろScalaは型ありきだし),Rubyのよさをそろそろ再考しなくちゃな.月末にRuby勉強会@関西で発表するし.
無料評価版を公開中との事ですので,組込をやっていてJavaに興味ある型は是非.
フィードバックがあれば,Java界のプラスにもなりますし,今後Javaで組込という世界も広がるので協力をお願いしたいです.
ここではでてきていないけど,科学的に実現はできるが,倫理的に実現されていないものもあるし,想像されたものよりももっとぶっ飛んだのもできてきてる.
武装した車なんか,そのまま装甲車もあるし,戦車もある.
偵察に関しては,車やバイクだけではなく,今ならステルス戦闘機もあるし,無人偵察機も使われ始めたし,偵察衛星もある.
新聞を家で聞ける,となるとラジオとかTVもあるだろうけど,今ではインターネットがその役割になりつつあるし,音声メモなんか,今なら携帯電話でもできちゃうし,そのままメールで送っちゃう事も出来る.
面白いなぁ.
特に1900年初旬にはなかった概念はマッシュアップというか統合だ.例えばGPSとカメラを組み合わせて写真にメタ情報をつけるだけではなく,例えばGoogle Earthでやっているような,地図と写真を組み合わせたり....
1つ1つの技術は細かい経験や技術の積み上げで,生活にあまり大きな変化はないかもしれないが,それらの組み合わせで現在の生活は豊かになっていると思う.もちろんその反面黒いものがたくさんあるわけだが.
なんかほとんど実現されているだけではなくて,そういう想像ができた事自体凄いなぁ.
ネットで買い物,オンライン決済,監視カメラもPCで観れるようになってるし....さすがに電源ボリューム(SW?)とかついてないけど,PCの形もそんなに違ってないかも(もっとスタイリッシュだけど).
いやこれみて思ったのは,Note PCはいいとしてもデスクトップは相変わらずでかい本体を持ってるよなということだろうか.まぁ新型iMacみたいなスタイリッシュなコンピュータもあるけど.
スクリプト言語とか書いてる人は必須情報(どんだけいるんだ(^^;).
Java での クラスの再定義方法:
- java.lang.instrument.Instrumentation#redefineClasses メソッド: 英語, 日本語
- JVMTI の RedefineClasses 関数: 英語, 日本語
- Java 5 以降で標準機能になった。千葉先生に教えて頂いて知る始末。
もうJava 5未満をサポートする理由なんてないね(怒られそうだけど).まぁgcj/gij/GNU Classpathなどを使っている人には悪いけど(最新版はGenerics/Enum/Anotation/に対応しているらしいが...).
マシン語が必要ではない場面であれば学ぶ必要はないと思う.
私はZ80やx86な機械語をハンドアセンブルやアセンブラを使って遊んでた時代があって,CPUのアーキテクチャや原理を知るにあたって有意義だと感じてはいるものの,機械語を学ぶ事が必須という論調には否定的だ.
アルゴリズムにしろ,機械語にしろ,何も最初から全部学ぶ必要なんかない.最初から全部なんて無理なんだし,必要に応じて学んでいけばいい.
それよりも最初からOO言語でも関数言語でもいいから,もっとマクロなレベルから初めても大丈夫だと思う.教える側はそれなりに気を使うだろうけど.
追記: この議論は@kmizuとやってた.私だけの結論じゃないが,ほぼ同じ考えだ.
個人的にはHibernateよりもActiveRecordの方が好み.ActiveObjectsがそんな感じのものになってれば使うかも.
性能はActiveRecordと十分張り合える感じだけど,先がRDBMSだからか大きな差がない感じ.
Scala 2.6.0 finalがリリースされてたのか.まぁこっちはぼちぼち入れ替えよう.
MVELについてはあんまり興味ないなぁ.Scalaほどインパクトがないので.ただしJBossにバンドルされているみたい.
またJava Beansをうまく取り扱えるように文法ができていて,Web系で使うのには向いている感じ.というより意識しているわけなんだけど.
ちょっと欲しいかも.
ちょっとしたデモでサーバを持ち出しする時とか,そういう時にはモニタが必須だから,こういった小さなヤツは重宝しそう.
といってもそうそう機会があるわけじゃないし,Note PCをサーバにでっち上げるなんて技もあるわけだから,使う機会少なそうだけど.まぁ自宅サーバのモニタとしても使えそうだから1台買っとく?
というよりさ,いい加減小さいモニタを出してくれませんかね.
@takaiさん召還されてますよー.
んー,Rubyそのものが不利という話もありますね.とはいえ,同じオブジェクト空間を使ってるJRubyがC Ruby + rjbに負けているのは感覚的にアレかなと思いますが,rjbの(作者が)明示的な型指定でコストを下げている点を考えれば確かに納得いく結果かな.
ちなみにDRUMでやったら数倍から数十倍遅いと思います.
これだけに特化した言語ならDSLだ.
card.id = "XXXX-XXXX-XXXX-XXXX" phone.no = "090-XXXX-XXXX"
これを,
$ dareka_no_kane_de_pizza_wo_tanomu yoshiori.dkpt
とかやると,どういう仕組みかわからないが,
が行われる言語.
もちろん,card.idの主とphone.noの主は同じにしてもいいが,別にしてもいい.別にしておけば,カードの持ち主のお金でピザが喰えるというものだ.
アイデア: @_tad_
追記: card.id,phone.noに特化してるのなら " で囲む必要もないな(´д`).
追記2: なんかP(l|r)aggerぽいような気もするが気にするな.
行ってきた.
場所は,浜名湖の某ホテルで,浜松駅から送迎バスで30分.結構遠い.
浜名湖のほとりではあるのだが,残念ながら浜名湖本体は見えない位置.でも結構いい景色.
15日,16日の両日あり,K PMとM PMの合同で,私の番は2日目.
発表はちょっと駆け足だったのだけど,まぁ無事終わった.
質問や注文があった.合同というのはやはり意義があるなぁ.
他にもいくつか.
帰りは浜松駅まで送迎バスで買える.
残念ながら浜松駅周辺は車がないと観光ができないことが発覚したので近くの楽器博物館へ.かなり地味なものなのにそこそこ楽しめてしまった.
博物館は一人で行くより複数人で行くと結構面白いかも.
jargonの日記で知ってはいたけど,録画しない・観ない.
作者は地元出身の豪腕一条ゆかりだし,マンガは大好きで単行本を持っているぐらいだがこういうのは生理的にだめ(^^;.
(もちろんTVドラマ化を否定するつもりはない.実際うまくやってる作品も多いから化けるかもしれないが,好きな作品ゆえ汚点を見るわけには逝かないのだ(^^;)
以前取り上げた話題.Matz氏が書いたのでその感想.
確かにMatz氏が言うように動的言語が遅いよという結論には行きにくいかも.また理由についても私が書いたのと同じでちょっとほっとする.
たぶん同じ処理をさせたらRuby + YARVでも遅いと思うし,傾向的に動的言語は遅いと思うけど,実際にベンチマークとってくれないかなぁ.
ただ今までの経験では,コレクション周りがJavaの方が遅かったり,あるいは大きな確保が出来なかったりする短所も見え隠れしてるから,静的か動的かだけではなく実装や仕様によるパフォーマンスの差異はかなり大きいと思う.
いつも誤解されるんだけどJava擁護派でも,やはり遅いシーンなんていくらでもあるんだから何が何でもJavaサイコーなんていうつもりはないですよ.
むー,見栄えの変更はオーサリングツールでできて,もちろんバージョン管理もできて,PowerPointのサブセットという感じだ.
Web上で動作するので,Webブラウザで表示できるし,共有機能で公開することも可能.
ただスタイルシートというかメタ情報をあまりいれなさそうな感じなんで,欲しいものとちょっと違うなぁ.
とはいえ,完成度はかなり高い.手ごわい.
3D CMSにはプレゼンテーションモードがあるのだが,現在使用しているSlidyのライセンスはW3Cのであるらしく,商用での配布などで問題があるかもしれないということを報告会で聞いた.
ということで,今のうちにライセンスが自由そうなS5に移行する事を考えておく.
とりあえずContentFilterの修正で対処可能なんでS5を使って慣れておかなければな.
静的なDuck Typingみたいなもの.
class Foo {
def name = "Foo"
}
class Boo {
def name = "Boo"
}
val ma = Array[{def name: String}](new Foo, new Boo)
for(m <- ma) println(m.name)
継承関係のないクラスの同じ名前,同じシグネチャのメソッドを呼び出すことができる本当にDuck typingなもの.
これは用途によっては便利かもねぇ.いちいちabstract classとかtraitとかしなくともいいわけだから,適当につくったクラスやオブジェクトをまとめて扱う事が出来そうだし.
ただしメソッド名とメソッドシグネチャが合わないといけないのでつじつま合わせは必要.
class Foo {
def name = "Foo"
}
class Boo {
def name = "Boo"
}
def name(m: {def name: String}): String = m.name
println(name(new Foo))
println(name(new Boo))
なるほど,あらかじめ静的に型チェックはできそうだね.
純粋なfirst-classな言語であればこんなことをしなくとも,全部クロージャにすればいいわけだけども,そうしないのは,Scalaも実は純粋なfirst-classな言語じゃないからだ.これはRubyとも似てるけど,Java/C#寄り.
内部では,たぶんリフレクションで実装されていると思う.一応使う型があらかじめ決まっていれば,キャストすることで実行は可能だが(最適化の余地),不特定のクラスの場合はそうはいかないので,事前の型チェックのみで実行時はリフレクションということになりそう.
とかなると,この辺そこそこなパフォーマンスで実行してくれそうなinvokedynamicとか良さそうなんだけど,結局仕様は詰めれたんでしょうか.
Schliemann自体はNetBeans専用ではないようなのだけど,これを上手く使うとエディタの補完や文法チェックなどに使えるみたい.
ScalaはNetBeansに対応していないので,これで作ればポーティングできるかも.
といっても自分でどうにかするつもりはないので他人任せ.
ダメです.明らかにコード数が増えます.
こういうのはScala向きのようですね.特にimport文が便利ですし.
とりあえず3D CMSには,Wikiモードとプレゼンモードがあって,Wikiモードがアウトラインモードとほぼ同じ意味になってるのだけど,図などのオブジェクトも一緒に表示されているのでそれを省略できるようにしなくちゃいけないよな.
さてGoogleDocsのプレゼンテーションだけど,アウトライン以外にもっと重要なものが抜けていて,ZIPファイル化して外部に持ち出せるのだが,これをブラウザで開いても体裁がぜんぜんダメで,これだとネットワークなしの環境ではプレゼンすることはできず,意味ないなぁという感じです.
それからスタイルシートがないことかなぁ,テーマではなくて,文字装飾やレイアウトなどが一発で変わらないと手間かかりすぎです.
まぁまだαかβでしょうから,徐々に改善していくのでしょう.
ただ脅威に感じるのは,機能不足かどうかじゃなくて(単独機能の)完成度が高い事なんですよねぇ.
W3Cのソフトウェアライセンスは以下の通りだそうです.
私が解説すると誤解を招く恐れがあるので,各自自分で読んでくださいませ.
とりあえずHTMLやXML,Slidyなどをそのまま使いつづけるのに問題はなさそうに思えます.
ちょっと古いのですが,日本語訳が見つかりました.
TwitterやってるとやたらPEGが目に付く.実はPEGという省略語はつい最近までしらなかったりした(内容は知っている).
というか,そういう話が目に付くTwitterって偏ってるよねw.
こんな団体が地元にあるのは始めて聞いたぞ:-).
ということで丸山先生が来られるとの事.
参加表明しときましょうか.
VisualWorksすげー.またYARVもすげー.
こんだけ速ければ,今までCやFORTRANでばりばり書いてたコードをSmalltalkやRubyで書いてもいいケースは増える.
BSアニメ夜話 第9段放送決定!.
9月25〜27日 各日24時!!
第1夜 「ど根性ガエル」
第2夜 「銀河鉄道の夜」
第3夜 「カウボーイビバップ(TVシリーズ)」
BSマンガ夜話 復活。
11月27日(火) 24:00〜 「作品未定」
11月28日(水) 24:00〜 「作品未定」
11月29日(木) 24:00〜 「作品未定」
RubyのsnapshotをCygwinでビルドしようとするとどうしても失敗する.しょうがないので,ruby-1.9-mswin32版を取ってきてそれを使った(そもそもビルドすることに興味はない).
f1 = f2 = nil
f1 = Fiber.new {
f2.yield
}
f2 = Fiber.new {
f1.yield
}
f1.yield
とかやると,f1が実行され,f2が実行される.RubyのFiberは順番が守られるようだ.
なおFiber.currentとかすると現在のFiberが返ってくるし,
Scalaの場合は,
case class E
var a1 = null
var a2 = null
a1 = actor {
react {
case E => a2 ! E
}
}
a2 = actor {
react {
case E => a1 ! E
}
}
a1 ! E
ちょっと冗長だが,基本的には同じ.reactはレシーバになっていて(返り値のあるreceiveもある),!メソッドによって呼び出される.caseで条件分岐されているが,どうも必ずメッセージ引数が必要で,なんらかの値を送っておく必要がある.今回はダミーでcase object Eを送っている.
ちなみに呼び出しの順番はきちんとは守られない.といっても並行機構では必ずしも順番は大事ではないので別に構わない.
ScalaのActorの順番が守られないのは,内部で並列化されているからだ.実際には並行・並列のハイブリッドになっているようだ.
FiberもActorももっといろんなことができるが,Ruby勉強会ではこれ以上は突っ込まない.
なお,Scalaの場合は,
val a1 = actor {
var i = 0
loop {
println(i)
i += 1
if(i == 100) exit
}
}
a1 ! E
とかやると,ループされる.
なお,actor, react, loopはすべてメソッドで,関数オブジェクトを代入している,という仕組みになっていて,Actorのために文法を作ってはいない.
Fiberもループされるようだ.
f1 = Fiber.new {
loop {
...
}
}
ちなみにloopはもともとRubyが持っている組込関数だそうだ.
というのをあらためて思った次第.
Scalaは関数型言語ぽく,Rubyとは性質が異なる事もわかった.
クラスを関数オブジェクトぽく使えるapplyメソッドや関数オブジェクトなどがScalaにはあって,RubyにもブロックをオブジェクトにできるProcなどがあるが(Proc.new, proc, lambda...),あんまり関数型ぽくない.
Scalaも思いっきり手続き型の言語でもあるけど,関数型の言語とも言えるのに比べて,ほぼおなじ事はできるけど,Rubyは手続き言語的性質が大きいように見られる.
そのあたりを説明する必要があるかな.
それから動的性質とメタプログラミングの関係も紐解く必要がある.
たぶんメタプログラミングと動的性質は相性がいいのだが,ここらへんを明確に例を示しながら書いておきたい.また逆に静的型付でもメタプログラミングができることも述べておかないとRubyなどの動的言語しかできないという誤解を招くので比較しておこう.
とりあえず,両者の文法とコード,FiberとActor,メタプログラミングあたりで攻めようと思う.
Scalaは,Java ME CLDCや.Netなどに対応している事はあまり知られていないが,浮気してみました実装ではなくて,ちゃんと実装されているようだ.
残念ながらランタイムであるcldcapi10.jarは117KBもあるので,iアプリなどには向かないが,SmartPhoneやPDAなどの機器なら十分動かす事ができそうだ.
一方.Net対応は,ソースを見る限りちゃんとやってそうなのだが,動かした事がないので完成度については未知数.
ただしランタイムは実装済みのようだし,ScalaコンパイラとランタイムはJavaと.Netの固有の部分以外は共通で分離されているようなので,バージョンアップがされてもちゃんと追従できているようだ.
ということで実はCLDC/.Net対応もかなりのトピックだと思う.
Twitterでは流れてしまったのに今更ながら再掲.
まぁ基本的に万能だと思いますよ.ちゃんと逃げ(Plug-inなど)は用意してくれてるし.
「規約うぜぇ,規約がRailsの特徴ですよ」というコメントがあって笑いました.両方とも大事で,立場によってやはり好みは分かれると思います.まぁ仕事だと好みではなくて,開発効率や品質,運用面での問題などが大事であって,好みは二の次でしょうけど.
で(仕事で)流行っているかどうかというと,話題に上がっていてそれなりに試してはいるので,流行っていると言えるけど,絶対数では少ないので,それほどでもないというのが現状でしょう.
やはり開発環境としてのできよりも,Ruby言語の経験不足(他の言語からの移行コスト),パフォーマンスが悪い,スケーラビリティ向上の法則がわからない,などの要因がボトルネックになっていて,普及を阻害していると思います.
パフォーマンスの悪さについてはWebアプリはフロントエンドで使われ,大半はデータベース処理に時間が喰われるので問題ない,という主張は間違っていないのだけども,やはり大きなサイトではデータベースに関係しないWebアプリもあるわけだし,少しでも速くしたいという要望が多いので,その論法は通りにくいでしょう.
ということでRailsを採用したとしても,Webコンテナをどういう組合せ・構成にするのか,負荷分散はどうするのか,パフォーマンス不足の部分にJavaやPHPと組み合わせるのかなどのノウハウが必要になってきますので,運用面ではいろいろ悩むと思います.
開発そのものについてですが,たぶん炎上しないように開発していくのは多くのケースで可能だと思います.良著なRails本がいくつもでていますし,AgileやXPの本質をちゃんと見抜いている人なら開発スパイラルをうまく向上させる事ができるはずです.
ということで「Railsが悪」という論法には否定的かな.
パフォーマンス不足については,今のところRailsの仕組み上しょうがないようです.eval使っているところが多いとの事で,YARV enabledな環境で動かせたとしても思ったほどパフォーマンスは良くならないと思われます.まぁ逆に言えばRailsのリファクタリングをすれば向上する余地は残っているともいえますが,開発スタイルと実装が密接にかかわっている事もあり,全く同じ開発スタイルのまま改善するのは困難かもしれません.
まぁそれらはともかくとして,JavaなりPythonなりPerlなりのWebアプリケーション開発環境になんらかの影響を与えたのは事実で,軽視すべきものじゃなさそうですね.
一般的にSecure Shellのことだと思いますが,JavaのSSHは別の意味があるらしいのです.
実はこの意味を知ったのは最近で,はっきりいうと「あんたバカァ」といってしまいたくなります(SSH(Struts+Spring+Hibernate)はマイナーすぎる).
まぁ,IDEなしで開発するのが難しい環境は興味ないからどうでもいいですけど.
Scalaって妙に融通が効かないところがある.例えばループでbreak文が使えないことだ.
この前ちょっと困った事があった.
Reader reader = ...
char[] buf = new char[64 * 1024];
int len;
while((len = reader.read(buf)) > 0) {
...
}
というコードを何気なくJavaでは書いてしまうわけだが,Scalaだとうまくいかない.
var reader: Reader = ...
val buf: Array[Char] = new Array(64 * 1024)
var len: Int = 0
while((len = reader.read(buf)) > 0) {
...
}
を実行すると,
while.scala:8: warning: comparing values of types Ordered[Unit] and Unit using `>' will always yield false
とか言われるので,面倒なのでこう書いちゃう.
var reader: Reader = ...
val buf: Array[Char] = new Array(64 * 1024)
var len: Int = 0
def read: Int = {len = reader.read(buf); len}
while(read > 0) {
...
}
innner methodは,親メソッド内の変数を取れるので,こんなことができる.
どうもこの手のはまりどころはメソッドにする,というのが鉄則になるのだろう.
まぁそもそもブロックやユーティリティメソッドを持ったIOクラスを作ればいいじゃん,という問題なのだが,局所的にこういうコードが必要な場合はそうはいかないから,こういう方法もあることを覚えておこう.
val keys = Array(1, 2, 3)
val values = Array("Foo", "Boo", "Bar")
val zippedValues = keys.zip(values)
for(value <- zippedValues) {
println(value._1 + "=" + value._2)
}
1=Foo 2=Boo 3=Bar
ふーん.
ちなみに数が合わないと,
java.lang.Error: zipping arrays of different length
とか実行時に怒られた.
なんかこういうLLではありがちなメソッドが標準的に搭載されていると違和感を感じる.いやこれがふつーなんだろうけど,Java APIは低レベルで細かい配慮には欠けるので,ちょっとカルチャーショックを感じるのだ.
追記: みずしまさんからTupleの値を直接変数に入れたらとのことで、
for((key, value) <- zippedValues) {
println(key + "=" + value)
}
がベストですね。
ブロックを使うといいらしいことがわかった.
var i = 0
while({i += 1; i} <= 10) {
println(i)
}
を実行すると,
1 2 3 4 5 6 7 8 9 10
となる.
ブロックを関数の様に使っているわけだ.
ということでこれを応用すると,
var reader: Reader = ...
val buf: Array[Char] = new Array(64 * 1024)
var len: Int = 0
while({len = reader.read(buf); len} > 0) {
...
}
とできる.なるほど.
ただしブロック内のコードが多くなると,可読性が悪化するので,必要に応じてinner method化すればいい.
ということでJavaよりももっと柔軟性があることがわかってホッとする.
うーん,観衆が置いてきぼりになるとは思ったのだけど,あえて重要な箇所以外はとばして話すようにした.どうしても濃い話題だからやむを得ないところがある.
膨大なページの資料も自分用として参考になるし,聴いた方も後から読んでふむふむと思っていただければなということで76ページ分書いた.
Gollumさんに宴会の後「時間内に終わらないんじゃないか」と指摘されたのだけど,最近はプレゼンの質はともかく時間だけは守るようにしているし,今回も時間内にできました.まぁリハーサルは3回ほどしているのでペースは把握しているのですけどね.
ということで,プレゼンタつたないかつちょっと難しすぎたなという反省はあるけど,資料もまぁまぁ用意したし勘弁してください.
Scalaはカオスな変態言語と言ったけど,Rubyが変態言語は言い過ぎw.いやPerlやPythonなどの一般人にも使えるLight-weightな言語ですよ.一般向けで判りやすく使いやすいということはすばらしい.
たぶん動的かどうかよりもそっちが大事かな.利便性を優先したというMatz氏の構想が特に近年好まれている事でしょう.
大学におけるRails教育の順番や教えるべきことについてはなかなか興味深かった.初めての人にMVCを教えてもやっぱり実感が湧かないと思う.実感を湧かせることがたぶん教育の本質だと思うので,最初はなるべく絞って話をしたほうがいいのかなぁと思ってました.
おかげでLingr/ruby-kansaiが凄い事にw.
Kagemushaも少ないコードで効果的なツールになっていて,Rubyの動的な性質を上手く使っていることに感心した.swapのブロック内だけ再現したいオブジェクトコードを入れ替えができて,テストで有効に使えると思う.
Javaだとこううまくはいかない.一応,Java 5からクラスの破棄を簡単にできるようになったので,おなじ事ができると思うけど,100行程度で収まるとは思えませんな.
Rubyの初級者講座は,思ったより難しいと感じました.オブジェクト指向も初心者は実感が湧かない分野ですよね.私がOOの本質が判り始めたのはC++を5年ほど遊びで使っている時はわからなくて(そもそもvirtual宣言がある言語は初心者には向かない),Javaを使い始めてからなんですけど,たぶん初心者はクラスもインスタンスもわからず混乱しそう.
はっきりいって背景って無地が一番ベストだよね.
大理石とかでこぼこした画像を貼ったりする人がいるけど,あれは字が読みにくくなるしちっとも人間に優しくない.
ということで色もつけない方がいいかも.白地でもいいと思う.
実際スタイリッシュでかっこいいサイトはそういうデザインが多い.
ということで初心者がWebデザインする時は,まず白地から始めよう.
未だにFreeBSD 4がイントラで動いている.
そろそろいろんなソフトウェアが動かなくなっている現状があるし,FreeBSD 6だとセキュリティやパフォーマンス,使い勝手が向上しているのでそろそろ移行しておきたい.
ということで現状では何が使えるのか調査中.
* DHCP: ISC版のdhcpd
* Samba: Samba 3.x
* MTA: Postfix 2.4
* IPフィルタ: IPfilterかなぁ
まぁDHCPもSambaもいい加減PCで動かさずに専用のストレージサーバでいいのかもしれないけど....
つうか,インターネットサーバ以外は低消費電力化をしなくちゃ.
やること、い〜っぱい(´д`)。
O きしだ [開催場所がステキなひびき]
O keisuken [きしださん: 場所が場所だけに女の子率も高いです:-).]