SQLの窓 イラストAC フリー素材

2014年10月11日

PHP : ログインとブラウザの当日日付データ

仕様の問題ですが、出退勤の日付用としてクライアントのデバイスが持つ日付を使う為に、データベース用の書き込みデータや SELECT 文で読み出す条件としての日付を文字列で取得したいわけです。

その為に作った JavaScript のメソッド

JavaScript の String と Date オブシェクトに、9999/99/99 書式の文字列日付を取り出すメソッドを追加する

要するに『(new Date()).sdate("-")』で取得します。

でまあ、最初に仕込む場所としてログインが最も妥当かなぁと思いますし、そもそもログインでセッションとしてログインした事を保存するので、セッションに日付をセットしておく事にします。画面遷移のたびに取得してもいいですが、日付をまたぐ運用を行うようなアプリケーションでのみ、操作手順(オプション)の一つとして『再取得』を用意すればいいと思うわけです。

関連する記事

hash_hmac は秘密鍵があるので、辞書の総当りとかでパスワードは解りませんから。パスワード抜かれるのは、フィッシングがスパイウェアか、本人が口に出した場合ですね。



タグ:PHP
posted by at 2014-10-11 18:08 | PHP | このブログの読者になる | 更新情報をチェックする

2014年10月10日

hash_hmac は秘密鍵があるので、辞書の総当りとかでパスワードは解りませんから。パスワード抜かれるのは、フィッシングがスパイウェアか、本人が口に出した場合ですね。

ただの hash なら、md5 で password は 5f4dcc3b5aa765d61d8327deb882cf99 ですね(Google で 15,300 件ヒット)。サーバーのデータベースにもし生のパスワードが入ってたら大笑いですが、どんなにアホでもサーバーの責任を回避する手段として、サーバー側が解読できるパスワードなんて保存しないというか、誰が考えてもしたく無いです。
<?php

print hash_hmac("md5","password","lightbox") . "\n";

//0b8d1a7cf74154638a19eb9958b8e475

print hash_hmac("md5","password","2014") . "\n";

//27ad87de8ac47d30710f9144ba48d7fa

?>

よく、パスワードを忘れたら新しいパスワードを入力します。たまーーにパスワード送って来るシステムがありますが、暗号化してデータベースに保存しているのでしょう。余程運用に自信があるか、そこまでしてもメリットのあるサービスが運営されているはずです。
<?php
session_start();
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// 日本語

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	if ( hash_hmac( 'sha256',$_POST['pass'], "himitsu" ) == 'a15c6fe4973d69106646f5304c44a03ef41490d964e9bcca4f0848431b9cfe0b' ) {
		$_SESSION['login'] = 'yes';
		header('Location: http://localhost/web/1008/005/control.php');
		exit();
	}

}

//print "<pre>";
//print_r($_SERVER);
//print "</pre>";

?>
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
<form method="post">
<input type="password" name="pass">
<input type="submit" name="send">
</form>
</body>
</html>



ですから、パスワードが盗まれるのはこういう経路ではなく、フィッシング詐欺です。

フィッシング詐欺の出発点は、メールから内容で不安感を煽って直接パスワードを入力させるもので、向こう側でそのパスワードがダイレクトに手に入ります。普通は気が付きますが、中には気がつかない人も居るわけで、悪い奴はハナからそういう人を狙ってます。

しかし、もっとあくどいのが、スパイウェアでして、こいつにやられたらキー入力とか全部バレたりするので正しい処理をしていてもパスワードが盗まれます。

実際は、銀行側の機能で対処します

オンラインバンキングでは、一時パスワードを処理毎に発行できるようになるのが普通で、楽天銀行だとお金を移動するのに、3つのパスワードと2つの一時パスワードが必要です。そこまでしてて盗まれたらお手あげですが、そもそもオンライン銀行にバカみたいに高額のお金を置かなければいいので、取引銀行の機能としてオンラインバンキングするのでは無く、オンラインバンキング専用の銀行を別に用意すればいいですね。

セキュリティキーボード

