2008/8/6 水曜日

UTF8 文字化け対策

Filed under: 開発メモ — admin @ 18:31:46

エラー排出時に文字化けを防ぐため、headerレベルで文字コードを判断させる。

header(”Content-type: text/html; charset=utf-8″);

echo “エラー” ;

headerを記述しない場合は文字化けする可能性が高いので注意したほうがよい。

2008/8/5 火曜日

文字列検索 PHP 文字列一致

Filed under: 開発メモ — admin @ 13:05:14

指定文字が文字列の中にどれだけあるかカウントするPHP関数。

substr_count( 文字列 , 検索文字 )  //文字列に検索文字が含まれる回数を返します。

例:文字列”ABCABCDEF”の中に文字列”BC”の出現回数を取得する場合。

<?php
print substr_count(”ABCABCDEF”,”BC”);
?>

●実行結果
2

より正確な文字数カウント PHPソースメモ

Filed under: 開発メモ — admin @ 7:29:03

/* $strはHTMLソースです */
function myStrlen($str){

// HTMLタグを削除
$str = strip_tags($str);
// 改行を削除
$str = preg_replace("/(\015\012)|(\015)|(\012)/", "", $str);
// 連続する半角スペースを半角スペース1としてカウント
$str = preg_replace('!\s+!', " ", $str);
// HTML特殊文字を半角1文字としてカウント
$str = preg_replace("/&[a-zA-Z]{1,5};/", " ", $str);
// Unicode10進文字を半角1文字としてカウント
$str = preg_replace("/&#[0-9]{1,5};/", " ", $str);
// PHPマルチバイト対応
if( function_exists('mb_strlen') ){
$result = mb_strlen($str,'utf-8');
}else{
$result = strlen($str);
}
return $result;
}

※注意:mb_strlen($str,”utf-8″)において、”utf-8″の指定がない場合、文字カウント数がおかしくなるので注意 。

・参考ソース
http://xoops.suinyeze.com/modules/bulletin/index-page-article-storyid-46.html

2008/7/27 日曜日

PHPでのsocket通信 メモ

Filed under: 開発メモ — admin @ 15:40:23

 <?php
// エラーのタイプ
error_reporting (E_ALL); // サポートされる全てのエラーと警告

// プログラム開始
echo “プログラムを開始しました。\n”;

// スクリプトが実行可能な秒数を無制限に設定
set_time_limit (0);

// 出力関数のコールが行われるたびに自動的にフラッシュ操作が行う
ob_implicit_flush ();

// サーバーのIPアドレス
$address = ‘192.168.24.66′;

// 使用するポート
$port = 10001;

// IPv4インターネットプロトコル
$domain = AF_INET;

// 時系列的、高信頼性、全二重、接続型のバイトスト リーム(何の事やらさっぱり)
$type = SOCK_STREAM;

// 最大キュー数(どこで役になってるかよく分からん)
$backlog = 5;

// ソケットを作成する
if (($sock = socket_create ($domain, $type, 0)) < 0) {
echo “ソケットの作成に失敗しました。” . socket_strerror ($sock) . “\n”;
}else{
echo “ソケットを作成しました。\n”;
}

// ソケットに名前をバインドする
if (($ret = socket_bind ($sock, $address, $port)) < 0) {
echo “バインドに失敗しました。” . socket_strerror ($ret) . “\n”;
}else{
echo “名前をバインドしました。\n”;
}

// ソケット上で接続をモニタする。
if (($ret = socket_listen ($sock, $backlog)) < 0) {
echo “接続待ちに失敗しました。 ” . socket_strerror ($ret) . “\n”;
}else{
echo “モニター開始しました。\n”;
}

// クライアントリスト(配列)を作る
$clients = array($sock);

