お仕事: 2008年9月アーカイブ

画面から入力した顧客番号と担当者CDをもとに HIGEHOGE_TBL を検索し、レコードが存在していれば UPDATE し、存在していなければ INSERT をする SQL。

MERGE で書いてみた。

MERGE INTO
    HOGEHOGE_TBL A
    USING (
        SELECT
            KYAKU_NO,
            TANTOU_CD
        FROM
            HOGEHOGE_TBL
        WHERE
            KYAKU_TNO = '画面.顧客番号' AND
            TANTOU_CD = '画面.担当者CD'
        ) B
    ON (
        A.KYAKU_NO = B.KYAKU_NO AND
        A.TANTOU_CD = B.TANTOU_CD
        )
WHEN MATCHED THEN
    UPDATE SET
        MEMO = '画面.メモ',
        U_DATE = TRUNC(SYSDATE)
WHEN NOT MATCHED THEN
    INSERT
        (
        KYAKU_NO,
        TANTOU_CD,
        MEMO,
        I_DATE,
        U_DATE
        )
    VALUES
        (
        '画面.顧客番号',
        '画面.担当者CD',
        '画面.メモ',
        TRUNC(SYSDATE),
        TRUNC(SYSDATE)
        )

そしたら、一緒に仕事をしている若者から指摘された。

「これじゃあ、USING のところで検索結果が空のときに、'画面.顧客番号'と'画面.担当者CD' が ON 条件で使われないので駄目っすよ。必ず '画面.顧客番号'と'画面.担当者CD' が返るように組まないと駄目っす。」と。

なるほど。言われてみればそのとおり。

正解は、

USING (
    SELECT   
        '画面.顧客番号' KYAKU_NO,
        '画面.担当者CD' TANTOU_CD
    FROM   
        DUAL
    ) B
ON (
    A.KYAKU_NO = B.KYAKU_NO AND
    A.TANTOU_CD = B.TANTOU_CD
    )

または、いっそのこと、

USING
    DUAL
ON (
    A.KYAKU_TNO = '画面.顧客番号' AND
    A.TANTOU_CD = '画面.担当者CD'
    )

でもいいかな?

