メイン

2008年08月15日

Mixiの中でニコニコカレンダー(2008/8)

12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。
先週くらいにMixiの構造が変わってしまったので修正しました。
前回のバージョンアップが2007年10月だから10ヶ月ぶりですね。
ひさしぶりなので今までのエントリーの内容をまとめておきます。

=================================

TRICHORDチームでは12%ルールといって毎週金曜日の午後は自分の自由研究をすることになっています。
この12%ルールの私の成果を紹介します。

この機能のコードネームはniko2mixiです。
niko2mixiを使うとMixiの中にニコニコカレンダーが登場します。
今流行のマッシュアップに近い機能ですが、Mixiの資源に寄生して新しい機能を実現させるという
イメージをこめて、私はこの寄生する作戦を『マッシュイン』と呼んでいます。

【ニコニコカレンダーの表示】
view2.png
Mixiのトップ画面の左下にニコニコカレンダーが表示されます。
マイミクの中でniko2mixiを使っている人がいれば、その人のニコカレも表示されます。

【ニコニコカレンダーの入力】
input.png
日記を書くときに、ニコニコカレンダーのボタンが出て、その日の気分を入力できます。

【対応ブラウザ】
対応ブラウザはFirefox2、Firefox3、InternetExplorer6、InternetExplorer7です。
Firefox系の場合はGreasemonkeyを、InternetExplorer系の場合はTrixieをインストールしておいてください。

【使い方】
1. niko2mixi.user.js ←のJavaScriptファイルをGreasemonkeyあるいはTrixieにインストールする。
2. Mixiで日記を書くときに、表示されたニコニコカレンダーアイコンをクリックして、タイトルに顔文字を入れておく。
3. Mixiのトップページでニコニコカレンダーをみる。
4. クリックしてその日記にジャンプする。
5. 気に入ったらマイミクにniko2mixiを使うように勧めて、みんなでニコニコカレンダーを楽しむ。


いかがでしょうか。
こうしたらもっと良いなどのフィードバックをお待ちしております。

今までのエントリー
Mixiの中でニコニコカレンダー
Mixiの中でニコニコカレンダーをIEにも対応
Mixiの中でニコニコカレンダーをバージョンアップ
Mixiの中でニコニコカレンダーをまたバージョンアップ
Mixiの中でニコニコカレンダーをまたまたバージョンアップ
Mixiの中でニコニコカレンダーをバージョンアップ(2007/10)

2008年07月02日

習作:Papervision3D 2.0とBox2DFlashAS3でプレゼンテーション

Papervision3D 2.0Box2DFlashAS3を使って、3次元のプレゼンテーションを作ってみました。
習作:Papervision3D 2.0とBox2DFlashAS3でドラッグ出来るCubeの応用です。

BlocksTest07.png
(クリックすると表示されます)

【使い方】
・ブロックをドラッグすると動かせます。
・ブロックをダブルクリックすると拡大表示になります。
・再びダブルクリックすると縮小表示になります。
・キーを何かおすと、縮小表示になります。(ブロックが落下していってしまったときの救済です。)

【使ったツール】
Papervision3D 2.0 GreatWhite
Box2DFlashAS3

【参考にしたページ】
[Papervision3D]イベントオブジェクトのプロパティを探る - l4l
WCAN mini ActionScript Vol.4 で発表したやつ Box2DFlashAS3 (Unknown Quality)

【ソースコード】
BlocksTest07.as
(注:ビルドをするには上記の参考ページをみて、org.papervision3d.core.utils.InteractiveSceneManagerを修正する必要があります)

2008年06月27日

PV3Dでライトニングトークスタイマー

Papervision3Dを使って、ライトニングトークスタイマーを作ってみました。

talkstimer.png
(クリックすると表示されます)

【使い方】
・5分間たったら、20秒のインターバルがあります
・マウスホイールで拡大、縮小が出来ます
・何かキーを押すと最初に戻ります

【使ったツール】
Papervision3D 2.0 GreatWhite

【参考にしたページ】
Mr.doob's blog | PV3D 2.0: How to do simple realtime shadows

【ソースコード】
talkstimer.as

2008年06月20日

習作:PV3DとBox2Dでドラッグ出来るCubeに鏡をつけた

『習作:Papervision3D 2.0とBox2DFlashAS3でドラッグ出来るCube』『習作:Papervision3D 2.0で鏡』の二つの技術を使って、ドラッグ出来るCubeに鏡をつけてみました。

BlocksTest06.png
(クリックすると表示されます)

【使ったツール】
Papervision3D 2.0 GreatWhite
Box2DFlashAS3

【参考にしたページ】
[Papervision3D]イベントオブジェクトのプロパティを探る - l4l
Mr.doob's blog | PV3D 2.0: How to do simple realtime shadows

【ソースコード】
BlocksTest06.as
(注:ビルドをして動作させるためには、前回と同様上記の参考ページをみて、org.papervision3d.core.utils.InteractiveSceneManagerを修正する必要があります)

