QLOOKアクセス解析
ホーム   »  
 | 

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

db:migrete_pluginsしてもテーブルが生成されなくなった時の対処方法

プラグイン開発時にdb:migrete_pluginsしても
テーブルが生成されない現象が発生。

原因は、schema_migrations テーブルの情報と
実際の情報に不整合が出てしまっていたのが原因でした。

schema_migrations テーブルでマイグレーションの管理をしてるのですが
手動で色々消したり追加したりしていたのでバージョン不整合が起きてしまい
正常に認識されなかったようです。(昔はschema_infoという名前だったらしい)

select version from schema_migrations where version like '%pluginname%';
でデータを確認

delete * from schema_migrations where version like '%pluginname%';
でデータを一律削除

でdb:migrete_pluginsが正常に動作するようになりました。

Redmineを半年使ってみた振り返り

Redmineをプロジェクトに導入して半年が経ったので振り返り。
基本的には良いツールだと思います。

当たり前ですがツールはツールなので後は使う側の問題です。
今後はより活用していくために自分のマネジメントにあった
プラグインを作成していこうと思います。

◆プロジェクト概要
・規模は10-15人程度
・業務内容は通常のウォーターフォール型の開発に加えて
 突発的な割り込み作業のハイブリッド。
 割り込み作業は市場での問題点の対応や、新たな要求の見積りや対応など。

◆目的
・通常のWF型の開発業務については細かな計画もあり、各種数値管理もかなり
 細かく管理する仕組みがあり不自由はなかったが、割り込み作業については
 管理が出来ておらず、見える化が出来ていなかったので見える化がしたかった。
 ⇒なので今回は割り込み部分だけをRedmineで管理した。

・開発に関連する情報が色々なサーバなどに散らばっており過去のナレッジが
 体系的の残っていかない、開発中に必要な情報も探しにくく非効率という面があったので
 RedmineのWiki/文書管理を利用して情報共有の効率化を行いたい。

・トレーサビリティの向上
 通常の開発作業については管理する仕組みがあり特に課題は無かった。 
 ただ、突発的に発生する顧客の問い合わせや、市場で発生した問題の対応については
 メールだけでしか情報が残っていないという状況が多く、
 後に対応の経緯や工数などの問い合わせがあった場合、すぐに対応が難しかった。
 Redmineのチケットに情報を残しておくことでそれらを解決したかった。

◆運用する時に気を付けた方がよいこと
・チケットは小さい単位の方が良い。開発にリズムがでる。
 メンバが毎日チケットを確認するぐらいの周期の方が良い。
・メール通知機能は便利だけど現場の環境で使うのは
 いつも色々面倒だった。
 セキュリティとか色々あるので。
・チケットの棚卸をやる。
 週1回ぐらいはだれかがやった方が良い。
・カテゴリ設計は最初にある程度きっちり決めておいた方が良い


◆良かった点
・割り込み作業の作業管理については見える化が進み
 各自の残作業が分かりやすくなった。
 工数についてもチケットでの集計が出来るようになった。
 ただ、通常作業と割り込み系の作業で2つ管理となっている面はやはり
 やりにくい面があり、今後はRedmineで一元管理をしていきたい。

・自分のチームは複数のプロジェクトの作業を受け持っているので
 それぞれの運用ルールや開発環境などまとめていった。
 いままではメールや色んなサーバに開発に関する情報が散乱していたのが
 「ここを見れば良い」という感じになったのは良かった点。

・チケットに各種情報や経緯を記載することで
 トレーサビリティは向上した。
 その作業に関連する情報はチケットに集約されるので
 メンバのスイッチする時ときも楽になった。
 メールの場合、色々情報をサルベージする時間が必要だったので。

・Excel管理よりもメンバが楽しそうだった
 やっぱりこの業界で働いているだけあって新しい事をやると楽しい雰囲気がでた。
 Excelでタスクがいっぱりあるとげんなりするけど、
 チケットだとやる気が出たりする。
 チケットをいっぱい消化すると、メンバの貢献度が見える形になるのも良いと思います。

◆悪かった・微妙だった点
・最初の計画化はやっぱりMSProjectが優位。
 最初の計画Fixまでは日々状況が変化するため、
 日程の入れ替えや担当者の変更、追加作業など追加などが頻発する。
 そうなるとRedmineでは厳しい。
 MSProjectだとeasyです。特にリソース配分状況が一目で分かるのと、
 マウス操作で作業入れ替えが出来るのは便利です。
 最初はMSProject、Fix後はRedmineで管理という運用にしてました。

