2011年12月22日木曜日

形式手法について勉強したいなぁ。

形式手法は前々から知っていて、興味は持っていました。
勉強しようと思うが、どのように業務にいかせるかな?っておもって手を出していなかったのですが、@ITMONOistでISO26262の開発手法が掲載されていました。
形式手法は組み込みでも使われているので、今やっている業務に適用できるかな?って思ったので、勉強してみようと思っています。

Alloy, Z , VDMなどはあるけど、Alloyが本があって読みやすいかな?とは思うので、
買ってみようと思います。


一応形式的手法とは

計算機科学における数学を基盤としたSW,HWのシステムの仕様記述、開発、検証の技術。
開発行程でエラーが入り込まないことを保証する。
要求仕様レベル、機能仕様レベルでは特に効果的であるが、実装レベルでも形式主義開発は可能。

2011年11月28日月曜日

SWTBotのantからの起動

SWTBotを自動化するためにantから起動できる方法を簡単に調べてみました。
eclipse.junit4.headlessのlibrary.xmlのantfileを起動するだけということ。
あとは、引数やプロパティを設定するだけという簡単な仕組みらしいです。
ふぅ〜ん。簡単じゃん。
でもMac動かないよw
Win環境がないから、プロパティが悪いのか、macのバグなのかわからない。
macはSWTのバグが結構多いらしいので、ちょっと踏んでる可能性があるからなぁ。
一応-XstartOnFirstThreadは渡しているから大丈夫なはず。
会社で調べてみるか。。。



 
 
 
 
 
 
    
            description
    
 
  
  
  
   
   
   
   
   
   
   


  
  
 
 
 
  
    
    
        
    

    
    
    



2011年11月22日火曜日

RCPのdropins機能をつける


  1. 以下プラグインをdependencyに追加
    1. org.eclipse.equinox.p2.reconciler.dropins
    2. org.eclipse.equinox.ds
  2. 製品構成ファイルのconfigurationタブでスタートレベルを設定する。
    1. 以下プラグインはautoStartをtrueに
  3. 製品構成ファイルと同じディレクトリにp2.infファイルを作成する。ファイル内容は下記内容
  4. この設定によって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/

2011年10月11日火曜日

ニュートリノの光速超えについて

色々今巷で話題になっているので、ちょっとぼやいておこうかなぁと。

スラド での記事をみたのですが、時計の進みのずれが光速を超えたニュートリノの観測
になった可能性があるそうですね。

そこまで、重力の差異で影響はでるとは思っていませんでした。
でも、なんでスイスーイタリア間をニュートリノを飛ばして、そんな厳密なテスト
を行おうと思ったのだろうか?
経度が変わることにより重力に差異が出ることはわかっているはずなのに。。。
K2Kだって、ちゃんと経度があまり変わらない方向に打ち込んでいるはず。

時間の進みに補正をかけるということは誤差が出てその誤差が実際の測定の誤差になる誤差の伝搬が発生してしまうのではないかな。

業界から離れた人間がごたごたいってもしょうがないので、じっくり検証結果を待つとしよう。

2011年10月9日日曜日

playコマンドの動作について

playの勉強会をUstで参加?したため、ちょっと色々コードリーディングして、
動作を把握していこうかなぁと思います。

まずは、playコマンドを叩いて起動する部分について。

> ./play run myApplication
と実行したときの動作。


  1. playコマンド
    1. play_command、application_path、remain_argsを取得
  2. framework/pym/play/application.py
    1. application_pathからconf/application.conf、conf/routesの存在チェック。application.confのパース
  3. framework/pym/play/cmdloader.py
    1. commands配下にあるコマンドスクリプト一覧を取得する。
    2. コマンドスクリプトのCOMMANDからplay_commandと一致するスクリプトファイルを取得する。
    3. 一致した場合はスクリプトファイルのexecuteを実行する。
    4. runの場合:base.pyの中のrunを実行し、java_cmdでplay.jarを起動する引数を作成して、Popenで子プロセスを立ち上げる。



