ご注意ください

  • 当ブログのコメントやトラックバックに、アカウントハックサイトや、そのようなサイトへリダイレクト(転送)される可能性が高いサイトへのリンクが時々貼られているようです。
    そのようなサイトへのリンクが貼られたコメント・トラックバックは、見つけ次第削除・禁止ワード登録していますが、今後も危険なサイトへのリンクが貼られる可能性がありますので、安易にリンク先へ飛ばないよう充分ご注意ください。

オンラインゲーム関連

著作権表示

  • 当ブログに記載されている
    会社名・製品名・システム名などは、
    各社の登録商標、もしくは商標です。

    当ブログ上の文章・写真・画像の
    無断転載、無断転用、直リンクなどは
    行わないでください。

    (C) 1998-2016 Vertex.
    (C) 2002-2016 SQUARE ENIX CO., LTD.
    (C) CAPCOM CO., LTD. 2007, 2016

    All Rights Reserved.
無料ブログはココログ

無線LANの謎

ルーターのログを、今まではsyslogが吐き出したそのままの状態で見ていたのですが、毎回MACアドレスなどを置換するのも面倒になったので、PHPでさくっとビューワーを作って、ここ数日のログを眺めていました。

すると、毎日0時~3時の間に、自分のiPhone4が1分置きに無線の認証を繰り返していることに気付きました。

他にも、Android機が割と認証エラーを繰り返していたり、スリープ中のWiiのアクセス頻度が多かったり、色分けやMACアドレスを機種名に置き換えなどをしてみると、今まで見落としていたことが意外に多くてびっくりでした。

そして気になるのが、アメリカと中国からのポートスキャン。今までも毎日のようにあったけど、ここ数日は1日に何度もあるらしい。

今までは面倒でたまにしかログチェックしていませんでしたが、せっかくビューワーも作ったことだし、毎日チェックすることにしよう。

[PHP] CLI版でphp.iniを指定

コマンドラインでPHPを動かしたときに、どーしても通常使っているphp.iniとは別の設定のphp.iniを使いたかったのですが、

% /opt/hpws/apache/php/bin/php -c /home/user/php/php-cli.ini command_line.php

と毎回入力するのは面倒なので、command_line.phpの一行目に

#!/opt/hpws/apache/php/bin/php -c /home/user/php/php-cli.ini

と入れて、command_line.phpに実行権限をつけて実行してみたものの、指定したphp-cli.iniは読み込んでくれず。

試しに、PHPタグの直後に

ob_start();
print phpinfo();
$output = ob_get_contents();
ob_end_clean();
$fp = fopen( "phpinfo.txt", "w" );
fwrite( $fp, $output );
fclose( $fp );

と入れて、phpinfo()の情報をファイルに書き出してみると、やはり Loaded Configuration File は none のまま。

いろいろと調べていると、CGI版では -c の後ろにスペースを入れないように指定すればうまく動いた、という情報があった、と教えてもらったので、早速試してみると…うまく動いた!

ということで、

#!/opt/hpws/apache/php/bin/php -c/home/user/php/php-cli.ini

と書くのが正しいようです。

いやはや、このために何時間費やしたことか…。

[HP-UX] PHPを動かしてOracleと接続するまで

HP-UXって、何でもかんでも独自な感じだから嫌い。でも仕事上使わざるを得ないのが辛いところ。

今回はHP-UXでPHPを動かして、さらにOracleとの接続までの設定を行ったので、手順をメモメモ。

とりあえずHP-UXは、HP-UX Itanium 11i 11.23 というもの。


まずは、/opt/hpws/apache/conf/httpd.conf を設定。PHPのモジュールがコメントアウトされているので外すだけ。環境によってはユーザーやグループの変更も必要。

#LoadModule php5_module        modules/libphp5.so
      ↓
LoadModule php5_module        modules/libphp5.so

次に、/opt/hpws/apache/conf/php.ini を設定。以下の項目を環境に合わせて編集する。コメントアウトされているものはコメントアウトを外す。今回はシフトJISを使ったので、SJISを指定している。

