上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--|スポンサー広告||TOP↑

(なんかこの記事はおかしい、あやしい。追記参照)

環境:
Mac OS X 10.4.10 (PPC)
ターミナル 1.5 - ウインドウ設定の文字セットエンコーディング: Unicode (UTF-8)

まずターミナルを起動して、以下を実行します。

$ echo "宮﨑あおい" | iconv -f UTF-8 -t UTF-16 > file.txt
$ echo "维吾尔自治区" | iconv -f UTF-8 -t UTF-16 >> file.txt

こんなテキストファイルが作成されます。
bom.png

テキストエディタのカーソルを移動して一行目と二行目の間を行ったり来たりしてみて下さい。
追記された二行目の行頭でカーソルが一瞬引っかかりますよね。
iconv で UTF-16 (LE でも BE でもないやつ) に変換されたテキストの先頭には必ず BOM がつくため、追記するたびに文中に見えない文字が増えていくのです。
このままでもとりたてて困ることはないものの、なんとなく気持ちが良くない。
そこで BOM を取り除く定番の方法があるのではと探したのですが、見つけられなかったため次のようにしてみました。

$ echo "宮﨑あおい" | iconv -f UTF-8 -t UTF-16 > file.txt
$ echo "维吾尔自治区" | iconv -f UTF-8 -t UTF-16 | tail -c +3 >> file.txt


先頭 2 バイトが BOM だそうなので、iconv の実行結果から tail -c +3 で 3 バイト目以降を取り出しています。
本当にこのやり方で正しいのかどうかはわかりませんが、今のところトラブルは起きていません。

追記 (070708)
そもそも「UTF-16 に変換してから BOM を削除したい」という考え方をしたのは

cat "UTF-8 のテキストファイル" | iconv -f UTF-8 -t UTF-16BE >> "iconv 経由で UTF-16 にしたテキストファイル"

を実行したときに文字化けして当惑したという経験がきっかけなのですが、ついさっき同じことを試したところ……あれ、文字化けしない?
いやそうなんですけどね。
Mac OS X 10.4.10 の時点で標準インストールされている iconv (GNU libiconv 1.9) がサポートする UTF-16 のエンコーディングは

UTF-16 (BOM 付き - ビッグエンディアン)
UTF-16BE (BOM 無し - ビッグエンディアン)
UTF-16LE (BOM 無し - リトルエンディアン)

の三種類で、UTF-16 (つまり BOM 付きビッグエンディアン) に変換してから書き出したファイルに BOM 無しで追記したかったら UTF-16BE に変換すれば事足りるはずなのです。
ではあのとき文字化けしたのは単なるポカミスだったのかもと思えてきました。
こう書くだけでいいのかもなと。

$ echo "宮﨑あおい" | iconv -f UTF-8 -t UTF-16 > file.txt
$ echo "维吾尔自治区" | iconv -f UTF-8 -t UTF-16BE >> file.txt


ようわからんので何かわかったらまた追記します。


スポンサーサイト
06/29|Macコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.10 (PPC)
bc 1.06
iTunes 7.2

タイトルがちょっとわかりづらかったかも。
{1, 2, 3 ... 999, 1000} のようなリスト内の数値を repeat 文を使わずに合計する方法です。
AppleScript's text item delimiters を " + " に設定し、リストを足し算の計算式に変換してから bc に渡します。

set numList to {1, 2, 3}
set asdlm to AppleScript's text item delimiters
set AppleScript's text item delimiters to " + "
try
set calcString to (numList as string)
set AppleScript's text item delimiters to asdlm
on error
set AppleScript's text item delimiters to asdlm
return
end try
do shell script "echo " & quoted form of calcString & " | bc"

iTunes で選択されたトラックのサイズ合計も素早く求めることができます。

tell application "iTunes"
set sizeList to (size of selection)
end tell
set asdlm to AppleScript's text item delimiters
set AppleScript's text item delimiters to " + "
try
set calcSize to sizeList as string
set AppleScript's text item delimiters to asdlm
on error
set AppleScript's text item delimiters to asdlm
end try
set calcString to "scale=3; ( " & calcSize & " ) / 1024 / 1024"
do shell script "echo " & quoted form of calcString & " | bc"

(本当はこのあとに数値の大きさを見ながら MB やら GB やらに換算するスクリプトが続かなければならないのですが、iTunes がどういった基準で切り上げ/切り捨てを行っているのかいまひとつ把握できていないため、ここには書かないでおきます。
試行錯誤を繰り返せば iTunes のウインドウに表示される数値と全く同じ結果を求めることは可能だと思います。)