2008年06月17日

習作:Papervision3D 2.0とBox2DFlashAS3でドラッグ出来るCube

Papervision3D 2.0Box2DFlashAS3を使って、ドラッグできる3次元のCubeを作ってみました。

BlocksTest05.png
(クリックすると表示されます)

【使ったツール】
Papervision3D 2.0 GreatWhite
Box2DFlashAS3

【参考にしたページ】
[Papervision3D]イベントオブジェクトのプロパティを探る - l4l

【ソースコード】
BlocksTest05.as
(注:ビルドをするには上記の参考ページをみて、org.papervision3d.core.utils.InteractiveSceneManagerを修正する必要があります)

2008年05月23日

習作:Papervision3D 2.0で鏡

Papervision3D 2.0 で鏡のような表示をしてみたくて、がんばってみました。

lego3d.png
(クリックすると表示されます)

【使ったツール】
Papervision3D 2.0 GreatWhite

【参考にしたページ】
PV3D 2.0: How to do simple realtime shadows

【ソース】



package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Matrix;

import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.BitmapViewportMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.BitmapViewport3D;

[SWF(backgroundColor='0xFFFFFF', frameRate='30', width=640, height=480)]
public class MirrorTest extends BasicView {
public var camera_mirror:Camera3D

public var viewport_mirror:BitmapViewport3D

private var background:Bitmap

private var cube1:Cube
private var cube2:Cube
private var cube3:Cube
private var cube4:Cube

private var theta:Number = 0

public function MirrorTest() {
stage.quality = StageQuality.LOW
stage.align = StageAlign.TOP_LEFT
stage.scaleMode = StageScaleMode.NO_SCALE

init3D()
sceneSetup()

startRendering()
}

protected override function onRenderTick(event:Event = null):void
{
loop()
renderer.renderScene(scene, _camera, viewport)
}

public function init3D():void {
camera_mirror = new Camera3D()
viewport_mirror = new BitmapViewport3D(640, 480)
background = new Bitmap(new BitmapData(640, 480, false, 0x000080))
addChild(background)
addChild(viewport)
}


public function sceneSetup():void {
var material:CompositeMaterial

material = new CompositeMaterial()
material.addMaterial(new WireframeMaterial(0x808080))
material.addMaterial(new ColorMaterial(0xff0000))
cube1 = new Cube( new MaterialsList({all:material}), 200, 200, 200)
cube1.x = 300
scene.addChild(cube1)

material = new CompositeMaterial()
material.addMaterial(new WireframeMaterial(0x808080))
material.addMaterial(new ColorMaterial(0x00ff00))
cube2 = new Cube( new MaterialsList({all:material}), 200, 200, 200)
cube2.y = 300
scene.addChild(cube2)

material = new CompositeMaterial()
material.addMaterial(new WireframeMaterial(0x808080))
material.addMaterial(new ColorMaterial(0x0000ff))
cube3 = new Cube( new MaterialsList({all:material}), 200, 200, 200)
cube3.y = -300
scene.addChild(cube3)

material = new CompositeMaterial()
material.addMaterial(new WireframeMaterial(0x808080))
material.addMaterial(new ColorMaterial(0xc0c0c0))
cube4 = new Cube( new MaterialsList({all:material}), 200, 200, 200)
cube4.x = -300
scene.addChild(cube4)

var floor:Plane = new Plane(new ColorMaterial(0xffffff, 0.5), 2000, 2000,10,10)
scene.addChild(floor)
}

private function loop():void {
camera.x += ((mouseX - stage.stageWidth / 2) * 5 - camera.x ) / 3
camera.y += ((mouseY - stage.stageHeight / 2) * 5 - camera.y) / 3
camera.z += ( ( (-mouseY) * 2 - 500 ) - camera.z ) /3

camera_mirror.x = camera.x
camera_mirror.y = camera.y
camera_mirror.z = -camera.z

cube1.z = - (1 + Math.sin(theta + Math.PI * 0 / 4)) * 100 - 110
cube2.z = - (1 + Math.sin(theta + Math.PI * 1 / 4)) * 100 - 110
cube3.z = - (1 + Math.sin(theta + Math.PI * 2 / 4)) * 100 - 110
cube4.z = - (1 + Math.sin(theta + Math.PI * 3 / 4)) * 100 - 110
theta += Math.PI / 10

// render mirror
renderer.renderScene(scene, camera_mirror, viewport_mirror)

// render background
var b:BitmapData = new BitmapViewportMaterial(viewport_mirror).bitmap
var b2:BitmapData = new BitmapData(b.width, b.height)
var m1:Matrix = new Matrix()
m1.scale(-1, 1) // reverse
m1.translate(b.width, 0)
b2.draw(b, m1)
background.bitmapData.draw(b2)
}
}
}


2008年05月16日

習作:3Dレゴ

バグレゴASの3D化をにらんで、3Dでレゴを表示するところまで作ってみました。

lego3d.png
(クリックすると表示されます)

