SQLの窓

2010年02月06日


Mechanize : クラスのメソッドをオーバライドしてヘッダーを送れるようにしてiPhoneとしてサーバに認識させる

このサンプルの処理では、iPhone である必要は無いのですがあくまで
サンプルとして処理されています。実際は、Seesaa の自分のブログを
呼び出して、iPhone 用のページが返される事を確認しました

post メソッドは元々のメソッドのコードからファイルアップロード
の機能を省いてヘッダーを渡すようにしただけです。

post_form は、元々ヘツダーを渡せるのですが、プライベートメソッド
なのでこのような使い方になります。
#!/usr/local/bin/ruby
print "Content-type: text/html; Charset=shift_jis\n\n"

# エラーを出力する為の処理
$stderr = $stdout

# Ruby 本体をWEBアプリとして使う時の為の定義
# ( ここでは使っていません )
require "cgi"
cgi = CGI.new
require 'uri'

# さくらインターネットで WWW::Mechanize をインストールして
# 利用するのに必要だった定義
ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'
# **********************************************************
# 処理本体
# **********************************************************

# WWW::Mechanize の post メソッドをオーバーライド
# ※ ファイルのアップロードは使わないので削除しています
# ※ カスタムヘッダーを渡せるようにしています
class WWW::Mechanize 
	def post(url, query= {}, headers = {}) 
		node = {} 
		# Create a fake form 
		class << node 
			def search(*args); []; end 
		end 
		node['method'] = 'POST' 
		node['enctype'] = 'application/x-www-form-urlencoded' 
 
		form = Form.new(node) 
		query.each { |k,v| 
			form.fields << Form::Field.new(k.to_s,v) 
		} 
		post_form(url, form, headers) 
	end 
end 

agent = WWW::Mechanize.new

# 呼び出しタイムアウト設定
# ( \ で継続行 )
agent.open_timeout \
	= 60 * 10
# ( = 演算子で継続行 )
agent.read_timeout =
	60 * 10

url = 'WEBアプリケーションのURL'
fld = {}
fld['SendButton'] = '一括'
fld['CommandField'] = 'パスワード'
fld['mid'] = 'CprogBase'

custom_header = {}
custom_header['User-Agent'] = 
'Mozilla/5.0 ' \
'(iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)' \
' AppleWebKit/528.18 ' \
'(KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'

page = agent.post(url, fld, custom_header)

print "ok"

関連する記事

Ruby : 自作WEBアプリケーションの呼び出しに使って機能を拡張する




タグ:ruby Mechanize
posted by lightbox at 2010-02-06 16:40 | Ruby | このブログの読者になる | 更新情報をチェックする

Ruby : 自作WEBアプリケーションの呼び出しに使って機能を拡張する

Ruby の Mechanize を使って自分が作った WEBアプリケーションの機能拡張を比較的簡単に実装できます。この例のアプリケーションの処理がある分類毎なので、それをある程度一括で処理してしまおうというものです。運用上の処理として、対象が多くなると手作業では大変になりますので、利用してみました。

注意するのは、この場合サーバから Perl の cgi を呼び出すので、あまり大量の処理を行うとサーバーに負荷をかけすぎる事になるので、注意して数を調整する配慮は必要となります。

ここで指定しているタイムアウトは、CPU の負荷では無く、一回の呼び出しがネットワークなのでそのタイムアウトになります。

ここで利用している agent.post は、標準のメソッドですが、これを拡張する方法もあります。

※ 以下のサンプルコードでは、継続行の使い方のガイドラインも示しています
#!/usr/local/bin/ruby
print "Content-type: text/html; Charset=shift_jis\n\n"

# エラーを出力する為の処理
$stderr = $stdout

# Ruby 本体をWEBアプリとして使う時の為の定義
# ( ここでは使っていません )
require "cgi"
cgi = CGI.new
require 'uri'

# さくらインターネットで WWW::Mechanize をインストールして
# 利用するのに必要だった定義
ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'
# **********************************************************
# 処理本体
# **********************************************************

agent = WWW::Mechanize.new

# 呼び出しタイムアウト設定
# ( \ で継続行 )
agent.open_timeout \
	= 60 * 10
# ( = 演算子で継続行 )
agent.read_timeout =
	60 * 10

# ループ処理用配列
mid = [ 
'CprogBase' \
,'CommonSpec' 
]

# 以下だと継続行はいりません
mid = [ 
'CprogBase',
'CommonSpec' 
]

p mid
print "<br>"

# 配列の要素ぶんの繰り返し処理
(mid.length).times { |i|
	agent.post('WEBアプリケーションのURL', 
		{ 
			'SendButton' => '一括', 
			'CommandField' => 'パスワード', 
			'mid' => mid[i] 
		})
	print "#{mid[i]}<br>"
}

print "ok"

関連する記事