独自コマンド追加

commandsディレクトリの中にXXXX.py(適当なファイル名)を追加して、COMMANDSに独自コマンド名のリストを定義して、executeメソッドで起動をする。


※play run 実行時のjava起動コマンドライン引数


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ページほどあるので、ある程度詳しく書かれてています。
情報処理系の試験にでてきそうな話ですね。


  • RICS , CISCキャッシュ、スーパースカラ、Out of Order、メモリ、割り込み
  • x86アーキテクチャについてCore7iなどの命令セットやキャッシュについての動作
  •  仮想化のCPUの動作について
  • マルチプロセッサについて(キャッシュコヒーレンス、スヌープ等)
  • メモリについて(これは情報処理系のテストに似た内容)
  • GPGPUについて(CUDA,OpenCLなど)

といろいろ盛りだくさんの内容になっていました。
ハードウェアに興味がある方は読んでみてよいと思いますよ。

2011年10月6日木曜日

JUnit 4.10 リリースされました。

5日前ほどにJUnit 4.10 がリリースされたので簡単にリリースノートをまとめてみました。
一応Theoriesが拡張してGenericType対応になっていくような雰囲気。

RuleChain

  • RuleChainはTestRulesの順番の指定可能

TemporaryFolder
  • TemporaryFolder#newFolder(String... folderName)が再帰でフォルダ作成可能
  • TemporaryFolder#newFile()はランダムなファイル名を作成
  • TemporaryFolder#newFolder()はランダムなフォルダ名を作成
Theories
  • Theories runnerはGeneric Typeを持つTheoryパラメータを予測しない。
  • Theoriesがjunit-contribへ移動するまで、この修正は行われない。
  • 4.9.1はrunner classに必要な機構をいくつか追加した。Theories runnerを使う場合、メソッドをdeprecatedにした。(producesType())
  • JUnitがリリースされたCommon Public Licenseはソースリポジトリ内に含まれている。
Bug fixes
  • ビルドインルールの実装
    • TemporaryFolderはruleが失敗の場合、現在の作業ディレクトリにファイルを作成すべきではない。
    • TestWatcherとTestWatchmanはAssumptionViolatedExceptionsに対してfailedをコールすべきではない。
  • Javadocのバグ
    • Assersionドキュメンテーション
    • ClassRule
    • Parameterized
  • その他
    • RunAfterに不要なコード
    • Parameterizedテストクラスは@Categoryアノテーションを持つことができるはずです。
    • エラーカウントはjunit.tests.framework.TestListenerTestで初期化されるべき。
    • AssertionFailedErrorコンストラクタはnullメッセージでsuperをコールすべきではない。
    • no-static内部テストクラスの明確なエラーメッセージ
Minor changes
  • Description,Result,Failureがシリアル可能
  • FailOnTimeoutは再利用可能で、Ruleを再利用できる。
  • 理由を指定することができるErrorCollector.checkThatのオーバーロード


2011年9月24日土曜日

JUnitのRuleパッケージについて調査

最近JUnit 4.9がリリースされました。
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プラグインを依存関係につけます。

  1. OCLのインスタンス生成
  2. OCLHelperを作成
  3. contextの設定
  4. 評価するオブジェクトとOCLでevaluateを実行
  5. 戻り値は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位でした。意外と使われているんですねぇ。

あと、結構本を書いている人とか、名前を知っている人とかが来ていたし、
懇親会で話をしていると知識が豊富だなぁ〜と思って、まだまだだと実感。
最後にコップ本争奪じゃんけん大会があったんですが、さっくり負けてしまいました。
ちゃんと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の章では動的型付けについて、すばらしいだろうかと言わんばかりの説明だったのが
ちょっと嫌だなぁと思うところがありました。

