スタッフブログ
Services_Google_Calendar ( http://openpear.org/package/Services_Google_Calendar )は,
文字通り,GoogleCalendarをコントロールするライブラリです.
GoogleCalendarには,Google Calendar Data API (http://code.google.com/intl/ja/apis/calendar/)があり,
本ライブラリはこのAPIを使って,カレンダー制御を実現しています.
使い方は,パッケージのサイトを見てもらうとわかるように,インスタンスを作成し,getEventsでイベント取得.
addEventでイベント登録になっています.
イベントの参照
イベントの登録
このように非常に簡単に操作できるのですが,
この操作を行う前にしっておかなければいけない要素が3つあります.
それは,「カレンダーのid」「パスワード」「ハッシュ」です.
カレンダーのidとは文字通り,カレンダー毎に割りふられたidです.
プログラム上ではこれを引数に指定する事でカレンダーを指定します.
プライマリーカレンダー(アカウントを作った時に最初にできているカレンダー)の場合,
カレンダーのidは,gmailのメールアドレスになっています.
が,後で作ったカレンダーは,ランダムなidがついているので,参照時にこれを指定する必要があります.
カレンダーのidは,googleカレンダーにログインし,カレンダーの設定から「限定公開URL」のXMLフィードのURLで調べる事ができます.
限定公開URLは以下のような形式になっています.
この中の[ID]が,カレンダーのidになっています.
パスワードとは,そのままgmailのパスワードを示します.特に説明の必要はありませんね.
ハッシュとは,先ほどの限定公開URLにある[HASH]の部分の事です.
カレンダーidとハッシュを指定する事で,プライベートなイベントを取得する事ができます.
今まで,Google CalendarのAPIは難しそうだからとicalを出力して,それをGoogle Calendarに読ませていたのですが,
icalは表示できる量に制限があるので,これからはServices_Google_Calendarでイベント登録をしていこうと思います.
文字通り,GoogleCalendarをコントロールするライブラリです.
GoogleCalendarには,Google Calendar Data API (http://code.google.com/intl/ja/apis/calendar/)があり,
本ライブラリはこのAPIを使って,カレンダー制御を実現しています.
使い方は,パッケージのサイトを見てもらうとわかるように,インスタンスを作成し,getEventsでイベント取得.
addEventでイベント登録になっています.
イベントの参照
require_once 'Services/Google/Calendar.php';
// initialize
$gc = new Services_Google_Calendar();
// get events data
$public_data = $gc->getEvents($gmail_id);
// get events data (private mode)
$private_data = $gc->getEvents($gmail_id, $hash);
イベントの登録
require_once 'Services/Google/Calendar.php';
// initialize
$gc = new Services_Google_Calendar($gmail_id, $passwd);
// set event data
$entry['title'] = 'Event title';
$entry['content'] = 'Event description';
$entry['where'] = 'Where the event helds';
$entry['when'][0] = '2006-10-20';
$entry['when'][1] = '2006-10-24';
$entry['transparency'] = 'transparent';
$entry['visibility'] = 'private';
// add an event
$result = $gc->addEvent($entry);
このように非常に簡単に操作できるのですが,
この操作を行う前にしっておかなければいけない要素が3つあります.
それは,「カレンダーのid」「パスワード」「ハッシュ」です.
カレンダーのidとは文字通り,カレンダー毎に割りふられたidです.
プログラム上ではこれを引数に指定する事でカレンダーを指定します.
プライマリーカレンダー(アカウントを作った時に最初にできているカレンダー)の場合,
カレンダーのidは,gmailのメールアドレスになっています.
が,後で作ったカレンダーは,ランダムなidがついているので,参照時にこれを指定する必要があります.
カレンダーのidは,googleカレンダーにログインし,カレンダーの設定から「限定公開URL」のXMLフィードのURLで調べる事ができます.
限定公開URLは以下のような形式になっています.
http://www.google.com/calendar/feeds/[ID]@group.calendar.google.com/private-[HASH]/basic
この中の[ID]が,カレンダーのidになっています.
パスワードとは,そのままgmailのパスワードを示します.特に説明の必要はありませんね.
ハッシュとは,先ほどの限定公開URLにある[HASH]の部分の事です.
カレンダーidとハッシュを指定する事で,プライベートなイベントを取得する事ができます.
今まで,Google CalendarのAPIは難しそうだからとicalを出力して,それをGoogle Calendarに読ませていたのですが,
icalは表示できる量に制限があるので,これからはServices_Google_Calendarでイベント登録をしていこうと思います.
haltです.
openpear.orgには便利なライブラリがたくさん公開されています.その中でも簡単に使えておもしろいものを紹介していこうと思います.
Keires_Feed ( http://openpear.org/package/Keires_Feed )は,KOYAMA氏がRasmus Leodorf氏のsimple_rss.phpをベースに作成したフィードパーサで,主要なフィード形式のほとんどをサポートしています.
PHPのフィードパーサは今までにもたくさんありましたが,どれも使いづらいか,Atomなどの特定の形式に対応しきれていないなど,問題を抱えていて,決定打となるライブラリがありませんでした.その穴を埋めてくれるのがKeires_Feedです.
使い方は非常に簡単で,以下のようにする事でフィード一覧を表示できます.
インストールは,openpearなのでPEARコマンドで
としてインストールするのが簡単です.自分はパッケージリストに登録したくなかったので「svn export http://svn.openpear.org/Keires_Feed/tags/0.1.0-beta
」としてダウンロードしました.
Keires_Feedの素晴しさはそのフィードパーサとしての性能だけではありません.
コードが非常に美しく,PHP5の良い部分をうまく引き出して書かれています.implements Iteratorや例外の使い方など,PHP4時代のコーディングスタイルから抜けきれていない人には学ぶべき点が多いです.
PHPでフィードを読む場合はKeires_Feedが現在の所最強である事は確実でしょう.
openpear.orgには便利なライブラリがたくさん公開されています.その中でも簡単に使えておもしろいものを紹介していこうと思います.
Keires_Feed ( http://openpear.org/package/Keires_Feed )は,KOYAMA氏がRasmus Leodorf氏のsimple_rss.phpをベースに作成したフィードパーサで,主要なフィード形式のほとんどをサポートしています.
PHPのフィードパーサは今までにもたくさんありましたが,どれも使いづらいか,Atomなどの特定の形式に対応しきれていないなど,問題を抱えていて,決定打となるライブラリがありませんでした.その穴を埋めてくれるのがKeires_Feedです.
使い方は非常に簡単で,以下のようにする事でフィード一覧を表示できます.
require_once 'Keires/Feed.php';
$url = 'http://ryus.co.jp/modules/d3blog/index.php?page=rss';
$feed = new Keires_Feed($url);
$feed->parse();
var_dump($feed->getItems());
インストールは,openpearなのでPEARコマンドで
sudo pear install openpear/Keires_Feed-beta
としてインストールするのが簡単です.自分はパッケージリストに登録したくなかったので「svn export http://svn.openpear.org/Keires_Feed/tags/0.1.0-beta
」としてダウンロードしました.
Keires_Feedの素晴しさはそのフィードパーサとしての性能だけではありません.
コードが非常に美しく,PHP5の良い部分をうまく引き出して書かれています.implements Iteratorや例外の使い方など,PHP4時代のコーディングスタイルから抜けきれていない人には学ぶべき点が多いです.
PHPでフィードを読む場合はKeires_Feedが現在の所最強である事は確実でしょう.
haltです.Skypeという,通話やチャットができる便利なアプリケーションがあるのですが,これは一度に1つのアカウントしか利用できません.
用途に分けてアカウントを作った場合,わざわざログインしなおすのは手間です.
Windows XPの場合「別ユーザで実行する」という機能によって他のアカウントの権限でSkypeを起動すれば2つのSkypeを同時に起動する事ができるのですが,Windows Vistaの場合,このメニューがありません.同様の効果を持つrunasコマンドを利用してもなぜかうまくいきません.
そこで,elevateコマンド(http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx)を利用して,管理者ユーザで1つ.一般ユーザで1つという形でSkypeの2つの起動を実現します.
Elevation2008_06.exeをダウンロード,elevateコマンドをインストールした後,一般ユーザでSkype起動した後にコマンドラインから以下のように入力します.(USERNAMEの部分は一般ユーザの名前に変更してください)
うまくいけば2つ目のSkypeが起動するはずです.このコマンドをバッチファイルとして登録しておいて,スタートアップや,任意のタイミングで起動できるようにしておくとよいでしょう.
用途に分けてアカウントを作った場合,わざわざログインしなおすのは手間です.
Windows XPの場合「別ユーザで実行する」という機能によって他のアカウントの権限でSkypeを起動すれば2つのSkypeを同時に起動する事ができるのですが,Windows Vistaの場合,このメニューがありません.同様の効果を持つrunasコマンドを利用してもなぜかうまくいきません.
そこで,elevateコマンド(http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx)を利用して,管理者ユーザで1つ.一般ユーザで1つという形でSkypeの2つの起動を実現します.
Elevation2008_06.exeをダウンロード,elevateコマンドをインストールした後,一般ユーザでSkype起動した後にコマンドラインから以下のように入力します.(USERNAMEの部分は一般ユーザの名前に変更してください)
elevate "C:\Program Files\Skype\Phone\Skype.exe" /datapath:C:\Users\USERNAME\AppData\Roaming\Skype_work\
うまくいけば2つ目のSkypeが起動するはずです.このコマンドをバッチファイルとして登録しておいて,スタートアップや,任意のタイミングで起動できるようにしておくとよいでしょう.
haltです.
三連休を利用して,ザ・ペニンシュラ東京(http://www.peninsula.com/Tokyo/jp/default.aspx)に宿泊してきました.
近年,マンダリンオリエンタル,ザ・リッツカールトン,ペニンシュラ等,外資系世界最高級ホテルの多くが進出.
東京をにぎわせていますが,自分は一度もこのクラスのホテルに宿泊した事がなかったので,
時間のできた三連休に宿泊してきました.
香港からきたホテルという事で,オリエンタルな雰囲気があり,非常に落ちつきます.外に出るのが億劫になるくらいです.
ベッドサイドにあるコンソールでなんでも操作できるのも動く気力をそいでくれます.
ディナーはヘイフンテラス等のホテル内レストランもよかったのですが,
猛烈にフレンチが食べたくなったので銀座のビストロ ヌガ(http://www.lenougat.jp/)に.
低価格でちゃんとしたフレンチを楽しむ事ができるのでオススメです.
IT関係の仕事をしていると休日でもついついコンピュータの前に座って仕事の事を考えてしまったりしますが,たまにはコンピュータのない所でゆっくり過ごすのも良いのではないでしょうか.
三連休を利用して,ザ・ペニンシュラ東京(http://www.peninsula.com/Tokyo/jp/default.aspx)に宿泊してきました.
近年,マンダリンオリエンタル,ザ・リッツカールトン,ペニンシュラ等,外資系世界最高級ホテルの多くが進出.
東京をにぎわせていますが,自分は一度もこのクラスのホテルに宿泊した事がなかったので,
時間のできた三連休に宿泊してきました.
香港からきたホテルという事で,オリエンタルな雰囲気があり,非常に落ちつきます.外に出るのが億劫になるくらいです.
ベッドサイドにあるコンソールでなんでも操作できるのも動く気力をそいでくれます.
ディナーはヘイフンテラス等のホテル内レストランもよかったのですが,
猛烈にフレンチが食べたくなったので銀座のビストロ ヌガ(http://www.lenougat.jp/)に.
低価格でちゃんとしたフレンチを楽しむ事ができるのでオススメです.
IT関係の仕事をしていると休日でもついついコンピュータの前に座って仕事の事を考えてしまったりしますが,たまにはコンピュータのない所でゆっくり過ごすのも良いのではないでしょうか.
セールで買ったシルバーアクセサリーの福袋が割と当たりだったhaltです.
C#のHttpWebRequestクラスを利用するとGETやPOSTによるHTTP通信を行う事ができます.以下は割と適当に書いたHttpPostを行うメソッドです.
(Cookieはメンバ変数から拾っているのでそのままでは動作しません)
第一引数に送信先のurlを指定し,第二引数に送信する内容をDictionary形式で指定する事で,データを送信する事ができます.
ようは,送信したい値をname=value形式でつないでencodeしたものを付加するのですが,
textareaやtextboxの内容を送信する事はできるのですが,checkboxのような,一つのnameに対して複数の値を持つ要素を送信する方法がわかりません.
詳しい人に聞いてみた所,checkboxのような複数の値を持つものは,以下のように,送信する数だけname=value形式で連結すれば良いそうです.
となると,キーがuniqueなDictionary形式は使えないですね.専用の構造体を作った方がいいのかもしれません.
C#のHttpWebRequestクラスを利用するとGETやPOSTによるHTTP通信を行う事ができます.以下は割と適当に書いたHttpPostを行うメソッドです.
(Cookieはメンバ変数から拾っているのでそのままでは動作しません)
第一引数に送信先のurlを指定し,第二引数に送信する内容をDictionary形式で指定する事で,データを送信する事ができます.
private string HttpPost(string url, Dictionary<string, string> vals) {
string param = "";
foreach (string k in vals.Keys) {
string key = k.Replace("#", "");
param += String.Format("{0}={1}&", key, vals[k]);
}
byte[] data = Encoding.ASCII.GetBytes(param);
// リクエストの作成
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
req.CookieContainer = _cookieContainer;
// ポスト・データの書き込み
System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
System.Net.WebResponse res = req.GetResponse();
// レスポンスの読み取り
System.IO.Stream resStream = res.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, encoder);
string result = sr.ReadToEnd();
sr.Close();
resStream.Close();
return result;
}
ようは,送信したい値をname=value形式でつないでencodeしたものを付加するのですが,
textareaやtextboxの内容を送信する事はできるのですが,checkboxのような,一つのnameに対して複数の値を持つ要素を送信する方法がわかりません.
詳しい人に聞いてみた所,checkboxのような複数の値を持つものは,以下のように,送信する数だけname=value形式で連結すれば良いそうです.
my_check=1&my_check=2&my_check=3...
となると,キーがuniqueなDictionary形式は使えないですね.専用の構造体を作った方がいいのかもしれません.
haltです.
急にアクセスのmdbファイルに格納されたデータをCSVで取得する必要があり,OpenOfficeでなんとかできないか調べてみた結果,できたので紹介します.
最初は,MS OfficeのAccessにあたる機能がOpenOffice.orgではBaseという名前で提供されているので,Baseから直接mdbファイルを開けばなんとかなると思ったのですが,どうもmdbファイルのサイズが大きいと読み込みに時間がかかるようなので,直接開かず,mdbデータベースに接続する形でデータにアクセスします.
Baseには,データベースの内容をコントロールする機能はあるのですが,CSVに出力する機能はありません.そこで今度は,MS OfficeのExcelにあたる,Calcを開き,データソースとして先ほどのBaseを指定し,データをCalcにおとします.
あとは,Calcから「名前を付けて保存」でcsvとして保存するだけです.
複数のソフトを起動する必要があるので非常に面倒ですが,Accessをもっていなくても無料でデータを利用できるので,Accessが入っていないマシンでの作業が必要になった時は試してみるといいかもしれません.
急にアクセスのmdbファイルに格納されたデータをCSVで取得する必要があり,OpenOfficeでなんとかできないか調べてみた結果,できたので紹介します.
最初は,MS OfficeのAccessにあたる機能がOpenOffice.orgではBaseという名前で提供されているので,Baseから直接mdbファイルを開けばなんとかなると思ったのですが,どうもmdbファイルのサイズが大きいと読み込みに時間がかかるようなので,直接開かず,mdbデータベースに接続する形でデータにアクセスします.
Baseには,データベースの内容をコントロールする機能はあるのですが,CSVに出力する機能はありません.そこで今度は,MS OfficeのExcelにあたる,Calcを開き,データソースとして先ほどのBaseを指定し,データをCalcにおとします.
あとは,Calcから「名前を付けて保存」でcsvとして保存するだけです.
複数のソフトを起動する必要があるので非常に面倒ですが,Accessをもっていなくても無料でデータを利用できるので,Accessが入っていないマシンでの作業が必要になった時は試してみるといいかもしれません.
haltです.
唐突ですが,Webアプリケーションが抱えている致命的な問題点として,「オフラインになると,アプリケーションとして全く機能しなくなる」という点があると思います.
例えば,ログインが必要な掲示板やグループウェアに書き込みをしている途中に一度オフラインになってしまうと,投稿しようとしたデータが反映されずログイン画面に戻されてしまう事がよくあります.
Googleが提供するGearsというブラウザの拡張機能を利用すると,JavaScriptからユーザのハードディスクにデータを保存できるようになるので,たとえ途中で接続が途切れても,データを一時的に保存しておいて,後で送信する.というような事が可能になります.
以下はデータを保存する最低限のサンプルです.引数に指定したデータを保存します.
Gearsが公開されていから随分たつのにインストールする手間が必要なせいか,積極的に使われている事例を見たことがありませんが,今後はこういったオフラインでも使えるような仕組みが少しずつ増えていくのかもしれません.
唐突ですが,Webアプリケーションが抱えている致命的な問題点として,「オフラインになると,アプリケーションとして全く機能しなくなる」という点があると思います.
例えば,ログインが必要な掲示板やグループウェアに書き込みをしている途中に一度オフラインになってしまうと,投稿しようとしたデータが反映されずログイン画面に戻されてしまう事がよくあります.
Googleが提供するGearsというブラウザの拡張機能を利用すると,JavaScriptからユーザのハードディスクにデータを保存できるようになるので,たとえ途中で接続が途切れても,データを一時的に保存しておいて,後で送信する.というような事が可能になります.
以下はデータを保存する最低限のサンプルです.引数に指定したデータを保存します.
<script type="text/javascript" src="gears_init.js"></script>
<script type="text/javascript">
function save(text) {
var db = google.gears.factory.create('beta.database');
db.open('database-test');
db.execute('create table if not exists Test' +
' (Phrase text, Timestamp int)');
db.execute('insert into Test values (?, ?)', [text, new Date().getTime()]);
}
</script>
Gearsが公開されていから随分たつのにインストールする手間が必要なせいか,積極的に使われている事例を見たことがありませんが,今後はこういったオフラインでも使えるような仕組みが少しずつ増えていくのかもしれません.
haltです.
Webアプリケーションは,ブラウザさえあれば,専用のソフトをインストールしなくても,パソコンや様々な種類のOSで利用できます.
一方で,ブラウザとは別にWebサーバが必要になり,これを用意するのは初心者には困難です.興味のあるWebアプリケーションをみつけても,使えるようになるには,自分でサーバを用意してセットアップしてインストールする必要があるので,普通の人にはコストが大きすぎます.
そういった問題を解決するプロジェクトがWARPです.
http://warp.ws/
Windowsを利用している人なら,上記サイトからファイルをダウンロードして,解凍.Server_start.batをダブルクリックするだけで,自分のパソコンの中でWebアプリケーションを動かす事ができます.
こういった「気軽に試せる」という内容のソフトは昔からあったのですが,これまでのものは,インストール作業が発生するので面倒でした.また「10分くらい使ってみて,ダメだったら使わない.」ような人の場合,そもそもインストールとアンインストールで10分以上かかるので,手を出す気になれませんでした.
WARPは,インストール作業なしでダブルクリックだけで即座に試す事ができます.アンインストールもフォルダを削除するだけです.
これまで「XOOPSやその他のWebアプリを試してみたいが,わざわざインストールするのは面倒」と思っていた人は是非試してみてください.
Webアプリケーションは,ブラウザさえあれば,専用のソフトをインストールしなくても,パソコンや様々な種類のOSで利用できます.
一方で,ブラウザとは別にWebサーバが必要になり,これを用意するのは初心者には困難です.興味のあるWebアプリケーションをみつけても,使えるようになるには,自分でサーバを用意してセットアップしてインストールする必要があるので,普通の人にはコストが大きすぎます.
そういった問題を解決するプロジェクトがWARPです.
http://warp.ws/
Windowsを利用している人なら,上記サイトからファイルをダウンロードして,解凍.Server_start.batをダブルクリックするだけで,自分のパソコンの中でWebアプリケーションを動かす事ができます.
こういった「気軽に試せる」という内容のソフトは昔からあったのですが,これまでのものは,インストール作業が発生するので面倒でした.また「10分くらい使ってみて,ダメだったら使わない.」ような人の場合,そもそもインストールとアンインストールで10分以上かかるので,手を出す気になれませんでした.
WARPは,インストール作業なしでダブルクリックだけで即座に試す事ができます.アンインストールもフォルダを削除するだけです.
これまで「XOOPSやその他のWebアプリを試してみたいが,わざわざインストールするのは面倒」と思っていた人は是非試してみてください.
haltです.
最近OutputzというFirefoxのアドオンをインストールしました.
このアドオンをインストールすると,ブラウザから送信した文章の量と時間をカウントし,インストールした人がどのくらいの時間にどれくらいの文章をブラウザで書いたかがわかるようになります.
私の場合は21時ごろが一番文章をかいているようです.
ブラウザ以外のツールも使うので,当然これだけでは仕事をやっているかどうかは判別できませんが,
Outputzをインストールして自分の行動について調べてみるとおもしろい事がわかるかもしれません.
最近OutputzというFirefoxのアドオンをインストールしました.
このアドオンをインストールすると,ブラウザから送信した文章の量と時間をカウントし,インストールした人がどのくらいの時間にどれくらいの文章をブラウザで書いたかがわかるようになります.
私の場合は21時ごろが一番文章をかいているようです.
ブラウザ以外のツールも使うので,当然これだけでは仕事をやっているかどうかは判別できませんが,
Outputzをインストールして自分の行動について調べてみるとおもしろい事がわかるかもしれません.
haltです.
「親指シフト」という入力方式をご存知でしょうか.文字通り,SHIFTキーがスペースの下の親指がつくあたりに設置されているキーボードで,態々キーボードの端まで指を伸ばさなくてもシフトが押せるというキーボードです.
この「親指シフト」スタイルの入力方式は,タイピングコンテストでは普通のキーボードよりも入力が速すぎて別部門として扱われるほど高速に入力できるそうです.
と,聞くと自分も使ってみたいと思うのですが,残念ながら私のノートパソコンのキーボードには親指シフトキーがないのでできません.
そこで,スペースキーの挙動を変える事で,擬似的に親指シフトを実現するSandSという仕組みを使って親指シフトに自分の環境を近づけてみます.
キーバインドを変更するには窓使いの憂鬱(http://mayu.sourceforge.net/)というソフトを利用します.このソフトはWindows Vistaには正式対応していないので,Vistaユーザの方はのどか(http://www.appletkan.com/nodoka.htm)を利用しましょう.
ソフトをインストールしたら設定ファイルに以下のように書けばSandSの設定ができます.
スペースキーを押し込んだ状態の時に,シフトキーを押しているのと同じ状態になります.大文字のAを入力する場合は,スペースキーを押したままAを押します.
スペースを入力する時はスペースキーを押し込んでそのまま離してください.
キーにはキーを押した状態(onkeydown)と話した状態(onkeyup)があり,押した状態でSHIFT.離した状態でSpaceになるのがSandSです.
ちょっと使ってみるとわかるのですが,ホームポジションから指が離れる時間が圧倒的に少なくなります.(元々完璧なフォームでタイピングしてる人はそんな事ないのかもしれませんが…)
今までとは指の動きが変わってしまうので早く入力するには慣れが必要ですが,高速入力にチャレンジしたい人は設定してみる事をオススメします.
ちなみに上の設定をしても今まで通り普通のSHIFTキーはそのまま使えるのでとりあえず設定しておいて徐々に慣らしていくという事もできます.
「親指シフト」という入力方式をご存知でしょうか.文字通り,SHIFTキーがスペースの下の親指がつくあたりに設置されているキーボードで,態々キーボードの端まで指を伸ばさなくてもシフトが押せるというキーボードです.
この「親指シフト」スタイルの入力方式は,タイピングコンテストでは普通のキーボードよりも入力が速すぎて別部門として扱われるほど高速に入力できるそうです.
と,聞くと自分も使ってみたいと思うのですが,残念ながら私のノートパソコンのキーボードには親指シフトキーがないのでできません.
そこで,スペースキーの挙動を変える事で,擬似的に親指シフトを実現するSandSという仕組みを使って親指シフトに自分の環境を近づけてみます.
キーバインドを変更するには窓使いの憂鬱(http://mayu.sourceforge.net/)というソフトを利用します.このソフトはWindows Vistaには正式対応していないので,Vistaユーザの方はのどか(http://www.appletkan.com/nodoka.htm)を利用しましょう.
ソフトをインストールしたら設定ファイルに以下のように書けばSandSの設定ができます.
mod shift += !!Space
key R-*Space = &Ignore
スペースキーを押し込んだ状態の時に,シフトキーを押しているのと同じ状態になります.大文字のAを入力する場合は,スペースキーを押したままAを押します.
スペースを入力する時はスペースキーを押し込んでそのまま離してください.
キーにはキーを押した状態(onkeydown)と話した状態(onkeyup)があり,押した状態でSHIFT.離した状態でSpaceになるのがSandSです.
ちょっと使ってみるとわかるのですが,ホームポジションから指が離れる時間が圧倒的に少なくなります.(元々完璧なフォームでタイピングしてる人はそんな事ないのかもしれませんが…)
今までとは指の動きが変わってしまうので早く入力するには慣れが必要ですが,高速入力にチャレンジしたい人は設定してみる事をオススメします.
ちなみに上の設定をしても今まで通り普通のSHIFTキーはそのまま使えるのでとりあえず設定しておいて徐々に慣らしていくという事もできます.