【使ったツール】
Papervision3D 2.0 GreatWhite

【参考にしたページ】
[Papervision3D]プリミティブなオブジェクトを並べてみる - l4l

【ソース】

package {
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import org.papervision3d.core.math.Matrix3D;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.*;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.primitives.*;
	import org.papervision3d.view.BasicView;
	
	public class LegoTest01 extends BasicView {
		private var L:Number = 25 / 2
		private var BOX_W:Number = 19 / 3 * 3
		private var BOX_H:Number = 19 / 5 * 3
		private var ANTLER_W:Number = 1.8 * 3
		private var ANTLER_H:Number = 0.9 * 3
		private var COLORS:Array = [
			0xcc0000, // red
			0x0066a7, // blue
			0x006822, // green
			0x02b535, // light green
			0xfbe419] // yellow
		
		private var legos:Array = []
			
		public function LegoTest01() {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.frameRate = 30;

// event
stage.addEventListener(MouseEvent.MOUSE_DOWN, mdown);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mmove);
stage.addEventListener(MouseEvent.MOUSE_UP, mup);

init();

startRendering();
}

private function init():void{
var light:PointLight3D = new PointLight3D()
light.z = 0;
light.x = 800;
light.y = 800;

for (var i:Number = 0; i < COLORS.length; i++) {
var lego:Cube = createLego(light, COLORS[i])
lego.x = BOX_W * L * 1.5 * (i - 2)
scene.addChild(lego);
}
}

private function createLego(light:PointLight3D, color:Number):Cube {
var gm:GouraudMaterial =new GouraudMaterial(light, 0xFFFFFF, color)
var mlist:MaterialsList = new MaterialsList({all:new GouraudMaterial(light, 0xFFFFFF, color)});

var cubeTop:Cube =new Cube(mlist, BOX_W * L, BOX_W * L, 0.1 * L);

var i:Number
var cubeSide:Cube
for each (i in [1, -1]){
cubeSide =new Cube(mlist, 0.1 * L, BOX_W * L, BOX_H * L);
cubeSide.x = i * BOX_W * L / 2
cubeSide.y = -BOX_H * L / 2
cubeTop.addChild(cubeSide);
}

for each (i in [1, -1]){
cubeSide =new Cube(mlist, BOX_W * L, 0.1 * L, BOX_H * L);
cubeSide.z = i * BOX_W * L / 2
cubeSide.y = -BOX_H * L / 2
cubeTop.addChild(cubeSide);
}

for each (i in [1, -1]){
for each (var j:Number in [1, -1]){
var cylinder:Cylinder =new Cylinder(gm, ANTLER_W * L / 2, ANTLER_H * L);
cylinder.x = i * (BOX_W) * L / 4
cylinder.z = j * (BOX_W) * L / 4
cylinder.y = ANTLER_H * L / 2
cubeTop.addChild(cylinder)
}
}
return cubeTop
}



private var mousePos :Point = null;
private var cameraPos :Point = null;
private var _cameraRotX :Number = 0;
private var _cameraRotY :Number = 0;
private function set cameraRotX(_rot:Number):void{
if(-89>_rot&&_rot<89){
_cameraRotX = _rot;
}else if(-89>=_rot){
_cameraRotX = -89;
}else{
_cameraRotX = 89;
}
}
private function set cameraRotY(_rot:Number):void{
_cameraRotY = _rot;
}
private function updateCameraPos():void{
var v:Matrix3D = new Matrix3D([0,0,-1000,1,0,0,0,0,0,0,0,0]);
var vrx:Matrix3D = Matrix3D.rotationX(_cameraRotX/180*Math.PI);
var vry:Matrix3D = Matrix3D.rotationY(_cameraRotY/180*Math.PI);
var va0:Matrix3D = Matrix3D.multiply(v,vrx);
var va1:Matrix3D = Matrix3D.multiply(va0,vry);
camera.x = va1.n11;
camera.y = va1.n12;
camera.z = va1.n13;
}
private function mdown(evt:MouseEvent):void{
mousePos = new Point(stage.mouseX,stage.mouseY);
}

private function mmove(evt:MouseEvent):void{
if(mousePos){
var vx :Number = (stage.mouseX - mousePos.x)/2;
var vy :Number = (stage.mouseY - mousePos.y)/2;
cameraRotX = _cameraRotX - vy;
cameraRotY = _cameraRotY + vx;
updateCameraPos();
mousePos = new Point(stage.mouseX,stage.mouseY);
}
}

private function mup(evt:MouseEvent):void{
mousePos = null;
}
}
}



2008年05月13日

習作:バグレゴAS

習作:バグレゴonWebで紹介したモノを少しずつ改良しています。

Bug Lego AS

前回よりも小さくして、数は多くしてみました。
どうでしょうか。
buglego.png

2008年05月02日

習作:バグレゴonWeb

12%ルールで、バグレゴのWeb版を作っています。
ひとまず雰囲気だけ出来たので、公開いたします。

block.png

