コマンドから引き出すGUIの機能

OSXが素晴らしいGUI環境を提供してくれるのだから、わざわざコマンド操作を覚えるまでもないと考えていた。ところが、OSXGUI環境を素早く・便利に使いこなすためには、キー操作を組み合わせたショートカットが必須*1である。そして、ショートカットとは何かを考えれば、キー入力以外の何者でもなく、突き詰めればコマンド入力と大差ないことに気付く。

  • Finderからcommand-Nで新規ウィンドウをを開くのも、ターミナルでlsと入力するのも、キー入力のタッチ数は同じである。
  • Quicksilverなんて、高度な入力補完機能付きのターミナルのようなものかもしれない。

つまり、GUIはコマンド入力と組み合わせることで、最大の効率化を図れるのである。

ところで、OSXGUI操作にはそれに対応するコマンドが用意されていることが多い。(どちかというと、コマンドが先でそれにGUIを着せた結果なのかもしれないが)GUIからは辿り着けない機能にアクセスできたり、長ったらしいAppleScriptワンライナー(1行コマンド)で表現できたりと、知っているとメリットも多々ある。特に、AppleScriptと組み合わせてドロップレットにしたり、ショートカットを割り当てると、さらに手軽に使える可能性もある。状況に応じて、良きに計らうMacBookになるかもしれない。そんなコマンドを探し求めてみた。

作業環境

スクリーンセーバー

# スクリーンセーバーを起動する
$ /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine

# スクリーンセーバーデスクトップピクチャのレイヤーで起動する
$ /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background

