Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2014-09-08

100年カレンダー対応富豪的表計算データベース

前回からの続き。その後、改善ポイントに書いたことを実装しながら、表計算カレンダーの改良に努めた。また、調べるほどに、より効率的な方法があることに気付き、何度も修正を繰り返した。同じことができるなら、より少ないシート数、より少ないセル数、より短い数式で実現できた方がエライのだ*1

ハッピーマンデーの日付を求める

  • 西暦YYYY年M月の第1〜4月曜日を求める数式
  • 上から順に、第1・第2・第3・第4月曜日を求める。
= 7 - WEEKDAY(DATE(YYYY年;M月;0);3)
=14 - WEEKDAY(DATE(YYYY年;M月;0);3)
=21 - WEEKDAY(DATE(YYYY年;M月;0);3)
=28 - WEEKDAY(DATE(YYYY年;M月;0);3)

数式の説明...

  • WEEKDAY関数は、日付から曜日を意味する数値1〜7を返す。
  • 日付に続けて指定する引数によって、月曜始まりや、0〜6を返す機能に変化する。
書式
WEEKDAY(日付)
WEEKDAY(日付;1)
1234567
WEEKDAY(日付;2)7123456
WEEKDAY(日付;3)
1と2以外ならこの動作
6012345
  • 月火水木金土日が0123456に対応する時、(7 − 前月末の曜日数) = 第1月曜日の曜日数 となる。よって...
    • 第2月曜日を求めるなら、さらに7を加算して、(14 − 前月末の曜日数)
    • 第3月曜日を求めるなら、さらに7を加算して、(21 − 前月末の曜日数)
    • 第4月曜日を求めるなら、さらに7を加算して、(28 − 前月末の曜日数)

月曜始まりの0から6を返すWEEKDAY関数によって、ハッピーマンデーはシンプルに求められるのだ!

春分・秋分の日付を求める

  • 西暦YYYY年の春分・秋分を求める数式
    • 年月日の「日」を求める。
    • 1900年から2099年まで計算できる。
    • 但し、将来の予測は外れることもある。
春分の日
=INT(21.4471 + 0.242377*(YYYY年 - 1900) - INT((YYYY年 - 1900)/4) )

数式の説明...

  • 21.4471は、1900年に地球が春分点を通過する瞬間の日時。......1900年の春分の日時
    • 21.4471日 = 21日10.7304時 = 21日10時43.824分 = 21日10時43分49秒44
  • 0.242377は、暦の1年と、公転周期の1年で、発生する差異日数。......1年の差異日数
  • 0.242377*(YYYY年 - 1900)は、1900年からYYYY年までの差異日数の合計。......差異日数合計
  • INT((YYYY年 - 1900)/4)は、閏年によって修正された日数。......閏年修正日数
  • 差異日数合計 - 閏年修正日数 = 未修整の差異日数
  • 1900年の春分の日時に、未修整の差異日数を加算することでYYYY年の春分の日を求めているのだ。
秋分の日
=INT(23.8896 + 0.242032*(YYYY年 - 1900) - INT((YYYY年 - 1900)/4) )

数式の説明...

  • 以下の2項目の値を差し替えれば、春分の日の数式と仕組みは同じである。
    • 1900年の秋分の日時=23.8896
    • 1年の差異日数=0.242032
  • 基本的に1年の差異日数は同じになるはずだが、上記数式では異なっている。なぜだろう?
  • 上記数式は完璧なものではなく、実測に近似する値しか求められない。
  • すると、日付が変わる境界値付近では、間違った日付が算出されてしまうことがある。
  • 少なくとも1900〜2099年までは正しい日付が算出できるように補正しているのだ。

たった一つの数式で、春分・秋分の日付を算出できた!

もはや春分table・秋分tableは不要になってしまった。

参考ページ

素晴らしい情報に感謝です!

祝日table

  • 1900年から2099年までの祝日を正確に出力するために、祝日tableに運用開始年と運用終了年を追加した。

f:id:zariganitosh:20140908143611p:image:w450


  • 上記の祝日データベース元に、1年後の祝日データベースも作る。
  • もちろん、数式を使って自動計算されるようにしておくのだ。

f:id:zariganitosh:20140908144440p:image:h450

  • この1年後の祝日データベースをコピーすれば、2年後、3年後...も素早く完成するのだ。

年月日table

  • 1年分の日付をキーにした年月日tableで、振替休日と国民の休日を判定するようにした。

f:id:zariganitosh:20140908150025p:image:h450


			
ABCDEFGHI
1年月日曜日祝日参照祝日判定振替判定1振替判定2国民判定休日種類祝日
...........................
812014/03/21春分の日TRUE-76FALSEFALSE1春分の日
81=A80+1=A81=VLOOKUP(A81;祝日参照;2;0)=ISNA(C81)=0=IF(AND(D81;WEEKDAY(A81)=1);
2;
E80+D81-1)
=E81=1=AND(D80;D83;D81=0;
WEEKDAY(A81)<>1)
=IF(OR(D81;F81;G81);
1;
WEEKDAY(A81))
=IF(D81;C81;
IF(F81;"振替休日";
IF(G81;"国民の休日";"")))

以上の祝日tableと年月日tableが、すべてのカレンダーの基本になる。

デザイン

  • 好みのカレンダーをデザインしたら、年月日tableを参照するだけで、簡単に祝日情報を取得できるのだ。
シフトカレンダー
  • かつて業務で使っていた予定表の雛形

f:id:zariganitosh:20140908160728p:image:w450

表組カレンダー
  • デザインを見慣れたカレンダー風に変更。
  • 1年分を一気に表示してみた。
  • コマンドcal -yに対抗してみた。

f:id:zariganitosh:20140908162214p:image:w960

100年カレンダー
  • 100年分を一気に表示するカレンダー。
  • 1969年(UNIXが誕生した年)から100年分表示してみた。
  • 5月のゴールデンウィーク、9月のシルバーウィークなどが、将来どのような連休形となるか俯瞰できる。

f:id:zariganitosh:20140908161052p:image:w960]

  • 但し、100年分の祝日table・年月日tableに拡張しているので、動作が非常に重い。
    • ファイルを読み込んで開くのに数分かかる。
  • カレンダー 367行401列、年月日table 36526行9列、祝日table 3100行7列という富豪的データベース*2が原因である。
  • 自動再計算をオフにすれば動きは良いのだけど、条件付き書式の更新もオフになるので、土日祝日の色分けも表示されなくなってしまう...。
    • ちなみにOpenOfficeは、ツール >> セルの内容 >> 自動再計算 で切替できる。
  • 100万行を超える最大行数を持ちながら、この動作の重さ。表計算アプリの限界か?

20年カレンダー
  • 100年だと表示年数が多過ぎて、結局一覧できる幅は20年分くらい。
  • ならば欲張って無駄に100年表示するよりも、コンパクトに20年にしておいた方が動作も軽いはず。

f:id:zariganitosh:20140909093310p:image:w960


  • また、1900年以降その年限りの特例的な休日が4回あったことにも気付いた。
  • すべて皇室慶弔行事に伴う休日である。
  • 祝日ではないので、振替休日とか国民の休日を計算する必要はない。
  • 幸いにも、それらの休日は振替休日や国民の休日に影響しない日付となっている。
  • よって、祝日tableに追加してしまっても問題ないはず。

f:id:zariganitosh:20140909092609p:image:w419

参考ページ

素晴らしい情報に感謝です!

*1:それなのに富豪的というタイトル、矛盾している...。

*2:贅沢に広大な行列領域を自由気ままに使っていることをイメージしている。

2014-09-04

表計算アプリでカレンダー作り

勤務予定表や業務予定表など、仕事をしていると月間の予定を書いたカレンダーがどうしても必要になる。今時、素晴らしいカレンダーアプリがたくさんあるのだけど、今でもExcelなどの表計算アプリを使って、自分が所属するチームに合った予定表を作ってしまうことって、よくあると思う。

(もしかして自分だけか?いや、多くの方が同じようなことをやっているという前提で話を進めてしまう)

たいした手間ではないのだけど、毎月、毎年繰り返していると、やはり可能な限りカレンダーを自動生成したくなるのが人情というもの。毎月の単純なコピペの繰り返しは嫌気がさす。一方、手間はかかるけど自動生成されるカレンダーを作り始めると、思わず熱中する。

果たしてどこまで自動化できるのか?

環境

目指すイメージ

  • 業務予定表のイメージはこんな感じ。
  • 土曜は青、日曜と祝日は赤の背景色にする。
  • 祝日の名称もちゃんと入れる。

f:id:zariganitosh:20140903151037p:image:w675

  • A1のセルに「9/1」と入力すれば、9月のカレンダーが出力されるようにしたい。

日付と曜日

  • 多くの表計算アプリは「9/1」と入力すると、入力した年の9月1日と解釈され、日付データに変換される。
数式
  • 日付は1日以降、+1ずつ加算しておく。
  • 曜日は隣の日付データを参照するだけ。

			
AB
12014/09/01曜日
2=A1=A2
3=A2+1=A3
n=An+1=An
書式(二本指タップ >> セル書式の設定(F)...)
  • 上記の日付データを利用して、日付と曜日を簡単に表示できる。

			
AB
12014/09/01曜日
2D[~gengou]NN
3D[~gengou]NN
nD[~gengou]NN