2008年04月25日

抽選をするソフトウェア

FlexとBox2DFlashAS3の練習で、抽選をするソフトウェアを作ってみました。
転がして、一番右になったボールがアタリです。
http://trichord.change-vision.com/blog/sample/flex/sort/Sort.html

Box2DFlashAS3とは物理計算をするソフトウェアです。
リンク先のサンプルを見るだけでもなんだか楽しくなりますね。
http://box2dflash.sourceforge.net/

2007年10月15日

ふわっと移動するかんばん

12%ルールの時間を使って、JavaScriptで『ふわっ』と移動するかんばんを作ってみました。

『ふわっ』と移動するかんばん

実は何週間も前に作ったのですが、当初作ろうとしていた機能(例:文字を入力できる、みんなで同時に使える、リプレイできる)をがなかなかできなくて手間取っていました。
方針を変えてとりあえず小さくまとめてUIの部分だけ公開することにしたので、ひとまずはカードの移動しかできませんが、触った感じのフィードバックをいただけるとうれしいです。

2007年10月05日

Mixiの中でニコニコカレンダーをバージョンアップ(2007/10)

12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。
Mixiの構造が変わってしまったので、あわてて修正しました。
今回のバージョンでは、Mixiのトップページの左下に表示されます。

使い方は前のバージョンと変わりません。
niko2mixi.user.jsをダウンロードして使ってみてください。

参考
Mixiの中でニコニコカレンダー
Mixiの中でニコニコカレンダーをIEにも対応
Mixiの中でニコニコカレンダーをバージョンアップ
Mixiの中でニコニコカレンダーをまたバージョンアップ
Mixiの中でニコニコカレンダーをまたまたバージョンアップ

2007年09月21日

マインドマップPython

先週の実験のあと、また思い立ってマインドマップをPythonスクリプトに変換して実行するプログラムを作ってみました。

今回もJUDE APIJythonを利用します。

【使い方】
1. JUDEでPythonスクリプトみたいなマインドマップを描く。
sum.png
ブロックの始まりを意味するコロンは、つけてもつけなくてもかまいません。

2. Jythonでmm_jython.pyを動かす。


> set CLASSPATH=C:\Program Files\JUDE-Community\jude-api.jar;C:\Program Files\JUDE-Community\jude-community.jar

> set PATH=C:\jython2.2

> jython mm_jython.py sum.juth 10
KeyStr = is invalid
KeyStr = is invalid
KeyStr = is invalid
import sys
def sum(n):
    s = 0
    for i in xrange(n + 1):
        s += i
    return s
print sum(int(sys.argv[1]))

55


引数には、さっき書いたマインドマップのファイル(sum.juth)と、その引数(今回は10)。
実行すると、マインドマップをPythonスクリプトに変換して、実行します。
この例では最後に『55』と表示されているのが実行結果です。


現状ではエラーが起きたときにどこで発生したかわかりにくいとか、マインドマップが横に伸びすぎるなどの問題もありますが、マインドマップでプログラムを描くというのはなかなか新しい体験です。興味がある方はぜひお試しください。ファイル一式は下につけておきます。

mm_jython.zip:mm_jython.pyを含むファイル一式

2007年09月14日

JythonからJUDE APIを使ってみる(マインドマップ→テキスト)

ふとマインドマップをテキストにしたくなって、JUDE APIJythonから使って実験してみました。

JythonとはJava上に実装されたPythonなのですが、Javaの上で動いているのでJUDE APIを使うのも簡単です。マインドマップをテキストに変換するスクリプトmm2text.pyのソースコードは↓です。

import sys
from java import *
from com.change_vision.jude.api.inf.project import *
from com.change_vision.jude.api.inf.model import *

def topic_to_text(topic, level):
    text = "\t" * level + topic.label + "\n"
    for child in topic.getChildren():
        text += topic_to_text(child, level + 1)
    return text

pro = ProjectAccessorFactory.getProjectAccessor()
pro.open(sys.argv[1])
file = open(sys.argv[2], 'w')

for oe in pro.project.getOwnedElements():
    if isinstance(oe, IMindMapDiagram):
        print(topic_to_text(oe.rootTopic, 0))
        file.write(topic_to_text(oe.rootTopic, 0))

file.close()
pro.close()

使い方は、CLASSPATHにjude-api.jarとjude-community.jar、PATHにJythonのインストールディレクトリ、コマンドラインオプションでマインドマップファイル名と出力先テキストファイル名を指定してmm2text.pyを実行するだけです。

> set CLASSPATH=C:\Program Files\JUDE-Community\jude-api.jar;C:\Program Files\JUDE-Community\jude-community.jar
> set PATH=C:\jython2.2
> jython mm2text.py input.juth output.txt

入力するマインドマップファイルはJUDE/ProfessionalでもJUDE/Think!でもOKのはずです。ただし、JUDEでファイルを開いているとこのスクリプトは動いてくれませんのでご注意を。

