あれからもう5ヶ月か…

ってことで、以前に書いた某プロジェクトからも離脱できたけど、がっつりとテストテストの日々。
どちらかというと営業寄りの部署に回されたので、最終の受け入れてストの日々でございます。

なので、新しく「こんな技術を覚えました!」みたいなのは全然ない。

このはてなダイアリーをどうしていこうかと思案中…
とはいえ、この案件もあと数ヶ月の命という話もあるので、そうしたら新しいネタを少しは投入できるか?*1

*1:で結局延長というのもよくある話

プロジェクト離脱記念…を書くつもりだったけど

先日のグチの続き。

本当は、1月末でもう終ってるはずだった。


いや、プロジェクトはまだ終らないんだけど、完全に離脱して次の仕事…のはずだった。
一応、次の仕事なんだが…


部署をまたいで、仕事をするフロアが変わっただけなんだけど…


今週は一日の三分の二は以前のプロジェクトの仕事をやってました。



既にシステムは導入して、(スケジュールどおりなら)新システム一本で稼動してるはず。
その段階であるにも関わらず、帳票関連で一部が未だ仕様が固まってないとか、どうかしてる。


ってことで、プロジェクト離脱記念のエントリは、もう少し先になりそう。

プロジェクトが炎上してるはずなんだけど、炎が見えない

まぁ、いろいろとあって、ちょっとしたグチ。


現在、とあるプロジェクトに関わっている。
立場としては、一番下なんで、基本的には上がってくるプログラムのチェック、一部開発に、客先での導入支援といったところ。
基本的にはテスターと言っていいでしょう。
復帰第一弾だし。


でまぁ、そのプロジェクトが酷い。
参加して三ヶ月目だけど、プロジェクトメンバーが顔を合わせて打ち合わせしたのは、仕様確認という名目の一回限り。
「一部開発」の一部だが、電話とメールでの指示のみ。しかも再度電話かメールで問い合わせないと開発に取り掛かれないレベル。

仕様書?
設計書?
なにそれ?って世界。

ソースレビューとかは?

修正指示をもらって、修正してコミットして、exeをアップロードして… 放置ですか?
いよいよ新旧環境での平行稼動を目前にして、すごい勢いで修正依頼をねじ込んでくる。

放置してたの誰よ?


「この仕様の確認なんだけど」
いやいや、設計書あるでしょ?
当然、目を通してるよね?
自分が指示を出して修正させた箇所のチェックも終ってるよね?

「ここはこういう仕様で…」
以前にああいう仕様でOK出したんじゃねーの?
だからお客さんに確認しろと何度も…

「○○だったのは、○○と○○が処理されていなかったことが原因でした」
いやいや、それはあんたが「○○を○○というように計算しろ」と指示したか「開発者が勝手に○○と修正してしまったけど、そもそも開発者がきちんと理解してるかどうかも確認してないし、設計書の修正も確認してないし、ソースなんて見たこともないです」って状況じゃ、マトモなものは仕上がらないでしょう。
そもそもDBの内容すらまともな資料がないのに、その計算方法が妥当かどうかなんて判るワケがない。

で、僕は僕で開発ばっかりしてるワケにもいかないけど、プロジェクト全体のスケジュールは降りてこないし、そもそもプログラムの仕様だけでなく、運用イメージすら降りてきてないのに、どんな支援が出来るんだろうね。


正直、かなり酷い状況だけど、上の人たちはマトモにそれを感じていない。
いや、僕と同僚はひしひしと感じてるし、それを色々と警告しているつもりだが、ちゃんと耳を傾けてくれる人は誰もいない。


外から見ると、少しずつではあっても前進しているように見えるだろうが、実態は正反対。
未だ仕様が不明な箇所が多いし、テスト用に作った移行データは新システムの仕様を理解していないボロボロな出来上がり。
「○○が合わないんだけど」
「テスト用に旧システムから移行したデータがダメです」
こんなやり取りを何度したことだろう?
1ヶ月前に指摘したことが改善されてないとか、完全にオワットル。


毎日同僚とグチを言い合い、上の人からの電話には強気発言、メールには辛辣な返信。


逃げ出したい。

PHPでSQLite3を試す

PHPでデータベースとしてSQLite3を使ってみる。
以前は慣れとか、仕事で使ってるレンタルサーバの関係で、SQLite3を使わずSQLite2を使う事が多かった。
久しぶりにお勉強再開ということで、今度は(なんとなく)SQLite3を使っている。

$db = new SQLite3("test.db");
$stmt = $db->prepare("SELECT * FROM items WHERE id = :id");
$stmt->bindValue(":id", $searchid, SQLITE3_INTEGER):
$result = $stmt->execute();

bindValue()とかexecute()が失敗した場合はさておき、実行結果を$resultにいれておく。