参考: bc

追記
do shell script は文字列をシェルスクリプトとして実行しますが
文字列を AppleScript として実行する方法があるのをすっかり忘れていました。
はい、run script です。

set x to "(100 + 20 + 30) / 15"
run script x

do shell script を実行 > シェルを起動 > bc を起動 > 計算
よりも
run script を実行 > 文字列を AppleScript としてコンパイル > 計算
のほうが若干速いのかもしれませんね。勘ですが。
bc と AppleScript では割り算をしたときの結果表示のされ方が異なるので、スクリプトの目的やその日の気分、好き嫌いなどによって使い分けると幸せになれるかもしれません。

bc
除算を行うとデフォルトでは計算結果を小数点以下切り捨てで表示する
scale=2 などと記述することで小数点以下を何桁まで表示するか指示できる
不正な計算式のときエラーを返さず空文字を返す (※do shell script の場合)
AppleScript
除算の結果をできる限り細かく表示しようとする
除算を行って割り切れても 10.0 のように小数点以下第一位まで表示する
不正な計算式のときエラーを返す

参考: OSAX/標準機能追加/run script


06/25|Macコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.9 (PPC)
OnMyCommand 1.8.0

OnMyCommand 用です。
以下のリンク先テキストファイルをディスクに保存して、OMCEdit で読み込むと実行できるようになります。
(メニューから読み込もうとしてエラーになる場合は OMCEdit のアイコンにドラッグアンドドロップでいけるようです。)
google_dialog.plist.txt

例えば、

As If a Million AppleScripters Cried Out In Horror (For Four Years) And Were Suddenly Silenced

waffle

という見出しを読んで、「なんだか意味不明。有名な言葉のもじりかな?」と思ったとします。
そうしたらテキストを選択して
sw1.png
コンテクストメニューから「Google で検索 (dialog)」を実行。
こんなダイアログが出るので
sw2.png

適当に編集して検索にヒットしそうな語句を抜き出し
sw3.png

OK ボタンを押してググる。
"As If a Million" "Cried Out In Horror" "And Were Suddenly Silenced" - Google 検索

どうやらスター・ウォーズらしい。

"I felt something, a disturbance in the network, as if a million mac zealots cried out in horror and were suddenly silenced," wrote poster "m50d," an allusion to a quote from the Star Wars movie series.

CIO Asia - Apple faithful learning to like oranges

もうちょっとググってみましょうか。
sw4.png

あったあった。

Ben: I felt a great disturbance in the Force, as if millions of voices suddenly cried out in terror, and were suddenly silenced. I fear something terrible has happened. You'd better get on with your exercises.
フォースに大きな騒乱を感じた。まるで何百万もの声が突然恐怖の悲鳴に変わり、突然静かになったような。何か恐ろしいことが起こったのだ。練習を続けなさい。

スター・ウォーズの鉄人!/スクリプト

あー、オビワンのセリフかー!

といった使い方をします。


06/18|AppleScriptコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.9 (PPC)
GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)

日本語などを含むパスを osascript -e で AppleScript に渡そうとしてエラーになる場合、何らかの方法で ASCII 文字の羅列に変換したものを AppleScript の中で戻すような書き方をすればいいのですが、パスが複数あるときはその度に変換を行うよりも、改行区切りで戻せるような形で一気に渡してテキストを行単位で処理する repeat 文を実行する方が速いです。
以下のスクリプトの場合、パスとパスの間に %0a が入った形で渡されています。

"~/Desktop/怡红快绿" というフォルダ以下にある JPEG ファイルを再帰的に検索して見つかったものに赤ラベルをつける。
ファイルは UTF-8 で保存。