毎回変換配置の変わるキーボードですね。マウスでクリックするのが普通ですが、毎回変わるのでキーボードでもかまわないという特徴もあります(a と入れたい場合に x だったり 8 だったり)。これを使うと悪者はお手上げのはずです。

ワンタイムパスワードの送り先

ハードを借りるという単純なものもありますが、インターネットだとメールアドレスに送ったりするものもあります。その場合、携帯やスマホへ送るようにすれば、やはり悪者はお手上げです。



posted by at 2014-10-10 23:54 | PHP | このブログの読者になる | 更新情報をチェックする

すごく当たり前の事なんですが、UTF-8N で保存されたテキストファイルをメモ帳で変更して保存したら先頭に EF BB BF という爆弾が仕掛けられるのでダメですよ

PHP で以下のような SQL を保存するわけです。もちろん UTF-8N で。
select 
	社員マスタ.*,
	DATE_FORMAT(生年月日,'%Y/%m/%d') as 誕生日
 from 社員マスタ
 where
	社員コード = '{$_GET['syainCode']}'

それを、メモ帳で読むと普通に読めるので、知らない初心者はそのまま SQL を変更して保存する。しかし、実行時に SQL の先頭には余計なデータが付加されているので、SQL はエラーとなる。たいていは初心者なので原因が解らず、かなり脱出困難なループに入ってしまいます。

上級者でも、まさかメモ帳で書き換えたとは気がつかずに原因を特定するのにそれなりに時間がかかる場合があります。勘のいい、もしくは運のいい先輩プログラマなら、すぐ対応できるでしょうが・・・

文字通りの BOM(B)

実際は、バイトオーダーマーク (byte order mark) というものですが、こういうシチュエーションでは爆弾の一種ですね。




確認用簡易ダンプ

「送る」に入れる簡易ダンプ




posted by at 2014-10-10 20:34 | PHP | このブログの読者になる | 更新情報をチェックする

2014年07月31日

PHP で cURL はオプションが全て。いろいろあるので、ちょっとまとめ

2014/7/31 現在、さくらインターネットの標準の PHP バージョンが 5.4.29 で、cURL が 7.36.0 ですが、このバージョンもオプションの意味合いに関係があります。

curl_setopt

上のリンクは、cURL のオプションの一覧です。

CURLOPT_BINARYTRANSFER が必要無くなっています

PHP 5.1.3 以降では、このオプションは何の効果も無いとあります。 CURLOPT_RETURNTRANSFER を使うのみでいいそうです。

CURLOPT_RETURNTRANSFER

TRUE を設定すると、curl_exec() の返り値を 文字列で返します。http で WEB ページを呼び出した結果が必要な場合に設定します。FTP の処理などでは、特に何も結果はありません。

CURLOPT_SSL_VERIFYHOST で値1 は使え無い

『値 1 は、cURL 7.28.1 以降では使えなくなりました』とありますが、通常今まで PHP では false を指定して処理しています。テストでは、仮に true や 2 を指定しても動作しているようですが・・・。

この値は、SSL を使用する時に設定しますが、対となる CURLOPT_SSL_VERIFYPEER というオプションがあり、これこそ false にしないと動作しません。

CURLOPT_SSL_VERIFYPEER

SSL を使用する際に設定します。

FALSE を設定すると、cURL はサーバー証明書の検証を行いません。cURL 7.10 以降、デフォルト値は TRUE なので、false に明示的に設定する必要があります。

CURLOPT_POSTFIELDS

http でファイルをアップロードする際に使用します。ファイルを送信するには、ファイル名の先頭に @ をつけてフルパスを指定します