で、続いては検索結果がどうだったか、ということ。
$searchidに検索対象のID番号が入ってるとして、検索したかったIDが存在しなかった場合をどう判断するのか?*1
単純にいえばexecute()自体はSELECTの結果がゼロでもtrueなワケだから、どう判断しようか。

これがSQLite2だったらこれで取得できるのだが…

$rows = sqlite_num_rows($result);
$rows= $result->numRows();

SQLite3の場合は

Fatal error: Call to undefined method SQLite3Result::numRows() ...

と怒られてしまう。
まぁ、マニュアル読めば無いのは一目瞭然なんだけど。

配列のfetchしようにも、SQLite2のようなfetchAll()というメソッドがないので、fetchArray()で1つずつfetchするしかない(fetchAll()で取得した配列でも何らかの方法でループしなきゃならんけど)。

面倒なんでPDOを検討してみる。
まずは接続から。

$db = new PDO("sqlite:test.db");

とりあえず動作確認なんで、各種チェックは省いて…

$stmt = $db->prepare("SELECT * FROM items WHERE id = :id");
$stmt->bindValue(":id", $searchid, PDO::PARAM_INT);
$stmt->execute();

ここで問題というか、引っかかってしまいそうなのが、SQLite3Resultオブジェクトを返すSQlite3Stmtと異なり、PDOStatementの場合はboolってこと。*2
なので、$stmtを直接操作する。

…が、SELECT文をexecute()した場合に結果を取得するメソッドがない。
それらしきrowCount()も基本的にはINSERT、UPDATE、DELETEが対象。

関連する PDOStatement によって実行された直近の SQL ステートメントが SELECT 文の場合、いくつかのデータベースは文によって返された 行数を返すかも知れません。しかしながら、 この振る舞いは全てのデータベースで保証されていません。 さまざまな場所で使用するアプリケーションでは、 これに頼ってはいけません。

http://php.net/manual/ja/pdostatement.rowcount.php

左様でございますか。

fetchAll()でカウントするか。

*1:$searchid自体の検証はこれ以前で行っていると仮定する

*2:SQLite3はStmtでPDOがStatementというのも…

Puppy Linux を再度インストール

どちらかというと、ブックマークのような内容だけど。
やっぱり音が出ない。
検索しても音が出ないと嘆く人はたくさん出てくるが、なかなか解決策は出てこない。

ようやく見つけたのがコレ。
http://www.clave.gr.jp/ml/bsd-nomads/200101/msg00063.html
http://www.clave.gr.jp/ml/bsd-nomads/200102/msg00006.html
http://www.clave.gr.jp/ml/bsd-nomads/200202/msg00053.html
http://www.clave.gr.jp/ml/bsd-nomads/200202/msg00055.html
http://www.clave.gr.jp/ml/bsd-nomads/200202/msg00056.html

さて…

バッチファイルで指定したファイルの親ディレクトリを取得する

バッチファイルで対象ファイルの親ディレクトリを取得したいけど、そんな便利なものはなかった。
検索していろいろ見つけたけど、自分でも作ってみた。
スマートではないと思うので、参考までに。

ディレクトリ名が「\」ごとに分かれているので、そこで分割しようと考えた。
でもFORでdelimsを使って「\」で分けたとしても、それではループできない。
だとすると、CALLでサブルーチン呼んで、それを引き数とすれば、ループは可能。

ってことで、「\」で区切られた文字列を「""」囲みでスペース区切りにして*1、サブルーチンで処理させるやり方を考えた。

@ECHO OFF
SET FULLPATH=%~p1
SET DIRNAMES=%FULLPATH:~1,-1%
CALL :GETDIRNAME "%DIRNAMES:\=" "%"

ECHO %DIRNAME%
GOTO :EOF

:GETDIRNAME
FOR %%I IN (%*) DO (
	SET DIRNAME=%%~I
)
GOTO :EOF

「C:\Document and settings\test\sample.txt」を例とする。

まずは「%~p1」で引数から「""」とドライブレター(C:)とファイル名を外し、SETで変数FULLPATHに格納する
「\Document and settings\test\」

さらに前後の「\」を除去して、変数DIRNAMESに格納する。
「Document and settings\test」

最終的に「"Document and settings" "test"」としたいので…

1.前後に「"」をつける
2.「\」を「" "」に置換する

で、これを引数としてサブルーチンに渡したいので、こうなる。
CALL :GETDIRNAME "%DIRNAMES:\=" "%"

形としてはこういうふう。
CALL :GETDIRNAME "Documents and setting" "test"

で、:GETDIRNAMEでは引数全体をループさせて、SETで変数に上書きしていく。
上書きすることで変数の中に残るのは最後のディレクトリ名なので、それをECHOする。

*1:「""」囲みなのはスペース対策