f:id:zariganitosh:20140903154316p:image:w450f:id:zariganitosh:20140903154314p:image:w450

条件付き書式で背景色を設定(メニュー >> 書式 >> 条件付き書式設定...)

  • 土曜は青、日曜は赤で背景色を設定する。(祝日はまだ未設定)
  • 月ごとに曜日は変化するので、条件付き書式で設定するのだ。

f:id:zariganitosh:20140903155955p:image:w450f:id:zariganitosh:20140903155953p:image:w225f:id:zariganitosh:20140903155951p:image:w225

  • ちなみに、条件付き書式で設定した書式(背景赤・背景青など)は、メニュー >> 書式 >> スタイルと書式設定(command-T)で変更・削除できる。

ここまで、日付と曜日は自動的に変化するようになった。

f:id:zariganitosh:20140903160721p:image:w450

祝日の設定は、まだない...。

祝日の難しさ

  • 月日が確定している祝日は、簡単にデータベース化できるが...
  • ハッピーマンデーは、第2月曜日、第3月曜日が何月何日か求める必要がある。
  • 国民の休日は、祝日と祝日に挟まれた平日かどうかを判定しなくてはならない。
  • 振替休日は、日曜日と重なる祝日の判定と、その後に迎える最初の平日を判定しなくてはならない。
  • さらに、春分・秋分については、天文観測の結果を反映させる必要がある。


      • 同様に、国民の休日も「休日」扱いなので、それが日曜日に当たっても振替休日とはならない。
      • そもそも法律上2006年までは、たとえ祝日に挟まれても、日曜日と祝日は除外されていた。
      • 2007年以降は、祝日のみ除外となったが、日曜日はもともと休日なので、あえて「国民の休日」と表記する必要はないのだと思う。
      • 法律上は単に「休日とする」と定義されていて、「国民の休日」という定義はどこにも出てこないので。

祝日テーブル

  • 上記が祝日の仕様書である。
  • 一気にデータベース化するのは難しいので、できる所から徐々にデータベース化していく。
ハッピーマンデー
  • まずは、月日が確定している祝日とハッピーマンデーの祝日から。

f:id:zariganitosh:20140903165247p:image:w675

  • 上記の祝日テーブルには、以下の数式が入っている。
  • ハッピーマンデーについては、段階的に計算している。
    • 月初の曜日を求めて、
    • 第一月曜日の日付を求めて、
    • 求める月曜の週数に応じて、7の倍数を加算している。

			
ABCDEFG
1基準日第何月曜月初曜日第一月曜日幸月曜日祝日日付祝日名称
2=DATE(YEAR(カレンダー.$A$1);1;1) =IF(E2;A2+E2-1;DATE(YEAR(カレンダー.$A$1);MONTH(A2);DAY(A2)))元旦
3=DATE(YEAR(カレンダー.$A$1);1;1)2=WEEKDAY(A3)=MOD(2-C3+7;7)+1=(B3-1)*7+D3=IF(E3;A3+E3-1;DATE(YEAR(カレンダー.$A$1);MONTH(A3);DAY(A3)))成人の日
国民の休日
  • 国民の休日については、祝日と祝日に挟まれる平日を判定する必要がある。
  • 現在の暦では、国民の休日が発生する可能性のある期間は、9月の敬老の日と秋分の日の間のみである。
      • 2007年から、5月4日は「みどりの日」という祝日になった。
      • 4月29日は「みどりの日」から「昭和の日」と改名された。
  • 敬老の日は、必ず月曜日である。
  • 秋分の日は、敬老の日より後だ。
  • よって、敬老の日と秋分の日の差が2日だったら、国民の休日と判定できる。
    • 曜日は必ず月火水の並びになるはずである。
    • 日曜やその他の祝日を挟む可能性はない。

			
ABCDEFG
1基準日第何月曜月初曜日第一月曜日幸月曜日祝日日付祝日名称
.....................
129月1日321152014/9/15敬老の日
13 =IF(F14-F12=2;F12+1;"")国民の休日
149月23日 2014/9/23秋分の日

祝日の表示

  • ひとまず祝日tableが完成したら、VLOOKUP関数で参照して、カレンダーに祝日を表示すればいいのだ。
    • 春分の日・秋分の日については、暫定的に2014年の月日を手入力しておいた。

f:id:zariganitosh:20140903175154p:image:w450


			
ABC
12014/09/01曜日祝日
21=VLOOKUP(A2;祝日table.$F$2:$G$20;2;0)

振替休日

  • 祝日が日曜と重なったら、振替する必要がある。
  • その後最初に迎える平日を判定する必要がある。
  • 振替は、必ずしも翌日になる訳ではないのだ。
  • 例えば、5月3日が日曜日だった場合、振替の遅延が最大3日後になる可能性がある。
  • そのことを考慮して、いくつか列を追加して、段階的に振替休日を判定してみる。

f:id:zariganitosh:20140903181404p:image:w450


			
ABCDEFGHIJ
12020/05/01曜日祝日参照祝日判定振替判定1振替判定2振替判定3振替判定4休日種類祝日
..............................
43憲法記念日=ISNA(C4)=0=AND(D4;WEEKDAY(A4)=1)=IF(AND(E4;D5;D6);5;
IF(AND(E4;D5);4;
IF(E4;3;0)))
=IF(F4+G3-1<0;0;F4+G3-1)=G4=1=IF(OR(D4;H4);1;WEEKDAY(A4))=IF(D4;C4;IF(H4;"振替休日";""))

春分の日と秋分の日

  • しかし、もう少し先のカレンダーまで見たい欲求もある。また、過去のカレンダーも眺めてみたい。
  • そこで、Wikipediaに紹介されている簡易的な求め方を利用して、春分の日・秋分の日を求めることにした。
1900年 - 2099年までの春分の日の数学的な簡易な求め方
西暦年数の4での剰余が0の場合
  1900年 - 1956年までは3月21日
  1960年 - 2088年までは3月20日
  2092年 - 2096年までは3月19日
西暦年数の4での剰余が1の場合
  1901年 - 1989年までは3月21日
  1993年 - 2097年までは3月20日
西暦年数の4での剰余が2の場合
  1902年 - 2022年までは3月21日
  2026年 - 2098年までは3月20日
西暦年数の4での剰余が3の場合
  1903年 - 1923年までは3月22日
  1927年 - 2055年までは3月21日
  2059年 - 2099年までは3月20日
春分の日 - Wikipedia
1900年〜2099年までの秋分の日の数学的な簡易な求め方
西暦年数の4での剰余が0の場合
  1900年〜2008年までは9月23日
  2012年〜2096年までは9月22日
西暦年数の4での剰余が1の場合
  1901年〜1917年までは9月24日
  1921年〜2041年までは9月23日
  2045年〜2097年までは9月22日
西暦年数の4での剰余が2の場合
  1902年〜1946年までは9月24日
  1950年〜2074年までは9月23日
  2078年〜2098年までは9月22日
西暦年数の4での剰余が3の場合
  1903年〜1979年までは9月24日
  1983年〜2099年までは9月23日
秋分の日 - Wikipedia

以上の仕組みを表計算のデータベースとして設定すればいいのだ。

  • 但し、未知の彗星や惑星の影響を受けて、地球の運行が変化する可能性もある。
  • よって、上記の予測は、将来のカレンダーが確定する時にズレるかもしれない。

  • 1900年から2099年までの春分・秋分を求めるシートを2枚追加して、春分table・秋分tableを作ってみた。

f:id:zariganitosh:20140904084605p:image:w450


			
ABCDEFGH
1西暦剰余剰余0剰余1剰余2剰余3春分日春分年月日
21900=MOD(A2;4)21000=IF(D2;D2;IF(C2;C2;IF(F2;F2;IF(E2;E2;0))))=DATE(A2;3;G2)
........................
春分の日
# 剰余0  C2の数式
=IF(AND(B2=0;A2>=1900;A2<=1956);21;IF(AND(B2=0;A2>=1960;A2<=2088);20;IF(AND(B2=0;A2>=2092;A2<=2096);19;0)))
# 剰余1  D2の数式
=IF(AND(B2=1;A2>=1901;A2<=1989);21;IF(AND(B2=1;A2>=1993;A2<=2097);20;0))
# 剰余2  E2の数式
=IF(AND(B2=2;A2>=1902;A2<=2022);21;IF(AND(B2=2;A2>=2026;A2<=2098);20;0))
# 剰余3  F2の数式
=IF(AND(B2=3;A2>=1903;A2<=1923);22;IF(AND(B2=3;A2>=1927;A2<=2055);21;IF(AND(B2=3;A2>=2059;A2<=2099);20;0)))
秋分の日
# 剰余0  C2の数式
=IF(AND(B2=0;A2>=1900;A2<=2008);23;IF(AND(B2=0;A2>=2012;A2<=2096);22;0))
# 剰余0  D2の数式
=IF(AND(B2=1;A2>=1901;A2<=1917);24;IF(AND(B2=1;A2>=1921;A2<=2041);23;IF(AND(B2=1;A2>=2045;A2<=2097);22;0)))
# 剰余0  E2の数式
=IF(AND(B2=2;A2>=1902;A2<=1946);24;IF(AND(B2=2;A2>=1950;A2<=2074);23;IF(AND(B2=2;A2>=2078;A2<=2098);22;0)))
# 剰余0  F2の数式
=IF(AND(B2=3;A2>=1903;A2<=1979);24;IF(AND(B2=3;A2>=1983;A2<=2099);23;0))

