Keynote 3

相変わらず QuickTime 7.1 で手こずっています。

まず、dimensions が変更されない(実際は、再保存して再び開くと変更されている)。書き出しで設定ファイルを書き出せない。書き出しで設定を使って書き出すことができない。annotation が設定、変更できない(Automator を使って試してみても駄目)。System Events を使って annotation を取得するもその名前おかしいだろ、って結果が返ってくる。で、以前に書いた text track の日本語の件。

これ、ほんとにまともなソフトウェア?

以上は全て AppleScript から操作するときに出会った不具合です。普通に使っている分にはそこそこ使えます(が、以前より機能や使い勝手が悪くなっている気がするのは気のせい?)。

はやく、QuickTime 7 以前の使い勝手に戻ってほしいものです。

のっけから表題と関係のない話でしたが...Keynote 3。iWork '06 に入っているものです。AppleScript の対応度も少しよくなっています。しかし、なぜにスライドの中にあるテキストやアウトラインや図形や表を操作することができないのでしょう。Pages 2 ではできるのに。Pages 2 で使えるクラスが Keynote でも使えるように...と切に願います(Keynote のスクリプト機能を拡張するプラグインはありますが)。

Keynote の用語説明を見てみましたが、それほどいろんなことができるわけではないみたい。トランジションは設定することができるようになっていますね。そこで iPhoto で選択しているアルバムの中の画像を使ってスライドショーを作るスクリプトなんかを。それぞれの画像に適当にトランジションを設定します。

Script Editor で開く

tell application "iPhoto"
    set curAlbum to a reference to current album
    if (count photos of curAlbum) is 0 then return

    set photoList to image path of photos of curAlbum
    set photoListRef to a reference to photoList
end tell

tell application "Keynote"
    launch
    -- make new slideshow
    set themeList to name of appThemes
    set thisTheme to choose from list themeList
    if thisTheme is false then return
    set thisTheme to thisTheme as Unicode text
    -- other slide size...
    -- {800, 600},{1024,768},{1280,720},{1680,1050},{1920,1080},custom...
    set themeData to {theme:thisTheme, slideSize:{800, 600}}
    set thisSlideshow to make new slideshow at end of slideshows with data themeData

    -- get transitions
    set transitionList to name of appTransitions
    set transitionCount to count transitionList

    tell thisSlideshow
        -- make image slides
        make image slides paths photoListRef with set titles
        delete first slide of thisSlideshow
        set slideCount to count slides
    end tell

    -- apply transition
    repeat with i from 1 to slideCount
        set thisTransition to (some item of transitionList) as Unicode text
        set thisTransition to (a reference to (appTransition thisTransition))
        set appTransition of slideTransition of slide i of thisSlideshow to thisTransition
    end repeat

    -- play slideshow
    start thisSlideshow
end tell

実行すると少しの間なにも起きないのでエラーかと思いますが、出来上がるまで少し待ってください。しかし、Keynote で新規ドキュメントを作る方法の分かりにくいこと。結局のところ AppleScript だけでは全ては完成しません。Pages 2 でもそうなのですが、最終的には自分の手で見映えなどを調整しないといけない。

このような限定的な自動化しかできないので欲求不満に陥っていたり。

QuickTime 7.1

QuickTime 7.1 がでていた。

ファイルサイズが大きかったので期待していたのですが...「文字、化ける?」で書いた不具合(バグ?)は直っていませんでした。うーむ。いったいなんのバージョンアップだったんだろう?

それにしても世間が MacBook で盛り上がっているところになんて関連のない話題。しかも、QuickTime 7.1 がでてからだいぶ日が経っているし。どうも、世間様とずれているな。

続けます。QuickTime 7.1 は容量も大きかったですが、バグもまたでています。例えば、次のスクリプトはエラーになります。

Script Editor で開く

tell application "QuickTime Player"
    set theMovie to make new movie
    tell theMovie
        paste
    end tell
end tell

一見なんの変哲もないのですが、make new movie で新しくドキュメントを作成すると返ってくる結果が、

--> document "名称未設定 2" of application "QuickTime Player"

といったものになります。作られたドキュメントは「名称未設定」なのに...。つまり、一つ数が多いドキュメントの参照が返ってくるのです(なんてこった)。うちだけ?

同じようなもので新しく作った録音用のドキュメントの結果もそのまま使えなかったりする。その他にもいろいろとあるみたい。もう、全然使いやすくなっていないじゃないか。怒る気力もありません。

Pages 2

iWork '06の Pages 2 が面白い。

Pages 2 は、日本語環境に対応していない...という批判(?)はよく聞くけど、なんの。横書きしかできなくてもルビが使えなくても、数式を埋め込むのが面倒でも、それでも個人の環境で便利に使える場面というのは多々ある。

ちょっと Web 見ただけでもなんとたくさんのテンプレートが無料で配布されていることか。CanonEpson のサイトにいってみると横書きでもいいんだ、ということがよく分かる。なにかを紙に印刷するのが目的であれば、工夫次第で様々なことができる。Pages 2 があれば、もう無料のテンプレートいらないや。はがきだって(横書きだけど)できるんだぞぅ。

と、少々ワケの分からないことを宣いましたが。Pages 2 から AppleScript に対応しているんですね。まだまだできないことも多いけど。

ということで Pages を AppleScript で操ってカレンダーなんかを作ってみました。いろんな部分で手を抜いていますが、Pages を持っているならぜひ、お試しください。面白いですから(なんか変なことが起きても責任は持てませんが)。

Script Editor で開く

using terms from application "Pages"
    -- for A4 size
    property paperWidth : 21.0
    property paperHeight : 29.7
    property cellWidth : 2.8
    property cellHeight : 2.4

    property topMargin : 1.0
    property bottomMargin : 1.5
    property leftMargin : 0.5
    property rightMargin : 0.5

    -- calendar cells props
    property strokeWidth : 0.15
    property strokeColor : {26214, 26214, 26214}
    property textFont : "Georgia"
    property textSize : 14.0
    property textAlignment : right

    -- weekday cells props
    property wCellWidth : cellWidth
    property wCellHeight : 1.5
    property wTextFont : "Optima-Bold"
    property wTextSize : 18.0
    property wTextAlignment : center

    -- month cells props
    property mCellWidth : cellWidth * 7
    property mCellHeight : 2.0
    property mTextFont : "Optima-ExtraBlack"
    property mTextSize : 40.0
    property mTextAlignment : center
    property mTextColor : {46003, 46003, 46003}
    property mTextTracking : 3.0

    -- other props
    property weekdayList : {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
end using terms from

set theDate to "2006 4 1" -- for debug
set theDate to date theDate -- for debug
set theDate to current date

tell application "Pages"
    set ruler units to centimeters

    set theDocument to make new document
    tell theDocument
        set top margin to topMargin
        set bottom margin to bottomMargin
        set left margin to leftMargin
        set right margin to rightMargin

        -- 印刷可能領域の算出
        set contentsWidth to paperWidth - (right margin + left margin)
        set contentsHeight to paperHeight - (top margin + bottom margin)

        set tmp to my getCalendar(theDate)
        set dateList to {}
        repeat with thisItem in tmp
            set thisItem to contents of thisItem
            if thisItem is not {} then set end of dateList to thisItem
        end repeat

        -- カレンダーの出来上がりサイズ
        set calendarWidth to cellWidth * 7
        set calendarHeight to cellHeight * (count dateList)
        --印刷可能領域よりカレンダーサイズが大きい場合は処理しない
        if calendarWidth is greater than contentsWidth then return

        -- 余白の算出
        set blank to contentsWidth - calendarWidth
        -- 最初のセルの開始位置
        set x to left margin + (blank / 2)
        set y to (contentsHeight - calendarHeight) + top margin

        -- カレンダーの作成
        set num to 0
        repeat with i from 1 to (count dateList)
            set currentWeek to item i of dateList
            set dayCount to count currentWeek
            repeat with j from 1 to 7
                set num to num + 1
                if j is greater than dayCount then
                    set thisItem to ""
                else
                    set thisItem to (item j of currentWeek) as Unicode text
                end if
                set theProp to {width:cellWidth, height:cellHeight, horizontal position:x + (cellWidth * (j - 1)), vertical position:y, name:(num as Unicode text), object text:thisItem}
                set newShape to make new shape with properties theProp
                if (num mod 7) is 0 then
                    set thisColor to {0, 0, 65535}
                else if (num mod 7) is 1 then
                    set thisColor to {65535, 0, 0}
                else
                    set thisColor to {0, 0, 0}
                end if
                tell object text of newShape
                    set color of it to thisColor
                end tell
            end repeat
            set y to y + cellHeight
        end repeat

        -- カレンダーセルの見た目の変更
        tell shapes
            set stroke width to strokeWidth
            set stroke color to strokeColor
            set wrap to none
            set fill type to none
            tell object text
                set alignment to textAlignment
                set font name to textFont
                set font size to textSize
            end tell
        end tell

        -- 曜日セルの作成
        set weekdayPosition to (vertical position of first shape) - wCellHeight
        repeat with i from 1 to 7
            set newShape to make new shape
            tell newShape
                set horizontal position to x + (wCellWidth * (i - 1))
                set vertical position to weekdayPosition
                set width to wCellWidth
                set height to wCellHeight
                set wrap to none
                set stroke type to none
                set fill type to none
                set object text to item i of weekdayList
                set alignment of object text to wTextAlignment
                set font name of object text to wTextFont
                set font size of object text to wTextSize
            end tell
        end repeat

        -- 月のセルを作成
        set monthPosition to (vertical position of last shape) - mCellHeight
        make new text box with properties {vertical position:monthPosition, height:mCellHeight, width:mCellWidth, horizontal position:x, name:"month"}

        tell text box "month"
            set thisYear to year of (theDate) as Unicode text
            set thisMonth to month of (theDate) as Unicode text
            set object text to thisMonth & space & thisYear
            set alignment of object text to mTextAlignment
            set font name of object text to mTextFont
            set font size of object text to mTextSize
            set tracking of object text to mTextTracking
            set color of object text to mTextColor
        end tell
        say "Complete."
    end tell
end tell

on getCalendar(selectedDate)
    set theList to {{}, {}, {}, {}, {}, {}}
    set numDaysInMonth to {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

    set currentYear to year of selectedDate
    set currentMonth to month of selectedDate as number

    set day of selectedDate to 1
    set time of selectedDate to 0

    copy selectedDate to firstOfMonth
    set startOffset to weekday of firstOfMonth as number

    set daysInMonth to item currentMonth of numDaysInMonth
    if ((currentMonth is 2) and (isLeap(currentYear))) then set daysInMonth to daysInMonth + 1

    set dayLabel to 1
    set num to 0
    repeat with i from 1 to 6
        set currentWeek to item i of theList
        repeat with j from 1 to 7
            set num to num + 1
            if (num is less than startOffset) then
                set end of currentWeek to ""
            else if (num is greater than or equal to (daysInMonth + startOffset)) then
                exit repeat
            else
                set end of currentWeek to dayLabel
                set dayLabel to dayLabel + 1
            end if
        end repeat
    end repeat
    return theList
end getCalendar

on isLeap(theYear)
    return (((theYear mod 4) is 0 and ((theYear mod 100) is not 0)) or (theYear mod 400) is 0)
end isLeap

文字、化ける?

気がつけば、5 月。ゴールデンウィーク。みなさん、せっかくの連休。しっかり、AppleScript に打ち込みましょう!

しないって。せっかくの連休にそんなこと。

さて、RSS の配信を始めてから 1 年経ちました。案外、続きました。

文字が化けるんです。

なにが?

RSS ではありません。紛らわしいよ、この書き方。

QuickTime Player 7 です。テキストトラックです。TextEdit で作ったテキストファイルでテキストトラックを作ったら日本語のチャプターを作れるんです(保存した文字コードは 「日本語(Mac OS)」)。これはこれでいいのですが、わたくしといたしましては、AppleScript でテキストトラックを作りたい。で、しこしこしこしこと AppleScript を書いて実行...。駄目なんですね。日本語を含んでいると文字が化けてしまう。

Script Editor で開く

tell application "QuickTime Player"
    make new movie
    tell movie 1
        make new track with data "おはよう"
    end tell
end tell

文字コード SJIS のファイルを読み込んでテキストトラックを作る分には大丈夫なんですね。AppleScript から渡す文字コードが問題なのかな...と試してみるんですが、解決しない。

QuickTime が元々こういうものなのか、それとも QuickTime 7 になってからのことなのか。その辺も判然としない。テキストトラックで日本語がおかしくなってしまうということは、チャプタートラックも作れないんですよね。どうしたものか...。