SQLの窓

2018年08月30日


PHP : 一定時間前のファイルの削除

めったに使わないので忘れがちですが、必要になった時に覚えていない。「あのコードどこに使ったっけ・・・」というコードです。

PATH_SEPARATOR は、検索パスのセパレータで、DIRECTORY_SEPARATOR は、ファイルにアクセスする為のパス内のセパレータです

デモページ
$basedir = realpath("../basic-php");

// ターゲットディレクトリの一覧
$dir_handle = @opendir($basedir);
if ( $dir_handle ) {
	$target = readdir( $dir_handle );
	while( $target !== false ) {
		print $target . "\n";
		$target = readdir( $dir_handle );
	}

	closedir( $dir_handle );
}

print "\n\n";

// 5分以上前に作成されたファイルを削除
$dir_handle = @opendir($basedir);
if ( $dir_handle ) {
	$target = readdir( $dir_handle );
	while( $target !== false ) {
		if ( $target == '.' || $target == '..' ) {
			// 対象外
			$target = readdir( $dir_handle );
			continue;
		}

		$astamp = stat($basedir.DIRECTORY_SEPARATOR.$target);
		$laststamp = $astamp[9];

		$lasttime = (int)((time() - $laststamp) / 60) . "." . ((time() - $laststamp) % 60);

		print "{$target} : {$lasttime}\n";

		// 一番最後の . 以降の文字列
		$ext = strrchr( $target, "." );
		// 全て小文字に変換
		$ext = strtolower($ext);
		// 目的の拡張子 のみ削除
		if ( $ext == ".data" ) {
			if ( $laststamp <= time() - 300 ) {
				@unlink($basedir.DIRECTORY_SEPARATOR.$target);
			}
		}
		$target = readdir( $dir_handle );
	}

	closedir( $dir_handle );
}





タグ:PHP
posted by lightbox at 2018-08-30 15:12 | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする

GD で画像縮小。『1) 単純縮小、2) 幅にあわす 3) 高さにあわす 4) 任意の幅と高さ』をその他の処理も含めてクラスでまとめ( class GD )

読み出す画像は、短縮 URL で動作確認しています。使用目的としては、画像をアップロードして縮小して保存する事ですが、保存前に必要ならば GD を使って修正をする事も想定しています。

デモページ
<?php
# 新しいオブジェクト
$GD = new GD();

# WEB よりイメージを作成
# 短縮url で動作します
$GD->LoadJpeg( "https://bit.ly/2MCYPI0" );

# 赤のパレットを作成
$red = $GD->CreateColor( 255, 0, 0 );

# 線の太さを設定
$GD->SetLineWidth( 3 );

# パラメータの処理
if ( ctype_digit( $_GET['x'] ) ) {
	$x = $_GET['x'];
}
else {
	$x = 135;
}
if ( ctype_digit( $_GET['y'] ) ) {
	$y = $_GET['y'];
}
else {
	$y = 118;
}

# 楕円を描画
$GD->Arc( $x, $y, 60, 35, $red );

# 黒のパレットを作成
$black = $GD->CreateColor( 0, 0, 0 );

# 白のパレットを作成
$white = $GD->CreateColor( 255, 255, 255 );

# 点線のスタイルを作成
$style = array(
	$black,$black,$black,$black,$black,
	$white,$white,$white,$white,$white
);

# 線の太さを設定
$GD->SetLineWidth( 1 );

# スタイルを使用して斜め線を描画
$GD->Line( 20, 30, 200, 100, $style );

# 指定の大きさで新しいオブジェクトを作成
//@$GD->Copy( $GD2, 0.3 );
//@$GD->CopyW( $GD2, 100 );
//@$GD->CopyH( $GD2, 200 );
@$GD->CopyWH( $GD2, 600, 400 );

# 縮小画像をファイルとして保存
$GD2->SaveJpeg( "uf3_001.jpg" );

# ブラウザに表示
$GD2->Response( );

# 後処理
$GD->DestroyColor( $red );
$GD->Destroy( );
$GD2->Destroy( );


# ***********************
# クラス
# ***********************
class GD {

