Jump to navigation
| 1 |
2004年 4月 01日 (木曜日)
- General on miau's blog?
ただの日記になってる記事(?)もありますね。
当初「よくある日記系 blog じゃなくて、技術的にも有用なものが書ければ〜」とか書いてたのに。
でも、これは結構意図的にやってたり。SE の生活っぷりってものが滲み出てそうなので。
2004年 4月 04日 (日曜日)
- General on miau's blog?
数日前からちらほら届いているのですが。
この環境では感染しないので、とりあえず Becky! で「虫籠」とかそういうフォルダを作ってそこに溜め込んでました。
すると今日いきなり「検疫しました」みたいなメッセージが。
Norton AntiVirus のリアルタイム保護機能らしいけど、いきなりなんで?
と思ったら、HDD の容量足りなくなって「ディスクのクリーンアップ」を実行してたので、その過程にリアルタイム保護が働いたっぽいです。
普通にスキャンしたときは反応しなかったのにリアルタイム保護だと反応するのね。ちょっと不思議。
にしてもログには「状態: 感染」とか書かれててかなり気持ち悪い。他に書きようなかったかなぁ。
- Work on miau's blog?
今日も出勤とかしてますが。
C の const 修飾子周りでてこずってました。
#include <stdio.h>
#include <string.h>
void move_next(const char **pp)
{
if (IsDBCS(**pp)) {
(*pp) += 2;
} else {
(*pp)++;
}
}
int main()
{
char str[] = "hogeほげ";
char *p = str;
while (*p != '\0') {
if (IsDBCS(**pp)) {
/* なんか処理 */
} else {
*p = toupper(*p);
}
move_next(&p);
}
return 0;
}
これをコンパイルするとエラー発生。
move_next() は const char ** を渡すべきであって char ** は渡しちゃダメなんだそうで。
const char * に char * を代入したりできるから、てっきり上記も OK だと思っていたんだけど。
const char *q;
:
:
q = p;
move_next(&q);
(これなら文法的には OK。ただここでやりたいことは実現できてない。)
move_next() の宣言から const を外せばいいんですけど。見てのとおり move_next() の中で文字列を操作しているわけじゃないので、気持ち悪い。
んー・・・これって C の仕様がおかしいんじゃないの?
とか思ったけど、よく考えると C++ のオーバーロードとかそのへんに対応するためなのかも。つまり
void move_next(const char **pp);
void move_next(char **pp);
を別の関数として実装できるから、区別できないと困るわけだ。
結局
move_next((const char**)&q);
とするしかないっぽい。キャストは極力避けたい気もするんだけど、仕方ないか。
(2004/08/29 追記)
すいません。
> よく考えると C++ のオーバーロードとかそのへんに対応するためなのかも。
ってとこ、思いっ切り嘘ついてます。
C FAQ 11.10 参照のこと。
確かにオーバーロード対応だったら
> const char * に char * を代入したりできる
ってのが理屈に合わないですね。
2004年 4月 07日 (水曜日)
- Work on miau's blog?
SELECT 文で NULL をベタ書きすると、エラーになってしまう。
(とりあえず DB2 でのお話。今ほかの DBMS 環境ないので。)
db2 => SELECT ID, VALUE, NULL FROM TEST
SQL0206N 使用されているコンテキストで、"NULL" は無効です。 SQLSTATE=42703
ということで、とりあえず NULLIF で対応。
db2 => SELECT ID, VALUE, NULLIF(0, 0) FROM TEST
ID VALUE 3
------------ ---------- -----------
1. aaa -
2. あああ -
ほかにいい方法ありますかね?
ちなみに、なんで NULL を選択する必要があるのかというと、INSERT INTO 〜 SELECT 〜 を動的に生成していて、条件分岐で NULL を挿入したいから。
char strFormat[] = "INSERT INTO TEST SELECT ID, VALUE, %s FROM TEST WHERE ID=%d";
sprintf(strSql, strFormat, (intSomeFlag) ? ("0") : ("NULLIF(0, 0)"), intId);
EXEC SQL EXECUTE IMMEDIATE :strSql;
あ。ちなみに CHAR やら VARCHAR の列の場合は NULLIF('', '') とかやって型合わせないとダメっぽい。
- Perl on miau's blog?
ActivePerl の正規表現周りで日本語使うとうまく処理できないことがある。
"ー" のように2バイト目が "[" になっているものなんかがそうで。
Perl-5.8 MEMO - 日本語を含むスクリプトを書く
に対応策が載っていたけど。やってみるとアプリケーションが落ちたり。
jperlですな
こういうことやんないとだめですか?
2004年 4月 08日 (木曜日)
- Work on miau's blog?
同僚が作ったプログラムで怪しげな処理を見かけたのでちょっと確認。
怪しげな処理っていうのは、DECIMAL のフィールドを比較処理。
(1) VB の ADODB.RecordSet で DECIMAL 型のフィールドを普通に取得
(2) CStr$() で文字列に変換
(3) 文字列の比較
とかやってて。それだと 11 < 2 とか評価されちゃうのでは?と思ったわけで。
とりあえず DB2 で試してみた。
db2 => CREATE TABLE TEST (ID DECIMAL(10))
db2 => select id, cast(id as char(12)) from test
ID 2
------------ ------------
0. 0000000000.
1. 0000000001.
2. 0000000002.
10. 0000000010.
-1. -0000000001.
-2. -0000000002.
6 レコードが選択されました。
あれ。CAST した場合は 0 でパディングされるのね。
ということは、場合によっては文字列に変換後でも問題ないんだろうな。
ま、一応確認。
db2 => select id, cast(id as char(12)) from test order by 1
ID 2
------------ ------------
-2. -0000000002.
-1. -0000000001.
0. 0000000000.
1. 0000000001.
2. 0000000002.
10. 0000000010.
6 レコードが選択されました。
CHAR にキャストした後も↑みたいな大小関係があればいいんだけど・・・
db2 => select id, cast(id as char(12)) from test order by 2
ID 2
------------ ------------
-1. -0000000001.
-2. -0000000002.
0. 0000000000.
1. 0000000001.
2. 0000000002.
10. 0000000010.
6 レコードが選択されました。
やっぱりダメでした。
負数は代償関係が逆になってしまいますね。
この方法での比較は フィールド値 > 0 が保証されている場合のみ有効、と。
で・・・ふと自分の PC に SQLServer がインストールされているのを思い出し、この環境でも試してみた。
1> select id, cast(id as char(10)) from test
2> go
id
------------ ----------
0 0
1 1
2 2
10 10
-1 -1
-2 -2
(6 件処理されました)
おー、これこれ。当初は CAST したらこう(0 埋めされず、左寄せに)なると思ってたんだよね。
ということは・・・。
1> select id, cast(id as char(10)) from test order by 1
2> go
id
------------ ----------
-2 -2
-1 -1
0 0
1 1
2 2
10 10
(6 件処理されました)
これはまぁ当然の結果として・・・
1> select id, cast(id as char(10)) from test order by 2
2> go
id
------------ ----------
0 0
1 1
-1 -1
10 10
2 2
-2 -2
(6 件処理されました)
こうな・・・る・・・あれ?
負号の位置が予想と違う・・・。
・・・まぁ SQLServer の照合順序って結構特殊だし、こんなもんかも。
なんか環境によって色々違いそうなので、結局 VB も試してみることに。
同僚がやってたように、CAST は行わず、CStr$() による変換。
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cnn.Open "dsn=hoge;uid=hoge;pwd=hoge;"
Set rs = cnn.Execute("SELECT ID FROM TEST")
Do While rs.EOF = False
Debug.Print "[" & CStr$(rs.Fields(0)) & "]"
rs.MoveNext
Loop
cnn.Close
超手抜きコード。さて、結果は・・・
[0]
[1]
[2]
[10]
[-1]
[-2]
どうやら左寄せの文字列になってしまう模様。やっぱダメじゃん。
ということで、結論。
INTEGER とかに収まりきらない DECIMAL はできるだけ DB 上で比較しましょう、と。
2004年 4月 09日 (金曜日)
- Work on miau's blog?
スレッド表示にしている場合。
-hoge
Re: hoge
Re[2]: hoge
となっていた場合は Re: hoge や Re[2]: hoge の中も検索してくれるけど、
+hoge
みたいに折りたたまれてると Re: hoge や Re[2]: hoge は検索対象にならないらしい。
対応策としては
・一時的にスレッド表示を解除して検索
・クエリー検索
のどちらか?
オプション設定からは見つからなかったような。
これまで仕事で「そんなメール届いてないっすよ?」みたいな場面が何度かあったけど、実は検索の仕方が悪かったのかも・・・。
2004年 4月 15日 (木曜日)
- Work on miau's blog?
先週末に風邪ひいて連泊記録は1ヶ月ほどで終了。
ちなみに風邪ひいた原因は・・・もちろん無茶な生活で抵抗力が落ちてたんだろうけど、それ以上に会社の空調に問題が。
夕方になるとむぁっと暑くなる→薄着になる→夜中になると次第に冷える(この時は疲れ果てて睡眠中)
というのを繰り返した結果ではないかと。
- Perl on miau's blog?
先日は結局解決しなかったので、再度調べてみる。
要件としては
・Shift-JIS のファイルを 入力/出力したい
・Perl スクリプト自体は Shift-JIS が望ましいが、無理なら EUC でも UTF-8 でも構わない
という状態で。
とりあえずスクリプトに "ー" が含まれるような場合に正しく動作させたければスクリプトを EUC か UTF-8 にすれば良いらしい。
さて、この状態で Shift-JIS が扱えるかだ。
Shift-JISテキストを正しく扱う
ああ。Jcode.pm とかで変換かければいいのかな。ということで、
Jcode.pmをWindows 2000でコンパイルする
から Jcode.pm を DL してさくっと導入。
# shift-jis 対策
use jcode;
open IN, "<$filename" or die $!;
@lines = ;
close IN;
foreach $line (@lines){
Jcode::convert(\$line, "euc");
}
open OUT, ">$filename.euc" or die $!;
print OUT @lines;
close OUT;
# 本処理
use encoding "euc-jp";
とかやってみるけど、やっぱりうまくいかない。
Perl 5.8 Documentation - perljp - 日本語 Perl ガイド
見て、
open (IN, "<:encoding(shiftjis)", "$filename");
とかできそうな気がして実験。失敗。
・・・と思いきや、ただのコーディングミスと判明。
最後に書いた方法でよさげ。
2004年 4月 20日 (火曜日)
- 読了@技術書 on miau's blog?
出版社
Amazon
とりあえず読了。情報処理試験の帰りの電車で。(意味なし)
午前が一通り(全分野通して)まとまってるので午前対策にさらっとやると良い感じです。午後対策をこれだけでやろうというのはちょっと無謀です。
システム管理に関わる部分は、他の「システム管理ONLY本」みたいのにも載っているだろうから読み飛ばしてもいいかもしれません。
- Exams on miau's blog?
はい。撃沈してきました。
まぁ仕事が忙しかったので仕方ありませんが・・・やはり自分の勉強の時間が取れないというのは問題だなと思ったり。
とりあえず午後Iくらいまではちゃんと勉強すれば普通に解けそうです。(移行やら運用やらは力不足で解けませんでしたが。)
午後IIはやっぱり難しいというか・・・ちゃんと対策していかないと無理です。私には。
でも買っておいた本(アイテックの2冊)をちゃんとやって、論文をちゃんと準備して行けばなんとかなりそうな気も。
それなりに次回に繋がりそうな感じなので良しとします。
- Work on miau's blog?
どの作業にどれくらいの時間を費やしたか、というのを毎日記録しているのですが。
「えーと・・・昨日は10時出勤で寝たのが4時くらいだから
24 - (10 - 4) - 1(昼休み)= 18
で 17 時間か・・・」
とかなんとか
24h - 睡眠時間
の引き算になってるのがなんか嫌です。
普通に (退社時刻) - (出社時刻) で計算したい。
2004年 4月 23日 (金曜日)
- Exams on miau's blog?
インターネットにおけるルール&マナー検定
無料ということなので滑り込みで受けてみました。(今日の夕方まで)
正答数(100問中):87問(正答率:87%)
ルール (45問中):34問(正答率: 75%)
マナー (35問中):34問(正答率: 97%)
基本知識(20問中):19問(正答率: 95%)
所要時間: 01:00
90% がボーダーなので不合格でした。ちょっぴり残念。
やはり法律関係とか弱いらしい。とりあえず間違ったところを羅列してみる。
※かなり簡単に抜き出してるので誤解しないよう注意
・医薬品の販売は許可制(対面販売でなくてもいい)
・業務提供誘引販売取引はクーリングオフ可
・著作権が切れてる絵(ゴッホとか)を撮影が許可されてる美術館で写真に収めた場合、再掲載可能
ただし別の媒体(雑誌とか)に掲載されているものは問題あり
・わいせつ画像のアップロードはそもそも違法
・日本国内で海外のカジノ利用、海外の宝くじ購入は控えるべき
・公的個人認証サービス、証明書の発行受付は市町村が、公開鍵証明書の発行は都道府県が行う
わいせつ画像のアップロードがそもそも違法というのがカルチャーショック。
何かしら条件があるのかと思ってた。(児ポ法とかモザイクとか)
マナーと基礎知識で1問ずつ落としてるのは恥ずかしいような。
まぁポカミスなんだけど、もっと理解力があればなんとかなっただろうし。
にしても
WWWサーバは、Webページの閲覧機能を提供するサーバである。
っていう説明はどうなんだろ。閲覧はクライアント側の機能って気がするけどなぁ。
2004年 4月 26日 (月曜日)
- 読了@技術書 on miau's blog?
出版社
Amazon
現在仕事で業務系のシステムを作っているわけだけど、たまに「トリガって何?」とか「ストアドプロシージャとユーザ定義関数って何が違うの?」とか聞かれることが。
私はこのあたりは Oracle やら SQLServer やら DB2 の資格を取得する過程で身に付けたけれど、他の人にはどうやって学んでもらえばいいものか。さすがに上記の資格を全部取れ、というのは無茶な気がする。
そう思っていたところ発売されたのがこの本。DB に関する書籍というと、設計者や管理者向けのものが多い(気がする)けれど、その中でめずらしく開発者向けの本。
で、感想としては・・・これを読んでいれば DB を使った開発で困ることはかなり少なくなるんじゃないかと。
「Oracle では〜、SQLServer では〜、DB2 では〜」というように RDBMS 毎の説明もあるので、色々な DBMS を触れるような人にもオススメできます。
欠点としては、上記の RDBMS 毎の表記にムラがあるあたり。「そこって DB2 では違うんだけど・・・」とか思うこともしばしば。
にしてもこの本でも DECLARE CURSOR の WITH HOLD オプションとかは載ってなかった。今回のプロジェクトで結構経験のある開発者×2でも知らなかった部分なんだけど・・・こういうのはどこで知ればいいんだろう。DB Magazine とか読んでれば自然と身につくのかな・・・。
2004年 4月 29日 (木曜日)
- VB6 on miau's blog?
仕事である関数のテストをしているのですが。
VB のフォームに TextBox が 30 個ほどちりばめられており、そこに値を入力してテストを行うことになってます。はっきり言ってかったるいです。
ということでテストドライバ製作者に「いちいち入力するの面倒だから CSV から読み込めない?」と尋ねてみると「うーん・・・僕もそう思ったんだけどね。○○さんが『そこまでしなくても』いいってさ。」との返答が。
あああ。また上の人がいいかげんな指示を。
それくらいのコーディング、VB でならすぐできるのに。
と思ったので本当にすぐできるのか試しに書いてみた。
要件:
・フォームに TextBox のコントロール配列がある
・CSV ファイルを読み込み、それぞれの TextBox に値をセットしたい
とりあえず1行分読み込みのサンプルということで。
Dim Params() As String
Dim i As Integer
ReDim Params(0 To Text1.Count - 1)
Open "test.csv" For Input As #1
Input #1, Params(0), Params(1), Params(2)
Close #1
For i = 0 To Text1.Count - 1
Text1(i) = Params(i)
Next
まず思いつく単純な方法。でもこれだとコントロール配列の Count が拡張された場合に対応できないし、30 個も並べるのは面倒。
ということで、こんな感じになるかな。
Dim Params As Variant
Dim Str As String
Dim i As Integer
Open "test.csv" For Input As #1
Line Input #1, Str
Close #1
Params = Split(Str, ",", -1)
For i = 0 To Text1.Count - 1
Text1(i) = Params(i)
Next
これだとダブルクォートとかカンマの処理がうまくできないけど、場合によってはこれでも十分なコードではないかと。タブ区切りとかになっても対応できるし。
ま、CSV 読み込みのサンプルコードなんてたくさんありそうなんで、そっち使ったほうがいいんでしょうけど。
| 1 |