#!/bin/sh
found_jpgs=$(find ~/Desktop/怡红快绿 -iname "*.jpg" -or -iname "*.jpeg")
escaped_paths=$(echo -n "${found_jpgs}" | ruby -n -e 'require '\''uri'\''; print URI.escape($_)')

osascript -e 'set percents to "'"${escaped_paths}"'"
set pathNames to (do shell script "echo " & quoted form of percents & " | ruby -n -e '\''require \"uri\"; print URI.unescape($_)'\''")
repeat with i from 1 to (count paragraph of pathNames)
set curPath_alias to (POSIX file (paragraph i of pathNames)) as alias
tell application "Finder" to set label index of curPath_alias to 2
end repeat'

osax を使う方法もあるようですがよく知りません。

非英語環境で、とくに Finder 項目に対して AppleScript でなければできないことをしたいときは、osascript よりも最初から AppleScript で書いて、必要に応じて do shell script で sh を呼ぶ方が楽です。複雑なシェルスクリプトをそのまま記述して実行するのは無理だと思いますが。
わかりやすい解説もあるし。
do shell script in AppleScript (日本語)
Technical Note TN2065: do shell script in AppleScript (英語。こっちの方が新しい。読んでないけど)
AppleScript PARK / Introduction (入門。みんなお世話になってる)

えー、あと毎度のことですが一部のブラウザではバックスラッシュが円記号に化けてます。
でもエディタにコピペするとバックスラッシュになるという不思議。
charset に UTF-8 が使えるとこに移転しようかな。。。


06/11|AppleScriptコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.9 (PPC)
GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)

コマンド du 指定ディレクトリ以下のディスク使用量を再帰的に表示する
UNIXの部屋 検索:du (*BSD/Linux/Solaris)

アプリケーションフォルダ直下をサイズが大きい順にソート
$ du -d 1 -k /Applications | sort -nr

一階層分だけ再帰的に表示
$ du -d 1

ブロック単位ではなく 1KB 単位で表示
$ du -k

指定した項目だけを表示 (再帰しない。 -d 0 と同じ)
$ du -s

で、

mask にマッチする項目を無視
$ du -I mask

「.app」で終わる項目を無視
$ du -d 1 -k -I "*.app" /Applications

複数指定 (-I を mask の数だけ繰り返し書く)
$ du -d 1 -k -I "*.app" -I "*Apple*" /Applications

「タマ」を含む項目を無視
$ du -d 1 -k -I "*タマ*" /Applications

濁点・半濁点を含む日本語にマッチ (ターミナルの設定によるかも)
$ str=$(echo -n "パイン" | iconv -f UTF-8 -t UTF-8-MAC); du -d 1 -k -I "*${str}*" /Applications
またはこれでもいけるぽい。
echo -n "*パイン*" | iconv -f UTF-8 -t UTF-8-MAC | xargs -0 -J str du -d 1 -k -I str /Applications
パターン ("*パイン*" のとこ) に空白が含まれるとき、その空白をエスケープしておくか、xargs に -0 をつけておかないと空白の前の文字列だけが渡されてしまう。上の例の場合はつけてもつけなくても良い。

パス名ではなく項目名にマッチするらしい。以下のように書いても Utilities フォルダは無視されない
$ du -d 1 -k -I "/Applications/Utilities" -I "*.app" /Applications
次のように書くと無視される
$ du -d 1 -k -I "Utilities" -I "*.app" /Applications
以下のようにすると何も表示されなくなる。
$ du -d 1 -k -I "Applications" -I "*.app" /Applications
mask にマッチした項目は無視だからその項目以下も無視して当然か。
もし /Applications/Applications というフォルダがあって下の Applications だけを無視したいときはどうするんだろう?

感想。
man du に mask の使用例をひとつふたつ書いておいてくれれば済む話だと思ったorz

追記
/Applications/Applications を無視したいときは
find /Applications -maxdepth 1 ! -iname "Applications" -print0 | xargs -0 du -sk
または
find /Applications -maxdepth 1 ! -iname "Applications" -exec du -sk {} \;
でいいかも。


06/08|Macコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.9 (PPC)
TextWrangler 2.2.1

defaults write com.barebones.textwrangler Filing:WriteExtendedAttributes Never
TextWrangler : Archived Release Notes : TextWrangler 2.2 Release Notes

ダブルクリックで実行するタイプのシェルスクリプト(.command)を書くときなどに。
一応これでタイプとクリエータの付加を抑止できますが、リンク先の HFS Type/Creator という言葉は初めて聞いたので何か思い違いをしてるかもしれんです。目的外の設定をしてしまっている可能性も。英語だし。
ちなみに Never の他に Always と Smart という値があります。
Smart がデフォルトだとか。


06/03|Macコメント(0)トラックバック(0)TOP↑

環境:
Mac OS X 10.4.9 (PPC)
Safari 2.0.4