	var $im;
	var $type;

# ***********************
# コンストラクタ
# ***********************
	function GD( ) {
	}

# ***********************
# キャンバス作成
# ***********************
	function CreateCanvas( $Width, $Height, $Type="PNG" ) {
		$this->type = $Type;
		$this->im = imagecreatetruecolor($Width, $Height);
	}

# ***********************
# PNG ロード
# ***********************
	function LoadPng( $Target ) {
		$this->type = "PNG";
		$this->im = @ImageCreateFromPng($Target);
	}
 
# ***********************
# JPEG ロード
# ***********************
	function LoadJpeg( $Target ) {
		$this->type = "JPEG";
		$this->im = @ImageCreateFromJpeg($Target);
	}

# ***********************
# 色リソース作成
# ***********************
	function CreateColor( $Red, $Green, $Blue ) {
		$ret = ImageColorAllocate (
			$this->im,
			$Red, $Green, $Blue );
		return $ret;
	}

# ***********************
# 線幅設定
# ***********************
	function SetLineWidth( $Width ) {
		ImageSetThickness( $this->im, $Width );
	}

# ***********************
# 直線の描画
# ***********************
	function Line( $x1, $y1, $x2, $y2, $Option ) {
		if ( is_array( $Option ) ) {
			ImageSetStyle( $this->im, $Option );
			ImageLine(
				$this->im, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED );
		}
		else {
			ImageLine(
				$this->im, $x1, $y1, $x2, $y2, $Option );
		}
	}

# ***********************
# 矩形の描画
# ***********************
	function Box( $x, $y, $w, $h, $Color, $fill=FALSE ) {
		if ( $fill ) {
			imageFilledRectAngle(
				$this->im, $x, $y, $x+$w, $y+$h, $Color );
		}
		else {
			ImageRectAngle(
				$this->im, $x, $y, $x+$w, $y+$h, $Color );
		}
	}

# ***********************
# 楕円の描画
# ***********************
	function Arc( $x, $y, $w, $h, $Color ) {
		ImageArc( $this->im, $x, $y, $w, $h, 0, 359, $Color );
	}

# ***********************
# ブラウザへ出力
# ***********************
	function Response( ) {
		switch( $this->type ) {
			case "PNG":
				header('Content-Type: image/png');
				ImagePng( $this->im );
				break;
			case "JPEG":
				header('Content-Type: image/jpeg');
				ImageJpeg( $this->im );
				break;
		}
	}

# ***********************
# PNG 保存
# ***********************
	function SavePng( $FilePath ) {
		ImagePng( $this->im, $FilePath );
	}

# ***********************
# JPEG 保存
# ***********************
	function SaveJpeg( $FilePath, $Quality=75 ) {
		ImageJpeg( $this->im, $FilePath, $Quality );
	}

# ***********************
# 色リソース開放
# ***********************
	function DestroyColor( $Color ) {
		ImageColorDeallocate( $this->im, $Color );
	}

# ***********************
# イメージの破棄
# ***********************
	function Destroy( ) {
		ImageDestroy ( $this->im );
	}

# ***********************
# 伸縮された新しいイメージの作成
# ***********************
	function Copy( &$New, $rate ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w * $rate, $h * $rate );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyW( &$New, $w_new ) {
		$w = ImageSx( $this->im );
		$rate = $w_new / $w;
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w_new, $h * $rate );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyH( &$New, $h_new ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$rate = $h_new / $h;
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w * $rate, $h_new );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyWH( &$New, $w_new, $h_new ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w_new, $h_new );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}
}




タグ:PHP gd
posted by lightbox at 2018-08-30 12:05 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2018年08月29日


PHP : 超簡易ログ

複雑な処理ですと、画面に表示しづらい場合があります。そんな時、その場限りのログです
file_put_contents( uniqid().".log", $vaiue );

// 以下は配列やオブジェクトを出力したい場合

file_put_contents( uniqid().".log", print_r( $_POST, true ) );







posted by lightbox at 2018-08-29 12:56 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2018年08月26日


ファイルを一つアップロード : FORM の target を IFRAME にして、PHP に JavaScript を書き出させて元のページにメッセージを表示させる

昨今、ファイルをアップロードするならば、JavsScript を駆使して UI を作成し、 $.ajax で送信したほうが簡潔になりますが、ベタな FORM の記述のみで送信してそれなりのレスポンスを得ようという処理です。

デモページ


画像をクリックするとデモページへ移動します

当然ですが、デモページで実際のアップロードはできません。しかし、結果を表示するにチェックを入れて送信すると、上の画像のように実際と同じ状態で情報をシミュレートします。

UI の構築を気楽に工夫できるように、twitter-bootstrap の 4.1.3 を組み込んでいます

IFRAME は本来非表示で、ここに JavaScript で右上のメッセージ(toastr.js)を表示するようにしていますが、デバッグ用としても使えるようにしており、その場合は PHP 側の $_FILES の中身が見れるようになっています。