// break 2 するまで繰り返し
while (true) {

// クライアントリストをコピっとく
$read = $clients;

// ブロックの監視
$write = NULL;

// 例外の監視
$except = NULL;

// 有効時間
$tv_sec = 3600; // マニュアルには0でOKってあるけど、0にするとループして処理落ちする

// ソケットの配列を受け取り、 指定した有効時間の間それらの状態が変化するまで待ちます。
if (socket_select($read, $write, $except, $tv_sec) < 1){

// 最初に戻る
continue;

}

// 新規に接続しようとするクライアントがいる場合
if (in_array($sock, $read)) {

// ソケットへの接続を許可する。
if ( ($newsock = socket_accept($sock)) < 0) {
echo “接続許可に失敗しました。 ” . socket_strerror ($newsock) . “\n”;
continue;
}

// クライアントリスト(配列)に追加する
$clients[] = $newsock;

// 現在の接続人数
$clientCnt = count($clients) - 1;

// 接続者のIPを取得
socket_getpeername($newsock, $ip);

// 出力する文字
$msg = “==================================\r\n”.
“サーバーに接続しました。\r\n” .
“終わりたいときは’1′押して。\r\n” .
“サーバーを止めたい時は’2′押して。\r\n” .
“==================================\r\n”;

// クライアントへ文字の出力
socket_write($newsock, $msg, strlen($msg));

// 出力する文字
$msg = “「{$ip}さんが来ましたよ。(今{$clientCnt}人)」\r\n”;

// 全てのクライアントにログインを報告
foreach ($clients as $send_sock) {

// #4を無視
if ($send_sock == $sock ){
continue;
}

// クライアントへ文字の出力
socket_write ($send_sock, $msg, strlen ($msg));

}

// サーバーに文字の出力
echo $msg;

// 発言用のforeachが発動しないようにunset
$key = array_search($sock, $read);
unset($read[$key]);

}

// 発言のあるクライアントの数だけループ(奇跡の同時入力でも行われない限り大抵1個)
foreach ($read as $read_sock) {

// クライアントIP
socket_getpeername($read_sock, $read_ip);

// ソケットから(最大2048バイトまでの)入力データを読込む
$buf = socket_read($read_sock, 2048);

// 接続が確認出来ない場合
if (FALSE === $buf) {

// クライアントリストから削除
$key = array_search($read_sock, $clients);
unset($clients[$key]);

// 現在の接続人数
$clientCnt = count($clients) - 1;

echo “「{$read_ip}さんが切断されました。(今{$clientCnt}人)」\n”;

// 次のクライアントへ
continue;

}

// 空白除去して中身が空っぽだったら次のクライアントへ
if (!$buf = trim ($buf)) {
continue;
}

// 1だったらクライアントの終了
if ($buf == ‘1′) {

// クライアントリストから削除
$key = array_search($read_sock, $clients);
unset($clients[$key]);

// ソケットを切断する
socket_close ($read_sock);

// 現在の接続人数
$clientCnt = count($clients) - 1;

// 出力する文字
$msg = “「{$read_ip}さんが帰りました。(今{$clientCnt}人)」\r\n”;

// 全てのクライアントにログインを報告
// あれ?どっかで同じ処理みたぞ。
foreach ($clients as $send_sock) {

// #4を無視
if ($send_sock == $sock ){
continue;
}

// クライアントへ文字の出力
socket_write ($send_sock, $msg, strlen ($msg));

}

// サーバーに文字の出力
echo $msg;

// 次のクライアントへ
continue;

}

// 2だったらソケットサーバーの停止
if ($buf == ‘2′) {
// ソケットを切断する
socket_close ($read_sock);
break 2;
}

// 全てのクライアントに発言を送信
// あれ・・・また同じ・・・
foreach ($clients as $send_sock) {

// #4を無視
if ($send_sock == $sock ){
continue;
}

// 自分の発言の時は改行コードだけ出力する
if($send_sock == $read_sock){
socket_write ($send_sock, “\r\n”);
continue;
}

// 出力する文字
$talkback = “{$read_ip}:{$buf}\r\n”;

// クライアントへ文字の出力
socket_write ($send_sock, $talkback, strlen ($talkback));

}

// サーバーに文字の出力
echo “{$read_ip}:{$buf}\n”;

}
}