# スクリーンセーバーデスクトップピクチャのレイヤーで起動する(スクリーンセーバー名を拡張子なしで指定)
$ /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background -module "RSS Visualizer"
# あるいは...
$ /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background -module RSS\ Visualizer
  • OSXには半角スペースを含むファイル名が多い。コマンド入力する時は、エスケープするか、クォートする必要がある。
  • GUIなシステム環境設定では出来ない、デスクトップピクチャのレイヤーに表示されるのが面白い!
  • 記憶は曖昧だが、確かOSX 10.3の頃は、デスクトップのトップレベルに半透明レイヤーのように常時表示しながら、操作することも出来た気がする。
    • 設定方法は忘れてしまった...。(OSX 10.6でも設定できるのだろうか?)
    • でも、当時のPowerBookにとっては非常に重い処理で、とても実用的ではなかったが...。(派手なデモには良さそう。)
    • 今の高性能GPUを有効活用できるマシンなら、常用できるのかもしれない。(Quartz Extreme

Spotlight

# Spotlight検索
$ mdfind "検索語句"

# ファイル名検索
$ mdfind -name "ファイル名の一部"

# 書類フォルダに限定して、Spotlight検索
$ mdfind -onlyin ~/Documents "検索語句"


Spotlightは全てのファイルを検索している訳ではない。不可視ファイルやシステムファイル・root権限のファイルについては、デフォルトで除外されている。そのようなファイルを検索したい衝動に駆られた時は...

# 'bash_'を含むファイル名を検索
$ mdfind_all 'bash_'

# 'swapfile'を含むファイル名を検索(仮想記憶で利用されるスワップファイル、root権限が必要)
$ sudo mdfind_all 'swapfile'
  • ちなみに、mdfind_allでのオプション指定(-name、-onlyinなど)も、ちゃんと反映されるように作り直さなくちゃいけない、と思った。

クイックルック

  • 指定したファイルをQuick Lookで表示する。
$ qlmanage -p '/Library/Desktop Pictures/Nature/Dew Drop.jpg'
$ qlmanage -p /Library/Desktop\ Pictures/Nature/Dew\ Drop.jpg

ネットワーク環境の切替

# ネットワーク環境の一覧、先頭に*が現在の設定
$ scselect
Defined sets include: (* == current set)
   C2C4C07C-144B-419A-92BB-44760EFADBB2	(外)
   3E0B1637-24BC-421D-A6CC-98990FA4DF2D	(AirMac_off)
 * DE77591A-C72E-418C-8FC4-888A5B8429DE	(AirMac_on)
   EAC29E89-E5AF-4E99-9E00-40A62EC653A4	(Automatic)
   55310AE1-45AD-4E0F-807C-1C8A26414DDC	(test)

# ネットワーク環境を「自動」に切り換える
$ scselect Automatic
CurrentSet updated to EAC29E89-E5AF-4E99 -9E00-40A62EC653A4 (Automatic)

# ネットワーク環境を「AirMac_on」に切り換える
$ scselect AirMac_on
CurrentSet updated to DE77591A-C72E-418C-8FC4-888A5B8429DE (AirMac_on)
  • AirMac_onとAirMac_offという環境を作って交互に切り換えれば、AirMacの切・入をコマンドで実行できる。(スリープ復帰後、うまく接続できない時に活用した)
  • WiFiから位置情報を取得する機能、あるいは接続ポイントの名前を取得して、ネットワーク環境を自動で切り換えることもできるかも。(まだ試したことない)
    • 自宅・会社でファイル共有等を利用しているマシンが、うっかりすると、外出先でもファイル共有等が「入」になっているのはセキュリティ上好ましくないので。

コピー&ペースト

# lsの出力結果をクリップボードに転送する(その後、command-Vで好きなところにペーストできるのだ)
$ ls | pbcopy

# クリップボードの内容をファイルsample.txtとして保存する
$ pbpaste > sample.txt

スクリーンキャプチャ

# command-shift-3と同等
$ screencapture "スクリーンショット.png"

# command-shift-4と同等
$ screencapture -i "スクリーンショット.png"

# command-shift-4と同等、但しpdf形式、ファイル名"スクリーンショット.pdf"として保存する
$ screencapture -i -tpdf "スクリーンショット.pdf"

# クリップボードに保存する、10秒後に撮影する
$ screencapture -c -T10

# クリップボードに保存する、シャッター音なし
$ screencapture -cx

# クリップボードに保存する、ウィンドウの影なし
$ screencapture -cwo

画像変換

  • 基本的にプレビュー.appやAutomator.appのGUI環境で十分なのだけど、画像を回転させたくなったら便利かも。
    • 360度、1度単位で、好みの角度を指定できた。
  • また、プレビュー.appやAutomator.appの機能はすべてsipsコマンドから実行できそうなので、コードの中で画像変換したい時はとっても便利。
# sample.pngの情報を表示する
$ sips -g all sample.png

# sample.pngを時計回りに5度回転させる、上書き保存する
$ sips -r 5 sample.png

# sample.pngを反時計回りに5度回転させる、sample_rotate_left_5.pngとして別名で保存する
# (-r -5 だと、-5が1文字オプションと解釈されて、-r に続くパラメータエラーになってしまう)
$ sips -r -05 sample.png --out sample_rotate_left_5.png

# デスクトップのtest_sipsフォルダのjpg画像すべてをpng画像に変換する、拡張子をpngに変更して別名で保存する
$ sips -s format png ~/Desktop/test_sips/*.JPG --out ~/Desktop/test_sips

参考ページ(感謝です!)

しゃべる

  • OSX標準でも英語は流暢にしゃべる
# 英語の達人
$ say "Hello world."

# 日本語はダメ
$ say "にほんごをはなそう。"
(無言、ノーコメント...)

# 英語なまりの日本語なら、どうにかしゃべる
$ say "nihongo wo hanasou."
  • saykanaコマンドをインストールすれば、日本語も話す。
# 棒読み
$ saykana "にほんごをはなそう。"

# アクセント記号を利用すれば、自然な日本語に
$ saykana "に'ほんごをはなそ'う。"

# ただし、仮名のみ。漢字は無理。
$ saykana "日本語を話そう。"
ERR:(105) invalid kana string. 日本語を話そう。
$ saykanji "日本語を話そう。"

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

# ソフトウェアアップデートの確認
$ softwareupdate -l
Software Update Tool
Copyright 2002-2009 Apple

Software Update found the following new or updated software:
   * RemoteDesktopClient-3.3.2
	Remote Desktop Client Update (3.3.2), 5930K [recommended]
   * BonjourUpdate2010-001-1.0
	Bonjour Update 2010-001 (1.0), 936K [recommended]
   * SecUpd2010-001Snow-1.0
	Security Update 2010-001 (1.0), 21884K [recommended] [restart]

# root権限で、推奨されるアップデート[recommended]をすべてインストール
$ sudo softwareupdate -ir
Software Update Tool
Copyright 2002-2009 Apple

Installing 	
   Waiting for other installations to complete…
   Validating packages…2010-01-26 10:13:41.784 softwareupdate[23909:7007] using receipt prefix of 

   Writing files…
   Running package scripts…
   Optimizing system for installed software…
   Moving items into place…
   Running package scripts…
   Registering updated applications…
   Writing package receipts…
Installed Remote Desktop Client Update
Installed Bonjour Update 2010-001
Installed Security Update 2010-001
Done.

You have installed one or more updates that requires that you restart your
computer.  Please restart immediately.

# root権限で、表示されたアップデートをすべてインストール
$ sudo softwareupdate -ia

# root権限で、RemoteDesktopClient-3.3.2、BonjourUpdate2010-001-1.0の2項目のみインストール
$ sudo softwareupdate -i RemoteDesktopClient-3.3.2 BonjourUpdate2010-001-1.0

AppleScript

# AppleScriptのファイルを実行する
$ osascript ~/Library/Scripts/sample.scpt

# AppleScriptのテキストを実行する(改行含めて5行目まで一連のコマンド)
$ osascript -e '
tell application "Finder"
activate
display dialog "Hello!"
end'

参考ページ(感謝です!)

開く

  • Finderでダブルクリックするのと同等に開く。
# カレントディレクトリをfinderウィンドウで開く
$ open .

# sample.movをデフォルトアプリケーション(自分の環境ではQuickTime)で開く
$ open sample.mov

# sample.movをVLC.appで開く
$ open -a VLC sample.mov

# エイリアスコマンドcotを設定(CotEditor.appで開く)
$ alias cot='open -a CotEditor'

# sample.txtをCotEditor.appで開く
$ cot sample.txt

このMacについて

  • OSのバージョンとビルド番号が、テキストで取得できる。
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.6.2
BuildVersion:	10C540

システムプロフィラ

$ system_profiler
Hardware:

    Hardware Overview:

      Model Name: MacBook
      Model Identifier: MacBook4,1
      Processor Name: Intel Core 2 Duo
      Processor Speed: 2.1 GHz
      Number Of Processors: 1
      Total Number Of Cores: 2
      L2 Cache: 3 MB
      Memory: 4 GB
      Bus Speed: 800 MHz
      Boot ROM Version: MB41.00C1.B00
      SMC Version (system): 1.31f0

...(以下省略、すべての項目なのでかなりの行数、1000行以上ある)...

# 欲しい項目だけ抽出する
$ system_profiler | grep '^ *Memory:'
      Memory: 4 GB

メモリ

  • メモリの状態をテキストで取得できる。
$ vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                          43834.
Pages active:                       573635.
Pages inactive:                     203730.
Pages speculative:                   63533.
Pages wired down:                   164092.
"Translation faults":             88429820.
Pages copy-on-write:               3487742.
Pages zero filled:                45290802.
Pages reactivated:                  142216.
Pageins:                            295541.
Pageouts:                            42228.
Object cache: 34 hits of 9789189 lookups (0% hit rate)

パッケージの中身を確認

  • パッケージの中身を表示して、Archive.bomに対してlsbomを実行する。
# /Library/Receipts/RemoteDesktopClient.pkgがインストールするファイルを確認する
$ lsbom /Library/Receipts/RemoteDesktopClient.pkg/Contents/Archive.bom
.	41775	0/80
./System	40755	0/0
./System/Library	40755	0/0
./System/Library/CoreServices	40755	0/0
./System/Library/CoreServices/Menu Extras	40755	0/0
./System/Library/CoreServices/Menu Extras/RemoteDesktop.menu-Leopard	40755	0/0
./System/Library/CoreServices/Menu Extras/RemoteDesktop.menu-Leopard/Contents	40755	0/0
...(以下省略)...

省エネルギー設定

# 現在のパワーマネジメントの設定を表示する
$ pmset -g
Active Profiles:
Battery Power		-1
AC Power		-1*
Currently in use:
 womp		1
 lidwake	1
 halfdim	1
 sms		1
 hibernatefile	/var/vm/sleepimage
 disksleep	10
 sleep		10
 hibernatemode	0
 ttyskeepawake	1
 displaysleep	0 (imposed by 4397)
 acwake		0
 autorestart	0

# モニタを開いてもスリープを解除しない設定
$ sudo pmset -a lidwake 0

# スリープで運用する(メモリの内容を省電力モードで維持する)
$ sudo pmset -a hibernatemode 0

# ハイパネーションで運用する(メモリの内容をHDに保存して、電源を切る)
$ sudo pmset -a hibernatemode 1

# セーフスリープで運用する(メモリの内容を省電力モードで維持しながら、HDにも保存する)
$ sudo pmset -a hibernatemode 3
  • ハイパネーション、あるいはセーフスリープで運用すると、HDに保存されるまで、毎回30秒以上処理が続く。(スリープなら数秒で完了)
  • ハイパネーションは普段目にしない動作なので、その動きを知らないと不安になるかもしれない。以下のように動作した。
    • ハイパネーションすると、メモリの内容をHDに保存して電源はOFFになる。
    • 再び電源をONにすると、以前の作業状態に復帰する。
    • 復帰するまでに30秒以上かかる。その間、以前のデスクトップの状態が白黒で表示され、プログレスバーが進行具合を表示している。

参考ページ(感謝です!)

Growl

  • コマンドからGrowlメッセージを表示するgrowlnotifyコマンドが便利。(Growl.dmgのExtrasフォルダにあり)
# 基本
$ growlnotify "タイトル" -m "メッセージ"

# インアクティブメモリの開放(ものかのさん、感謝!)
$ du -sx / &> /dev/null & sleep 10 && kill $! ; growlnotify -m "終わったよ。"

launchd

  • Lingon.appを使ってlaunchdのplistを修正した場合、設定を反映させるためには再ログインが必要と表示される。それが面倒だった。
  • launchctlコマンドで一旦unloadして、その後再loadすることで、変更した設定が迅速に反映されるようになった。
# ジョブのアンロード
$ launchctl unload ~/Library/LaunchAgents/com.bebekoubou.kernel.log.plist

# ジョブのロード
$ launchctl load ~/Library/LaunchAgents/com.bebekoubou.kernel.log.plist

# ロードされたジョブの一覧
$ launchctl list

以前の日記

参考ページ(感謝です!)

コマンドの詳細

以上は、自分が気になった限定的な使い方だけ取り上げてみたが、そのコマンドにはさらなる可能性が秘められているはず。その詳細は、ヘルプ、マニュアル表示、あるいはWEB検索すると、さらなる発見があるかもしれない!

$ コマンド名 -h
$ コマンド名 --help
$ man コマンド名


音を鳴らす、音楽再生

  • 好みの警告音を鳴らすとか、
  • 普通に、音楽再生も出来る。
  • AppleScript等で、ちょっと音を活用したい時に便利!
$ afplay /System/Library/Sounds/Submarine.aiff
$ afplay /Users/bebe/Music/iTunes/iTunes\ Music/Ben\ E\ King/Romance\ Sundays/11\ Stand\ By\ Me.mp3


画面共有

  • いざ、遠隔操作しようと思った時、システム環境設定 >> 共有 の画面共有が「切」になっていたりすると、非常にがっかりする。
  • しかし、諦めるのはまだ早い。
  • もし、システム環境設定 >> 共有 のリモートログインが「入」であれば、コマンド操作によって画面共有を「入」にできるのだ!
# OSX 10.5(上段:入 / 下段:切)
$ sudo touch /Library/Preferences/com.apple.ScreenSharing.launchd
$ sudo rm /Library/Preferences/com.apple.ScreenSharing.launchd

# OSX 10.6(上段:入 / 下段:切)
$ sudo touch /private/etc/ScreenSharing.launchd
$ sudo rm /private/etc/ScreenSharing.launchd
  • 接続先のマシン情報
# 管理者ユーザ名
$ whoami
zari

# コンピュータ名
$ hostname
MacBook.local
  • リモートログインして、
  • 画面共有を有効にして、
  • 画面共有を無効にして、
  • ログアウトしてみた。
$ ssh zari@macbook.local
Password:
Last login: Wed May 19 03:48:18 2010

MacBook:~ zari$ sudo touch /private/etc/ScreenSharing.launchd
Password:

MacBook:~ zari$ sudo rm /private/etc/ScreenSharing.launchd

MacBook:~ zari$ exit
logout
Connection to macbook.local closed.


詳細は以下の日記で...

*1:一度試してみたが、MacBookのキーボードを封印して、テキスト入力以外のすべての操作をトラックパッドのみで操作しようとすると、相当ストレスが溜まる。気付かないうちに、ショートカットと組み合わせた操作にかなり依存しているのだ。