type="file" の name 属性は target で固定して php 側で使用しています。
送信データの制限 データの制限はサーバに対する無意味なアクセスを遮断するアプローチと、アプリから見たデータの制限という二つのアプローチがあります。前者がもっとも重要で、それがなければ php.ini の upload_max_filesize 内であれば結果的にそのサイズまでは送信を許してしまいます。 ※ upload_max_filesize を超えると $_FILES そのものが空になるようです。 後者は、FORM 内の name="MAX_FILE_SIZE" の値で指定できますが、完全な対策ではありません。 そこで、対象ページのあるディレクトリの .htaccess 内に 『LimitRequestBody 102400』のように制限値を設定し、さらに『ErrorDocument 413』 を設定してそのページの中でエラー処理の対応をしています ▼ 413.html
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<style>
* {
	font-size: 32px;
}
</style>
<script>

	try {
		parent.$("iframe").show();
		parent.toastr.info( "ファイル のアップロードに失敗しました");
		parent.toastr.info( "エラー内容 : Request Entity Too Large" );
	}
	catch (e) {}

</script>
</head>
<body>

JavaScript の処理用に IFRAME を定義している場合で、
413 Request Entity Too Large が発生した場合にこのページが IFRAME 内に表示されます。

</body>
</html>


file_upload_html.php

$debug 変数で、実際のアップロードの可否を切り替えています。if ( !$_FILES ) { の部分は、upload_max_filesize を超えてしまった状態の対処ですが、ここでは LimitRequestBody 102400 を設定しているので発生する事はありません。
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

// *************************************
// 変数初期値
// *************************************
$debug = 0;
$upload_dir = "./upload";
if ( !$_FILES ) {
	// php.ini の upload_max_filesize を超えて、
	// Apache に制限が無いと $_FILE が空になる
	$_FILES['target']['error'] = 5;	// ユーザエラーメッセージ
}

// *************************************
// アップロード処理
// フィールド名 : target で固定
// *************************************
if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {

	// 公開状態では実行しない
	if ( $debug == 1 ) {

		$upload = realpath ( $upload_dir );
		$upload .= ( DIRECTORY_SEPARATOR . $_FILES['target']['name'] );
		if ( move_uploaded_file(
			$_FILES['target']['tmp_name'], $upload ) ) {
			$_POST['result']  = "アップロードに成功しました";
		}
		else {
			if ( !$_FILES ) {
				$_FILES['target']['error'] = 5;	// ユーザエラーメッセージ
			}
			$_POST['result']  = "アップロードに失敗しました";
		}

	}
	else {
		if ( $_FILES['target']['error'] == 0 ) {
			$_POST['result']  = "アップロードに成功しました";
		}
		else {
			$_POST['result']  = "アップロードに失敗しました";
		}
	}

}
else {
	$_POST['result']  = "POST メソッドを使用して下さい";
}

$_POST['files'] = $_FILES;

// *************************************
// この JSON 文字列を HTML 内の json
// オブジェクト定義として埋め込みます
// *************************************
$json = json_encode($_POST, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );


// *************************************
// 画面定義
// *************************************
?>
<!DOCTYPE html>
<html lang="ja">
<style>
/* calc 用 */
html,body {
	height: 100%;
}
body {
	margin: 0;
}

* {
	font-size: 16px;
	font-family: "ヒラギノ角ゴPro W6","Hiragino Kaku Gothic Pro W6","メイリオ",Meiryo,"MS Pゴシック",Verdana,Arial,Helvetica,sans-serif;
}
</style>
<script>
var message = <?php require("error.json.php") ?>
var json = <?= $json ?>;

if ( json.files.target.error == 0 ) {
	parent.toastr.info(json.files.target.name + " がアップロードされました");
	parent.toastr.info("ファイルサイズ : " + json.files.target.size);
}
else {
	parent.toastr.info(json.files.target.name + " のアップロードに失敗しました");
	parent.toastr.info("エラー内容 : " + message.error[json.files.target.error]);
}

<?php if( $_POST["disp_result"] == "1" ) { ?>

	parent.$("iframe[name='upload']")
		.css("border", "1px solid #c0c0c0")
		.show();

<?php } else { ?>

	parent.$("iframe[name='upload']").hide();

<?php } ?>

</script>
</head>
<body>
<?php if( $_POST["disp_result"] == "1" ) { ?>
<textarea style='width:calc(100% - 6px);height:calc(100% - 14px);'><?= $json ?></textarea>

<?php } ?>
</body>
</html>


error.json.php は、PHP のエラーメッセージです。ここでは部品として埋め込んでいますが、$.ajax バージョンでも使用(error.json.php?type=json)しています。

error.json.php
<?php
if ( $_GET["type"] == "json" ) {
	session_cache_limiter('nocache');
	session_start();
	header( "Content-Type: application/json; charset=utf-8" );
}

?>
{
	"error": [
		"0 - 正常終了",
		"1 - アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています",
		"2 - アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています",
		"3 - アップロードされたファイルは一部のみしかアップロードされていません",
		"4 - ファイルはアップロードされませんでした",
		"5 - 『アップロードに失敗しました』",
		"6 - テンポラリフォルダがありません。PHP 5.0.3 で導入されました",
		"7 - ディスクへの書き込みに失敗しました。PHP 5.1.0 で導入されました",
		"8 - PHP の拡張モジュールがファイルのアップロードを中止しました"
	]
}


upload.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<title>HTML の FORM のみでファイルを一つアップロードする</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link id="link" rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>

<!-- 共通の表示 -->
<link rel="stylesheet" href="common.css">

<!-- CSS の指定 -->
<style>
#top {
	height: 420px;
}
iframe {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - 420px - 2px );
}

/* PC 用の表示 */
@media screen and ( min-width:480px ) {
	#content {
		margin: 16px;
	}
}
/* スマホ用の表示 */
@media screen and ( max-width:479px ) {
	#content {
		margin: 0px;
	}
	body {
		width: 100%!important;
		margin: 0px;
	}
	.unit {
		width: 100%;
	}
	.btn {
		margin-top: 7px;
	}
}
</style>
<script>
// 簡易的なスマホチェックを jQuery のプロパティとして登録
jQuery.isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
if ( $.isMobile ) {
	// スマホの場合は表示画面下の中央
	toastr.options.positionClass = "toast-bottom-center";
}

$(function(){

	// このページ自身の QRコードの表示
	$('#qrcode')
		.css({ "margin" : "2px" })
		.qrcode({width: 160,height: 160,text: location.href });
		

});
</script>
</head>
<body>
<div id="top">
	<div id="head">
		<div id="title">
			<a href="./">One File アップロード</a>
		</div>
	</div>

	<div id="content">
		<form target="upload" enctype="multipart/form-data" action="../../php_upload/file_upload_html.php" method="POST">
			<input type="hidden" name="MAX_FILE_SIZE" value="40000">
			<input name="target" type="file" class="btn btn-info">
			<input type="submit" value="ファイルを送信" class="btn btn-success ml-2">

			<p>
				<label for="disp_result">結果を表示する</label>
				<input id="disp_result" type="checkbox" name="disp_result" value="1" class="mt-5" checked>
			</p>
		</form>

		<div id="qrcode"></div>

	</div>

</div>


<iframe src="about:blank" name="upload" style="display:none;border:0px solid #c0c0c0;width:100%;"></iframe>



</body>
</html>


common.css
@charset "UTF-8";

/* calc 用 */
html,body {
	height: 100%;
}
body {
	margin: 0;
}

/* 共通の表示 */
* {
	font-size: 16px;
	font-family: "ヒラギノ角ゴPro W6","Hiragino Kaku Gothic Pro W6","メイリオ",Meiryo,"MS Pゴシック",Verdana,Arial,Helvetica,sans-serif;
}
#head {
	background-color: #404040;
	padding: 10px 0 10px 25px;
}
#head * {
	color: #ffffff;
}



HTML 側のダウンロード



PHP 側のダウンロード





posted by lightbox at 2018-08-26 21:35 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2018年08月25日


Oracle : ユーザ(スキーマ)の作成

他のデータベースと違って、Oracle ではユーザを作成する事は、create database と同じ意味になりますが、ユーザだけ作成しても権限が全く無く、利用可能にするには権限を持つユーザが、権限を与える必要があります。

開発環境が一つの Oracle の場合はやみくもに以下の処理を行う事はできませんが、PC 内に自由に使える Oracle をインストールした場合は以下の手順でユーザを作成するといいと思います。

1) 作成するユーザ専用のテーブルスペース作成
 ( テーブルスペースは共有できますが、開発管理上別々のほうが良い )
2) ユーザ作成
3) 権限を与える

※ 一連の作業は SYSTEM ユーザで行って下さい。

create tablespace LIGHTBOX_SPACE
	datafile 'C:\ORACLEXE\ORADATA\XE\LIGHTBOX.DBF'
	size 5M
	autoextend on
	next 1M
	maxsize unlimited
	segment space management AUTO;

