HyperCard, AppleScript & OSA

OSA

配列操作の比較表: Ruby, AppleScript, HyperCard というのを書いてみました。 内容に間違いや不備があれば、勝手に書き換えといて貰えると有り難いです。

indent

こんな indent は厭だ。

Curly Brace の何れと何れが対か全然判りません。 ScriptEditor 作ってる人って、天才か馬鹿かどっちかなんでしょうか。 凡人にも使い易くして欲しいな。

Sample Scripts

Resource が在ると扱いが面倒なので ADD Actions を分けて、其の他は tarball にしました。: 2003-12-10

System 7.5.5 で Compile すると Obsolete になる部分が多いので Source のみ。 Applet/Droplet の保存の仕方が判らないとも思えませんので。

全て System 7.5.5 か OS 8.1-J のどちらかでしか動作確認してゐません。 OSA Menu から実行すると、 Freeze する物もありますので、気を付けてねん (sortf と Clipboard でやり取りするヤツとか)。 More Compatible にすると大丈夫かも。

xmahjongg

旧 Mac OS を使ってゐた頃は 天津 という Puzzle Game でよく遊んでゐたのですが、Mac OS X 用がないので、麻雀牌の Puzzle Game を探しました。結局、上海と云う名前が使えないので xmahjongg という X Window の Game が在りまして、よく遊びますが Command を Xterm に入力するのではなく、X11.app の Menu に Script を仕込んでゐます。

xmahjongg -t real -l $(osascript -e 'some item of {"arena", "arrow", "boar", "bridge", "ceremonial", "deepwell", "dog", "dragon", "farandole", "hare", "horse", "hourglass", "monkey", "ox", "papillon", "ram", "rat", "rooster", "schoon", "snake", "theater", "tiger", "wedges", "default"}')

駒は real 固定にしたいけど、遊ぶ面は Random にするというのを OSA でやってます。以前は some item of の部分を choose from list にしてゐましたが、面倒臭いので変えました。

Sort Windows by...

QuickTime Player で複数 Windows を開いてゐる時に Title順とか再生時間順とかで見たいと思って、何年も前から Script を書いては失敗してゐたのですが、若しかしたら AppleScript には出来ないんではないかと思って shell script で実行してみたら直ぐ成功しました。

global _documents_
{} returning _documents_
try
    display dialog "Sort windows by:" buttons {"Cancel", "Title", "Duration"} default button 3 giving up after 9
    tell result
        its button returned returning _button_
        its gave up returning _gaveup_
    end tell
end try
tell application "QuickTime Player"
    repeat with i in documents
        tell i
            its duration returning _duration_
            its name returning _name_
            its path returning _path_
            if _button_ is "Duration" or _gaveup_ then
                _duration_
            else if _button_ is "Title" then
                _name_
            end if
            ("" & result & tab & _path_)'s quoted form returning _documents_'s end
        end tell
    end repeat
end tell
return returning text item delimiters
if _button_ is "Duration" then
    "n"
else if _button_ is "Title" then
    ""
end if
do shell script "tr '\r' '\n' <<<" & _documents_ & "|sort -" & result & "ru|gsed 's/^[^\t]*\t//'|while read f;do open -b com.apple.quicktimeplayer " & quote & "$f" & quote & ";done"
"" returning text item delimiters

gsed の部分は Tab 文字を入れれば sed でも OK. というか cut -f 2 でいけると思ってたけど multibyte は使えないよ的な Error が出て動作しなかったんょ。

Audio Recorder

NHK-FM (主なFM周波数)
NHK-FM 世界の快適音楽セレクション (GONTITI)
ワールドミュージックタイム (WORLD MUSIC TIME)
FM COCOLO
FM COCOLO | GO GO ゴンチチ
Music Bird
谷村有美 それなりに+(プラス)

等を楽しく聴いてゐるんですが、 Radio の前でじっと座れる事も少ないので何かに録音して後で聴く事が多いです。

以前は MD なんかに録音してゐたのですが、是が結構 融通が利かなくて不便なので Mac で録音し始めたら便利で楽しくなってしまい、 今では録音し過ぎて聴くのが追いつかない位です。

前置きが長くなりましたが、 Audio Recorder.app (v2.2/Panther で確認) で Timer Recording の例です。 Audio In.app の方がスケジュール機能が組み込まれてゐて良さそうなんですが、 Computer が Sleep してしまうと機能しなくなるのでどうにもならんのですゎ。

idle Event を使う方法では Sleep しておいて省エネルギー設定で直前に Wake-Up して、 終わったら又 Sleep なんて芸当が出来ますので、少しは増しですね。

System Events を使って tab 入力で Control してゐる部分が在りますが、 システム環境設定の言語が English になってゐて System Preferences: Keyboard & Mouse: Keyboard Shortcuts: All Controls を Enable に System Preferences: Energy Saver: Schedule... の Control の選択位置が Start up or wake に なってゐないと、『どうにもならない』事態になることがある様ですので、まぁ、誰にも勧められない自分専用 Script です。

『どうにもならない』とゐえば、Mac mini (Late 2005) で Schedule を設定しても Sleep したまま起きない事がある様で、是は本当に『どうにもならない』です。まぁ、eMac と違って点けっ放しでも静かなモンなんで Sleep しない設定にする丈けで OK ですけど。

念の為に書いて置きますが、「実行後、自動的に終了しない」 Application で保存しないと idle Event は実行されません。

AppleScript Files を纏めて Use startup screen & Stay-open applet に変換する Shell Script.

#!/bin/zsh
[ $# -ne 0 ] || { "Usage: $0:t <SCRIPT FILES>"; exit; }
for i in "$@";
do
    osacompile -uso "$i:r.app" "$i";
done

個人的な事情で電波状況が悪くなったので らじる★らじる NHK ネットラジオmimms で保存する物も用意しました。 Shell Script なので cron で実行する方が良さそうで、 /System/Library/LaunchDaemons/com.vix.cron.plist を見た限りでは /private/var/cron/tabs/{username}crontab file を置く という事らしいのですが、試してゐません。現状では以前の AppleScript を一寸書き換えた丈けです。

0 9 * * 6 radiru.sh fm 120

Shell Script を実行するのに AppleScript 内で do shell script も使ってみたのですが、此れだと状況が判らないので Terminal 上で実行する方が便利な様です。

Audio Recorder.app を使う場合は問題無かったのですが、Sleep から復帰して何もしないで時間が来るのを待ってゐると、2 分位で又 Sleep してしまう様です(謎)。Wake-up を 1 分前にすると大丈夫っぽい……。

保存する際に Format 変換も行う場合は mimms の代わりに ffmpeg を使うと融通が利くでせう。Live Stream でない時は専ら此ればかり。

[ $# -gt 1 ] || { echo "Usage: $0:t (fm|r1|r2) MINUTES [bk(osaka)|ck(nagoya)|fk(hiroshima)|
    hk(sendai)|ik(sapporo)|lk(fukuoka)|zk(matsuyama)|ak(tokyo)]? [TITLE]?"; exit; }
case ${1:l} in
(r2)                X=( 511929 ak );;
(r1)    case ${3:l} in
    (bk|osaka)      X=( 512291 bk );;
    (ck|nagoya)     X=( 512072 ck );;
    (fk|hiroshima)  X=( 512086 fk );;
    (hk|sendai)     X=( 512075 hk );;
    (ik|sapporo)    X=( 512098 ik );;
    (lk|fukuoka)    X=( 512088 lk );;
    (zk|matsuyama)  X=( 512103 zk );;
    (ak|tokyo|*)    X=( 511633 ak );;
    esac;;
(fm|*)  case ${3:l} in
    (bk|osaka)      X=( 512070 bk );;
    (ck|nagoya)     X=( 512074 ck );;
    (fk|hiroshima)  X=( 512087 fk );;
    (hk|sendai)     X=( 512076 hk );;
    (ik|sapporo)    X=( 512100 ik );;
    (lk|fukuoka)    X=( 512097 lk );;
    (zk|matsuyama)  X=( 512106 zk );;
    (ak|tokyo|*)    X=( 512290 ak );;
    esac;;
esac;
ffmpeg -i http://nhkradio$X[2]${1:l}-i.akamaihd.net/hls/live/$X[1]/1-${1:l}/1-${1:l}-01.m3u8 \
    -bsf:a aac_adtstoasc -c:a libvorbis -b:a 96k -t $[60 * $2] $(date +%F-%H%M%S)-$3-$4.ogg;
#   -bsf:a aac_adtstoasc -c copy -t $[60 * $2] $(date +%F-%H%M%S)-nhk-$1-$3-$4.m4a;

FMアーカイブス って何時から在ったんかな? PDF を Preview.app で見ると数字が全く表示されない流石に誰か気付いたのか読める様にはなってますゎな……、と思ったら自分の System の具合が悪かったかも。何か済んません。

追記
QuickTIme Player v7 で録音出来る様になったので、もぅいいかな… と思ったけど、Script で録音を操作する方法が全然分りませんでした(v7.6.4)。最近の Version だと出来るのかなぁ…? まぁ、Audacity にも Timer 録音機能が在るし、なんとかなるでしょう。
他にも 猫のお留守番 という専用 Software が在る様です。

Open Desktop Picture

AppleScript で Desktop Picture を開いてみると簡単。

tell application "Finder" to desktop picture as alias
tell application "PixelCat" to open (result as POSIX file)

かと思ったら、Desktop & Screen Saver 設定で Change Picture にしてゐる場合に、現在の画像を開いてくれない。ので Terminal でやる方が融通が利く様です。

d=$(defaults read com.apple.desktop Background); open $(
grep ChooseFolderPath <<<$d | cut -d '"' -f 2 | uniq
)/$(grep LastName <<<$d | cut -d '"' -f 2 | uniq)

とかしてみた。

Set Desktop Picture

Terminal で Desktop Picture を変更する。

function dtp() {
    osascript -e 'tell application "Finder" to "'$1'" as POSIX file returning desktop picture';
}
dtp foo/bar/baz/image.ext

Desktop Picture to any of Selection

Finder で選択した File の中から何れかを Desktop Picture にする。

tell application "Finder"
    selection
    result's some item returning desktop picture
end tell

Edit Local Files of Camino

Camino で開いてゐる Tab の Location が file: scheme のモノ丈け Editor で開く。

property TEXTEDITOR : "{Text Editor Name}"
tell application "Camino"
    repeat with i in front browser window's tabs
        i's URL
        if result starts with "file:" then
            do shell script "open -a " (*1*) & TEXTEDITOR & " " & result's quoted form
        end if
    end repeat
end tell
activate application TEXTEDITOR

(*1*): Application Name で指定する場合。 -b: bundle indentifier, -t: LaunchServices, -e: TextEdit.app 等も。

Favorites Presenter

QuickTime Player の Favorites を順に full screen で present する。既に Favorites に含まれる Movie を開いてゐる場合は、其の続きから。

tell application "QuickTime Player"
    activate
    {1, count favorites, documents's name} returning {x, y, z}
    if 0 < (count z) then
        repeat with i from 1 to y
            if favorite i's name is in z then
                i returning x
                exit repeat
            end if
        end repeat
    end if
    repeat with i from x to y
        open favorite i
        tell front document
            present scale screen
            repeat until done
                delay (duration - current time) / time scale
            end repeat
            close
        end tell
        if not show favorites window then exit repeat -- *1
    end repeat
end tell

一寸スッキリさせたけど、未だ何かイマイチかな…。

*1) Favorites Window を開いてゐる間、次の Movie を再生します。

QuickTime Presenter

QuickTime Player で open された movies を順に full screen で present する。

try
    tell application "QuickTime Player"
        activate
        documents returning d
        repeat with i in d
            tell i
                current time returning ct
                present scale screen
                pause
                ct returning current time
                delay 1
                start
                repeat until done
                    delay (duration - current time) / time scale
                end repeat
            end tell
            if 1 > (count documents) then exit repeat
        end repeat
    end tell
on error em number en
    if en is not in {-128, 1} then
        activate
        display alert em & " #" & en
    end if
end try

指定しないと全部を同時に play しようとするので、一々 movie が終わるのを待ってゐます。 全部見る前提なので、途中で飛ばしたり止めたりすると上手く機能しません。まぁ、普通は VLC 使うのが無難でしょう。

New Text Document (with Clipboard)

TextWrangler の Menu: File: New: Text Document: (with Clipboard) を他の Applications にも。

tell application "CotEditor"
    make new document
    the clipboard returning front document's text
end tell

Location Confirmation

Web Browser 等で短縮 URI を Copy して、開いても安全かどうか確認する。

on run
    try
        do shell script "curl -IL $(pbpaste) | grep -i 'Location:' | cut -d ' ' -f 2"
        if result is not "" then
            result
        else
            the clipboard
        end if
        display dialog "" default answer result buttons {"Cancel", "Once More"} default button 2
        result's text returned
        if result is not "" then
            set the clipboard to result
            run
        end if
    end try
end run

Twitter が HTTP Header を lower case で返すので grep-i option を追加。

取得に失敗した時は、Dialog で修正して再度実行出来ます。用が済んだら して終了。

Max Window Size

Glims が Safari 4.1 で動作しなくなったので Max Window Size 丈けでも何とかならんかと云う事で。

tell application "Safari"
    repeat with i in windows
        tell i
            if zoomable and resizable then
                if name is "Downloads" then -- *Fx
                    768
                else
                    0
                end if
                {result, 22, 1280, 962} returning bounds
            end if
        end tell
    end repeat
end tell

此の侭で Camino, OmniWeb にも使えます。

Firefox は Downloads Window の Title が可変なので *Fx を if name ends with "Downloads" then にする様な変更が必要。

序でに iTunes もやっつける。

property b : {0, 22, 1280, 962}
try
    tell application "iTunes"
        activate
        tell browser window "iTunes"
            b returning bounds
        end tell
        repeat with i in playlist windows
            b returning i's bounds
        end repeat
    end tell
end try

get bounds すれば {left, top, right, bottom} が判りますが、iTunes は実際の window rect と違うのを返すので適当に修正。

Camino de Count-up

Camino で 表示中の URL に含まれる最後の数字を Count-up. Perl の Magical String Incriment を利用してゐるので、他の言語ではもう少し面倒臭くなるかも。

tell application "Camino"
    front browser window's current tab's URL
    do shell script "perl -ne '
s/#.*//; # Count-up URI (To Count-up Fragment, Comment out this line).
@_ = /^(.*\D)(\d+)(\D+)$/; $_[1]++; print @_;' <<<" & result's quoted form
    result returning front browser window's current tab's URL
end tell

ん? <<< って zsh 丈け? …ぁ、bash も出来ますね。それなら略 OK (csh の事は考えた事ない).

Camino to Others

Camino を Default Browser にしてゐてよく使うのですが、Safari の Develop Menu にある Open Page with みたいな機能がないので Script を書いてしまいました。

~/Library/Scripts/Applications/Camino/Open Page with... とか適当な Folder を作って放り込んで置けば OK.

tell application "Camino" to front browser window's current tab's URL
tell application "Terminal" to do script "w3m " & result's quoted form
tell application "Camino" to front browser window's current tab's URL
do shell script "open -a TenFourFox " & result's quoted form
tell application "Camino" to front browser window's current tab's URL
do shell script "open -a Firefox3 " & result's quoted form

基本的には、何の Browser でも此の方法で良いんですが、もう一寸増しな方法も在るので…

tell application "Camino" to front browser window's current tab's URL
tell application "Firefox2" to OpenURL result
tell application "Camino" to front browser window's current tab's URL
tell application "OmniWeb" to OpenURL result
tell application "Camino" to front browser window's current tab's URL
tell application "Safari" to open location result

Opera や iCab なんかは最近使ってないので今回は無し。Google Chrome は Tiger では動かんので知らん。

Smart Quote

CotEditor.app 付属の Script (v0.8.2 迄) が不思議な事になってました (v0.8.3 [2005.10.28] で修正されました)。 多分、Editor の Smart Quote 機能で書き換えられてしまったものではないかと思いますが。

do shell script "date ``+%Y-%m-%dT%H:%M:%S+09:00''"

つまり do shell script で呼び出された date の引数は

``                       # Empty Back Quote String   空のコマンド置換
+%Y-%m-%dT%H:%M:%S+09:00 # Bare Words                裸の文字列
''                       # Empty Single Quote String 空の文字列

が、偶然 問題なく連接されて渡された丈け。 序でに Time Zone が +09:00 とは限らないので、望ましいと思われる書き方は

do shell script "date '+%FT%T%z' | sed 's/00$/:00/'"    # 一寸短くしてみた

の様な物になるでせう。

参考
日本標準時 - Wikipedia
tz database - Wikipedia : JST と JST-9 の(くだり)は読んでおいた方がいいかも
タイムゾーン呪いの書 - Qiita : でも JST: Jerusalem Standard Time? という略称の曖昧さについての注意喚起が

序でに Xcode (v2.5) の Script も書いて置きますが…

echo -n "// ${PREFIX}:${USER}:"
date +%Y%m%d | awk '{printf "%s", $1}'
echo -n " %%%{PBXSelection}%%%"

date の改行文字を削除する為丈けに awk を使ってゐる様ですが、此れ全然必要ないんですゎ。

echo -n "// ${PREFIX}:${USER}:$(date +%Y%m%d) %%%{PBXSelection}%%%"

Quote String 内のコマンド置き換えは自動的に改行が取り払われますよね? 環境に因るのかな……。

move selection

Finder で選択中の item を移動する。何も選択してゐない場合は File 選択 Dialog も表示する。

try
    tell application "Finder"
        selection
        if result is {} then
            choose file with multiple selections allowed
        else
            result
        end if
        move result to (choose folder)
    end tell
end try

make path

POSIX path を入力して Folder 階層を作る。 Save File Dialog を利用してゐるので、 / (Slash) を含む Path を入力すると - (Hyphen) に置き換えられたりしますが、最初に Slash を入力すると別の Dialog が開いたりして中々難儀な事で。

try
    do shell script "mkdir -p -- ./" & (choose file name)'s POSIX path's quoted form
end try

make new folder from A to Z

Finder で選択中の位置に A から Z まで Folder を作成する。

property |A| : ASCII number "A"
property |Z| : ASCII number "Z"
tell application "Finder"
    tell front window
        repeat with i from |A| to |Z|
            try
                make new folder at it with properties {name:ASCII character i}
            end try
        end repeat
    end tell
end tell

Terminal で Perl だと短い。

perl -e 'mkdir $_ for "A" .. "Z"'

而も二文字変える丈けで消せる。

perl -e 'rmdir $_ for "A" .. "Z"'

根気と手抜き

例えば、現在の「分」を求めるとしましょう。

根気強い AppleScripter はこんな書き方をするでしょう。

current date
result's time
result mod hours
result div minutes
-- or
((current date)'s time) mod hours div minutes

でも、手抜き Scripter は、大凡こういうので済ます筈です。

do shell script "date '+%M'"

make new folder by ISO date

Finder で選択中の位置に今日の日付の Folder を作成する。

on wdigits(d)
    return "" & d div 10 & d mod 10
end wdigits
on join(s, t)
    s returning text item delimiters
    return "" & t
end join
try
    tell (current date)
        my join("-", {its year, my wdigits(its month), my wdigits(its day)})
    end tell
    {result, {}} returning {iso_date, |L|}
    "" returning text item delimiters
    tell application "Finder"
        repeat with i in {} & selection
            if i's class is folder then
                i as alias
            else
                i's container as alias
            end if
            if result is not in |L| then result returning |L|'s end
            tell |L|'s last item as reference
                if not (exists item iso_date) then
                    make new folder at it with properties {name:iso_date}
                end if
            end tell
        end repeat
    end tell
end try

勿論 Terminal の方が百倍楽チンです。

apply 'mkdir -vp "%1"/'`date +%F` /foo/bar ./baz/qux/quux ~/corge/grault/garply/waldo

Re-activate uControl (Panther)

Mac OS X Panther で Sleep 復帰後に uControl が効いてない症状が出る場合 Machine を再起動する迄 続くのですが、主に困るのは Tarminal での入力なので、

sudo /Library/StartupItems/uControl/uControl start

等と入力してゐました。入力自体は history から呼び出せますが、毎回 password を要求されるので面倒です。

Preference Pane を開いた丈けで直る様なので、AppleScript にしました。

tell application "System Preferences"
    set current pane to pane "org.gnufoo.kext.uControl"
    quit
end tell

Tips?

Handler と Local Identifier で同名を使う
Global Identifier と Global Handler で、同名のモノを使おうとすると Error になりますが、引数名は Local なので、Handler 内で Handler と同名の Identifier が使えます。
on _ at _
    return class of _
end _
display dialog "Local Identifier _ is " & (_ at "_") & " class" & "
Global Handler _ is " & (class of _) & " class"
-- results
>> Local Identifier _ is string class
>> Global Handler _ is handler class
--
-- using script object
script _
    on _ at _
        return class of _
    end _
end script
tell _
    display dialog "" default answer "Local Identifier _ is " & (_ at "_") & " class" & "
Script Object _ is " & (class of _) & " class"
end tell
-- results
>> Local Identifier _ is string class
>> Script Object _ is script class
予約語を Identifier に使う
|name| の様に Fence で挟む
Space 以外の空白文字混じりの Identifier を使う
|(* \r \t *)| の様に Comment を Fence で挟む。 此処で云う Comment とは (* から *) 迄。
Quote 文字列内では escape 文字が実体に置き換えられるが Identifier では逆になる。
(* *) Comment 内で Compile Error になる
Comment 内に Fence (Vertical score) 等を含む漢字が在ると Error になる亊がある。 つまり (**) の間の文字列は式か文として評價されてゐる。
行頭に--を插入するか、 Double Quote で括れば Error にならない。 (* *) は Debug 用途以外では使わない方が無難。
Mac OS 8.1 より古い System で open url が使いたい
Internet Access Update 1.0.3 (English) の Internet Access (shlb) と、インターネットアクセス 1.2 又は Mac OS 8 CD-ROM に含まれる Internet Scripting (osax) を Install すればよい。 Tome File の Path は
Mac OS 8:ソフトウェアインストール:インターネットアクセス:Internet アクセスディスク 5:

ADD-IAD 1.0.2 Install の注意點

この Installer は 酷いです。 StiffIt Installer Maker の特徴でもありますが (w

で、安全に Install するには…… Apple_Data_Detectors_sit.hqx (SDK) の Installer を使いませう。

んで、 iCab なんかはこんな Menu が出る様になります。 Link 集とかで遣ると画面全体 Context Menu になったりしますが。

Context Menu on iCab

Apple Data Detectors Database は頻繁に壊れるので、こまめに Check しよう。

OSA References

OSA 環境は幾つか在ったんですが、何年も経たずに淘汰されてしまい AppleScript ぐらいしか残ってゐません。

UserLand Frontier も一部では人気があって、使ってる人達は結構自慢気なのですが、生成された HTML の文法が支離滅裂だったりして余り良い印象がありません。

JavaScript OSA は以前使ってゐた環境で動かなくなってしまって、其れっきりです。 OS X では { Dashboard, Konfabulator } の方が使いよいので、もう使われないでしょうね。

まさか、Apple が OSA 環境に JavaScript を採用する事になろうは、全く想像して居りませんでした。そして、私は何時迄も Mac OS X 10.4 Tiger の儘なので、知りもしませんでした。

JavaScript for Automation Release Notes

Apple & AppleScript

Editors, Utilities

OSAX

Related

Other OSA

HyperCard

CompileIt! Demo の 10 行制限内でなんとか XCMD/XFCN を作って遊んでゐましたが、 制限無し Version が公開されましたので、そのうち修正したいとは思ってゐます……。

最近の Apple Macintosh 製品は、既に HyperCard が滿足に動く環境では無くなって來てゐますので、 HyperCard 專用 Machine を用意してみませんか? 私の環境は PowerMac 8500/180 です。快適です。

Sparse Disk Image を使う以外に USB Memory を使う方法がハイパカ・フォーラムで出てゐますね。 Format の知識さえ Clear すれば好い Idea だと思います。 まぁ、v2.4.1 なら問題ないのでアレですが。

Classic 環境では何らかの cache が効いてゐる様で、實行速度が 2 囘目以降は安定したり、 XCMD/XFCN, HyperTalk, AppleScript での差が小さかったりする様な雰圍氣です (未確認)。

やっとの亊で Mac OS X に移行しましたので、 Classic 環境への對應も徐々にしたい、と思った儘放置されてゐます……。

Easy to Remember から V3.com に移行した Timing で解約したので http://w3.to/surume/, http://surume.w3.to/ からの転送は出来なくなってゐます。 再度登録してみましたが Spam Mail が来る丈けで転送されません。

HyperCard Stack

FizzBuzz

FizzBuzz Test を HyperCard で遣ってる人がゐなかったので。

Script 丈け見たい人は fizzbuzz.txt の末尾。

FizzBuzz Stack

setext2xhtml

  • setext を XHTML Basic 1.0 で保存できます。
  • 飽くまでも {簡易, 略式, 短縮形} ですので、至らぬ点には目を瞑るように( ̄▽ ̄;

setext Menu

一應、一通りの typo tag を Menu で挿入出來ます。

搭載された小さな親切大きな御世話機能

  1. あんまり酷いとアレなんで、 Another HTML-lint <http://openlab.jp/k16/htmllint/> で、エラー無しの 100 点になる程度には設計してあります。
  2. タイトルは RFC1866 で推奨されている 64 Bytes 以下に切り詰められます。
  3. 明らかに正しくない E-mail address の簡易チェック機能。
  4. 本文中の HTTP or FTP URI は自動的に Link します。 accesskey も自動的に設定します (a-z の繰り返し)。
  5. & < > " だけは実態参照に置き換えられます。
  6. 空行を段落、又は箇条書の境界と判定し Mark 付けします。
  7. 適当に判断して List (Ordered, Unordered) が作成出来るようになりました。 行頭 Word が * だけ、又は数字だけならば List と判定します。 但し、後に続く文字列との間に Space が無い場合は Data 文字列として扱います。
  8. <br /> (Forced Line Break) を挿入するのが無駄なのでやめました。
  9. Plain Text からは、見出しの自動 Markup が無理なので、 setext を 変換するようにした。とゐっても Typo tag は見出し定義が Title と Subhead しかないので <h2> と <h3> しか作れない。

今後の予定

  • 実際に i-mode 等での表示状態の確認 (携帯端末を持ってゐないのです)。
  • XHTML tag への変換 (追々追加する氣持ちはあるのですが……)。

Thanks to

GetEMail() from Internet XFCNs by Matthias Kahlerts <http://mkahlert.com/>

参考: Markdown.pl : 関係ありそうななさそうな…。

a-map

Clipboard の畫像に對して client side image map の HTML TAG を作成します。 屬性値が自動で設定されるのは coords 丈けですが。

  • 簡單である
  • 自分がそれしか遣わないから
  • 他のを作るのが面倒

という理由で、現在 shape は rect のみです。

因みに、 circle の場合は 中心點の座標と半徑、 poly は頂點の座標の羅列だった と思います。 circle なんかは特に簡單なので誰でも擴張出來ますね :D

image map を作成する際、 <area> を使わなくてはいけないと思ひ込んでる方 も居られるようですが、對應していない Client で參照出來なくなりますので <a> を使います (註: HTML5 では <a> 要素の shape 属性および coords 属性は削除されました)。 ま、逆に <a> の image map に對應出來て無い (若しくは古い) Client がありますが <a> は必ず表示されますので、 100% Access が可能です。

Backfiller

HyperCard Stack の Script を TEXT file に Save します。 正直かなり眞面目に取り組んだ (というか必要に逼られて作った) のですが、 製品版に付屬する Power Tools に同様な機能 (Export a Stack's Scripts) があって滅茶ガッカリしました。

んで、おまけとして Script の聨續した空行を壓縮します。 でも、割り当て Memory が足りないと Stack 自體をこわしてしまうかも。

Benchmark

Script の 實行時間を測定します。 各々、實行出來る文か式になってゐなければなりません。 まぁ、大抵は get しておけばよいとは思いますが……。

最初に空の文を指定囘數實行して Loop に掛かる時間を差引しますので ソコソコ有效な結果が得られると思います。

Perl の Benchmark::timethese() を Hint にしました。

Better Choice Passwords

數字との判別が煩わしい O, I, l を使わない Randomな文字列を生成します

結果の List を Click すると Hilite した行を Clipboard に Copy します。

JFIF EOF Checker

JPEG File の 先端マーカは 0xFFD8, 終端マーカは 0xFFD9 です。 この Stack は JPEG File の 2 byte 目が 0xD8 か、末端 1 byte が 0xD9 か、丈けを調べます。

對象は選擇した Folder に含まれる全ての JPEG Files です。

  • HyperCard 2.3 以前で Folder を選擇する際 AppleScript が必要です。
  • File の取得に MtFileLister を使用してゐます。

Form が使えない WannaBe をもっと活用する爲の Tool です。

ICLaunchURL に依存してゐます。

Customized Font Catalog

書体名や、作者名で検索する

通常 HyperCard では、Text の検索には command + F が使われますが、 version 2.3 以降では find "" とだけ message に出るようになりました。 これは、入力した単語の 何れか が対象となります。

それはそれで便利なのですが、作者名がはっきり分かっている場合は、 却って面倒に感じますので find string "" とした方が求める結果になるでしょう

shift + command + F とすれば find whole "" となるのは同じです。 書体名で検索する際に便利でしょう。

Buttons

Button を追加し、順序、内容、 Icon, Script を変更しました。 左から順に以下の様に為って居ります。

  • go first card
  • slide show all cards descending
  • slide show all cards ascending
  • go prev card
  • go next card
  • unmark all cards
  • mark this card
  • go prev marked card
  • go next marked card
  • slide show marked cards descending
  • slide show marked cards ascending
  • go last card

で、 mark は個々に付けても良いのですが、面倒過ぎますので 作者名で一括 mark 出来るようにしました。

hidden commends

自分用に追加した Command です。 HyperCard Player では利用出来ません。

ma (Mark(s) by Author)
例) message box に ma "David Rakowski" と入力して return / enter key を押すと Author field に David Rakowski が含まれる card を全て Mark します。
la (List Author)
例) message box に la "David Rakowski" と入力して return / enter key を押すと Author field に David Rakowski が含まれる全ての card の書体名と Type を Text File に書き出します。
ep (Export Paint)
例) message box に ep と入力して return / enter key を押すと 全ての Mark された card の Picture を File に書き出します。 File Type は PNTG (MacPaint) です。

font catalog stacks

HyperTalk

ScriptEditor Window Rectangles

HyperCard に組み込みの ScriptEditor は大きい Screen では長細い Window を開きます。

Default Size of ScriptEditor Window

此れではあまりにも不便なので Home Stack の startUp Handler で設定しましょう。

on startUp
  --: snip :--
  global scriptWindowRects
  get item 3 to 4 of the screenRect
  put min(1000, item 1 of it div 100 * 100) into item 1 of it
  put item 2 of it div 100 * 100 into item 2 of it -- or subtract (Dock, Control Strip)'s height
  get "46,44," & it & return & "26,64," & it & return & "6,84," & it
  put it into scriptWindowRects
  --: snip :--
  pass startUp
end startUp

Fingertip

わりとどうでもいい話題

Do Benchmark

知っても得しない(?)無駄知識。

自作の Benchmark Stack で do (hoge) で測定したら、 直接書いた場合とは全然違ったので、嘘ばっかりでした済みません。 Benchmark Stack を作り直して再度計測しました。

Stack Script に入れて實行した場合

Space を空けて書くのと詰めて書くのでは速度が違う?
ちっとも違わない。
it is empty より the length of it = 0 の方が速い?
速い。私の環境では逆……というのは嘘でした。後述の do した場合を參照。
is in (is not in) より contains の方が速い (或いは其の逆)?
違わない。たまたま違っても誤差の範圍。

do EXPR で實行した場合

Space を空けて書くのと詰めて書くのでは速度が違う?
演算子の前後 等は Space が 1 文字丈けなら全く違わない。但し 2 文字以上空けると極端に遲くなる。
faster: do "put 0.123*4.567"
faster: do "put 0.12 / 3.45"
slower: do "put 0.1  +  .23"
括弧を附ける時も同樣なので、括弧の内外に Space を置くと遲くなる。
faster: do "put trunc(0.123-4.567)"
slower: do "put trunc( 0.12*3.45 )"
slower: do "put trunc ( 0.1/.23  )"
更に同樣に、括弧が不必要に重複してゐると、ほんの纔づつ遲くなる。
faster: do "put (0.123+4.567)"
slower: do "put ((0.12-3.45))"
slower: do "put (((0.1*.23)))"
更に更に、關數では無い Command 呼び出しでは、括弧の外側の Space が無いと遲くなる(!)。
faster: do "put (0.123/4.567)"
slower: do "put(0.12+3.45)"
slower: do "put( 0.1-.23 )"
it is empty より the length of it = 0 の方が速い?
do した場合は逆になる。
is in (is not in) より contains の方が速い (或いは其の逆)?
違わない。たまたま違っても誤差の範圍。

なんか do する時は氣をつけましょう、って丈けな駄文でございました。

結果的に Style Guide for Python Code (和譯) と近いのではないかと思いますので、讀んでみてもいいかもしれません。或いは Style Guide for HyperTalkを誰かが書く可きなのでしょうか。

此處に書いた内容も、1 囘の命令で 1 / 1000 秒しか違わない様な事が含まれてゐます。

Compact Stack は何囘必要?

囘數より HyperCard の Version の方が重要。 v2.3 以降と 其れ以前では結果に差がある。

抑々 v2.3.5 以降も色々と Bug Fix されてゐるので、實行は v2.4.1 Player を使いませう。

Read binary as AppleScript

HyperTalk で Binary file を讀み込むと Null (0x00) が Space (0x20) に變換されてしまいますが、 通常 Finder 等の AppleScript では扱えます。 HyperCard でも AppleScript なら扱えるかと、試してみました。

Read binary as AppleScript

何の亊は無い、HyperTalk ではなく HyperCard が Null を扱えないのでした。

Window Size が 9 inch (512 x 342) に固定される

どう云う譯か HyperCard の Window Size が 標準 9 inch (512 x 342) に固定されて、其れより大きな Stack は Scroll しないと Card 全體が見えなくなりました。 PowerMac 8500 の Screen Size は 832 x 624 なので入らない譯無いのですが。 はて? 私は何を間違えたのでしょうか……

なんか JavaScript OSA が怪しいらしいです。そう云えば、入れたり外したりしてたなぁ……。

HyperCard Lite J1-2.2.1 に Power Tools

HyperCard 2.4.x Updater の Installer には Application の Updater の他に Power Tools 等が含まれます。肝心の部分こそ使えませんが、いただきでしょう。

Reference や Help 等の Stack は Menu が 英語なので、英語版の 2.4.1 Player と一緒に置いた方が便利かもしれません。

HyperCard Lite J1-2.2.1 に Help Stack

  • Mac OS 8
    • Mac OS 特別付録
      • HyperCard アップデート
        • Mac OS 8 用スタック
          • AppleScript スタックフォルダへ
            • HyperCard AppleScript Reference
          • ヘルプフォルダへ
            • Help Extras
            • HyperCard Help
            • HyperTalk Reference

Mac OS 8 CD-ROM 等にある J1-2.3.6 の Help Stack を HyperCard Lite J1-2.2.1 Folder に放り込むと一寸得した氣分になれます。

但し、上記の Help Stack は、特定の環境で Bug が發覺しますので修正が必要です。

Help Menu の修正

問題点

Mac OS 8 CD-ROM 等に含まれる HyperCard 2.3.6 Stacks の内、

  • Help Extras
  • HyperCard AppleScript Reference
  • HyperTalk Reference

は Menu の作成, 削除に矛盾があり、OS 8 以降の Finder のヘルプメニューがHelpになってゐる環境下で問題になる事があります。

StartUp 時に作成される Menu はリファレンスですが、 メニュー第一項目の『ヘルプについて』を選択するとHelpMenu を作成しようとします。 この時点では、既にHelpMenu が在る丈けで問題は起こりません。

しかし、別の Card に移動しようとすると、HelpMenu を削除しようとします。 勿論 System の Menu なので削除出来ない為、 Error になります。

修正方法

  1. Stack を開き『ヘルプについて』を選択する
  2. Background Script を開く (option + command + B)。
  3. 置き換え (command + R) に "Help""ヘルプ""リファレンス" に変更するよう に設定し、 を押す (文字列は Double Quote も含む)。
    Help!
  4. Card Script (option + command + C) も同樣に置き換える。
  5. Card を移動して メニュー項目『ヘルプについて』の Enable / Disable が切り替われば成功。
  6. HyperTalk ReferenceStack は Sample Script 中にも同樣の問題が含まれます。

    Disable, Enabled, CheckMark, MarkChar, の Card Script と background field "デモスクリプト" も修正します。

    menuItem "HyperTalk Reference" になっている部分を menuItem 4 (又は menuItem "HyperTalk リファレンス") に置き換えます。

    Reference

    bg fld "デモスクリプト" 内は検索出来なくなってゐるので書き換えが面倒ですが。

    Demo

Paches

HyperCard References

Machine 性能が上がるに聨れてドンドン速くなってゐるものの、やはり HyperCard の處理速度は速いとは云えませんので、 Algorithm に十分留意する可きでせう (自戒)。

以下、敬稱畧。

Apple: HyperCard

Card-Based Softwares

Scripting, Tutorial

External Commands

Stacks

Stories

Programming

Books

Handbook Cover The Complete HyperCard 2.2 Handbook 下巻 [プログラミングテクニック編] (ISBN4-89563-400-0, 毎日コミュニケーションズ, Danny Goodman 著, ¥2,800)
最初に買った(1996-08-12) HyperCard 本です。
上,中卷は、目次を見ると不必要そうだったので買いませんでした (特に中卷が高かったし (^^;;
Sample Script も豐富で 「どのように取り組むか」が詳しく解説された本です。
今讀んでも讀み應えがあります。
原書は 4th Edition が購入可能な様です (英語讀める?)。
活用リファレンス Cover HyperTalk 2.3 活用リファレンス (ISBN4-7741-0194-X C3055, 技術評論社, 赤松正行 中井裕之 共著, ¥2,200)
どうしてもリファレンス本が必要に感じたので 2 册目は迷わずこれを選びました (1996/10/21 購入)。
既に襤褸いし手垢で黄ばんでゐます。
散々お世話になっておいてナニですが、式/文に誤字脱字があるので 正誤表 が欲しかったです……。
v2.3 完全對應と銘打ってゐますが、 there の説明が抜けてゐるなど、不備な點も殘ってゐます。
Reference Stack を入手した方が間違いが無いでしょう。