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ファイルをダウンロードして、転送後インストールも可能

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

2010年11月23日火曜日

SWTChartを簡単に調査

SWTChartは最近EclipseMarketに新しく登録されたため、調査をしました。
現在のバージョンは0.6.0 最終更新が2009-07-31なので、もう数年あたり更新されていない。
これって更新されるのかな?

下記URLからダウンロードし、展開しdropinsに配置しeclipse再起動
http://sourceforge.net/projects/swt-chart/files/SWTChart/0.6.0/org.swtchart_0.6.0.zip/download


とりあえずサンプルを動作させてみる。
dropins\org.swtchart_0.6.0\EXAMPLES\org.swtchart.examplesをインポートして色々ソースコードを簡単に
読んでみました。ってか非常にコード少ないので簡単に読めます。

簡単に機能と実装方法をまとめました。

・AreaChart
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Area Chart Example");

        // ILineSeriesを利用
        ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 1");
        lineSeries1.setYSeries(ySeries1);
        lineSeries1.setLineColor(Display.getDefault().getSystemColor(
                SWT.COLOR_RED));
        //enableAreaをtrueでAreaChart表示
        lineSeries1.enableArea(true);
・BarChart
  Chart chart = new Chart(shell, SWT.NONE);
  // set titles
  chart.getTitle().setText("Bar Chart Example");
  chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
  chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

  // BarChart(IBarSeries)を表示
  IBarSeries barSeries = (IBarSeries) chart.getSeriesSet().createSeries(
    SeriesType.BAR, "bar series");
  barSeries.setYSeries(ySeries);
・BarCharのカテゴリ
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Category Axis Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Month");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // set category
        chart.getAxisSet().getXAxis(0).enableCategory(true);
        chart.getAxisSet().getXAxis(0).setCategorySeries(
                new String[] { "Jan", "Feb", "Mar", "Apr", "May" });

        // IBarSeriesを2つ作成すればカテゴリになる。
        IBarSeries barSeries1 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 1");
        barSeries1.setYSeries(ySeries1);
        barSeries1.setBarColor(Display.getDefault().getSystemColor(
                SWT.COLOR_GREEN));

        IBarSeries barSeries2 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 2");
        barSeries2.setYSeries(ySeries2);
・ErrorBar
  // create a chart
  Chart chart = new Chart(shell, SWT.NONE);
  
  // create series
  ISeries series = chart.getSeriesSet()
    .createSeries(SeriesType.LINE, "line series");
  series.setYSeries(ySeries);
  
  // ISeriesに対してErrorBarをVisibleにすればよい。
  IErrorBar errorBar = series.getYErrorBar();
  errorBar.setVisible(true);
  errorBar.setError(0.1);

・プロットの点を表示しないようにする。
 lineSeries.setSymbolType(PlotSymbolType.NONE);


・ログスケール設定
  // set log scale
  chart.getAxisSet().getYAxis(0).enableLogScale(true);

・複数軸
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Multiple Axes Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude 1");

        // create second Y axis
        int axisId = chart.getAxisSet().createYAxis();

        // set the properties of second Y axis
        IAxis yAxis2 = chart.getAxisSet().getYAxis(axisId);
        yAxis2.setPosition(Position.Secondary);
        final Color RED = Display.getDefault().getSystemColor(SWT.COLOR_RED);
        yAxis2.getTick().setForeground(RED);
        yAxis2.getTitle().setForeground(RED);
        yAxis2.getTitle().setText("Amplitude 2");

        // create line series
        ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 1");
        lineSeries1.setYSeries(ySeries1);
        ILineSeries lineSeries2 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 2");
        lineSeries2.setYSeries(ySeries2);
        lineSeries2.setLineColor(RED);

        // assign series to second Y axis
        lineSeries2.setYAxisId(axisId);

・軸の方向変換
  // set the chart orientation
  chart.setOrientation(SWT.VERTICAL);

・散布図
  // create a chart
  Chart chart = new Chart(shell, SWT.NONE);

  // set titles
  chart.getTitle().setText("Scatter Chart Example");
  chart.getAxisSet().getXAxis(0).getTitle().setText("Score A");
  chart.getAxisSet().getYAxis(0).getTitle().setText("Score B");

  // create scatter series
  ILineSeries scatterSeries = (ILineSeries) chart.getSeriesSet()
    .createSeries(SeriesType.LINE, "scatter series");
  scatterSeries.setLineStyle(LineStyle.NONE);
  scatterSeries.setXSeries(xSeries);
  scatterSeries.setYSeries(ySeries);
・プロット数値の表示
  // set label visible
  lineSeries.getLabel().setVisible(true);
・スタック表示
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Stack Series Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Month");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // set category
        chart.getAxisSet().getXAxis(0).enableCategory(true);
        chart.getAxisSet().getXAxis(0).setCategorySeries(
                new String[] { "Jan", "Feb", "Mar", "Apr", "May" });

        // create bar series
        IBarSeries barSeries1 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 1");
        barSeries1.setYSeries(ySeries1);
        barSeries1.setBarColor(Display.getDefault().getSystemColor(
                SWT.COLOR_GREEN));

        IBarSeries barSeries2 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 2");
        barSeries2.setYSeries(ySeries2);

        // enable stack series
        barSeries1.enableStack(true);
        barSeries2.enableStack(true);
・ステップチャート
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);
        
        // set titles
        chart.getTitle().setText("Step Chart Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // create line series
        ILineSeries lineSeries = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series");
        lineSeries.setYSeries(ySeries);
        lineSeries.setSymbolType(PlotSymbolType.NONE);
        lineSeries.enableStep(true);