ReDesign of software development life cycle with Redmine

There is a need to take measures against SI and support business expansion of my department. *1 *2
I Planned to redesign of software development life cycle with Redmine. *3

Context

  1. Software Architecture (3-Layered Model)
    1. Bender package
    2. Common programs for group companies
    3. Each Customer's custom programs
  2. Development Environment *4
    1. One software repository
    2. One BTS(Bug Tracking System)
  3. Management, Communication Tool
    1. Excel (WBS, QA List and so on)
    2. Mail (QA, request to somebody and so on)
    3. Each member's favorite ToDo system (Post-it, remember the milk *5 and so on)

Problems

  1. Many ToDo Lists!
  2. Non-identical Business workflow!

Concepts of New Software development life cycle

  1. No ticket, No work *6
    1. INPUT: ticket
    2. PROCESS: work
    3. OUTPUT: source code, document, and so on.
  2. Mieruka *7
    1. PAST: what was done? who did it? why? how?
    2. FUTURE: what to do?
    3. NOW: who is assigned? (visualize business workflow) who is too busy? who can help?
  3. Simple and Less is More *8
    1. Project Managers get progress information quickly & easily.
    2. Project Managers get more time, energy, ideas for driving projects.

Implementation with Redmine

  1. Ticket model
  2. Ticket workflow
    1. ToDo
    2. QA
    3. Bug
    4. Change
    5. Incident
    6. Relase
    7. RFC
  3. Project Tree Model

footnote

*1: 有難いことにお仕事(SIとその後の保守サービス)が増えています

*2: 限られたメンバーで切り盛りしていくためには、現行の業務プロセスとそれを支えるツールの見直しが急務です

*3: webベースのプロジェクト管理ソフトウェア http://redmine.jp/

*4: Trac + Subversion

*5: https://www.rememberthemilk.com/

*6: チケット駆動開発(ticket-driven development)の合言葉No ticket, No Commit. から。管理する意味がある作業指示は全てチケット化したいです。

*7: 見える化http://en.wiktionary.org/wiki/mieruka

*8: 情報収集は機械に任せ、PMさんがプロジェクト推進に注力できるようにしたいです

Tips and Tricks for Ant on Eclipse. Make JAR file for each subsystem. 2nd Version

前回のバージョンから、ちょくらちょいと修正しました。変更点は

    1. そもそもJava VMのVersionをちゃんと指定してコンパイルしないと動きません
    2. コピペとかだるいので、ループ処理を追加しました
    3. manifestフェイルをちょっと賢くしました

build.properties

説明略。

# do not use eclipse helper GUI
app.name=${ant.project.name}

java_encoding=MS932
keeptimestamp=false
verbose=false