date.timezone = Asia/Tokyo
register_globals = On
magic_quotes_gpc = Off
default_charset = "SJIS"
mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
extension=oci8.sl

続いて、/opt/hpws/apache/bin/apachectlを修正。ライブラリパスを追加し、さらにOracle固有の設定を追加した。

#export SHLIB_PATH=$ORACLE_HOME/lib:$APACHE_PREFIX/php/lib/php/extensions:$SHLIB_PATH
      ↓
export SHLIB_PATH=$ORACLE_HOME/lib:$APACHE_PREFIX/php/lib/php/extensions:$SHLIB_PATH
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/10.2.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export NLS_LANG=Japanese_Japan.JA16SJIS
export PATH=$ORACLE_HOME/bin:$PATH

この状態でapacheを再起動して接続してみると、OCILogon()がない!と怒られた。どうやらライブラリのバージョンが違うために、見つからないらしい。シンボリックリンクを張ることで対処可能。

# su - oracle
% cd /opt/app/oracle/10.2.0/db_1/lib
% ln -s libclntsh.so.10.1 libclntsh.so.9.0

もう一度apacheを再起動して、ブラウザからアクセスし、Oracleとの接続が確認できた。

Linuxとは一味違った設定方法だったので結構大変でしたが、そのぶんつながるようになったときの嬉しさは大きいかも?(笑)

余談。

apacheを自動起動にする場合は、/etc/rc.config.d/hpws_apacheconf というファイルの HPWS_APACHE_START の値を 1 にすればイイ。

[PHP] Oracleと接続するために

急遽、Oracleにデータを突っ込んでいくツールを作ることになったので、PHPにOracleと接続するための環境をセットアップしました。

そのときの手順を備忘録としてメモメモ。

いろいろやり方はあると思いますが、今回は既存の環境にできるだけ影響が出ない形でやりたかったので、peclを使ってセットアップする方法を選んでみました。

まずはOracleのサイトから、Oracle Instant Client というものをダウンロードしてくる。今回は64bitのRedHatES5だったので、「Instant Client for Linux x86-64」というところから Version 11.1.0.7.0 の rpm を全種類ダウンロード。

oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-jdbc-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-sqlplus-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-devel-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-tools-11.1.0.7.0-1.x86_64.rpm

今回は必要のないものもありますが、インストール先が開発マシンなので、いつか必要になるかもしれないから入れておきましょう、ということで。

さて、この開発マシンには既にPHPが入っていますが、pearやらdevelあたりが入っていないので、これらもインストール。依存関係のあるものも一緒に。

apr-devel-1.2.7-11.x86_64.rpm
apr-util-devel-1.2.7-7.el5.x86_64.rpm
httpd-devel-2.2.3-22.el5.x86_64.rpm
php-devel-5.1.6-23.el5.x86_64.rpm
php-mbstring-5.1.6-23.el5.x86_64.rpm
php-odbc-5.1.6-23.el5.x86_64.rpm
php-pdo-5.1.6-23.el5.x86_64.rpm
php-pear-1.4.9-4.el5.1.noarch.rpm

これで pecl コマンドも使えるようになるので、以下のコマンドで oci8 を作成。

# pecl install oci8

すると、なにやらエラーが…。

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 23040 bytes) in /usr/share/pear/PEAR/PackageFile/v2/Validator.php on line 692

メモリーが足りないらしい。足りないなら増やしてあげるしかないので、pearの設定にメモリ上限を指定してみる。具体的には、/usr/share/pear/pearcmd.php に以下の一行を追加。

@ini_set('memory_limit','16M');

もう一度 pecl コマンドを実行してみると、今度は成功。途中なにやら聞かれたけど、そのままエンターキーでOKっぽい。

あとは、php.ini に以下の一行を追加し、apatchを再起動して作業完了。

extension=oci8.so

