2010年07月11日


WEB 画面の説明時に不必要なコンテンツを削除してから画面をキャプチャする

Seesaa_01

上の画面は、Seesaa のブログ管理画面ですが、本来右上に広告があり、右サイド
には、「アバターをブログに貼ろう!」と言うような 一連のSeesaa 側のコンテ
ンツがありますが、これを削除してからキャプチャしています。

これを行うには、Firefox に Firebug をインストールしてから画面を表示して、
そのコンテンツにカーソルを合わせて右クリックします。

Seesaa_02

そうするとポップアップメニューに「要素を調査」という項目があるので選択し
ます。すると、Firebug が表示されて、その要素が HTML 上で選択されます。

HTML の構成ツリー上でカーソルを動かすと、実際の画面上で位置表示がされます
ので、正確に必要無いコンテンツの位置で右クリックしてポップアップメニュー
を表示し、「要素を削除」を実行します。

Seesaa_03

Seesaa_04

そうすると、その要素が削除された画面が一時的に出来上がります。

Seesaa_05

このような操作を繰り返す事によって、必要なコンテンツのみが表示される画像
を作成する事ができます


posted by at 2010-07-11 13:31 | テクニック | このブログの読者になる | 更新情報をチェックする

2010年07月03日


VBScript : TCPDF 用埋め込みフォント作成スクリプト


VBScript : TCPDF 用埋め込みフォント作成( 日本語フリーフォント )
実行は、Windows で行います。出来上がったファイルを TCPDF ごと アップロードしても良いですし、.php と .z と .cfg.z ファイルを WEBサーバーの TCPDF のフォントディレクトリにアップロードしても いいです。
posted by at 2010-07-03 21:24 | ツール | このブログの読者になる | 更新情報をチェックする

2010年06月27日


VBScript : TCPDFで MS ゴシック、MS Pゴシック、MS UIゴシック、MS 明朝、MS P明朝を非埋め込み型で利用できるように全てを自動化したスクリプトを作成時に気が付いたTCPDFに関する3つの誤解


VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト
とにかく手作業ではとても時間がかかるので、全て自動化しました。それでも結構な 時間がかかります。3分くらいは待たないといけないと思います。 そもそも、方法として誤解が多かったのが印象です。チータエンジニアってところで いろいろ日本語サポートしてくれているのですが、日本語訳が中途半端で事実を誤解 するような日本語です。 まず第一に、TCPDF は FPDF から引き継がれているはずなので、元々 FPDF は非埋め 込み型で動作していました。一通り実装したので、そのへんは間違い無いです。 TCPDF も、非埋め込み型にする事ができます。職種によっては、それではまずい事が あるのは承知していますが、システム的には、フォントデータを埋め込むのはよろし くありません。その PC に そのフォントが無いと表示不可能になりますが、アプリケ ーションとしては、「読めれば」良いので、MS の通常フォントが欲しいのです。 ※ MS ゴシック、MS Pゴシック、MS UIゴシック、MS 明朝、MS P明朝 誤解その1 で、サンプルとして実装されていたのが何故か、Arial Unicode MS です。こんなフォ ントがあったなんて、この作業で初めて気が付きましたが、これは PC にフォント データのある「非埋め込み型」です。サンプルそのものがそもそも、フォントデータ を必要としない日本語フォントなのです。 誤解その2 さらに、新しいフォントを作成する下りでは、一応日本語フォントの追加の手順を 想定しているようなのですが、イタリックやボールドを実装するのに、出来上がった フォントファイルをコピーして増産するように読み取れます。ここは、フォントに ついては素人なので、良くは解らないところですが、調べた限りMSのフォントにイ タリック文字としての書体は無く、実装はアプリケーションでしているようなのです。 で、.php 定義ファイルは一つしか必要無い。 ※ 結局イタリックはできません。以下はイタリック指定した結果です 元々利用可能なフォントに加えて、MSフォントの印字サンプルです 誤解その3 チータエンジニアでの記述は、全てフォントを埋め込む事を前提に書かれています。 要するにこれが職種としての方向性の違いによる誤解の元ですが、きちんと README 読まないと、非埋め込み型の引数については知る事ができません。さらに、古い記述 では、非埋め込みにする古い方法しか乗っておらず、知らないとそれでいいのかと 思ってしまいますし、文字化けの対処にいたっては、サンプルそのものが化けてます し。つまり、フォントの埋め込みと非埋め込みの違いをはっきりさせるには、 REEADME 読みましょう。という事になります。
posted by at 2010-06-27 14:30 | ツール | このブログの読者になる | 更新情報をチェックする

