Archive for 3月, 2011

2011/03/31 日本語環境におけるwords ofの挙動が10.6で変わった?

本Blog読者の方からのタレコミで気づいたのですが、Mac OS X 10.6の日本語ユーザー環境で、文字列をwords ofあるいはevery wordで分割したときの挙動が、変わっているとのこと。

英語の文章をwords ofでparseした場合には、スペースで単語が区切られており、単語という単位が明確な英語なので、きれいにword(=単語)ごとに別れてくれます。

ところが、どこからどこまでが単語かという区分があいまいで、かつ単語に区分けするとかいう必要性が一般的にはそれほどない(大学のレポートを4000文字以上で、というオーダーはあったとしても、400ワードで書けという話は見かけたことがない)日本語においては、Appleの不甲斐なさもあって、words ofでparseしても、ひらがなやカタカナ、漢字など文字種類が変わる切れ目で区切られるという、変態仕様になっていました。

newt_on.jpg

そのため、人工知能インタフェース「Newt On」をAppleScriptで開発した際には、わざわざ日本語パーサーとしてMicrosoft Word v.Xを使ったほどですが……

Mac OS X 10.6で、この誰もアテにせず期待もしていなかったAppleScriptの日本語parse機能が向上したようです。

スクリプト名:words_of_result_1067
–Mac OS X 10.6.7の実行結果

set a to “翌日午前0:25〜翌日午前0:50(25分)”
set aList to words of a
–> {”翌日”, “午前”, “0″, “25″, “翌日”, “午前”, “0″, “50″, “25″, “分”}

