JJUG CCC 2014 Spring
1401546451* Session List, Twitter
http://www.java-users.jp/?page_id=1048
https://twitter.com/search?f=realtime&q=%23jjug_ccc&src=hash
1401546452* Attended Sessions & Memo
K-2 Java 8 ラムダ式と Stream の概要について
http://www.slideshare.net/OracleMiddleJP/overview-lambda-streams
R1-1 Java 8 for Java EE 7/6
- Java SE8を導入したら真っ先にやりたいところ
- Date and Time API
- Type Annotation (nullチェックロジック不要になる)
- Lambda expression
- 順序を守らせるためには forEachOrdered !!!
- MW対応状況 (#10)
http://www.slideshare.net/iwasakihirofumi/future-of-java-ee-with-java-se-8
R5-3 TDD BootCamp in JJUG CCC -レガシーコード対策ハンズオン-
R1-5 Java EE 7 対応! JPA の同時実行制御とロック
http://sssslide.com/www.slideshare.net/masatoshitada7/jpa20140518-ccc-r15-jjug-ccc
R1-6 最近の Java Web 開発 (2014 春)
AND/OR Search
This is new feature of slim3 (framework for GAE/J) Version 1.0.16.
http://code.google.com/p/slim3/issues/detail?id=113
This is my sample.
CompositeCriterion keywordFilter = new CompositeCriterion(ITEM_META, CompositeFilterOperator.OR, new CompositeCriterion(ITEM_META, CompositeFilterOperator.AND, ITEM_META.itemID.startsWith(keyword)), new CompositeCriterion(ITEM_META, CompositeFilterOperator.AND, ITEM_META.itemName.startsWith(keyword))); S3QueryResultList<Item> list = Datastore.query(ITEM_META).filter(keywordFilter).limit(limit).asQueryResultList();
I should be glad to be of any service to you.
They empowers me. I will empower him and you!
個人事業主の友達からバックオフィス業務をITで効率化したいと相談されたのが去年の12月。
それじゃーちょっとやってみようということで、朝カフェとか帰りの電車の中で作ってみました。
今回作ったシステムの機能
- システム管理系
- 日常業務系
- 商品検索
- 見積管理
- 発注管理
- メンテナンス業務
- 商品マスタ
- メーカーマスタ
設計時の注意点・工夫
GAEの特性や制約内に収まるようにすることが全てです。今回のシステム化対象に特化した仕様になりましたが、横点してビジネスをやるわけでもないので、これでOKかと!ポイントは
- データサイズが大きくならないように
- ライフサイクルを考える
- 更新時のロック対象範囲が狭まるように
- データcreate 時に参照情報、集計情報を書きこむ
- 書込みが遅いため。逆に読込みは速い
- マスタデータの更新頻度や業務によって考える
BitNami Redmine Stack に TestLink を追加
環境
Windows Server 2008 SP2 (64bit)
BitNami Redmine Stack 1.3.0
今回追加したもの
PHP 5.3.10 (VC9 x86 Thread Safe) ※Microsoft 2008 C++ Runtime が別途必要です
TestLink 1.7.5 + TestLinkCnvMacro v571
手順概略
1. PHPインストール
参照… PHP本家 http://php.net/manual/ja/install.windows.apache2.php
ダウンロード … http://windows.php.net/download/
今回は C:/PHP/ にインストールしました。
注意点としては 「すべてのバックスラッシュは、前向きスラッシュに変換する」です
インストーラーのウィザードでhttpd.conf を指定するところがあって、この時に、下記項目が追加されます(httpd.conf 修正その1)。末尾に追加されるので嫌な人は適切な場所に移動しましょう。
#PHP を Apache 2.x ハンドラとして使う設定
LoadModule php5_module "c:/php/php5apache2.dll"
AddHandler application/x-httpd-php .php
PHPフォルダにある php5ts.dll を Windows の system32 フォルダにコピーします。
あとで使うフォルダを作成しておきます
C:/PHP/tmp
2. php.ini 修正
修正箇所の抜粋
default_port は $BITNAMI_ROOT/mysql/my.ini の port の値を参照します。
max_execution_time = 120
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension_dir = "C:/PHP/ext"
enable_dl = On[MySQL]
mysql.default_port = 3306
mysql.default_socket= "C:/Program Files/BitNami Redmine
Stack/mysql/tmp/mysql.sock"[Session]
session.save_path = "C:/PHP/tmp"
session.gc_maxlifetime = 2880[MySQLi] myphpadmin 用
mysqli.default_port = 3306
mysqli.default_socket= "C:\Program Files\BitNami Redmine
Stack/mysql/tmp/mysql.sock"
3. TestLink 1.7.5 本体解凍
apps フォルダの下に “testlink” フォルダを作成し、その下に “htdocs” と “conf” の2つのフォルダを作成します。
C:\Program Files\BitNami Redmine Stack\apps\testlink\htdocs
C:\Program Files\BitNami Redmine Stack\apps\testlink\conf
htdocs フォルダの下に testlink のファイルを全て置きます。
conf フォルダの下に testlink.conf ファイルを新規作成し、以下のように記述します。
Alias /testlink "C:/Program Files/BitNami Redmine Stack/apps/testlink/htdocs"
AllowOverride None
Options None
Order allow,deny
Allow from all
4. TestLinkCnvMacro v571 解凍・上書き
使わない場合は、ここの話はスルーしてください
testlink フォルダの基点をそろえて上書きします
5. httpd.conf 修正その2
Apache2 で php が動作するように、さらに追加
DirectoryIndex index.html index.php
httpd.conf の最後の方にある Include に追加
Include "C:/Program Files/BitNami Redmine Stack/apps/testlink/conf/testlink.conf"
6. サービス再起動
Goodbye Trac, Hello Redmine!
TracLightning3.1.1 から Redmine 1.3.0 へ引っ越した時のメモです。
Redmineを使いたいけど、今までのTracのデータがあるしなぁ、というかたの参考になれば幸いです。
年度末のサービスインを控えた、忙しいこの時期に何でこんなことをやったのか? の理由は→こちら
Redmine本体インストール・追加プラグインなど
Redmine本体
bitnami-redmine-*.*.*-*-windows-installerをbitnami公式サイトから入手、インストールしました。特に注意を要することもなく、すんなりインストールできました。
今回はWindows Servernにインストールしたので、Windows ファイアウォールにて下記プログラムの接続を許可しました。
ライブラリ FasterCSV
別でいれるredmine_importerで使うライブラリだそう。インストールできてるような、できてないような、ちょっと不安な感じです。
- モジュール取得 (今回は fastercsv-1.5.1.gem をチョイス)
- フォルダを作って
- インストール
- gem install fastercsv-1.5.1.gem --local
redmine_importer
CSV形式のチケットデータを取り込みます。Tracのチケットデータを移行する時に使いました。
チケットを大量登録する時にも使えそうです。(何度か試しましたが、更新は上手くいきませんでした・・・ ^^;;)
インストールはこちらを参考にさせていただきました
パーキングロットチャート
SVNリポジトリ作成、設定など
BitNami Redmine Stack には最初から Subversion が付いているので、インストールは不要です
(2) システム環境変数のPath登録
C:\Program Files\BitNami Redmine Stack\subversion\bin
(3) モジュールコピー
C:\Program Files\BitNami Redmine Stack\subversion\binの以下2つを 〜\apache2\modules へコピー
(4) モジュール有効化
@httpd.conf。サーバの『Administrator』ユーザじゃないと編集できませんでした。
(5) ロケーション定義を追加
@httpd.conf。合わせてActiveDirectoryの特定のグループのユーザーにのみアクセスを許可
- SVNPath: リポジトリへのフルパスをセット
- Require ldap-group: ActiveDirectoryの特定のグループのユーザーにのみアクセスを許可
- AuthzSVNAccessFile : アクセス制御の定義を行うファイルを指定します。
サンプルです
DAV svn SVNPath C:/repos/dev AuthType Basic AuthBasicProvider ldap AuthName "SVN Repo Authentication(dev)" AuthzLDAPAuthoritative off AuthLDAPURL "適宜" AuthLDAPBindDN 適宜 AuthLDAPBindPassword 適宜 AuthLDAPGroupAttribute member AuthLDAPGroupAttributeIsDN on Require ldap-group 適宜 Require valid-user AuthzSVNAccessFile C:/repos/AuthzSVNAccess_dev.conf
★AuthzSVNAccess_dev.confサンプル。※参考サイトはこちら
[groups] devmembers = yamakai,yamamoto [/] * = r [/trunk] hoge = rw @devmembers = rw
(7) 確認
"http://localhost/dev/"でブラウザからリビジョン0が見れることを確認する
データ移行 事前
データ移行 当日
(2) 過去チケット
- csvインポートプラグインを使いました。TracからエクスポートしたチケットデータをRedmine用に整形する時のポイントは以下のとおり
- 日付フォーマットは yyyy-mm-dd
- ユーザ名を設定するところは、名前でなくてRedmine上のユーザIDを使う
- チケットステータス文言を変更。closed → 終了、new → 新規 など
- 改行コードをLFで初期化。混ざりまくりでお手上げ状態だったので、改行コードを削除しました。
- 添付チケットについてはチケット移行完了後に、個別で貼り付け
Tracからチケットデータをエクスポートするときに使ったクエリのサンプル
SELECT p.value AS __color__, (CASE status WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;' ELSE (CASE owner WHEN '$USER' THEN 'font-weight: bold' END) END) AS __style__, id AS ticket, t.type AS 'tracker', summary AS 'title', status AS 'status', priority AS 'priority', owner AS '担当者', c6.value AS '開始日', c7.value AS '期日', description AS '_description', milestone AS '対象バージョン', reporter AS '登録者', time AS '登録日付', c10.value AS 'Rev', keywords AS 'Keywords', c1.value AS '検出日', c5.value AS '検出局面', c4.value AS '完了日', c3.value AS '確認者', c2.value AS '確認日', c11.value AS 'TestCases', c12.value AS 'TroubleReason', resolution FROM ticket t LEFT OUTER JOIN enum p ON p.name = t.priority AND p.type='priority' --修正リビジョン→Rev LEFT OUTER JOIN ticket_custom c10 ON (t.id = c10.ticket AND c10.name = 'rev') --テストケースNo→TestCases LEFT OUTER JOIN ticket_custom c11 ON (t.id = c11.ticket AND c11.name = 'testcase_id') --開始予定日→開始日 LEFT OUTER JOIN ticket_custom c6 ON (t.id = c6.ticket AND c6.name = 'due_assign') --完了予定日→期日 LEFT OUTER JOIN ticket_custom c7 ON (t.id = c7.ticket AND c7.name = 'due_close') --障害原因分類→TroubleReason LEFT OUTER JOIN ticket_custom c12 ON (t.id = c12.ticket AND c12.name = 'trouble_reason') --検出日 LEFT OUTER JOIN ticket_custom c1 ON (t.id = c1.ticket AND c1.name = 'detected_date') --検出局面 LEFT OUTER JOIN ticket_custom c5 ON (t.id = c5.ticket AND c5.name = 'detection_phaset') --完了日 LEFT OUTER JOIN ticket_custom c4 ON (t.id = c4.ticket AND c4.name = 'complete') --確認者 LEFT OUTER JOIN ticket_custom c3 ON (t.id = c3.ticket AND c3.name = 'close_checker') --確認日 LEFT OUTER JOIN ticket_custom c2 ON (t.id = c2.ticket AND c2.name = 'close_check_date') ORDER BY t.id
Tracからチケットのコメント履歴をエクスポートするときに使ったクエリのサンプル
select ticket, newvalue from ticket_change c where field = 'comment' and newvalue not like '' order by ticket, time
Tracから抜きしたデータをExcelのマクロを使ってRedmine用に整形し、出力します。項目値変換はlookup関数がお勧めです。
Option Explicit Sub WRITE_REDMINE_TICKET() Const cnsTITLE = "出力処理" Const cnsFILTER = "テキストファイル (*.csv;*.*),*.csv;*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFILENAME As String ' OPENするファイル名(フルパス) Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「名前を付けて保存」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "出力するファイル名を指定して下さい。" strFILENAME = xlAPP.GetSaveAsFilename(InitialFileName:="IKOU_TICKETS.csv", _ FileFilter:=cnsFILTER, Title:=cnsTITLE) ' キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す) GYOMAX = Cells.SpecialCells(xlCellTypeLastCell).Row Do While Cells(GYOMAX, 1).Value = "0" GYOMAX = GYOMAX - 1 Loop If GYOMAX < 2 Then xlAPP.StatusBar = False MsgBox "データを2行目から入力してから起動して下さい。", , cnsTITLE Exit Sub End If ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open strFILENAME For Output As #intFF ' 1行目から開始 GYO = 1 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' N列内容をレコードにセット(先頭は3行目) strREC = Cells(GYO, 1).Value & "," & _ Cells(GYO, 2).Value & "," & _ """" & Cells(GYO, 3).Value & """" & "," & _ Cells(GYO, 4).Value & "," & _ Cells(GYO, 5).Value & "," & _ Cells(GYO, 6).Value & "," & _ Replace(Cells(GYO, 7).Value, "/", "-") & "," & _ Replace(Cells(GYO, 8).Value, "/", "-") & "," & _ """" & Cells(GYO, 9).Value & """" & "," & _ Cells(GYO, 10).Value & "," & _ Cells(GYO, 11).Value & "," & _ Cells(GYO, 12).Value & "," & _ """" & Cells(GYO, 13).Value & """" & "," & _ """" & Cells(GYO, 14).Value & """" & "," & _ Replace(Cells(GYO, 15).Value, "/", "-") & "," & _ Cells(GYO, 16).Value & "," & _ Replace(Cells(GYO, 17).Value, "/", "-") & "," & _ Cells(GYO, 18).Value & "," & _ Replace(Cells(GYO, 19).Value, "/", "-") & "," & _ """" & Cells(GYO, 20).Value & """" & "," & _ """" & Cells(GYO, 21).Value & """" ' 改行をクリアして strREC = Replace(strREC, vbLf, "") strREC = Replace(strREC, vbCr, "") ' Redmine用に LFで改行 strREC = strREC & vbLf If strREC <> "" Then ' レコード件数カウンタの加算 lngREC = lngREC + 1 ' レコードを出力。セミコロンでCRLFの改行抑止 Print #intFF, strREC; End If '行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False MsgBox "ファイル出力が完了しました。" & vbCr & "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub
Project Tree Model
'Redmine project' tree model of this project has some characteristics. Like belows;
- 1st Layer: Root project
- Defines Target versions
- 2nd Layer: Development project
- Standard development project.
- Bug, Change Tracking
- Development team member's ToDo Tracking (ex. make a release build, Approve something, etc.)
- Links to development SVN repository (Common Source Codes, Default Configurations, Specification Documents, etc.)
- 3re Layer: Partner ISV project controls QA tickets about specifications.
- 2nd Layer: venders
- Has vender projcets
- 3rd Layer: Each verder project controls QA, Bug, RFC (core package improvement request) Tickets
- 2nd Layer: Group companies root
- Has Each major version roots
- 3rd Layer: Major version project has Release Tickets. A Release Ticket has links to each release ticket of this version's customer.
- 4th Layer: Each company project
- Control system Integration team's QA, ToDo Tickets
- Control service desk team's QA, Incident, RFC, Release, ToDo Tickets
- Develops some custom programs if common programs can't reply to a company's needs.
Table of contents
- Introduction
- Ticket model (Redmine tracker model)
- Ticket workflow
- Project Tree Model