src.dir=./src
lib.dir=./lib
lib4batch.dir=./lib4batch
external.dir=./external
defaultroot.dir=./defaultroot
etc.dir=./build
bak.files=**/*~

build.rev=****
makejar.select=**/hoge-addons/*

build.dir=./build.ant
build.src.dir=${build.dir}/src
build.classes.dir=${build.dir}/classes
build.jar.dir=${build.dir}/jars

target.vm.version=1.6
source.vm.version=1.6
javac.nowarn=off
build.debug=on
build.debuglevel=lines,vars,source
build.memoryMaximumSize=512m

imp.vendor.name=HOGE Corporation

# Tomcat
catalina.home=C:/proactive_devtool/tomcat6.0

build.xml

    1. Java VMのVersion指定してコンパイル
      1. javac のところで、source、targetを指定してください
    2. ループ処理
      1. contrib-XXX.jarをネットで探してきて、ANTのランタイム > クラスパスに追加して下さい
      2. そうすると、foreachが使えます!
      3. scriptdefでjavascriptを定義します。サブシステム毎のフォルダ階層から、jar名を切り出します。
    3. manifestフェイルをちょっと賢く
      1. tstamp使って、ビルド実行日時をmanifestに追記します
      2. 日時以外にも色々追記しようと色気出して落とし穴にはまりました。Oracle Application Serverのコンテナ上だと起動できるのに、Tomcatの開発クラスローダを使ってるとClass Not Foundとか・・・
      3. ↓のタイトル以外を使うとTomcatさんがすねます

Implementation-Title パッケージのタイトル
Implementation-Version バージョン番号
Implementation-Vendor ベンダー企業または組織
Specification-Title 仕様のタイトル
Specification-Version バージョン番号
Specification-Vendor ベンダー企業または組織

以下、できあがりバージョン。これてにANTの自習は終了!

<?xml version="1.0" encoding="Windows-31J"?>
<project name="paradise" basedir="." default="all">
	<property file="build.properties"/>
	<tstamp><format property="build.timestamp" pattern="yyyy-MM-dd 'T'HH:mm:ss"/></tstamp>
	<scriptdef name="substring" language="javascript">
		<attribute name="text" />
		<attribute name="start" />
		<attribute name="end" />
		<attribute name="property" />
		<![CDATA[
		var text = attributes.get("text");
		var start = attributes.get("start");
		var end = attributes.get("end") || text.length();
		project.setProperty(attributes.get("property"), text.substring(start, end));
		]]>
	</scriptdef>

	<!-- Include ant-contrib-XXX.jar in Eclipse ANT Runtime classpath -->
	<taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" />

	<!-- Execute-->
	<target name="all" depends="make-jars"/>

	<!-- Common Util: Set CLASSPATH -->
	<target name="set-classpath">
		<path id="compile.class.path">
			<!-- PAE2 JAR (1) -->
			<path><fileset dir="${lib.dir}"><include name="*.jar"/></fileset></path>
			<!-- PAE2 JAR (2) -->
			<path><fileset dir="${lib4batch.dir}"><include name="*.jar"/></fileset></path>
			<!-- Container JAR -->
			<path><fileset dir="${catalina.home}/lib"><include name="*.jar"/></fileset></path>
		</path>
	</target>

	<!-- 1. Start Message -->
	<target name="begin-message"  depends="set-classpath">
		<echo>BuildName: ${ant.project.name}</echo>
		<echo>BuildHome: ${basedir}</echo>
		<echo>BuildJVM:  ${ant.java.version}</echo>
		<echo>BuildFile: ${ant.file}</echo>
	</target>

	<!-- 2. Clean -->
	<target name="clean" depends="begin-message">
		<delete dir="${build.dir}"/>
		<delete><fileset dir="." includes="${bak.files}" defaultexcludes="no"/></delete>
		<sleep seconds="1"/>
	</target>

	<!-- 3. Make directories, copye *.java -->
	<target name="setup" depends="clean">
		<mkdir dir="${build.dir}"/>
		<mkdir dir="${build.src.dir}"/>
		<mkdir dir="${build.classes.dir}"/>
		<mkdir dir="${build.jar.dir}"/>

		<copy todir="${build.src.dir}" includeemptydirs="true" preservelastmodified="${keeptimestamp}" verbose="${verbose}">
			<fileset dir="${external.dir}" includes="**/*.java"/>
		</copy>

	</target>

	<!-- 4. ALL Compile -->
	<target name="compile" depends="setup">
		<javac destdir="${build.classes.dir}" source="${source.vm.version}" target="${target.vm.version}" fork="false" includeantruntime="false">
			<src path="${build.src.dir}"/>
			<classpath>
				<path refid="compile.class.path"/>
			</classpath>
		</javac>
	</target>

	<!-- 5. foreach make jar file -->
	<target name="make-jars" depends="compile">
		<foreach param="dir" target="make-jar">
			<path>
				<!-- Only child directories -->
				<dirset dir="${build.src.dir}">
					<include name="${makejar.select}"/>
				</dirset>
			</path>
		</foreach>
	</target>

	<!-- Common Util: javac & jar -->
	<target name="make-jar" depends="set-classpath">
		<echo>Directory: ${dir}</echo>
		<substring text="${dir}" start="42" end="49" property="jarfilename" />
		<echo>jarfile name: ${jarfilename}.jar</echo>
		<javac destdir="${dir}" source="${source.vm.version}" target="${target.vm.version}" nowarn="${javac.nowarn}" debug="${build.debug}" debuglevel="${build.debuglevel}" fork="false" includeantruntime="false">
			<src path="${dir}"/>
			<classpath>
				<path refid="compile.class.path"/>
				<pathelement path="${build.classes.dir}"/>
			</classpath>
		</javac>

		<jar jarfile="${build.jar.dir}/${jarfilename}.jar">
			<fileset dir="${dir}">
				<exclude name="**/*.properties" />
				<exclude name="**/*.xml" />
			</fileset>
			<manifest>
				<attribute name="Implementation-Title" value="${jarfilename}"/>
				<attribute name="Implementation-Vendor" value="${imp.vendor.name}"/>
				<attribute name="Implementation-Version" value="${build.timestamp} [${build.rev}]"/>
			</manifest>
		</jar>

	</target>

</project>

Tips and Tricks for Ant on Eclipse. Make JAR file for each subsystem (PAE2アドオン開発・サブシステム毎にjar作成)

ProActiveE2はサブシステム(財務会計、債権、債務…等)毎にjarファイルが分割されています
それにならって、アドオン開発でもこの単位でjarファイルを用意しています
が、開発中(特にテストフェーズ!)は頻繁にjar化する必要があるので、ちょっと面倒です
この作業を ANTを使って一括実行するスクリプトについて勉強をしたときのメモです

build.properties

これいらないんじゃないの?ってものありますが、まぁそこはスルーしてください

# do not use eclipse helper GUI
custom = true

src.encoding=Windows-31J
app.name=${ant.project.name}

src.dir=./src
lib.dir=./lib
lib4batch.dir=./lib4batch
external.dir=./external
defaultroot.dir=./defaultroot
etc.dir=./build

bld.dir=./build.ant
bld.src.dir=${bld.dir}/src
bld.classes.dir=${bld.dir}/classes
bld.jar.dir=${bld.dir}/jars

bak.files=**/*~

# Tomcat
catalina.home=C:/proactive_devtool/tomcat6.0

build.xml

ANTのメインです。僕の中での工夫ポイントは、

です。後は、(6)のところをサブシステムの数だけコピペして編集すればOK!
ソースの添付とか、実機での稼動確認とか残タスクもありますが、そこはおいおい。

<?xml version="1.0" encoding="Windows-31J"?>
<project name="paradise" basedir="." default="all">
	<property file="build.properties"/>

	<property name="keeptimestamp" value="false"/>
	<property name="verbose" value="false"/>

	<!-- 全てのターゲットを実行 -->
	<target name="all" depends="make-jar"/>

	<!-- 1. ビルド開始メッセージ -->
	<target name="begin-message">
		<echo>BuildName: ${ant.project.name}</echo>
		<echo>BuildHome: ${basedir}</echo>
		<echo>BuildJVM:  ${ant.java.version}</echo>
		<echo>BuildFile: ${ant.file}</echo>
	</target>

	<!-- 2. 初期化。クラスパスの設定(とにかく何でも詰め込む) -->
	<target name="init" depends="begin-message">
		<path id="compile.class.path">
			<!-- PAE2 JAR (1) -->
			<path><fileset dir="${lib.dir}"><include name="*.jar"/></fileset></path>
			<!-- PAE2 JAR (2) -->
			<path><fileset dir="${lib4batch.dir}"><include name="*.jar"/></fileset></path>
			<!-- コンテナJAR -->
			<path><fileset dir="${catalina.home}/lib"><include name="*.jar"/></fileset></path>
		</path>
	</target>

	<!-- 3. ディレクトリ・バックアップファイル削除 -->
	<target name="clean" depends="init">
		<delete dir="${bld.dir}"/>
		<delete><fileset dir="." includes="${bak.files}" defaultexcludes="no"/></delete>
		<sleep seconds="1"/>
	</target>

	<!-- 4. ビルドディレクトリ作成・external ソースファイルコピー -->
	<target name="setup" depends="clean">
		<mkdir dir="${bld.dir}"/>
		<mkdir dir="${bld.src.dir}"/>
		<mkdir dir="${bld.classes.dir}"/>
		<mkdir dir="${bld.jar.dir}"/>
		<copy todir="${bld.src.dir}" includeemptydirs="true" preservelastmodified="${keeptimestamp}" verbose="${verbose}">
			<fileset dir="${external.dir}" includes="**/*"/>
		</copy>
	</target>

	<!-- 5. コンパイル ALL -->
	<target name="compile" depends="setup">
		<javac destdir="${bld.classes.dir}" debug="on" memoryMaximumSize="512m" fork="true">
			<src path="${bld.src.dir}"/>
			<classpath>
				<path refid="compile.class.path"/>
			</classpath>
		</javac>
	</target>

	<!-- 6. jarパッケージング -->
	<target name="make-jar" depends="init">
		<property name="wkdir" value="${bld.dir}/classesWK"/>
		<delete dir="${wkdir}"/>
		<mkdir dir="${wkdir}"/>
		<javac destdir="${wkdir}" debug="on" memoryMaximumSize="512m" fork="true">
			<src path="${bld.src.dir}/hoge-addons/src-hoge-agl"/>
			<classpath>
				<path refid="compile.class.path"/>
				<pathelement path="${bld.classes.dir}"/>
			</classpath>
		</javac>
		<jar jarfile="${bld.jar.dir}/hoge-agl.jar"/>
	</target>