2010年06月26日


VBScript : maglog 既存記事ページの取得

次に、投稿( 更新 ) するつもりです。
アップロードのフォーマットは調査済です。

とにかく死ぬほど重たいので、アプリでコントロールするようにと思っていますが、
それでもやはり重たいので、最終的には VB.net でスレッドにする必要があるかも
解りません( あまり長い場合は終了してリトライ )

この手の作業用のスケルトンを作ったので、そのテストも兼ねています。
なので、Function 部分はいずれ、ホスティングしてすっきりするつもりです
<JOB>
<COMMENT>
************************************************************
■ maglog 記事ページ読み出し

base : WEB アクセススケルトン( web_access.wsf )

■ 著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
************************************************************
</COMMENT>

<OBJECT id="objHTTP" progid="Msxml2.XMLHTTP" />
<OBJECT id="Stream" progid="ADODB.Stream" />
<OBJECT id="Stream2" progid="ADODB.Stream" />
<OBJECT id="StreamBin" progid="ADODB.Stream" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
bDebug = False

user = "ユーザー"
pass = "パスワード"

strBlogName = "lightbox"
strArticleNo = "713301"

strTargetUrl1 = "http://maglog.jp/"&strBlogName&"/index.php?&module=Login&action=LoginDef"
strTargetUrl2 = "https://passport.vector.co.jp/passport/passport.php?p=VP_PROC_LOGIN_EXECUTE&f=VT"
strTargetUrl3 = "http://maglog.jp/"&strBlogName&"/index.php?module=Article&action=Edit&article_id="&strArticleNo

' 追加書き込み
Set LogFile = Fso.OpenTextFile( "web_access.log", 8, True )
LogFile.WriteLine( "処理を開始しました" )

' ***********************************************************
' (1) : GET
' ***********************************************************
Call objHTTP.Open("GET",strTargetUrl1, False)
Call objHTTP.Send()

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page1.htm", objHTTP.responseBody )


' ***********************************************************
' (2) : POST
' ***********************************************************
Call objHTTP.Open("POST",strTargetUrl2,False)
' POST 用ヘッダ
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = ""
strData = strData & "VP_UID="&user
strData = strData & "&VP_PW="&pass
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page2.htm", objHTTP.responseBody )

' ***********************************************************
' (3) : GET
' ***********************************************************
Call objHTTP.Open("GET",strTargetUrl3, False)
Call objHTTP.Send()

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page3.htm", objHTTP.responseBody )


' ***********************************************************
' 処理終了
' ***********************************************************
LogFile.WriteLine( "処理を終了しました" & vbCrLf & vbCrLf )
LogFile.Close()
Wscript.Echo "処理が終了しました"
Wscript.Quit




' ***********************************************************
' ソース内テキストデータの取得
' ***********************************************************
Function GetMyText( strName )

	GetMyText = RegTrim(GetResource(strName))

End Function

' ***********************************************************
' 文字列前後の漢字スペースを含むホワイトスペースの削除
' ***********************************************************
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function

' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce( )

	Dim base_str,str,I,nLen,Random
	base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"

	nLen = Len(base_str)

	str = ""
	For I = 1 to 32
		Randomize
		Random = 1 + Int(Rnd * nLen)
		str = str & Mid(base_str,Random,1)
	Next

	Nonce = str

End function

' ********************************************************** 
' Unix タイムスタンプ 
' ********************************************************** 
Function UnixTimestamp( )

	UnixTimestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now)) 

End Function

' ***********************************************************
' boundary 作成 ( Unix タイムスタンプ そのままでも可 )
' ***********************************************************
Function GetBoundary( )

	GetBoundary = "---------------------------" & UnixTimestamp()

End Function

' ***********************************************************
' バイナリデータの保存( 上書き )
' ***********************************************************
Function WriteBinData( strFile, BinData )

	Stream.Open
	Stream.Type = 1 ' バイナリ
	Stream.Write BinData
	Stream.SaveToFile strFile, 2
	Stream.Close

End Function

