« 2013年1月 | トップページ | 2013年4月 »

2013年3月31日 (日)

OS Xのsedで改行を置換する

sed コマンドでの置換において、改行コードを置換の対象にする際は

$ sed -e 's/\n/\r/g'

のような形ではうまくいかず、

$ sed -e ':loop; N; $!b loop; s/\n//g'

のように書かなければならないことがいくつかのサイトに書かれているが、Mac の OS X 上で同じことを行ってもうまくいかない。

もっとも、同じ内容の sed コマンドを別ファイルに

:loop
N
$!b loop
s/\n//g

と書いて、sed_command.txt という名前で保存し、

$ sed -f sed_command.txt

という感じで実行すれば、OS X 上であってもうまくいく。

この点に関して、sed FAQ (英語) の 6.7.1 項を読むと、「GNU sed 以外の sed では、コマンド部分を分けて書かなければならないケースがある」とのこと。特に、「ラベル」(上記の例で言うと「:loop」)が絡む場合、そうなるらしい。

OS X の sed が GNU sed でないことは把握していたので、その項の記述を参考に上記の例を

$ sed -e :loop -e 'N; $!b loop' -e 's/\n//g'

と書き改めてみたところ、見事置換に成功した。


これまでは Apple Script で正規表現置換を行う際、Perl を用いてきたが、この方法を使えば Perl ではなく sed で済ませることも可能になる。例えば、改行コードを LF から CR に変更するには

 set obj_text to do shell script "/bin/echo -n " & quoted form of obj_text & " | sed -e :loop -e 'N;$!b loop' -e 's/\\n/\r/g'" without altering line endings

などと書くことができよう。

なお、この例でもわかる通り、Apple Script 内で sed 置換を行う場合、置換対象になる改行コードは、なぜかエスケープして「\\n」と書く必要があるようだ。


2013年3月29日 (金)

AppleScriptと一行Perlについて

先日の記事で、Apple Script 内において一行 Perl を使って正規表現置換を行うことについて述べたが、その際、

 set new_text to do shell script "/bin/echo -n " & quoted form of old_text & " | perl -e '$_=join \"\",<>; s/abc//g; print;'" without altering line endings

といった例を挙げた。echo からテキストの内容(old_text)を perl コマンドに渡し、perl でそれを一つの文字列に結合してから置換処理を行って出力(print)し、変数 new_text に格納するというものである。

Perl が標準入力から受け取ったテキストは、一行ごとに区切られて配列に入った状態になっている。join で一つに結合する必要があるのは、そのためである。

ところが、実は do shell script は「シェルコマンドによって出力された内容を全部まとめて変数に渡す」という仕様になっている。だから、

続きを読む "AppleScriptと一行Perlについて" »

2013年3月27日 (水)

AppleScriptでPerl正規表現置換

これまで筆者が Apple Script で正規表現による文字列の置換を行いたい時は、わざわざ置換用の Perl スクリプトを書いて ハードディスク内に保存し Apple Script から do shell script で呼び出すか、もしくは Apple Script を「スクリプトバンドル形式(拡張子 .scptd)にして Perl スクリプトをバンドルするか、どちらかの方法をとっていた。

だが、可能ならそのような方法ではなく、Apple Script 内だけで Perl による正規表現置換を行いたいと思い立ち、方法を模索した。

続きを読む "AppleScriptでPerl正規表現置換" »

AppleScriptでテキストを簡単に読み込む[更新]

Apple Script でテキストファイルを読み込む場合、open だとか read だとかを使う普通のやり方だと読み込みに失敗する確率がかなり高い(苦笑)。

そこで、できるだけ確実に読み込むために、do shell script 命令を使ってシェルコマンドで以下のようにして読み込んでいた。

続きを読む "AppleScriptでテキストを簡単に読み込む[更新]" »

2013年3月15日 (金)

MacBook Pro 13-inch Mid 2010上でWindows 8

残念なことに、MacBook Pro (13-inch, Mid 2010) は公式的には Windows 8 に非対応となっている(ちなみに、2011年以降の MacBook Pro、および 2010年の 15 inch と 17 inch は正式対応している)。

だが、MacBook Pro (13-inch, Mid 2010) の OS X に付属している「Boot Camp アシスタント」で Windows 用のパーティションを作成して Windows 8 を手動でインストールすることはできる。