create user LIGHTBOX
	identified by LIGHTBOX
	default tablespace LIGHTBOX_SPACE
	temporary tablespace TEMP
	quota unlimited on LIGHTBOX_SPACE
	account UNLOCK;

grant 
	 ALTER PROFILE
	,ALTER SESSION
	,ALTER SYSTEM
	,ALTER TABLESPACE
	,ALTER USER
	,CREATE ANY DIRECTORY
	,CREATE PROCEDURE
	,CREATE PROFILE
	,CREATE PUBLIC SYNONYM
	,CREATE ROLE
	,CREATE ROLLBACK SEGMENT
	,CREATE SEQUENCE
	,CREATE SESSION
	,CREATE SYNONYM
	,CREATE TABLE
	,CREATE TABLESPACE
	,CREATE TRIGGER
	,CREATE VIEW
	,DROP ANY DIRECTORY
	,EXECUTE ANY PROCEDURE
	,SELECT ANY DICTIONARY
	,SELECT ANY SEQUENCE
	,SELECT ANY TABLE
to LIGHTBOX;

TEMP は、Oracle をインストールした時に作成される一般的な一時用表領域です。一つの PC で開発環境を作るのであれば TEMP を使うといいと思います。

datafile の場所は、ハードディスクであればどこでもいいですが、開発管理上、既にインストールされている場所が良いと思います。拡張子は .dbf である必要はありません。ユーザが作成した表領域である事を明示する為に、.ORA のように変更してもかまいません。


関連する記事

Oracle 10g Express Edition のインストール
サービス開始 : Oracle 10g Express
Oracle インストール後の初期設定

Oracle11g + Windows : PC名を変更してしまった場合の対処方法



posted by lightbox at 2018-08-25 23:26 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

2018年08月10日


IE11 で『安全だとマークされていないActiveX』を使用可能にして実行可能な Windows 処理のサンプル

HTA(HTMLアプリケーション) のコードを html として IE11 でデバッグする方法 を行って、localhost や イントラネットのサーバを信頼するサイトに登録すると使えます。

実行は JavaScript で簡単な関数を用意して実行します。
ごみ箱 explorer.exe /n,::{645FF040-5081-101B-9F08-00AA002F954E}
ファイル名を指定して実行 rundll32.exe shell32.dll,#61
インイストールされたソフトウェア(プログラムと機能) rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl
ネットワーク接続 rundll32.exe shell32.dll,Control_RunDLL ncpa.cpl
環境変数ダイアログ rundll32.exe sysdm.cpl,EditEnvironmentVariables
Windows Update control.exe /name Microsoft.WindowsUpdate
デバイスマネージャ control.exe /name Microsoft.DeviceManager
フォルダオプション rundll32.exe shell32.dll,Options_RunDLL 7
ネットワークドライブの割り当てダイアログ rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL Connect
デスクトップアイコンの設定 control.exe desk.cpl,,0
メモ帳 notepad.exe
ペイント mspaint.exe
電卓 calc.exe
プリンタ一覧 control.exe /name Microsoft.DevicesAndPrinters
Microsoft Excel excel.exe
Microsoft Word winword.exe
マイドキュメント explorer C:\Users\%USERNAME%\Documents
リソープリンタ 管理ページ rundll32.exe url.dll,FileProtocolHandler http://192.168.10.37/
デスクトップの アプリケーション.mde C:\Users\%USERNAME%\Desktop\アプリケーション.mde
デスクトップの Book1.xlsx C:\Users\%USERNAME%\Desktop\Book1.xlsx
\\コンピューター名\共有 \\pc01\mydata\2018

用意する JavaScript の処理
<script>
function newObject( className ) {

	var obj;

	try {
		obj = new ActiveXObject( className );
	}
	catch (e) {
		obj = null;
	}

	return obj;

}

var wsh = newObject("WScript.Shell");

function wshRun( strPath ) {

	wsh.Run( "RunDLL32.EXE url.dll,FileProtocolHandler " + "\"" + strPath + "\"" )

}

function wshRunExe( strPath ) {

	wsh.Run( strPath )

}

</script>

Windows の一般アプリケーション(.exe) は、wshRunExe を使用します。拡張子による実行には、ファイルのパスを渡して wshRun を使用します。( strPath に渡すパス内の文字列は HTML 上に文字列として置く場合、 \ が \\ となるようにします )

\\コンピューター名\共有 のネットワーク参照は、A 要素で href に指定してエクスプローラで開く事ができます。




posted by lightbox at 2018-08-10 16:38 | IE | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり