memo.xight.org

日々のメモ

Apache Performance Tuning

Summary

同時に256を超えるリクエストに応答する必要があるサイトでは,MaxClientsを増やす.
メモリが少ないサイトでは,スラッシングを防ぐためにMaxClientsを減らす.
MaxSpareServers, MinSpareServersの値を大きくするということは避けたほうが良いらしい.

Reference

Apache Performance Tuning - Apache HTTP Server
http://httpd.apache.org/docs/2.0/ja/misc/perf-tuning.html
prefork - Apache HTTP サーバ
http://httpd.apache.org/docs/2.0/ja/mod/prefork.html

JSDoc - JavaScriptでJavaDoc風ドキュメントを

Summary

JavaScriptのJavaDoc風ドキュメント生成ソフトウェア.
PerlとHTML::Templateが必要.
出力形式は,HTML,XML,XMI(UMLのXML形式).

Reference

JSDoc Homepage - JavaScript Documentation Tool
http://jsdoc.sourceforge.net/

HTML::Template

via

MOONGIFT - JSDoc
http://oss.moongift.jp/intro/i-935.html

MOONGIFT - JSDoc レビュー - オープンソースによるIT戦略支援 -
http://oss.moongift.jp/review/i-960.html

LaTeX でウォーターマーク (透かし)

Summary

書類の背景に薄い文字(透かし,ウォーターマーク)を印刷したい.

Source

\begin{document}の前に以下を記入.

\usepackage{graphicx}
\usepackage{fancybox}
\usepackage{color}
\fancyput(-0.7in,-9.5in){
	\color[rgb]{0.85,0.85,0.85}{
		\rotatebox{50}{
			\scalebox{10}{CONFIDENTIAL}
		}
	}
}

Sample

\documentclass{jarticle}
\usepackage{graphicx}
\usepackage{fancybox}
\usepackage{color}
\fancyput(-0.7in,-9.5in){
	\color[rgb]{0.85,0.85,0.85}{
		\rotatebox{50}{
			\scalebox{10}{CONFIDENTIAL}
		}
	}
}

\title{タイトル}
\author{佐藤 克己}
\date{2005年12月30日}

\begin{document}
\maketitle

\section{サンプル}

\end{document}

結果

クリックして拡大

PDF | TeX

Reference

Hiki@Acapulco - (Tex)dmesh
http://acapulco.dyndns.org/hiki/hiki.cgi?%28Tex%29dmesh

via

swk's log - 2005-12-23
http://www.kagami.org/diary/2005-12-23-1.html

chalow のプラグインを容易に移行するには

Summary

地図サービスへのリンクの切り替えが面倒.
今回は MapionBB プラグインから Google Maps プラグインへの切り替え.

