まほろば技術パーク

@komeshogun's InfoTech MEMO

SvnAntとAntでチェックアウトからコンパイルまで自動化する

やりたかったことは
SVNからチェックアウト
・自動でコンパイル
とめっちゃ単純なことをやりたい。

Jenkisでやろうかなと思ったけど、訳ありインストールせずに
出来る必要があったので、Antで出来ないかなと調べた結果を残しときます。

①Antってなんぞい?

1. Antの基礎 | TECHSCORE(テックスコア)

http://www.techscore.com/tech/Java/ApacheJakarta/Ant/1/

これを小一時間読んで理解できました。

ビルドファイルの書き方を理解すれば十分。

 

Eclipseから自動作成して、整形。

ファイル -> エクスポート -> 一般 -> Antビルド・ファイルで
さくっと出来ます。

 

クラウドサービスプラットフォーム Cosminexus:Antのbuild.xmlEclipseから自動生成するには?:ソフトウェア:日立
http://www.hitachi.co.jp/Prod/comp/soft1/cosminexus/useful/tips/091204_eclipse-create-buildxml.html

 

ぱっと見、難しそうなファイルが出来てきますが、①で理解しておけば簡単に読めます。

ざっくり言うとtargetタグのname=buildがデフォルトでは、最初に呼び出されるやつです。そのbuildに書かれているdepends=なんちゃらのなんちゃらが先行タスクとなり、buildの中身が実行される前になんちゃらが実行されます。なんちゃらにさらにdepends=なんちゃらなんちゃらが書いてあると、なんちゃらなんちゃら→なんちゃら→buildと順番に呼び出されることになります。これさえ理解しておけばbuild.xmlの実行順は理解できるでしょう。

あとはタスクの書き方を押さえればいいだけなので、簡単です。

 

③Javacタスクを理解しておく。

Javacタスク
http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/CoreTasks/javac.html


④ant実行

antを環境変数設定せずとも、antのbinにcdしてコマンドプロンプトから
antって打ったら実行できる。でも、実行するとこんなエラーが出てしまった。

 

システム・リソースが不足しています。
詳細は次のスタック・トレースを調査してください。

[javac] java.lang.StackOverflowError
[javac] at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:384)
[javac] at com.sun.tools.javac.comp.Attr.visitBinary(Attr.java:1618)

 

ぐぐってみても英語ばかり。

 

build failed java.lang.StackOverflowError | Oracle Community
https://community.oracle.com/thread/1520514

 

java - Ant's <javac> tasks throws StackOverflowException - Stack Overflow
http://stackoverflow.com/questions/16935/ants-javac-tasks-throws-stackoverflowexception

 

Ant「javacタスク」メモ(Hishidama's ant-javac Memo)
http://www.ne.jp/asahi/hishidama/home/tech/ant/tag/javac.html

 

Compile problems using ant and Java 1.7 - Stack Overflow
http://stackoverflow.com/questions/11529000/compile-problems-using-ant-and-java-1-7

 

翻訳しながらなんとか解読。
javacのとこに"-J-Xss10M"を足したら上手いこと行った。

<javac debug="true"
srcdir="gen"
destdir="gen-bin"
fork="yes">
<compilerarg value="-J-Xss10M" />
</javac 

 

Svnからチェックアウトのところは「SvnAnt」を使う

とりあえず公式からダウンロードして、解凍して
antのbinにsvnantのbinの中身をコピーして置いたらOK。
これでbuild.xmlsvnタスクをかける準備が出来た

 

subclipse:
http://subclipse.tigris.org/svnant.html

 

build.xmlsvnの宣言を書き足す。

<!-- Sub-Ant -->
<path id="lib-svnant">
<fileset dir="${ant.dir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="lib-svnant" />
<svnsetting id="svn.setting"
javahl="false"
svnkit="true"
username="${svn.user}" password="${svn.passwd}" />

${svn.user}とか${svn.passwd}はプロパティで宣言しておく。

 

⑦ant実行したらエラーが出た

missing svnkit dependencies on the classpath using svnant

ってエラーが出て、ぐぐっても英語ばかり。

 

svn - missing svnkit dependencies on the classpath using svnant - Stack Overflow
http://stackoverflow.com/questions/10721104/missing-svnkit-dependencies-on-the-classpath-using-svnant

 

Missing 'javahl' dependencies on the classpath ! | code up
http://frmmpgit.blog.fc2.com/blog-entry-78.html

 

翻訳しながら試行錯誤した

<svn refid="svn.setting">って宣言したらうまいこといった。
※上の"svn.setting"が前提。
javahl="false"
svnkit="true"がポイントなのかな。

⑧ここまで出来たらantで上手いこといく

・プロパティで宣言して
・cleanでdeleteして
・initでmkdirして
・checkoutでcheckoutして
・buildでjavacする

 

これでAnt実行するだけで
やりたいことが出来るようになりました。

 

Mavenやったり、Jenkinsやったりが流行っているけど
古典的なやり方でも十分やね。
古典的なやり方と思ってたけど、英語サイトしかひっかからなかったのはなんでだろう。あんまりこんなしょぼいことにならないのかな^^;

誰かの参考になればコレ幸い。

 

SharePointを調べてみた

 

とりあえずググってみてお勉強。

SharePointってなに???

グループウェアってのは知っているけど、なにが美味しいの?レベルから。

 

ascii.jp

1,2,4を読んだ。

パッケージ導入ってしたことないからよく分からんけど、アドオン開発は辞めておけってことね。アドオンはスクラッチ的に開発する、設定でごちょごちょするのはアドオンってより「カスタマイズ」って言葉のほうがしっくり来るんです。

codezine.jp

脱線して、office365も調べてみる。

 

codezine.jp

office365のなかにSharePointがあるのか??

ライセンスのE1とE3,E4の違いってなに??

 

モヤモヤ感が残ります。

 

2.19日経コンピュータ

日経コンピュータ読んだメモ

 

SQLインジェクション対策もれの責任を開発会社に問う判決 | 徳丸浩の日記

 

IPAで言ってるでしょっていうのが理由か、常識でしょっていうのが理由かよく分かりませんが、要件に明記してなかったのに受注側が完敗なのが驚いた。

 

地銀を狙え〜金融機関向けIT化がピークに、大手各社入り乱れてのデットヒート

 

あんまり金融分からんのですが、そんなことになっているんですねと勉強になった。

 

動かないコンピュータのNTTデータ関西の書類発行トラブルもヒト事じゃないので、勉強になった。同時実行数と平成”元年”ね。

 

count(*)とcount(列名)の違い

この本読んで、学んだこと 


SELECT COUNT(*) と SELECT COUNT(<列名>) との違い ( ソフトウェア ) - 仕事で使うVBA - Yahoo!ブログ

 

count(*)ってやったら遅くなるからcount(1)ってやってね。って本当かどうか分からない話も聞いたことあるけど、count(列名)ってあまり意識してなかったなあ。

 

意図してcount(列名)とか組まれていても、スルーしてしまいそうだなと思った。それならちゃんとwhere句で is not null指定してあげたほうが頭には優しいよね。

 

count(列名)しか満たせない時ってあるのかな?

 

改訂新版 反復学習ソフト付き SQL書き方ドリル (WEB+DB PRESS plusシリーズ)

改訂新版 反復学習ソフト付き SQL書き方ドリル (WEB+DB PRESS plusシリーズ)

 

 

Eclipse3.6完全攻略を読んで

 

オカレンス検索の種類

 
検索 -> ファイル内の出現箇所 で進んでいくといろんな種類の検索が出来る事を知った。
識別子、例外のスロー、メソッドの実装、メソッド出口、break/continueターゲット
 
ちなみに「オカレンス検索」でぐぐってみたら昔のエントリが出て来た(笑)
 

出現箇所のマーク

 
たまにソース上にカーソル置いても色変わらない時がありますが、その時は
メニュー上の「出現箇所のマークのトグル」アイコンをONにすればいいんですね。
 

キーアシスト

ヘルプ -> キーアシスト(Ctrl+Shift+L)
 
ショートカットは生産性向上の常套手段ですね。
 


Eclipseショートカットキーまとめ - wyukawa’s blog

ブレークポイントの種類

行、メソッド、フィールド、例外、クラスロード
対象の行の左端の枠の所をダブルクリックしてしか使ったことがなかったので、いろんな種類のブレークポイントがあることを知らなかった。いろんな条件でブレークポイントを付けられることも最近知ったし、ブレークポイントビューはなかなか奥が深いのかもしれないですね。あまり有益な情報も見つけられなかったし。
 

アウトラインビューからの設定 

 
Java要素を右クリック -> 監視ポイントの切替
コンソールに出力された例外の表示からもブレークポイントを追加できる
 

フレームにドロップ

 
メソッドの先頭からステップ実行をやり直す。ステップが行き過ぎてしまった時に戻ったり、メソッド内のロジックの修正と実行を繰り返す場合に便利。
 
デバッグビューの「フレームにドロップ」アイコンを押すことで利用可能。
 
これは知らんかったなぁ。ちょっとどんな動きするか調べてみよう。
 
最後に、最近徹底してる設定の紹介。
 
 
Eclipse 3.6 完全攻略

Eclipse 3.6 完全攻略

 

 

 

指定されたフォルダ内の特定拡張子のファイルを検索するWindowsバッチ

■概要
特定のディレクトリに特定の拡張子のファイルが存在するかチェックする。

■小ネタ
①同一処理を呼び出す場合はサブルーチンを利用する

CALL :CHECK_FILE %CHECK_DIR\dir1\
CALL :CHECK_FILE %CHECK_DIR\dir2\
CALL :CHECK_FILE %CHECK_DIR\dir3\

※サブルーチンを呼び出す時に引数も使える。

:CHECK_FILE
CD /D %1

②サブディレクトリも検索対象とする場合は「/s」オプションをつける。

FOR /f "delims=;" %%I IN ('dir /b /on /s *.txt') DO (

③削除確認が必要な場合は「/Q」オプションをつける。

DEL /Q %%I

④現在実行中のバッチ・スクリプトを終了する

EXIT /B


■サンプルプログラム

@ECHO OFF

SET CHECK_DIR=C:TEMP\

ECHO 配下にロックファイルが作成されているかチェックを行います。
ECHO チェック対象ディレクトリ:%CHECK_DIR%

SET /P CHECK_FLG="ディレクトリが正しいか確認してください。続行しますか?(Y):"

IF /I NOT "%CHECK_FLG%"=="Y" GOTO :END

REM 対象ファイルが増えた場合は追加する

REM exec.txt
CALL :CHECK_FILE %CHECK_DIR\dir1\
CALL :CHECK_FILE %CHECK_DIR\dir2\
CALL :CHECK_FILE %CHECK_DIR\dir3\

PAUSE

EXIT

REM フォルダに配下にロックファイルが存在するかチェックする。
:CHECK_FILE

CD /D %1

SET EXEC_FLG=
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /f "delims=;" %%I IN ('dir /b /on /s *.txt') DO (
  ECHO ============================================
  ECHO %%I
  SET /P EXEC_FLG="削除しますか?(Y):"

  IF /I "!EXEC_FLG!"=="Y" (
   DEL /Q %%I
   ECHO %%Iを削除しました。
 )
)
ENDLOCAL

EXIT /B

:END

EXIT

FOR文内でユーザ応答に応じて処理を実行するwindowsバッチ

■概要
BATファイルが配置されているディレクトリに存在するSQLファイルをファイル名の昇順ですべて実行する。

■課題
FOR文内でユーザ応答を行い、実行確認する箇所で詰まった。
なぜかIF文内に入らずに、EXEC_FLGが空文字になってしまった。

SETLOCAL ENABLEDELAYEDEXPANSION
SET /P EXEC_FLG="続行しますか?(Y):"
  IF /I "!EXEC_FLG!"=="Y" ()

■解決方法
WindowsバッチではFOR文やIF文に入る前に変数が展開されるらしく
FOR文に入る前にSETしとかないといけない。

REM 遅延環境変数の展開オプション
SETLOCAL ENABLEDELAYEDEXPANSION

さらに以下のようにしておかないとFOR文内でインクリメントしたのが
使えず0のままとなっていた。

ENDLOCAL && SET CNT=%CNT% && SET FILE_NUM=%FILE_NUM%

■小ネタ
①ユーザ応答の構文には、「/P」オプションをつける。

SET /P DB_INFO="接続先情報を入力して下さい(例:user/pass@schema):"

②大文字・小文字を区別させないためには、「/I」オプションを付ける。
IF文の比較時にはダブルクォーテーションを付けないと構文エラーとなる。

IF /I NOT "%CONTINUE_FLG%"=="Y" GOTO :END

③数値を扱うためには「/A」オプションをつける。

SET /A FILE_NUM=0

④現在のフォルダに移動する

PUSHD %0\..

⑤フォルダに存在するSQLファイル分処理を繰り返す。
/on:名前順、/od:日付順(古い順)、/os:サイズ順(小さい順)

FOR /f "delims=;" %%I IN ('dir /b /on *.sql') DO (

■サンプルプログラム

@ECHO OFF	

ECHO 本バッチファイルと同一ディレクトリに存在するSQLファイルをすべて実行します。
ECHO 処理順はSQLファイル名順に実行されます
SET /P DB_INFO="接続先情報を入力して下さい(例:user/pass@schema):"

ECHO 接続先:SQLPLUS %DB_INFO%
SET /P CONTINUE_FLG="接続先が正しいか確認してください。続行しますか?(Y):"

IF /I NOT "%CONTINUE_FLG%"=="Y" GOTO :END

REM 実行フラグ
SET EXEC_FLG=

REM 処理対象ファイル件数
SET /A FILE_NUM=0

REM 処理件数カウンター
SET /A CNT=0

REM 遅延環境変数の展開オプション
SETLOCAL ENABLEDELAYEDEXPANSION

REM 現在のフォルダに移動。
PUSHD %0\..

REM フォルダに存在するSQLファイルをすべて実行する。
REM /on:名前順、/od:日付順(古い順)、/os:サイズ順(小さい順)
FOR /f "delims=;" %%I IN ('dir /b /on *.sql') DO (
  ECHO ============================================
  SET /A FILE_NUM=FILE_NUM+1
  ECHO %DATE% %TIME% !FILE_NUM!件目:[SQLPLUS %DB_INFO% @%%I]を実行します。

  SET /P EXEC_FLG="続行しますか?(Y):"

  IF /I "!EXEC_FLG!"=="Y" (
    REM Y(小文字も可)が入力された場合、処理を実行する。
    SQLPLUS %DB_INFO% @%%I
    SET /A CNT=CNT+1
    ECHO %DATE% %TIME% [SQLPLUS %DB_INFO% @%%I]を完了しました。
 )
)
ENDLOCAL && SET CNT=%CNT% && SET FILE_NUM=%FILE_NUM%

ECHO ============================================
ECHO %DATE% %TIME% すべてのSQLが完了しました。実行件数:%CNT%件(/%FILE_NUM%件中)

PAUSE

EXIT

:END

EXIT