これで1900年から2099年までの春分・秋分を求められる!

f:id:zariganitosh:20140904091525p:image:w450

  • 祝日tableで今までて入力していた部分に、春分の日・秋分の日を求める数式を追加した。

			
ABCDEFG
1基準日第何月曜月初曜日第一月曜日幸月曜日祝日日付祝日名称
.....................
7=VLOOKUP(YEAR(A2);春分table.$A$2:$H$201;8;0) 2020/03/20春分の日
.....................
16=VLOOKUP(YEAR(A2);秋分table.$A$2:$H$201;8;0) 2020/09/22秋分の日

月中始まりのカレンダーにも対応

  • 現状、A1のセルに月初の日付を入力することを前提としているが、
  • 場合によっては、月中始まりのカレンダーにした方が使い易いかもしれない。
  • 月締決算は月末から翌月上旬にかけて、一連の処理が続くはずなので。
  • 月中始まりのカレンダーにした場合、年を跨ぐ12月から1月を出力する場合に問題が発生する。
  • 祝日tableを12月の西暦で計算してしまうので、翌年1月の祝日が反映されなくなるのだ。
  • その対策として、祝日tableの1月分だけ、翌年の日付も追加してみた。

f:id:zariganitosh:20140904094147p:image:w450


			
ABCDEFG
1基準日第何月曜月初曜日第一月曜日幸月曜日祝日日付祝日名称
2=DATE(YEAR(カレンダー.$A$1);1;1) 2020/01/01元旦
3=DATE(YEAR(カレンダー.$A$1)+1;1;1) 2021/01/01元旦
4=DATE(YEAR(カレンダー.$A$1);1;1)246132020/01/01成人の日
5=DATE(YEAR(カレンダー.$A$1)+1;1;1)264112021/01/01成人の日

  • 例えば、12月20日始まりのカレンダーにしても、翌年の1月の祝日がちゃんと表示されるのだ。

f:id:zariganitosh:20140904100607p:image:h450

ダウンロード

改善ポイント

これで1900年から現在予測可能な2099年までのカレンダーが出力できるようになった!

  • 但し、祝日tableには2014年現在、法律で確定している祝日を登録している。(2016年開始の山の日も追加している)
  • よって、過去のカレンダーを出力した場合も、現在確定している祝日で表示されてしまう...。
  • より完璧を目指すなら、祝日tableに「運用開始年」と「運用終了年」を追加して、その年に対応した祝日tableとすべきである。
  • 国民の休日(祝日と祝日に挟まれた平日)は、祝日tableではなく、カレンダー側で判定すべきかもしれない。
  • 現状は9月の敬老の日と秋分の日に挟まれる場合に限定された判定になっている。
  • 将来、祝日が追加・変更された時も、漏れなく国民の休日を判定する仕組みにしておきたい。
  • 現状は出力するカレンダーに振替休日などの判定ロジックが含まれてしまっているが、
  • 将来の拡張性を考えると、365+31日分の日付tableを作って、そこで振替休日や国民の休日を判定すべきかもしれない。
  • 出力するカレンダーは、日付tableから必要な情報を参照するだけにしておくべき。
  • そうしておくことで、自由なデザインのカレンダーに素早く作り替えることができる。
  • MVC的な構造にしておくべきなのだ。
  • Model=各種tableであり、View=出力用のカレンダーである。Controllerは無し。
  • もしマクロを使いだしたら、それがControllerとなるのかもしれない。

2012-11-08

マルチタッチジェスチャーの達人を目指して

つい2ヶ月前までは、ポリカーボネートの白いMacBookを使っていた。初代MacBookが発売された当初は、2本指スクロール、2本指タップでさえ斬新だった。

それ以前のトラックパッドでスクロールするには、エッジ部分で上下左右に操作することで、それをスクロール操作と見なす仕様だった。しかし、スクロール操作の場所が限定されるので、中央部・エッジ部を使い分けるために、微妙に指を移動させなくてはならなかった。マウスカーソルの移動とスクロールは、キー入力と並んで最も良く使う操作である。だから、中央部・エッジ部を指が頻繁に動くことになる。微妙な距離であっても、煩わしかった。

クリックについても同様の煩わしさがある。1つ、あるいは2つボタンがトラックパッドの下に配置されていて、クリックするためにはそこまで移動する必要があった。タップでもクリック可能だったが、左右どちらかのクリックしか割り当てられない。2種類のクリックを使い分けるには、controlキーなどと併用したタップを使うしかなかった。

そんな煩わしさを感じていた時に、2本指の操作を感じとるトラックパッドを持つ、初代MacBookを使い始めた。素晴らしい操作性!マウスカーソルを動かした指の位置そのままで、スクロール・左クリック・右クリックができる。快適だった。

そのMacBookを6年間使い続けた後、2ヶ月前からMacBook Pro Retinaに移行したのだ。6年の間に、トラックパッドはさらに進化していた。

システム環境設定 >> トラックパッド

  • 従来と違って、トラックパッド下側に配置されるボタンはない。全面トラックパッド。
    • でも、中央より下側を指で押し下げれば、トラックパッド全体がボタンとなってクリックできるのだ。
  • 左手で下側のボタン領域を触り続け、右手でマウスカーソルを移動させることもできる。(左右の手で2か所タッチしているのに)
    • トラックパッドは状況を理解して、左手のタッチを無視してくれるのだ。賢い!
  • 同時に5本指のタッチまで認識する。
  • さらにピンチや回転など、認識できる操作のバリエーションもかなり増えた。
    • iPhone・iPadのマルチタッチジェスチャーが、そのままトラックパッドで使えるようになった感じ。
    • そして、より複雑な操作が必要なパソコン環境ならではの操作も加わって、高度なジェスチャー環境になっている。

f:id:zariganitosh:20121107134015p:image:w300f:id:zariganitosh:20121107134016p:image:w300f:id:zariganitosh:20121107134017p:image:w300

システム環境設定 >> アクセシビリティ >> マウスとトラックパッド >> トラックパッドオプション

トラックパッドの以下の設定は、なんと!アクセシビリティから設定する仕様に変更されている。

  • スクロールの速さ
  • 慣性スクロール
    • トラックパッドを2本指ではらうように操作した時、スクロールがすぐに止まらずにしばらく動き続ける効果
  • ドラッグロック
    • ドラッグロックなし = トラックパッドから指を離すと、ドラッグ中のアイテムも手離す。
    • ドラッグロックあり = トラックパッドから指を離しても、ドラッグ中のアイテムを保持し続ける。手離すときはタップする。

f:id:zariganitosh:20121108081554p:image:w450

  • なにゆえに、トラックパッドの非常に重要な設定が、このような想定外の設定箇所に移動されてしまったのか?
  • このトラックパッドオプションには、システム環境設定 >> トラックパッドからも簡単にアクセスできるようにしておくべきである。
  • ユーザビリティを大切にするAppleがこれでは、意図的に隠そうとしている意思をどこかに感じてしまう...。

OSX標準ジェスチャーに対する不満と要望

マルチタッチジェスチャーへの進化は素晴らしいが、2ヶ月くらい使い込んでいると、不満も感じ始める。

  1. Safariでタブ間を移動するとき、
    • OSX標準では、一旦ピンチでページを縮小してから左右にスクロール(タブ移動モード)、好みのページを選択すると元に戻る。
    • ピンチで縮小する手間が非常に面倒である。シンプルに、ジェスチャーでshift-control-tab・control-tabするだけでいいのに。
  2. タブを閉じるジェスチャーが欲しい。そして、間違ってタブを閉じたとき、復活させる手段も欲しい。
  3. 閉じるがあるなら、新規にタブを開くジェスチャーも欲しい。
  4. ページ再読み込みも欲しい。
  5. command-クリックの操作もトラックパッドだけでできると嬉しい。
  6. command-tabのアプリケーション切り替えのジェスチャーが欲しい。

以上のような要望をすべて叶えてくれる素晴らしいツールがある。

BetterTouchTool

BetterTouchToolを使えば、OSXがサポートしていないジェスチャーも含めて、自分好みの操作をかなり自由に割り当てられる!さっそく設定してみた。

方針
  • なるべく、OSX標準の操作を活かしつつ、BetterTouchTool独自の拡張されたジェスチャーに欲しい機能を割り当てる。
  • OSX標準の3本指ドラッグは、ほとんどメリットを感じない(従来のダブルタップ&ドラッグで十分)ので、無効にしている。
  • よって、3本指のジェスチャーは、BetterTouchToolで思い切り活用できる。
設定

以上のことを考えながら、不足していると思われる機能を追加してみた。

  • Safari(Safariがアクティブな時に有効な操作)
Tree Finger Double-Tap(3本指でダブルタップ)command-R(ページ再読み込み)
Tree Finger Swipe Down(3本指で下スワイプ)command-W(閉じる)
Tree Finger Swipe Left(3本指で左スワイプ)shift-control-tab(左へタブ移動)
Tree Finger Swipe Right(3本指で右スワイプ)control-tab(右へタブ移動)
Two Finger Swipe From Bottom Edge(2本指で下端から上スワイプ)command-Z(操作の取り消し=閉じたタブを復活させる意図)
Two Finger Swipe From Top Edge(2本指で上端から下スワイプ)command-T(新規タブを作成)

  • Global(すべての状況で有効な操作)
