Tips on OS X Tiger 〜

2006/1/6新規 | 2010/10/20更新 | 2013/7/12更新
別稿:仮想化とカーネルの再構築

Contents

Numbers.app

昨今(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年には未だ未対応)というもので、通常の休日と組織の休業日を赤と青で色分けするために利用されている。

(*) この便利ではあるが、独自の 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

例えば、以下の弊社休業日、有給休暇消化推進日対応版というもので、通常の休日・組織の休業日・有給休暇消化推進日を赤の前景色・青の前景色・青の背景色で色分けするために利用されている。

ちなみにだが、ここでの万能カレンダーでは TSV 形式としての 3 列目は使用しておらず、日曜日と祝日シートがそのかわりとなっている。

更新履歴

  1. [2020/12/25] セル AI3 が潜在的バグにより右に2つずらした。
  2. [2020/12/25] セル AJ3 が潜在的バグにより式の末尾に「&""」を追加した(意図せず文字列ではなく数値となり AA4:AG9 にマッチしなくなる)。
  3. [2020/12/25] 当月カレンダーの列幅が揃ってなかった。
  4. [2020/12/25] いくつかのシートの表示倍率が 101% になっていた。

後述の古い内容は現時点(2020年)でも当てはまるものや当てはまらないものが混在しているので、当時の記録としてそのままにしておく。

iWork '08

Numbers

まずは、Excel や OOo の Calc のことは綺麗サッパリと忘れ、「Numbersとは表計算機能を持つドロー系お絵描きツールである」と始めに理解してしまえば、サクサクと使いこなせるようになる。
A4縦にしたい
ツールバー[インスペクタ][シートインスペクタ]の[ページレイアウト]を[縦]にする。
罫線
罫線色の規定値が薄い灰色なので、罫線が引かれないものと勘違いしがち。フォーマットバーの枠線のカラーで設定する。もしくは、選択したセルで[インスペクタ][表インスペクタ][セルの枠線]のカラーで設定する。
セルの高さを変更したい
メニューの[表][枠線の選択を許可]すると、セルの高さをマウスで変更できるようになる。
選びたい表、セル、その他いろいろなオブジェクトがうまく選べない
マウスカーソルの形状に注意。
表の位置を数値でキッチリ指定したい
表オブジェクトを選んでツールバー[インスペクタ][位置と回転インスペクタ]の[位置]を設定すればよい。表に限らず、テキストボックスその他においても同様である。
オブジェクトの位置が何かに吸着してしまう
コマンドキーを押しながら動かすと吸着しない。または、カーソルキーで動かすと吸着せずに位置を微調整できる。もしくは[環境設定][一般] [配置ガイド][オブジェクトの端でガイドを表示]のチェックを外すと常に吸着しなくなる。
テキストボックスのインデント幅の微調整ができない
ツールバーの[表示][ルーラ]にあるスライダを、コマンドキーを押しながら動かすと、[ルーラの単位]に依らず細かく調整できる。もしくは [環境設定][一般][ルーラの単位]を[センチ]などではなく[ポイント]などに一時的に変更するのも良い。
かな漢字変換などで一瞬でもセルの高さがのびると、他のさまざまなオブジェクトの位置がずれて、レイアウトが崩れてしまう
位置が確定したオブジェクトについて、メニューの[配置]を[ロック]しておくと、レイアウトが崩れない。
空白ではなく「空」のドキュメントからはじめたい
表も何もないドキュメントを作成し「空」テンプレートとして保存しておく。
他の表への参照が「ヘッダセル名」なのが冗長で嫌だ
気にしないのが吉。もっとも、[環境設定][一般]における数式の[ヘッダセル名を参照として使用]のチェックを外すことで実現できる。ドキュメントの属性ではなくアプリケーションの属性ということは内部では番地で扱われているはず。よって、見た目だけの話である。
表で複数行のヘッダにしたい
*未解決*(ページをまたがる表において、ヘッダを各ページに表示させる際に問題となる。)
多角形の頂点の位置を自由に変更したい
メニューの[フォーマット][図形][編集可能にする]。多角形に限らず、星形その他においても同様である。
多角形の頂点を増やしたい、減らしたい
オプションキーを押しながら、多角形の辺の上へマウスを動かすと「プラス記号付きのペン先」カーソルになるので、そこでクリックすると頂点が追加される。頂点を減らすには、頂点を選んでデリートキー。むろん、多角形に限らない。
多角形のパスを閉じたい、開きたい
閉じたいパスの片方の頂点でダブルクリックすると、パスを追加できるようになるが、始点の頂点へパスを追加すると多角形のパスを閉じることになる。開きたいパスは*未解決*
PDF形式で書き出したときにマージンが大きくずれてしまう
*未解決*(印刷時にPDF形式で保存すれば問題は回避できる。)
Excel形式での書き出し
まったくもって使えない。