' ***********************************************************
' fromCharset を toCharset に変換して URLエンコード
' ※ 全ての文字をパーセントエンコーディングします
' ***********************************************************
Function URLEncode(str,fromCharset,toCharset)

	Stream.Open
	Stream.Charset = fromCharset
	Stream.WriteText str
	' コピーの為にデータポインタを先頭にセット
	Stream.Position = 0
 
	Stream2.Open
	Stream2.Charset = toCharset
	Stream.CopyTo Stream2
	Stream.Close

	' コピーの為にデータポインタを先頭にセット
	Stream2.Position = 0

	' バイナリで開く
	StreamBin.Open
 	StreamBin.Type = 1

	' テキストをバイナリに変換
	Stream2.CopyTo StreamBin
	Stream2.Close

	' 読み込みの為にデータポインタを先頭にセット
	StreamBin.Position = 0

	Buffer = ""
	if UCase( toCharset ) = "UTF-8" then
		StreamBin.Read(3)
	end if
	Do while not StreamBin.EOS
		LineBuffer = StreamBin.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) = 1 then
				Buffer = Buffer & "%0" & Cwork
			else
				Buffer = Buffer & "%" & Cwork
			end if
		Next
 
	Loop

	StreamBin.Close

	URLEncode = Buffer

End Function

' ***********************************************************
' 仕様を明確にする為に単純変換
' ***********************************************************
Function rfc3986_convert(str)

	Dim strResult,I,strWork

	strResult = str

	strResult = Replace(strResult,"%2D", "-")
	strResult = Replace(strResult,"%2E", ".")

	' 0〜9
	For I = &H30 to &H39
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	' A〜Z
	For I = &H41 to &H5A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%5F", "_")

	' a〜z
	For I = &H61 to &H7A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%7E", "~")
	
	rfc3986_convert = strResult

End Function
</SCRIPT>

<COMMENT>
************************************************************
 ソース内テキストデータ
************************************************************
</COMMENT>
<RESOURCE id="myTextData">
<![CDATA[
]]>
</RESOURCE>

</JOB>



posted by at 2010-06-26 11:25 | HTTP | このブログの読者になる | 更新情報をチェックする

2010年03月22日


LaCoocan の PHP でエラーを表示する

テストしたい.php をテストする場合は、適当に以下のようなコード
を作成して実行させて下さい。

<?
ini_set( 'display_errors', "1" );

include( 'テストしたい.php' )
?>

関連する PHP オンラインの情報

http://php.benscom.com/manual/ja/ref.errorfunc.php
( petrov dot michael () gmail com )

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

2010年03月01日


LaCoocanサービス : メール転送機能の拡張

LaCoocan のメールアドレスは、転送に1つ、49個を CGI 実行に割り当てる事ができますが、PHP を使って sendmail で簡単に 49 個にも転送機能を付加できます。
( ※ From にユーザのアドレスを使う必要があります )
Lacoocan_mail
※ ラジオボタンは個別に設定しなおす場合の選択用です
@nifty LaCoocan で PHP を利用したメール転送処理

本来PHP単独でメールを送る場合はメールヘッダやエンコード等面倒ですが、転送の場合はメールデータがそのまま受け取れるので逆にデコードしていろいろ機能を付加する事になると思います。その際に必要な機能が、Pear の Mail_mimeDecodeですが、これは自分で Windows 上で Pear を取り出してサーバーに配置するのが最も簡単ですが、知らないとこれもなかなか面倒なので、手順を以下のリンク先に示します。が、ダウンロードできるものも用意しましたのでそれを使う事もできます。

PHP 5.2.11 で Pear インストール
Mail_mimeDecode

ブラウザでダウンロード
関連する記事

nifty LaCoocan の PHP 注意事項


posted by at 2010-03-01 21:49 | LaCoocan | このブログの読者になる | 更新情報をチェックする

Seesaa : 記事テンプレートの同一カテゴリのリンクのタイトル表示を完全にする

デフォルトですと、text_summary(20) となっていて、20文字より多くなると
省略されてしまいます。これでは、読んでる人が何の事かわからず、内部的
なアクセス誘導になりません。で、100くらいにするといいでしょう。

<!-- 同一カテゴリの最新記事 -->
<% if:list_category_article -%>
<div class="listCategoryArticle">
【<% article_category.name %>の最新記事】<br />
<ul>
<% loop:list_category_article %>
<li><a href="<% article.page_url %>"><% article.subject | text_summary(100) %></a></li>
<% /loop %>
</ul>
</div>
<% /if %>



posted by at 2010-03-01 11:12 | Seesaa | このブログの読者になる | 更新情報をチェックする

レンタルサーバ : FTPS機能

フリーのレンタルサーバーはともかくとして、Gumblar(ガンブラー)の影響により
各社の対応が先月行われたようです。

さくらインターネットは 2010年2月16日
ロリポップは 2010年02月04日 

より対応されています。

