へなちょこSEの考察

0x1E歳のへなちょこSEが、日々思うことを考察します。自社内、金融系を経て現在法人系PKG開発に従事。

Redmineのチケット番号を指定してソース差分を取る

Redmineのチケット番号を指定してソース差分を取る

ソースの差分を取るとき、Redmineのチケット番号を指定したいなと思ったので、バッチを作りました。
チェックアウトしたフォルダで実行して、チケット番号をカンマ区切りで複数指定したら勝手にその前後のソースをフォルダにエクスポートして、StepCounterを使って差分取ってくれます。
※コミットログコメントにチケット番号が書いてあることが前提です。
因みにこちらのStepcounterを利用しています。
マジで感謝です。

https://github.com/takezoe/stepcounter

あんまイケてないけど、とりあえず晒してみます。

ECHO OFF
cd %~dp0
ECHO #######################################
ECHO # 
ECHO # ソース差分取得用
ECHO # 新旧ファイル取得バッチ
ECHO # 
ECHO # リビジョンを指定して新旧ファイルの
ECHO # 取得を行えます。
ECHO # Copyright HAL 2016
ECHO # 
ECHO #######################################
REM 
REM 使い方
REM 
REM  チェックアウトしたSVNのフォルダにこのバッチファイルをコピーし、
REM  stepcounter-3.0.3-jar-with-dependencies.jarを同じ階層に置く。
REM  ダブルクリックで実行後、変更した際のリビジョンをカンマ区切りで入れると
REM  その変更前後の差分を取得してcount.xlsに出力する
REM 
ECHO.
ECHO.
ECHO 対象チケット番号を指定してください(カンマ区切り複数指定可)
SET /P TARGET_TICKET=対象チケット番号:
ECHO 出力フォーマットを指定してください(text、html、excel)
SET /P EXPORT_FORMAT=出力フォーマット:
if "%EXPORT_FORMAT%" == "excel" (
    SET EXPORT_TYPE=xls
) ELSE IF "%EXPORT_FORMAT%" == "html" (
    SET EXPORT_TYPE=html
) ELSE IF "%EXPORT_FORMAT%" == "text" (
    SET EXPORT_TYPE=txt
)
ECHO.
ECHO.
setlocal ENABLEDELAYEDEXPANSION
rd /s /q old
rd /s /q new
mkdir old
mkdir new
ECHO. >changes.list
ECHO. >changes.log
REM チケット番号の件数分繰り返し
FOR %%i IN (%TARGET_TICKET%) DO (
    svn log --search "refs #"%%i | find "|" > ticket.lst
    ECHO ****対象リビジョン(#%%i)****
    FOR /F "tokens=1,2,3,4* delims=|" %%a IN (ticket.lst) DO (
        
        REM リビジョンの逆順を保持
        SET REV_TEMP= %%a
        ECHO !REV_TEMP:r=!
        SET TARGET_REV=!REV_TEMP:r=!,!TARGET_REV!
    )
    ECHO ****変更後ファイル取得(#%%i)****
    FOR %%a IN (%TARGET_REV%) DO (
        
        REM リビジョンの逆順を保持
        SET /A REV_TEMP= %%a
        SET REV_LIST=!REV_TEMP!,!REV_LIST!

        REM 新しい方のファイルをExport
        svn log -r %%a >>changes.log
        echo LIST >> changes.log
        FOR /F "usebackq tokens=1,2" %%t IN (`svn diff -c%%a --summarize`) DO (
         echo %%u >> changes.log
         mkdir new\%%~pu
         svn export -r %%a --force %%u %~dp0\new\%%~pu%%~nxu
        )
    )
    REM リビジョンの新しい順にリストを作成
    FOR %%a IN (%REV_LIST%) DO (
        SET /A REV_TEMP= %%a - 1
        SET REV_LIST=!REV_TEMP!,!REV_LIST!

        FOR /F "usebackq tokens=1,2" %%t IN (`svn diff -c%%a --summarize`) DO (
         echo !REV_TEMP!,%%~pu%%~nxu >> changes.list
         mkdir old\%%~pu
        )
    )
    ECHO ****変更前ファイル取得(#%%i)****
    REM リストを元にEXPORT
    FOR /F "skip=1 tokens=1,2* delims=," %%a IN (changes.list) DO (
        svn export -r %%a --force %%b %~dp0\old\%%b
    )
    ECHO ****出力が完了しました(#%%i)****
    ECHO ****差分出力(#%%i)****
    java -cp stepcounter-3.0.3-jar-with-dependencies.jar jp.sf.amateras.stepcounter.diffcount.Main -format=%EXPORT_FORMAT% -output=%%i.%EXPORT_TYPE% new old
    ECHO ****差分取得が完了しました(#%%i)****
    )
ECHO.
ECHO.
pause

Oracleの分析関数とWITH句を同時に使えない

Oracleで分析関数(Rank)とWith句を同時に使用しようとしたら、
SELECTを実行するだけで
「ソケットから読み込むデータはこれ以上ありません。」
とか言われて接続が切れてしまった。

ググってみてもあまり情報が出てこないし、なんなんだ・・・。
とりあえず、分析関数とWITH句が相性が良くないのではないかと思うので、
使わずに済む方法を考えます。

何かご存知でしたら教えて下さい。

iPhoneの「iPhoneのロック解除パスコードを○分以内に変更してください」問題

今日、突如としてiPhoneにこんなメッセージが。
iPhoneのロック解除パスコードを60分以内に変更してください」

何この怪しさバツグンのメッセージ。
即座にネットで調べてみると、どうにも対処法が出てない。
参考にしたのはここ

http://unsolublesugar.com/20160508/213844/

読んでみたけど、結局これを書いた人も原因は不明だったらしい。
でもなんか「MDM」がどうとか書かれてて、あれこれはもしやと思って、思い当たるところをいじってみた。

直った。

会社でiPhoneアプリの開発をしていて、開発用のプロファイルを自分のiPhoneにも入れてました。
なんかそれが怪しいなと思ったので、削除してみると、以後メッセージは表示されなくなりました。
なんでそれで直るのかは不明だけど、とりあえず直ったから良いか。
プロファイルなんか入れてねーよって方はまた別の原因なのでしょう・・・。

iBatisのDynamicタグを使う際の注意点

iBatisのDynamicタグを使う際の注意点

iBatisなんて使ってる人いないかもですし、
MyBatisもそうなのか知りませんが、
今日つまずいたのでメモ。

isNotEmptyのprependを使った

WHERE句の直後に来るかもしれないところで、
必要だったのでprependを使いました。

SELECT a,b,c from sagyoTable
<Dynamic prepend="WHERE">
  <isNotEmpty prepend="AND" property="ymdFrom">
    sagyoYmd >= #ymdFrom#
  </isNotEmpty>
  <isNotEmpty prepend="AND" property="ymdTo">
    sagyoYmd <= #ymdTo#
  </isNotEmpty>
</Dynamic>

まぁ、よくある使い方だと思います。
これで実行すると、WHEREはつくけど何故かANDが付かない。
書き方が悪いのかと思っていろいろ書き換えてみましたが、それでもうまくいかない。
なぜだ、なぜなんだ・・・・。

おや、他のとこでも同じプロパティを使ってるぞ・・・

よくよく見ると、同じプロパティを別のとこでも使ってる。
それも、使い方が違う。
具体的には、こんな感じ。

 SELECT a,b,c from sagyoTable WHERE A = B
  <isNotEmpty property="ymdFrom">
    AND sagyoYmd >= #ymdFrom#
  </isNotEmpty>
  <isNotEmpty property="ymdTo">
    AND sagyoYmd <= #ymdTo#
  </isNotEmpty>
  ~~~

まさか、これに引きずられているのではあるまいか・・・。
そんなまさかと思いつつ、別の場所の書き方を変える。

 SELECT a,b,c from sagyoTable WHERE A = B
  <isNotEmpty prepend="AND" property="ymdFrom">
    sagyoYmd >= #ymdFrom#
  </isNotEmpty>
  <isNotEmpty prepend="AND" property="ymdTo">
    sagyoYmd <= #ymdTo#
  </isNotEmpty>
  ~~~

動いた・・・

結論としては、同じプロパティを見るタグは同一のPrependを指定しておかないと、
別の場所の記述に引っ張られる可能性があるらしい。
ただ、どんなときに引っ張られるのかまでは検証できてない。
そもそも、iBatisなんてもう使うなよ的な話かもしれませんが・・・。

「アジャイル開発とスクラム」を読んで

アジャイル開発とスクラム」という本を読みました。


アジャイル開発とスクラム 顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント

アジャイル開発とスクラム 顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント


アジャイル開発にはちょっと前から興味を持っていて、できるところから、CI(継続的インテグレーション)やBTS(バグ・トラッキング・システム)を導入して下地を作り、そろそろ本格的に始めてみたいなと思っていたところでした。
その中でも特にスクラムに興味を持っていたのですが、いかんせん経験がないのでちょっとビビっていたところで、この本に出会いました。


書いている内容は、スクラムの基本的な紹介と、それを実践した日本の事例とインタビューが中心。
何より良かったのは、日本の事例で、日本特有の問題に直面しながら解決していった先人たちの、「想い」が書かれていたこと。
技術的なことや、対策的なことも重要なんですが、それより何より、「なぜそうまでしてアジャイルを取り入れたのか」を読めたことで、自分の中でも想いが強くなっていきました。


やらなきゃいけないことも、課題もたくさんありますが、ちょっとモチベーションは上がりました。
システム開発に携わっている人なら、とりあえず読んでみて損はない一冊だと思います。

要件定義についての幻想

仕事の話。

最近お客さんのところに行っていて思うことは、要件定義で用件が固められるなんて幻想は抱いてはいけないということ。
これはやり方の問題ではなく、「不可能」だと認識する必要がある。
8割も決められれば御の字、実際には6〜7割程度しか決めることなんて出来ない。

決めることが出来ないのだから、変わる可能性があると認識しておかなければならない。
それは当然リスクな訳だけど、決まったと決めつけて進めるよりは百倍良い。

しかしそうなると、お金をどうするかと言うことになる。
お客さんとは、要件定義の段階で出てきた分のお金しか見積もってない。
でも、追加機能のために追加料金が必要。
当然、追加で支払ってもらうべきだが、なかなかうんと言ってくれないお客さんもいる。

あとは、要件として上がってはいたけど、細かい仕様で追加が必要になってしまった場合。
これはさらに請求しづらい。
向こうが言ってないとも言えるけど、こちらが聞き漏れてるとも言える。
業務のプロは向こうだが、システムのプロはこちら。
どちらのせいとも言い難い。

結局どれも、要件定義で要件が確定できないリスク分を見積もりに見込んでなくて、追加はその都度ってことをなぁなぁに進めると問題になりやすい気がする。
さらに言うなら、そもそも要件定義で確定した分を見積もって作るって形が難しくて、何か確定可能なものをベースに要件やシステムの開発範囲を柔軟にする方が良いのではないだろうか。

たとえば、上限金額を決めてしまって、その中で出来ることしかやらないとか、毎月の金額を決めて、毎月一定量の開発を行うとか(納品のない受託開発として最近有名かな)。
なんにせよ、複雑化してるシステム開発において、ウォーターフォール型の開発はいろいろと無理がありすぎる。
同時に、ウォーターフォール型の受注(という表現が適切かはわからないが)も無理があるので、違う契約の仕方、開発の進め方を考えなければならないのではないか。

それが、今の会社にいて出来るかどうかは、また別の話だけど。

就職活動の問題点

就職活動は、インターネットの登場で大きく様変わりしました。
就職情報サイトに登録し、気になる企業にエントリーし、履歴書を送ったりWEBテストを受けていく。
面接を受けていくスタイルは変わらないと思いますが、それを同時に何社もこなしていくという形は昔は考えられないことでした。


インターネットの登場によるメリットは、とにかく多くの情報を得ることができるようになったこと。
十数年前では知り得なかった企業と出会うことができ、自分の可能性を広げることができるようになったと言えるでしょう。
また企業の側も、広く全国から人を集めることが容易になったため、より優れた人材が集まる可能性を高めることができます。


ただ、逆に情報が増えたことによって、問題点も多くなりました。
簡単に情報が手に入ることによって、情報の取捨選択をこれまで以上にしなければならなくなりました。
たくさんエントリーできることによって、たくさん選考を受けなければならなくなりました。
企業側もたくさん呼べることによって、選ぶ手間が増えました。
競合する企業の数も増えたため、簡単には入社してくれなくなりました。


なにより最大の問題は、無駄が多くなりました。


100社のエントリーは当たり前、ということは、100社分のエントリーシートを書く時間が無駄です。
そのうち面接を何社受けるのかは分かりませんが、入らない会社の面接は極端に言えば無駄です。
企業側も、受からない人に対する面接などの時間を作ることは無駄です。
内定出しても辞退されてしまったらそれも当然無駄。


とうぜん、必要な無駄もあります。
何社か受けるのは、保険のために必要だったり、落とす前提でも何人か選考するのは、よりよい人材を集める上で重要です。
ただ、それが度を過ぎてしまっていないでしょうか。


就職活動の理想は、企業と学生が一対一でマッチすること。
現実には多少のロスは発生するでしょうが、その形を目指していく方が、企業にも学生にもいいのだろうと思います。
そういう意味では、いい意味での「コネ入社」というのをやった方がいいのかも。
または転職市場と同じように、新卒採用の現場でもエージェント的な人が学生を吟味して、企業はそのエージェントを信用して採用を行うとか。
そういう形を取った方が、お互いの無駄を省けて生産的な気がします。


学業に力を入れさせるために就職活動の時期を変えるのではなくて、そもそも就活のやり方を変えて行くべきなのでは、と思う今日この頃です。