Four Finger Tap(4本指でタップ)command-tab(アプリケーション切り替え)
TipTap Left(中指でタッチしたまま、人差し指だけでタップ)command-クリック(状況に応じて様々な機能を引き出す)
      • Safariでリンクテキストをcommand-クリック = リンク先を新規タブで開く。
      • Dockでcommand-クリック = クリックしたアイテムをFinderで開く。

以上の設定をして試してみると、素晴らしい操作感である!

Safariのブラウズする時には、ほとんどキーボードを操作する必要がなくなってしまった。トラックパッドに置いた指の動きだけで、自分の意志をSafariに伝えられる。(従来はcommand-W、command-R、command-T、control-tab、shift-control-tabなどのショートカット操作を頻繁に使っていた)

底力
  • 以上の設定は、BetterTouchToolのほんの一部の機能を使っただけに過ぎない。
    • しかし、調子に乗ってあまりに多くを登録しすぎてしまうと、訳が分からない状況になってしまう可能性もある。
  • BetterTouchToolでは想像されるあらゆるジェスチャーを設定できるようになっている。
    • 特にTipTapなんて、実に良く考えられたジェスチャーだと思う。
    • commandキーやoptionキーの併用クリックにしたり、右ボタンや中ボタンの使い分けをしたり、と活用の可能性を感じる。

f:id:zariganitosh:20121107180656p:image:w640

  •                            ↑
  •                            ↑
  •                            ↑指の軌跡がアニメーションされる(中央下のグレーの四角)

f:id:zariganitosh:20121107174323p:image:w417:left








  • Triangle Swipe = 三角形の2辺を描く軌跡
    • (Preferenceの中央下(グレーの四角)にトラックパットでの指の軌跡がアニメーションされる)

  • TipTap Left = 中指でタッチしたまま、人差し指だけでタップする。
  • TipTap Right = 人差し指でタッチしたまま、中指だけでタップする。





  • Two Finger Swipe From Top Edge = トラックパッド上端から2本指で下方向にスワイプする。
  • Two Finger Swipe From Buttom Edge = トラックパッド下端から2本指で上方向にスワイプする。
  • Two Finger Swipe From Left Edge = トラックパッド左端から2本指で右方向にスワイプする。
  • Two Finger Swipe From Right Edge = トラックパッド右端から2本指で左方向にスワイプする。
    • (=通知センターを表示するジェスチャーと同じ)


  • Tree Finger Clickswipe Up = クリックしながら、上方向にスワイプ
  • Tree Finger Clickswipe Down = クリックしながら、下方向にスワイプ
  • Tree Finger Clickswipe Left = クリックしながら、左方向にスワイプ
  • Tree Finger Clickswipe Right = クリックしながら、右方向にスワイプ
  • Two Finger TipTap Left = 中指・薬指でタッチしたまま、人差し指だけでタップする。
    • (おそらく Three Finger TipTap Left の書き間違いと思われる)
  • TipSwipe Left Finger Up = 3本指でタッチしながら、左の指だけ上方向にスワイプ















マルチタッチジェスチャーに慣れたら、もはや後戻りできなくなると思う。マウスの時代は終わりつつあるのかもしれない。マウスの時代を築いた会社が、マウスの時代を終わらせようとしている。Mac miniはマウスかトラックパッドをオプションで選択するようになっている。iMacもいずれそうなるのかもしれない。(現状では同梱物にマウスが含まれているようだ)

      • たまにガラケー使っていて、リンクテキストを思わずタッチしてしまうことがある。
      • タッチしても、何も起こらないんだけど...。
      • 正解は十字キーなどでリンクテキストを選択して、中央ボタンを押す必要がある。
      • 一旦スマートフォン使ってしまったら、ガラケーには戻れないと思う感覚に近い。

2012-10-26

ディスプレイを見ている時はスリープさせない賢さを手に入れる

Macの手書き説明書さん経由、

Should I Sleepが素晴らしい!

これまでの自動スリープの仕様

  • 今まで、待機時間の設定に頼るしかなかった自動スリープ。
    • 待機時間=ユーザーが何も操作していない時間
  • 設定した待機時間が経過すると、画面の輝度を下げ(dim)、さらに何もしないとスリープする。
  • 若干賢い環境になると...
    • 映像(DVDやスライドショーなど)を再生している間はスリープしないとか、
    • ダウンロードしている間はスリープしないとか、(そんなことできたか?自分の要望か?)

上記仕様の限界

  • よく考えられた仕様なのだけど、時間設定と起動中のプロセスの監視に頼ることしかできていない。
  • 半分はうまくいくけど、もう半分の場面では無用なスリープを招いて、イライラを募らせることもあった。

例:

    • コーディング中にコードの流れを追いながら、数分に及んで考えているとき。
    • PDFで書籍の推敲をしているとき。
  • とにかく、何もしていなくても画面を見ているのだから、dimやスリープして欲しくないのだ。
  • しかし、画面を見ているなんてことをMacBookが知る由もなく、無情にもdimされ、その都度shiftキーなど押していた。
  • 今までこの欲求を満たすには、いたずらに待機時間を長く設定するしかなかった...。
  • すると今度は、さっさとスリープして欲しいときに無駄に長く稼働している状態になってしまう...。

どちらを優先するか、究極の選択を迫られていたのだ。

  • 場合によっては、一時的に自動スリープを無効にしたり、強制的にスリープさせたりと、スリープにまつわる苦労は以外と多かった。

良きに計らうShould I Sleep

その状況を、Should I Sleepが一気に解決してしまった!

  • Should I Sleepは、dimする直前にiSightカメラで目の前の状況を確認する。
  • そして、カメラの画像に顔を感知すると、dimとスリープをキャンセルしてくれるのだ。

素晴らしい発想!

  • 画面を見ている間は間違いなく顔が検出されるはずだから、きっとほとんどの状況でうまくいくはず。

試用

さっそく、試してみた。

  • まずはシステム環境設定 >> 省エネルギー設定で、dimまでの待機時間を1分(最短)に設定。


  • Should I Sleepを以下のように設定した。
    • Face Detection チェックあり
    • Enable Notifications チェックあり
  • これでShould I Sleepが顔検出したときに、通知センターに通知されるので、効き具合がよく分かるのだ。


  • 1分30秒くらい何もしない状態が続くと、iSightが緑色に光って稼働し、以下の通知が表示された!


  • 顔が検出されると「顔が検出されました。スリープが中止されました。」
    • 再び、次の待機時間の経過を待って、上記動作を繰り返す。


  • 顔が検出されないと「何も検出されませんでした。スリープは許可されました。」
    • このまま1分くらい放っておくとdimして、最終的にはスリープする。


  • 試してみたら、素晴らしい性能である!
  • 迷わず、起動時に稼働する設定にした。


  • 顔検出は、ここで処理時間を長く設定するほど正確になるようだが、今のところデフォルトのままで問題なし。

  • 実験が終わったら、Enable Notificationのチェックを外しておくと、Should I Sleepは裏で黙々と顔をチェックしてくれる。

所感

  • こうゆうインテリジェントなソフトウェアって大好きである。
    • インテリジェント=人の操作に頼らないで、良きに計らってくれる仕組み。
  • 今時のApple製品には、ほとんどすべてカメラが付いている。
    • MacBook、iMac、iPhone、iPod、iPadなど。

もう、OS標準にして欲しいくらいの快適さである!素晴らしい!

おまけの実験結果

  • 本当に顔を検知しているのか知りたくて、自分の顔を隠して待つこと1分30秒。
  • しかーし、予想に反してShould I Sleepは「顔が検出されたので、スリープを中止する」と通知してきた。

  • 顔検出とか言っても、けっこういい加減かもしれない、と不信感を募らせ始めていたところ、
  • 顔を隠すのに使っていた本の表紙を改めて見直した時に、気付いてしまった...。

顔を隠すのに使った本

  • もしや、アリスかボブのイラストの顔が検出されているのかもしれない...。
  • そう予想して、本の後ろ側がカメラに写るようにして顔を隠してみると...

  • 今度は見事に顔が検出されず、スリープが許可された!

  • 恐るべし顔検出。疑ってごめんなさいShould I Sleep。

教訓:

  • 背景にあるポスターとか写真の中の顔さえも、Should I Sleepは検出する場合がある。
    • ある意味、正確な仕事をしているのだ。高性能な顔検出が行われている。
  • アリスかボブのイラストでもOKだったので、顔は2D・3Dに限らず検出すると思ってた方がいい。
  • ポスター、カレンダー、写真など、背景に何があるか確認しておいた方が良さそう。

2008-07-14

徹底的にMacBookをソフトウェアで冷却する

夏場のMacBookは熱い!少なくとも自分のマシン--初代MacBook--は相当な熱さになる...。ブログを一回更新するだけで、左手の小指と薬指はもうほとんど低温火傷初期の感覚だ。ピリピリする。去年までは我慢していた。が、今年はもう我慢したくない。これを口実に、ワイヤレスキーボードを買ってしまおうか、または最新のマシンに交換してしまおうかとも考えた。

そんなことを考えていると、そういえば以前、MacBookの冷却ファンをコントロールするソフトウェアを試したことを思い出した。ちょうどその時は冬場だったため、その恩恵をそれほど感じなかったので、その後すっかり忘れていたのだった。今一度試してみたくなった。「MacBook ファン コントロール」で検索すると、早速二つのソフトウェアが見つかった。

Fan Control 1.2

  • システム環境設定から冷却ファンをコントロールできるようになる。
  • ベース回転数を設定して、温度変化と回転数のグラフを設定すると、現在の温度に合わせてファンの回転数を調整してくれる。秀逸!
  • 温度が低い時は低速で静かに、温度が高いほど高速になるので無駄が無くて良さそう。

ところが、最も冷却効率が良さそうな設定にしても、MacBookの熱さの前にその効果はあまり感じられなかった。

f:id:zariganitosh:20080715070734p:image

ベース回転数の最高が3500回転までしか上げられないのが残念。もっと高回転にしておきたい。

smcFanControl 2.1

  • アプリケーションを起動すると、メニューバーからファンの回転数をコントロールできるようになる。
  • このアプリケーションは、ファンの最低回転数を設定するとその回転数がずっと維持される。(システム側がより高い回転数を要求すれば回転は上がる)
  • そしてその回転数は6200回転まで設定可能!

f:id:zariganitosh:20080715073741p:image

早速、最高の6200回転で試してみると...素晴らしい!今までの熱さが嘘のようだ。自分の通常の作業では、温度は50℃前後、最高でも60℃以下にキープされる。今まで気になっていた小指と薬指の熱さも感じない。その代わりに高速回転するファンの音がずっと聞こえているが、熱いキーボードのまま入力するよりはずっとマシな環境だ。(以前は常に60℃オーバー、最高では80℃オーバーになることもあった。)

Fan Control 1.2とsmcFanControl 2.1のコンフリクトに注意

  • Fan Control 1.2をインストールすると、バックグラウンドでFunControlDeamonが起動する。
  • このFunControlDeamonプロセスを終了しないと、smcFanControl 2.1の設定は有効にならない。
  • アクティビティモニタの検索フィールドで「fan」と入力すればそのプロセスが見つかるので、「プロセスを終了」ボタンを押して終了させた。
  • もし、Fan Control 1.2を完全にアンインストールするのであれば、以下の二つを削除する必要がある。
    • /Library/PreferencePanes/Fan Control.prefPane(またはホームフォルダ直下の~/Library/PreferencePanes/Fan Control.prefPane)
    • /Library/StartupItems/FanControlDaemon

Fan Control 1.2のベース回転をアップする

それにしても惜しいのは、Fan Control 1.2のベース回転数や可変する温度設定の範囲がもう少し広かったら...と思うこと。で、GUIはリソースなのだから、ちょっと修正するだけで、もしかしたら出来るかもしれないと思いやってみた。

  • 「/Library/PreferencePanes/Fan Control.prefPane」を選択して、「パッケージの内容を表示」でパッケージを開く。
  • 上記パッケージの「contents/Resources/PreferencePane.nib」をダブルクリックして、Interface Builderで開く。
  • Base Speed:のスライダーをクリックして、ValueのMaximumを3500から6000に変更した。

f:id:zariganitosh:20080715082955p:imagef:id:zariganitosh:20080715082956p:image

  • 同じようにLower ThreshouldとUpper Threshouldも好みに変更して、保存した。
  • その後、システム環境設定を再起動すれば、ベース回転数は6000回転まで設定可能になった!

f:id:zariganitosh:20080715082957p:image


  • これで冷却ファンは5900回転前後で回転するようになり、以前の設定よりも冷却効率は良くなった。
  • しかし、常に6200回転で冷却するsmcFanControl 2.1の方がさらに冷却効率は良く、その差は体感的にも感じられる。(3〜4℃違う感じ)

今年の夏は6200回転で乗り切ることにする!

懸念事項

6200回転とはかなりの高回転で1秒間に100回以上ファンが回転していることになる。車に置き換えて考えれば、常にレッドゾーン一歩手前の最高出力で走ることになる。果たしてそのような高回転を常に維持してMacBookのファンは壊れないだろうか?(間違いなくファンの寿命は縮まるはず...。)

MacBookの世代による差異

Appleの歴代の製品情報を取得できるMactrackerで比較してみると、MacBookは現在までに5世代の進化を辿っていることがわかる。主要なdiffをとってみると、以下のような感じになった。

発売時期CPUシステムバス認識可能と思われる最大メモリビデオ性能AirMac Extreme card
2006-05Core Duo(1.83 or 2.0 GHz, キャッシュ2M)667MHz2GBGMA950 64MB DDR2802.11b/g
2006-11Core 2 Duo(1.83 or 2.0 GHz, キャッシュ2M or 4M)) ↓3GB ↓802.11a/b/g/n
2007-05Core 2 Duo(2.0 or 2.16 GHz, キャッシュ4M)) ↓ ↓ ↓ ↓
2007-11Core 2 Duo(2.0 or 2.2 GHz, キャッシュ4M))800MHz4GBGMA X3100 144MB DDR2 SDRAM ↓
2008-02Core 2 Duo(2.1 or 2.4 GHz, キャッシュ3M)) ↓ ↓ ↓ ↓

自分のマシンは、発売時期2006-05の初代MacBook。この表を眺めていると、あらゆる性能が劣っていることに気付く。気になるのは...

  • CPUがCore 2 Duoでない。(ここで発熱量に差が出るのかもしれない)
  • 最大メモリ4GBを認識して欲しい。(最近は2GBだと不足気味)
  • 802.11nで高速な無線LAN環境を手に入れたい。(Time Capsuleを利用するなら是非欲しい)

そして、発売時期2007-11以降の性能はほとんど変化していない。ある意味、この時点で現在のMacBookは完成したシステム構成になったと言えるのかもしれない...。ブックマークのコメント「> 俺の MacBook あんま熱くならないんだよなー、2.2GHz の黒いの。...」にもあるように、発熱問題にも対処したバージョンになったのかもしれない。

自分勝手に想像すると、2008-02の半年後の2008-08、または遅くとも2008-11までには、新型のMacBookが登場するのだろうなあと。おそらく、システム構成も革新して。それまでは、ソフトウェアのコートロールで冷却ファンを限界まで回し続けます!冷却ファンが壊れるのが先か、新型MacBookの発売が先か、どうなることやら...。

  • 現在の冷却ファン
    • 54℃
    • 6200回転

2008-07-13

iMacrosでwebページの操作を自動化して快適な気分

iMacrosというFirefoxアドオンがあって、最近使い始めてみると、これが素晴らしい快適さ!まだ、ちゃんと使いこなせているとは言えない状態だが、とても魅力を感じる。iMacrosはあらゆるwebページをGUIレベルで自由に操作できるスクリプト言語だと言える。ちょうどAppleScriptやVBでMacやWindowsを操作するように、iMacrosでFirefoxに表示したwebページを自由の操作できる。(IE版も存在するようだ)

  • webページでの自分の操作を「記録」することができるので、それを「再生」することで同じ操作が再現される。
  • 操作はiMacrosマクロとして記録され、ちょっと修正すれば汎用性の高いマクロになる。
  • 記録したマクロは、ブックマークレットやページ埋め込みのリンクとしても書き出せる。

いくら説明を読んだとしても、百読は一操作にしかず。こうゆうものは、実際に使ってみないと何なのか実感できないので、実際に操作してみた。

作業環境

  • MacBook OSX 10.5.4
  • Firefox 3.0 iMacros 6.0.5.4

実際の操作