</project>

図解! ProActive E2インストール +α

1年ぶりにやってみたら、大分忘れてしまっていた。次やるときに備えての備忘録。

個々のサーバで1回ぽっきりの設定

    1. JDKのインストール
    2. Firewallの許可追加
    3. アプリケーションサーバOracle Application Server インストール
    4. アプリケーションサーバでSVF Serviceのインストール
    5. データベースサーバでOracle Databaseのインストール


ProActive E2モジュールのインストール

用意されているbatを1発!

プラスα

    1. ユーザ追加
    2. Table、View 等を追加
    3. 初期データ追加


バッチ関連追加

    1. E2バッチサービスインストール
    2. E2 File Observerサービスインストール


アプリケーションサーバにて

    1. OC4J追加
    2. モジュールデプロイ


ゴール

    1. 同様にステージング環境も追加
    2. OASの実効ユーザ変更

Tips and Tricks for Print out Programs (at ProActive E2 Add on)

些細なアイデアかもしれないけれど、どこかのだれかには役立つかもしれないネタを1つ。

前回エントリーの後、帳票やCSV等のファイル出力バッチプログラム内に限定せず、エンドユーザが画面から出力指示する場合のプログラムとも、コントローラ部を共通化できると閃きました。

要は、ProActive E2のアドオンにおいて、バッチ用と画面用のBeanの型が異なるので、バッチ側からの値を途中で変換すればいいじゃないか!と。
まぁ、知ってしまえば何てことないTips & Tricksでございます。

Tips and Tricks for Batch Program

「ぼくにとっては普通のことでも、どこかの誰かにとってはそうでもない」・・・かもしれないネタをひとつ

Basic Batch ProgramPattern (ex. Data Import)

基本的なバッチ(一括)処理(例えば、大量データのインポート処理)はこんな感じ

    1. プログラム本体があって
    2. 振る舞いを多少変更できる設定ファイルがあって
    3. 外からやってくる(大量の)データを取り込む

Tips & Tricks for Batch Program of Data Export

上記構成はそのままに、「外からやってくるデータ」の役割について発想を変えると、ちょっとだけ面白いことができます。つまり

    1. 「外からやってくるデータ」にプログラムの振る舞いを変えるパラメータを仕込み
    2. パラメータに従って、一括出力するデータの範囲や条件を変更します
    3. 設定ファイルではなく取込ファイルを使うことで、気軽にプログラムの振る舞いを変えられます

バッチスケジューラー(JP1とか)が何をやったか?というログを残しやすいので、トラブルシューティングが迅速になる!・・・と期待してます

Example: ProActive E2の自動取込機能

ProActive E2に自動取込機能というのがあって、上記のTipsを適用するとこんな感じに盛り上がります。
ついでに設定ファイルも工夫すると、ほんのりとフレームワークぽくになります。

僕がバナナを売って算数ドリルをつくるワケ

先日、等々力で試合があった時に感じたことはずばり1つ、観客動員が増えてる!
AWAYエリアは2年前に比べ減 & でも空きが結構あ・・・


Jリーグ界隈では川崎さんの企画力は有名ですが、本書はその仕掛けの中心にいる方の著書です。

いちサポーターのアクションのヒントはないかしら?、と思って読み始めました。

…で読み進めていると、ちょいちょいウルっと。


今回気になったとこメモは以下の通りです!

    1. 何事も一筋縄では行かない
    2. 簡単に観客動員が伸びる方法などない
    3. クラブは農業のように汗をかいて、泥にまみれて育てていく
    4. 関わる人に"他人事ではない"と思わせるかどうかが企画を成功に導くためには大事なこと コツ

銀の弾丸なんてないぜ!ってことで。


僕がバナナを売って算数ドリルをつくるワケ (単行本)

僕がバナナを売って算数ドリルをつくるワケ (単行本)