形式手法は前々から知っていて、興味は持っていました。
勉強しようと思うが、どのように業務にいかせるかな?っておもって手を出していなかったのですが、@ITMONOistでISO26262の開発手法が掲載されていました。
形式手法は組み込みでも使われているので、今やっている業務に適用できるかな?って思ったので、勉強してみようと思っています。
Alloy, Z , VDMなどはあるけど、Alloyが本があって読みやすいかな?とは思うので、
買ってみようと思います。
一応形式的手法とは
計算機科学における数学を基盤としたSW,HWのシステムの仕様記述、開発、検証の技術。
開発行程でエラーが入り込まないことを保証する。
要求仕様レベル、機能仕様レベルでは特に効果的であるが、実装レベルでも形式主義開発は可能。
2011年12月22日木曜日
2011年11月28日月曜日
SWTBotのantからの起動
SWTBotを自動化するためにantから起動できる方法を簡単に調べてみました。
eclipse.junit4.headlessのlibrary.xmlのantfileを起動するだけということ。
あとは、引数やプロパティを設定するだけという簡単な仕組みらしいです。
ふぅ〜ん。簡単じゃん。
でもMac動かないよw
Win環境がないから、プロパティが悪いのか、macのバグなのかわからない。
macはSWTのバグが結構多いらしいので、ちょっと踏んでる可能性があるからなぁ。
一応-XstartOnFirstThreadは渡しているから大丈夫なはず。
会社で調べてみるか。。。
eclipse.junit4.headlessのlibrary.xmlのantfileを起動するだけということ。
あとは、引数やプロパティを設定するだけという簡単な仕組みらしいです。
ふぅ〜ん。簡単じゃん。
でもMac動かないよw
Win環境がないから、プロパティが悪いのか、macのバグなのかわからない。
macはSWTのバグが結構多いらしいので、ちょっと踏んでる可能性があるからなぁ。
一応-XstartOnFirstThreadは渡しているから大丈夫なはず。
会社で調べてみるか。。。
description
2011年11月22日火曜日
RCPのdropins機能をつける
- 以下プラグインをdependencyに追加
- org.eclipse.equinox.p2.reconciler.dropins
- org.eclipse.equinox.ds
- 製品構成ファイルのconfigurationタブでスタートレベルを設定する。
- 以下プラグインはautoStartをtrueに
- 製品構成ファイルと同じディレクトリにp2.infファイルを作成する。ファイル内容は下記内容
- この設定によってRCPのエクスポートを行うとdropinsディレクトリが作成されている。そのため、dropinsにプラグインを配置すると自動的に読み込んでくれる。
<configurations > <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" /> <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" /> <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" /> <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="4" /> <plugin id="org.eclipse.equinox.p2.reconciler.dropins" autoStart="true" startLevel="5" /> <plugin id="ph.jpn.calm.rcp.sample" autoStart="false" startLevel="6" /> </configurations > |
instructions.configure=\ mkdir(path:${installFolder}/dropins); |
2011年11月20日日曜日
Apache Geronimo 3.0βリリース
Apache Geronimoは使ったことはないけど、ちょっと気にはかけているアプリケーションサーバです。JBoss,Weblogic,Glassfishが強いイメージですが、日本でどのくらい利用されているかは残念ながら知りません。
とりあえずJava,Groovyのみでできているアプリケーションサーバで、今回注目なのはOSGi対応になったらしくApache Felix Karafが組み込まれたということです。
今までのプラグイン機能を実現していたGBeanという機能が完全にOSGiのフレームワークに則ったシステム構成になるということです。
本家サイト:
http://geronimo.apache.org/
日本語サイト:
http://www.geronimo-users.jp/
とりあえずJava,Groovyのみでできているアプリケーションサーバで、今回注目なのはOSGi対応になったらしくApache Felix Karafが組み込まれたということです。
今までのプラグイン機能を実現していたGBeanという機能が完全にOSGiのフレームワークに則ったシステム構成になるということです。
本家サイト:
http://geronimo.apache.org/
日本語サイト:
http://www.geronimo-users.jp/
2011年10月11日火曜日
ニュートリノの光速超えについて
色々今巷で話題になっているので、ちょっとぼやいておこうかなぁと。
スラド での記事をみたのですが、時計の進みのずれが光速を超えたニュートリノの観測
になった可能性があるそうですね。
そこまで、重力の差異で影響はでるとは思っていませんでした。
でも、なんでスイスーイタリア間をニュートリノを飛ばして、そんな厳密なテスト
を行おうと思ったのだろうか?
経度が変わることにより重力に差異が出ることはわかっているはずなのに。。。
K2Kだって、ちゃんと経度があまり変わらない方向に打ち込んでいるはず。
時間の進みに補正をかけるということは誤差が出てその誤差が実際の測定の誤差になる誤差の伝搬が発生してしまうのではないかな。
業界から離れた人間がごたごたいってもしょうがないので、じっくり検証結果を待つとしよう。
スラド での記事をみたのですが、時計の進みのずれが光速を超えたニュートリノの観測
になった可能性があるそうですね。
そこまで、重力の差異で影響はでるとは思っていませんでした。
でも、なんでスイスーイタリア間をニュートリノを飛ばして、そんな厳密なテスト
を行おうと思ったのだろうか?
経度が変わることにより重力に差異が出ることはわかっているはずなのに。。。
K2Kだって、ちゃんと経度があまり変わらない方向に打ち込んでいるはず。
時間の進みに補正をかけるということは誤差が出てその誤差が実際の測定の誤差になる誤差の伝搬が発生してしまうのではないかな。
業界から離れた人間がごたごたいってもしょうがないので、じっくり検証結果を待つとしよう。
2011年10月9日日曜日
playコマンドの動作について
playの勉強会をUstで参加?したため、ちょっと色々コードリーディングして、
動作を把握していこうかなぁと思います。
まずは、playコマンドを叩いて起動する部分について。
> ./play run myApplication
と実行したときの動作。
commandsディレクトリの中にXXXX.py(適当なファイル名)を追加して、COMMANDSに独自コマンド名のリストを定義して、executeメソッドで起動をする。
動作を把握していこうかなぁと思います。
まずは、playコマンドを叩いて起動する部分について。
> ./play run myApplication
と実行したときの動作。
- playコマンド
- play_command、application_path、remain_argsを取得
- framework/pym/play/application.py
- application_pathからconf/application.conf、conf/routesの存在チェック。application.confのパース
- framework/pym/play/cmdloader.py
- commands配下にあるコマンドスクリプト一覧を取得する。
- コマンドスクリプトのCOMMANDからplay_commandと一致するスクリプトファイルを取得する。
- 一致した場合はスクリプトファイルのexecuteを実行する。
- runの場合:base.pyの中のrunを実行し、java_cmdでplay.jarを起動する引数を作成して、Popenで子プロセスを立ち上げる。
独自コマンド追加
commandsディレクトリの中にXXXX.py(適当なファイル名)を追加して、COMMANDSに独自コマンド名のリストを定義して、executeメソッドで起動をする。
java -javaagent:/Users/kazuhiro/work/play/play-1.2.3/framework/play-1.2.3.jar -Dfile.encoding=utf-8 -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Dplay.debug=yes -classpath [設定するパス]
-Dapplication.path=/Users/kazuhiro/work/play/play-1.2.3/myApplication -Dplay.id= play.server.Server
Playframework勉強会#2まとめ(スライド)
Playframework勉強会#2のスライド一覧みたいなのがなかったので、作ってみました。
逐次アップされたら更新していきます。
逐次アップされたら更新していきます。
時間 | 発表者 | タイトル |
---|---|---|
15:05~35 | @ikeike443 | 「Play! の紹介」 |
15:35~16:05 | @garbagetown さん | 「playdocjaのこれまでとこれから」 |
16:10~16:40 | @genki_ さん | 「Play!で作る業務アプリケーション構成例」 |
16:40~17:10 | @hagikuratakeshi さん | 「Play! + GAEで作ったアプリをPlay! + Heroku で動かすとどうなるか」 |
発表者 | タイトル |
---|---|
@daiksy さん | 「大阪勉強会の続きのはなし」 |
@kara_d さん | 「Play FrameworkでWebSocketを使ってSVGのビジュアルチャットを作ってGDD open call html5に応募してみたけど落ちました」(仮) |
@mitsuhiro さん | 「HerokuのPlay! 対応について」(仮) |
@Masahito さん | 「5分で説明するPlay-Scala」 |
@tan_go238 さん | 「NettyはPlay!でどう使われてるのか的な話」(仮) |
@ikeike443さん | 「Jenkins+Play!で気軽にCI」 |
「プロセッサを支える技術」読了
「プロセッサを支える技術」をついちょっと前から読み始めてました。
理由は複数個あるのだが、やはり関数プログラミングの集いの場で村主さんの発表で
ハード屋さんの努力があってのことなので、それをうまく使わなければならない。(そんな風な感じ)というのを聞いて全く以てその通りと思った。
あとは、一応組み込みの会社に入っているのだからハードのことも知らないとね。ってことで。(入社して全く組み込みをやったことないが。。。。)
さて、内容はプロセッサ関連について400ページほどあるので、ある程度詳しく書かれてています。
情報処理系の試験にでてきそうな話ですね。
理由は複数個あるのだが、やはり関数プログラミングの集いの場で村主さんの発表で
ハード屋さんの努力があってのことなので、それをうまく使わなければならない。(そんな風な感じ)というのを聞いて全く以てその通りと思った。
あとは、一応組み込みの会社に入っているのだからハードのことも知らないとね。ってことで。(入社して全く組み込みをやったことないが。。。。)
さて、内容はプロセッサ関連について400ページほどあるので、ある程度詳しく書かれてています。
情報処理系の試験にでてきそうな話ですね。
- RICS , CISCキャッシュ、スーパースカラ、Out of Order、メモリ、割り込み
- x86アーキテクチャについてCore7iなどの命令セットやキャッシュについての動作
- 仮想化のCPUの動作について
- マルチプロセッサについて(キャッシュコヒーレンス、スヌープ等)
- メモリについて(これは情報処理系のテストに似た内容)
- GPGPUについて(CUDA,OpenCLなど)
といろいろ盛りだくさんの内容になっていました。
ハードウェアに興味がある方は読んでみてよいと思いますよ。
2011年10月6日木曜日
JUnit 4.10 リリースされました。
5日前ほどにJUnit 4.10 がリリースされたので簡単にリリースノートをまとめてみました。
一応Theoriesが拡張してGenericType対応になっていくような雰囲気。
RuleChain
TemporaryFolder
一応Theoriesが拡張してGenericType対応になっていくような雰囲気。
RuleChain
- RuleChainはTestRulesの順番の指定可能
TemporaryFolder
- TemporaryFolder#newFolder(String... folderName)が再帰でフォルダ作成可能
- TemporaryFolder#newFile()はランダムなファイル名を作成
- TemporaryFolder#newFolder()はランダムなフォルダ名を作成
- Theories runnerはGeneric Typeを持つTheoryパラメータを予測しない。
- Theoriesがjunit-contribへ移動するまで、この修正は行われない。
- 4.9.1はrunner classに必要な機構をいくつか追加した。Theories runnerを使う場合、メソッドをdeprecatedにした。(producesType())
- JUnitがリリースされたCommon Public Licenseはソースリポジトリ内に含まれている。
- ビルドインルールの実装
- TemporaryFolderはruleが失敗の場合、現在の作業ディレクトリにファイルを作成すべきではない。
- TestWatcherとTestWatchmanはAssumptionViolatedExceptionsに対してfailedをコールすべきではない。
- Javadocのバグ
- Assersionドキュメンテーション
- ClassRule
- Parameterized
- その他
- RunAfterに不要なコード
- Parameterizedテストクラスは@Categoryアノテーションを持つことができるはずです。
- エラーカウントはjunit.tests.framework.TestListenerTestで初期化されるべき。
- AssertionFailedErrorコンストラクタはnullメッセージでsuperをコールすべきではない。
- no-static内部テストクラスの明確なエラーメッセージ
- Description,Result,Failureがシリアル可能
- FailOnTimeoutは再利用可能で、Ruleを再利用できる。
- 理由を指定することができるErrorCollector.checkThatのオーバーロード
2011年9月24日土曜日
JUnitのRuleパッケージについて調査
最近JUnit 4.9がリリースされました。
ClassRule,TestRuleの変更がありました。
TestWatchmanがdeprecatedになってTestWatcherに置き換わるなど。
Ruleのパッケージについて、あまり知らなかったので、調べて、まとめてみました。
拡張性を高くしたい場合に使えます。
テストメソッドの実行前後に起動されるメソッドの順序を調べてみました。
ExternalResource Before
Before
After
【テストメソッド実行】
ErrorCollector
Verifier
TestWatchman
ExternalResource After
同じ機能っぽいじゃないか?と思うクラスがあるとは思いますが、ユースケース別に
使い分けると非常によいクラスになると思うので、うまく使い分けていきましょう。
次はhamcrestあたりかな。
ClassRule,TestRuleの変更がありました。
TestWatchmanがdeprecatedになってTestWatcherに置き換わるなど。
Ruleのパッケージについて、あまり知らなかったので、調べて、まとめてみました。
TestName
現在のテストメソッドの情報等を取得する。public class SampleClassTest { @Rule public TestName name = new TestName(); @Test public void test() { System.out.println(name.getMethodName()); fail("Not yet implemented"); } }
ErrorCollector
読んで字の通り、例外を集めて保持するクラスです。例外をaddして、最後のverifyでaddされたエラーの個数などでチェックをかけます。public class TestExternalResource { @Rule public ErrorCollector collector = new ErrorCollector() { protected void verify() throws Throwable { System.out.println("[ErrorCollector]"); super.verify(); }; }; @Test public void test() { collector.addError(new Throwable("first thing went wrong")); collector.addError(new Throwable("second thing went wrong")); int sample = 1; collector.checkThat(0, is(sample)); } }
ExpectedException
例外を制御する構文です。@Test(expected=NullPointerException.class)と同じような意味ですが、もうちょっと拡張性を高くしたい場合に使えます。
public class TestExpectedException { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void throwsNothing() { // no exception expected, none thrown: passes. } @Test public void throwsNullPointerException() { thrown.expect(NullPointerException.class); throw new NullPointerException(); } @Test public void throwsNullPointerExceptionWithMessage() { Matcher[] allowedExceptionMatchers = { is(NullPointerException.class), is(IllegalArgumentException.class) }; thrown.expect(anyOf(allowedExceptionMatchers)); thrown.expectMessage("happened?"); throw new NullPointerException("What happened?"); } }
TemporaryFolder
/tmp以下にファイルやディレクトリをおく場合に使えるクラスです。public class TestTemporaryFolder { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void test() throws IOException { File createFile = folder.newFile("myFile.txt"); File createFolder = folder.newFolder("subFolder"); System.out.println("Path:" + createFile.getAbsolutePath()); System.out.println("Path:" + createFolder.getAbsolutePath()); } }
Timeout
メソッドのタイムアウト監視クラスです。メソッドの実行時間のチェック等に使います。public class TestTimeout { @Rule public MethodRule globalTimeout = new Timeout(1000); @Test public void test() { for (;;) ; } }
Verifier
テストが成功した後に、チェックする仕組みを入れたい場合このクラスを利用します。public class TestVerifier { private ErrorLog error = new ErrorLog(); @Rule public MethodRule verifier = new Verifier() { @Override public void verify() { System.out.println("[Verifier]"); assertTrue(error.isEmpty()); } }; @Test public void test() { fail("Not yet implemented"); } @Test public void test2() { error.add("sample"); } }
TestWatchman(TestWatcher)
テストケースの結果をテスト実施後すぐに確認したい場合に使えます。public class TestTestWachman { private static String watchedLog; @Rule public MethodRule watchman = new TestWatchman() { @Override public void failed(Throwable e, FrameworkMethod method) { System.out.println("[watch]fail"); watchedLog += method.getName() + " " + e.getClass().getSimpleName() + "\n"; } @Override public void succeeded(FrameworkMethod method) { System.out.println("[watch]success"); watchedLog += method.getName() + " " + "success!\n"; } }; @Test public void test() { fail("Not yet implemented"); } @Test public void test2() { } }
ExternalResource
外部リソースなどのアクセスをテスト前後で行いたい場合に利用します。だいたいDBにアクセスしたり、ファイルアクセスだったりすると思います。クラスをインスタンス化したら、そのクラスのテスト前後にExternalResourceのbefore,afterが実行されます。public class SampleClassTest { @Rule public ExternalResource resource = new ExternalResource() { Server myServer = new Server(); @Override protected void after() { // 外部リソースの接続解除 System.out.println("[ExternalResrouce after]"); myServer.disconnect(); } @Override protected void before() throws Throwable { // 外部リソース接続 System.out.println("[ExternalResrouce before]"); myServer.connect(); } }; @Test public void test() { } }
テストメソッドの実行前後に起動されるメソッドの順序を調べてみました。
ExternalResource Before
Before
After
【テストメソッド実行】
ErrorCollector
Verifier
TestWatchman
ExternalResource After
同じ機能っぽいじゃないか?と思うクラスがあるとは思いますが、ユースケース別に
使い分けると非常によいクラスになると思うので、うまく使い分けていきましょう。
次はhamcrestあたりかな。
2011年9月22日木曜日
EMFのOCLの実装
今時OCL?ということもあるんですが、OCLを使うケースがあるので、調査した結果を
まとめます。
EMFのモデルに対してOCLをかける仕組みです。
org.eclipse.ocl.ecoreプラグインを依存関係につけます。
以下ソースコード
eclipseのOCL説明
今回はOCLのinvariantの判定をするケースでもう一つの方法としては、
evaluateではなくcheckメソッドを使う方法もあるらしいです。
あとは、defを使ってquery operationを定義することもできる。OCLの記述と同じように記述し、evaludateを実行すれば、同じように取得ができる。
まとめます。
EMFのモデルに対してOCLをかける仕組みです。
org.eclipse.ocl.ecoreプラグインを依存関係につけます。
- OCLのインスタンス生成
- OCLHelperを作成
- contextの設定
- 評価するオブジェクトとOCLでevaluateを実行
- 戻り値はObject型だが、Booleanが戻ってくるので、OCLの評価がtrue,falseかの判定する。
以下ソースコード
import org.eclipse.ocl.ecore.OCL; import org.eclipse.ocl.ecore.OCL.Helper; import org.eclipse.ocl.ecore.EcoreEnvironmentFactory OCL ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE); OCLHelper helper = ocl.createOCLHelper(); EClass context = targetObject.eClass(); helper.setContext(context); EObject object = targetObject; String query; query = "self.parameter > 100";// try { Object result = ocl.evaluate(object, helper.createQuery(query)); logger.error("", result.getClass(), result.toString()); } catch (ParserException e) { logger.error("", e); }
eclipseのOCL説明
今回はOCLのinvariantの判定をするケースでもう一つの方法としては、
evaluateではなくcheckメソッドを使う方法もあるらしいです。
あとは、defを使ってquery operationを定義することもできる。OCLの記述と同じように記述し、evaludateを実行すれば、同じように取得ができる。
- OCL資料
2011年9月19日月曜日
「関数プログラミングの集い」に参加
2011/09/17日にIIJにて開催されたので、行ってきました。
資料のリンクはこちら。参加人数はPARTAKEでは170人くらい参加だったそうです。
びっくり。
OCaml,Haskellerばかりのイベント?だと思ったので、Scalaユーザは少ないかな?
と思ったんですが、使っている言語ランキングは2位でした。意外と使われているんですねぇ。
関数プログラミングについて簡単と。
関数型プログラミングの定義が統一はされていないため、言語によって異なる。
「世界で最も誤解されているプログラミング言語」→JavaScript。Scheme,Lispに近い。
モナドの説明について聞いてみたが、いまいちぱっとわからない。doのシンタックスシュガーがあるのはわかったけど。
OCaml, GAE + Scala(Lift) ,haEx + OCaml + Coq, F#(Windowサーバのため),Androidアプリ(Scala)
枯れていない言語の採用って客の信頼を得ていないと無理だよねぇ。
影響がないところから、関数型で成功していけば、自ずと。
昔のデファクト言語COBOLの設計書を作る。
strafunski、sglr,Haskellを使って、COBOLのバイナリを解析し、ロジックを解析し、
変数名、関数名などを日本語に変換していく。
日本じゃまだHaskellerはいないため、インド人を引っぱってくる。
資料のリンクはこちら。参加人数はPARTAKEでは170人くらい参加だったそうです。
びっくり。
OCaml,Haskellerばかりのイベント?だと思ったので、Scalaユーザは少ないかな?
と思ったんですが、使っている言語ランキングは2位でした。意外と使われているんですねぇ。
あと、結構本を書いている人とか、名前を知っている人とかが来ていたし、
懇親会で話をしていると知識が豊富だなぁ〜と思って、まだまだだと実感。
最後にコップ本争奪じゃんけん大会があったんですが、さっくり負けてしまいました。
ちゃんとamazonでクリックします。
こういう勉強会に参加すると自分はまだまだだなと再認識されますね。
日々精進です。
以下各発表を簡単に懇親会で話をしていると知識が豊富だなぁ〜と思って、まだまだだと実感。
最後にコップ本争奪じゃんけん大会があったんですが、さっくり負けてしまいました。
ちゃんとamazonでクリックします。
こういう勉強会に参加すると自分はまだまだだなと再認識されますね。
日々精進です。
関数プログラミングの道しるべ
関数プログラミングについて簡単と。
関数型プログラミングの定義が統一はされていないため、言語によって異なる。
「世界で最も誤解されているプログラミング言語」→JavaScript。Scheme,Lispに近い。
モナドについて
モナドの説明について聞いてみたが、いまいちぱっとわからない。doのシンタックスシュガーがあるのはわかったけど。
ITプランニングにおける関数プログラミング
OCaml, GAE + Scala(Lift) ,haEx + OCaml + Coq, F#(Windowサーバのため),Androidアプリ(Scala)
枯れていない言語の採用って客の信頼を得ていないと無理だよねぇ。
影響がないところから、関数型で成功していけば、自ずと。
COBOL meets Haskell ~ Haskellを用いたCOBOLのリバースエンジニアリングツールの開発事例
昔のデファクト言語COBOLの設計書を作る。
strafunski、sglr,Haskellを使って、COBOLのバイナリを解析し、ロジックを解析し、
変数名、関数名などを日本語に変換していく。
日本じゃまだHaskellerはいないため、インド人を引っぱってくる。
言語アップデート1
- scala
- 2.9についてざーっと説明
- 並列コレクション
- I/O プロセス処理(scala.sys.process)
- scala Dynamic ( method_misingみたいなもの)
- Unfilterd, BlueEyes
- Scalaz
- Clojure
- Clojure1.3リリース
- ClosureScript(node.jsも対応)
- Clojure on Heroku
- git push
- Clojure ハッカソン
- Tokyo.clj
- Erlang
- サーバプログラミングフレームワーク
- 軽量プロセス
- 末尾再帰でホットアップデート
- エラー処理はlet it die
- emacsが今のところいいエディタ
- rebar,Dialyzer,Typer,Tider,QuickCheck,Erjang,riak
- Haskell
- GHC7.2x
- Hackage 、Yesod vs Snap,enumerator,attoparsec, blaze-builder , text
- F#
- 型プロバイダ、クエリ式、シーケンス
- 既知の外部リソース(SQLServer)に適切に型をつけてくれる。
- Null許容型演算子の追加。追加の仕方が結構泥臭い。
- 自動実装プロパティ
- SML#
- grassを作った人
- 目的はMLを普通の言語にすること。実用的な言語
- OS,Cライブラリと直接i連携、すべてネイティブ
- SQLの統合、分割コンパイル、
- Cの関数はimportすれば使える。コールバックも使える。
- 関係、演算、クエリも第一級
- 分割コンパイル
- smi,smlをもとにコンパイル。バイナリはCと同じため、Cとリンクができる。
- OCaml
- OCaml ver.3.12.0
- First Class Module
- TypeSafe Plugin
- シグネチャーの合成
- 一般化代数的データ型
- OCSIGENのサイト。
- webframework oscigen server, js_ocaml
LT
- Coq
- Coq
- 定理証明支援言語
- 証明駆動開発
- F#
- F#はREPLのスクリプトファイルがある。
- Paraiso計画
- 宇宙物理のシミュレーション計算にHaskellが利用
- 未だにFortranの遺産が沢山。
2011年9月11日日曜日
「7つの言語7つの世界」を読了
まぁ、洋書で「seven languages in seven weeks」というタイトルの本です。
PDFで洋書なら読めるようなんですが、ちょっとPDFより本で読む方が好きなので、
和訳が出たので購入しました。
原文では7つの言語を7週間といっているが、1つの言語を三日間にわけて説明していますが、
7言語*3日=21日じゃね?とは思います。
Ruby、Io、Prolog、Scala、Erlang、Closure、Haskelの7つなんですが、やはり関数型の趣向が強いですよね。
Io,Prolog,Erlangはほとんど触ることのない言語について、学べたことは大きいし、ScalaやHaskellなどは
Erlangのアプローチを引き継いでいるので、その元となる言語を学べるのは大きい。
Prologの論理プログラミングの考え方もルールを与えて計算は言語に任せるというアプローチは非常に
面白いものだし、これはErlangも使っているし、他の言語でも使われていくのではないか?と思いました。
あと、この筆者はRuby好きで、静的型付けを嫌いなんだなぁということが見え見えなのがちょっと。。。。。
Scalaのの章の後Erlangの章では動的型付けについて、すばらしいだろうかと言わんばかりの説明だったのが
ちょっと嫌だなぁと思うところがありました。
あと、これは第一版だからしょうがないかもしれないが、誤字があったりもします。
でも、本当にいい本です。!!!っていうか、言語を知りたいという人は必読だとは思います。
PDFで洋書なら読めるようなんですが、ちょっとPDFより本で読む方が好きなので、
和訳が出たので購入しました。
原文では7つの言語を7週間といっているが、1つの言語を三日間にわけて説明していますが、
7言語*3日=21日じゃね?とは思います。
Ruby、Io、Prolog、Scala、Erlang、Closure、Haskelの7つなんですが、やはり関数型の趣向が強いですよね。
Io,Prolog,Erlangはほとんど触ることのない言語について、学べたことは大きいし、ScalaやHaskellなどは
Erlangのアプローチを引き継いでいるので、その元となる言語を学べるのは大きい。
Prologの論理プログラミングの考え方もルールを与えて計算は言語に任せるというアプローチは非常に
面白いものだし、これはErlangも使っているし、他の言語でも使われていくのではないか?と思いました。
あと、この筆者はRuby好きで、静的型付けを嫌いなんだなぁということが見え見えなのがちょっと。。。。。
Scalaのの章の後Erlangの章では動的型付けについて、すばらしいだろうかと言わんばかりの説明だったのが
ちょっと嫌だなぁと思うところがありました。
あと、これは第一版だからしょうがないかもしれないが、誤字があったりもします。
- 句読点が正しくない。(これはどうでもいい)
- 説明がおかしい点がいくつか?(どこだったか忘れてしまった)
- これについては、後日のせます。
でも、本当にいい本です。!!!っていうか、言語を知りたいという人は必読だとは思います。
2011年9月8日木曜日
Eclipse Virgo3.0がリリースだと
Eclipse Virgo3.0がリリースされたとInfoQで載っていたので、翻訳してみました。
お勉強もせねばという意味も持って。
お勉強もせねばという意味も持って。
Eclipse Virgo 3.0 Released
EclipseにSpring DM Serverプロジェクトの移行が完了した3.0のリリースをアナウンスしました。 リリースはWABデプロイメントに対してOSGiエンタープライズのテストのすべてをパスした最後の一部のパズルGemini Web Componentを含む。 Eclipse Virgoは、Tomcatに似た実行環境を提供する。 バンドルまたは、バンドル(PARs)のセットをインストールでき、アプリケーションサーバとして扱えるような実行環境。 Virgoはユーザインストールプログラムを使って、Virgoのランタイムの空間を分離するための領域の概念を使用する。 以前は、ネストするフレームワークを分離したが、最近は、パーティショニングを提供するフレームワークフックのEquinox実装を使ったBundle digraphをサポートのためアップデートした。 Equinoxの一部のため、EquinoxベースのOSGi実行環境でVirgoの外部で使用することができます。 他のOSGiフレームワークが新しいリゾルバフックをサポートしたとき、同様に他のOSGi実行環境に移植可能にすべきです。 このリリースの新しい点はWeb ComponentのためのJettyのサポートを含むバンドルです。 (Tomcat サポートも含まれている) これは、Equinox RTスタック内の他のコンポーネントとの緊密な統合を提供します。 領域の分離の実装のため、実行環境はFelixからEquinoxに移行している。 しかしながら、これはデフォルトでFelixi Gogo shellを含むVirgoなので直接気づかされることはない。 サーバと同様Web app frameworkのsnapsがある。 snapsはweb applicationが重複するURLをいくつかのデータを共有して同一のWebサーバで共にホストになれる。 WABs(OSGi-ified WARS)がhostアプリケーションへサービスやURLを登録できる仕組みを提供する。 また、動的に利用可能なインストールされたコンポーネントを通して、ホストアプリがどのように反復できるかの方法も提供する。 Snapsは実行するためにEclipse Virgoを必要としている。 Eclipse VirgoをサポートするIDEプラグインのセットは開発中である。 WebベースOSGi開発や、多くのSpring概念を使ったりするのは、Eclipse VirgoをOSGiの世界へ簡単に遷移をさせることができる。 ユーザ、プログラマードキュメント同様利用可能チュートリアルがある。Virgo3.0はすぐにダウンロード可能である。 |
2011年9月2日金曜日
SBTを使い始める
とりあえず、sbtを使ってみるということで、インストールログを簡単に。
> curl -O http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar ※ > wget http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar > ln -s sbt-launch-0.7.7.jar sbt-launch.jar > vi sbt > java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@" > chmod +x sbt > ./sbt kaz@earlgray:~/work/scala/sbt> ./sbt Project does not exist, create new project? (y/N/s) y Name: SampleProject Organization: ponta Version [1.0]: Scala version [2.9.0]: sbt version [0.7.7]:
ヘルプの内容
ヘルプ | 内容 |
actions | Shows all available actions |
reload | Reloads sbt, picking up modifications to sbt.version or scala.version and recompiling modified project definitions |
current | Shows the current project, Scala version, and logging level. |
trace 'on', 'nosbt', 'off', or <integer> | Configures stack trace logging. 'nosbt' prints stack traces up to the first sbt frame. An integer gives the number of frames to show per exception. |
project <project name> | Sets the currently active project. Use 'project /' to change to the root project or 'project ..' to change to the parent project. |
projects | Shows all available projects. |
exit, quit | Terminates the build. |
set <property> <value> | Sets the value of the property given as its argument. |
get <property> | Gets the value of the property given as its argument. |
console-project | Enters the Scala interpreter with the current project definition bound to the variable 'current' and all members imported. |
builder | Set the current project to be the project definition builder. |
以下はプロジェクト作成時のログ
Getting net.java.dev.jna jna 3.2.3 ... :: retrieving :: org.scala-tools.sbt#boot-app confs: [default] 1 artifacts copied, 0 already retrieved (838kB/32ms) Getting Scala 2.7.7 ... :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 2 artifacts copied, 0 already retrieved (9911kB/54ms) Getting org.scala-tools.sbt sbt_2.7.7 0.7.7 ... downloading http://databinder.net/repo/org.scala-tools.sbt/sbt_2.7.7/0.7.7/jars/sbt_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#sbt_2.7.7;0.7.7!sbt_2.7.7.jar (3128ms) downloading http://databinder.net/repo/org.scala-tools.sbt/launcher-interface/0.7.7/jars/launcher-interface.jar ... [SUCCESSFUL ] org.scala-tools.sbt#launcher-interface;0.7.7!launcher-interface.jar (336ms) downloading http://databinder.net/repo/org.scala-tools.sbt/compile_2.7.7/0.7.7/jars/compile_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#compile_2.7.7;0.7.7!compile_2.7.7.jar (342ms) downloading http://databinder.net/repo/org.scala-tools.sbt/interface/0.7.7/jars/interface.jar ... [SUCCESSFUL ] org.scala-tools.sbt#interface;0.7.7!interface.jar (341ms) downloading http://databinder.net/repo/org.scala-tools.sbt/ivy_2.7.7/0.7.7/jars/ivy_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#ivy_2.7.7;0.7.7!ivy_2.7.7.jar (515ms) downloading http://databinder.net/repo/org.scala-tools.sbt/io_2.7.7/0.7.7/jars/io_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#io_2.7.7;0.7.7!io_2.7.7.jar (352ms) downloading http://databinder.net/repo/org.scala-tools.sbt/classpath_2.7.7/0.7.7/jars/classpath_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#classpath_2.7.7;0.7.7!classpath_2.7.7.jar (333ms) downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-bin.jar ... [SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-bin.jar (344ms) downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-src.jar ... [SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-src.jar (335ms) downloading http://databinder.net/repo/org.scala-tools.sbt/control_2.7.7/0.7.7/jars/control_2.7.7.jar ... [SUCCESSFUL ] org.scala-tools.sbt#control_2.7.7;0.7.7!control_2.7.7.jar (336ms) downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.1_2.8.1/0.7.7/jars/compiler-interface-bin.jar ... [SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.1_2.8.1;0.7.7!compiler-interface-bin.jar (344ms) downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.9.0_2.9.0/0.7.7/jars/compiler-interface-bin.jar ... [SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.9.0_2.9.0;0.7.7!compiler-interface-bin.jar (346ms) downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.0_2.8.0/0.7.7/jars/compiler-interface-bin.jar ... [SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.0_2.8.0;0.7.7!compiler-interface-bin.jar (345ms) :: retrieving :: org.scala-tools.sbt#boot-app confs: [default] 17 artifacts copied, 0 already retrieved (4379kB/58ms) [success] Successfully initialized directory structure. Getting Scala 2.9.0 ... downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.0/scala-compiler-2.9.0.jar ... [SUCCESSFUL ] org.scala-lang#scala-compiler;2.9.0!scala-compiler.jar (15211ms) downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.0/scala-library-2.9.0.jar ... [SUCCESSFUL ] org.scala-lang#scala-library;2.9.0!scala-library.jar (6277ms) downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.9.0/jline-2.9.0.jar ... [SUCCESSFUL ] org.scala-lang#jline;2.9.0!jline.jar (199ms) downloading http://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ... [SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (244ms) :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 4 artifacts copied, 0 already retrieved (20442kB/83ms) [info] Building project SampleProject 1.0 against Scala 2.9.0 [info] using sbt.DefaultProject with sbt 0.7.7 and Scala 2.7.7
2011年8月31日水曜日
Scalaの変位
不変、共変と反変について。Scalaプログラミング入門のP.218について
- Javaのクラスの配列は共変
- あるクラスの配列を引数として、宣言している場合、サブクラスの配列を引数として渡せる。String[] をObject[]を代入可能
- Javaのジェネリクスは共変ではなく、不変List<string> はList<Object>に代入できない。 Javaのクラスの配列は共変となっているが、型の安全性をコンパイル時に保証してくれない。
Scalaでは不変、共変、反変について指定することが可能
- 不変:[T]
- 共変:[+T]
- 反変:[-T]
不変
ScalaではArray[T]は不変です。foo(a:Array[String])メソッドに渡せるのはArray[String]のみです。ミュータブルの場合に、型引数を不変にすることが望ましい。
class Holder[T](var data: T) def add(in: Holder[Int]) { in.data = in.data + 1 } val h = new Holder(0) add(h) println(h.data)
Holder[Number]はDoubleも保持できます。
val nh = new Holder[Number](33.3d) def round(in: Holder[Number]) { in.data = in.data.intValue } println(round(nh)) println(nh.data.getClass) val dh = new Holder(33.3d) round(dh) <--コンパイルエラー
共変
共変にする場合には、型引数の前に+をつける。
共変の型引数は読み取り専用のコンテナに便利
List[+T]と定義して、List[String]をList[Any]を引数としてメソッドに引数として渡すので、
Listのすべての要素はAnyである要件を満たしているため、Listは共変となります。Listの内容は変更できません。
サンプル
class Getable[+T](val data: T) def get(in: Getable[Any]) { println("It's " + in.data) } val gs = new Getable("String") get(gs) def getNum(in: Getable[Number]) = in.data.intValue import java.lang.{ Double => JDouble } val gd = new Getable(new JDouble(33.3)) println(getNum(gd))つまり、Getable[+T]で定義したときGetable[String]をGetable[Any]に代入することができる。
子クラスの型に対して親クラスの型に代入することができる。
反変
Putable[String]を引数とするメソッドに対してPutable[AnyRef]を渡して呼び出せます。class Putable[-T] { def put(in: T) { println("Putting " + in) } } def writeOnly(in: Putable[String]) { in.put("Hello") } val p = new Putable[AnyRef] writeOnly(p) // trait DS[-In, +Out] { def apply(i: In): Out } val t1 = new DS[Any, Int] { def apply(i: Any) = i.toString.toInt } def check(in: DS[String, Any]) = in("333") println(check(t1))
Putable[-T]で定義したときにPutable[AnyRef]をPutable[String]に代入
反変は共変の反対で親クラスの型に対して、子クラスの型に代入することができる。
変位ルール
- ミュータブルなコンテナは不変
- イミュータブルなコンテナは共変[+T]
- 変換処理の入力は反変[-T]に、出力は共変[+T]
ScalaのFunctionNトレイトは反変の引数と共変の戻り値を持っている。