// ソケットを閉じる(サーバーの終了)
socket_close ($sock);

?>

参照元トラックバックURL
http://d.hatena.ne.jp/codeweb2/20080112/1200081048

Perlでのsocket通信

Filed under: 開発メモ — admin @ 1:29:54

Perlによる共通鍵暗号方式でのSocket通信。クライアント部分。

DESは8ビットしか(超・未満)暗号化できないけれど、Crypt::CBCを使えば8ビットを超えるのデータも8ビットずつ暗号化してくれます。8ビット未満の最後の端数もうまいこと処理してくれます。ローカルの入出力はいい加減です。

※DES以外の暗号化方式も処理できます。

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;
use Crypt::CBC;
use utf8;

open (IN,”sock_crypt.txt”); #暗号化したいデータ
binmode IN;

# オブジェクト作成
my $cipher = Crypt::CBC->new({’key’             => ‘aaaaaaaa’, #鍵パスフレーズ
‘cipher’          => ‘DES’, #暗号化の方法
‘iv’              => ‘$KJh#(}q’, #初期ベクトル
‘regenerate_key’  => 0,
‘padding’         => ’standard’,
‘prepend_iv’      => 0
});

# 暗号化
my $ciphertext = $cipher->encrypt(<IN>);

my $sock = IO::Socket::INET->new(PeerAddr => ‘xxx.xxx.xxx.xxx’, #送信先サーバのIPアドレス
PeerPort => ‘xx’, #送信先サーバのListenポート番号
Proto => ‘tcp’); #プロトコル

$sock->send($ciphertext); #送信

#送信後、何か受けるものがあれば下記で受信
my @recv = <$sock>;
close($sock);
print @recv, “\n”;

2008/7/18 金曜日

XREAで同期元を削除してしまった場合

Filed under: 開発メモ — admin @ 23:56:35

「同期元」を削除し「同期先」が見えなくなってしまった場合、削除してしまった「同期元」と同名のディレクトリを作成すると、見えなくなってしまった「同期先」のディレクトリも復活します。
CGI スクリプトで「同期先」を削除する

この場合は、次の CGI スクリプトを用いて「同期先」を削除するとうまくいきます。@deletefile に、同期先ディレクトリの相対パスを記入してアップロードし、通常の CGI と同じように実行してください。
#!/usr/local/bin/perl

# 削除したいファイルパス 複数指定可能

# ファイル、およびシンボリックリンクを削除できます。ディレクトリは削除できません
@deletefile = ( ‘./hogehoge.com’ );

$cnt = unlink (@deletefile);
$mes = “$cnt 個のファイルの削除に成功しました。”;

print “content-type: text/html\n\n”;
print “<HTML><HEAD><TITLE>ファイル削除</TITLE></HEAD><BODY><H1>$mes</H1></BODY></HTML>”;
メモ帳などにコピーペーストし、「名前をつけて保存」を行ったものをアップロードし、CGI として実行してください。
FTP ソフトで「同期先」を削除する

シンボリックリンクの削除に対応している FTP ソフトなら、「同期先」を正常に削除することができます。しかし、そのようなソフトは非常に少ないので、上記の CGI を使った方法が一番確実でしょう。

inner join と left join の違い

Filed under: 開発メモ — admin @ 23:55:04

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

MYSQL 3テーブル以上 結合

Filed under: 開発メモ — admin @ 23:53:16

・inner join を使用して、等価結合することもできます。(インナージョイン)

select
受注番号,
受注m.品番   as 品番,
品番m.入庫数 as 入庫数
from sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番
;

・3 つ以上の結合を inner join で指定するには、次のようにする。

select
*
from (sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番)
inner join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD
;

2008/6/20 金曜日

boolean関数 ブーリアン関数とは

Filed under: 開発メモ — admin @ 19:59:09

javaなどの言語で使われるboolean関数とは、真(true)と偽(false)の2種類の値だけを扱う最も単純な構造の型 である。

詳しく⇒IT辞書

« 前のページ

HTML convert time: 0.183 sec. Powered by WordPress ME