PHP 5.2.0 以降、このオプションに @ プレフィックスつきでファイルを渡したときは value が配列でなければならなくなりました
$data = array( 'target' => '@' . realpath("./lightbox_a.jpg") );
curl_setopt($curl, CURLOPT_POSTFIELDS, $data );
PHP 5.5.0 以降、@ プレフィックスは非推奨になりました。 また、ファイルを CURLFile で送信できるようになりました。 @ プレフィックスを無効化して、 @ で始まる値を安全に渡せるようにするには、 CURLOPT_SAFE_UPLOAD オプションを TRUE と設定します。 CURLOPT_VERBOSE デバッグトレースしたい時に使用。CURLOPT_STDERR で指定したファイルに出力されます
$handle = fopen("./debug.txt", "w");
curl_setopt($curl, CURLOPT_STDERR, $handle);
CURLOPT_WRITEHEADER 転送のヘッダ部分が書き込まれるファイルを指定します
$handle = fopen("./ret_header.txt", "w");
curl_setopt($curl, CURLOPT_WRITEHEADER, $handle);
CURLOPT_CONNECTTIMEOUT 接続の試行を待ち続ける秒数。いつも、30 ぐらいでテストしています。 ( 0 だと、タイムアウトなし ) CURLOPT_FTP_SSL マニュアル本文には無いけれど、投稿部分に記述があり、実際にそれで動作する事を確認しました。
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
CURLFTPSSL_NONE、CURLFTPSSL_TRY、CURLFTPSSL_CONTROL、CURLFTPSSL_ALL があるようです。 CURLOPT_HEADER TRUE を設定すると、ヘッダの内容も出力します。ですが、通常必要無いので false にします。 CURLOPT_URL 呼び出す対象です。http:// であったり、https:// であったり、ftp:// であったりします。ftp で SSL を使用する場合は、CURLOPT_FTP_SSL で指定して動作しています。https:// の場合は、CURLOPT_SSL_VERIFYPEER と CURLOPT_SSL_VERIFYHOST だけで動作します。(FTP でも指定します) CURLOPT_POST TRUE を設定すると、HTTP POST を行います。POST は、 application/x-www-form-urlencoded 形式で 行われます(一般的なものです)。データは、CURLOPT_POSTFIELDS で連想配列にして設定します CURLOPT_HTTPHEADER 設定する HTTP ヘッダフィールドの配列。 array('Content-type: text/plain', 'Content-length: 100') 形式です。 CURLOPT_FILE FTP で、転送内容が書き込まれるファイル。
$fp = fopen("./target.zip","w");
curl_setopt($ch, CURLOPT_FILE, $fp);
CURLOPT_PUT http の PUT コマンドや、FTP のアツプロード時に使用する( true にする )。ファイルアップロードは、CURLOPT_INFILESIZE と、CURLOPT_INFILE が必要になります
$file_path = "./winofsql.png";
curl_setopt($curl, CURLOPT_INFILESIZE, filesize ( $file_path ));
$handle = fopen($file_path, "r");
curl_setopt($curl, CURLOPT_INFILE, $handle);
CURLOPT_FOLLOWLOCATION TRUE を設定すると、サーバーが HTTP ヘッダの一部として送ってくる "Location: " ヘッダの内容をたどります (これは再帰的に行われます)。よって、リダイレクトを自動化したい場合、つまり最終的な結果だけ欲しい場合に使用します。 関連する記事 PHP の cURL でファイルアップロード PHP : cURL で FTP + SSL ダウンロード PHP の cURL で ftp サーバーにファイルをアップロードする(SSLなし) PHP + cURL で、Twitter API 1.1 の search/tweets を呼び出して、RSS に変換する ローカルの PHP を使ってコマンドプロンプトより簡単にバイナリファイルをアップロードする PHP : リモートのファイルサイズを取得する
posted by at 2014-07-31 21:04 | PHP | このブログの読者になる | 更新情報をチェックする

2014年07月09日

5秒毎にリロードする PHP ページ

( テストの為、5秒にしています )

META 要素の refresh を使用していますが、意図的に自分自身の URL を指定して、uniqid() を URL に付加してキャッシュの問題の可能性を排除しています
<?php
// ***********************************************
//
//  プログラム名 : 5秒毎にリロードするページ
//  作   成   者 : lightbox
//  作   成   日 : 2014/07/09
//
// ***********************************************
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta
	http-equiv="refresh"
	content="5;URL=<?php print $_SERVER['PHP_SELF']."?ld=".uniqid() ?>"
>
<title>5秒毎にリロードするページ</title>

</head>
<body>

<h1><?php print date("y/m/d H:i:s"); ?></h1>