Safari のアクティブなウインドウで
http://ブログID.blog数字.fc2.com/blog-entry-数字.html
という URL を開いているときに、そのエントリーに対応した編集ページを開く AppleScript。
管理画面からでは過去のエントリーを見つけにくいときなどに使います。
FC2 ブログにログインしている状態であれば URL を並べ替えて location.href で一発。
しかし最近なぜかログイン状態を長く維持できなくなってしまったため、自動ログインも含めて長めのスクリプトになりました。
※実行する前にスクリプト中の "hogemaru@hage.com" を FC2 ID の自分のメールアドレスに、"password" という部分を自分のパスワードに書き換えておかないとログインに失敗します。

--スクリプトここから
--http://ブログID.blog数字.fc2.com/blog-entry-数字.html
--という URL を開いてから実行。
tell application "Safari"
activate
try
set theURL to (URL of document 1)
theURL
on error
return
end try
set bs to (ASCII character 128)
set aBool to (do shell script "echo -n " & quoted form of theURL & " | ruby -n -e 'print %r|^http://.+" & bs & ".blog" & bs & "d+" & bs & ".fc2" & bs & ".com/blog-entry-" & bs & "d+" & bs & ".html$| =~ $_'")
if aBool is "0" then
set rbScript to "str1 = $_.split('/'); str2 = str1[2].to_s.split('.'); str3 = str1[3].gsub(/[^" & bs & "d]/, ''); print 'http://' + str2[1]+ '.' + str2[2] + '.' + str2[3] + '/' + str2[0] + '/' + 'admin.php?mode=editentry&no=' + str3"
set adminURL to (do shell script "echo -n " & quoted form of theURL & " | ruby -n -e " & quoted form of rbScript)
do JavaScript "location.href='" & adminURL & "'" in document 1
else
return
end if
if not my readyStateComplete(90) then return
if "admin.php?mode=admin" is in (source of document 1) then return
--(*
do JavaScript "location.href='http://id.fc2.com/'" in document 1
if not my readyStateComplete(90) then return
if (name of document 1) does not contain "管理パネル" then
do JavaScript "document.form_login.email.value='" & "hogemaru@hage.com" & "'" in document 1
--hogemaru@hage.com を FC2 ID のメールアドレスに書き換える
do JavaScript "document.form_login.pass.value='" & "password" & "'" in document 1
--password を FC2 ID のパスワードに書き換える
do JavaScript "document.form_login.submit()" in document 1
--*)
if not my readyStateComplete(90) then return
end if
set blogLink to ""
repeat 10 times
set linkCnt to (do JavaScript "document.links.length" in document 1)
repeat with i from 1 to linkCnt
set curLink to (do JavaScript ("document.links[" & (i - 1) as string) & "].href" in document 1)
if curLink starts with "http://blog" and curLink contains "/admin.php?mode=admin" then
set blogLink to curLink
exit repeat
end if
end repeat
if blogLink is not "" then exit repeat
end repeat
if blogLink is "" then return
do JavaScript "location.href='" & blogLink & "'" in document 1
if not my readyStateComplete(90) then return
do JavaScript "location.href='" & adminURL & "'" in document 1
end tell

on readyStateComplete(timeoutValue)
with timeout of 120 seconds
set bs to (ASCII character 128)
tell application "Safari"
repeat 4 times
set theState to (do JavaScript "document.readyState" in document 1)
if theState is "uninitialized" or theState is "loading" or theState is "interactive" then
exit repeat
else
delay 1
end if
end repeat
repeat timeoutValue times
if (do JavaScript "document.readyState" in document 1) is "complete" then
delay 1
return true
else
delay 1
end if
end repeat
do JavaScript "alert('ページの読み込み完了を確認できませんでした。" & bs & "nスクリプトを中断します。')" in document 1
return false
end tell
end timeout
end readyStateComplete
--スクリプトここまで

どうも document.readyState の使い勝手が良くないなあ。
たまに location.href の後にジャンプがなかなか始まらないことがあると移動前のページの complete が返ってしまうし、始まったら始まったで完全に読み込まないうちに complete を返してくる。
大事をとって delay や repeat を使わざるをえないので次の実行に移るまでに無駄な待ち時間が発生してしまいます。
結局、手動でログインしてから実行するのが確実。


06/02|AppleScriptコメント(0)トラックバック(1)TOP↑
プロフィール

AquaBowler

  • Author:AquaBowler
  • 現在の Mac 環境:
    iBook Late2001
    Mac OS X 10.4.11
フリーエリア
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
del.icio.us
feed meter

RSS feed meter for http://kotoerisan.blog16.fc2.com/

FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。