以下のようなフォームがあったとして...

  • FirefoxツールバーのiMacrosボタンを押して、「Rec」タブの「Record」ボタンを押して記録開始
    • 複数タブを開いていると、最初にその他すべてのタブを閉じてから記録するか確認される。「OK」を押すと現在表示中のページを残してその他すべてのタブが閉じてしまうので注意が必要。
  • 「Click Mode」ボタンを押して「Use complete HTML tag」を選択した。(iMacrosの記録形式の選択*1
  • あとはひたすらフォームに入力してみた。


代引き

クレジット

  • フォームの入力が終わったら「Stop」ボタンを押すと記録モードが終了する。
  • 今までの操作は「#Current.iim」というファイルに保存されている。
  • iMacrosの「Edit」タブを選択して、「Edit Macro」ボタンを押すと以下のようなマクロとして記録されていた。
VERSION BUILD=6050612 RECORDER=FX
TAB T=1
URL GOTO=http://d.hatena.ne.jp/zariganitosh/20080713/1216014813
TAG POS=1 TYPE=SELECT FORM=ACTION:/customers/1/order_infos ATTR=ID:order_info_delivery_service CONTENT=2
TAG POS=1 TYPE=SELECT FORM=ACTION:/customers/1/order_infos ATTR=ID:order_info_delivery_date CONTENT=16
TAG POS=1 TYPE=SELECT FORM=ACTION:/customers/1/order_infos ATTR=ID:order_info_delivery_time CONTENT=4
TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:/customers/1/order_infos ATTR=ID:customer_name CONTENT=zariganitosh
TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:/customers/1/order_infos ATTR=ID:customer_postcode CONTENT=1234567
TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:/customers/1/order_infos ATTR=ID:customer_adress CONTENT=東京都新宿区代々木10000-1
TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:/customers/1/order_infos ATTR=ID:customer_phone CONTENT=09012345678
TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:/customers/1/order_infos ATTR=ID:customer_mail CONTENT=zariganitosh@mycompany.com
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ACTION:/customers/1/order_infos ATTR=ID:order_info_delivery_for_customer CONTENT=YES
TAG POS=1 TYPE=INPUT:RADIO FORM=NAME: ATTR=ID:order_info_payment_代引き
  • 今度は入力フォームを一旦クリアするために、FirefoxのURLバーを選択して、returnキーを押して再読み込みしてみる。(入力フォームがクリアされた)
  • iMacrosの「Play」タブで、「Play」ボタンを押してみると...感動です!先程と同じ操作が再現されていく様が目の前で起こっている!

記録したマクロの保存方法

  • 「#Current.iim」ファイルに記録されたマクロは一時的なファイルなので、そのままでは例えば次回マクロ記録を実行した時などのタイミングで、上書きされて消えてしまう。だから...
    • iMacrosの「Edit」タブで、「#Current.iim」ファイルを選択して「Save」ボタンを押して保存すれば、好きなファイル名でずっと保存することができる。
    • iMacrosの「Edit」タブで、「#Current.iim」ファイルを右クリックして「Add bookmark」を選択する*2と、Firefoxのブックマークに登録したり、del.icio.us等のソーシャルブックマークサービスへ登録することも出来る*3。素晴らしい!

...ということで、埋め込みリンクとしても保存してみた。(iMacrosがインストールされた状態でクリックしたときだけ実行される。

  • ブックマークレットの文字数制限のことが気になったが、自分の環境で利用する限り13000文字を超えるマクロ(上記スクリプトを適当に複数回コピーして長くしたもの)をリンクに埋め込んだり、ブックマークレットにしても、問題なく動いた。

素晴らしい使い心地!今までの自分を振り返って、実にいろいろなことに応用できそうだ。

想像する明るい未来

今時の会社は、個人情報保護とか、機密管理とか、セキュリティーについて相当神経質になっていて、勝手にiMacrosなんか使いだすと怒られそうな気もするが、余分なことは抜きにして明るい未来を想像してみた。

自動ログイン
  • 銀行の振込・照会サービス等のwebページでは、厳格なセキュリティを考えてのことか、ブラウザ標準のパスワード保存機能を、故意に利用できない作りにしていることが多い。
  • iMacrosを利用すれば、どのようなページであっても簡単に自動ログインが可能になる。(自分のログイン操作を一度記録するだけ)
繰り返す処理を自動化
  • 会社の業務とは、繰り返しの連続だ。毎日、毎週、毎月、毎年と、一旦業務として確立されれば、あらゆるレベルの繰り返しをより効率的に、より正確に実行することが求められる。
  • iMacrosを利用すれば、究極の効率化と正確さを両立できそうだ。
    • webサービスを利用した預金口座の取引照会もワンクリックでデータのダウンロードまで完了する。おそらく、定期的に巡回するようにも出来るはず。
    • 最近の会社の管理システムは、自社サーバーのwebサービスとして提供されることが多い。消耗品の発注から、支払伝票の作成や交通費の立替請求等、あらゆる業務の雛形を自分仕様のiMacrosマクロに登録して効率化できそう。
  • 会社業務に限らず、個人的なwebサービスの利用だって自動化してしまえば良い。例えば、定期的なお茶やコヒーの発注とか、ワンクリックで完了すると気持ちいい。 
webサービスのテスト
操作の解説やテクニックの保存
  • 自動操作の途中で、コメントを入れたアラートを自由に表示できるので、使い方の解説としても役立ちそう。
  • メールをはじめ、フォトショップ等の画像処理まであらゆることがwebサービス化している。例えば、フォトショップを使った達人のテクニックなんかもiMacrosで再現できるはず。リンクをクリックするだけでそのテクニックを利用できるのは魅力だ。
    • del.icio.usにはブックマークレットらしきiMacros集が登録されている。

解決できない問題

  • 日本語文字がマクロに含まれると、ブックマークレットや埋め込みリンクから実行が出来ない。(iMacrosサイドバーからは問題なく実行できる。)
    • 実は、上記の「このリンクを押すとフォーム入力を開始する。」を実行しても「住所」と「支払方法」は未入力の状態になる。(日本語文字が含まれるので、リンクからiMacrosが実行できなくなってしまうので、問題部分を削除したのでした。)
    • サイドバーからiMacrosファイルを選択して実行する場合は日本語文字を含んでも問題なく実行できるのだが、時に、埋め込みリンクとして日本語が扱えないことにすごく不便を感じることもある。
      • どなたか解決策をご存知の方がいらっしゃれば、是非教えて頂きたいです...。

*1:iMacrosの記録形式には4つあったが、自分が利用する環境では「Use complete HTML tag」を選択した時が、いちばん問題なく操作できたように感じた。

*2:または「#Current.iim」ファイルを選択して「Share Macro」ボタンを押す

*3:webページ埋め込みのリンクとして、ブックマークレットのように書き込めるのだ。

2008-07-03

とっても滑らかなスクロールに魅了されて...。

評判どおり、Firefox 3は素晴らしいブラウザで常用したいのだけど*1、たった一つのことに魅了されて、今なおSafari 3を使い続けてしまっている。

環境

  • MacBook OSX 10.5.4
  • Safari 3.1.2
  • Firefox 3.0

Safariはコマ落ちしないスクロール

それはスクロールの滑らかさ。自分のMacBookのトラッックパッドで二本指スクロールさせた時の環境*2では、Safariでは表示されている文字や画像が連続して移動する。動画に例えれば秒間30コマの滑らかな映像を見ている感じだ。スクロールする最小単位が1ドットずつ移動している感じ。だから、スクロールしている最中でも文字や画像を目で追うことができる。

一方、Firefoxの方はスクロールの最小単位は20ドットくらいの感じ。トラックパッドの操作に対応して、スクロールは滞りなく処理されているのだけど、映像としてみた感じは秒間10コマ以下のぎこちない映像を見ている感じだ。スクロールの最中は文字や画像を見失いがちになる。無理して追っていると、目が非常に疲れる。

Firefoxのスムーズスクロール

Firefoxの環境設定には「スムーズスクロール機能を使用する」という設定項目がある。期待してチェックありにしてみたのだが...。確かにスクロールは滑らかになった。しかし、自分のMacBook環境ではトラックパッドの操作に対するスクロールの動きに、若干の時間的な遅れがでる。トラックパッドを操作した自分の期待よりも、スクロールが少し遅れて実現される感じだ。反応の悪いリモコンを操作している感じで、気持ち良く操作できなかった...。これならスムーズスクロールは無効にしておいた方がいい。(ビデオ性能がもっと高性能であれば良いのかもしれない。)

Smart Scrollの予想外の滑らかさ

Firefoxで滑らかなスクロールを実現する方法を求めて探していたら、Smart Scrollというシェアウェアを見つけた。(タイムリーなことに7/1にバージョン 2.8.4がリリースされて、OSX 10.5.4もサポートされている。)

    スーパースクロール

スクロールは驚くほどにスムーズになります。しかも、通常のスクロールより楽々です!

      • スーパースクロールの自由流スクロールでページのスクロールをより細かく操作することができます。
      • iPhone と同様に「惰性機能」によって長い書類内の移動はより早くて楽になります。
http://www.bridge1.com/smartscroll.html

上記の解説にすごく期待してインストールしてみた。結果...

  • もの凄く滑らかなスクロールになった!(感動的)
  • 慣性の法則もコントロール出来て、ホントにiPhoneとかiPod Touchでの操作感に近い!

ところが、何故かFirefoxではSmart Scrollの効果があらわれない...。(ガックリ)今までのコマ落ちスクロールのままだ。一方のSafariは、iPhoneとかiPod Touchの滑らかさ。Firefoxのスクロール性能を改善したかったのに、ますますSafariが魅力的になってしまった...。

  • ちなみに、自分のMacBookでは以下の設定が気持ちいい。

f:id:zariganitosh:20080703163501p:imagef:id:zariganitosh:20080703163502p:image

Firefoxのアドオン

気を取り直して、Firefoxに滑らかなスクロール環境をもたらすアドオン探し。そして見つかったのが、Yet Another Smooth Scrolling 2.0.8。(素晴らしいスクロール環境に感謝です!)デフォルトでは3つのプリセットが設定されていて、それぞれの設定は自分仕様にチューニングも可能だった。

  • MacBookでの好みの設定は以下のような感じ。

f:id:zariganitosh:20080703172047p:image

これでFirefoxのスクロールもかなり良くなったが、しかし、Smooth ScrollなSafariのスクロールを経験した今となっては、ちょっと色褪せて見える。それくらいSmooth Scrollは感動的に滑らかだった。(と感じる。)恐らく、性能的には大差ないのかもしれない。でも、操作した時に自分の感性にハマっているのはSmooth Scrollだった。

考えてみれば、スクロールという操作は、マウス操作の中でかなりの時間を占めているのではないだろうか。*3自分は気持ち良くスクロールできる環境にとても魅力を感じる。iPhoneやiPod Touch、またはFirefoxアドオンのPicLens等の一番の魅力も、スクロールする時の人間の感性にハマる操作感かもしれない。

FirefoxにもPicLensという感性にハマる素晴らしいアドオンがあるのだから、チューニング次第ではSmooth Scroll以上に気持ちいいスクロール環境が作れるはず。そんな素晴らしいスクロール環境が早く出てくることに期待。(出来ることなら、そんなアドオンをサクッと開発できる人になりたいものだ。)

Yet Another Smooth Scrollingの設定

その後も微調整を繰り返し、今は以下の設定で落ち着いた。自分のMacBookトラックパッド環境ではかなりいい感じになった!

設定しながら感じたことは、そのマシンのハードウェア性能(GPU、トラックパッドまたはマウス)、システム環境設定のスクロールの速さ、使う人の感性によって、Yet Another Smooth Scrollingのベストな設定はずいぶん変わってくるだろうと。

f:id:zariganitosh:20080704054106p:image

移動単位
  • スクロールする時の最小単位のドット。40ドットにしている自分の設定では、Firefox 3デフォルトの20ドットよりも大きくて余計にぎこちない動きになりそうだが、Yet Another Smooth Scrollingの効果によって、その間の動きを滑らかに繋いでくれるので大丈夫。
  • トラックパッドで上から下まで指を動かした時に、どれくらいの範囲がスクロールすることを期待しているかによって設定が変わってくる。OS側のシステム環境設定の[スクロールの速さ」の影響も大きい。
スムースネス - 初動
  • 100に近いほど、スクロールの動き始めが鈍い反応になった(車両重量の重い車の加速が鈍いように)。軽快なほど良さそうな気もするが、最も軽快な0にしてしまうとトラックパッドに指を載せただけで過敏に反応してしまい、一瞬スクロールしたい方向とは逆の方向に動いてしまうことがあった。
  • 車のアクセルにも、ハンドルにも遊びがある。使う人の動かし方の癖が、大きく・素早く・ダイナミックに動かす場合ほど、より100に近い値に設定した方が良さそうだ。
  • 自分の場合はより軽快に反応する設定にしたかったので、最も軽快な0に設定した。(設定値に関係なく、一瞬逆方向に動く現象は発生した...。)0から2目盛り動かした0.225に設定した。(トラックパッドに指を載せた瞬間の逆方向スクロール防止のため)
スムースネス
  • 100に近いほど、スクロールの慣性で動き続ける時間が長くなった。0なら慣性は無し、即止まる。100だとダラダラといつまでも動き続ける。
加速の感度
  • 大きな値ほど、素早く動かした時のスクロールの移動単位が大きくなって加速する感じ。0であれば、OS側のシステム標準の加速度しか得られなかった。
  • 値が大き過ぎると、スムーススクロールといえども目で追えなくなってしまうので、自分のMacBook環境では130くらいが適当だと感じた。(移動単位の設定と深く関係しているので、その値によっても大分変わってくると思う。)

スムースネス-初動 と スムースネス

さらにその後もYet Another Smooth Scrollingの設定に試行錯誤していると、スムースネスに関する自分の理解が間違っていたことに気付いた...。スクロールが軽快か、鈍いか、慣性があるか、無いかというのは、二つのスムースネスが特定の条件の時に結果として発生する現象であって、スムースネス本来の意味とは違っていた。

  • 二つのスムースネスは直訳の通り素直に「滑らかさ」の指標と考えれば良かったのだ。
    • 0は滑らかさ無し。移動単位が40pxである時、その間の描画は一切なし。スクロールは40pxごとにカクカク動く。
    • 100は最高に滑らか。移動単位が40pxである時、その間を(実際に100コマ描画する訳ではないが、感覚として)100コマの映像で補完する感じ。スクロールは流れるように滑らかに...。
  • どちらも最高に滑らかな100に設定してしまうのが良さそうな気がするが、現実にはビデオ性能の不足で、規定時間内に描画処理が間に合わずに、反応に遅れた間延びしたスクロールになってしまうようだ。(と思うようにしている。)
  • 「スムースネス-初動」はスクロール始めの滑らかさ、「スムースネス」はスクロール中からスクロール終了までの滑らかさ。
  • 1移動単位のスクロールは「スムースネス-初動」の滑らかさに始まり、「スムースネス」の滑らかさで終わる。これが繰り返されると思われる。
  • 「スムースネス-初動」と「スムースネス」の組み合わせは無数にあり、やってみるまでどのようなスクロール効果になるか、未だに予想がつかない。
  • 二つのスムースネスの数値が大き過ぎてもダラダラ。小さ過ぎてもカクカク。

横スクロール

暫く使っていると、Yet Another Smooth Scrollingが有効な時、横スクロールが出来ない状況に気付いた。いろいろ試してみると、シフトキーを押しながらだと縦横自在にスクロールできる。そして、シフトキーを押さずに二本指で横方向になぞると縦方向にスクロールすることにも気付いた。これは最初に不便も感じたが、ブラウザでほとんど使うことのない横スクロールが縦スクロールと認識されると、それはそれで使い易くなってきた。MacBookのトラックパッドでは圧倒的に横方向のストロークが長くとれるので、一回の操作で広範囲のスクロールが楽々可能になるのだ。結構気持ちいい。

最終的には、自分のMacBook環境では以下の設定で落ち着いた。(偶然にも40と80の美しい設定値になった。)かなりスムーズにスクロールするようになった!満足。

f:id:zariganitosh:20080706174933p:image


スクロール関連のabout:config

  • Firefox3ではデフォルトで横スクロール可能な状態になっている。
  • 但し、Yet Another Smooth Scrollingが有効な時は上記の仕様となっているため、シフトキーの併用が必要だ。(シフトキーを併用しない横スクロールの方法は分からなかった。)
  • mousewheel.withnokey.actionの値には以下のような意味がある。(ここで設定すれば、ピクセル単位のスクロールも可能になる。けれど、とても実用的とは言えないが...。)
    • 0: 行単位のスクロール
    • 1: ページ単位のスクロール
    • 2: 履歴を戻る、進む
    • 3: 文字サイズの拡大、縮小
    • 4: ピクセル単位のスクロール
参考ページ

素晴らしい解説に感謝です!正に自分が知りたかったことでした。

*1:Firefox 3は総合的に見て、今自分が利用できるブラウザの中で最速だし、使い勝手もいいと感じた。ページの読み込みも早いし、複数ページをタブで同時に読み込んでいる最中でも比較的スムーズに操作できる。gmailやAppleのページであっても、Safariよりもさらに軽快に操作できている。強制終了した時も、終了時点のウィンドウとタブの状態をページ遷移の履歴を含めて復元してくれるのはすごく嬉しい。ブックマークバーの挙動やタブが開く時の挙動も自分好み。ブックマークの管理画面もSafariより遥かに使い易い。

*2:自分の環境では、マウスのスクロールホイールよりも、2本指のトラックバッドの方がより滑らかだ。

*3:マウスの歴史を振り返ってみると、1ボタンが2ボタンになり、その後スクロールホイールまで装備されるようになってきた。今時、スクロールバーをドラッグしてスクロールしようとは思わなくなってしまった...。

2008-07-02

ターミナルでslと打つと煙を上げながら画面をSLが駆け抜けるslコマンド

あまりにも有名なslコマンド。MacBookにも入れてみたら、久々に癒された。

f:id:zariganitosh:20080702074647p:image

f:id:zariganitosh:20080702074646p:image

f:id:zariganitosh:20080702074645p:image

f:id:zariganitosh:20080702074644p:image

f:id:zariganitosh:20080702074643p:image

f:id:zariganitosh:20080702074642p:image

f:id:zariganitosh:20080702074641p:image

MacOSXバージョンでは、SLがターミナル画面から抜け出してスクリーン全体を駆け抜けるところがいい!自分にとっては必携のコマンドです。

      • ちなみに今まで、自分ではlsコマンドを、slと打ち間違えることはほとんどなかった。これからは、たまに打ち間違えたくなった。

インストールと実行

  • Mac OS X版スクリーン駆け巡りSLより、ソース(slMacOSX.tar.gz(version 1.0.4) )をダウンロード。
  • 解凍して、そのフォルダに移動して、makeしたら、slコマンドが出来上がっていたので、/usr/local/binに移動した。
  • ターミナルからslと打ち込んで...走る!走る!

素晴らしいコマンドに感謝です!

2008-03-25

patchコマンド-pオプションの覚え書き

patchコマンドは、元ファイルと差分情報からファイルを更新してくれる素晴らしいコマンドだが、patchコマンドを実行するディレクトリと-pオプションの設定で悩むことが多い。そこで今後のために、自分用の覚え書き。

ファイルにパッチを当てる

  • 様々なオプションが設定できるが、基本は以下の書式。
$ patch 元ファイルのパス < patchファイル(差分情報)のパス
  • 元ファイルが存在するディレクトリに移動すれば、「元ファイルのパス」は省略できる。(以下synergy-1.3.1の例)
$ cd ~/Downloads/synergy-1.3.1/lib/platform
$ patch < ~/Downloads/OSX_BusError.patch
  • synergy-1.3.1に対するパッチファイル、OSX_BusError.patchをサンプルに考えてみる。
Index: COSXKeyState.cpp
===================================================================
RCS file: /cvsroot/synergy2/synergy/lib/platform/COSXKeyState.cpp,v
retrieving revision 1.11
diff -u -p -r1.11 COSXKeyState.cpp
--- COSXKeyState.cpp	23 Mar 2006 06:03:20 -0000	1.11
+++ COSXKeyState.cpp	17 Aug 2006 05:02:39 -0000
@@ -790,6 +790,12 @@ COSXKeyState::CKeyResource::getKeyID(UIn
 							str, GetScriptManagerVariable(smKeyScript),
 							kCFAllocatorNull);
 
+		// sometimes CFStringCreate returns NULL, (e.g., Apple Korean encoding with char 
+		// value 214 when start up.) if so, make it no key. otherwise, that NULL is given to 
+		// CFStringCreateMutableCopy down Below, which makes a BUS ERROR.
+		if (cfString == 0x0) 
+		  return kKeyNone; 
+
 		// convert to precomposed
 		CFMutableStringRef mcfString =
 			CFStringCreateMutableCopy(kCFAllocatorDefault, 0, cfString);
  • 6行目「--- COSXKeyState.cpp」の部分から判断して、ファイル名だけが指定されているので、ファイルに対するパッチと判断できる。
  • 3行目「RCS file:」にソースコードを管理している環境でのパスが表示されている。ダウンロードした元ファイルも相対的に同じ構造なので、目指すファイルがどこに存在するか簡単に予想できる。

ディレクトリごとパッチを当てる

  • 元ディレクトリ以下のすべてのファイルに対してパッチを当てることができる。その基本は以下のオプション指定。
  • 元ディレクトリは、ダウンロードしたソースコードが保存されているプロジェクトフォルダと考えることができる。
$ patch -p0 -d 元ディレクトリのパス < patchファイル(差分情報)のパス
  • 元ディレクトリの親ディレクトリ(プロジェクトフォルダが存在するディレクトリ)に移動すれば、「-d 元ディレクトリのパス」オプションは省略できる。(以下synergy-1.3.1の例)
$ cd ~/Downloads/synergy-1.3.1
$ patch -p0 < ~/Downloads/synergy.patch
  • synergy-1.3.1に対するパッチファイル、synergy.patchをサンプルに考えてみる。
Index: cmd/synergyc/synergyc.cpp
===================================================================
RCS file: /cvsroot/synergy2/synergy/cmd/synergyc/synergyc.cpp,v
retrieving revision 1.20
diff -u -p -r1.20 synergyc.cpp
--- cmd/synergyc/synergyc.cpp	23 Mar 2006 06:03:00 -0000	1.20
+++ cmd/synergyc/synergyc.cpp	28 Jan 2008 07:25:39 -0000
@@ -435,7 +435,7 @@ standardStartup(int argc, char** argv)
 
 	// daemonize if requested
 	if (ARG->m_daemon) {
-		return ARCH->daemonize(DAEMON_NAME, &daemonMainLoop);
+      return ARCH->daemonize(DAEMON_NAME, argc, argv, &daemonMainLoop);
 	}
 	else {
 		return mainLoop();
...(中略)...
  • 6行目「--- cmd/synergyc/synergyc.cpp」の部分から判断して、ディレクトリが指定されているので、ディレクトリに対するパッチと判断できる。
  • 「-p0」オプションは、上記ディレクトリをそのまま適用してパッチを当てる。
    • つまり現在位置のカレントディレクトリと合わせて「~/Downloads/synergy-1.3.1/cmd/synergyc/synergyc.cpp」というファイルがパッチの対象になる*1
    • 上記ファイルは存在するので、パッチは素早く正常に終了する。
  • 「-p1」オプションの場合は、最上位のディレクトリ「cmd/」が省略される。
    • つまり現在位置のカレントディレクトリと合わせて「~/Downloads/synergy-1.3.1/synergyc/synergyc.cpp」というファイルがパッチの対象になる。
    • しかし、そのようなファイルは存在しないので、「File to patch:」と表示され、パッチ対象のファイルの指定を求められる。
  • 同様に「-p2」では「cmd/synergyc/」2階層が省略され、「-p3」では3階層が省略され...という処理が行われる。

「-p数値」オプションは何のために?

  • 「-p数値」オプションは、パッチファイルのディレクトリ環境と、パッチ対象ファイルが存在するディレクトリ環境の違いを調整したい時に役立ちそう。
    • 例えば、もし6行目が「--- cvsroot/synergy2/synergy/cmd/synergyc/synergyc.cpp」となっていたら、「-p3」を指定するとうまく行くはず。

参考ページ

以下のページがたいへん参考になりました。感謝です!

*1:もし、「-d 元ディレクトリのパス」が指定されていれば、「元ディレクトリのパス/cmd/synergyc/synergyc.cpp」というファイルがパッチの対象になるはず。

2008-03-18

intelMac&OSX 10.5 Leopard環境でsynergyを快適に利用する

以前からお世話になっているsynergyだが、最近の不満が一つ。スクリーンを左右に配置している状況で、そのスクリーンのつなぎ目のコーナーにExposeやSpacesの機能を割り当てていると、ExposeやSpacesが有効になった瞬間、隣のスクリーンに移動してしまい...また戻そうとしてコーナーを霞めると、今度は移動先のスクリーンで無用なExposeが有効になってしまう...。これじゃ快適さを追求したせっかくの機能が、イライラの原因になってしまう。良い方法は無いか探していると、何と!最初から素晴らしいsynergy.confの設定方法があったのでした。

synergy.confの設定で快適にする

section: screens
	MacBook.local:
	PowerBookG4.local:
end

section: links
	MacBook.local:
		left = PowerBookG4.local

	PowerBookG4.local:
		right = MacBook.local
end

section: options
	switchCorners = all
	switchCornerSize = 100
	switchDoubleTap = 1000
	keystroke(shift+control+left) = switchInDirection(left)
	keystroke(shift+control+right) = switchInDirection(right)
end
  • 追記したのはsection: optionsのブロックで、この設定で以下の機能が有効になる。
    • 四隅のコーナー周辺100pxでは、隣のスクリーンへ移動できない。...1、2行目
    • ダブルタップが有効
      • スクリーンのつなぎ目をマウスで軽くノックするように操作したときだけ隣のスクリーンへ移動する。(1000m秒=1秒に2回以上のノック動作が必要)...3行目
    • キーボードショートカットの設定
      • シフト + コントロール + ←キーで、左のスクリーンへ移動...4行目
      • シフト + コントロール + →キーで、右のスクリーンへ移動...5行目

これで無駄なスクリーン間の移動が無くなって、とても快適!

最新のパッチを当てる

新しいバージョンがリリースされていないか確認してみたが、相変わらずバージョン1.3.1が最新。しかし、パッチが次々と上げられていて、その中で気になる以下のパッチが見つかった。

どうも、Leopardになって、synergysがデーモンとして起動しなくなってしまった不具合を改善してくれるパッチのようだ。早速パッチを当てて試してみると...

$ synergys -c synergy.conf

あれれ?アクティビティモニタで確認すると、やはり起動して間もなくsynergysプロセスが終了してしまう。以前と同じだ。(-fオプションを付ければ起動し続ける)

諦めかけていたが...ところが、コマンドまでのパスも含めて指定してみると、ちゃんと起動し続けた!

$ which synergys
/usr/local/bin/synergys
$ /usr/local/bin/synergys -c synergy.conf

理由はよく分からないが、これでデーモンとしても起動できるようになった!

synergy.confの置き場所

synergy.confはその都度コマンドに含めて指定していたが、以下ディレクトリとファイル名で配置すれば、省略できる。

~/.synergy.conf
または、
/etc/synergy.conf

ということで、~/.synergy.confに配置した。つまり、今後は余計なことを考えずに、以下のコマンド一発実行できる。

$ /usr/local/bin/synergys

OSX 10.5 Leopardではsynergysはログイン項目で起動可能!

なんと!今まで知らなかった...。だいぶ損をした気分。確か10.4 Tigerまでは、UNIX実行ファイルはログイン項目で指定しても起動できず、しょうがなくAppleScriptの「do shell script」で設定したファイルを保存して、それをログイン項目で指定していたのだ。

引数無しの「/usr/local/bin/synergys」で起動するようになったので、試しにログイン項目で指定してみると、あっさり「UNIX実行ファイル」と認識されてしまった。再ログインしてみるとsynergysがちゃんと起動している!

  • ちなみに、UNIX実行ファイルはマウスダブルクリックでも起動するようになっていた。
  • 実行権限が与えられたファイルは普通のアプリケーションと同じ感覚で操作できるようになっていた...。素晴らしい!

パッチの当て方まとめ

ダウンロードしたファイル

すべて~/Downloadsに保存されている。synergy-1.3.1.tar.gzはダブルクリックで解凍しておいた。

パッチ
  • パッチを適用するディレクトリを合わせて、-p0オプションを指定する必要がある。
$ cd ~/Downloads/synergy-1.3.1
$ patch -p0 < ~/Downloads/synergy.patch
patching file cmd/synergyc/synergyc.cpp
patching file cmd/synergys/synergys.cpp
patching file lib/arch/CArch.cpp
patching file lib/arch/CArch.h
patching file lib/arch/CArchDaemonUnix.cpp
patching file lib/arch/CArchDaemonUnix.h
patching file lib/arch/CArchDaemonWindows.cpp
patching file lib/arch/CArchDaemonWindows.h
patching file lib/arch/IArchDaemon.h
$ patch lib/platform/COSXKeyState.cpp < ~/Downloads/OSX_BusError.patch 
patching file lib/platform/COSXKeyState.cpp
インストール
  • あとはお決まりの手順でインストールできた。
$ cd ~/Downloads/synergy-1.3.1
$ ./configure
$ make
$ sudo make install