あと、これは第一版だからしょうがないかもしれないが、誤字があったりもします。

  • 句読点が正しくない。(これはどうでもいい)
  • 説明がおかしい点がいくつか?(どこだったか忘れてしまった)
    • これについては、後日のせます。


でも、本当にいい本です。!!!っていうか、言語を知りたいという人は必読だとは思います。

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)   &lt;--コンパイルエラー

共変

共変にする場合には、型引数の前に+をつける。
共変の型引数は読み取り専用のコンテナに便利
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トレイトは反変の引数と共変の戻り値を持っている。


2011年8月15日月曜日

X++って初めて知った。

世の中には色んな言語があるなぁと、思います。
InfoQの記事を見てX++を初めて知りました。infoQの記事

設計の方針としては、Javaのデータアクセス機能を強化したスーパーセットとのことです。
現在の開発はMicrosoft Dynamics AXとなったようです。
そのため、microsoftのページでの説明はすべてC#との比較となっています。
MicroSoftのページ

InfoQでは、SQLについての説明がメインですが、Microsoftのページを見ると逆にSQLについてはあまり記述していなく、以下の点がサポートされていますと記載されていた。
  • ファイル入出力
  • フォームやレポートなどのUI項目の操作
  • 動的配列のサポート
  • オブジェクトのコレクション
  • XMLビルディング、パース

記事を見る限りわかったことはこんな感じ

  • サポート機能
    • retry
    • case文に式、複数の値の記述
    • イテレータの途中の追加削除
  • 未サポート
    • finnaly
    • オーバーロード


今回はへぇ、こんなのがあるんだレベルでしか調べなかったので、機会があればもうちょっと調べてみようかなぁとは

2011年8月12日金曜日

VisualStudioでScala

Scala comes to .NET
にも記述されていますが、Visual Studioでscala開発が可能になるとこのこと。
まぁ、C#,F#とかJVMになっているし、あり得る方向なのかなぁ。。。。
microsoft にもscalaの有用性があると認識されたということだな。

リンク先の翻訳は時間があれば


2011年7月28日木曜日

Scala勉強会に行ってきました。

最近scalaを勉強しなきゃなぁ〜と思っていたんだけど、scalaの勉強会を見つけたため、参加しました。
これです。

今回の議題はActorについてでした。
Actorについては本で読んだだけで、実際に実装したことはないため、理解を深めるいい機会かなと。
発表を聞いていて、Actorモデル自体の思想はまぁ、1973年からある考えなので、元々の思想
の組み合わせにすぎないと思う。
メッセージキューとカプセル化の合成なのかなと理解した。
最後に今日の復習のため、Actor,Futureについてまとめてみました。
こういう資料を作ることにより、自分の理解が深まるかなぁと思うんで。

Actor復習資料


毎週やっているといことなので、次回も参加だな。

2011年7月17日日曜日

Android Bazaar and Conference 2011 Summerに行ってきました。

なんか最近色んなイベントに参加しているなぁ〜と思いつつ、
Android Bazaar and Conference 2011 Summer
に参加してきました。

実際android開発をがっつりやっている訳ではないので、ちょろっとでいいかなぁ〜という思い&HW関連で面白そうなものはないかな?というザッピングレベルで行きました。


・基調講演
 丸山不二夫
  Androidの会会長のお話。初めて話しを聞く人でした。3/11について&情報のオープン化についての話でしたが、興味的にはあまりなく&発表の仕方が微妙な感じ。あまり息継ぎない発表だったので、話を聞き流す感じだった。

 谷脇 康彦
  パワポの文字が小さいってハッシュタグへの突っ込みがひどかったが、発表が丸山さんの後だったので、ちゃんとした発表に見えたw 停電と電話不通件数などのグラフの比較。文字さえ見えれば非常にわかりやすく、興味のある内容でした。

・「Android is NOT just 'Java on Linux'」
 ブートシーケンスについて、initは指定する必要がある。
 基本的にandroidはstaticLinkで動く。マウントなどに動作が影響しないため。
 BSDベースの標準ライブラリ(Bionic)
 zygote:Linuxでいうforkの仕組みだが、少し異なる。
 
・「Linuxカーネルから紐解くAndroid」
 AndroidのカーネルとUbuntuのカーネルの違いについての説明。
 使用用途の違いにより、動作の違いについての説明。
 sandboxは同一アプリを複数プロセスで立ち上げるときに使う。
 IPCとintentの違いについて
 OOMについての説明。ubuntuでは優先度だが、androidはinitdに記述されている優先度でkillされるということ。

・「AndroidプログラマのためのARM概論。でも少しIntelの話も!」
 ARMについて。型番によるInstructionの違いなどについての説明。
 ARM特化したLinuxのLinaroについての説明。Graphics関連のInstructionのNEON
 気になったのはARMのAシリーズが2つ、Mシリーズが2つあるチップが開発されているということ。なんのためのチップなのかが不明とのこと。非常に興味あり。

・作って学ぶ!OpenGLはじめの一歩
 OpenGLを使ったプログラミング方法について、発表者が学生なんで、若いw 。
OpenGLの使い方を実際に実装して、確認してみよう!って意味の発表だったんで、まぁこうやるんだろうなぁ〜と懐かしく見ていました。

・Androidアプリデザイン入門編
 Androidのデザインについて、Androidの画像でNine Patchについての話がメイン。画像を拡大するときに画像が変にならないようにするポイントなどを発表していました。Nine Patchという言葉を初めて聞いたので、今後なんかに役立つかなぁw


完全にlowlevelな話ばかり聞いていたが、まだまだ知らないことだらけだなぁとおもいました。
ARMは今いる会社に関係性が強いので、非常に関わってみたいなぁと思う。というか日本でメジャーじゃないって
あたりがいいw

こういう色んな人の話を聞くとモチベーションがあがりますねぇ〜。
やる気が出てよい。

2011年7月16日土曜日

Xpandを試してみる

EMFベースのTemplateエンジンの勉強もしておこうかなぁということで、
Xpandについて勉強しようと思います。

以下簡単なサンプル作成手順を示します。

Xpandプロジェクトの作成




EMFメタモデルを利用する。



テンプレートを作成する。



metamodelとモデルを作成


 private void generate(BuildSpecification buildSpec, Object monitor)
   throws CoreException {

  // get project root folder as absolute file system path
  IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
  IResource resource = root.findMember(new Path(buildSpec.getProject()
    .getName()));
  String containerName = resource.getLocation().toPortableString();

  // configure outlets
  OutputImpl output = new OutputImpl();
  Outlet outlet = new Outlet(containerName);
  outlet.setOverwrite(true);
  output.addOutlet(outlet);

  // create execution context

  Map globalVarsMap = new HashMap();
  XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
    output, null, globalVarsMap, null, null);

  EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
   @Override
   protected EPackage[] allPackages() {
    return new EPackage[] { BuildspecificationPackage.eINSTANCE,
      EcorePackage.eINSTANCE };
   }
  };
  execCtx.registerMetaModel(metamodel);

  // generate
  XpandFacade facade = XpandFacade.create(execCtx);
  String templatePath = "template::Sample::main";
  // String templatePath = "template::BuildTemplate::main";
  facade.evaluate(templatePath, buildSpec);

  resource.refreshLocal(IResource.DEPTH_INFINITE, null);
 }

 private BuildSpecification createModel(Object project, String srcDirName,
   String binDirName) {
  BuildSpecification buildSpecification = BuildspecificationFactory.eINSTANCE
    .createBuildSpecification();
  Project projectSpecification = BuildspecificationFactory.eINSTANCE
    .createProject();
  projectSpecification.setName("test");
  projectSpecification.setBinaryFolder(binDirName);
  projectSpecification.setSourceFolder(srcDirName);

  buildSpecification.setProject(projectSpecification);
  return buildSpecification;
 }


