昨今(2020年)の Numbers.app は macOS、iPhone 分け隔てなく利用できるようになり、iCloud アカウントでの共同作業も当たり前の時代だ。また、Google Spread Sheet や Microsoft Office365 も同様で、デスクトップ、スマホのブラウザでスプレッドシートの作成など難なくできる。
よって、どこまで便利か試してみることにする。題材は、私が古に作成した所謂「万年カレンダー」とする。
少々準備が必要なので、まずは、前作の xcalendar-pl の特徴と今回の calendar-*.ja.* との違いをまとめておく。
よって、calendar-*.ja.* スプレッドシートの紹介に先立ち、祝日データを簡単に準備する方法を紹介する。
それには Apple, Google, Mozilla が提供する iCalendar サーバを利用する。以下のシェルスクリプトでそれが可能である。[2020/12/13 追記] 内閣府の CSV 形式の国民の祝日 なんてものがあったので、こんなシェルスクリプト不要だった。よって、このパラグラフは読み飛ばして良い。
コマンド名が異なるだけで中身は同一である。他の2ファイルは実体のファイルのシンボリックリンクでよい。以下のように実行する。
$ ./google-ja-holidays_csv.sh | sort | less 2019/01/01,元日 2019/01/14,成人の日 2019/02/11,建国記念の日 2019/03/21,春分の日 2019/04/29,昭和の日 2019/04/30,祝日 2019/05/01,天皇の即位の日 2019/05/02,祝日 2019/05/03,憲法記念日 2019/05/04,みどりの日 2019/05/05,こどもの日 2019/05/06,こどもの日 振替休日 2019/07/15,海の日 2019/08/11,山の日 2019/08/12,休日 山の日 2019/09/16,敬老の日 2019/09/23,秋分の日 2019/10/14,体育の日 2019/10/22,即位礼正殿の儀の行われる日 2019/11/03,文化の日 2019/11/04,文化の日 振替休日 2019/11/23,勤労感謝の日 2020/01/01,元日 2020/01/13,成人の日 2020/02/11,建国記念の日 2020/02/23,天皇誕生日 2020/02/24,天皇誕生日 振替休日 2020/03/20,春分の日 2020/04/29,昭和の日 2020/05/03,憲法記念日 2020/05/04,みどりの日 2020/05/05,こどもの日 2020/05/06,憲法記念日 振替休日 2020/07/23,海の日 2020/07/24,体育の日 2020/08/10,山の日 2020/09/21,敬老の日 2020/09/22,秋分の日 2020/11/03,文化の日 2020/11/23,勤労感謝の日 2021/01/01,元日 2021/01/11,成人の日 2021/02/11,建国記念の日 2021/02/23,天皇誕生日 2021/03/20,春分の日 2021/04/29,昭和の日 2021/05/03,憲法記念日 2021/05/04,みどりの日 2021/05/05,こどもの日 2021/07/22,海の日 2021/07/23,体育の日 2021/08/08,山の日 2021/08/09,休日 山の日 2021/09/20,敬老の日 2021/09/23,秋分の日 2021/11/03,文化の日 2021/11/23,勤労感謝の日
特に2020東京オリンピックの例外など、日本の祝日が複雑怪奇だからか、どの iCalendar サービスも微妙に間違ってたりするので注意。
これは sed を使ったシェルスクリプトで、主要な箇所を掲載しておく。
#!/bin/ksh # # *-ja-holidays_csv.sh - writes Japanese holidays in CSV # # Copyright (C) 2020 Taiji Yamada <taiji@aihara.co.jp> # # usage: # $ ./$0 | sort | less # $ ./$0 | sort | pbcopy # type="$(basename "$0" -ja-holidays_csv.sh)" if [ "$type" = "apple" ]; then URL_HOLIDAYS_ICS='http://files.apple.com/calendars/Japanese32Holidays.ics' elif [ "$type" = "google" ]; then URL_HOLIDAYS_ICS='https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics' else URL_HOLIDAYS_ICS='https://www.mozilla.org/projects/calendar/caldata/JapanHolidays.ics' fi # 中略。 curl "$URL_HOLIDAYS_ICS" 2> /dev/null | sed -n 's/⏎$// /^BEGIN:VEVENT$/,/^END:VEVENT$/{ /^BEGIN:VEVENT$/h /^DTSTART/H /^SUMMARY/H /^END:VEVENT$/{ H g s/⇥/ /g s/\n/⇥/g h s/^.*⇥DTSTART;VALUE=DATE.*:\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)⇥.*$/\1\/\2\/\3/ x s/^.*⇥SUMMARY:\([^⇥]*\)⇥.*$/\1/ /,/{ s/"/""/g s/^\(.*\)$/"\1"/ } H g s/\n/,/g s/$/⏎/ p } } ' exit $? cat <<EOF > /dev/null # sed スクリプトの解説 s/⏎$// # CRLF(^M^J) であれば LF(^J) に変換(⏎ は ^M, Emacs なら C-qC-m、⇥ は ^I, Emacs なら C-qC-i) /^BEGIN:VEVENT$/,/^END:VEVENT$/{ # これらに囲まれた行のみについて、 /^BEGIN:VEVENT$/h # こうした行なら、パターンスペースをホールドスペースに置換 /^DTSTART/H # これから始まる行なら、パターンスペースをホールドスペースに改行(^J)区切りで追加 /^SUMMARY/H # 〃 /^END:VEVENT$/{ # こうした行なら、 H # パターンスペースをホールドスペースに改行(^J)区切りで追加。これで「BEGIN:VEVENT〜END:VEVENT」の行すべてがホールドスペースに保持 g # ホールドスペースをパターンスペースに置換 s/⇥/ /g # 万が一タブ(^I)があると次の処理で破綻してしまうので空白にすべて変換 s/\n/⇥/g # 改行はすべてタブに変換 h # パターンスペースをホールドスペースに置換。これで「BEGIN:VEVENT〜END:VEVENT」の行すべてがホールドスペースに、1行になって、保持 s/^.*⇥DTSTART;VALUE=DATE.*:\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)⇥.*$/\1\/\2\/\3/ # この正規表現から「2020/01/01」のような形式の日付を取得 x # ホールドスペースとパタースペースを交換 s/^.*⇥SUMMARY:\([^⇥]*\)⇥.*$/\1/ # この正規表現から、祝日のサマリの文字列を取得 /,/{ # 万が一カンマ(,)があるとCSVとして破綻するので、そのようなときは、 s/"/""/g # 次に先立ち、予めダブルクォート(")があるときはダブルクォート(")ですべてエスケープ s/^\(.*\)$/"\1"/ # サマリの文字列をダブルクォート(")で囲む } # H # パターンスペースをホールドスペースに改行(^J)区切りで追加。これで「2020/0101^J元日」のような行がホールドスペースに保持 g # ホールドスペースをパターンスペースに置換 s/\n/,/g # 改行(^J)をカンマ(,)にすべて変換 s/$/⏎/ # レコード区切りをCRLF(^M^J)にし、CSV形式とする p # パターンスペースを印字 } } EOF # sed スクリプト内の「⏎⇥」は解説にあるように本来の制御文字になおさないと、このままのコピー&ペーストでは正しく動作しないので注意。 # 以下、略。
さて、以下が calendar-*.ja.* スプレッドシートとなる。
2019〜2021年の国民の祝日データは最後のシートにそれぞれ記載されているが、それ以外の期間向けに使用する場合は祝日データを追加しないといけない。
これらのスプレッドシートは、数式による「万年カレンダー」となっており、システムが対応する範囲内で任意のカレンダーとして機能する。PDF 以外は開いた年月によって開始月が変わるので、当月シートの年月(YEAR(TODAY())、MONTH(TODAY()))を適宜変えること。
そして、Excel も絡めた Numbers.app の話題に戻す。いくつか、体験したことを列挙しておく。
ちなみに、これらのスプレッドシートの技術的な補足を少々。非表示の列にもう二つの表があり、年月日データと祝日の「日」数字の表である。つまり、非表示ではないのは年月日の「日」数字の表となっている。
実はカスタムフォーマットを使えば、非表示の表は一つで事足りて、その場合、非表示は祝日の「年月日」の表、非表示ではないのは「年月日」の表で「日」のみを表示とすることは出来る。
しかし、Numbers.app でも Excel でもカスタムフォーマットは共有やオンライン版で制限があるので、保守的な方針として3つの表としている。
余談だが、TSV と CSV の混合形式という独自の TCSV 形式(私が古に作成した所謂「万年カレンダー」で使用されている)になってしまうが、以上を利用したシェルスクリプトも作成してある。
コマンド名が異なるだけで中身は同一である。他の2ファイルは実体のファイルのシンボリックリンクでよい。以下のように実行する。
$ ./google-ja-cal_tcsv.sh 2020 2020, 1, 1,5,12,13,19,26, 4,11,18,25 2020, 2, 2,9,11,16,23,24, 1,8,15,22,29 2020, 3, 1,8,15,20,22,29, 7,14,21,28 2020, 4, 5,12,19,26,29, 4,11,18,25 2020, 5, 3,4,5,6,10,17,24,31, 2,9,16,23,30 2020, 6, 7,14,21,28, 6,13,20,27 2020, 7, 5,12,19,23,24,26, 4,11,18,25 2020, 8, 2,9,10,16,23,30, 1,8,15,22,29 2020, 9, 6,13,20,21,22,27, 5,12,19,26 2020, 10, 4,11,18,25, 3,10,17,24,31 2020, 11, 1,3,8,15,22,23,29, 7,14,21,28 2020, 12, 6,13,20,27, 12,19,26 $ $ ./google-ja-cal_tcsv.sh 2021, 1, 1,3,10,11,17,24,31, 2,9,16,23,30 2021, 2, 7,11,14,21,23,28, 6,13,20,27 2021, 3, 7,14,20,21,28, 6,13,27 2021, 4, 4,11,18,25,29, 3,10,17,24 2021, 5, 2,3,4,5,9,16,23,30, 1,8,15,22,29 2021, 6, 6,13,20,27, 5,12,19,26 2021, 7, 4,11,18,22,23,25, 3,10,17,24,31 2021, 8, 1,8,9,15,22,29, 7,14,21,28 2021, 9, 5,12,19,20,23,26, 4,11,18,25 2021, 10, 3,10,17,24,31, 2,9,16,23,30 2021, 11, 3,7,14,21,23,28, 6,13,20,27 2021, 12, 5,12,19,26, 4,11,18,25これは以下のような形式と定義される。
#年, 月, 祝日や日曜日のCSV, 祝日でない土曜日や休業日のCSV例えば、以下の弊社休業日対応版
(2021年には未だ未対応)というもので、通常の休日と組織の休業日を赤と青で色分けするために利用されている。
- ae-calendar-h.ja.xlsx … 横用 (弊社休業日対応版)、Microsoft Excel
- ae-calendar-v.ja.xlsx … 縦用 (弊社休業日対応版)、Microsoft Excel
- ae-calendar-h.ja.pdf … 横用 (弊社休業日対応版)、PDF (2020/12 から 13 月分)
- ae-calendar-v.ja.pdf … 縦用 (弊社休業日対応版)、PDF (2020/12 から 13 月分)
- ae-calendar-2021-h.ja.xlsx … 横用 (和暦、弊社休業日対応版)、Microsoft Excel
- ae-calendar-2021-v.ja.xlsx … 縦用 (和暦、弊社休業日対応版)、Microsoft Excel
- ae-calendar-2021-h.ja.pdf … 横用 (和暦、弊社休業日対応版)、PDF (2020/12 から 13 月分)
- ae-calendar-2021-v.ja.pdf … 縦用 (和暦、弊社休業日対応版)、PDF (2020/12 から 13 月分)
(*) この便利ではあるが、独自の TCSV 形式から情報を抽出する Excel の「数式」は、弊社の Jun Takahashi に社内的な必要性で提案し Excel で実現してもらったことを
セル Z2 をそのまま拝借しており、著作権は主張しない Copyleft を了承いただいた。[2020/12/11 追記] 別の仕組みに切り替えた。Google Spread Sheet のように Split 関数が使えればもっと簡単にできるのだが…さらに、弊社では実際には以下のような TCSV 形式でさまざまな場面で共通して使用されている。
$ tail -n $((12*5)) holidays.txt 2017, 1, 1,2,8,9,15,22,29, 3,4,13,14,21, 7 2017, 2, 5,11,12,19,26, 4,18 2017, 3, 5,12,19,20,26, 4,11,18 2017, 4, 2,9,16,23,29,30, 1,8,15 2017, 5, 3,4,5,7,14,21,28, 1,2,13,20, 6 2017, 6, 4,11,18,25, 3,10,17 2017, 7, 2,9,16,17,23,30, 1,8,15,29 2017, 8, 6,11,13,20,27, 5,12,14,15,19, 16 2017, 9, 3,10,17,18,23,24, 2,9,16,30 2017, 10, 1,8,9,15,22,29, 7,14,21 2017, 11, 3,5,12,19,23,26, 4,11,18 2017, 12, 3,10,17,23,24,31, 2,9,16,28,29,30 2018, 1, 1,7,8,14,21,28, 2,3,4,13,20, 6 2018, 2, 4,11,12,18,25, 3,10,17 2018, 3, 4,11,18,21,25, 3,10,17,31 2018, 4, 1,8,15,22,29,30, 7,14,21 2018, 5, 3,4,5,6,13,20,27, 1,2,12,19 2018, 6, 3,10,17,24, 2,9,16,30 2018, 7, 1,8,15,16,22,29, 7,14,21 2018, 8, 5,11,12,19,26, 4,13,14,15,18, 16,17 2018, 9, 2,9,16,17,23,24,30, 1,8,15,29 2018, 10, 7,8,14,21,28, 6,13,20 2018, 11, 3,4,11,18,23,25, 10,17 2018, 12, 2,9,16,23,24,30, 1,8,15,28,29,31 2019, 1, 1,6,13,14,20,27, 2,3,4,12,19 2019, 2, 3,10,11,17,24, 2,9,16 2019, 3, 3,10,17,21,24,31, 2,9,16,30 2019, 4, 7,14,21,28,29,30, 6,13,20 2019, 5, 1,2,3,4,5,6,12,19,26, 18, 11 2019, 6, 2,9,16,23,30, 1,8,15,29 2019, 7, 7,14,15,21,28, 6,13,20 2019, 8, 4,11,12,18,25, 3,10,13,14,15,31, 16,17 2019, 9, 1,8,15,16,22,23,29, 7,14,21 2019, 10, 6,13,14,20,22,27, 5,12,19 2019, 11, 3,4,10,17,23,24, 2,9,16,30 2019, 12, 1,8,15,22,29, 7,14,21,30,31, 28 2020, 1, 1,5,12,13,19,26, 2,3,4,11, 18 2020, 2, 2,9,11,16,23,24, 1,8,29, 15 2020, 3, 1,8,15,20,22,29, 7,14, 21 2020, 4, 5,12,19,26,29, 4,11,18,30 2020, 5, 3,4,5,6,10,17,24,31, 1,2,16,30, 9 2020, 6, 7,14,21,28, 6,13,20 2020, 7, 5,12,19,23,24,26, 4,11,18 2020, 8, 2,9,10,16,23,30, 1,8,13,14,15,29, 11,12 2020, 9, 6,13,20,21,22,27, 5,12,19 2020, 10, 4,11,18,25, 3,10,17,31 2020, 11, 1,3,8,15,22,23,29, 14,21, 7 2020, 12, 6,13,20,27, 5,12,19,28,29,30,31 2021, 1, 1,3,10,11,17,24,31, 2,4,9,13,30, 16 2021, 2, 7,11,14,21,23,28, 6,20, 12,13 2021, 3, 7,14,20,21,28, 6,13 2021, 4, 4,11,18,25,29, 3,10,17,30 2021, 5, 2,3,4,5,9,16,23,30, 1,15,29, 8 2021, 6, 6,13,20,27, 5,12,19 2021, 7, 4,11,18,22,23,25, 3,10,17,31 2021, 8, 1,8,9,15,22,29, 7,12,13,14,21, 10,11 2021, 9, 5,12,19,20,23,26, 4,11,18 2021, 10, 3,10,17,24,31, 2,9,16,30 2021, 11, 3,7,14,21,23,28, 13,20, 6 2021, 12, 5,12,19,26, 4,11,18,28,29,30,31これは以下のような形式と定義している。
#年, 月, 祝日や日曜日のCSV, 休業日のCSV, 有給休暇消化推進日のCSV例えば、以下の弊社休業日、有給休暇消化推進日対応版というもので、通常の休日・組織の休業日・有給休暇消化推進日を赤の前景色・青の前景色・青の背景色で色分けするために利用されている。
- detail-ae-calendar-h.ja.xlsx … 横用 (弊社休業日、有給休暇消化推進日対応版)、Microsoft Excel
- detail-ae-calendar-v.ja.xlsx … 縦用 (弊社休業日、有給休暇消化推進日対応版)、Microsoft Excel
- detail-ae-calendar-h.ja.pdf … 横用 (弊社休業日、有給休暇消化推進日対応版)、PDF (2020/12 から 13 月分)
- detail-ae-calendar-v.ja.pdf … 縦用 (弊社休業日、有給休暇消化推進日対応版)、PDF (2020/12 から 13 月分)
- detail-ae-calendar-2021-h.ja.xlsx … 横用 (和暦、弊社休業日、有給休暇消化推進日対応版)、Microsoft Excel
- detail-ae-calendar-2021-v.ja.xlsx … 縦用 (和暦、弊社休業日、有給休暇消化推進日対応版)、Microsoft Excel
- detail-ae-calendar-2021-h.ja.pdf … 横用 (和暦、弊社休業日、有給休暇消化推進日対応版)、PDF (2020/12 から 13 月分)
- detail-ae-calendar-2021-v.ja.pdf … 縦用 (和暦、弊社休業日、有給休暇消化推進日対応版)、PDF (2020/12 から 13 月分)
ちなみにだが、ここでの万能カレンダーでは TSV 形式としての 3 列目は使用しておらず、日曜日と祝日シートがそのかわりとなっている。
後述の古い内容は現時点(2020年)でも当てはまるものや当てはまらないものが混在しているので、当時の記録としてそのままにしておく。
$ defaults write com.apple.Terminal UseCtrlVEscapes NO $ defaults write com.apple.Terminal DoubleWideChars YES $ defaults write com.apple.Terminal DoubleColumnsForDoubleWide YESとしておけばよい。但し、ls(1) などで日本語ファイル名の表示には -v オプションが必要になるので、~/.bashrc などにで ls のエイリアスとして -v を加えたものにしておくとよい。但し、Leopard 以降はこれらの設定は不要。
[ -f ~/.bashrc ] && . ~/.bashrc [ -f ~/.profile ] && . ~/.profileとしておいて、~/.bashrc に
: case "$TERM_PROGRAM" in 'Apple_Terminal') LANG=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 export LANG LC_ALL ;; : esac : case "$TERM-$TERM_PROGRAM" in *-Apple_Terminal) LESSCHARSET=utf-8 export LESSCHARSET ;; : esac :のような設定を追加しておけばよい。しかしこれでは、euc-jp や Shift_JIS のファイルを見るには難がある。less(1) の代わりに lv(1) であれば出力エンコーディングをも判別してくれるので、lv のインストールと使用を検討しよう。lv (1) では日本語等の正規表現も使えるので大変便利である。
$ ditto --norsrc file /Path/NAME/file
$ hdiutil unmount /Path/NAME && dd if=/dev/disk1 of=name.isoしかし、システム標準搭載の dd(1)だとエラーのリトライ等を考慮してないので、readcd(1) の方が好ましい。
$ diskutil unmount /dev/disk1 && readcd dev=IODVDServices f=name.isoここで "/dev/disk1", "name", "/Path/NAME", "data" 等、適当に読み替えること。以下同様。
$ hdiutil makehybrid -o name.iso /Path/NAME -iso -joliet -udf -default-volume-name "NAME"もしくは mkisofs(8) を使って:
$ mkisofs -dvd-video -udf -o name.iso -V NAME /Path/NAME/無論「複製不能」とされるDVD-Videoは*バックアップしてはならない*ので、あくまでDVDハンディカム等で撮ったDVD-Videoの話。
$ hdiutil burn name.iso -noverifyburn
$ diskutil unmount /dev/disk1 && cdrdao read-cd --device IODVDServices --datafile name.bin name.toc && cdrdao read-cddb --device IODVDServices --datafile name.bin name.toc $ cdrdao write --device IODVDServices name.toc
$ cd /Library/Receipts/ $ ls X11SDK.pkg/Contents/ Archive.bom Info.plist Resources version.plist $ lsbom -s X11SDK.pkg/Contents/Archive.bom | lessしかし、Leopard 以降では、たまに上記のように *.pkg がディレクトリでないものが存在する。その場合、xar を使うと内容が確認出来る。
$ xar -t -f NAME.pkgこれらの中身がさらになんらかのアーカイブになっている場合があり、lsbom や xar だけでは内容が確認出来ないものもある。まず、以下のように file(1) コマンドでそのファイルの種類を試してみよう。
$ file -z NAMEgzip された cpio であるならば、以下のように内容が確認出来る。
$ cpio -t -z < NAME
$ hdiutil create -size 64m "tmp.dmg" -type UDIF -fs HFS+ -volname "NAME" -layout NONE $ hdiutil attach "tmp.dmg" -mountroot "/tmp" $ cp -pR "$@" "/tmp/NAME" $ hdiutil detach "/tmp/NAME" $ hdiutil convert "tmp.dmg" -format UDBZ -o "NAME.dmg"最大容量「64m」や梱包物「"$@"」等は適切なものに置き換えること。いつもこれを打鍵するのは面倒なので mkdmg.sh のようなシェルスクリプトを用意し、以下のようにすると良いだろう。
$ mkdmg.sh NAME files.. dirs..
$ ditto -c -k -sequesterRsrc "directory" "archive.zip"(参考文献: http://journal.mycom.co.jp/column/osx/119/)
Mac OS X 用の FUSE と Macfusion を使うと、sftp のリモートホストのパスをローカルホストに「ユーザ権限」でマウントでき、リモートのディレクトリツリーをグラフィカルにも扱うことができるようになる。
まず、両者をサイトに従ってインストールする。
例えば、「sftp taiji@mitsuha.aihara.co.jp
」つまり、リモートホストが「mitsuha.aihara.co.jp
」、 ユーザが「taiji
」、パスがリモートホストの「$HOME
」をマウントするには、 Macfusion で、
mitsuha
」、Host と User Name を指定で「OK」、問題なければマウントされ、「⌘」コマンドキー+Rで Finder にそのディレクトリが表示される。マウントしたら Macfusion は終了しても構わない。もし、デスクトップにリムーバブルメディアのようなアイコンを出したければ、Finder の環境設定で下図のように「接続中のサーバ」にチェックを入れると、
アンマウントが、いつも通りデスクトップ上の「アイコンのゴミ箱行き」になるので分かり易い。
ちなみに、タイトル「mitsuha
」なら、「/Volumes/mitsuha/
」でターミナルからもアクセスできるので、CUI 的にも便利である。
$ defaults read com.apple.x11 { depth = -1; "done_xinit_check" = 1; "enable_fake_buttons" = 1; "enable_key_equivalents" = 0; "enable_system_beep" = 1; "fullscreen_hotkeys" = 1; "no_auth" = 1; "nolisten_tcp" = 0; rootless = 1; "sync_keymap" = 0; "wm_ffm" = 0; }などとして設定を確認し、Xquartz(1) を参考にして、例えば、
$ defaults write com.apple.x11 wm_ffm trueなどとすると、ウインドウをクリックせずマウスの移動のみでフォーカスを遷移させることができるようになる。また、
$ defaults write com.apple.x11 enable_stereo -bool trueとすると GLX stereo visuals が有効になる。
$ /Applications/Utilities/X11.app/Contents/MacOS/X11 :1もっとも、普段使いというより、マルチディスプレイ対応X11クライアント開発の動作確認向けとして有用。
$ defaults read org.x.X11 { : "login_shell" = "/bin/sh"; "no_auth" = 0; "nolisten_tcp" = 0; : }X11 を起動すると xterm も一緒に起動される。これを好まないのであれば、以下のように設定を変更しよう。
$ defaults write org.x.X11 app_to_run -string ""また、このように XAUTH が有効になっている("no_auth"=0)とセキュリティ上好ましいが、X11.app を起動してからIPアドレス等が変更されると、新しい Window が開かなくなってしまう。その場合、例えば以下のように xauth で新しいホスト名等を追加するとよい。
$ xauth list localhost:2 MIT-MAGIC-COOKIE-1 xxxxxxxx ubagami.kb.aihara.co.jp/unix:2 MIT-MAGIC-COOKIE-1 xxxxxxxx $ uname -n ubagami.local $ echo $DISPLAY :2.0 $ xauth add `uname -n`/unix:2 MIT-MAGIC-COOKIE-1 xxxxxxxx
Snow Leopard X サーバ |
Snow Leopard 修正済み X サーバ |
|
xev |
![]() |
![]() |
xmore |
![]() |
![]() |
editres |
![]() |
![]() |
/Applications/Utilities/X11.app/Contents/MacOS/X11.bin
を Snow Leopard に持ち込む。
使う。/Applications/Utilities/X11.app/Contents/MacOS/X11.bin
にすればシステムに最小の変更で問題が回避できる。ちなみに、以上の方法はこの修正とは異なっている。$ xmodmap -pke > ~/.Xmodmap.orig~/.xinitrc もしくは /usr/X11*/lib/X11/xinit/xinitrc から呼ばれる事が期待される ~/.Xmodmap のひな形を、その複製として用意する。
$ cp -p ~/.Xmodmap.orig ~/.XmodmapX のコマンド xev を立ち上げて、そのウィンドウでスペースキーの「左側」にある alt/option キーなどを押してみると:
KeyPress event, serial 30, synthetic NO, window 0x1a00001, root 0x37d, subw 0x0, time 1215044578, (89,163), root:(90,186), state 0x0, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False次に、スペースキーの「右側」にある alt/option キーなどを押してみると:
KeyRelease event, serial 30, synthetic NO, window 0x1c00001, root 0x37d, subw 0x1c00002, time 1216791692, (59,65), root:(485,88), state 0x2000, keycode 69 (keysym 0xff7e, Mode_switch), same_screen YES, XKeysymToKeycode returns keycode: 66 XLookupString gives 0 bytes: XFilterEvent returns: Falseなんと、同じキーシンボルが割り当てられてしまっている(これはせっかくキー資源の無駄使いだ)。
--- .Xmodmap.orig 2010-08-07 01:07:59.000000000 +0900 +++ .Xmodmap 2010-08-07 01:46:41.000000000 +0900 @@ -56,10 +56,10 @@ keycode 63 = Meta_L keycode 64 = Shift_L keycode 65 = Caps_Lock -keycode 66 = Mode_switch +keycode 66 = Alt_L keycode 67 = Control_L keycode 68 = Shift_R -keycode 69 = Mode_switch +keycode 69 = Alt_R keycode 70 = Control_R keycode 71 = Meta_R keycode 72 =さて、これらの Alt キーを「他のキーと同時に押して使うモディフィアキー」として使いたいはずなのだが、とりあえず、現時点でのモディフィアキーの設定を見てみよう。
$ xmodmap -pm xmodmap: up to 2 keys per modifier, (keycodes in parentheses): shift Shift_L (0x40), Shift_R (0x44) lock Caps_Lock (0x41) control Control_L (0x43), Control_R (0x46) mod1 Mode_switch (0x42), Mode_switch (0x45) mod2 Meta_L (0x3f), Meta_R (0x47) mod3 mod4 mod5このように、モディフィアキーが3+2個しか無い状態では、せっかくあるキーが X の世界で使えず「もったいない」。それに、Mode_switch は今キーシンボルから外してしまった。よって、~/.xinitrc もしくはそれ相当のファイルに、例えば以下のような設定を行う。
for modmap in\ /etc/X11/xinit/.Xmodmap\ $HOME/.Xmodmap\ ; do [ -f "$modmap" ] && xmodmap "$modmap" done case "`uname -s`" in Darwin) case "`hostname`" in sakuya*) xmodmap \ -e 'keysym Alt_R = Super_R' \ -e 'add Mod3 = Super_R' \ -e 'keysym Begin = Hyper_R' \ -e 'add Mod4 = Hyper_R' ;; yatihoko*) xmodmap \ -e 'remove Mod1 = Alt_R' \ -e 'add Mod3 = Alt_R' \ -e 'remove Mod2 = Meta_R' \ -e 'add Mod4 = Meta_R' ;; esac ;; esac ;; CYGWIN*) xmodmap \ -e 'remove Control = Control_R' \ -e 'keysym Control_R = Super_R' \ -e 'add Mod3 = Super_R' \ -e 'keysym Begin = Hyper_R' \ -e 'add Mod4 = Hyper_R' ;; esacここでの本題は上記の、灰色以外で示した箇所である。`xmodmap -pm` の設定から不要な定義を外し、必要な定義を加える。ちなみに、灰色で示した箇所を含む上例では `hostname` コマンドによって条件分岐させているが、ホームを複数のマシンで共有しない場合は条件分岐させなくても構わない。
taiji@yatihoko:~$ xmodmap -pm xmodmap: up to 2 keys per modifier, (keycodes in parentheses): shift Shift_L (0x40), Shift_R (0x44) lock Caps_Lock (0x41) control Control_L (0x43), Control_R (0x46) mod1 Alt_L (0x42) mod2 Meta_L (0x3f) mod3 Alt_R (0x45) mod4 Meta_R (0x47) mod5このようにモディフィアキーがのように3+4個も用意できるようになる。ちなみに、Control_R (0x46) は、どのように押しても xev で現れないキーコードだった。
/etc/httpd/users/*.conf
」、Leopard 以降の場合「/etc/apache2/users/*.conf
」を特権で編集すればよい。ストレージ及びインターフェース |
書き込み速度 |
SATA 7200rpm、内蔵 |
340Mbps |
SATA 7200rpm、外付け FireWire800 |
431Mbps |
SATA 7200rpm、外付け FireWire400 |
250Mbps |
SATA 7200rpm、外付け USB2.0 |
91Mbps |
フラッシュメモリ、外付け USB2.0 |
83Mbps |
ストレージ及びインターフェース |
書き込み速度 |
SATA 7200rpm、内蔵 |
605Mbps |
SDHC I、10MB/s、Class 10, HFS+ |
159Mbps |
SDHC I、10MB/s、Class 10, exFAT |
162Mbps |
SDXC I、45MB/s、Class 10, HFS+ |
322Mbps |
SDXC I、45MB/s、Class 10, exFAT |
351Mbps |
SATA 7200rpm、外付け FireWire800 |
570Mbps |
SATA 7200rpm、外付け FireWire400 |
未調査 |
SATA 7200rpm、外付け USB2.0 |
226Mbps |
フラッシュメモリ、外付け USB2.0 |
121Mbps |
ストレージ及びインターフェース |
書き込み速度 |
SSD、内蔵 |
16795Mbps |
SATA 7200rpm、外付け USB3.0 |
682Mbps |
SATA 7200rpm、外付け FireWire800 |
589Mbps |
SATA 7200rpm、外付け FireWire400 |
218Mbps |
インターフェース |
Tiger/PowerMac G5 |
Snow Leopard/MacBook Pro Mid 2010 |
裸族のお立ち台スーパーコンボ SATA6G CROSFEU3S6G |
未調査 |
○ |
裸族のお立ち台 FireWire 800/400+USB3.0 CROSFU3 |
未調査 |
○ |
裸族の頭 IDE+SATA CRAISU2 |
○ |
○ |
裸族のお立ち台 eSATAプラス CROSEU2FD |
× |
× |
裸族のお立ち台スーパーコンボ CROS-SC |
× | × |
SATA+IDE つながーるKIT USB light NV-TW130U |
× | × |
SATA->USB2.0 変換アダプタ GH-USHD-SATA |
× | × |
内蔵 |
× | — |
useradd, userdel, groupadd, groupdel
ライクな使い方が出来る dscl を利用したシェルスクリプトである。localnet.*
はサーバ向けで /LDAPv3/127.0.0.1
などに利用できる。Lion, Mountain Lion でしか試していないので、中身をよく見て、盲目的には使用しないこと。user-post-command.*.sh
を少し改良しました。こちらの話題に関連して root-post-command.sh
を加えました。root-post-command.sh
に少し別件を加えました。いずれ解説を詳述します。useradd.sh, userdel.sh, groupadd.sh, groupdel.sh
の使用例useradd.sh, userdel.sh, groupadd.sh, groupdel.sh
の使用例を示す。
ユーザ logname
を、フルネーム Full Name
、グループ workgroup,defaultgroup
、パスワード password
、uid=1026
、管理者権限付き、ホーム作成、ホーム作成後コマンド /path_to/user-post-command.ja.sh
、で作成。グループがグループが「.
」ドメインに存在しなければ無視して続行するので予め作成しておくこと。
$ sudo useradd.sh -c 'Full Name' -G workgroup,defaultgroup -p 'password' -u 1026 --admin -m --post /path_to/user-post-command.ja.sh logname
ユーザ logname
を、所属グループ自動削除、ホーム退避、で削除。
$ sudo userdel.sh --all-groups -r logname
グループ defaultgroup
を、gid=1026
、ホーム作成、で作成。
$ sudo groupadd.sh -c 'Default Group' -g 1026 -m defaultgroup
グループ defaultgroup
を、ホーム退避、で削除。
$ sudo groupdel.sh -r defaultgroup
ここで、ホームとグループホームは Mac OS X (サーバ)の挙動に合わせ既定値として /Users/logname
, /Groups/defaultgroup
に位置し、-d
オプションで指定できる。
sudo
で実行しない場合は、--dry-run
を指定したのと同様に、実行されるべき一連のコマンドを表示するのみとなるので活用されたい。
localnet.useradd.sh, localnet.userdel.sh, localnet.groupadd.sh, localnet.groupdel.sh
の使用例localnet.useradd.sh, localnet.userdel.sh, localnet.groupadd.sh, localnet.groupdel.sh
の使用例を示す。ちなみに、--dscl '-u diradmin -P ********'
オプションは dscl
に渡すオプションで、デフォルトは '-u diradmin -p'
となっている。また、dscl
のドメインは --domain /LDAPv3/127.0.0.1
のように指定できる。
ユーザ logname
を、フルネーム Full Name
、グループ workgroup,defaultgroup
、パスワード password
、uid=1026
、管理者権限付き、ホーム作成、ホーム作成後コマンド /path_to/user-post-command.ja.sh
、で作成。グループが「/LDAPv3/127.0.0.1
」ドメインに存在しなければ無視して続行するので予め作成しておくこと。
$ sudo localnet.useradd.sh --dscl '-u diradmin -P ********' -c 'Full Name' -G workgroup,defaultgroup -p 'password' -u 1026 --admin -m --post /path_to/user-post-command.ja.sh logname
ユーザ logname
を、所属グループ自動削除、ホーム退避、で削除。
$ sudo localnet.userdel.sh --dscl '-u diradmin -P ********' --all-groups -r logname
グループ defaultgroup
を、gid=1026
、ホーム作成、で作成。
$ sudo localnet.groupadd.sh --dscl '-u diradmin -P ********' -c 'Default Group' -g 1026 -m defaultgroup
グループ defaultgroup
を、ホーム退避、で削除。
$ sudo localnet.groupdel.sh --dscl '-u diradmin -P ********' -r defaultgroup
ここで、ホームとグループホームは Mac OS X サーバの挙動に合わせ既定値として /Users/logname
, /Groups/defaultgroup
に位置し、-d
オプションで指定できる。
sudo
で実行しない場合は、--dry-run
を指定したのと同様に、実行されるべき一連のコマンドを表示するのみとなるので活用されたい。
localnet.useradd.sh
の useradd.sh
との違いは、「.
」ドメインの以下のグループにこのユーザを加えることにある。これは Mountain Lion Server の規定の挙動に従った。
com.apple.access_ftp com.apple.access_backup com.apple.access_vpn com.apple.access_calendar com.apple.access_afp com.apple.access_smb com.apple.access_devicemanagement com.apple.access_mail com.apple.access_chat com.apple.access_addressbook
localnet.userdel.sh
の userdel.sh
との違いは、「.
」ドメインの以上のグループと admin
グループに所属していればこのユーザを除くことにある。もし、自動で所属するグループをすべて探して除くならオプション --all-groups
を指定すること。
user-post-command.*.sh
の解説上記でホーム作成後コマンドとして呼び出している user-post-command.*.sh
は、defaults
コマンドで言語の優先順位に変更を加えるシェルスクリプトである。必要なら ~/.profile
を加えるなど、環境に応じて編集すればよいだろう。以下に user-post-command.ja.sh
を載せておく。
#!/bin/ksh print_usage(){ cat <<EOF usage: $(basename $0) [-h|--help] [--dry-run] copyright: Copyright (C) 2013 Taiji Yamada <taiji@aihara.co.jp> This program is distributed under the BSD 2-clause license. See http://opensource.org/licenses/BSD-2-Clause EOF } while [ $# -gt 0 ]; do case "$1" in -h|--help) print_usage; exit 0;; --dry-run) decho=echo;; esac shift done kept_file(){ # $0 /etc/sshd_config keep_file="$1" kept_file= if [ -f "$keep_file" ]; then kept_file="${keep_file}~" while [ -f "$kept_file" ]; do kept_file="${kept_file}~"; done echo "$kept_file" return 0 else echo "$keep_file" return 1 fi } modify_defaults__GlobalPreferences(){ # $0 "$HOME"/Library/Preferences/.GlobalPreferences defaults read "$1" | sed -e ' /^ *AppleLocale = */s/"[^"][^"]*"/"ja_JP"/ /^ *AppleLanguages = *(/,/^ *)/{ /^ *AppleLanguages = *(/{ n h s/[^ ,][^ ,]*/ja/ p x } /^ *ja,$/d } ' } { keep_file="$HOME"/Library/Preferences/.GlobalPreferences.plist base_path=$(dirname "$keep_file")/$(basename "$keep_file" .plist) diff -u <(defaults read "$base_path") <(modify_defaults__GlobalPreferences "$base_path") > /dev/null || { kept_file=$(kept_file "$keep_file") && new_plist=$(modify_defaults__GlobalPreferences "$base_path") && $decho cp -p "$keep_file" "$kept_file" && $decho defaults write "$base_path" "$new_plist" } }
user-post-command.en.sh
は上記で "ja_JP", ja
を "en_US", en
に変えたものである。
$ softwareupdate -l Software Update Tool Copyright 2002-2003 Apple Computer, Inc. Software Update found the following new or updated software: ! iTunesX-6.0.1 iTunes, 6.0.1, 13132K [required] ! QuickTime703-7.0.3 QuickTime, 7.0.3, 33940K [required] [restart] * AirPortPan2005-001-1.0 AirMac Extreme2005-001, 1.0, 1200K [restart] $ sudo softwareupdate -i iTunesX-6.0.1 QuickTime703-7.0.3 AirPortPan2005-001-1.0