jude-api.jarとjude-community.jarはJUDE/Community 5.0.2のもので試しています。古いバージョンのものではうまく動かないかもしれません。

実はマインドマップをテキストにするにはコピー&ペーストすれば簡単にできるのですが、たとえばファイルやマインドマップがたくさんあるとコピー&ペーストも大変なので、そういったときにはこのスクリプトを思い出して試してみてください。

mm2text.zip:mm2text.pyを含むファイル一式

参考
なんとなくな Developer のメモ 「JUDE API を JRuby から使ってみる」
http://d.hatena.ne.jp/fits/20070515

2007年07月27日

Mixiの中でニコニコカレンダーをまたまたバージョンアップ

12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。
前のバージョンでは右上にニコニコカレンダーがあってmixiのメニューが選べなくて困ると言うご意見がありましたので、マウスでニコニコカレンダーを移動できるようにしました。

使い方は前のバージョンと変わりません。
niko2mixi.user.jsをダウンロードして使ってみてください。

参考
Mixiの中でニコニコカレンダー
Mixiの中でニコニコカレンダーをIEにも対応
Mixiの中でニコニコカレンダーをバージョンアップ
Mixiの中でニコニコカレンダーをまたバージョンアップ

2007年07月20日

タスクのコメントをtwitterっぽく出力するRubyスクリプト「tritter」

TRICHORDのタスクの情報を抜き出して、タスクに付加できるコメントをTwitterっぽく出力させるスクリプト「tritter」を公開します。TRICHORDは1.1からカードを裏側にひっくりかえしてコメントを入力できるようになっています。このコメントを有効活用するためにtritterを作ってみました。タスクが完了したときに、そのタスクの思い出を書いておくと、後でみるとその時の記憶が甦ってきますよ。

使い方は、tritter.rbをダウンロードして以下のコマンドで実行します。Rubyはあらかじめインストールしておいてください。出力先ディレクトリは、指定されなければカレントディレクトリに、指定されている場合でなければ自動的に作成します。tritter.htmlというファイルをブラウザで表示するとサンプル画像のようなHTMLが出力されます。

是非お楽しみください。

 $ ruby tritter.rb 対象ワークスペース [出力先ディレクトリ]


tritter.rb


[tritter出力例]

2007年07月13日

Rubyを使ってTRICHORDのストーリーデータをCSV形式にする

Rubyを使ってTRICHORDのデータをCSV形式にする』の続きです。
今度はTRICHORDのストーリーデータをCSV形式にしてみました。 使い方は前回とほとんど同じです。まず、Rubyをインストールして、次に下に書いてあるRubyスクリプトを『ワークスペース/sctipts/stories_csv.rb』と言うファイルにします。コマンドラインから

ruby stories_csv.rb

と入力して実行すると、同じディレクトリに『stories.csv』というCSVファイルが出来上がります。
このファイルにはストーリーデータがその所属するフィーチャーやイテレーションとともに出力されています。

ここまでできれば、タスクデータとストーリーデータをつなげて全部の情報の入ったCSVを出すこともできそうなので、またチャレンジしてみます。


require 'rexml/document'
require 'csv'
require 'nkf'


def getElementText(element, name)
  child = element.elements[name]
  if not child
    return nil
  end
  if not child.text
    return nil
  end
  return NKF.nkf("-s", child.text)
end

def get_iteration_theme(iterations, iterationId)
  iterations.each do |iteration|
    if iterationId == getElementText(iteration, "id")
      return getElementText(iteration, "theme")
    end
  end
  return ""
end

def get_release_theme(iterations, iterationId)
  iterations.each do |iteration|
    if iterationId == getElementText(iteration, "id")
      release = iteration.get_elements('../..')[0]
      return getElementText(release, "theme")
    end
  end
  return ""
end

def get_feature_name(story)
  feature = story.get_elements('../..')[0]
  return getElementText(feature, "name")
end

def get_size(story)
  size = story.get_elements('size')[0]
  if size == nil
    return ""
  end
  return getElementText(size, "shortString")
end

CSV.open("stories.csv","w") do |writer|
  writer << ["release", "iteration", "feature", "story", "size"]

  File.open("../projectplan.xml") do |file|
    doc = REXML::Document.new(file)
    stories = doc.get_elements('*/*/Feature/stories/Story')
    iterations = doc.get_elements('*/*/Release/iterations/Iteration')

    stories.each do |story|
      column = []
      column << get_release_theme(iterations, getElementText(story, "iterationId"))
      column << get_iteration_theme(iterations, getElementText(story, "iterationId"))
      column << get_feature_name(story)
      column << getElementText(story, "name")
      column << get_size(story)
      writer << column
    end

  end

end

2007年07月12日

Mixiの中でニコニコカレンダーをまたバージョンアップ

12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。

今回の変更点は以下のとおりです
・表示位置の変更
 mixiの画面の右上に表示するように変更しました。
 mixiのレイアウト変更があっても、エラーダイアログがでることが少なくなるはずです。