・・・こうして、世代交代が進んでいく。
(つか、MERGE 使うの初めてなんで許してくれ(^^;)

SecurityImage の表示が汚い件の続き。

お客さん(元後輩)から、
「汚いですね。読めるけど。他にはないのですか??」
との反応。

う~む・・・
となると、妹認証しかあるまい。(笑)

http://www.okanesuita.org/auth_sister/

・・・が、PHP なんだなあ。
確か、CGI 設置サーバには PHP は入ってるけど動作実績なしとか言うてたしなあ。
つーか、今さら開発言語を変更するのもなあ。

つーか、
「おにいちゃんどいて!そいつ殺せない!」
に対する正しい回答は、
「どかない」
らしい。
・・・うーむ・・・
俺なら「駄目だよ、人殺しなんて!」とか入れちゃうよ。(入れないか?(^^;)

あ、自分で辞書ファイル設定できるのか。

まあ、今回提案するのはやめておこう。(笑)
しゃれが通じず取引停止になってもいかんし。

しかし、元後輩に指図されるのは、本当に悔しい。悲しい。そして、憎い、憎い、憎い、憎い、憎い。
「あー、もう、やだ、やだ。そいつを殺して俺も死ぬよ!」
「わかったわ、お兄ちゃん」
認証成功!

結局、Makefile.PL の書き換えなどはせず、GD-2.41も GD-SecurityImage-1.66 も make test で鬼のようにエラーを吐いていたが、そのまま make install した。

で、こんな↓Perl スクリプトを実行したら、一応はイメージが作られた・・・

use GD::SecurityImage;

my $image =
    GD::SecurityImage->new(width    => 300,
                           height   => 40,
                           lines    => 1,
                           font     => "/usr/local/src/GD-2.41/t/Generic.ttf",
                           scramble => 2);
      $image->random('hskdwyq9');
      $image->create(ttf => 'default');
      $image->particle;

my($image_data, $mime_type, $random_number) = $image->out;

open (IMG, ">test.png");
print IMG $image_data;
close(IMG);

これで吐き出した画像が↓


502425.png

 

うわ、きたね。
設定を変えたらきれいになるんかいな?
(ちなみに上の画像には '502425' と書かれている。一応、読めるけど・・・(^^;)

手動インストールならちょろちょろだろうと、休憩時間にちょっと作業してたんですが、なんか、大ごとになってきました・・・(^^;

GD-SecurityImage-1.66 を手動で入れようと思って perl Makefile.PL すると、

Warning: prerequisite GD 0 not found.

って警告される。

ん?GD は入ってるんじゃなかったっけ?と思って

# perl
use GD;
^C

とかやってみると、Can't locate GD.pm と・・・

あちゃあ・・・と、今度は GD-2.41 を CPAN からとってきて perl Makefile.PL すると、

Configuring for libgd version 2.0.34.
Checking for stray libgd header files...none found.

だって。(^^;(昨夜、CPAN モジュール使ったインストールで GD は入ったと思ってたんだけど、幻だったのね・・・(^^;)

ああ、この間 gd-2.0.35 入れたんだけど、元から入ってる 2.0.34 のほうを見てるんだ。
つーか、レンタルサーバは、是非 devel パッケージを入れといてほしいな。rpm は。

ということで、手動で Makefile 直して make するしかないか。

ちょっとした休憩時間に作業するには大ごとになってきたので(^^;、続きはまた後で。

うちの会社でテスト用にレンタルしている CentOS4 のサーバで試しに GD::SecurityImage を CPAN モジュールで入れてみたけど・・・

あちゃあ、CPAN では入らなかった・・・GD::SecurityImage

GD-2.41も入ってなかったんだけど、これはインストール成功。その後の SecurityImage のインストールで NOT OK となる。

# perl -MCPAN -e shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install GD::SecurityImage
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
<略>
BEGIN failed--compilation aborted at t/98-gd.t line 25.
t/98-gd................dubious
        Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-60
        Failed 60/60 tests, 0.00% okay
t/99-magick............ok
Failed Test      Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/03-info_text.t    2   512    ??   ??       %  ??
t/04-backend.t      2   512     5    8 160.00%  2-5
t/05-version.t      2   512    ??   ??       %  ??
t/98-gd.t           2   512    60  120 200.00%  1-60
2 tests skipped.
Failed 4/8 test scripts, 50.00% okay. 64/107 subtests failed, 40.19% okay.
make: *** [test_dynamic] Error 255
  /usr/bin/make test -- NOT OK
Running make install
  make test had returned bad status, won't install without force

あーあ。

手動で make するしかないか。
見積失敗したな・・・(^^; CPAN ですんなり入るつもりで工数出してたよ。
別のお客さんのときは、そこんとこ考慮しとかないとなあ。

一応、Linux サーバ上で Windowsユーザの公開鍵をインポートして、その鍵を使いテキスト文書を暗号化。そのテキスト文書を Windows 側で秘密鍵を使って復号する流れはうまくいった。

まず、事前に、

<Windows 側>
・Windows ユーザに GnuPG, WinPT をインストール
・WinPTでキーペア(秘密鍵/公開鍵)作成。
・WinPTで公開鍵をエクスポート(テキストファイルで出力)

<Linux(CentOS)側>
・GnuPG をインストール
・gpg コマンドでキーペア(秘密鍵/公開鍵)作成。(実際、公開鍵は必要ないんだけど、ついでに(^^;)
・Windows ユーザの公開鍵をキーリストにインポート
・インポートした公開鍵にサイン

という手順で準備が必要。

あとは、gpg コマンドを使ってサーバにて暗号化、クライアントにて複合化するだけ。

■UNIX側で暗号化

$ cat > test.txt
Fear me you lords and lady preachers
I descend upon your Earth from the skies

I'll take you to the seven seas of Rhye
^D
$ cat test.txt|gpg -ear "NIPPON TAROU <pgp-taro@metandsuit.com>" -o test_asc
$ cat test_asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.9 (GNU/Linux)

hQIOAwILQ0QnW9j3EAgAlGiBKyNXw0jlexOXsr22lNZuHc7OAGXF/3B9hWlPuEEV
on2VezAEbU37xoDUMiTYNrrTm3WReBYExwyp3Ipuqd8cZT30ZQt0E+X5A0IPs+/i
aGH/iHe+vqNHy354fg0qHvFfWX+zayekXHfxKtNV3Xh+T2Ktg2Qs0AVEccVhIWIc
LynrSjWXe+9ddfkFLo2DEhsm7tfA53uQpWehiI67p4l3F10hS+aHAqWVoMXK0pY4
to0RobCyE0AwYKDEhaX6UryMMfZgIj7KmDAKbD84IVt22ur8+BMocCnSKeKa1zMg
gD4E6/ECSt9I1n8vNe48xVzzG4rWuNwME1AWUFBiKQf8DNdy8p9Bd0SMWyCs1FqL
0I0K+8qjZEOJFYjA65M2blD3DqupQyDIoxb6C4VFKoiEqNQrrtgPasooTfu2L46c
LFV8H8HMpgwpE+ZbeKUhm1Yds8aoY3YS5ZfKt+KBwnoYABYTMtDHE3tcvlLL8fQb
RsmpFBxhXeuV7jOxfheCDxiFTOtBP5vdmrd1lca9VKLuZ5t9SJsDIJB7C6UCaLMJ
26XloOfsMM6Sx7MPXIytKTYsK6455Al9KHJlXBUw4PHHCqt9WnCg/4xdgrXS0uYm
b1od5DM2Z80LyUpr1bksIa0Dvy38wDFwqhxJGOIoDn7VpIuZpxSxbzQPvmwenlQQ
lNKfAcfS2xq9F62GnOqTbhzRPZeQGqhh1g3q54iGM+DhiN7SF6wod/Pfwsn0UDH6
jMeIfjAnJZIpifbG22V0FPyOYMMcMSuoa91++uOC40C94ZTMeFVBGKik0ue9dBl1
V6w0g1yhl8PTVTSU9/vCKT33Qet5f/o/h4YoOXb7cAihIgrPipRNFDL955xo/yFF
n/BxAJRFcBzzxH4Pe7MGQ2Ky
=RK6B
-----END PGP MESSAGE-----

暗号化されてる。

■Windows 側で複合化

C:\GnuPG>gpg E:\暗号化済みTEXT.txt

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:"NIPPON TAROU <pgp-taro@metandsuit.com>"
2048ビットELG-E鍵, ID 275BD8F7作成日付は2008-09-08 (主鍵ID 707C68C1)

パスフレーズを入力:(鍵を作ったときのパスフレーズ)

gpg: 2048-ビットELG-E鍵, ID 275BD8F7, 日付2008-09-08に暗号化されました
      "NIPPON TAROU <pgp-taro@metandsuit.com>"
gpg: E:\暗号化済みTEXT.txt: 未知の拡張子
新しいファイル名を入力してください: decode.txt

C:\GnuPG>type decode.txt
Fear me you lords and lady preachers
I descend upon your Earth from the skies

I'll take you to the seven seas of Rhye

C:\GnuPG>

ばっちり。
未知の拡張子とか言われてるのは、.asc にすればよかったのかな?

さて、後は

・メールフォームCGI の中で暗号化コマンドがちゃんと実行されるかテスト。(shell に nologin を指定した状態でも)
・Windows 側に GUI で復号できる仕組みの導入。(ベストなのは、Outlook プラグインで、メールを表示した状態でボタン一発復号)

てなことが必要。

今のディレクトリ構成等を suEXEC に対応させようとするとおおごとだということで、suexec コマンドを削除(実際は別名に変更)して、強引に Apache の suEXEC を無効にしてたのだが、サーバの自動更新機能で勝手に suEXEC 環境が復活してしまう(suexec をインストールしてしまう)

仕方ないので、SuexecUserGroup 設定を「一番多いユーザに合わせて」行い、そこから漏れて suEXEC のセキュリティチェックに引っかかっちゃうやつは手動でユーザ及びパーミッションを直していくことにした。

で、昼からずっとテストをしているのだが、今のところ手動で直さないといけない部分はあまり出てきてないので、何とかこれでいけそうな感じ。

しかし、あれやねえ、suEXEC はほんまに不必要に厳しいねえ。

SuexecUserGroup 設定で、ユーザとグループを設定するので、当然、オーナーがそのユーザ&グループと同じディレクトリなら、同じグループのメンバーは書込可能な 775 のパーミッションでも良いだろうと思ってたら、これも directory is writable by others でエラーになりますなあ。

結局、設定したユーザ/グループで CGI が実行されるってだけで、同じグループのメンバーだからって甘い顔はしませんよってことなんだな。(^^;
SuexecUserGroup で設定したユーザだけ書込可でないとあきまへんよと。

・・・む~ん・・・

ありゃ。お客さんとこの PGP は GNU のだった。

つーことで、テストサーバ(CentOS4)に gnupg をインストール。

最新版は 2.0.9 なんだけど、お客さんのところが 1.x.x なので、1系の最新である 1.4.9 にしておくかな。

インストール自体は非常に簡単。

ftp://ftp.ring.gr.jp/pub/net/gnupg/
からソース(gnupg-1.4.9.tar.gz)を落としてきて、あとはいつものごとく、

[src]# tar xfz gnupg-1.4.9.tar.gz
[src]# cd gnupg-1.4.9
[gnupg-1.4.9]# ./configure
[gnupg-1.4.9]# make
[gnupg-1.4.9]# make install

で、インストール終了。

が、ここで、/usr/bin/ に gpg が存在していたことに気付いた・・・

[gnupg-1.4.9]# /usr/bin/gpg --version
gpg (GnuPG) 1.2.6
Copyright (C) 2004 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA, ELG
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256
Compression: Uncompressed, ZIP, ZLIB, BZIP2

既に Version 1.2.6 が入ってたのね・・・(^^;

パスは既に 1.4.9 のほうにとおってるので、ま、いっか?(^^;

[gnupg-1.4.9]# which gpg
/usr/local/bin/gpg

あとは、ためになりそうなサイトを適当にピックアップ。続きはまたあとで。
http://www.remus.dti.ne.jp/~grn/gpg.html
http://www.tanu.org/~sakane/doc/public/howto-gnupg.html
http://www.openpksd.org/docs/report2002/client-howto/unix/unix.html
http://www.youmerice.com/winpt/winpt.html

http://www.jp.redhat.com/manual/Doc9/rhl-cg-ja-9/s1-gnupg-import.html

FormMail(pgp5formmail.pl)でも、

$pgpprog = '/bin/pgpe';

open (PGP, "|$pgpprog -r \"$Config{'pgpuserid'}\" -af -o /pgptmp.asc > /dev/null")
~メール本文 出力~
close(PGP);

という具合にベタなメール本文をパイプで PGP プログラムに渡して暗号化。
その後、この PGP 暗号化ファイル(ASCファイル)を読み込んで、メールにセットしてるだけだなあ。

open(PGPFILE, "/pgptmp.asc")

while(<PGPFILE>) {
    print MAIL $_;
}
close (PGPFILE);

で、不要になった ASC ファイルは、

unlink("/pgptmp.asc");

すると。

モジュール使うよりはこっちのほうが簡単だねえ。

Perl でやるなら PGP::Mail か Crypt::OpenPGP みたいだけど、どっちも情報少なっ!

取りあえず引っかかったサイトを羅列しとく。
http://hwat.sakura.ne.jp/hpod/200512/09-143506/
http://www.eyrie.org/~eagle/software/pgp-sign/docs.html
http://ash.jp/sec/pgp.htm

PGP FormMail CGI を使うという手もあり。
http://support.speedex.ne.jp/v1/mail/pgp/pgpformmail.html
(こういうの使ってると、セキュリティホールとかあった時の対応が面倒だけど)

ちなみに、AL-Mail で PGP を使う方法。テストの時に必要かも。
(ALPGP55 について)
http://www.almail.com/alpgp55_readme.html

画像認証(CAPTCHA)の要件があったので、取りあえず参考になりそうなところをピックアップしとく。まずは見積もり。

Authen::Captcha

[Perl] Authen::Captcha で画像認証
http://isoya.at.webry.info/200703/article_2.html

GD::SecurityImage

セキュリティイメージの作り方
http://www.hidekik.com/cookbook/p2h.cgi?id=captcha
セキュリティイメージでの認証方法
http://www.hidekik.com/cookbook/p2h.cgi?id=captcha2
perl で Captcha 認証(セキュリティ画像)をやる方法について
http://www.drk7.jp/MT/archives/001364.html
続 perl で CAPTCHA 認証(セキュリティ画像)をやる方法について
http://www.drk7.jp/MT/archives/001369.html
GD::SecurityImageをためしてみたり
http://rockmania-web.blogspot.com/2006/02/gdsecurityimage_03.html

GD::SecurityImage は、Authen::Captcha の置き換えを目的に作られたらしいので、GD::SecurityImage つかった方がいいのかな。

しかし、そもそも CAPTCHA という手段が古いという意見もあるなあ。破られちゃうって。

つっても、破りたい CAPTCHA 画像を中継して他のポルノサイト等に表示。ポルノを見たい親父が CAPTCHA 画像に表示されている文字列を入力。その文字列をそのまま中継して元々のサイトに送信・・・みたいな、間で人間を使う形。
自動で解析して破るという手があるわけでもない様子。それなら、通常のサイトの利用であれば全然問題ないじゃろ。問題あると騒いでるヤツはちょっとビビりすぎって気がするな。(^^;

うちの会社は 6月末決算です。

零細と言えども自分で決算処理してると本業が疎かになっちゃうので、処理は某税理士事務所にお任せしてるんですが、その結果が先月出ました。

払うべき税金も確定したので、早速昨日、うちの嫁(役員だし)が岩国の郵便局に支払いに行ったんですが・・・

なんと、消費税の納税は出来たんですが、広島県の県税は受け付けてくれませんでした。(うちの会社は広島にあるんで)

郵便局でも可能と聞いていたんですが、他県にある店舗では受け付けてくれないようですね・・・
今までは僕が自分で事務所の近くの広島銀行で支払いをしていたんですが、今年は忙しくて行ってる暇がないので嫁さんに行ってもらったんですが・・・(結局、指定銀行であれば岩国支店でも支払えるので西京銀行から振込みました)

税金くらい、(地方税も含めて)どこでも振り込めるようにしてほしいものです。

何せ、うちの会社、税金払ったら 4万円の赤字ですよ。(^^;
ああ、久しぶりに利益が出てたのに・・・結局、全てのお金が消えました。税金に。

儲かっていようがいまいがむしりとられる法人税と、損金にならない交際費など、実際にお金は無くなってるのに帳簿上は所得していることになってるお金にかかる税金で、まさに「ない袖を振る」状態。

うちの会社なんて、節税対策すらせずに真面目に税金払ってんだから、好きなときに好きなところで振り込めるようにしろよ!・・・とか思いますな。実際。

開発時の SQL 文のチェックに、SI社の Object Browser を使っているのだが、MERGE 処理を実行すると内部エラーになる。

日ごろ、MERGE ってあんまり使わないので、なんか書き方間違ってるかなと何度も見直したが問題ないはず。そこでググって Object Browser 側の問題だということに気付いた。ああ・・・また無駄な時間を・・・(^^;

SI社の更新ファイルダウンロードページから、最新のファイルを取ってきて、解凍してプログラムを置き換えてやればOK。
当方は未だに Ver.9系を使っているので、Ver.9.1.0.0 にバージョンアップした。

http://www.sint.co.jp/siob/koushin_fd.htm

これで MERGE 命令も問題なく実行できるようになります。:-)

このアーカイブについて

このページには、2008年9月以降に書かれたブログ記事のうちお仕事カテゴリに属しているものが含まれています。

前のアーカイブはお仕事: 2008年8月です。

次のアーカイブはお仕事: 2008年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら