2008年2月28日木曜日

Google ドキュメントのメニューバーが MS Office風に

今日見たら、Google Docsのメニューバーが変わっていた。いきなり変わってかなりびっくり。


今までメニューバーにあって頻繁に使っていた「引用として囲う」みたいなのが無くなっていて、もうGoogle Docs使えない(これが無いとちょっと使い物にならない)かと思ったら、「スタイル」の中にあった。

iboxの XSS脆弱性とその対策

Lightbox的なJavaScriptライブラリの中でも軽さと機能性が使いやすいibox
リンクにtitle属性をセットしておくと、開いたiboxのフッターにそのタイトルを表示してくれるが、このときにhtmlエスケープが解除されてしまう。

title="<b>foo</b>"

表示されるタイトル=<b>foo</b>

用途によっては使いやすいのだろうが、タイトルには入力データを表示することが多いのでXSSの危険性がある。


対策:
ibox.jsの127行目あたりを下記のように変更する。
このタイトルは属性として使われるわけではないので、クォーテーションのエスケープは要らない。
if(title != "") {ibox_footer.innerHTML = title;} else {ibox_footer.innerHTML = "&nbsp;";}

if(title != "") {ibox_footer.innerHTML = title.replace(/</g, "&lt;").replace(/>/g, "&gt;");} else {ibox_footer.innerHTML = "&nbsp;";}

getURL()で他のドメインに遷移できない

Flash Playerのバージョンが9.0.115の場合に起きる問題。
下記の条件を満たす場合、ActionScriptのgetURL()で他のドメインに遷移できない。

  • Flashの表示で、allowScriptAccess="always"を指定していない
  • getURL()の第2引数で、"_blank"を指定していない

どちらかの条件を満たさないようにすれば、他のドメインに遷移できるようになる。
ただし、"_blank"を使うとブラウザのポップアップブロックにひっかかるので、allowScriptAccess="always"にする方が良さそう。
(セキュリティ的に問題ある?)

ちなみに下記のような方法でも他のドメインに遷移できなかった。
getURL("javascript:window.open('http://example.com/', '_blank');");


参考: [229684]HTML ページに埋め込まれた SWF からのリンクが機能しない場合がある

2008年2月26日火曜日

IE7でwindowを closeする時に警告を出さない方法

target="_blank"などで子Windowで表示し、子Windowに閉じるボタンを付けた場合。javascriptでwindow.close()などとすると、IE7では下記のダイアログが表示される。

ウィンドウは、表示中の Web ページにより閉じられようとしています。
このウィンドウを閉じますか?
このダイアログを表示させない方法。


方法1 子Windowを開く方法を変える
javascriptによりwindow.open()で開くと、閉じる際にダイアログは表示されない。
<a href="#" onclick="window.open('test.html');return;">open</a>

方法2 子Windowを閉じる方法を変える
下記のように、ごにょごにょするとダイアログが表示されなくなる。
<a href="#" onclick="(window.open('', '_self').opener = window).close();">close</a>
openの第2引数は_topでも_parentでもよい。存在しないものは駄目。


IE6、IE7、Firefox2、Safari3(Windows版)で動作することを確認した。
ただし、IE7ではtarget="_blank"で開いてclose()するのを繰り返すと、IEが異常終了する問題があるので、方法1の方がよい。


参考:
 IE7 window.close()で確認ダイアログを出さずに閉じる
 2007-03-27 - urxの日記
 IE7で閉じる(window.close)と強制終了の対策

WordPressインストールメモ


WordPress日本語版
WordPress本家の日本語版と、それ以前に有志(?)により日本語化/マルチバイト対応されたME版がある。



インストール/初期設定での注意点
  • Windowsでは、php.iniで extension=php_mysql.dll が有効になっていないとDBにアクセスできない (PDOでは駄目)
  • 各記事のパーマリンクをいじる(投稿スラッグをURLに埋め込む等)には、該当ディレクトリの.htaccessが有効になっていないといけない
  • PHPのエラー設定でStrictをエラーに含めていると大量に"PHP: Strict Standards"を吐かれる。下記リンク先を参考に、.htaccessでエラー設定を緩和させれば解消する
  • テーマをEasyAllにすると、ol要素で数字が正しく表示されない


プラグイン
  • Akismet
    • デフォルトでインストールされる (有効にはなっていない)
    • 有効にするにはAPI KEYの取得が必要。API KEYの取得にはWordPress.comへのユーザー登録(無料)が必要
  • WP Multibyte Patch | EastCoder;
    • "WordPress のマルチバイト文字の取り扱いに関する不具合の累積的修正と強化を行うプラグイン"

Safariで bodyの onloadが効かないバグ?

Windows版Safariでのみ確認。
iframeを使っていて、かつiframeのsrcが有効なURLの場合に、body.onloadが実行されない。

<html>
<head><title>test</title></head>

<body onload="alert('loaded');"> <!-- これが実行されない! -->

<iframe src="http://www.google.co.jp" />

</body>
</html>

srcを空にすればonloadは実行される。

バグなのか仕様なのか?

Firefoxのアドオン設定から削除できないアドオンを削除する

AutoCopyは文字化けしているせいかアドオン(extension)管理パネルから削除や無効にできない。(設定はできる。)
下記の手順を試したところ、削除できたようだ。
ただし他にゴミファイルが残っていたりして今後支障が生じる可能性が充分にある。

  1. Document And Settingsの中からFirefoxのフォルダを探す
  2. FirefoxのProfileフォルダの下の下にある「extensions.rdf」(アドオンの現在の状態を保存しているファイル?)から該当のアドオンの記述を削除する。
  3. 同じくextensionsフォルダの中にある、該当のアドオンのフォルダをフォルダごと削除する。(https://addons.mozilla.org/のアドオンはフォルダ名がハッシュ?なので分かり辛い。更新日から推測して、開いて調べる。)

Rubyで受信メールを解析する

ライブラリTMailを使う。
標準では入っていないのでインストールする。

gem install tmail

実験用プログラム
$KCODE = 'sjis'

require "tmail"
require "base64"

arg = ARGV[0]
path = arg[4, arg.size]

mail = TMail::Mail.load(path)

log = open("/tmp/receiveVideo/test.log", "w")

log.puts "From:" + mail.from.to_s
log.puts "To :" + mail.to.to_s
log.puts "Subject:" + mail.subject

def parse(part, log)
 if part.multipart?
  part.parts.each do |p|
   parse(p, log)
  end
 else
  if part.content_type == "text/plain"
   log.puts "Body:" + part.body
  else
   attach = open(part.main_type + "_" + part.encoding + "." + part.sub_type, "w")
   if part.main_type == "text"
    attach.write(part.body)
   else
    attach.write(Base64.decode64(part.body))
   end
   attach.close
  end
 end
end

parse(mail, log)

log.close

添付の動画のデコードがうまくできない。なぜ?


参考:
 メールで送った画像をサーバに保存させる
 TMail の使い方
 class TMail::Mail (リファレンス。古いバージョン?)
 RubyでBase64 - 今日覚えたこと (Base64について)
 packテンプレート文字列 (データのpackについて)

2008年2月17日日曜日

ActionScriptでコンポーネントを動的に描き出す

"getNextHighestDepth()"を思い出せなかったので次回のためにメモ。
initObjは、プロパティをまとめてセットするためのObject。
_rootは状況次第でthisとかでも。

var initObj:Object = {text:"テキスト", autoSize:"center", _width:400, _y:150};
_root.createClassObject(mx.controls.Label, "test_lbl", getNextHighestDepth(), initObj);

2008年2月14日木曜日

Googleドキュメントの Happy Valentine's Day

いつものようにGoogle Docsを開くと、ドピンクに染まっていた。今日はバレンタインデーか。


スターがハートになってる...。


2008年2月13日水曜日

JavaScriptでページ上にカレンダーをポップアップ表示するライブラリのリンク集

フォームの日付入力の補助に使えるJavaScriptカレンダーの調査。

選定条件は下記の2点。この2点を両方満たすものは意外に少ない。

  • 月や曜日を日本語で表示すること
  • 同一ページ上でポップアップ表示できること (別Windowで開くものは使いにくいので不可)


Yahho Calendar
YUIベースのシンプルなカレンダー。
祝日データはGoogleカレンダーから取得。(メンテナンス不要なのが良い。)


JKL.Calendar
細かい設定(カスタマイズ)ができる。
祝日対応版では、祝日データは独自のリストを作ってそこから取得。(ケアが必要だが柔軟性が高い。)


JavaScriptによるカレンダー入力フォーム
見た目は濃ゆい。
祝日は計算で算出している。(休日制度の改正への対応が辛い。)


(2008/03/17 追加)
ProtoCalendar
prototype.jsベース。
見た目を簡単にカスタマイズできる。
年月を選択リストから選択できるのが便利。
祝日は計算で算出している。(休日制度の改正への対応が...)

(2010/08/19追加)
jQuery UI Datepickerでもわりと簡単に日本語のカレンダーを表示できる。
参考:floatingdays: jQuery UIの Datepickerで日本語のカレンダーを表示する方法

2008年2月10日日曜日

Firefoxで戻ってきた時の disabled状態の調査

Firefox(2.0.0.11)で、formの子要素をJavaScriptを使ってdisabledにしてから次のページへ遷移し、(戻るボタン等で)戻ってきた時のformの子要素のdisabled状況についての調査結果。


disabledのままになるもの
(Firebugで見るとdisabled=""になっているもの)

  • input要素 type="text" (readOnlyによって代替できる)
  • input要素 type="checkbox"
  • input要素 type="radio"
  • input要素 type="hidden"
  • input要素 type="file" (FirefoxではこのtypeにはreadOnlyが効かないが、readOnlyで代替することによりIEではreadOnly、Firefoxでは常に使用可能にするのが妥協点)


disabledが解除されるもの
(Firebugで見るとdisabled属性自体が無くなっているもの)
  • input要素 type="password"
  • input要素 type="submit"
  • input要素 type="button"
  • input要素 type="reset"
  • input要素 type="image"
  • button要素
  • select要素
  • textarea要素


IE6/7では、戻ってきたときには全てdisabledは解除される。

disabledにしたのが解除されていないというこの使いにくい状態は仕様なのかバグなのか?Firefox3ではなくなっているといいけど。

Flashの ScrollPaneの heightと _heightの違い

Flash 8のScrollPaneコンポーネントのプロパティについての調査結果メモ。

heightはScrollPane自体の高さ。下の図でいうと、左側の"ScrollPane"の高さ。

_heightはScrollPane内に表示するものの高さ。下の図でいうと、右側の"ScrollPaneの中身"の高さ。


リファレンスにも書いてない分かり辛い仕様。


mbstring.encoding_translationは PHPのスクリプト内でセットできない

php.iniの設定の話。
mbstring.encoding_translationは勝手にインプットデータの文字コードを変換してしまうので、文字化けの原因になることがある。

その場合には、mbstring.encoding_translationをOffにして、各インプットデータをmb_convert_encoding()で変換すれば文字化けを解消できるが、mbstring.encoding_translationはPHPのスクリプト内で設定できない。(参考:PHP: php.ini ディレクティブ - Manual

php.iniではOnになっているmbstring.encoding_translationをOffにするには、Apacheのhttpd.confか、.htaccessでOffになるよう指定する必要がある。

httpd.confでセットする例

<IfModule mod_php5.c>
<Location "/url_path">
php_value mbstring.encoding_translation Off
</Location>
</IfModule>

2008年2月8日金曜日

PgAdmin Ⅲのヘルプおじさん

いつからいるんだろう?1.8から?新しいマスコットか?!

2008年2月4日月曜日

Webブラウザだけで Flashのブログパーツをちょちょいと作れるサービス

Webブラウザだけで簡単にFlashのブログパーツ(ウィジェット/ガジェット)を作る事ができる「Sprout Builder」を試しに触ってみた。

コンポーネントは Media, General, Services の3種類に分類されていて、ドラッグ&ドロップで簡単に貼り付けられる。
すっきりした見た目のコンポーネントが用意されているので、デザイン面に苦戦しなくてもいいのが魅力的。
各コンポーネントの設定は、プロパティをちょちょいといじれば簡単に設定できる。

Media
Audio、写真、動画など。
動画ファイル等のURLは動的に指定できないので、動画を切り替えたかったら動画のあるサーバ側で出力するファイルを切り替える必要がある。



General
カレンダーやフィード一覧などのほか、表示するコンポーネントを切り替えるサムネイルパネルなどもここに含まれる。



Services
Yahoo MapsやGoogle Chart APIまである。



ActionScriptで操作できるわけではないので、できることは限られている。
でもブログパーツ程度の使い方なら、お手軽にできて便利そう。

Betaが終わっても無料なのかな?


2008年2月3日日曜日

PHPでいろいろな型の変数を文字列に変換する5つの関数の比較

debugなどで変数の中身を見たい時などにvar_dump()したりするけど、そんな変数を文字列に変換する関数たちによる変数型による違いを比較してみた。

(凡例:型 => 文字列に変換した値の例)
print_r()

  • boolean(true) => 1
  • boolean(false) =>
  • integer => 123
  • double => 0.5
  • string => abc
  • array => Array ( [0] => 1 [1] => 2 [2] => 3 )
  • object => Example Object ( [public_var] => 123 [_private_var:private] => 456 )
  • resource => Resource id #3
  • null =>
シンプルで見やすい。
trueが1になる。
falseやnullの場合、何も出力されない。


var_dump()
  • boolean(true) => bool(true)
  • boolean(false) => bool(false)
  • integer => int(123)
  • double => float(0.5)
  • string => string(3) "abc"
  • array => array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
  • object => object(Example)#1 (2) { ["public_var"]=> int(123) ["_private_var:private"]=> int(456) }
  • resource => resource(3) of type (stream)
  • null => NULL
変数の型も出力されて、詳細な情報が得られる。
そのまま出力されてしまうので、内容を取得して使いたかったら出力制御関数を組み合わせて使う。


var_export()
  • boolean(true) => true
  • boolean(false) => false
  • integer => 123
  • double => 0.5
  • string => 'abc'
  • array => array ( 0 => 1, 1 => 2, 2 => 3, )
  • object => Example::__set_state(array( 'public_var' => 123, '_private_var' => 456, ))
  • resource => NULL
  • null => NULL
シンプルで見やすい。
print_r()と違い、booleanやnullの変換もできるし、stringにクォーテーションが付くのがよい。
resourceがなぜかnullになる。


serialize()
  • boolean(true) => b:1;
  • boolean(false) => b:0;
  • integer => i:123;
  • double => d:0.5;
  • string => s:3:"abc";
  • array => a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
  • object => O:7:"Example":2:{s:10:"public_var";i:123;s:21:"�Example�_private_var";i:456;}
  • resource => i:0;
  • null => N;
機械的に処理するには実は使いやすいかも。


strval()
  • boolean(true) => 1
  • boolean(false) =>
  • integer => 123
  • double => 0.5
  • string => abc
  • array => Array
  • object => ※FatalErrorが発生する
  • resource => Resource id #3
  • null =>
print_r()と似ているが、arrayとobjectを変換できない。
暗黙の変換で文字列にした場合はこのパターンになる。


(おまけ)
gettype()
  • boolean(true) => boolean
  • boolean(false) => boolean
  • integer => integer
  • double => double
  • string => string
  • array => array
  • object => object
  • resource => resource
  • null => NULL
nullだけなぜか大文字。

preg_replace()で文字化け

UTF-8で、preg_replace()を使ってカタカナを変換しようとしたところ文字化けが発生。

$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo preg_replace("/$regex/", $replace, $str);

ピー�ピー�ピー�ピーピー

調べたところ、preg系の関数(preg_match()など)はマルチバイトに対応していないらしい いるのはUTF-8でパターン修飾子を指定した場合のみ。
[PHP-users 21761]Re: preg_replaceで文字化け

(2008/02/04 追記)
UTF-8でpreg系を使う場合は、パターン修飾子として"u"を指定すればOK。
$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo preg_replace("/$regex/u", $replace, $str);

ピーピーピー
参考: PHP: パターン修飾子 - Manual
(追記終わり)


マルチバイトの文字列を正規表現で変換する場合はmb_ereg系(またはmb_eregi系)の関数を使わなければならない。
$str = 'ピーエイチピー';
$regex = '[^ピー]+';
$replace = 'ピー';
echo mb_ereg_replace($regex, $replace, $str);

ピーピーピー

Windowsの PHPの sendmail_from

php.iniにあるWindows専用の設定"sendmail_from"と関数mail()/mb_send_mail()について。

メールアドレスをセットしておくと、そのメールアドレスがmail()やmb_send_mail()で送るメールのFrom、Return-Path、それにSMTPのMAIL FROM(エンベロープFrom) として使われる。

sendmail_fromがセットされていない場合、mail()/mb_send_mail()の第4引数の中で指定するメールheaderの中のFromが、Return-PathやエンベロープFromにも使われる。
その場合にFromにメールアドレスだけでなく表示名(例:山田 <foo@example.com>)も付けている場合は、メール送信に失敗する。
Fromの表示名も使いたい場合、メールheaderには表示名付きのFromをセットし、エンベロープFromには ini_set("sendmail_from", $from) でメールアドレスのみのFromをセットすればOK。

sendmail_fromもheaderの中のFromもセットされていない場合、メールの送信はできない。(Warning "sendmail_from" not set in php.ini or custom "From:" header missing in ... になる。)

Apacheで拡張子から紐付けられている Mime typeのリスト

手元にあるApache2.2.8で、出力するファイルの拡張子を元にMime type(Content-type)を設定している設定の中で、主なものの抜粋。


ファイル:httpd.conf
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz


ファイル:mime.types
application/atom+xml atom
application/javascript js
application/msword doc dot
application/octet-stream bin dms lha lzh class so iso dmg dist distz pkg bpk dump elc
application/pdf pdf
application/rdf+xml rdf
application/rss+xml rss
application/vnd.ms-powerpoint ppt pps pot
application/x-shockwave-flash swf
application/xml xml xsl
application/zip zip
audio/mpeg mpga mp2 mp2a mp3 m2a m3a
audio/x-ms-wma wma
image/bmp bmp
image/gif gif
image/jpeg jpeg jpg jpe
image/png png
image/x-icon ico
text/css css
text/csv csv
text/html html htm
text/plain txt text conf def list log in
video/3gpp 3gp
video/3gpp2 3g2
video/mp4 mp4 mp4v mpg4
video/mpeg mpeg mpg mpe m1v m2v
video/quicktime qt mov
video/x-ms-wmv wmv
video/x-msvideo avi


注意点:

  • JavaScriptが、"application/x-javascript"ではなく"application/javascript"になっている
  • 主なメディアファイルはある。いつの間にか3gpp2もある。でもflvはない

ブログ アーカイブ

tags