これでOracle関係の関数も使えるようになったので、さーてツール作成に勤しむぞ(´Д`)

[PHP] 文字列のつもりだったのに

PHPのとあるプログラムにバグが見つかったのですが、解決は簡単だったものの、原因が何なのかがなかなかわからずに頭を悩ませました。

バグというのは、文字列4桁で持っているIDがあるのですが、とあるIDに別のIDのデータが上書きされてしまうという状態。

具体的に書くと、

ID:0055
値:55番目の摩天楼

ID:55E0
値:55E0番目の摩天楼

となるはずが、ID:0055に「55E0番目の摩天楼」がセットされてしまうという。

ついでに、ID:0550にはID:55E1の値が、ID:5500にはID:55E2の値が、というように、何となく規則性がある感じ。

雰囲気的に、55E1=55E^1と展開されてしまい、0550とイコールになっているのはわかったのですが、さて、どうして55E1が55E^1に展開されてしまうのか。

ソースのIDを比較している部分を見てみると、

if ($fileId == $dbId) {

という記述。一見問題ないように見えるけど、この聞き方だと、Eの後に数字が来たときだけ問題が発生する模様。11A1とか22B2などは問題なし。

本来、文字列の比較にはstrcmp()を使うべきだと思うので、明らかにコーディングミスだったのかも。

変数の型を柔軟に見てくれるPHPの長所でもあり短所でもある部分なので、こういう比較部分では型を厳密に見るようにしないと、こういうバグが簡単に生まれてしまうんだな、と勉強になりました(´Д`)

[PHP] 無限ループ地獄

久しぶりにやってしまいました。無限ループ地獄。PCのCPUは100%状態になり、コミットチャージの欄も4800MB/5200MBなんてところまで行っていました。

そもそも、なんで無限ループなんか起こしてしまったのかというと…繰り返し文でのミスが原因でした。

車のタイヤサイズを簡単に検索できるツール(むか~しPerlで作ったもの)をPHPに移植していて、タイヤの幅を指定するプルダウンを以下のような繰り返し文で作っていました。(ここでは、わかりやすく簡単に書き直しています)

for( $i = 135; $i <= 355; $i + 10 ){
    print "<option value='".$i."'>".$i."</option>\n";
}

はい、ここで無限ループ発生です。なぜかというと、この状態では $i の値が全く変わらないので、 $i = 135 のまま延々と回り続けるのでした。

なんでコーディング時に気付かなかったんだろう…。

ということで、正しくは

for( $i = 135; $i <= 355; $i += 10 ){
    print "<option value='".$i."'>".$i."</option>\n";
}

となるわけで。

普段は $i++ というようにインクリメントしてしまうので、無限ループは発生しない、ということですな。

これに気付くのに結構な時間を費やしてしまったわけで、いやはや、お恥ずかしい話です(笑)

[PHP] いろいろ考える

FF11でレベル上げをするとき、いつも食事に困る。このレベルでは何がいいんだっけな…と思いつつ、ジョブを考えずいつもレベル帯だけで判断し、競売で安い食事を買う。LS内身内パーティだから許されることで、これが野良パーティだと苦情が出そう。

たかが食事、されど食事。

ということで、今さらながらFF11食事検索ツールなんぞを作っていたりする。検索ツール自体はすぐに作れるけど、大変なのが食事データの収集と、振り分け。ツールから検索しやすいようなテーブル構成を作ると、データもその構成にあわせないといけないので、この作業が厄介なのだ。

そんな面倒なことをしなくても、食事を調べるサイトはいくつもあるじゃないか!と言われそうですが、自分的に「かゆいところに手が届く」サイトが見つからないので、じゃあ作ってしまえということです。

そして、もうひとつ。こちらもFF11のツールになるけれど、少人数パーティで今まで実際に経験してきた狩場と、PT構成と、だいたいの時給をDBに溜め込んできているので、それを検索できるツールなんかを作ってみようかと。今さらな感じですが、自分で便利に使えればいいかな、と(笑)