</body>
</html>




posted by at 2014-07-09 14:39 | PHP | このブログの読者になる | 更新情報をチェックする

2014年06月06日

実用的かどうかは置いておいて、修正画面の日付入力に jQuery のカレンダーを使用する

関連する記事

実用的かどうかは置いておいて、修正画面のデータの初期表示について

入力フィールドをクリックすると、カレンダーが表示されます。
日付を初期表示すると、その日付でカレンダーが表示されます。



DOM を使用したコード
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>
<script type="text/javascript">
var datepicker_option = {
	dateFormat: 'yy/mm/dd',
	dayNamesMin: ['日', '月', '火', '水', '木', '金', '土'],
	monthNames:  ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
	showMonthAfterYear: true,
	yearSuffix: '年',
	changeYear: true,
	showAnim: 'fadeIn'
}
$(function() {
	$( "#birthday" ).datepicker(datepicker_option);
});
</script>

<script>

function check() {

	var pass = document.getElementById("pass").value;
	var text = document.getElementById("comment").value;

	if ( pass.trim() == "" ) {
		alert("パスワードが未入力です");
		document.getElementById("pass").focus();
		return false;
	}
	if ( text.length < 20 ) {
		alert("20文字以上の入力をお願いします");
		document.getElementById("comment").focus();
		document.getElementById("comment").select();
		return false;
	}

}
</script>
</head>
<body>
<span style="color:#ff0000;font-weight:bold;"><?= $_GET['err'] ?></span>
<form action="check.php" method="post" onsubmit="return check();"> 
	名前 <br>
	<input
		type="text"
		id="name"
		name="name"
		readonly
		style="background-color:#c0c0c0;"
		value="<?= $_GET['name'] ?>"><br> 

	備考 <br>
	<textarea
		id="comment"
		name="comment"
		style="width:400px;height:100px;"
		><?= $_GET['comment'] ?></textarea><br>

	パスワード<br>
	<input
		type="password"
		id="pass"
		name="pass"><br>

	生年月日<br>
	<input
		type="text"
		id="birthday"
		name="birthday" value="2014/1/1"><br>

<br>
<hr>

	<input type="submit" name="submit" value="送信"> 
</form>
</body>
</html>


jQuery による記述
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>
<script type="text/javascript">
var datepicker_option = {
	dateFormat: 'yy/mm/dd',
	dayNamesMin: ['日', '月', '火', '水', '木', '金', '土'],
	monthNames:  ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
	showMonthAfterYear: true,
	yearSuffix: '年',
	changeYear: true,
	showAnim: 'fadeIn'
}
$(function() {

	// ***********************************************
	// 更新ボタンがクリックされた時のみ確認
	// ***********************************************
	$( "#target_form" ).submit(function( event ) {

		var pass = $("#pass").val();
		var text = $("#comment").val();

		if ( pass.trim() == "" ) {
			alert("パスワードが未入力です");
			$("#pass").focus();
			event.preventDefault();
			return false;
		}
		if ( text.length < 20 ) {
			alert("20文字以上の入力をお願いします");
			$("#comment").focus();
			$("#comment").select();
			event.preventDefault();
			return;
		}

	});

	// ***********************************************
	// datepicker プラグイン
	// ***********************************************
	$("#birthday").datepicker(datepicker_option);


});
</script>
</head>
<body>
<span style="color:#ff0000;font-weight:bold;"><?= $_GET['err'] ?></span>
<form id="target_form" action="check.php" method="post"> 
	名前 <br>
	<input
		type="text"
		id="name"
		name="name"
		readonly
		style="background-color:#c0c0c0;"
		value="<?= $_GET['name'] ?>"><br> 

	備考 <br>
	<textarea
		id="comment"
		name="comment"
		style="width:400px;height:100px;"
		><?= $_GET['comment'] ?></textarea><br>

	パスワード<br>
	<input
		type="password"
		id="pass"
		name="pass"><br>

	生年月日<br>
	<input
		type="text"
		id="birthday"
		name="birthday"><br>

<br>
<hr>

	<input type="submit" name="submit" value="送信"> 