Aqua

設定の「キャンセル」について

[アップルメニュー][システム環境設定...]などを弄ってみるとわかることだが、各所の設定には基本的に、選択や決定を「キャンセル」できるようには作成されておらず、即座に反映されるので、始めは戸惑うかもしれない。無論、特に重要な設定事項に限っては、選択や決定が実は即座に反映されず「キャンセル」が可能なものもある。この辺りは他のオペレーティングシステムとは異なり、重要な決定かそうでないかを直感的に判断でき、むしろ好感が持てる。

マウスを極力使わなくて済むようにするには

[アップルメニュー][システム環境設定][キーボードとマウス][キーボードショートカット]におけるフルキーボードアクセスの[すべてのコントロール]をチェックすると、タブキーでほとんどすべてのアイテムに遷移することができ、「ポチクリポチクリ」せずに、ほとんどキーボードのみで済むようになる。また、キーボードでは操作できないアイテムがあると勘違いしがちなのが「青い枠で囲われたボタン」と「青いボタン」。これらは順に「スペースキー」「リターンキー」に割り当てられている。

ctrl と caps lock の入れ替えについて

Tiger では ctrl と caps lock の入れ替えが[システム環境設定][キーボードとマウス][キーボード][修飾キー]で簡単に出来るようになった(但し、PowerBook G4 でそれを実施していると、なんらかのタイミングで稀に ctrl にロックがかかる*未解決*)。
また、[キーボードとマウス][キーボード][キーボードショートカット]のカスタマイズは、ctrl と caps lock の入れ替えを実施しないでおかないとうまく設定できないので注意されたい。

ウィンドウの巡回

日本語環境では、ウィンドウの巡回のキーボードショートカットの規定値が Leopard までは ctrl+「`」だったのが、Snow Leopard からはいくつかのアプリケーションで ctrl+F1 に変わっている。Leopard まではキーボードの配列(「`」がESCの下か否か)依存のような気がしていたが、日本語配列のキーボードを接続する場合も配慮したのか、英語配列しか使わないユーザには不便である。

しかしこれは、嫌々慣れる事にしよう。

Darwin

リソースフォークのアーカイブや同期について

Tiger から tar(1) でリソースフォークに対応された。rsync(1) でも -E オプションで対応。

ターミナルにおける日本語の扱いについて

ターミナル.app(com.apple.Terminal)で日本語を扱うためには、
$ 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 以降はこれらの設定は不要。

また、標準の less(1) をターミナル.app で utf-8 のファイルを見るには、~/.bash_profile を
[ -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) では日本語等の正規表現も使えるので大変便利である。

一方で、標準の less-382 をダウンバージョンして less-358+iso254パッチをインストールすることはあまりお薦めしない。less-382 に対応した Jam less(jless) がリリースされているので、その less-382+iso261パッチを /opt/local などへインストールするのもよい。

Darwin 特有のコマンド

リソースフォークなしでファイルをコピー
Mac 以外の環境へファイルを渡す場合、リソースフォークに対応した cp(1) では他の環境では意味の無いファイルが含まれてしまい好ましくない。よって、代わりに ditto(1) を使う。
$ ditto --norsrc file /Path/NAME/file

ディスクイメージ関係

データCD/DVD をディスクイメージに変換
$ 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" 等、適当に読み替えること。以下同様。
DVD-Video 形式のフォルダパッケージをディスクイメージに変換
$ 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の話。
ディスクイメージをCD-R/DVD-Rに焼き付け
$ hdiutil burn name.iso -noverifyburn
Audio CD を toc/bin 形式でコピーしてCD-Rに焼き付け
システム標準搭載のコマンドでは実現できないようなので cdrdao(1) を利用。
$ 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        
 
 

アプリケーション管理、ソフトウェア開発

インストールパッケージの内容の確認

Tiger でインストールされたパッケージの具体的な内容については、例えば以下のように lsbom(8) を使って確認出来る。
$ 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 NAME
gzip された cpio であるならば、以下のように内容が確認出来る。
$ cpio -t -z < NAME

ソフトウェア配布向けディスクイメージの作成

作成したアプリケーション(〜.app)などを配布する場合に圧縮されたディスクイメージがよく使われる。これを作成するには hdiutil(1) を以下のように使用すればよい。
$ 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..

ソフトウェア配布向けZIPアーカイブの作成

ディスクイメージの他にPKZip形式もソフトウェア配布向けのアーカイブとしてよく使われる。これを作成するには ditto(1) を以下のように使用する。
$ ditto -c -k -sequesterRsrc "directory" "archive.zip"
(参考文献: http://journal.mycom.co.jp/column/osx/119/)

ソフトウェア配布向けパッケージの作成

パッケージの作成には /Developer/Applications/Utilities/PackageMaker.app か packagemaker(1) を使う。

接続性

MacFUSE

Mac OS X 用の FUSEMacfusion を使うと、sftp のリモートホストのパスをローカルホストに「ユーザ権限」でマウントでき、リモートのディレクトリツリーをグラフィカルにも扱うことができるようになる。

まず、両者をサイトに従ってインストールする。

例えば、「sftp taiji@mitsuha.aihara.co.jp」つまり、リモートホストが「mitsuha.aihara.co.jp」、 ユーザが「taiji」、パスがリモートホストの「$HOME」をマウントするには、 Macfusion で、

  1. 「+」ボタンで「sftp」を選び、
  2. 出てきたダイアログで、最上段で適当なタイトル「mitsuha」、Host と User Name を指定で「OK」、
  3. 「mount」ボタンを押し、
  4. パスワードやパスフレーズは ssh やキーチェーンなどの挙動を把握した上で入力すると、

問題なければマウントされ、「⌘」コマンドキー+Rで Finder にそのディレクトリが表示される。マウントしたら Macfusion は終了しても構わない。もし、デスクトップにリムーバブルメディアのようなアイコンを出したければ、Finder の環境設定で下図のように「接続中のサーバ」にチェックを入れると、


アンマウントが、いつも通りデスクトップ上の「アイコンのゴミ箱行き」になるので分かり易い。

ちなみに、タイトル「mitsuha」なら、「/Volumes/mitsuha/」でターミナルからもアクセスできるので、CUI 的にも便利である。

X Window System

Mac OS X で X Window System を使うと、Linux, BSD, Solaris 等のグラフィカルな技術がそのまま利用でき、しかも、「リモート」のグラフィカルな技術が X Window System の透過性によって扱えるので、十二分に活用するとよい。

X11

Apple 謹製の X11 for Mac OS X はインストールメディアから別途インストールすればよい(Leopard 以降は標準でインストールされているので、インストールは不要)。また、X11.app には「隠しオプション」があったりするので
$ 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 が有効になる。

余談だが、ディスプレイ番号0ではないX11サーバを起動することも可能。
$ /Applications/Utilities/X11.app/Contents/MacOS/X11 :1
もっとも、普段使いというより、マルチディスプレイ対応X11クライアント開発の動作確認向けとして有用。

X.org

Leopard 以降は X.org の 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 サーバには、ウィンドウのボーダーを描画しないというバグがあり、下の表の左側の図のように、様々な描画の不具合が特にレガシーなプログラムで散見される。本来であれば右側の図のようになっていないとおかしい。

Snow Leopard X サーバ
Snow Leopard 修正済み X サーバ
xev


xmore


editres

対処方法として、
  1. http://xquartz.macosforge.org/ の XQuartz をインストールする。
  2. http://www.macports.org/ の xorg をインストールする。
  3. Leopard の /Applications/Utilities/X11.app/Contents/MacOS/X11.bin を Snow Leopard に持ち込む。
  4. http://www.opensource.apple.com/ から Snow Leopard X サーバのソースコード X11server-85.2.tar.gz を取得し、修正、ビルドし直したものを使う。
が考えられるが、1〜2 はこの程度のことでは大袈裟であるし、3 はダウングレードが残念である。よって、4 が最も好ましい。問題の生じない Leopard X サーバのソースコードと比べれば判るが、このパッチで修正できる。これを適用済みのバイナリは以下の通り。
これを /Applications/Utilities/X11.app/Contents/MacOS/X11.bin にすればシステムに最小の変更で問題が回避できる。ちなみに、以上の方法はこの修正とは異なっている。

ちなみに、パッチにみられる不可解な元のコードがどういった経緯で加えられたのか調べてみると、この時に当該コードが混入しており、しかも、コメントと関係がないので、さらに不可解ではある。

(後日談) その後、いつのまにかこのバグは直っていたようだ。

X11 のキーマップ

Mac OS X の X11 の環境設定で「X11 の代替キーを有効にする」と、X の世界のいくつものキーオペレーションが効かなくなってしまう。一方で、有効にしないと、既定ではモディフィアキー等が最大限に使えないので、自前で機種毎に~/.Xmodmap の作成と編集が必要になる。

まず、~/.Xmodmap が存在しない状態で X11 を起動し、X 端末上で以下のように ~/.Xmodmap.orig を作成する。
$ xmodmap -pke > ~/.Xmodmap.orig
~/.xinitrc もしくは /usr/X11*/lib/X11/xinit/xinitrc から呼ばれる事が期待される ~/.Xmodmap のひな形を、その複製として用意する。
$ cp -p ~/.Xmodmap.orig ~/.Xmodmap
X のコマンド 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
なんと、同じキーシンボルが割り当てられてしまっている(これはせっかくキー資源の無駄使いだ)。

これらは同一の Mode_switch として使いたくないはずなので、Alt_L キーおよび Alt_R として登録しよう。それには、~/.Xmodmap のキーコード (keycode 66) のキーシンボルを Alt_L およびキーコード (keycode 69) のキーシンボルを Alt_R にしてしまえばよい。

つまり、~/.Xmodemap にて該当箇所のキーシンボルを書き換えればよい。その編集結果を `diff -u .Xmodmap.orig .Xmodmap` で見てみよう。
--- .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` コマンドによって条件分岐させているが、ホームを複数のマシンで共有しない場合は条件分岐させなくても構わない。

この設定で X11 を起動すると、
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 で現れないキーコードだった。

VNC

VNCサーバは、システム標準搭載の[アップルメニュー][システム環境設定][共有][サービス][Apple Remote Desktop][アクセス権]の[VNC使用者が画面を操作することを許可]で利用することができる。VNCサーバが必要なのであれば、推測し難いパスワードを設定すること、[Apple Remote Desktop][メニューバーに状況を表示]すること、信頼できるネットワークに接続されているかに注意して利用すること。また、Vine Server (a.k.a. OSXvnc)を併用すれば、ポート5900以外のポート番号で接続したり、接続をlocalhostのみに制限してsshのポートフォワーディング等で利用したり、ファストユーザスイッチの機能を利用して、システム全体ではなくユーザ権限で起動したVNCサーバに接続できるようになる。但し、ファストユーザスイッチ上のVNCでは、すべてのアプリケーションが正常に動くわけではないことに注意(おそらく、Tiger では待機状態にあるファストユーザスイッチのデスクトップからはビデオカードの機能が利用できないからだと推測される)。

VNCクライアントは、Chicken of the VNC(cotvnc)などがある。

Chicken of the VNCと日本語キーボード

cotvnc 20b4によるクライアントが日本語配列キーボード、Apple VNCサーバが英語配列キーボードだと、以下のキーが打てずに別のキーになってしまう。
ちなみに、Vine Server (a.k.a. OSXvnc)の[Preferences][Device][Keyboard Layout]が「Unicode Hex Input」だとそのような問題は起こらない。

cotvnc 20b4のソースコードは公開されているので調べてみると、正しく「シングルクオート」「等号」「バッククオート」が送られているにもかかわらず、クライアントで押されている「シフト」モディファイアも送られてしまっているので、これらが「ダブルクオート」「加算記号」「チルダ」になってしまう問題が起こっているようだ。クイックハックではあるが問題を修正するパッチを作成したので、取り急ぎバイナリとともにここに紹介しておく。
cotvnc の SourceForge にはキーコードに関するパッチがいくつかあるが、他の問題を起こさずに以上の問題を解消するものは見当たらなかった。ちなみに、日本語配列キーボードで円記号「¥」をバックスラッシュ「\」にしてしまうパッチも存在したが、そもそも日本語配列キーボードでは「Alt+\」で「¥」が打てるようになっているのだからそのパッチは不要だろう。
また、SourceForge にて提案されている日本語ローカライズはショートカットキーの設定が失われているなどの不具合があるので、上のバイナリでは改めて作り直したものを同梱してある。

RDC

Microsoft の RDC(Remote Desktop Connection) Client for Mac を使うと、Windows XP Professional などにログオンできる。RDC はポート3389を使うので、それをsshのポートフォワーディングすればファイアーウォール越しに接続することも可能。RDC 2.0なら Intel Mac、複数セッション対応。パフォーマンスの向上も見受けられる。

Apache

システム環境設定の「共有」「(パーソナル) Web 共有」を有効にすると、Tiger の場合は apache が Leopard 以降の場合、apache2 が起動する。

各個人の設定は、Tiger の場合「/etc/httpd/users/*.conf」、Leopard 以降の場合「/etc/apache2/users/*.conf」を特権で編集すればよい。

システム管理

ストレージ、内蔵と外付け、HDDのフォーマット、ディスクユーティリティ

ストレージのフォーマット

購入した HDD 等のストレージを Mac OS X で使用するにあたって、ディスクユーティリティでフォーマットをする際に、気をつけなければならないことがある。それは、ストレージが MBR パーティションタイプになっていると、以下のような問題が生じる事がある。
  1. HFS+ 形式のフォーマットに成功したり、成功しなかったりする。運良く成功した場合は、いずれ次のトラブルに見舞われる。
  2. 10GB 以上のファイルの作成に不具合が生じる。起動ディスクとして使用した場合には、10GB 以上のファイルの読み込みや消去が不可能となる。
  3. 起動ディスクとして使用した場合には、ファイルシステムが徐々におかしくなって逝く。
よって、HDD 等を購入したときには必ず「Time Machine での外部ディスクへのバックアップが中断される」に書いてあるように、ディスクユーティリティーを使って、MBR を GUID もしくは Apple パーティションマップに変更したあとで、HFS+ などでフォーマットしなければならない。

ストレージとインターフェースの書き込み速度

システムをバックアップする際に、気になるのはストレージへの書き込み速度であろう。適切なインターフェースでHDDに接続していれば半日で済むところが、遅い選択肢のせいで二日以上掛かるとなると、気軽にバックアップも取れなくなってしまう。以下に実際に測定したファイル書き込み速度を参考値として記す。
ストレージ及びインターフェース
書き込み速度
SATA 7200rpm、内蔵
340Mbps
SATA 7200rpm、外付け FireWire800
431Mbps
SATA 7200rpm、外付け FireWire400
250Mbps
SATA 7200rpm、外付け USB2.0
91Mbps
フラッシュメモリ、外付け USB2.0
83Mbps
SATA で使用している外付けインターフェースは「裸族のお立ち台スーパーコンボ CROS-SC」を PowerMac G5 で使用。加えて、新しい Intel Mac における同様の参考値を以下に記す。
ストレージ及びインターフェース
書き込み速度
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
SATA で使用している外付けインターフェースは「裸族のお立ち台 FireWire 800/400+USB3.0 CROSFU3」を MacBook Pro 15-inch Mid 2010 で使用。 さらに、新しい Mac における同様の参考値を以下に記す。
ストレージ及びインターフェース
書き込み速度
SSD、内蔵
16795Mbps
SATA 7200rpm、外付け USB3.0
682Mbps
SATA 7200rpm、外付け FireWire800
589Mbps
SATA 7200rpm、外付け FireWire400
218Mbps
USB 3.0 で使用している外付けインターフェースは「イッコイチBOX2.5SATA USB3.0&FireWire800 CSG25FB2U3」を MacBook Pro 15-inch 2016 で使用。
FireWire400 で使用している外付けインターフェースは「裸族のお立ち台スーパーコンボ SATA6G CROSFEU3S6G」を MacBook Pro 15-inch 2016 で使用。

2TB超ストレージとインターフェース

3TBのHDDが15,000円と安くなってきたが、古い Mac OS X ではインターフェースによってフォーマットが出来ない、フォーマット済みだと使えるように見えても実はファイルが破損していくなどの深刻な問題があるので注意が必要だ。
インターフェース
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
× ×
内蔵
×
ディスクユーティリティでしっかりと3TBを認識してない場合は使えないものと見た方がよいと思われる。

システムのバックアップと復元

システムのフルバックアップはそれとは別のシステム(DVD等)で起動したディスクユーティリティから可能である。そして、システムの復元先もやはり MBR パーティションタイプになっていると、ディスクユーティリティで復元ができないとなるので、HDDを新たに増量して入れ替えるなどの際はフォーマット時に MBR のリセットを忘れないようにすること。

非常時のオペレーション

/etc と NetInfo

OS X の環境設定は /etc だけでなく、随所 NetInfo データベースで効率よく実現されている。Unix 使いであれば、まずは /etc 配下の様子を見て、適宜 nidump(8), niutil(1), nicl(1) を駆使することになるだろう。マニュアルページを読めば特に難しいことはない。

dscl と OpenLDAP

そして、Leopard 以降は NetInfo は廃止され、OpenDirectory により管理されるようになった。Unix 使いであれば dscl(1) を駆使することになる。マニュアルページを読めば特に難しいことはない。以下のシェルスクリプトは Ubuntu GNU/Linux の useradd, userdel, groupadd, groupdel ライクな使い方が出来る dscl を利用したシェルスクリプトである。localnet.* はサーバ向けで /LDAPv3/127.0.0.1 などに利用できる。Lion, Mountain Lion でしか試していないので、中身をよく見て、盲目的には使用しないこと。

useradd.sh, userdel.sh, groupadd.sh, groupdel.sh の使用例

以下にこの useradd.sh, userdel.sh, groupadd.sh, groupdel.sh の使用例を示す。

ユーザ logname を、フルネーム Full Name、グループ workgroup,defaultgroup、パスワード passworduid=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、パスワード passworduid=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.shuseradd.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.shuserdel.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 に変えたものである。

ソフトウェア・アップデート

ソフトウェア・アップデートは[アップルメニュー][ソフトウェア・アップデート]にて GUI を介して行うのが一般的であるが、リモートで施行する場合など、コマンドラインでのソフトウェア・アップデートも softwareupdate(8) で可能である。以下のように実施する。
$ 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

OS X Server

インストールの際に注意すべきこと

シネマディスプレイ

デフォルトでは、ディスプレイの電源ボタンが「スリープ」に割り当てられているので注意。

セキュリティ

ファイアーウォール

(Tiger) [システム環境設定][共有][ファイアーウォール]を[開始]しても、デフォルトではプロトコルUDPは通してしまうので、インターネットに直に繋ぐ場合や、信頼できないLANに参入する場合には、UDPもブロックした方が好ましい。そのためには、[詳細][UDPトラフィックをブロック]することをお勧めする。

FlashPlayer、ShockWavePlayer

FlashPlayer や ShockWavePlayer はシステムに標準搭載されているにも関わらず、ソフトウェアアップデートで更新されない(稀に更新される)。ほとんどのブラウザで FlashPlayer を無効化するのが簡単ではない(Firefox 3からは簡単に無効化できる)ことを鑑みると、これらが廃れたまま放置しておくことはお勧めできない。よって、アドビシステム社のダウンロードサイトのアンインストーラーをダウンロードしてアンインストールするか、インストーラーをダウンロードして最新のプレーヤーに保つことをお勧めする。

Written by Taiji Yamada <taiji@aihara.co.jp>