set a to “原子力発電所”
set aList to words of a
–> {”原子”, “力”, “発電”, “所”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

どこかで見たようなparseの仕方だと思っていたら、Mac OS X 10.5から標準搭載されているMeCabのParse結果にそっくりです。

mecabtest.jpg

現在、Mac OS XにはSpotlightのインデックス作成用にMeCabが標準搭載されており、ちょっとしたプログラムを書くことでユーザーからも呼び出せるようになっています。

ちなみに、上記の結果を古いMac OS X上でためしてみた結果は以下のとおりです。

スクリプト名:words_of_result_1039
–Mac OS X 10.3.9の実行結果

set a to “翌日午前0:25〜翌日午前0:50(25分)”
set aList to words of a
–> {”翌日午前”, “0″, “25″, “〜”, “翌日午前”, “0″, “50″, “25″, “分”}

set a to “原子力発電所”
set aList to words of a
–> {”原子力発電所”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:words_of_result_10411
–Mac OS X 10.4.11の実行結果

set a to “翌日午前0:25〜翌日午前0:50(25分)”
set aList to words of a
–> {”翌日午前”, “0″, “25″, “〜”, “翌日午前”, “0″, “50″, “25″, “分”}

set a to “原子力発電所”
set aList to words of a
–> {”原子力発電所”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:words_of_result_1058
–Mac OS X 10.5.8の実行結果

set a to “翌日午前0:25〜翌日午前0:50(25分)”
set aList to words of a
–> {”翌日午前”, “0″, “25″, “翌日午前”, “0″, “50″, “25″, “分”}

set a to “原子力発電所”
set aList to words of a
–> {”原子力発電所”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/27 サウンド入出力の選択中の項目名を取得

「システム環境設定」で選択中のサウンド出力先、サウンド入力元の名称を取得するAppleScriptです。

例によってGUI Scriptingを用いているため、ユニバーサルアクセスの「補助装置にアクセスできるようにする」をチェックしておく必要があります。

sound0.jpg

sound00.jpg

また、OSのバージョンが上がると書き換える必要が出てきます。

soud1.jpg

ここで選択されているサウンド入力元の名称を取得します。

soud2.jpg

ここで選択されているサウンド出力先の名称を取得します。

スクリプト名:サウンド入出力の選択中の項目名を取得
set inRes to getSelectedSoundIntputName() of me
–> “内蔵マイク”

set outRes to getSelectedSoundOutputName() of me
–> “内蔵スピーカー”

–サウンド入力元の選択されている名称を取得
on getSelectedSoundIntputName()
  activate application “System Preferences”
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application “System Events”
    tell process “システム環境設定”
      click radio button 3 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute “AXVisibleRows” of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
tell table 1 of scroll area 1 of tab group 1 of window 1
        set aList to every row whose selected is true
        
set anItem to first item of aList
        
tell anItem
          set aStr to value of text field 1
        end tell
      end tell
      
    end tell
  end tell
  
  
return aStr
end getSelectedSoundIntputName

–サウンド出力先の選択されている名称を取得
on getSelectedSoundOutputName()
  activate application “System Preferences”
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application “System Events”
    tell process “システム環境設定”
      click radio button 2 of tab group 1 of window 1 –「出力」タブを選択
      
set vList to value of attribute “AXVisibleRows” of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
tell table 1 of scroll area 1 of tab group 1 of window 1
        set aList to every row whose selected is true
        
set anItem to first item of aList
        
tell anItem
          set aStr to value of text field 1
        end tell
      end tell
      
    end tell
  end tell
  
  
return aStr
end getSelectedSoundOutputName

–システム環境設定で「サウンド」に表示を切り替える
on displaySoundPaneInSystemPrefs()
  tell application “System Preferences”
    activate
    
set current pane to pane “com.apple.preference.sound”
  end tell
end displaySoundPaneInSystemPrefs

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/23 path toのじっけん

Mac OS X 10.6で知らない間に拡張されていたpath to命令の動作内容確認です。

新しいOSがリリースされても、従来のOSとの互換性を考慮してあまりAppleScript系の新機能について積極的に使ってはきませんでした。あえて避けてきた、という言い方の方が正しいかもしれません。

そのため、たまにStandard AdditionのAppleScript用語辞書を調べてみたりすると、知らない機能が乗っていたりして驚かされることがあります。

このpath toについては、心底驚きました。地味なので気づかなかったものでしょうか。最前面のアプリケーションのパスを求めるときには、System Eventsにfront most processのfileを問い合わせたりして取得していましたが、このpath toを使う方がずっと簡潔に記述できます。

pathto1.jpg

その他、path to resourcesなどといったAppleScript Studioでおなじみの命令もStandard Additionsに移管されてきているようで、Mac OS X 10.7でのAppleScript Studio廃止(かわりにAppleScript ObjC)をにらんで、System EventsやStandard Additionsに一部の有用な命令を移管してきているのかもしれません。

localized string命令が移管されてきているあたり、将来的には実行中のユーザーの言語環境に依存しないで任意の言語環境におけるアプリケーションのオブジェクト名を指定できるようになるとか、そういうことを検討しているのではないかと思わせるものがあります。

スクリプト名:path to meのじっけん
set safariPath to (path to application "Safari")
–> alias "Macintosh HD:Applications:Safari.app:"

set safariPath to (path to application id "com.apple.safari")
–> alias "Macintosh HD:Applications:Safari.app:"

set frontAppPath to (path to frontmost application)
–> alias "Macintosh HD:Applications:Utilities:AppleScript Editor.app:"

set curAppPath to (path to current application)
–> alias "Macintosh HD:Applications:Utilities:AppleScript Editor.app:"

set mePath to path to me –実行中のScriptをまだ保存していない場合
–> alias "Macintosh HD:Applications:Utilities:AppleScript Editor.app:"

set mePath to path to me –実行中のScriptを保存してある場合
–> alias "Macintosh HD:Users:maro:Documents:AppleScript:path to meのじっけん.scpt"

set curAppPath to (path to it)
–> alias "Macintosh HD:Users:maro:Documents:AppleScript:path to meのじっけん.scpt"

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/20 サウンド入力元、出力先を設定する

システム環境設定の「サウンド」で入力元、出力先を切り替えるAppleScriptです。

例によってGUI Scriptingのプログラムであるため、OSがアップデートした際には微妙な手直しが発生するはずです。

いいかげん、オーディオ入出力関連の切り替えごときは標準命令で持っていてほしいのですが……10.7で標準搭載してくれないものでしょうか。

スクリプト名:サウンド入力元、出力先を設定する
set aRes to setSountInputSource("ライン入力") of me
–> true(設定成功の場合。失敗の場合にはfalseを返す)

set aRes to setSountOutputSource("内蔵スピーカー") of me
–> true(設定成功の場合。失敗の場合にはfalseを返す)

–サウンド入力先を設定
on setSountInputSource(aName)
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 3 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
if aStr = aName then
          set selected of row i of table 1 of scroll area 1 of tab group 1 of window 1 to true
          
return true
        end if
      end repeat
    end tell
  end tell
  
  
return false
end setSountInputSource

–サウンド出力先を設定
on setSountOutputSource(aName)
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 2 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
if aStr = aName then
          set selected of row i of table 1 of scroll area 1 of tab group 1 of window 1 to true
          
return true
        end if
      end repeat
    end tell
  end tell
  
  
return false
end setSountOutputSource

–システム環境設定で「サウンド」に表示を切り替える
on displaySoundPaneInSystemPrefs()
  tell application "System Preferences"
    activate
    
set current pane to pane "com.apple.preference.sound"
  end tell
end displaySoundPaneInSystemPrefs

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/20 サウンド入力元、出力先の名称をリストで取得する

システム環境設定から、サウンドの入力元、出力先の名称をリストで取得するAppleScriptです。

よくあるGUI Scriptingのプログラムなので、Mac OS X 10.7になったら手直しが必要になること必至ではありますが、(個人的に)早急に必要になったので組んでみました。

スクリプト名:サウンド入力元、出力先の名称をリストで取得する
set outList to getEverySoundOutputName() of me
–> {"内蔵スピーカー", "PROPlantronics", "Soundflower (2ch)", "Soundflower (16ch)"}

set inList to getEverySoundInputName() of me
–> {"内蔵マイク", "ライン入力", "PROPlantronics", "Soundflower (2ch)"}

–サウンド出力先のリストを取得
on getEverySoundOutputName()
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 2 of tab group 1 of window 1 –「出力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
set the end of outList to aStr
      end repeat
    end tell
  end tell
  
  
return outList
end getEverySoundOutputName

–サウンド入力先のリストを取得
on getEverySoundInputName()
  activate application "System Preferences"
  
displaySoundPaneInSystemPrefs() of me
  
  
tell application "System Events"
    tell process "システム環境設定"
      click radio button 3 of tab group 1 of window 1 –「入力」タブを選択
      
set vList to value of attribute "AXVisibleRows" of table 1 of scroll area 1 of tab group 1 of window 1
      
set vCount to count every item of vList
      
      
set outList to {}
      
repeat with i from 1 to vCount
        set aStr to value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
        
set the end of outList to aStr
      end repeat
    end tell
  end tell
  
  
return outList
end getEverySoundInputName

–システム環境設定で「サウンド」に表示を切り替える
on displaySoundPaneInSystemPrefs()
  tell application "System Preferences"
    activate
    
set current pane to pane "com.apple.preference.sound"
  end tell
end displaySoundPaneInSystemPrefs

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/20 英語+数字連番フォルダをインクリメントして新規作成

選択中のフォルダ中に存在するアルファベットの単語(なんでも可)+連番の数字からなるフォルダの数字の並びから推測して、インクリメント(+1)した数字を持つフォルダを新規作成するAppleScriptです。

Script Menuに登録して使うことを前提に作ってみました。

fin_1.jpg

のような状態で実行すると……

fin_2.jpg

のように、通し番号を+1ふやしたフォルダを作成します。プログラムの開発作業を行いつつ、テストデータの出力先フォルダを新たに作って作業を行うようなときに使いました。

一応、番号部分を取り出してソートを行い、数字的に見て一番大きなものを検出して「最新の数字」を推測していますが、そもそも既存のフォルダ名称に「No.1 work1」のように複数の数字が登場するようなパターンは考慮していません。使用の際には注意が必要です。

スクリプト名:英語連番フォルダをインクリメントして新規作成
set aaSel to getFinderSelection() of me
if aaSel = false then return

tell application "Finder"
  
  
tell folder aaSel
    set nList to name of every folder
  end tell
  
  
set aList to {}
  
repeat with i in nList
    set j to contents of i
    
    
set aRes to retNumCharOnly(j) of me
    
try
      set aRes to aRes as number
    on error
      display dialog "選択されたフォルダ中には、連番の「アルファベット」+「数字」形式のフォルダはないようです。" buttons {"OK"} default button 1 with icon 1 with title "選択中フォルダ内のフォルダ名エラー"
      
return
    end try
    
    
set the end of aList to {aRes, j}
    
  end repeat
  
end tell

–フォルダ名を昇順ソート
set bList to shellSortListAscending(aList, 1) of me
set bLastItem to last item of bList
set {numItem, folName} to bLastItem
set numItemStr to numItem as string

–新規フォルダ名称に用いるべき数字を計算(+1)する
set numItemIncrement to numItem + 1
set numItemIncrementStr to numItemIncrement as string

–元のフォルダ名称から、数字部分を新規のものに差し替える
set newFolName to repChar(folName, numItemStr, numItemIncrementStr) of me

–得られたフォルダ名称で新規作成
tell application "Finder"
  make new folder at folder aaSel with properties {name:newFolName}
end tell

–与えられた文字列から、数字部分だけを返す
on retNumCharOnly(a)
  set aList to characters of a
  
  
set aResList to {}
  
  
set inF to false –アイテムへの取り込みフラグ:初期値=false(取り込まない)
  
set oneItem to ""
  
  
repeat with i in aList
    set j to contents of i
    
set aF to detectOutNumChar(j) of me –aF:現在のキャラクタがNumericかどうかの判定フラグ
    
    
if aF = true and inF = false then
      set inF to true
      
set oneItem to oneItem & j
      
    else if aF = true and inF = true then
      set oneItem to oneItem & j
      
    else if aF = false and inF = true then
      set the end of aResList to oneItem
      
set oneItem to ""
      
set inF to false
      
    else if aF = false and inF = false then
      –なにもしない
      
    end if
  end repeat
  
  
if oneItem is not equal to "" then
    set the end of aResList to oneItem
  end if
  
  
return aResList
  
–> {"100", "12", "88"}
end retNumCharOnly

–数字範囲外の文字があるかどうかをテストする
–数字の文字以外のものが入っていたらfalse
on detectOutNumChar(testText)
  –ANK文字列(大文字小文字は問わない)
  
set ankChar to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."}
  
  
set _testChar to testText as Unicode text
  
  
ignoring case
    repeat with i in _testChar
      set j to contents of i
      
if j is not in ankChar then
        return false
      end if
    end repeat
  end ignoring
  
  
return true
end detectOutNumChar

–シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

–Finderで選択中のフォルダを取得する
on getFinderSelection()
  tell application "Finder"
    try
      set aSel to selection as alias
    on error
      set aSel to {}
    end try
    
    
if aSel is not equal to {} then
      return aSel –selectionが存在していた場合
      
    else
      –念のため、FinderのWindowが1枚も開いていない可能性について検証しておく
      
set wCount to count every window
      
if wCount = 0 then return false –なんにもWindowが存在していなかったらfalseを返す
      
      
tell front window –「window 1」 と同じ
        –カラム表示/アイコン表示/リスト表示/カバーフロー表示の場合で共通
        
set aSel to target as alias
      end tell
    end if
  end tell
end getFinderSelection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/20 Finderで選択中のフォルダを取得する

Finderで選択中のフォルダを取得するAppleScriptです。

Finder上で選択中のファイルなりフォルダを対象にして処理を行うというのは、AppleScriptではよくある処理というか……あまりにも当たり前すぎて興味の対象にすらならない感がありますが、よくよく考えてみると……

fin_icon_1.jpg

のような状態というのは、何かが選択されているのでselectionを取得できるわけですが、

fin_icon_2.jpg

のような状態でも、一応ウィンドウで表示している対象が選択されている、といえなくはありません。

そこで、このような状況も考慮して「選択中のフォルダ」を返すルーチンを作ってみました。ただし……副作用もあって、複数のフォルダが選択されている状態を無視してその1階層上のフォルダを返すとか、そもそもファイルが選択されている状態は考慮していないとか、かなり用途が限られてくるものです。

スクリプト名:Finderで選択中のフォルダを取得する
set fRes to getFinderSelection() of me

–Finderで選択中のフォルダを取得する
on getFinderSelection()
  tell application "Finder"
    try
      set aSel to selection as alias
    on error
      set aSel to {}
    end try
    
    
if aSel is not equal to {} then
      return aSel –selectionが存在していた場合
      
    else
      –念のため、FinderのWindowが1枚も開いていない可能性について検証しておく
      
set wCount to count every window
      
if wCount = 0 then return false –なんにもWindowが存在していなかったらfalseを返す
      
      
tell front window –「window 1」 と同じ
        –カラム表示/アイコン表示/リスト表示/カバーフロー表示の場合で共通
        
set aSel to target as alias
      end tell
    end if
  end tell
end getFinderSelection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/03/08 aliasのリストをファイルの作成日でソートして返す

与えられたaliasのリストを各ファイルの作成日でソートして古い順に返すAppleScriptです。

ドラッグ&ドロップすると指定のプリンタにInDesignから印刷を行うAppleScriptのドロップレットを書いて使ってみたら、プリンタに送られる順番が目茶苦茶になってしまいました。

あとから印刷結果を手でソートすることほどむなしいことはありません。

そこで、ドロップレット用にファイルの作成日時でソートするサブルーチンを、汎用ルーチンの寄せ集めで作った次第です。

find1.jpg

こんな風にFinder上でファイルを選択しておいて本Scriptを実行すると、作成日時が古い順にソートして返してくれます。AppleScriptから数百ファイルもドキュメントを生成して、印刷しなければならないような場合でも、作成日時の古い順から印刷してくれます。

のんびりしていそうな割には、切実なニーズを満たすために作成したものだったりします。

スクリプト名:aliasのリストをファイルの作成日でソートして返す
tell application "Finder"
  set aSel to selection as alias list
end tell

–ファイル作成日でソート(古いものから新しいものへ)
set aliasRes to sortAliasByCreationDate(aSel) of me

–> {alias "Cherry:Users:maro:Documents:AppleScript:MacJournalで選択中のjournal entryのBlog公開ステータスを取得する.scpt", alias "Cherry:Users:maro:Documents:AppleScript:目に見えるプロセス一覧を取得する.scpt", alias "Cherry:Users:maro:Documents:AppleScript:最前面のアプリケーションを取得する.scpt", alias "Cherry:Users:maro:Documents:AppleScript:InDesignの文字置換機能を用いた文字置換.scpt", alias "Cherry:Users:maro:Documents:AppleScript:aliasのリストをファイルの作成日でソートして返す.scpt"}

on sortAliasByCreationDate(aliasList)
  
  
tell application "Finder"
    set aList to {}
    
    
repeat with i in aliasList
      set j to contents of i
      
set the end of aList to {j, creation date of j}
    end repeat
    
    
set cList to shellSortListAscending(aList, 2) of me –で作成日時でソート
    
    
    
set aliasList to {}
    
set fnCount to 1
    
repeat with i in cList
      set j to contents of (item 1 of i)
      
      
set the end of aliasList to j
    end repeat
  end tell
  
  
return aliasList
  
end sortAliasByCreationDate

–シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に