« 2008年04月 | メイン | 2008年06月 »

2008年05月30日

今週のふりかえり(2008/5/26 - 2008/5/30)

今週のふりかえりです

今週末からTRICHORDチームは、フロリダで開催されるRational Software Development Conferenceに参加するため、アメリカに出張します。
ディズニーランド内のホテルで開催されるので、ネズミー的なグッズでいっぱいでしょうか。
RSDCでは、Jazz(http://jazz.net/pub/index.jsp)、Lean,Agileに関連するセッションに参加します。 しっかり参加して、今後のTRICHORDにしっかり活かして行きたいと思います。

あとは、TRICHORDチームの若干名は、釣りブームがまだまだ収まらないようです。どんどんフィールドを広げていっているようですね。今は80cmオーバーのシーバスを釣る、渓流ルアーを楽しむのが目標なようです。

20080530_1.JPG

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/5/19 - 2008/5/23)

今週のふりかえりです

今週のはじめは雨がふり、その後は晴れて暑い日です。
Problemには壊れた傘が、Keepには『晴れ』がでていますね。

実は先週のSODECで遅刻が一件あり、ふりかえりの後にその遅刻ルーレット(あみだくじ)をしました。
『御苑で腹筋100回』『花園公園掃除』『献血』『再ウェンディーズ』等がある中、あったったのは『窓掃除』でした!
ところが今日は掃除業者さんが入っての窓掃除の日で、窓はピカピカになってしまい、窓掃除をする必要はなくなってしまいました。。。

SANY0010.JPGSANY0011.JPG

SANY0012.JPG

今週のふりかえり(2008/5/12-2008/5/16)

先週のふりかえりです。

 5/12〜5/16はSODEC出展で、ふりかえりは翌週になってしまいました。たくさんの方々にブースにお越しいただけ、多くのフィードバックを頂戴できました。ありがとうございました。

 JUDEチームのはこHさんのプレゼンがあまりにも斬新で、プロブレムになっています。機会があったら、是非お聞きください。


05141.JPG
05142.JPG


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月07日

今日のニコニコカレンダーをメールで送る

TRICHORDのニコニコカレンダーの情報をRubyで抜き出してメールで送るということをやってみたので、ソースコードを載せて置きます。
下のソースコード以外にも、niko2api.rbというライブラリも作って利用しています。

【使い方】


ruby niko_2_mail.rb "workspace" "mail_to" "mail_from" "mail_title"

【niko_2_mail.rb】


#!/usr/local/bin/ruby
require 'net/smtp'
require 'kconv'
require 'date'
require 'niko2api'

WORKSPACE = ARGV[0]
MAIL_TO = ARGV[1]
MAIL_FROM = ARGV[2]
MAIL_SUBJ = ARGV[3]

FACE_MARK = {"GOOD" => '(^o^)', "NORMAL" => '(-.-)', "BAD" => '(>_<)'}

def create_niko2_data()
  today = Date.today

  data = "NIKO NIKO CALENDER\n"

  api = Niko2Api.new(WORKSPACE)
  api.load()

  ufs = api.find(today.year, today.month, today.day)
  ufs.each do |uf|
   data += FACE_MARK[uf.feelingItems[0].feeling] + " " + uf.user.name + "\n"
   data += uf.feelingItems[0].comment + "\n"
  end

  return data
end

def sendmail(body)
  head = "Subject: #{MAIL_SUBJ}\n"
  head += "To: #{MAIL_TO}\n"
  head += "From: #{MAIL_FROM}\n"
  head += "Mime-Version: 1.0\n"
  head += "Content-Transfer-Encoding: 7bit\n"
  head += "Content-Type: Text/Plain; charset=iso-2022-jp\n\n\n"

  src = head + Kconv.tojis(body)
  Net::SMTPSession.start(address = 'change-vision.com', port = 25) do |m|
   m.sendmail(src, MAIL_FROM, MAIL_TO)
  end
end

if __FILE__ == $0
  sendmail(create_niko2_data())
end

【送られるメールのサンプル】


NIKO NIKO CALENDER
(-.-) kompiro
I met many local friends in last weekend. They were not change a lot.But I have beard now.So Anybody didn't understand me.
(-.-) Mr. Foie gras
休み明けは働く気がしませんなー。飛行機がいい席とれてよかったー


ダウンロードはこちら
niko_2_mail.rb
niko2api.rb

2008年05月02日

習作:バグレゴonWeb

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

block.png

今週のふりかえり(2008/4/28-2008/5/2)

今週のふりかえりです。

GWなので、人が少ない週でした。先々週の福井出張でやってみて以来、チーム内でボルダリングがプチブームです。チームの1人は東京でもボルダリングが出来るところが無いかと探して、恵比寿のボルダリングジムに行ってきたようです。

そのほかのプチブームには、釣り、図書館、手打ちそば、昼食抜き、などがあります。すぐに飽きてしまうものもあるかもしれませんが、あたたかく見守っていてくださいね。

SANY0029.JPGSANY0030.JPG

2008年05月01日

今週のふりかえり(4/21-4/25)

今週のふりかえり写真です。
ここ数ヶ月、ふりかえりのファシリテーターをじゃんけんで選んでいるのですが、久し振りに負けてしまいました。
今回のふりかえりは、某社から5名の方がTRICHORDのふりかえりの風景を見学に訪れてくれました。
ふりかえりの後に、新宿御苑でお昼を食べ、午後に交流会でふりかえりに限らず情報交換をさせて頂きました。
福井のチェンジビジョンの社員がふりかえりに参加する時に、「思っていたよりも真面目にやっているのでびっくりした」と言われましたが、今回も同じようなことを言われました(w

こちらもいろいろ参考になり、本当にありがとうございました。

P.S 写真の裏に写っているのが誰だかわかった方はTRICHORDチームまでメールをください。正解者の中から抽選で3名の方を新宿御苑にご招待します(入園料は奢ります)


TRICHORD1.3.2をリリースしました

TRICHORD1.3.2では、WebReportが出力されないなどのいくつかの障害に対応しました。

WebReportが出力されない障害でご不便おかけいたしまして大変申し訳ございませんでした。

ダウンロード
従来からの変更点
1.3.2で対応した障害

TRICHORD1.3.2のご利用は、上記サイトより、ダウンロード・インストールしてください。
1.3.2への更新サイトでのアップデートはできません。
また、従来通りライセンスが無くてもTRICHORDをお試しいただけますので、ぜひご評価下さい。