最近MHFの食事検索ツールへのアクセスも急増しているし、だったらもっと便利に使っていただくためにも、食材から検索できるような機能をつけてみようかな、なんて考えてみたり。

……いろいろ考えているのですが、やりたいことばかりが多くて、時間が足りなさ過ぎる(´Д`)

[PHP] TCPDFのその後

英語のドキュメントに首を傾げつつ、少しずつ使えるようになってきたTCPDF。コツがわかれば、意外と使いやすいライブラリだということがわかってきました。

とりあえずはWeb基礎体温管理のPDF出力機能用に作りながら勉強していますが、ようやく画面イメージと同じような感じで出力できるようになった!・・・と喜んでいたら、落し穴がありました。

1ページだけの出力なのに、なんとファイルサイズが3.3MBもある。たぶん2種類のフォントを使っているから、それが埋め込まれてしまってサイズが肥大化したんじゃないかな、と。ローカルの環境ではさほど気にならなかったけど、ネット経由になるとちょいとキツいかな。

もうひとつの問題として、PDFに埋め込んだ画像がものすごく荒れる。GIF形式で貼りつけたら、JPEGの最高圧縮率で保存した画像みたいに汚くなってしまった・・・。透過させているのが問題なのかなぁ。

何はともあれ、もう少しで日の目を見られるようになるはずなので、もう一息がんばってみる予定。

画像はともかく、ファイルサイズは何とかならないもんかなぁ。

[PHP] TCPDFを入れてみた

PHPを使って携帯電話などからデータを入力し、PCからサイトにアクセスして印刷する、というものを基礎体温管理などで使っていたのですが、やはりWebサイトを印刷させるだけじゃ印刷結果が見栄え悪いし、なにより画面も印刷することを前提としたレイアウトにしないといけないので微妙な感じ。

じゃあ、Webサイトで表示するものとは別に、印刷用にPDF出力させてみよう、と思い立って、早速ライブラリを探してみました。

PDFLibというのが有名らしいけど、これはサーバへインストールが必要らしいので、レンタルサーバで使えないのでパス。FPDFというクラスライブラリを見つけたけど、これは日本語が使えないらしいのでパス。FPDFに日本語を扱える環境を追加するMBFPDFというものがあったけど、UTF-8が扱えないらしいのでパス。

日本語が扱えてUTF-8に対応したものはないかとさらに探してみると、ありました。TCPDF。これもクラスライブラリなので、このクラスを使いたいスクリプトと同じフォルダに入れておけば、そのまま使えるのがヨイ!

ということで、まずはダウンロード。

TCPDF公式サイト

PHP4向けとPHP5向けがありますが、ウチのレンタルサーバはPHP4なのに対し、PCに入れているのはPHP5なので、PHP4をダウンロードして使ってみました。PHP5上でPHP4用のTCPDFを使っても、特に問題はない模様。

ダウンロードしたZIPファイルを展開し、必要なファイルのみPHPスクリプトのフォルダにコピーします。ウチの環境では、以下のファイルをコピーしました。

  • cacheフォルダ
  • configフォルダ
  • fontsフォルダ
  • barcodes.php
  • html_entity_decode_php4.php
  • htmlcolors.php
  • tcpdf.php
  • unicode_data.php

さて、このTCPDFは日本語対応とは言うものの、標準では日本語フォントが入っていないらしいので、日本語フォントをTCPDF用に作らないといけません。とりあえず動作確認用にフリーのTTFフォントを落としてきて、入れてみました。

フォントの作り方はいろんなサイトで紹介されていますが、一応ここでも紹介。TCPDF4.0.02 for PHP4での作成方法です。全てDOSプロンプト(コマンドプロンプト)にて実行。

TTFフォントファイル名を [ font.ttf ]、TCPDFをコピーしたフォルダを [ %TCPDF_ROOT% ] とします。

  1. TTFフォントファイルを [ %TCPDF_ROOT%\fonts\ttf2ufm ] にコピー後、以下を実行。
      > cd %TCPDF_ROOT%\fonts\utils
      > ttf2ufm -a -F font.ttf
    font.afm、font.t1a、font.ufmの3つのファイルが作成されます。
  2. 次にPHP用に変換。
      > php –q makefont.php font.ttf font.ufm
    font.php、font.ctg.z、font.zの3つのファイルができるので、これを [ %TCPDF_ROOT%\fonts ] フォルダにコピー。

フォント作成中に大量のワーニングが出ますが、特に気にしなくても大丈夫そうな雰囲気。ただ一部の文字で文字化けなどが発生するけれど、現状はどうしようもないらしい。

ここまでで下準備は完了。


以下のスクリプトを実行して、PDFファイルとしてブラウザに表示されればOK。

<?php
require_once( './tcpdf.php' );
$pdf = new TCPDF( "L", "mm", "A4", true, "UTF-8" );
$pdf->AddPage();
$pdf->SetFont( "font", "", 16 );
$pdf->Text( 10, 10, "こんにちは!PDF!" );
$pdf->Output("test.pdf", "I");
?>

あとはTCPDFに同梱のドキュメントとにらめっこするべし!(笑)

さて、まずは折れ線グラフを出力できるようにがんばるか・・・。

[PHP] PNG画像出力とか

小型のプロフィール表示がしたくて、JavaScriptで表示するように作ったFF11プロフィールツールでしたが、どうしてもフォントとかが気に食わなくて、何とかXI-ProfさんのところのようにPNG画像で出力したいなと思いつつ、早数ヶ月。ついに、PNG画像で出力できるようになりました。

仕事の合間を縫って、少しずつ調べながらだったので、結構時間がかかったなぁ。

とりあえず備忘録を兼ねて画像出力部分をメモメモ。

// 画像のサイズを決める
$img = ImageCreate( [横サイズ], [縦サイズ] );
// 色を作成(色は10進数0-255か、16進数0x00-0xff)
$bgcolor = ImageColorAllocate( $img, [赤], [緑], [青] );
$textcolor = ImageColorAllocate( $img, [赤], [緑], [青] );
// 背景を背景色で塗る
ImageFilledRectangle( $img, [X始点], [Y始点], [X終点], [Y終点], $bgcolor );
// 文字を書く
ImageTTFText( $img, [フォントサイズ], [フォント角度], [X座標], [Y座標], $textcolor, [TTFファイル], [文字列] );
// 文字を書く(フォントファイルを使わない場合)
ImageString( $img, [フォント1-5], [X座標], [Y座標], [文字列], $textcolor );
// 画像を出力(PHPからPNG画像として出力)
Imagepng( $imgHandle );
// 画像を出力(PNG画像をファイルとして出力)
Imagepng( $imgHandle, [ファイル名] );
// リソースの開放
ImageDestroy( $imgHandle );

ということで、サンプルコード。
<?php
Header( "Content-type: image/png" );
Header( "Cache-control: no-cache" );

# 画像枠作成
$img = ImageCreate( 200, 40 );

# 色の作成
$sotowaku = ImageColorAllocate( $img, 96, 96, 96 );
$haikei = ImageColorAllocate( $img, 255, 200, 200 );
$moji = ImageColorAllocate( $img, 96, 96, 96 );

# 背景を塗る
ImageFilledrectangle( $img, 0, 0, 199, 39, $sotowaku );
ImageFilledrectangle( $img, 1, 1, 198, 38, $haikei );

# 文字を書く
ImageString( $img, 5, 55, 12, "TestBanner", $moji );

# 画像出力
Imagepng( $img );
Imagepng( $img, "./000.png" );

# メモリ開放
ImageDestroy( $img );
?>

これを実行すると、画面に下のようなバナーを表示して、さらにこのサンプルコードを置いたフォルダに000.pngというファイル名で画像が作成される。

テストバナー

これはなかなか面白いかも。

より以前の記事一覧

フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のトラックバック