Safari で文字列を URL エンコード

JavaScript の話題ばかりだと愛想つかされてしまいそうです。そもそも、その成果がこのサイトに現れていないのはなぜ?とも思います。

実際には、サイトに JavaScript 関連の HTML をあげています。リンクをしていないだけで。Ajax は、ローカルだとテストできないんですね。そんなわけで色々とアップロードしてテストしているのですが、まぁ、人様に見せるほどのものではないし、JavaScript のサンプルだってあちこちに同じようなものがありますし。そのうち、Google 検索でひっかかるようになるかもしれません。

これだけだとなんですので、Safari で JavaScript を使ってエンコードをするスクリプトなんかを。

Script Editor で開く

set weekdayList to {"日", "月", "火", "水", "木", "金", "土"}
set theList to {}

repeat with i in weekdayList
    set end of theList to encodeWithJS(i)
end repeat

theList

on encodeWithJS(str)
    tell application "Safari"
        if exists front document then
            return do JavaScript "encodeURI('" & str & "')" in front document
        end if
        return str
    end tell
end encodeWithJS

on decodeWithJS(str)
    tell application "Safari"
        if exists front document then
            return do JavaScript "decodeURI('" & str & "')" in front document
        end if
        return str
    end tell
end decodeWithJS

このスクリプトを利用した結果がなにを意味しているか分からない、という人にはほとんど価値のないスクリプト。Ajax なんかで文字化けを回避するために文字列をエンコードしておきたいときがあるので、そんなときに使います。それ以外でも使えますが。Safari は、AppleScript から利用できる JavaScript 実行エンジンですね。

なんとなく、カレンダー

あいかわらず、AppleScript をほったらかしで JavaScript や XHTML、CSS、PHP に熱中しています。というか、AppleScript Studio でビューツールバーアイテムがやっぱり使えなくて意気消沈してしまいました。

Script factory さんは、時々チェックしているサイトさんなのですが、ついに、FilterScripts for mi が Objective-C で書き直されたようです。このアプリケーションが公開されたとき、刺激されて同じようなコンセプトのアプリケーションを AppleScript Studio で作成したのです。まぁ、その昔あった Script Runner のようなものですが。

Objective-C を導入する気持ち、非常によく分かります...。個人的には、Cocoa/Objective-C でアプリケーションを作成して Objective-C からAppleScript を呼び出すという方向で開発を行っています。なので、AppleScript Studio を使うのはある意味苦痛だったりします。あれもできない、これもできない、という感じで。

AppleScript Studio には、それなりにいいところがあるんですけどね。あるのかな?そう信じたい...。そんな AppleScript の最近の成果は、カレンダーです。それほど珍しいものでもないのですが、ちょっと、月ごとのカレンダーを簡単に参照したくて作ってみました。

Script Editor で開く

on run
    set calendarList to getCalendar(current date)
    set beginning of calendarList to {"日", "月", "火", "水", "木", "金", "土"}

    set calendarText to ""
    repeat with thisItem in calendarList
        set calendarText to calendarText & listToText(thisItem, tab) & return
    end repeat
    set calendarText to (date string of (current date)) & return & return & calendarText

    display dialog calendarText with icon 1 buttons {"OK"} default button 1 giving up after 15
end run

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 or num is greater than or equal to (daysInMonth + startOffset)) then
                set end of currentWeek to ""
            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

on listToText(theList, delimStr)
    set the AppleScript's text item delimiters to delimStr
    set theText to theList as text
    set the AppleScript's text item delimiters to ""
    return theText
end listToText

細かい部分を気にせずに作っているので実際に使うには不都合があると思いますが。getCalendar に date 値を渡せばその月のカレンダーをリストで返します。月によっては利用しないリストも含まれているのですが、それは気にしない。ダイアログで見る限りは、特に困らない。

AppleScript Studio でツールバーを使ってみる (2)

さて、何はともあれツールバーを使ってみましょう。AppleScript Studio では、Objective-C でデリゲートメソッドとして用意されているメソッドが toolbar クラスの属性として用意されています。AppleScript Studio ではこれらの属性を使ってツールバーを作成します。

ツールバーを利用するには、

  1. ウィンドウにつけるツールバーを作成
  2. ツールバーで利用出来るツールバーアイテムを登録
  3. デフォルトのツールバーアイテムを設定する
  4. ウィンドウに接続する

というステップを踏まなくてはいけません。これらのステップは、ツールバーを利用する上での最低限必要なものです。

それぞれのステップを具体的に見ていきます。

ツールバーは、ウィンドウに付加するものなのでウィンドウの awake from nib イベントハンドラを利用するのが手軽だと思います。まずは、プロジェクトを作成しウィンドウに awake from nib イベントハンドラを接続します。awake from nib ハンドラ内で上記のステップを行います。最初にツールバーを作成します。

set theToolbar to make new toolbar at end with properties {name:"new toolbar", identifier:"new toolbar", allows customization:true, display mode:default display mode, size mode:default size mode, auto sizes cells:true}

ツールバーの作成は make 命令で行います。ここで属性をまとめて設定しています。

name -- AppleScript がオブジェクトを判別するための名前
identifier -- ツールバーの一意の識別子
allows customization -- ツールバーのカスタマイズが行えるかどうか
display mode -- ツールバーアイテムの表示形式。アイコンのみか、アイコンとラベルか等
size mode -- ツールバーアイテムの表示サイズ
auto sizes cells -- ツールバーアイテムを自動で保存するか

これら以外にも属性はありますが、それらは後ほど。ところで、これらの属性の中の auto sizes cells ですが、これは auto saves configuration 属性のことです。この属性は、ユーザーがカスタマイズしたツールバーアイテム(ツールバーに表示される個々のオブジェクト)を自動で保存するかどうかの属性ですが、構文確認を行うとなぜか auto sizes cells になってしまいます。しかし、動作自体は正しく行われているようです。auto sizes cells は、matrix クラスの属性です。

ツールバーの作成が出来たら次にツールバーで利用出来るツールバーアイテムの登録を行います。Objective-C では、toolbarAllowedItemIdentifiers: というデリゲートメソッドで行いますが、AppleScript Studio では、toolbar クラスの allowed identifiers 属性を利用します。ツールバーは、ここに登録したツールバーアイテムのみが利用出来るようになります。ツールバーは、ツールバーアイテムの識別子を利用して個々のオブジェクトを判別します。AppleScript Studio は多くの場合、name 属性を利用して個々のオブジェクトを判別しますが、ツールバーでは name 属性ではなく identifier(識別子)を多用します。

ツールバーアイテムには、フレームワーク側が標準で用意しているツールバーアイテムがあります。

print item identifier -- 印刷
show colors item identifier -- カラーパネル表示
show fonts item identifier -- フォントパネル表示
customize toolbar item identifer -- ツールバーカスタマイズ
space item identifier -- スペース
flexible space item identifier -- 伸張可能なスペース
separator item identifier -- 区切り

いろんなアプリケーションがツールバーを利用していますが、どのアプリケーションでも共通しているツールバーアイテムがあります。それらはこういった標準で用意されているツールバーアイテムを利用しているのです。これら標準で用意されているものを使ってみます。

set allowed identifiers of theToolbar to {"print item identifier", "show colors item identifier", "show fonts item identifier", "customize toolbar item identifer", "space item identifier", "flexible space item identifier", "separator item identifier"}

ツールバーで利用出来るツールバーアイテムをここで設定します。繰り返しますが、ここでは name 属性ではなく identifier 属性を利用します。

次にデフォルトのツールバーアイテムを設定します。これまた、Objective-C では toolbarDefaultItemIdentifiers: として用意されているデリゲートメソッドが toolbar クラスの属性として用意されています。default identifiers 属性は、最初にツールバーに表示されるツールバーアイテムを設定する属性です。

set default identifiers of theToolbar to {"print item identifier", "customize toolbar item identifer"}

ここでもツールバーアイテムの identifier 属性をまとめたリストを指定します。最後にウィンドウにツールバーを設定します。

set toolbar of theObject to theToolbar

スクリプトの全体は以下のようになります。

on awake from nib theObject
    if name of theObject is "main" then
        set theToolbar to make new toolbar at end with properties {name:"new toolbar", identifier:"new toolbar", allows customization:true, display mode:default display mode, size mode:default size mode, auto sizes cells:true}

        set allowed identifiers of theToolbar to {"print item identifier", "show colors item identifier", "show fonts item identifier", "customize toolbar item identifer", "space item identifier", "flexible space item identifier", "separator item identifier"}
        set default identifiers of theToolbar to {"print item identifier", "customize toolbar item identifer"}

        set toolbar of theObject to theToolbar
    end if
end awake from nib

これでビルドして実行するとツールバーがついたウィンドウが表示されます。ツールバーをカスタマイズしてからアプリケーションを終了し、再度起動させるとカスタマイズされたツールバーが表示されます。この自動保存が先ほどの auto saves configuration 属性になります。

ざっと駆け足でしたが、ツールバーの詳しいことは次回。

AppleScript Studio でツールバーを使ってみる (1)

やっとと言うかなんと言うか...、AppleScript Studio 1.4 においてようやくツールバーがサポートされました(それを言うならやっとこのサイトで取り上げたですね)。AppleScript Studio 1.4 のリリースノートやサンプルプロジェクトを眺めてみて...これは、Objective-C で行う場合をそのまま AppleScript 的に書いているだけですね。

もっと、楽に実装できるのかと思いました。Objective-C の方も相変わらずコードの方からでないとツールバーを制御することができないわけですが。しかし、用意されているイベントハンドラが代表的なものだけしかないので細かい制御となると Objective-C で行わないといけません。この辺りがいかんともしがたいのですね。AppleScript Studio...。

サンプルとクラスの属性を見ただけですが、画像でのツールバーしか使えない?ポップアップメニューやテキストフィールドとかの UI を利用したツールバーは作れないのでしょうか?そういえば、AppleScript Studio で NSView を操作するのって出来なかったような。アプリケーション実行中にウィンドウの NSView を張り替えようと思って試してみて出来なかった記憶があります。試してみる前から暗雲が。。。

もし、UI を使ったツールバーが利用できないなら、いまいちですね。検索用のテキストフィールドをつけることすら出来ないのですから。

ともあれ、今月は AppleScript Studio を久しぶりにいじってみます。

Database Events (5)

処理速度はともかく、Database Events は、field の value 属性に実際のデータを保存します。用語辞書を見ると value 属性は値に anything と記述されています。SQLite は、バージョン 3 になって一応型が定義されています。本当に何でも value に設定できるのか試してみます。

ここまでで文字列と数値(実数、整数)がそのまま保存できるのは分かっています。前回、特に断っていなかったのですが、AppleScript の date も保存できています。value 属性を読み込むと date 型の値が返ってきます。

では、他のものではどうなるでしょうか。ということで以下のスクリプト。

Script Editor で開く

read file ((path to pictures folder as Unicode text) & "Safari.tiff") as data

AppleScript のいろんなデータを保存してみました。結論から言うと、上記スクリプトの中で保存、再読み込みが可能なのは date クラスと真偽値だけです(エラーにならないのですが、返ってくる値が一律 false になります)。alias 参照は、保存できますが読み込んだときにスラッシュ区切りの POSIX path に変換されてしまいます。

AppleScript の参照も保存できません。ということは、ある field の value に他のデータベースの field の参照をいれておくこともできません。その field を参照すると他のデータベースの field にアクセスするというようなことは無理ですね(というか、それは無茶)。

文字列で保存できるならほとんどの状況でどんなデータも保存できるので困ることもないと思います。それでも、リストやレコードなんかは内部で変換でもして保存して欲しい気もします。まぁ、多くの場合、画像を as data で保存することなんてないでしょうし、画像ファイルのパス文字列が保存できればそれでいいでしょう。リストもレコードも保存方法を考えると解決できるものです。ハンドラやスクリプトオブジェクトをそのまま保存できるなら、ハンドラデータベースが構築できると思ったのですが、これも文字列にしておけばいいですね。