</form>
</body>
</html>




posted by at 2014-06-06 02:43 | PHP | このブログの読者になる | 更新情報をチェックする

2014年05月23日

PHPで使用する為にフォント(.TTC)の分解

昔は、BREAKTTC.EXE が使われていましたが、今は日本発の普通のリーソフトである UniteTTC で簡単に分解できます。

以下の記事は、メイリオを ttc から ttf に分解して利用する手順です

TCPDF で非埋め込み型として『メイリオ』を使う手順



関連する記事
posted by at 2014-05-23 23:52 | PHP | このブログの読者になる | 更新情報をチェックする

2014年04月10日

PHP : GD で Windows のビットマップを扱う


PHP : GD で Windows のビットマップを扱う


以前、GD => BMP の片方向を見つけて、手書きブログ用のオンラインハートエディタで利用したのですが、そのハートエディタの中身を再利用できるように整理する為に調べていると、BMP から GD への変換が前回見つけた PHP のオンラインマニュアルの投稿部分の違うページにある事が解りました。


以前は、関数一覧のページだったのですが、今回は imagecreate 関数のページでした。双方向ですし、サンプルソースも長くなるので上記リンクから参照できるようにしています。

一応、動く簡単なサンプルコードにはなっていますが、オリジナルと全く変わっていません
( 一部コメントが化けてたので日本語にしましたけれど )

処理の特徴としては、unpackpack 関数を使用してバイナリデータを本来の構造どおりに整備して処理しているところです。

フォーマットに使われている文字列は、1文字目が形式で、2文字目以降は『名前(任意)』です。
コード説明
aNUL で埋めた文字列
A空白で埋めた文字列
h十六進文字列、下位ニブルが先
H十六進文字列、上位ニブルが先
csigned char
Cunsigned char
ssigned short (常に 16 ビット、マシンのバイトオーダー)
Sunsigned short (常に 16 ビット、マシンのバイトオーダー)
nunsigned short (常に 16 ビット、ビッグエンディアンバイトオーダー)
vunsigned short (常に 16 ビット、リトルエンディアンバイトオーダー)
isigned integer (サイズおよびバイトオーダーはマシン依存)
Iunsigned integer (サイズおよびバイトオーダーはマシン依存)
lsigned long (常に 32 ビット、マシンのバイトオーダー)
Lunsigned long (常に 32 ビット、マシンのバイトオーダー)
Nunsigned long (常に 32 ビット、ビッグエンディアンバイトオーダー)
Vunsigned long (常に 32 ビット、リトルエンディアンバイトオーダー)
ffloat (サイズおよび表現はマシン依存)
ddouble (サイズおよび表現はマシン依存)
xNUL バイト
X1 バイト戻る
ZNUL 埋め文字列 (PHP 5.5 以降)
@絶対位置まで NUL で埋める
オリジナルコードへのリンク

to create an image from a BMP file

If you happen to need a way to output a Windows BMP file



タグ:PHP gd
posted by at 2014-04-10 03:05 | PHP | このブログの読者になる | 更新情報をチェックする

2014年03月15日

【PHP】 <?=$value?> ではない変数埋め込み手法



一般のファイル( file_get_contents で読み込めるテキストファイル ) の中に、{$GLOBALS['text1']} というような形で埋め込んだ部分に、他のファイルの内容を埋め込む処理です。

PHP として単純に実装するならば、require や include すれば良いのですが、この方法だと、どのような外部テキストでも利用可能です。

PHPのコード

▼ parse.php
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

// ****************************************************************
// テキストファイルを読み込んで、そこに埋め込まれた php 変数を
// 実際の値に置き換えます
// ****************************************************************

// 元となる表示部分
$view_text = file_get_contents( "parse.htm" );

// 埋め込むテキストを外部ファイルより取得し、
// どのようなスコープでも適用できるように、グローバル変数にセット
$GLOBALS['text1']		= del_comment( file_get_contents( "text1.txt" ) );
$GLOBALS['text2']		= del_comment( file_get_contents( "text2.txt" ) );
$GLOBALS['description']	= del_comment( file_get_contents( "description.txt" ) );