ドライバー類に関しても、筆者が試した限りでは、Boot Camp アシスタントでダウンロードした Boot Camp ドライバー(バージョン 4.0.4033)をインストールすればほぼ問題なく動作する。

但し、画面が暗くなってしまう、Wifi(無線LAN)の通信速度が遅いという問題がある。それらに関しては、アップル社の公式サイトから Boot Camp バージョン 5 をダウンロードし、その中から手動で NVidia グラフィックドライバーと Broadcom Wifi ドライバーをインストールすれば解決する。

それ以外の点では、F1、F2 キーで画面の明るさを調整することができない、光学ドライブのイジェクトボタンを押しても画面中央に「イジェクトマーク」が表示されない、という問題もある。これらは解決不可。但し、画面の明るさ調整は「NVIDIA コントロールパネル」で行うことはできる。


(追記2013/05/30)
その上に、デバイスマネージャー上で「SM バスコントローラー」と「コプロセッサ」の二項目に「!マーク」(異常を知らせるマーク)が表示されるという問題もあるが、NVidia Chipset ドライバーをインストールすることで解消できる。詳細は当サイトの記事「MacBook Pro 13-inch Mid 2010+Windows 8のSMバスとコプロセッサー」を参照。

(追記2013/06/22)
画面が暗くなったのは、ドライバーの問題などではなく、単に筆者が「環境光センサー」に光が届くのを遮ってしまったからだった可能性が高い(苦笑)。すでに MacBook Pro (13-inch, Mid 2010) を売却してしまったため、今となっては検証のしようがないが。

2013年3月 7日 (木)

OS Xの「サービス」を無効にできなくなった

Mac OS X には「サービス」という、アプリケーションをまたいでいろいろなことが行える機能が備わっている。

サービスを呼び出すにはメニューバーのアプリケーション名の項目(Safari なら「Safari」という名前の項目)から「サービス」をクリック、ないしコンテキストメニュー(右クリック、もしくは contorl + クリックで表示するメニュー)から呼び出すこともできる。もちろん、不要なサービスを取り除くこともでき、「システム環境設定」の「キーボード」の「キーボードショートカット」タブの「サービス」という項目でチェックボックスをオフにすれば表示されなくなる。例えば、多くの日本人にとって、テキストを右クリックした時に表示される「漢字を簡体字から繁体字に変換する」というサービスは不要なので、いま述べたやり方で非表示にするほうが良いだろう。


ところが、先ほど、筆者の Mac (OS X 10.8.2) 上で、非表示にしたはずのサービスがなぜか表示されていることに気づいた。そこで、いま述べたやり方でシステム環境設定で非表示に設定したのだが、それがなぜかうまくいかない。
Keyboard_service
チェックボックスをオフにしても、非表示にならず、システム環境設定を一旦終了させてまた起動すると、オフにしたはずのチェックボックスが元に戻っているのである。

ウェブ情報をあたっても解決方法が見つからず、たいそう困惑したが、最終的にはなんとか自力で解決方法を見つけ出すことができた。

その原因とは、「~/ライブラリ/Preferences/pbs.plist」の所有権がなぜかスーパーユーザ (root) になっていたことにあった。つまり「ls -l ~/Library/Preferences | grep pbs.plist」でファイル情報を表示すると、本来であれば「-rw------- 1 hogehoge staff」などと表示されなければならない(hogehoge はユーザー名)のに、「-rw------- 1 root wheel」になっていたのである。

そこで、「sudo chown hogehoge ~/Library/Preferences/pbs.plist」および「sudo chgrp staff ~/Library/Preferences/pbs.plist」を実行して所有権をユーザーに戻したところ、正常にサービスを非表示にすることができるようになった。

問題は、なぜ所有権が書き変わってしまったのか、である。

身に覚えがあるとすれば、おそらく「カスペルスキー セキュリティー Mac 版」を試験的にインストールし
すぐにアンインストールしたことが原因ではないか。pbs.plist が最後に書き換えられた日付から推測するとその可能性が高い。100パーセントの断定はできないが。

なので、もし筆者と同様に、カスペルスキー セキュリティー Mac 版をインストールし、あるいはアンインストールした方がいらしたら、一度「~/Library/Preferences/pbs.plist」の所有権が書き変わっていないか、確かめてみることをお勧めする。

« 2013年1月 | トップページ | 2013年4月 »