そんなわけでデータベースに保存しておくのは文字列と数値にしておくのが無難です。

データベースの名前ですが、これは日本語も使えます。

Script Editor で開く

set manList to {{"山本", "浩二"}, {"金本", "雅次"}, {"園山", "香織"}, {"井上", "雅子"}}

tell application "Database Events"
    make new database with properties {name:"交友録"}
    tell database "交友録"
        repeat with i from 1 to count manList
            set recordValue to item i of manList as Unicode text
            set theRecord to make new record with properties {name:recordValue}
            tell theRecord
                make new field with properties {name:"姓", value:item 1 of (item i of manList)}
                make new field with properties {name:"名", value:item 2 of (item i of manList)}
            end tell
        end repeat
        save
    end tell
end tell

このようにして field にも日本語を利用することができます。もちろん以下のように取得も可能です。

Script Editor で開く

set theFolder to path to documents folder as Unicode text
set databaseFile to POSIX path of (theFolder & "データベース:交友録")

tell application "Database Events"

    tell database databaseFile
        name of records
        -- {"山本浩二", "金本雅次", "園山香織", "井上雅子"}
        value of field "姓" of records
        -- {"山本", "金本", "園山", "井上"}
        value of fields of (records whose value of field "名" of it contains "子")
        -- {"井上雅子", "井上", "雅子"}
    end tell
end tell

Database Events は、できたてのアプリケーションでまだまだ不安定なのか、よく反応が返ってこないことがあります。そんなときは、一度終了するともとに戻ります(System Events もですが...)。

Script Editor で開く

tell application "Database Events" to quit

また、単に処理に手間取ってなかなか結果が返ってこないこともあるので with timeout でタイムアウトも設定しておく方がいいかもしれません。

これまで長々と見てきましたが、Database Events は AppleScript で SQLite の全機能が利用できるということではなく、単純な行と列だけで表現する簡易データベースという感じです。機能的には新しい行の追加と削除ぐらいしかできないようで、行の並べ替えなんかは無理です(以前、例として載せたようなソートではなく、record をそのまま並べ替えることです)。並べ替えは実際にデータを表示するときに行えばいいのでそれほど問題はないですが、それだけコードが長くなるので、できれば実装して欲しいところです。

また、Database Events は、その用意されている用語からも分かるようにデータベースの中に複数の table を作ることもできません。プライマリーキーを設定してリレーショナルデータベースというのも(確証はないのですが、おそらく)できないでしょう。もちろん、SQLite でなら可能です。あれ? テーブルを指定できないということは、CoreData アプリケーションが保存した SQL フォーマットのデータベースも読むことができない、ということですね? ...できませんでした。。。てっきり、連携できると思っていたのですが。この辺りのことに期待していた人には悪い知らせです。すいません。

Terminal から sqlite3 コマンドを使うと分かるのですが、Database Events で作成したデータベースは、ZFIELD、ZRECORD、Z_METADATA、Z_PRIMARYKEY と 4 つのテーブルを持っています(midore さんに情報をいただきました。ありがとうございました)。ZFIELD で field が、ZRECORD で record が管理されているようです。Database Events は、これらのテーブルの内容を解析してデータを返しているようです。一方、CoreData アプリケーションが保存した SQL フォーマットのファイルもいくつかテーブルが作成されています。Developer Tools の CoreData のサンプルアプリケーション、OutlineEdit は次のようなテーブルを持っていました。ZNOTE、ZPRIORITY、Z_METADATA、Z_PRIMARYKEY。メタデータとプライマリーキーのテーブルは共通しています。こういうデータベースの作られ方というのは、CoreData を利用するときに特有のものなのでしょね(CoreData の資料にいい加減目を通さないと...)。

実際のところ、Database Events でデータベースを利用するためには、Database Events で利用できるデータ構成でないと駄目なのでしょう。sqlite3 を使えばどのアプリケーションが保存したデータベースも操作できるのですが、CoreData アプリケーションのデータベースを Database Events で利用することはできないということですね。

最後に。掲示板の方で Perl のハッシュのような使い方ができれば...とありました(TUNA さん。ありがとうございます)。ハッシュって連想配列ですよね? Perl 特有のデータ型の。Objective-C でいうところの辞書(NSDictionary)ですね。AppleScript で言えばレコード。あれは、Perl らしい使い方がいろいろと用意されていて便利ですね。Database Events で代用しようと思えば...、単純に record の name 属性をキーにして field をひとつ追加してその中にデータを入れておけばいいのでは? たとえば、次のような感じです。

Script Editor で開く

--すでに Hash.dbev というデータベースがある
set theFolder to path to documents folder as Unicode text
set databaseFile to POSIX path of (theFolder & "データベース:Hash.dbev")

--データの追加
my addRecord(databaseFile, "整数", 10)
my addRecord(databaseFile, "実数", pi)
my addRecord(databaseFile, "文字列", "我が輩は猫である")
my addRecord(databaseFile, "日付", current date)
--データの取得
getData(databaseFile, "整数")
--データの変更
setData(databaseFile, "文字列", "気は優しくて力持ち")
--キーの一覧を取得
keys(databaseFile)
--キーとデータをリストで取得
each(databaseFile)

on addRecord(databaseFile, keyStr, theData)
    tell application "Database Events"
        tell database databaseFile
            set theRecord to make new record with properties {name:keyStr}
            tell theRecord
                make new field with properties {name:"value", value:theData}
            end tell
            save
        end tell
    end tell
end addRecord

on setData(databaseFile, keyStr, newData)
    tell application "Database Events"
        tell database databaseFile
            set value of field "value" of record keyStr to newData
            save
        end tell
    end tell
end setData

on getData(databaseFile, keyStr)
    tell application "Database Events"
        tell database databaseFile
            set theResult to value of field "value" of record keyStr
        end tell
    end tell

    return theResult
end getData

on keys(databaseFile)
    tell application "Database Events"
        tell database databaseFile
            set theResult to name of records
        end tell
    end tell

    return theResult
end keys

on values(databaseFile)
    tell application "Database Events"
        tell database databaseFile
            set theResult to value of field "value" of records
        end tell
    end tell

    return theResult
end values

on each(databaseFile)
    tell application "Database Events"
        set theResult to {}
        tell database databaseFile
            set end of theResult to name of records
            set end of theResult to value of field "value" of records
        end tell
    end tell

    return theResult
end each

これでは使えるデータが文字列と数値のみですが。リストやレコードに対応すればもう少し便利に使えるかも。

Database Events (4)

気にはなっていたのですが、このサイトの RDF を Safari で表示するとスクリプトが見にくいですね。スクリプトのインデントを CSS で整形しているのでこうなってしまうのですが...。どうやって回避しようか。と、悩んでみる振りをしていますが、このままでいく可能性大ですが...。

Database Events (1)、Database Events (2)、Database Events (3) と続いてきましたが、基本的なことはいったん終了して他のことを調べてみます。まずは、誰もが気になる(と思う)処理速度。SQLite をコマンドラインで使用すると何万件とあるデータをコンマ xxx 秒といった感じで即座に取り込んでくれます。

AppleScript から Database Events を利用するのであれば、そこまでの速度は、期待できません。ともあれ、やってみます。

次のようなスクリプトを用意して current date で時間を計ってみました。

--テスト用データを作成
tell application "Mail"
    set dataList to {}
    set theList to messages of mailbox 2
    repeat with thisItem in (a reference to theList)
        set end of dataList to {subject of thisItem, sender of thisItem, date sent of thisItem}
    end repeat
end tell

tell application "Database Events"
    --データベースを作成
    make new database with properties {name:"Sample"}
    save database "Sample"
    tell database "Sample"
        set cd to current date -- 計測開始
        repeat with thisData in dataList
            set theRecord to make new record with properties {name:item 1 of thisData}
            tell theRecord
                make new field with properties {name:"sender", value:item 2 of thisData}
                make new field with properties {name:"date sent", value:item 3 of thisData}
            end tell
        end repeat
        set n to (current date) - cd --計測終了
        save
        return n
    end tell
end tell

Mail のメッセージでテストデータを作成し、それを新しく作成したデータベースに追加するスクリプトです。mailbox 2 の中には、1275 件のメールがありました。これらのデータを新規作成し、追加するのに 393 秒かかりました。約 6 分 30 秒です。ちょっと...遅くない?

いろいろ試してみたのですが、record の追加を一気に行うと速度的にはかなり遅くなります。どれぐらいのデータを一気に追加すると遅くなるか...。例えば、以下のようなスクリプトでデータ 1000 件を追加すると約 38 秒です。

Script Editor で開く

tell application "Database Events"
    make new database with properties {name:"Test"}
    save database "Test"
    tell database "Test"
        repeat with i from 1 to 1000
            make new record with properties {name:i as Unicode text}
        end repeat
        save
    end tell
end tell

このスクリプトで数を変えていろいろ試してみましたが、せいぜい我慢できるのは 100 件ぐらいまでです。ただ、すでに record が 1000 個ある状態で新しく record を 1 件追加しても速度が遅いというわけではないです。このように繰り返しで一気に追加するのが遅いのです。

速度のことでいえば、record の削除でも同じことがいえます。削除は、delete 命令で行えるのですが、record が 5000 件あるときに

delete records

とすると、タイムアウトになります。いつまでたっても削除処理が完了しないのでどれぐらい時間がかかるのか分かりませんが、削除のときも一気に削除を行おうとすると、いつまでたっても反応が返ってこない、という状態に陥ります。ただ、これも単純に一件を削除するだけなら処理速度的に問題はありません。

record の数が多くなったときに処理が遅くなるのは新規作成、削除のときだけではありません。フィルタ参照も遅くなります。これも、番号参照などで record を決め打ちするなら最初の record でも最後の record でも真ん中の record でも速度的には変わりません。

tell application "Database Events"
    tell database databaseFile
        record 1 -- 変わらない
        last record -- 変わらない
        middle record -- 変わらない
        some record -- 変わらない
        records whose name of it contains "10" --データ数が多いと遅くなる
        records 100 thru 200 --データの範囲が多いと遅くなる
    end tell
end tell

上記のように番号参照、相対参照、中央参照、任意参照といった取り出すデータ数が 1 つのときは、速度低下がありません。が、フィルタ参照は、データ(record)の数が増えるとそれだけ速度が低下します。範囲参照も一気に取り出すデータ数が多くなると速度が低下します。

この処理速度の遅さは、SQLite に問題があるのではありません。Database Events の問題だと思います。今後、改良されてもう少しましになるといいのですが、今のところ CSV を一気に取り込むなんて処理は期待できそうにないです。データを追加、削除するのは sqlite3 で行うとしても、フィルタ参照が遅くなるなら Database Events の使い道って著しく限定されてしまうような...。

Database Events (2)

前回、データベースを作成し、保存しました。今度は、データを追加していきます。データは、record と field で表現します。record が 行になり、field が列になります。最初に record を追加し、その record に field を作成し、データを追加していくという形になります。

Script Editor で開く

set theFolder to path to documents folder as Unicode text
set databaseFile to POSIX path of (theFolder & "データベース:MyDatabase.dbev")

tell application "Database Events"
    tell database databaseFile
        set newRecord to make new record with properties {name:"1"}
        save
    end tell
end tell

make で新しくオブジェクトを作成するとき、Database Events では at オプションが(なぜか)利用できません。ですので、データベースに tell して、その中で新しい record を作成します。record には、name 属性と id 属性があります。id 属性は、一意のもので Database Events が自動的に付加します。変更はできません。name 属性は、行の名前に当たるものですが、これは field "name" と同じものです。

分かりにくいですね。record を新しく作成したとき、既にひとつだけ field が追加された状態で作成されます。それが field "name" です。name という列がひとつだけある表と考えるといいでしょうか。record を作成し、name 属性を設定しているのですが、実際は field "name" に値を設定しているのです。この辺りが少し分かりにくいかもしれません。

field を作成するのも database や record を作成するときと同じ感じです。では、次のようなデータ(都道府県の県庁所在地と人口)をデータベースに追加してみます。

Script Editor で開く

set theData to {{|name|:"北海道", capital:"札幌", population:5691737}, {|name|:"青森県", capital:"青森", population:1504358}, {|name|:"岩手県", capital:"盛岡", population:1427987}, {|name|:"宮城県", capital:"仙台", population:2340145}, {|name|:"秋田県", capital:"秋田", population:1209196}, {|name|:"山形県", capital:"山形", population:1249165}, {|name|:"福島県", capital:"福島", population:2138605}, {|name|:"茨城県", capital:"水戸", population:2990472}, {|name|:"栃木県", capital:"宇都宮", population:1998186}, {|name|:"群馬県", capital:"前橋", population:2013753}, {|name|:"埼玉県", capital:"浦和", population:6838164}, {|name|:"千葉県", capital:"千葉", population:5863182}, {|name|:"東京都", capital:"東京", population:11680490}, {|name|:"神奈川県", capital:"横浜", population:8324355}, {|name|:"新潟県", capital:"新潟", population:2487980}, {|name|:"富山県", capital:"富山", population:1126782}, {|name|:"石川県", capital:"金沢", population:1175511}, {|name|:"福井県", capital:"福井", population:828087}, {|name|:"山梨県", capital:"甲府", population:883847}, {|name|:"長野県", capital:"長野", population:2299468}, {|name|:"岐阜県", capital:"岐阜", population:2108530}, {|name|:"静岡県", capital:"静岡", population:3754758}, {|name|:"愛知県", capital:"名古屋", population:6875723}, {|name|:"三重県", capital:"津", population:1855860}, {|name|:"滋賀県", capital:"大津", population:1316331}, {|name|:"奈良県", capital:"奈良", population:1447496}, {|name|:"和歌山県", capital:"和歌山", population:1094120}, {|name|:"京都府", capital:"京都", population:2561860}, {|name|:"大阪府", capital:"大阪", population:8624045}, {|name|:"兵庫県", capital:"神戸", population:5500842}, {|name|:"岡山県", capital:"岡山", population:1958385}, {|name|:"鳥取県", capital:"鳥取", population:618868}, {|name|:"島根県", capital:"松江", population:765980}, {|name|:"広島県", capital:"広島", population:2876405}, {|name|:"山口県", capital:"山口", population:1540354}, {|name|:"徳島県", capital:"徳島", population:835781}, {|name|:"香川県", capital:"高松", population:1035579}, {|name|:"愛媛県", capital:"松山", population:1517190}, {|name|:"高知県", capital:"高知", population:821199}, {|name|:"福岡県", capital:"福岡", population:4955439}, {|name|:"佐賀県", capital:"佐賀", population:883960}, {|name|:"長崎県", capital:"長崎", population:1537280}, {|name|:"大分県", capital:"大分", population:1238496}, {|name|:"熊本県", capital:"熊本", population:1870473}, {|name|:"宮崎県", capital:"宮崎", population:1188341}, {|name|:"鹿児島県", capital:"鹿児島", population:1790437}, {|name|:"沖縄県", capital:"那覇", population:1313804}}

tell application "Database Events"
    make new database with properties {name:"MyDatabase"}
    tell database "MyDatabase"
        repeat with thisItem in theData
            set thisItem to contents of thisItem
            set theRecord to make new record with properties {name:|name| of thisItem}
            tell theRecord
                make new field with properties {name:"capital", value:capital of thisItem}
                make new field with properties {name:"population", value:population of thisItem}
            end tell
        end repeat
        save
    end tell
end tell

やはり、保存はきちんと行っておきます。ここでは record の name 属性に県名を指定しています。