・Wiki
 貧弱。また文書を書くには若干慣れが必要。

・工数メトリクス集計
 デフォルト機能では大まかな集計は可能だが
 細かな単位で管理したい場合はカテゴリ設計などをきっちりしたりする必要あり。
 またそれでDB上は集計できる値が残るが、簡単に集計出来る仕組みがないので
 報告資料を作る際にはひと手間必要。



redmineでEVMプラグイン作成(1)

Redmineを仕事で使い始めて半年程度経ちます。とても便利だと感じていますが
集計機能についてはやはりもう少し強化してほしいと思っています。
特にEVM(アーンド・バリュー・マネジメント)のグラフについては個人的にはどうしても欲しい!
ということでEVMプラグイン作成に着手したいと思います。

とはいえ、本業はJava/C++なのでRuby/Railsは初心者です。
日曜プログラマで頑張るので作成完了はまだまだ先になりそうです。。
とりあえずメモしていきます。

◆各種値の定義
以下でグラフを作成する。
・PV (Planned Value)
 ⇒チケットの予定工数。完了予定日に100%計上する。

・EV (Earned Value)
 ⇒チケットの予定工数×進捗率

・AC (Actual Cost)
 ⇒チケットの実績工数


◆データの取得方法についての考察
・PV
 ⇒完了予定日に100%計上するのであれば issues テーブルから簡単に取得可能。

・EV
 ⇒データ集計日のスナップショットだけ欲しいのであれば簡単。
  issues テーブルから取得するだけ。
  但しEVMのグラフを作成するには推移情報が必要。
  Redmineでは進捗率の履歴情報は保持していないので新規にテーブルを作成して保持するようにする。
  この際以下の点に留意すること。
  ・見積り工数が変わった場合にEV値も変わるように考慮する
  ・進捗率については後から日付を指定して変更可能すること
   例えば本当は先週に50%完了してたけど入力忘れてた時とかに対応出来るように。

・AC
 ⇒time_entries テーブルで保持されているので集計すれば良いだけ。


◆グラフ描画
gruffを採用。
Flash系ライブラリはカッコが良くて機能も豊富なんですが
週報とかに張り付ける時とかにpngとかの方がうれしかったりする場面が多そうなので。

CentOS6.2でgdb

CentOSでgdbを使おうと思った時に色々戸惑ったのでメモ。

まず使おうとすると以下のようなエラーが発生。

use: debuginfo-install glibc-2.12-1.47.el6_2.5.x86_64 ・・・

debuginfoが無いようなのでインストールするようにとのこと。
debuginfo-install コマンドを使ってインストールします。

ただ、言われたとおりdebuginfo-installコマンドを利用すると
「No debuginfo packages available to install」といったエラーが発生してしまうので

以下のように回避してインストール。
debuginfo-install --nogpgcheck --enablerepo debug glibc-2.12-1.47.el6_2.5.x86_64