使い方は前のバージョンと変わりません。
niko2mixi.user.jsをダウンロードして使ってみてください。

参考
Mixiの中でニコニコカレンダー
Mixiの中でニコニコカレンダーをIEにも対応
Mixiの中でニコニコカレンダーをバージョンアップ

2007年07月06日

Rubyを使ってTRICHORDのデータをCSV形式にする

Rubyの勉強もかねて、TRICHORDのXML形式データをCSV形式にするRubyスクリプトを作ってみました。

まず、Rubyはインストールしておきます。次に下に書いてあるRubyスクリプトを『ワークスペース/sctipts/tasks_csv.rb』と言うファイルにします。最後にコマンドラインから

ruby tasks_csv.rb

と入力して実行すると、同じディレクトリに『tasks.csv』というCSVファイルが出来上がります。
このファイルにはワークスペース内のタスクカードのデータが出力されていますので、Excelなどで編集することができます。

今回はタスクカードのデータだけしか出していませんが、『ストーリーカードやフィーチャーカードも出したい』、『ニコニコカレンダーのデータも出したい』と言うような要望もあればフィードバックをください。
ユーザーの皆様からのフィードバックが多ければ、TRICHORD本体にも入れようと考えています。

require 'rexml/document'
require 'csv'
require 'nkf'

ROW_NAMES = ["iterationId", "storyId", "name",
             "status",  "estimate", "signedUp",
             "todoDate", "doingDate", "doneDate"]

def getElementText(element, name)
  child = element.elements[name]
  if not child
    return nil
  end
  if not child.text
    return nil
  end
  return NKF.nkf("-s", child.text)
end

CSV.open("tasks.csv","w") do |writer|
  writer << ROW_NAMES

  Dir["../tasks/iteration_*.xml"].each do |filename|
    File.open(filename) do |file|
      doc = REXML::Document.new(file)
      doc.elements.each('PlanImpl/tasks/Task') do |element|
        column = []
        ROW_NAMES.each do |row_name|
          column << getElementText(element, row_name)
        end
        writer << column
      end
    end
  end
end

2007年06月07日

「TRICHORDの背景」短期連載記事 第二弾公開

先週から開始しました、TRICHORDの背景に流れる「時間中心のスケジュール管理」についての記事の第二弾「時間を基軸とするスケジュール管理」を公開しました。今回の記事では、時間を基軸としたスケジュール管理にPDCAサイクルや、ことの階層構造などを用いてうまく管理していくポイントを示しました。皆さまのフィードバックを心よりお待ちしております。なお、第三回の配信予定は次のようになっています。こちらのblogやチェンジビジョンのサイトでもご連絡いたします。ご期待ください。

第三回配信予定:2007-06-14

http://trichord.change-vision.com/docs/TRICHORD_articles_bg2.html

 

2007年05月31日

短期連載記事「TRICHORDの背景」 第一弾公開

本日より、TRICHORDの背景に流れる「時間中心のスケジュール管理」についての記事を全三回の短期連載という形でお届けします。第一弾は「何故スケジュール管理が難しくなっているのか」です。皆さまのフィードバックを心よりお待ちしております。なお、第二回以降の配信予定は次のようになっています。こちらのblogやチェンジビジョンのサイトでもご連絡いたします。ご期待ください。

第二回配信予定:2007-06-07
第三回配信予定:2007-06-14

http://trichord.change-vision.com/docs/TRICHORD_articles_bg1.html

2007年05月27日

第二回 全日本腰リールカンファレンスのTRICHORDワークスペース

先月行われた第二回 全日本腰リールカンファレンスですが、実はTRICHORDを使ってイベントの管理していました。
せっかくですので、そのワークスペースを公開いたします。

第二回 全日本腰リールカンファレンスのTRICHORDワークスペース
kanban_iterarion4.png

TRICHORDは主にソフトウェア開発プロジェクトをターゲットとしていますので、イベントの管理は想定していないのですが、やってみるとなかなかいい感じで使うことが出来ました。

詳しいことは技術評論社の雑誌であるエンジニアマインドに書いていますので、見てみてください。
エンジニアマインド Vol.4 見える化ソフトTRICHORDを使ってイベント管理【前編】
エンジニアマインド Vol.5 見える化ソフトTRICHORDを使ってイベント管理【後編】(まだ発売していません)

2007年05月18日

Mixiの中でニコニコカレンダーをバージョンアップ

12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。

今回の変更点は以下のとおりです
・表示位置の変更
 mixiの画面の左下に表示するように変更しました。
 2列/3列の両方の表示方法に対応しました。

使い方は前のバージョンと変わりません。
niko2mixi.user.jsをダウンロードして使ってみてください。

niko2mixi.gif

参考
Mixiの中でニコニコカレンダー
Mixiの中でニコニコカレンダーをIEにも対応

2007年05月16日

TRICHORDが2回に1回落ちる障害が発見されました

TRICHORD1.1で起動時に2回に1回落ちる障害が発見されました。
もしこの障害が発生する場合は、誠にお手数ですが
下記の回避方法を実施して下さい。