// 展開処理
$view_text = str_replace('"', '\\"', $view_text );
// 上の処理は、以下の処理内で $view_text 内に " が存在するとまずいからです。
eval("\$view_text = \"$view_text\";");

// 出力( この PHP の画面表示処理 )
print $view_text;

// ****************************************************************
// コメント削除関数
// ****************************************************************
function del_comment( $str ) {

	// ------------------------------------------------------
	// 独自コメント削除
	// ------------------------------------------------------
	$str = mb_ereg_replace( "([^\n/]*)//[^\n]*\n", "\\1\n", $str );
	return $str;
}

?>


画面定義(PHPから読み込みます)

▼ parse.htm
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>記事構成のヒント</title>
<style type="text/css">
* {
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
}

pre {
	font-size: 18px;
	width:400px;
	padding: 50px;
	border: 1px solid #cccccc;

	white-space: pre;
	white-space: pre-wrap;
	white-space: -pre-wrap;
	white-space: -o-pre-wrap;
	white-space: -moz-pre-wrap;
	white-space: -hp-pre-wrap;
	word-wrap: break-word;
}

h1 {
	width: 500px;
	font-size: 12px;
	line-height: 30px;
	border-style: solid;
	border-width: 1px;
	border-color: #9192A3;
	height: 30px;
	padding-left: 10px;
	background: url(h1.png) repeat-x 0px 0px;
}

</style>
</head>
<body>

<h1>プロローグ</h1>
<pre>
{$GLOBALS['text1']}
</pre>


<h1>ファーストコンタクト</h1>

<pre>
{$GLOBALS['text2']}
</pre>


<h1>※ 説明</h1>

<pre>
{$GLOBALS['description']}
</pre>
</body>
</html>


実行ページ

画面定義
テキスト1
テキスト2
説明テキスト



posted by at 2014-03-15 15:48 | PHP | このブログの読者になる | 更新情報をチェックする

2013年12月20日

PHPでサービス停止( extension=php_com_dotnet.dll )

PHP 5.3.15 / 5.4.5 以降は、php_com_dotnet.dll を php.ini で有効にしておく必要があります。また、WWW サーバが OS にアクセスするユーザの権限が Administrator である必要があり、デスクトップから実行する WWW サーバーでも、『管理者として実行』する必要のある環境もあります(通常はこの方法が必要です)。

以下の php を FORM から method="POST" で呼び出して、サービス名を引き渡すようにすればいいと思います
<?php

$str = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2";

$obj = new COM($str);

$ret = $obj->ExecQuery( "Select * from Win32_OperatingSystem" );

print "<PRE>";

foreach( $ret as $key => $target ) {
	print "{$target->Caption}\n";
	print "{$target->CSName}\n";
	print "$target->ServicePackMajorVersion";
	print ".{$target->ServicePackMinorVersion}\n";
	print "{$target->WindowsDirectory}\n";
	print "{$target->SystemDirectory}\n";
}

print "\n";
# **********************************************************
# Spooler ( 停止 )
# **********************************************************
$Query = "select * from Win32_Service where Name = 'Spooler'";
$RunningServices = $obj->ExecQuery($Query);
foreach( $RunningServices as $target ) {
	$ReturnCode = $target->StopService();
	print $ReturnCode;
}

# 終了待ち
$Cnt = 0;
while ( 1 ) {
	sleep( 1 );

	$RunningServices = $obj->ExecQuery($Query);
	foreach( $RunningServices as $target ) {
		$Result = $target->State;
	}

	if ( $Result == "Stopped" ) {
		print " -> Spooler Stopped";
		break;
	}

	$Cnt++;
	if ( $Cnt > 60 ) {
		print " -> Timeout";
		break;
	}

}

print "</PRE>";
print "OK";

?>

▼ 実行結果
Microsoft Windows 7 Professional 
PC名
1.0
C:\Windows
C:\Windows\system32

0 -> Spooler Stopped
OK
※ $ReturnCode が 0以外の場合はエラーです。
posted by at 2013-12-20 17:57 | PHP | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します