テンプレートの中身
«IMPORT buildspecification»

«EXTENSION template::GeneratorExtensions»

«DEFINE main FOR BuildSpecification»
 «EXPAND project FOR this.project»
«ENDDEFINE»

«DEFINE project FOR Project»
«FILE "hogebuild.xml"-»


 
 sampleです。
 

 «EXPAND compileTarget FOR this»
 «EXPAND jarTarget FOR this»


«ENDFILE»
«ENDDEFINE»

«DEFINE compileTarget FOR Project-»
 
  
 
«ENDDEFINE»

«DEFINE jarTarget FOR Project-»
 
  
  
  
 
«ENDDEFINE»


Xtendを使って、Xpandのテンプレートの中から色々呼び出せるように拡張
import buildspecification;

String distributionDir(Project this):
 "dist";

String fullyQualifiedJarFileName(Project this):
 this.distributionDir() + "/" + this.name + ".jar";

上記プログラムを起動するとテンプレートのFILEで定義したファイル名で保存される。
めんどいならActivator内にうまい具合に起動するようにしてしまばよい。

Xpandの公式サイト

2011年7月5日火曜日

Zen-Codingで楽々HTMLコーディング

最近@ITやらほかの記事でよく見るようになりました。
Zen-Codingです。

とりあえず、Eclipse Text Editor ,sakura Editorで利用できるということです。
いろんなサイトに記述はされていますが、備忘録的にインストール&練習をつらつら記述します。

・eclipseのupdate siteからインストール
・eclipse Text Editorを開き、簡単なタグを入力する。

入力してCommand+Eを押すと変換されます。
html:5
div.content
.content
a[target=_blank]


今日は眠いのでここまで。

オブラブ2011夏イベントに行ってきました

オブラブ2011夏イベントに行ってきました。
参加2回目ですが、今年は10周年ということで振り返るというテーマでした。

良かった点
・関数型言語の話が聞けた。
・オブラブの遍歴が聞けた。
・アジャイルの思想はITじゃなく一般的な考えなんだと再認識

悪かった点
・部屋あつい。
・電源不足
・心躍る要素が少なかった。(昔話的要素ばかり)
・ブログ炎上が聞けなかったw

アジャイルやコーチングの話を聞いてよく思うんだが、普通の経営学などに置き換えると今だとドラッガー、ちょっと前だと
カーネギーの本とさほどかわりはないと思う。
開発者だろうが、経営者だろうがやりたいことは皆happyになること。不幸になりたい人なんていないでしょう。
開発者が設計、実装、経営者が経営を抽象度をあげればすべては作業。
その作業をどのようにして、こなしていくか?というのがマネージメントであると思う。
今回のオブラブに参加して、再確認したと思います。

技術の学びは螺旋とあるが、管理等の面でも、20世紀にできていることをどのように学びその時代に適合させていくか
だと思う。


今回の戦利品


ちなみに前回の戦利品

2011年6月5日日曜日

OSGiのコマンドを作成する

前々からOSGiの勉強はせねばと思いながら、何も着手せずでしたが、
ちょろちょろと勉強し始めました。

今回はOSGiコマンドの作成方法を調査しました。
OSGiコマンドは、OSGiコンソールで実行できるコマンドです。
> headers 1

今回はuname,whatamiコマンドを作成します。

1.ActivatorにCommandProviderを継承する
2.public void _XXXX(CommandInterpreter ci) throws Exception を定義する。
※XXXXはコマンド名になります。

これだけで完了です。
では、実際動作するか確認します。
Run As→ OSGi Framework でosgi consoleを立ち上げる
osgi consoleでuname,whatamiをタイプする。

これで、実装したコマンドが実行されます。

OSGiコマンドは基本的に、先勝ちの方式のようです。
なので、headersなどの既に定義されているものは再定義はできないようです。