nogpgcheck は普段使わないリポジトリを有効にするオプションです。
/etc/yum.repos.d/*.repo に記載されている無効("enabled=0")のリポジトリ を一回限り有効にします。
ここでは具体的には
/etc/yum.repos.d/CentOS-Debuginfo.repo
の debug セクションを一時的に有効にしています。

nogpgcheck はgpg署名の検査を無効にして実行するオプションです。






emacsの設定メモ

emacs23.1.1 の設定メモ。

emacs23では設定ファイルは以下が推奨。
/home/$USER/.emacs.d/init.el

emacsを再起動せずに反映するには以下のコマンドを実行
M-x eval-buffer


◆各種el
・anthy-el
yum install anthy-el
・tabbar
 以下より入手。
http://sourceforge.net/projects/emhacks/files/tabbar/

◆Windowsでの設定
環境変数 HOME を作成してemacsのフォルダを指定する。

◆参考ページ
おすすめEmacs設定 - ククログ(2011-02-16)
Emacs23 (Cocoa Emacs) 入門から中毒まで : 紹介マニア

◆init.elの内容

;;ロードパスの指定
(setq load-path (cons "~/.emacs.d/" load-path))
(add-to-list 'load-path "~/.emacs.d/site-lisp")

;;カラーテーマの設定
;(require 'color-theme)
;(color-theme-initialize)
;(color-theme-classic)

; 日本語環境を指定
(set-language-environment 'Japanese)

; anthy.el をロードする。
(load-library "anthy")
; japanese-anthy をデフォルトの input-method にする。
(setq default-input-method "japanese-anthy")

; 出来れば utf-8 を使う
(prefer-coding-system 'utf-8)

;;; 初期フレームの設定
(setq initial-frame-alist
(append
'((top . 22) ; フレームの Y 位置(ピクセル数)
(left . 300) ; フレームの X 位置(ピクセル数)
(width . 100) ; フレーム幅(文字数)
(height . 50)) ; フレーム高(文字数)
initial-frame-alist))

; キーバインドのカスタマイズ
;(define-key global-map (kbd "C-h") 'delete-backward-char) ; 削除
;(define-key global-map (kbd "M-?") 'help-for-help) ; ヘルプ
(define-key global-map (kbd "C-c i") 'indent-region) ; インデント
(define-key global-map (kbd "C-c C-i") 'hippie-expand) ; 補完
(define-key global-map (kbd "C-c ;") 'comment-dwim) ; コメントアウト
(define-key global-map (kbd "C-o") 'toggle-input-method) ; 日本語入力切替
(define-key global-map (kbd "C-[ M-C-g") 'goto-line) ; 指定行へ移動

;;; 対応する括弧を光らせる。
(show-paren-mode 1)

;;; ウィンドウ内に収まらないときだけ括弧内も光らせる。
(setq show-paren-style 'mixed)

;;; 行末の空白を表示
(setq-default show-trailing-whitespace t)

;;; カーソルの位置が何文字目かを表示する
(column-number-mode t)

;;; カーソルの位置が何行目かを表示する
(line-number-mode t)

;;; 終了時にオートセーブファイルを消す
(setq delete-auto-save-files t)

;;; カーソルの点滅を止める
(blink-cursor-mode 0)

;;; スクロールバーを右側に表示する
(set-scroll-bar-mode 'right)

;;; タイトルバーにファイル名を表示する
(setq frame-title-format (format "emacs@%s : %%f" (system-name)))

;;; 現在の関数名をモードラインに表示
(which-function-mode 1)

;;; 同名のファイルを開いた場合、バッファに表示するファイル名にディレクトリ名を付与する。
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

;;;バッファのタブ表示
(require 'cl)
(require 'tabbar)

(setq tabbar-buffer-groups-function
(lambda (b) (list "All Buffers")))
(setq tabbar-buffer-list-function
(lambda ()
(remove-if
(lambda(buffer)
(unless (string= (buffer-name buffer) "*scratch*")
(find (aref (buffer-name buffer) 0) " *"))
)
(buffer-list))))
(tabbar-mode)

(setq tabbar-home-button-enabled "")
(setq tabbar-scroll-right-button-enabled "")
(setq tabbar-scroll-left-button-enabled "")
(setq tabbar-scroll-right-button-disabled "")
(setq tabbar-scroll-left-button-disabled "")

(dolist (func '(tabbar-mode tabbar-forward-tab tabbar-forward-group tabbar-backward-tab tabbar-backward-group))
(autoload func "tabbar" "Tabs at the top of buffers and easy control-tab navigation"))
(defmacro defun-prefix-alt (name on-no-prefix on-prefix &optional do-always)
`(defun ,name (arg)
(interactive "P")
,do-always
(if (equal nil arg)
,on-no-prefix
,on-prefix)))
(defun-prefix-alt shk-tabbar-next (tabbar-forward-tab) (tabbar-forward-group) (tabbar-mode 1))
(defun-prefix-alt shk-tabbar-prev (tabbar-backward-tab) (tabbar-backward-group) (tabbar-mode 1))

;TABでバッファ切り替え
(global-set-key [(control tab)] 'tabbar-forward)
(global-set-key [(control shift iso-lefttab)] 'tabbar-backward)

(set-face-attribute 'tabbar-default-face nil :background "gray60")
(set-face-attribute 'tabbar-unselected-face nil :background "gray85" :foreground "gray30" :box nil)
(set-face-attribute 'tabbar-selected-face nil :background "#f2f2f6" :foreground "red" :box nil)
(set-face-attribute 'tabbar-button-face nil :box '(:line-width 1 :color "gray72" :style released-button))
(set-face-attribute 'tabbar-separator-face nil :height 0.5)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。