Mechanize : クラスのメソッドをオーバライド
してヘッダーを送れるようにしてiPhoneとしてサーバに認識させる




タグ:ruby Mechanize
posted by lightbox at 2010-02-06 15:19 | Ruby | このブログの読者になる | 更新情報をチェックする

2010年02月03日


JavaScript : CSV 形式のデータのフィールド分割

正規表現でどうするか質問されたので、ちょっと調べてみると正規表現で無理しているものしか見当たらなかったので作りました。運用した事無いので多少の調整は必要かもしれませんが、これなら誰でも改造できると思います
// 対象文字列
var x = 'a,"b,b",",,,",c';

// まず、" で挟まれた文字列を取り出す
var a = x.match(/"[^"]+"/g);

// " で挟まれた文字列をデータ上存在しない文字で置き換える
var b = x.replace(/"[^"]+"/g,String.fromCharCode(0x1a));

// その文字列をカンマで分割
var y = b.split(",");

// 分割されたフィールドに置き換えられた文字列を戻す
var n = 0;
for( i = 0; i < y.length; i++ ) {
	if ( y[i] == String.fromCharCode(0x1a) ) {
		y[i] = a[n];
		n++;
	}
}

// 結果の確認
str = "";
for( i = 0; i < y.length; i++ ) {
	str += y[i]+"\n";
}
alert(str)



posted by lightbox at 2010-02-03 23:10 | JavaScript | このブログの読者になる | 更新情報をチェックする

JavaScript : 無名関数(メソッド)の実行

無名関数の利点はグローバルな変数を汚さないで処理できる事です
( 関数名もグローバルですし )

function(){} と書くだけで無名関数になりますが、これを a とすると

var a = function(){};
a(); 

が有効です。ですから、

(function(){})();

と書けば無名関数の実行を書いた事になります
試しに

(function(){alert("ok")})();

を実行するとでメッセージボックスが表示されます。

また、(function(){})(); は何も返さない void 関数なので、

void(0);

と同等の使い方ができます
(function(){
	var obj = {
		myFunc: function(n) {
			return String.fromCharCode(n);
		}
	}
	window.myObj = obj;
})();

alert( myObj.myFunc(24859) );




タグ:javascript
posted by lightbox at 2010-02-03 19:53 | JavaScript オブジェクト | このブログの読者になる | 更新情報をチェックする

JavaScript : SHIFT_JIS としての文字列のバイト計算

定ピッチのフォントを使って、文字列として表示をコントロールしたい場合、日本語としての「全角/半角」を知る為の手段として有効です。
String.prototype.byteLen = function() {

	var str = this.toString();
	var len = str.length;
	var i,cd,blen=0;

	for( i = 0; i < len; i++ ) {
		blen += 2;
		cd = str.charCodeAt(i);
		if ( 0x20 <= cd && cd <= 0x7e ) {
			blen--;
		}
		if ( 0xff61 <= cd && cd <= 0xff9f ) {
			blen--;
		}
	}

	return blen;
}

alert("日本語OK".byteLen())

▼ 0xff61 〜 0xff9f(半角カタカナ)

。「」、ヲヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚


関連する記事 VBScript と Javascript の表示文字列用バイト計算
タグ:javascript
posted by lightbox at 2010-02-03 12:53 | JavaScript | このブログの読者になる | 更新情報をチェックする

2010年02月01日


JavaScript で埋め込むIFRAMEのコントロール

IFRAME 要素を直接ページに書いてしまうと、IFRAME 内のコンテンツのサイズ
に変更があった時に、表示エリアの調整を IFRAME の記述毎に変更する必要が
出てくるので、それを一括で行う方法です。

まず、以下のようなスクリプト要素をページに貼り付けます。
<script
	charset="euc-jp"
	type="text/javascript"
	src="http://winofsql.jp/winofsql_exlist.js"
></script>
ここでは、外部の JavsScript を呼び出すだけけです。
IFRAME の記述は、winofsql_exlist.js 内で行っています
if ( document.body.clientWidth > 1100 ) {
	str="";
	str+="<div style='position:absolute;left:951px;top:0px;'> \n";
	str+="<iframe \n";
	str+="	src=\"http://winofsql.jp/VA003334/a1.htm\" \n";
	str+="	frameborder=\"no\" \n";
	str+="	scrolling=\"no\" \n";
	str+="	width=\"285\" \n";
	str+="	height=\"3600\" \n";
	str+="></iframe> \n";
	str+="</div> \n";
	document.write(str);
}

このようにすると、二つ目のスクリプトを変更すれば、実際に
ページにか書かれているスクリプトとは関係無く更新されます。

※ if は、ブラウザの表示幅が小さい時に処理しない設定です。
※ document.write 用の文字列は、テキスト変換サービス で作成します


タグ:javascript
posted by lightbox at 2010-02-01 14:18 | ブックマークレットコード | このブログの読者になる | 更新情報をチェックする
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 終わり