== 回避方法 ==
[1]TRICHORDのインストールディレクトリにあるworkspaceフォルダを削除します。
(例:C:\TRICHORD\workspaceを削除)

[2]TRICHORDを再起動します。
なお、この操作でニコカレやかんばんのデータが消える事はありません
注)TRICHORDから選択するワークスペースではありません。TRICHORDから選択するワークスペースを消してしまうと、ニコカレやかんばんのデータが消えてしまうのでご注意ください。
(例:////aaa/bbb/cccは削除しません)

== 原因 ==
・ストーリーかんばんを開いたままTRICHORDをアップデートした場合
・ストーリーかんばんを開いたままTRICHORDを終了し、バージョン1.1のインストールをした場合

この障害は上記のいずれかの条件を満たし、再起動した場合に発生が確認されております。

ご迷惑をおかけいたしまして誠に申し訳ございません。

2007年04月24日

1.1RCの不具合について

1.1RCには以下のように突然起動しなくなってしまう障害があります。

java.lang.IllegalStateException org.eclipse.core.internal.resources.ResourceException: External Files のプロジェクト記述ファイル (.project) がありません。 このファイルには、プロジェクトに関する重要な情報が含まれています。 このファイルが復元されるまで、プロジェクトは正しく機能しません。

この障害が発生した場合には、TRICHORDのインストールディレクトリ(例:C:\TRICHORD)以下に存在するworkspaceディレクトリを削除、あるいはリネーム後再起動してみてください。workspaceディレクトリを削除すると、今迄使用していたプロジェクトのワークスペースの履歴が消えてしまいますので、申し訳ありませんが再度選択してください。

本件は1.1リリース時にはFIXしています。(参考:#928)

 

 

2007年04月06日

Mixiの中でニコニコカレンダーをIEにも対応

以前ご紹介させていただきました12%ルールの成果である、Mixiの中でニコニコカレンダーをバージョンアップしたのでお知らせします。

今回の変更点は以下のとおりです
・Internet Explorerに対応
 IE 6.0で動作を確認いたしました。
 FireFoxでのGreasemonkeyに対して、IEではTrixieを使用しています。
・体感表示時間を減少
 少しずつ表示するようにしました。
・バグフィックス
 エラーダイアログを出ないようにしました。

使い方は前のバージョンと変わりません。
niko2mixi.user.jsをダウンロードして使ってみてください。
IEの方も、おなじJavaScriptファイルを使ってTrixieで使用できますので、ぜひ試してみてください。

2007年03月16日

Mixiの中でニコニコカレンダー

TRICHORDチームでは12%ルールといって毎週金曜日の午後は自分の自由研究をすることになっています。
この12%ルールの私の成果を紹介します。

この機能のコードネームはniko2mixiです。
niko2mixiを使うとMixiの中にニコニコカレンダーが登場します。
今流行のマッシュアップに近い機能ですが、Mixiの資源に寄生して新しい機能を実現させるという
イメージをこめて、私はこの寄生する作戦を『マッシュイン』と呼んでいます。

【ニコニコカレンダーの表示】
view.png
Mixiのトップ画面にニコニコカレンダーが表示されます。
マイミクの中でniko2mixiを使っている人がいれば、その人のニコカレも表示されます。

【ニコニコカレンダーの入力】
input.png
日記を書くときに、ニコニコカレンダーのボタンが出て、その日の気分を入力できます。


【条件と使い方】
実はniko2mixiの使い方は少々難しいです。
自己責任で試すことができる人のみ、使ってみてください。

条件
1. ブラウザはFireFoxのみ。
2. FireFoxにGreasemonkeyをインストールする。

使い方
1. niko2mixi.user.js ←のJavaScriptファイルをクリックして、Greasemonkeyにインストールする。
2. Mixiで日記を書くときに、表示されたニコニコカレンダーアイコンをクリックして、タイトルに顔文字を入れておく。
3. Mixiのトップページでニコニコカレンダーをみる。
4. クリックしてその日記にジャンプする。
5. 気に入ったらマイミクにniko2mixiを使うように勧める。


いかがでしょうか。
こうしたらもっと良いなどのフィードバックをお待ちしております。

2007年02月01日

JaSST2007に参加しました

JaSST 2007にTRICHORD開発部の懸田が参加しました。

1/30にはTRICHORD開発のプラクティスである「バグレゴ」の事例発表を行いました。内容はオブジェクト倶楽部や日本XPユーザー会などで話したプラクティス紹介の中から、バグレゴを中心に障害に対するプラクティスを紹介しました。素晴しい論文、事例発表が行われる中、バグレゴのような100%現場色の事例を発表ができ、貴重な経験になりました。

1/31にはTRICHORDの1.0(JaSST版)のニコニコカレンダーを対象にテスティングライブが実施されました。テスティングライブでは、TRICHORDをテスト対象としたライブが行われました。リリース直前で障害をそれほど埋めこめなかったのですが、こちらで見落した細かな障害も含めて発見して頂きました。早速、TRICHORDのフィードバックサイトにてチケット登録していますのでご確認ください。

JaSSTで発見されたチケット一覧

チームの中では「TRICHORDのイベントでテスティングライブを行うのも面白いね」という意見がでました。ちょっと真面目に企画してみようと思います。もちろん優勝者には賞品を用意する方向で!!

最後に、1/30に講演したバグレゴの発表が、JaSST-2007のベストスピーカー賞(2位)に選ばれました。表彰など夢にも思っていなかったためとても驚きました。現場での工夫に聴衆の方々が少しでも感じてくれた結果だと素直に受け止めさせて頂きます。早速賞状と副賞を持ち帰り、チームで記念写真を取りました。

2006年06月22日

ITPro連載の公開

http://itpro.nikkeibp.co.jp/article/COLUMN/20060620/241333/

ITProの連載「 第13回 バーンダウン・チャートによるプロジェクト管理の進め方」が公開されました。先週に引き続いてバーンダウンチャートの解説をしています。この中でTRICHORDのスクリーンショットが掲載されていますが、今開発中のタスクかんばんを組み込んだスクリーンショットになっています。実際のリリース版はもっとカードに文字が表示できるようになります。

タスクかんばんを組み込んだTRICHORDは来週リリース予定です。

2006年05月22日

ブラウザでTRICHORDチームのプロジェクト情報を見られます

はじめまして、TRICHORD開発部のAkiyahです。

以前からTRICHORDチームのプロジェクト情報を公開していますが、
実験的にブラウザでも見ることができるようにしてみました。
TRICHORDをインストールしていないパソコンでも、ブラウザさえあれば
見ることができます。(IEとFireFoxで動作確認をしています)
TRICHORDチームの様子をのぞいてみてください。

ニコニコカレンダー
http://trichord.change-vision.com/status/ajax/view_niko2.html

バーンダウンチャート(表のみ)
http://trichord.change-vision.com/status/ajax/view_tasks.html

2006年05月09日

0.1.1へのフィードバックへの返信

連休を挟んで間が空いてしまいました。

NAgilerさんのBlogでタスクかんばんについてのエントリのトラックバックがあったのでコメントします。

* ToDo、Doing、DONE とDONEだけ大文字なのが気になったり(笑)
これはDONEが一番重要なので強調するために敢えてしています。
実際にカードで扱う場合だと、終ったカードをDONEの領域に「バンッ!」と貼るようなイメージです。

* 長文のタスクの場合、マウスオーバーでタスク名をポップアップしてくれると嬉しい。
見出しとなる名前と、説明を別に分けたほうがよいですね。参考にさせて頂きます。
オペレーションとしては、カードの裏に詳細が書いてある、なんてのも面白いですね。

* タスクに担当者のフィールドが欲しい。
現在のシンプルなモデルに合わせたので担当者がありません。
今後追加する予定です。

* タスクのプライオリティ、または担当者で色分けできるオプションがあればいいな。
プライオリティの表現は色でも可能ですが、位置(重要が上)でもできますね。
担当者を色分けするというのがちょっとイメージできません(すみません)
Aさんは赤、Bさんは青、のように色で人を識別するということでしょうか?

* Doingに滞留しっぱなしのタスクにアラートが出せたらいいな。
Doingに滞留している(=なかなか終わらない)タスクを危険色にするという
アイディアはあります。アラートはまた別に面白いですね。

#JavaOneに向けて頑張ってくださいね!
ありがとうございます!!

2006年04月12日

Eclipse Platformについてのヘルプ

TRICHORDはEclipse Platform上のRCP(Rich Client Platform)で構築されたアプリケーションです。そのためEclipseを使い慣れた開発者には馴染深いインターフェースですが、.NETなどEclipseを普段使われていない方々には逆に用語から、インタフェースから分りにくいという御意見を頂きました。

次のリリースではTRICHORDのヘルプシステムにEclipseのワークベンチガイドを含めて、Eclipseを知らなくてもEclipse Platform固有の概念や、操作を閲覧できるようにします。それまでの間は、Eclipseをダウンロードして使って頂くか、ワークベンチユーザガイド(英語)を御覧ください。ちなみにTRICHORDに同梱のヘルプはちゃんと日本語になります。

TRICHORDの開発スタイルを記事にしています

日経ITProにおいてチェンジビジョン代表の平鍋が連載していたWeb 2.0時代のソフトウエア開発手法を、TRICHORD開発部の懸田が引き継ぎ、TRICHORDの開発を例として、Web2.0時代の軽量開発を提案していきます。

TRICHORDはコンセプトアウト/デマンドイン型のソフトウェア開発というジャンルです。TRICHORD自身はWebアプリケーションではありませんが、開発スタイル、プロダクトとしての姿勢はWeb2.0に通じるものがあるのではないかと考えています。


連載の目次
TRICHORDの開発について[1]