他社は使っていないので知りませんが、それ相応の会社ならば
この時期にしていないと競争力が落ちるでしょうから。
あ、それからさくらインターネットは以前より SFTP が使えています
FTPS と SFTP はポートが違う別物ですがどちらもセキュリティ用です。
FTPS は 通常の 21 番を使い、SFTP は 22 番を使います


そんな中、LaCoocan はのんびりしたもので、海外からの FTP 接続
を禁止しながら FTP の IP による制限機能を追加しています。この
機能は さくらインターネットでも実装されましたが、さくらでは
全て手動で行う為、FTP で接続できなくなる環境が発生します。現時点
でのこのトラブルに対する対応方法はおそまつなものです。それに
比べて LaCoocan は WEBアプリでサービス化しているところが一般ユーザ
には優しいのですが・・・・

FTPS を使え無いのは専門家からは評価を得られないでしょう > LaCoocan

と言うか、LaCoocan と さくらインターネットを比べる気にもなりません。
全く対象ユーザーを別に絞ったサービスだと考えてよく、専門家ならば
迷わずというか、絶対にさくらインターネットでなければなりません。

一般ユーザーならば、LaCoocan は何かと使いやすくなっています。
でも Linux なんですけどね。


それと、land.to は無料サーバーなので全くそういう予定は無く、ここも
途中からは Linux 使っています関連する記事

さくらインターネットが、FTPS機能を2010年2月16日より対応しましたが・・・



タグ:FTPS
posted by at 2010-03-01 09:16 | レンタルサーバー | このブログの読者になる | 更新情報をチェックする

2009年07月03日


prototype.js の Ajax.Request を使い、FORM を使わずにデータをPOSTする

MSXML2.XMLHTTPでファイルをPOSTする と同系列で、IE で実行する場合、結局prototype.js内では
MSXML2.XMLHTTPを使っています。VBScriptで通常のアプリケーションとして実行する
場合と違って、同一ドメイン内でのみ実行可能です。
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}

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

	// ファイルへ入力されたデータを書き込み
	file_put_contents( "text.dat", $_POST['text'] );
	print "データはUTF-8で受信しています";
	exit();

}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />

<script
	src="http://www.google.com/jsapi"
	type="text/javascript"
	charset="utf-8"
></script>
<script type="text/javascript">

// Google で HOSTINGされているライブラリを使う
google.load("prototype", "1.6");

// *********************************************************
// HTTP 通信
// *********************************************************
function postText(text) {

	// ■ サーバー側コードは 自分自身
	// ■ GET
	// ■ 同期処理
	// ■ target=filename
	// オブジェクト作成 = イベント作成です
	new Ajax.Request("<?= $_SERVER['PHP_SELF'] ?>",
	{
		method: "post",
		asynchronous: false,
		parameters: { "text" : text },

		onSuccess: function(request) {
			// 成功した事が保証される
		},
		onComplete: function(request) {
			$("text").value = request.responseText;
		},
		onFailure: function(request) {
			alert('読み込みに失敗しました   ');
		}
	}
	);
}

</script>

</head>
<body>

<input type=button value="初期画面" onClick='location.href="<?= $_SERVER['PHP_SELF'] ?>"'>
&nbsp;
<input type=button value="HTTP通信" onClick='postText($("text").value);'>
<br>
<textarea id=text name=text cols=80 rows=15></textarea>


</body>
</html>

■ 関連する記事
prototype.js の Ajax.Request の encoding パラメータ


posted by at 2009-07-03 15:31 | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする

2009年06月15日


DIRECTORY_SEPARATOR等 : OSによって内容が変化する定数

一般的にWEBと言えば、unix か linux でしょうが、Windows サーバーも無いわけではありませんし、業務的に言えば社内サーバーは Microsoft である事は十分考えられますし、どちらでも稼動できるようにしておくのは、やはり必要な事ではあります。
( 商品じゃ無い急いでるやっつけ仕事の場合は面倒なのでしませんが )

最も使う可能性の高そうなのは、PATH_SEPARATOR を使って set_include_path を実行する事かもしれません。

以前、コードでこんなふうに書いた事もありました
$sep = substr( strtoupper( php_uname("s") ), 0, 7 ) == 'WINDOWS' ? ";" : ":";
set_include_path( ".$sep../pear/zip" );


unixwindows
DIRECTORY_SEPARATOR /\
PHP_SHLIB_SUFFIX sodll
PATH_SEPARATOR :;
(コロン)セミコロン

関連する PHP ドキュメント

php_uname
set_include_path



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