以下サンプルです。
package ph.jpn.calm.osgi.sample;

import java.net.URL;
import java.rmi.server.ServerCloneException;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.logging.Logger;

import javax.naming.Context;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.eclipse.osgi.framework.util.Headers;

public class Activator implements BundleActivator ,CommandProvider {

 private BundleContext context;
 
 /*
  * (non-Javadoc)
  * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
  */
 public void start(BundleContext context) throws Exception {
  
  System.out.println("Hello World!!");
  this.context=context;
  Hashtable properties = new Hashtable();
  context.registerService(CommandProvider.class.getName(), this, properties);
  
 }
 
 /*
  * (non-Javadoc)
  * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
  */
 public void stop(BundleContext context) throws Exception {
  System.out.println("Goodbye World!!");
 }

 @Override
 public String getHelp() {
  StringBuffer buffer = new StringBuffer();
  buffer.append("\tuname - returns framework information\n");
  return buffer.toString();
 }
 
 public void _uname(CommandInterpreter ci) throws Exception {
  String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);
  String version = context.getProperty(Constants.FRAMEWORK_VERSION);
  String osName = context.getProperty(Constants.FRAMEWORK_OS_NAME);
  String osVersion = context.getProperty(Constants.FRAMEWORK_OS_VERSION);
  System.out.println("\n " + vendor + " " 
    + version + " (" + osName + " " 
    + osVersion + ")");
  
  
 }


 public void _whatami(CommandInterpreter ci) throws Exception {
  try {
   long id = Long.parseLong(ci.nextArgument());
   Bundle bundle = context.getBundle(id);
   //
   if(bundle==null){
    System.out.println("No ID");
   }
   URL url = bundle.getEntry("plugin.xml");
   if(url != null) {
    System.out.println("\n I'm" + bundle.getSymbolicName() + ") a plug-in");
   } else {
    System.out.println("\n I'm " + bundle.getSymbolicName() + ") not a plug-in");
   }
  } catch (NumberFormatException nfe) {
   System.out.println("\n Error processing command");
  }
 }
 

}

2011年5月8日日曜日

MasterMinds of Programmingを読んでます

最寄の図書館にて、色々本を物色していましたが、最近の図書館にはびっくりですね。
技術書などもちょろちょろあるんですね。学生の時代はそんなになかった気がするんだが。。

というわけで、MasterMinds Of Programmingという本を借りて読みました。
これはプログラム言語設計者18人へのインタビューをまとめたものになっていて、
非常に楽しめる本でした。
Guido van Rossumへのインタビューもあり、selfが残っている理由なども記述されていました。
質問と回答から見ると天邪鬼なんじゃないか?という回答していて、それを読んでいるだけでも
面白かったです。


時間がある人は是非。

MasterMinds of Programming

2011年1月3日月曜日

Creative Ziio7インチを購入

Creative Ziio7インチを購入しました。

以下公式サイト
http://jp.creative.com/products/product.asp?category=948&subcategory=949&product=20231&listby=

7インチ、400gで25000円でandroid端末が購入できる大変魅力であったため、購入しました。
android 2.1というところでマルチタッチやFlashが見れないなどなどデメリットもありましたが
android 2.2にupdateされるのではないかと思いますので、まぁ待ってみます。



CPUはARMベースの
CPUはZiiLABS ZMS-08です。

簡単なSpecは
・ARM Cortex-A8 at 1 GHz
・1 GByte Addressable RAM
・HDMI出力可能
・32GBまでmicroSD追加可能


・アプリのインストールについて
 AndroidMarketにはアクセス不可
 AndroApp,andronaviなどにアクセスし直接apkファイルをダウンロードしてインストール可能。
 PCでapkファイルをダウンロードして、転送後インストールも可能

・充電について
 音楽を聴くだけなら約半日以上持ちましたので、充電が持たないというイメージはないです。