s/{{mapion/{{google_maps/g

解決方法

地図サービスへのリンクプラグインの名前をラッピングする.
mapを地図サービスへのリンクとして利用.
mapプラグイン内で実際の地図サービスプラグインを呼び出す.

sub maps {mapion(@_)}

から
sub maps {google_maps(@_)}

に変更するだけで良くなる.

chalow の Google Maps へのリンクプラグイン

Reference

### Google ローカルへのリンク
# usage: {{google_map('東京都○○区○町00-0')}}
sub google_map {
	my ($str) = @_;
	my $prefix = q(http://maps.google.co.jp);
	my $enc = Jcode->new($str)->utf8;
	$enc =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei;
	$enc =~ s/\s/+/g;
	return qq(<a href="$prefix/maps?q=$enc" title="Google ローカル - $str">$str</a>);
}

PHPとWebアプリケーションのセキュリティについて

Summary

PHPでWebアプリケーション開発を行う際の留意点.
悪いコード例と検証コードを紹介.

php.ini 基本の設定

magic_quotes_gpc = Off;
session.use_trans_sid = 0;
session.use_only_cookie = 1
session.auto_start = 0;

Reference

PHP と Web アプリケーションのセキュリティについてのメモ
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html#PHP_Session
はてなダイアリーのヘルプ - はてなダイアリーXSS対策
http://hatenadiary.g.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa%e3%83%80%e3%82%a4%e3%82%a2%e3%83%aa%e3%83%bcXSS%e5%af%be%e7%ad%96

via

高木浩光@自宅の日記 - 2005-12-27 - 「サニタイズ言うなキャンペーン」とは何か
http://takagi-hiromitsu.jp/diary/20051227.html#p02

Live HTTP Headersが "ページの情報を表示" の中の "Headers" タブで表示できない

Summary

"ページの情報を表示" の中の "Headers"タブでヘッダ情報が表示ができない.
以下のメッセージが表示される.
クリックして拡大

内容

To be able to display headers information in the PageInfo tab of Mozilla or Firebird the
nsHeaderInfo component must be registered.
This component should be found in the file Mozilla/Components/nsHeaderInfo.js.

Registration should have been done by the LiveHTTPHeaders installation.
However this sometimes does not work.
Follow these steps to enable Mozilla or Firebird to find and register the component:

  * Delete the file Mozilla/Components/compreg.dat
  * Delete the file Mozilla/Components/xpti.dat

These two files should be recreated automatically by Mozilla or Firebird when it is next started.

Note: if you installed LiveHTTPHeaders in you profile, there is a copy of the
nsHeadersInfo.js file in your profile/components directory. You need to copy it in
Mozilla/Components directory first and follow the directive above after.

和訳

Mozilla あるいは Firebird の PageInfo タブにヘッダー情報を表示することができるように,
nsHeaderInfo のコンポーネントを登録しなければなりません.
このコンポーネントは Mozilla/Components/nsHeaderInfo.js ファイルで見つけられるでしょう.

LiveHTTPHeaders のインストール時にで登録するべきですが,時々動作しません.
以下に示すステップに従って, Mozilla あるいは Firebird がコンポーネントを登録できるようにしてください:

  * Mozilla/Components/compreg.dat ファイルを削除
  * Mozilla/Components/xpti.dat ファイルを削除

Mozilla あるいは Firebird の再起動後に,これらのファイルは再生成されます.

注意: LiveHTTPHeaders を自分のプロファイルでインストールしたなら,自分の profile/components ディレクトリに nsHeadersInfo.js ファイルのコピーがあります.
その場合,最初に Mozilla/Components ディレクトリにそれをコピーして,上記の指示に従ってください.

結果

指示に従ったが動作せず

Reference

(ひ)メモ - Live HTTP Headersが「ページの情報を表示」の中のタブで表示できない
http://d.hatena.ne.jp/hirose31/20051222/1135249744
Firefox まとめサイト - Live HTTP headers
http://firefox.geckodev.org/?Live%20HTTP%20headers
mozdev.org - livehttpheaders
http://livehttpheaders.mozdev.org/

GNU screen

Reference

Let's use SCREEN!
http://www.dekaino.net/screen/

はてな - GNU screen を使い始めて数ヶ月が経ち、ようやく慣れてきました。それで、screenrc による設定方法などを調べているのですが…
http://www.hatena.ne.jp/1134693287

naoyaのはてなダイアリー - GNU screen いろいろまとめ。
http://d.hatena.ne.jp/naoya/20051223/1135351050

続 screen の使い方 (iandeth.)
http://iandeth.dyndns.org/mt/ian/archives/000646.html

デスクトップドドド

Summary

ジョジョっぽい「ド」を並べることができるデスクトップアクセサリ.
デスクトップドドド

操作画面

「ド」をドラッグ & ドロップでデスクトップに「ド」を貼り付け.
振動させることも可能!
デスクトップドドド 操作画面

Reference

デスクトップドドド
http://massacre.s59.xrea.com/game/dtddd/

via

www.textfile.org - 2005-12-23
http://www.hyuki.com/t/200512.html#i20051223160230

PhpMyBorder - PHP で角が丸い枠を簡単に作るライブラリ

Sample

<?php
require_once 'phpMyBorder2.class.php';
$pmb = new PhpMyBorder();
echo $pmb->begin_round('260px', 'DDDDFF', '78AAFF');
?>

コンテンツの内容

<?php
echo $pmb->end_round();
?>


Screen shot

PhpMyBorderの利用例

Reference

PhpMyBorder - add round corners by CSS
http://www.phpmyborder.com/
PhpMyBorder - Resouces and links to rounded corners, boxes and edges tutorials
http://www.phpmyborder.com/round_corners5.php

via

cl.pocari.org - 2005-12-19 - PHP で角丸枠 (CSS) を簡単に作る方法
http://cl.pocari.org/2005-12-19-2.html

Cheat Sheets Collection

Reference

Perl Cheat Sheet
http://juerd.nl/site.plp/perlcheat
Perl Cheat Sheet
http://ali.as/devel/cheatsheet.html
Perl Cheat Sheet
http://goldenink.com/perl/perlcheat.html
PHP Cheat Sheet
http://www.ilovejackdaniels.com/php/php-cheat-sheet/
JavaScript Cheat Sheet
http://www.ilovejackdaniels.com/javascript/javascript-cheat-sheet/
CSS Cheat Sheet
http://www.ilovejackdaniels.com/css/css-cheat-sheet/
mod_rewrite Cheat Sheet
http://www.ilovejackdaniels.com/cheat-sheets/mod_rewrite-cheat-sheet/
Vim Commands Cheat Sheet
http://bullium.com/support/vim.html
Cheat Sheet Roundup
http://www.petefreitag.com/item/455.cfm

Tru Calling

Summary

死体安置所で働くトゥルー・デイビーズが主人公.
トゥルーは死者の「助けて」という声を聞くと,一日をやり直す特殊能力者.
死ぬはずの人を助ける一話完結型の物語.

時間が戻るといったら…

のび太の魔界大冒険

Amazon - トゥルー・コーリング DVDコレクターズ・ボックス1: DVDAmazon - トゥルー・コーリング DVDコレクターズ・ボックス2: DVDAmazon - トゥルー・コーリング DVDコレクターズ・ボックス3: DVD

Reference

トゥルー・コーリング
http://www.foxjapan.com/dvd-video/tv/trucalling/1/
トゥルー・コーリング DVDコレクターズ・ボックス1: DVD
トゥルー・コーリング DVDコレクターズ・ボックス2: DVD
トゥルー・コーリング DVDコレクターズ・ボックス3: DVD

@IT連載 Webアプリケーションのユーザーインターフェイス

Reference

@IT - リッチクライアント - 連載 - 第1回 ユーザーにとって “インターフェイス”が製品そのもの
http://www.atmarkit.co.jp/fwcr/rensai/usability01/01.html
@IT - リッチクライアント - 連載 - 第2回 ユーザーが選びやすいフォームのカタチを考えよう
http://www.atmarkit.co.jp/fwcr/rensai/usability02/01.html
@IT - リッチクライアント - 連載 - 第3回 UCD=利用者中心設計のプロセスとは?
http://www.atmarkit.co.jp/fwcr/rensai/usability03/01.html
@IT - リッチクライアント - 連載 - 第4回 お金を下ろせないATMの画面デザインを考える
http://www.atmarkit.co.jp/fwcr/rensai/usability04/01.html
@IT - リッチクライアント - 連載 - 第5回 入力情報を預かる責任を果たせる画面デザインとは?
http://www.atmarkit.co.jp/fwcr/rensai/usability05/01.html
@IT - リッチクライアント - 連載 - 第6回 「戻る」で入力データが消えてしまうフォームはいらない
http://www.atmarkit.co.jp/fwcr/rensai/usability06/01.html

chalow Google Video Search Plug-in

Source

### Google Video検索へのリンクプラグイン
# usage: {{google_video('keyword')}}
sub google_video{
	my ($str) = @_;
	my $prefix = q(http://video.google.com/videosearch?q=);
	return qq(<a href="$prefix$str" title="Google Video - $str">Google 動画検索 - $str</a>);
}

サニタイズの基本

Summary

入門 Ajax pp.16 より。

[2013-03-30] 追記
このエントリは、参考にしてはいけない。

SQLインジェクション

MySQL PHP $sql = mysql_escape_string($sql);
MySQL Perl $sql =~ s/'/''/g; $sql =~ s/\\/\\\\/g;
PostgreSQL PHP $sql = pgsql_escape_string($sql);
PostgreSQL Perl $sql =~ s/'/''/g; $sql =~ s/\\/\\\\/g;
SQLite PHP $sql = sqlite_escape_string($sql);

OSインジェクション

Linux PHP $str = escapeshellarg($str);
Linux Perl $str =~ s/'/\\'/g;

XSS

PHP $str = htmlspecialchars($str);
Perl $str =~ s/

Reference

入門 Ajax - pp.16

JavaScriptの予約語

List

abstract
boolean
break
byte
case
catch
char
class
comment
const
continue
debugger
default
delete
do
double
else
enum
export
extends
false
final
finally
float
for
function
goto
if
implements
import
in
instanceof
int
interface
label
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
typeof
var
void
volatile
while
with

備考

JavaScript1.3の初期バージョンから,comment, debugger, enum, export, label が追加
ECMA-262でvolatileが追加され,commentは削除されたため,それ以後のJavaScript1.3はこれに準拠し変更されている.
false, null, true はECMA-262では予約語とされていないが,NetscapeもMicrosoftも予約語としている.

startという名前の関数をイベントから使用するとIE系でエラーが出る.
colorという名前の関数を使用するとエラーが出る.
start, color とも予約語ではないが,使用は避けた方が良い.

Reference

SMART! ウェブ講座 - JavaScript - 予約語
http://www.rfs.jp/sb/javascript/01/04.html
JavaScript laboratory - 予約語一覧
http://www004.upp.so-net.ne.jp/sekiuchi/js/help/keywords.html

JavaScript で Cookie を簡単に扱うには

Summary

JavaScriptでCookieを扱う[2005-12-19-5] でCookieの扱いづらさを体験.
そこで cookieクラスを用いる.
どうせなら,Cookieをparseして連想配列で返しても良い気がする.

Reference

ウェブ木箱:cookie操作
http://www5c.biglobe.ne.jp/~horoau/js_library/cookie.html
クッキーの読み書き
http://www9.plala.or.jp/oyoyon/html/script/cookie.html

薄利多売 半兵ヱ

Summary

「昭和」がテーマの居酒屋.
とっても安くてリーズナブル!

池袋サンシャイン60通り店

住所 東京都豊島区東池袋1-13-11 近代グループBLD.7 4F
Tel 03-5911-4666

水道橋店

住所 東京都千代田区三崎町1-4-8
Tel 03-3293-8639

吉祥寺駅前店

住所 東京都武蔵野市吉祥寺南町1-4-1 井の頭ビルB1F
Tel 0422-46-5567

Reference

薄利多売 半兵ヱ
http://www.hanbey.com/

Nikkei225 MarketMap/日経平均225銘柄のマップ

Summary

日経平均225銘柄をTreeMap視覚化.
Map of the Marketの日本版.
クリックして拡大

Reference

Nikkei225 MarketMap/日経平均225銘柄のマップ
http://n225.jp/
Map of the Market
http://www.smartmoney.com/marketmap/
iv.xight.org
http://iv.xight.org/

via

読書記録ChangeLog - 2005-12-16 - Nikkei225 MarketMap/日経平均225銘柄のマップ
http://dkiroku.com/2005-12-16-20.html

JavaScriptでCookieを扱う

Cookieの取得

var cookie = document.cookie;


Cookieの設定

document.cookie = 'var1=value1;var2=value2;var3=value3;';


Cookieの有効期限を指定する

document.cookie = 'var1=value1; expires=Tue, 1-Jan-2030 00:00:00 GMT;';


Cookieの書き込み (有効期限を1時間後に指定)

var xDay = new Date;
xDay.setHours(xDay.getHours() + 1); // 有効期限を1時間後に設定
xDay = xDay.toGMTString();          //GMT形式の文字列に変換
document.cookie = "value0=" + + ";expires=" + xDay;


Cookieの読み込み

function loadCookie(arg){ //argはデータ識別文字列
	if(arg){
		var cookieData = document.cookie + ";"; //文字列の最後に「;」を追加
		var startPoint1 = cookieData.indexOf(arg);
		var startPoint2 = cookieData.indexOf("=",startPoint1);
		var endPoint = cookieData.indexOf(";",startPoint1);
		if(startPoint2 < endPoint && startPoint1 > -1){
			cookieData = cookieData.substring(startPoint2,endPoint);
			cookieData = cookieData;
			return cookieData;
		}
	}
	return false
}


Cookieの削除

有効期限を過去に設定することでCookieは削除される.
function deleteCookie(arg){ //argはデータ識別文字列
	if(arg){
		var yDay = new Date;
		yDay.setHours(yDay.getHours() - 1); // 有効期限を1時間前に設定
		yDay = yDay.toGMTString();          //GMT形式の文字列に変換
		document.cookie = arg + "=xxx" + ";expires=" + yDay;
	}
}


Reference

とほほのCookie入門
http://www.tohoho-web.com/wwwcook.htm#CookieWrite
From DFJ - DHTML/JavaScript Index - Cookieの利用
http://www.fromdfj.net/javascript/cookie.html
クッキーの読み書き
http://www9.plala.or.jp/oyoyon/html/script/cookie.html

memoization - JavaScriptによるLispソースコードのブロック可視化

Summary

マウスオーバーした部分のブロックが色分けされてハイライト.
クリックして拡大

Reference

memoization
http://community.schemewiki.org/?memoization

via

/home/pochi/ChangeLog - JavaScript による Lisp ソースコードのブロック可視化
http://www.pochi.cc/~sasaki/chalow/2005-08-29-4.html

RSSのロゴ指定

<image rdf:resource="http://xight.org/images/logo.png" />

<image rdf:about="http://xight.org/images/logo.png">
	<url>http://xight.org/images/logo.png</url>
	<link>http://memo.xight.org/</link>
	<title>memo.xight.org</title>
</image>

GeSHiの利用

<?php
	include_once('geshi.php');
	$source         = $_REQUEST["source"];
	$language       = $_REQUEST["lang"];
	$geshi =& new GeSHi($source, $language);
	echo $geshi->parse_code();
	return;
?>

Google Homepage API

Summary

Google Homepage のモジュール (Widget)を定義できるAPIが公開.
クリックして拡大

bulkfeeds.net のサーチボックスの場合

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs
  title="Bulkfeeds Search"
  directory_title="Bulkfeeds Search"
  title_url="http://bulkfeeds.net/"
  description="Search on Bulkfeeds"
  author="Tatsuhiko Miyagawa"
  author_email="miyagawa@gmail.com"
  author_location="Tokyo, Japan"
  render_inline="optional"
  height="60"
  scrolling="true"
/>
<Content type="html">
<![CDATA[
<p>
<form action="http://bulkfeeds.net/app/search2" target="_top">
<input type="text" name="q" value="" />
<input type="submit" value="Search" />
</form>
</p>
]]>
</Content>
</Module>

Reference

Updates from code.google.com: Google Releases Homepage API
http://google-code-updates.blogspot.com/2005/12/google-releases-homepage-api.html
Google Homepage API - Overview
http://www.google.com/apis/homepage/
Google グループ : Google Homepage API
http://groups.google.com/group/Google-Homepage-API
blog.bulknews.net - Bulkfeeds Search module for Google HomePage
http://blog.bulknews.net/mt/archives/001867.html

chalowで画像ポップアップ

Summary

クリックしたらサムネイルの画像を拡大するようにした.

大きな画像をポップアップ [2005-09-28-5] のJavaScriptを popupImage.jsというファイルで保存して,各ページに<script>タグを埋め込む.


<script src="popupImage.js" type="text/javascript"></script>


chalowファイルの get_link_str の中を変更

sub get_link_str {
	my ($a, $b) = @_;
	if ($a =~ /\.(jpg|jpeg|png|gif)$/i) { # [[http://nais.to/|image/nais.jpg]]
		# return qq(<a href="$b"><img src="$a" alt="画像" /></a>);
		return qq(<img src="$a" alt="クリックして拡大" onclick="popupImage('$b')" /><a href="$b">.</a>);
	} elsif ($b =~ /\.(jpg|jpeg|png|gif)$/i) { # [[自画像|image/sp.jpg]]
		return qq(<img src="$b" alt="$a" />);
	} else {            # [[トップページ|http://nais.to/]]
		return qq(<a href="$b">$a</a>);
	}
}


Reference

オブジェクト指向JavaScript - 大きな画像をポップアップ
http://web.paulownia.jp/script/sample/popup.html

chalow Google Music Search Plug-in

Source

### Google音楽検索へのリンクプラグイン
# usage: {{google_music('キーワード')}}
sub google_music {
	my ($str) = @_;
	my $prefix = q(http://www.google.com/musicsearch?q=);
	return qq(<a href="$prefix$str" title="Google Music - $str">Google 音楽検索 - $str</a>);
}

Google Music Search

Summary

キーワードを入れると,Artists,Songs,Albums などにマッチする検索結果を表示.
アーティストを選択すると,そのアーティストのアルバムなども検索可能.
クリックして拡大クリックして拡大

Reference

Google 音楽検索 - enya

JavaScriptでビルトインオブジェクトハック (Dateクラス編)

Summary

最速インターフェース研究会の「実践JavaScriptリファクタリング」に触発されてDateクラスに手を加えてみた.

IEとMozilla系でgetYear(),setYear()の仕様が異なるため,
getFullYear(),setFullYear()を使うことで,年の扱いを4ケタで統一.

Source

/*
連想配列を返す
return Array
*/
Date.prototype.toHashArray = function(){
	var dateArray = new Object();
	dateArray["year"]	= this.getFullYear();
	dateArray["month"]	= this.getMonth();
	dateArray["date"]	= this.getDate();
	dateArray["day"]	= this.getDay();
	dateArray["hour"]	= this.getHours();
	dateArray["minute"]	= this.getMinutes();
	dateArray["second"]	= this.getSeconds();

	return dateArray;
}

/*
その年が閏年かどうか
return boolean
*/
Date.prototype.isLeapYear = function(){
	var year = this.getFullYear();
	return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
}

/*
その日が引数と同じ日付かどうか
return boolean
*/
Date.prototype.isSameDate = function(d){
	var arr		= this.toHashArray();
	var arr2	= d.toHashArray();

	return ((arr["year"] == arr2["year"]) && (arr["month"] == arr2["month"]) && (arr["date"] == arr2["date"]));
}
/*
その時間が引数と同じ時間かどうか
return boolean
*/
Date.prototype.isSameTime = function(d){
	var arr		= this.toHashArray();
	var arr2	= d.toHashArray();

	return ((arr["hour"] == arr2["hour"]) && (arr["minute"] == arr2["minute"]) && (arr["second"] == arr2["second"]));
}
/*
その時間が引数と同じ日付、同じ時間かどうか
return boolean
*/
Date.prototype.equals = function(d){
	return (this.isSameDate(d) && this.isSameTime(d));
}

/*
その日が今日と同じ日付かどうか
return boolean
*/
Date.prototype.isToday = function(){
	return this.isSameDate(new Date());
}

/*
時間を 00:00:00に設定
*/
Date.prototype.resetTime = function(){
	this.setHours(0);
	this.setMinutes(0);
	this.setSeconds(0);

	return;
}

/*
その月の日数を取得
return int
*/
Date.prototype.getDayNumber = function(){
	var year = this.getFullYear();
	var month = this.getMonth();

	var dayNumber = 
		(month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11) ? 31 :
		(month == 3 || month == 5 || month == 8 || month == 10) ? 30 :
		(this.isLeapYear()) ? 29 :
		28;

	return dayNumber;
}

/*
その月の週の数を取得
return int
*/
Date.prototype.getWeekNumber = function(){
	var dayNumber = this.getDayNumber();
	var weekOfTheDay = this.getDay();

	var weekNumber = Math.ceil((weekOfTheDay + dayNumber) / 7);

	return weekNumber;
}

/*
閏年を考慮して前の月のDateを返す
(3月29日,30日,31日の前の月は2月28日 or 29日)
return Date
*/
Date.prototype.getPreviousMonth = function(){
	var year      = this.getFullYear();
	var month     = this.getMonth();
	var date      = this.getDate();

	var prevYear  = year;
	var prevMonth = month;
	var prevDate  = date;

	if (month == 0){
		prevMonth = 11;
		prevYear--;
	} else if (month == 1 || date > 28){
		prevDate = (this.isLeapYear()) ? 29 : 28;
		prevMonth--;
	} else {
		prevMonth--;
	}
	var retDate = new Date(prevYear,prevMonth,prevDate);
	retDate.resetTime();

	return retDate;
}

/*
閏年を考慮して次の月のDateを返す
(1月29日,30日,31日の次の月は2月28日 or 29日)
return Date
*/
Date.prototype.getNextMonth = function(){
	var year      = this.getFullYear();
	var month     = this.getMonth();
	var date      = this.getDate();

	var nextYear  = year;
	var nextMonth = month;
	var nextDate  = date;

	if (month == 11){
		nextMonth = 0;
		nextYear++;
	} else if (month == 0 || date > 28){
		nextDate = (this.isLeapYear()) ? 29 : 28;
		nextMonth++;
	} else {
		nextMonth++;
	}
	var retDate = new Date(nextYear,nextMonth,nextDate);
	retDate.resetTime();

	return retDate;
}

/*
その月の最初の日付を返す。時間は00:00:00にリセット。
return Date
*/
Date.prototype.getFirstDate = function(){
	var year      = this.getFullYear();
	var month     = this.getMonth();

	var retDate = new Date(year,month,1);
	retDate.resetTime();

	return retDate;
}

/*
読みやすい形式で日付の文字列を出力
return String
*/
Date.prototype.toReadableString = function(){
	var dateArray = this.toHashArray();
	var displayMonth = dateArray["month"] + 1;

	var ret = '';
	ret += dateArray["year"] + '/' + displayMonth + '/' + dateArray["date"];
	return ret;
}

/*
読みやすい形式で日付と時刻の文字列を出力
return String;
*/
Date.prototype.toLongReadableString = function(){
	var dateArray = this.toHashArray();
	var day		= this.getWeekOfTheDay();

	var ret = '';
	ret += this.toReadableString();
	ret += '(' + day + ')' + dateArray["hour"] + ':' + dateArray["minute"] + ':' + dateArray["second"];

	return ret;
}

/*
読みやすい曜日を返す
return String;
*/
Date.prototype.getWeekOfTheDay = function(){
	var day = this.getDay();
	var ret = this.weekOfTheDay[day];
	return ret;
}

/*
読みやすい曜日表示の設定
引数は "7つの要素を持つArray"
return boolean;
*/
Date.prototype.setWeekOfTheDayArray = function(arr){
	var state = (arr.length == 7) ? true : false;
	if (state){
		this.weekOfTheDay = arr;
	}
	
	return state;
}

Date.prototype.weekOfTheDay = new Array("日","月","火","水","木","金","土");
// Date.prototype.weekOfTheDay = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");


Reference

最速インターフェース研究会 - 2005-10-06 - 実践JavaScriptリファクタリング
http://la.ma.la/blog/diary_200510060733.htm
最速インターフェース研究会 - 2005-10-06 - 実践JavaScriptリファクタリング、その2
http://la.ma.la/blog/diary_200510062243.htm

インタラクティブな入力チェックフォーム

Summary

Remember The MilkというサイトのSignupフォームが素晴らしい.
氏名からユーザ名を自動生成,パスワードのチェック,メールアドレスのチェックが行われる.
Remember The MilkのSignupフォーム

Reference

Remember The Milk - Signup
http://www.rememberthemilk.com/signup/

via

最速インターフェース研究会 - 2005-12-15 - 全てのWeb開発者必見 : remember the milk のサインアップフォーム
http://la.ma.la/blog/diary_200512151101.htm

GeSHi - Generic Syntax Highlighter

Summary

プログラムソース・ハイライトソフトウェア.
非常に多くの言語に対応.
GeSHi

追記[2007-03-20] Debian パッケージになっていた.

% aptitude show php-geshi
Package: php-geshi
State: not installed
Version: 1.0.7.17-1
Priority: optional
Section: web
Maintainer: Mediawiki Maintenance Team <pkg-mediawiki-devel@lists.alioth.debian.org>
Uncompressed Size: 1540k
Depends: php5 | php5-cli | php4 | php4-cli
Description: Generic Syntax Highlighter
 GeSHi aims to be a simple but powerful highlighting class, with the following goals:

 * Support for a wide range of popular languages
 * Easy to add a new language for highlighting
 * Highly customisable output formats

 GeSHi aims to do this all as quickly as possible. Many customisable features of GeSHi facilitate speed increases, and you can easily
 find a balance between the amount of highlighting done and the speed in which it is done.

 Homepage: http://qbnz.com/highlighter/


Reference

GeSHi - Generic Syntax Highlighter
http://qbnz.com/highlighter/

GeSHi - Generic Syntax Highlighter - Demo
http://qbnz.com/highlighter/demo.php

PHP Classes - Award winners
http://www.phpclasses.org/winners.html

GeSHi - 1.2 Demo
http://geshi.org/

via

MOONGIFT - GeSHi
http://oss.moongift.jp/intro/i-889.html

全信協スパムクローラー対策

mod_rewriteを利用

# For spambot
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTP_REFERER}     ^$
	RewriteCond %{REMOTE_HOST}      marunouchi\.tokyo\.ocn\.ne\.jp$
	RewriteCond %{HTTP_USER_AGENT}  "^Mozilla/4.0 \(compatible; MSIE 6\.0; Windows 98\)$"
	RewriteCond %{SERVER_PROTOCOL}  ^HTTP/1\.0$
	RewriteRule .* - [F,L]
</IfModule>


[2006-04-17] 追記

World Wide Walker: 全信協spamクローラのフィルタ より引用
より多くの spam crawler 対策が可能に.
# For spambot
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteOptions inherit
	RewriteCond %{HTTP_REFERER}     ^$
	RewriteCond %{REMOTE_HOST}      marunouchi\.tokyo\.ocn\.ne\.jp$ [OR]
	RewriteCond %{REMOTE_HOST}      tokyo-ip\.dti\.ne\.jp$ [OR]
	RewriteCond %{REMOTE_HOST}      odn\.ad\.jp$ [OR]
	RewriteCond %{REMOTE_HOST}      tky\.mesh\.ad\.jp$ [OR]
	RewriteCond %{REMOTE_HOST}      ap\.gmo-access\.jp$
	RewriteCond %{HTTP_USER_AGENT}  "^Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows 98\)$"
	RewriteCond %{SERVER_PROTOCOL}  ^HTTP/1\.0$
	RewriteRule .* - [F,L]
</IfModule>


注意

通常,RewriteRule は下層ディレクトリにも引き継がれる.
別途 RewriteEngine On による Rewrite 設定をしている場合には,
以下の記述がないとルールが上書きされるようだ.
RewriteEngine On
RewriteOptions inherit

Reference

KMsWiki: WiKicker - このWikiForumを提供しているWikiEngine
http://www.xdelta.net/wiki/WiKicker.html
羊堂日記 - 2005-06-27
http://sheepman.parfait.ne.jp/20040627.html#p01
羊堂本舗 ちょき - Rewrite Rule
http://sheepman.parfait.ne.jp/wiki/RewriteRule
void GraphicWizardsLair( void ); // - 2004-06-24
http://www.otsune.com/diary/2004/06/24.html
World Wide Walker: 全信協spamクローラのフィルタ
http://yoosee.net/d/archives/2006/04/04/002.html

マウスホイールイベントの登録

Summary

prototype.js を読み込んだ後に wheel_event.js を読み込むと,
mousewheelイベントを扱えるようになる.
イベントハンドラの第二引数にホイールカウント(1 or -1)が入ってくる.
Event.observe(element, 'mousewheel', function(element, wheel_count){
	wheel_count == 1 ? alert('wheel up') : alert('wheel down');
});


ブラウザのホイールを無効にする

event.preventDefault ? event.preventDefault() : (event.returnValue = false);


Reference

mouse wheel event demo
http://rails2u.com/misc/wheel_event/

via

2nd life - 2005-12-08 - prototype.js with mousehweel event
http://d.hatena.ne.jp/secondlife/20051208/1134020332

Mobile Link Discovery 仕様

Summary

XHTML/RSS/Atom においてモバイル版 URL へのリンクをメタデータに埋め込む仕様: Mobile Link Discovery について

XHTML

<link rel="alternate" media="handheld" type="text/html" href="{mobile URL}" />


Atom

<link rel="alternate" x:media="handheld" type="text/html" href="{mobile URL}" />


RSS

<rss xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:link rel="alternate" media="handheld" type="text/html" href="{mobile URL}" />


Reference

Six Apart - Docs: Mobile Link Discovery spec
http://www.sixapart.jp/docs/tech/mobile_link_discovery_en.html
Six Apart - Docs: Mobile Link Discovery 仕様
http://www.sixapart.jp/docs/tech/mobile_link_discovery_ja.html

via

cl.pocari.org - 2005-12-09 - Mobile Link Discovery 仕様
http://cl.pocari.org/2005-12-09-4.html

TypeKey - Six Apartが提供するオンライン認証システム

Summary

Six Apartが提供するオンライン認証システム.

シックス・アパートでは、TypeKeyでの認証をあなたが作ったアプリケーションに組み込むことができるように
ドキュメントを提供する予定です。
また商用アプリケーションでTypeKeyを利用するときに必要な情報も同時期に提供する予定です。


取得してみた

http://profile.typekey.com/xight/

Reference

Six Apart: TypeKey
http://www.sixapart.jp/typekey/

ApacheのSSL証明書更新

ApacheのSSL証明書更新後はrestartでは再起動できない

以下のエラーが発生

[06/Dec/2005 00:01:03 10178] [error] Init: (www.example.com:443) You have to perform a *full* server restart when you added or removed a certificate and/or key file


# apachectl stop
# apachectl startssl

が必要

入力行に時刻を付けて吐き出すフィルタ

Source

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qq(strftime);
$| = 1;
while (defined(my $line = <>)) {
	print strftime('%Y/%m/%d %H:%M:%S ', localtime), $line;
}

Usage

% ping localhost | puttime
2005/12/09 02:16:08 PING localhost (127.0.0.1): 56 data bytes
2005/12/09 02:16:08 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.0 ms
2005/12/09 02:16:09 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.0 ms
2005/12/09 02:16:10 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.0 ms
2005/12/09 02:16:11 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.0 ms
2005/12/09 02:16:12 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.0 ms

- Reference
スペースモラトリアムノカミサマ - 2005-12-05 - 入力行に時刻を付けて吐き出すフィルタ
http://pmakino.jp/tdiary/20051205.html#p01

via

cl.pocari.org - 2005-12-06 - 入力行に時刻を付けて吐き出すフィルタ
http://cl.pocari.org/2005-12-06-7.html

Trackword - トラックワード

Summary

ブログの各ページが検索エンジンからはじめて検索されたときと
毎日の検索結果総数を通知する RSS

Source Sample

<!-- track word -->
<ul>
	<li>
		<a href="http://www.trackword.net/">
		<img 
		  src="http://www.trackword.net/img/minilogov.gif"
		  alt="blog seo tool : track word"
		  width="120"
		  height="14"
		/>
		</a>
	</li>
	<li>
		<a href="http://my.trackword.net/u/xight/1">blog SEO tool</a>
	</li>
	<li>
		<a href="http://my.trackword.net/u/xight/2"></a>
	</li>
	<li>
		<a href="http://my.trackword.net/u/xight/3"></a>
	</li>
	<li>
		<a href="http://my.trackword.net/u/xight/4"></a>
	</li>
	<li>
		<a href="http://my.trackword.net/u/xight/5"></a>
	</li>
</ul>
<script type="text/javascript" src="http://az.trackword.net/show.phtml?r=xight" charset="utf-8"></script>

Reference

トラックワード
http://www.trackword.net

簡単! やさしいセキュリティ教室

Reference

三井住友銀行 > 簡単!やさしいセキュリティ教室
http://www.smbc.co.jp/kojin/security/

via

高木浩光@自宅の日記 - ウハ、三井住友銀行の素晴らしいセキュリティ教室
http://takagi-hiromitsu.jp/diary/20051206.html#p01
スラッシュドット ジャパン | SMBC「簡単!やさしいセキュリティ教室」
http://slashdot.jp/security/article.pl?sid=05/12/07/0553202

モンゴリアン・チョップ

Summary

高田 延彦がプロデュースしたジンギスカン料理店.
ここでジンギスカンにはまりました.

Data

住所 東京都港区芝5-17-11
営業時間 17:30 - 24:00, 17:30〜25:00 (金曜日)
定休日 日曜日
電話番号 03-5444-2941
最寄駅 田町, 三田



Reference

ハッスル: モンゴリアン・チョップ
http://www.hustlehustle.com/free/special/mongolianchop/
ハッスル: インフォメーション - ジンギスカン専門店『モンゴリアン・チョップ』が東京・田町と大阪・難波にオープン!
http://www.hustlehustle.com/free/information/?id=1110426730&yy=2005&mm=03

Verisign サーバID (SSL証明書) 導入メモ

サーバIDの有効期間開始日

ベリサインでの全ての認証作業完了後,発行する日が起点
発行されたサーバIDは,その時点で有効な証明書になっている.
受領後は直ぐにインストールして利用が可能.

シール掲載方法

コモンネームが example.com の場合
<script src="https://seal.verisign.com/getseal?host_name=example.com&size=M&use_flash=YES&use_transparent=YES&lang=ja">
</script>

Reference

サーバIDの有効期間開始日はいつになるのでしょうか
http://www.verisign.co.jp/server/help/faq/110103/
サーバID - シール掲載方法 (Flash)
http://www.verisign.co.jp/securesite/instructions_f.html

ホームページ制作者のためのWebアクセシビリティ解説書

Reference

ホームページ制作者のためのWebアクセシビリティ解説書
http://it.jeita.or.jp/perinfo/committee/accessibility/web/H13Report/
情報処理機器・ソフトウェア開発者のためのアクセシビリティ指針解説書
http://it.jeita.or.jp/perinfo/committee/accessibility/web/H12Revised/

CopyURL+ のカスタマイズ

Summary

user.jsでカスタマイズ可能
user_pref('copyurlplus.menus.1.label', 'タイトルと URL のコピー (via:)');
user_pref('copyurlplus.menus.1.copy', '- via: %TITLE%\n(タブ)  %URL%');
user_pref('copyurlplus.menus.2.label', 'タイトルと URL のコピー (ヘッダ)');
user_pref('copyurlplus.menus.2.copy', '%TITLE%:\n(タブ)  %URL%\n(タブ)\n(タブ)  ');

Reference

cl.pocari.org - 2005-12-03 - Firefox 拡張 copyurlplus のメモ
http://cl.pocari.org/2005-12-03-4.html
mozdev.org - CopyURL+
http://copyurlplus.mozdev.org/

Inaccessibility of CAPTCHA

Summary

CAPTCHAはアクセシビリティを低下させる.
小規模のサイトでは,spamフィルタリングやヒューリスティックなアプローチを用いてほしい.

Reference

W3C - Inaccessibility of CAPTCHA
http://www.w3.org/TR/2005/NOTE-turingtest-20051123/

via

[結]2005年12月 - www.textfile.org
http://www.hyuki.com/t/200512.html#i20051201163832