Archive for the 'MacJournal' Category

11/21 MacJournal 5.2.6でBlogへの投稿系AppleScriptコマンドを強化

macjournal_icon.jpgDan Schimpf氏が開発している職人気質のメモ集積ソフトウェア「MacJournal」。

このMacJournalバージョン5.2.6のβ版を調べたところ、AppleScript用語辞書が変更され、コマンドが増えていることを確認しました。

macjournal1.jpg

exportコマンドのオプションが増加

macjournal2.jpg

新設の「send text to blog」コマンド

あいにく、Blogは直接Webブラウザ上から更新しているため、MacJournalから更新をかけることはないのですが、こうしたコマンドはたしかに存在していることが期待されるものですね。

06/13 MacJournalで指定キーワードを含むジャーナルをリストアップ

MacJournalで、指定のキーワードを含むジャーナルを検索して、結果をリストアップし、選択したジャーナルを選択状態にするAppleScriptです。

MacJournalでは、キーワードを入力するとジャーナルエントリー(記事)を全文検索する機能が付いています。Mac OS XのSpotlightのようなもので、たしかに高速で便利なのですが……検索対象はあくまでジャーナルエントリー(記事)であって、ジャーナル(フォルダ)ではありません。

この、ジャーナル(フォルダ)自体だけを検索するための機能が存在しないため、自前で作ってみました。ヘタにジャーナルを大量に作ってしまったため、複数のジャンルに重複したジャーナルを作っていないかどうか、作ろうと思ったジャーナルがすでに存在しているのではないか……といったことを調べるのに、こうしたAppleScriptがないと大変です。というより、標準でこうした機能は用意してほしいところです。

ジャーナルの検索は、すべてのジャーナルを再帰でピックアップして、キーワードに合致するものだけを抽出リストに追加していきます。処理ロジックはかなり単純です。作る前には処理速度に不安があったのですが、ジャーナル(フォルダ)はジャーナルエントリー(記事)ほどには多くないので、それほど処理対象も無闇に増えず、常識的な処理時間で(MacBook Pro Core i7 2.66GHzで、1秒以下。検索対象はウンザリするほどジャーナルを作りまくった自分のMacJournal書類)。

mj1.jpg
▲検索キーワードを入力

mj2.jpg
▲キーワードがヒットした(含む)ジャーナル一覧を表示。心配したとおり、「デジタルラジオ」のジャーナルが複数存在していた

mj3.jpg
▲一覧から選択したジャーナルを選択状態に

journal entryをselected journal entryにする機能はあるのですが、joiurnalそのものを選択状態にする機能がないため、選択したjoiurnalのjournal entry 1を選択状態にしています。その際にエラーが生じたら(指定journalにjournal entryが1件もなかったら)、エラートラップで対応しています。

スクリプト名:MacJournalで指定キーワードを含むジャーナルをリストアップ
global nList, rList, nnList, rrList
set nList to {}
set rList to {}

set nnList to {}
set rrList to {}

set aKey to text returned of (display dialog “Journalの検索対象キーワードを入力してください” default answer “”)

tell application “MacJournal”
  tell document 1
    set j1List to every journal
    
set nList to every journal whose name contains aKey
    
if nList is not equal to {} then
      set nnList to nnList & nList
      
set rrList to rrList & name of every journal whose name contains aKey
    end if
    
getJournal(j1List, aKey) of me
  end tell
end tell

–ヒットしたジャーナル名称一覧を表示して、ユーザーに選択してもらう
set aRes to choose from list rrList default items (contents of first item of rrList)
if aRes = false then return –キャンセルされた場合の対応
set aRes to contents of first item of aRes

–選択した項目をジャーナル名リストから検索し、ジャーナル項目リストから合致したインデックスの項目を取り出す
set aCount to 1
set aF to false
repeat with i in rrList
  set j to contents of i
  
if j = aRes then
    set aF to true
    
exit repeat
  end if
  
set aCount to aCount + 1
end repeat
if aF = false then
  display dialog “MISS(あり得ないエラー?)”
  
return
end if

–実際に、MacJournal上で選択・表示する
tell application “MacJournal”
  set aResJounal to contents of (item aCount of nnList)
  
  
activate
  
tell document 1
    try
      set selected entry to journal entry 1 of aResJounal –ここがミソ!!
    on error
      display dialog “指定のジャーナルにはエントリーが1つも存在しませんでした(T_T)” buttons {“OK”} default button 1 with icon 1
    end try
  end tell
end tell

on getJournal(aList, aKey)
  repeat with i in aList
    tell application “MacJournal”
      tell i
        set j1List to every journal
        
set nList to (every journal whose name contains aKey)
        
if nList is not equal to {} then
          set nnList to nnList & nList
          
set rrList to rrList & (name of every journal whose name contains aKey)
        end if
        
getJournal(j1List, aKey) of me
      end tell
    end tell
  end repeat
end getJournal

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

05/03 MacJournal 5.2.1でエントリのtag情報(tags)を取得/設定

MacJournal 5.2.1で、エントリのキーワード(tag)の情報を取得、設定できるようになりました。

mj20.jpg
▲この状態のエントリのtag情報を取得すると……

tagsの情報を取得すると、tag情報がリストで返ってきます。

スクリプト名:MacJournalでエントリのtag情報を取得する
tell application "MacJournal"
  tell document 1
    set aSel to selected entries
    
repeat with i in aSel
      tell i
        set aKey to tags
        
–> {"radio"}
      end tell
    end repeat
  end tell
end tell

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

一方、取得するだけでなく設定もできます。以下のAppleScriptを実行すると、実際にtag情報が付加されたことをGUI側からも確認できます。

スクリプト名:MacJournalでエントリのtag情報を取得・設定する
tell application "MacJournal"
  tell document 1
    set aSel to selected entries
    
repeat with i in aSel
      tell i
        set aKey to tags
        
–> {"radio"}
        
        
set the end of aKey to "piyomaru"
        
set tags to aKey
      end tell
    end repeat
  end tell
end tell

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

mj21.jpg
▲tag情報「piyomaru」が追加された

05/03 MacJournal 5.2.1で「選択中のエントリ」の実装を増強。複数選択に対応

MacJournal 5.2.1で増強されたAppleScript用語辞書のうち、「選択中のエントリ」を扱うもの(selected entry/selected entries)を解説します。

McJournalでは、documentオブジェクトのプロパティとして「選択中のエントリ」を示す「selected entry」という属性値がありますが、これは表示中のエントリを指し示すもののようで、複数のエントリを選択状態にするとmissing valueが返ってきました。

mj10.jpg

mj11.jpg
▲1つのエントリ(記事)を選択中の状態

スクリプト名:MacJournalで選択中のエントリを取得する
tell application “MacJournal”
  tell document 1
    set aSel to selected entry
  end tell
end tell
–> journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”

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

mj12.jpg
▲複数のエントリを選択中の状態

スクリプト名:MacJournalで選択中のエントリを取得する2
tell application “MacJournal”
  tell document 1
    set aSel to selected entry
  end tell
end tell
–> missing value

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

MacJournal 5.2.1で追加された「selceted entries」では、1つのエントリが選択されていても、複数のエントリが選択されていても結果がリストで返ってくるようになっており、こちらのほうがAppleScript対応アプリケーションにおける一般的な実装になっているといえます。

スクリプト名:MacJournalで選択中のエントリを取得する3
tell application “MacJournal”
  tell document 1
    set aSel to selected entries –selceted entryとは挙動が違う
  end tell
end tell
–> {journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”} –1つのエントリを選択している場合
–> {journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”, journal entry 2 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”}–2つのエントリを選択している場合

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

05/03 MacJournal 5.2.1で大幅なAS用語辞書の増強が

MacJournalでは、バージョン5.1.3b6および5.2.1でAS用語辞書の改変が行われており、これから先もいろいろと改変がありそうです。

mj1.jpg

「よろずデータスクラップブック系」とでも呼ぶべきMacJournalのようなアプリケーションは、サーバー側にデータをため込み将来的にはサーバー側でさまざまな処理を行うことが予想される「Evernote」などのソフトウェアと、ローカルにデータを蓄えユーザーが好き勝手に処理できるMacJournalなどのソフトウェアの2系統に分化していきそうです。

MacJournalのAS用語辞書の増強は、Evernoteのローカル処理が箸にも棒にもつかない、まるで使い物にならないレベルであることに対して、ローカル処理での圧倒的な優位性を確保しようというものでしょうか。他のさまざまなアプリケーションと連携して処理を行うという意味において、Evernoteではまるっきり使い物にならないので、個人的には極力MacJournalを応援したいところです。

長い目で見れば、おそらくMacJournalがオンラインサービスとの連携や、場合によってはEvernoteをはじめとするサーバー側のサービスと連携するといった方向に進化していくのかもしれません。

Evernoteでは、データのバックアップ的な方向にしかAppleScript系の機能が実装されておらず、AppleScriptによって各種アプリケーションを連携させるようなワークフローにおいては、まるっきり使い物にならないのが現状です(ローカルのEvernoteアプリと通信するより、直接サーバーのAPIと通信したほうがやりやすそう)。

ローカル系では「Devon Think」がシソーラス(類語)辞書を背景に高度な検索処理を行ってくれていますが、DevonThinkのシソーラス辞書は英語にしか効かないのでイマイチな感じがします。

06/29 Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト

Safariで表示中のページ内容を、MacJournalの現在選択中のJournalにペーストするAppleScriptです。

AppleScriptに対応しているのに、実践的な機能が欠けているためにいまひとつ自動化しづらいMacJournal。一括自動処理はしづらくても、ワンアクションだけ自動化するのであればなんとか使えることでしょう。

MacJournalには、Webの内容をコピー&ペーストして内容をとっておいています。ブックマークだと、内容が消えたり、Blogなどはサイトごとなくなったりすることは日常茶飯事。ローカルなりWeb上のアルバムにとっておくなりしておく必要があることでしょう。

重要なページだとコピー&ペーストして必要な部分だけクリッピングしておくのですが、そうでもないページはこの程度で十分でしょう。もうちょっと改良して、Safariで表示中のページの内容を、CLIのWebレンダラーを併用してPDFに落としておいてから、MacJournalにPDFを取り込むところまで作り込むといい感じでしょうか。

スクリプト名:Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト
ページにフレームを使っていないことが前提条件
tell application Safari
  set wCount to count every window
  
if wCount = 0 then
    display dialog Safariでウィンドウがオープンされていません buttons {”OK“} default button 1
    
return
  end if
  
  
tell document 1
    set aURL to URL
    
set aTitle to name
  end tell
  
set aText to text of document 1 本文テキスト
end tell

MacJournalの操作
createNewEntryonMacJournal() of me

tell application MacJournal
  tell document 1
    set aSel to selected entry
    
set name of aSel to aTitle
    
set plain text content of aSel to (aURL & return & return & aText)
  end tell
end tell

MacJournalで新規エントリを作成して選択状態にしておく
on createNewEntryonMacJournal()
  activate application MacJournal
  
tell application System Events
    tell process MacJournal
      set aName to title of menu item 1 of menu 1 of menu bar item 3 of menu bar 1
      
if aName = 新規エントリー then 日本語環境用。他の言語環境では、ここのチェックを行わないか、あるいは書き換えること
        click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 Menu > New Entry
      end if
    end tell
  end tell
end createNewEntryonMacJournal

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

06/13 津田大介氏の最近の発言を取得してMacJournalにスクラップする

twitterrificをコントロールして、津田大介氏のtwitter上の発言を集めて、時系列順に並べかえ直して、MacJournalの指定のジャーナル内に新規ジャーナルエントリを作成して、そこに文章を入れるAppleScriptです。

mj11.jpg

▲twitteriffic上で津田大介氏によるテキスト中継が行われている様子

mj10.jpg

▲スクリプト実行後 MacJournalの指定エントリに発言内容がまとめられている

スクリプト名:津田大介氏の最近の発言を取得してMacJournalにスクラップする
津田大介氏のtwitter上の発言を集めてテキスト化
tell application "Twitterrific"
  set tList to every tweet whose screen name is equal to "tsuda"
  
set textList to {}
  
repeat with i in tList
    set the end of textList to {date of i, text of i}
  end repeat
end tell

set sortedList to shellSortListAscending(textList, 1) of me

set pureText to {}
repeat with i in sortedList
  set {aDate, aText} to i
  
set the end of pureText to (aText & return & return)
end repeat

set pureText to pureText as string

Journalの階層状況は個人によって異なるので、このまま動くわけではありません
ご自分の環境に合わせて書き換えて使ってみてください
tell application "MacJournal"
  tell document 1
    tell journal "個人"
      tell journal "業界動向"
        tell journal "音楽配信"
          tell journal "津田大介"
            set jRes to make new journal entry
            
tell jRes
              set plain text content to pureText
            end tell
          end tell
        end tell
      end tell
    end tell
  end tell
end tell

シェルソートで入れ子のリストを昇順ソート
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

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

04/15 MacJournalで任意のjournalをロックする(未遂)

MacJournal 5で、任意のjournalをロックするAppleScriptです……が、辞書に用語が記載されているものの、実際に書いてみると動きません(汗) 構文確認(コンパイル)までは行えるのですが、実行するとエラーになります。

MacJournalMacJournalであるかぎり、このへんのAppleScript系の機能が甘いのは直らないかもしれません(ーー;; もう少しまともになると、ずいぶん使えるのですが……いっそ、この程度ならAppleScript Studioで自分で作ってしまおうかと(汗)

スクリプト名:MacJournalで任意のjournalをロックする(未遂)
tell application "MacJournal"
  tell document 1
    set aSel to choose journal "ロックするJournalを選択"
    
tell aSel
      lock エラーになる!!
    end tell
  end tell
end tell

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

04/15 MacJournalで選択中のjournal entryをricher textに変換

MacJournal 5で、選択中のjournal entryを(プレーンテキストから)リッチテキストに変換するAppleScriptです。

mj532.jpg
▲変換前(プレーンテキスト)

mj540.jpg
▲変換後(リッチテキスト)

……実際には、データ内容は変わらず、プレーンテキストに対してデフォルト指定したフォントから、リッチテキストに対してデフォルト指定したフォントに表示が変わるだけです。

スクリプト名:MacJournalで選択中のjournal entryをricher textに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to richer text
      
一度スタイルつきテキストのエントリをplain textにして、
      
再度richer textに変更しても……書式が元に戻るわけではない
    end tell
  end tell
end tell

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

04/15 MacJournalで選択中のjournal entryをプレーンテキストに変換

MacJournal 5で、選択中のjournal entryをリッチテキストからプレーンテキストに変換するAppleScriptです。

mj530.jpg
▲変換前(リッチテキスト)

mj531.jpg
▲変換後(プレーンテキスト)

ただし、一度実行してしまうとメニューからアンドゥを実行しても元に戻りません。

スクリプト名:MacJournalで選択中のjournal entryをプレーンテキストに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to plain text
      
GUIからUndoを実行しても変換前の状態に復帰できないので注意!!
    end tell
  end tell
end tell

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

04/14 MacJournalでjournalを選択UIを表示しつつ表示

MacJournal 5で、選択UIを表示しつつjournalを選択するAppleScriptです。

mj520.jpg

スクリプト名:MacJournalでjournalを選択UIを表示しつつ表示
tell application "MacJournal"
  tell document 1
    set anEntry to choose journal with prompt "なんかjournalをえらんでね"
    
> journal 1 of journal 2 of journal 1 of application "MacJournal"
  end tell
end tell

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

04/14 MacJournalでjournal entryを選択UIを表示しつつ選択

MacJournal 5で、choose fileのようにjournal entryを選択する専用UIを表示するAppleScriptです。

mj510.jpg

UIの仕様で、複数のjournal entryを一度に選択することはできません。

スクリプト名:MacJournalでjournal entryを選択UIを表示しつつ選択
tell application MacJournal
  tell document 1
    set anEntry to choose entry with prompt どれかjournal entryをえらんでね
    
> journal entry 2 of journal 2 of journal 1 of application “MacJournal”
  end tell
end tell

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

04/14 MacJournalで選択中のjournal entryを取得する

MacJournal 5の鬼門、選択部分の取得を行うAppleScriptです。

MacJournal 5では、selectionで選択されているオブジェクトを取得できないようになっており、selected entryでアクセスする必要があることを知っておく必要があります。

さらに、選択中のJournalを取得できるわけではありませんし、選択中のjournal entryのparentを取得してJournalを取得することもできません。

また、表示中のjournal entryの本文中の選択部分を取得する、とかいった「よくありがちな」処理はできません。このあたり、いまひとつ作者のDan SchimpfがAppleScriptによるスクリプティングを理解していないのではないかと邪推してしまいます。

作者のDan Schimpfはいいやつなので、メールを出して指摘すると直るかもしれません。ただ、直すべき箇所が多すぎて、どこから指摘してよいのか分らないというのが困りものです。

スクリプト名:MacJournalで選択中のjournal entryを取得する
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
> journal entry 2 of journal 9 of journal 2 of journal 1 of application “MacJournal”
    
リストではなく、裸でオブジェクトが返ってくる(リストに入ってこない)
    
    
複数のオブジェクト(journal entry)が選択されている場合にはmissing valueが返ってくるが、この実装は間違い
  end tell
end tell

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

04/14 MacJournalでキーワード検索状態を解除

MacJournal 5で、「search for」コマンドによるキーワード検索モードに入ってしまった状態から復帰するAppleScriptです。これもあまりAppleScriptっぽい挙動ではありませんが、まあないよりはよいでしょう。

スクリプト名:MacJournalでキーワード検索状態を解除
tell application MacJournal
  tell document 1
    end search
  end tell
end tell

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

04/14 MacJournalで指定のキーワードによる検索

MacJournal 5で、指定キーワードによる全文検索を行うAppleScriptです。ただし、GUIのウィンドウ上からキーワードを入力したのとまるっきり同じであり、AppleScriptっぽい挙動(検索でヒットした結果journal entryがリストで返ってくる)を行うわけではありません。

mj53.jpg

mj52.jpg

スクリプト名:MacJournalで指定のキーワードによる検索
tell application MacJournal
  tell document 1
    search for ぴよまるソフトウェア
  end tell
end tell

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

04/14 MacJournalでjournal entryをexportできない

MacJournal 5にはexportコマンドが用意されているのですが、どうやってもこれは利用できませんでした。バグと思われます(v5.1.3)。

スクリプト名:MacJournalでjournal entryをexportできない
set dtPath to (path to desktop folder) as string

tell application MacJournal
  tell document 1
    tell journal 1
      tell journal プログラミング
        set jList to every journal entry
        
set fCount to 1
        
repeat with i in jList
          set j to contents of i
          
export j as plain text to (dtPath & exportedJ & (fCount as string) & .html“)
          
export {j} as plain text to (dtPath & “exportedJ” & (fCount as string) & “.html”)
          
htmlでもritch textでも、他の形式でもexportできない
          
exportする対象を裸で渡しても、リストで渡してもダメ
          
set fCount to fCount + 1
        end repeat
      end tell
    end tell
  end tell
end tell

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

04/14 MacJournalでjournalの階層をたどる

MacJournal 5でjournalの階層をたどるAppleScriptの記述例です。階層をたどっていくときに、オブジェクトの階層(journal)を順次もぐっていかなくてはならず、Mail.appのように複数階層を一気に指定するような記述ができないので、なかなか大変です。

mj51.jpg

すべてのjournalの階層をたどるためには、再帰処理でも書かないとダメかもしれません。処理時間もかなりかかりそうです。

スクリプト名:MacJournalでjournalの階層をたどる
tell application MacJournal
  tell document 1
    set n1List to name of every journal
    
> {”個人”, “会社関連”, “UNIX系アプリ”, “for DEMO”}
    
tell journal 1
      set n2List to name of every journal
      
> {”個人の活動”, “プログラミング”, “アプリケーション”, “周辺機器”, “Windowsアプリ”, “業界動向”, “私的な内容”, “戦略的な内容”, “DVD,映画”, “PiyoCast”, “家庭用グッズ”}
      
tell journal プログラミング
        set n3List to name of every journal
        
> {”REALbasic”, “Dylan”, “iPhone/iPod touchアプリケーション開発”, “インストーラ”, “アイコンデザイン”, “yuma”, “ruby”, “iTunes”, “AppleScript”, “Apple People”, “Newton Script”, “Theme”, “XML”, “Switch”, “Xcode”, “HTML”, “SMILE”}
        
tell journal AppleScript
          set j1Count to count every journal entry
          
tell journal entry 1
            set a to plain text content
            
journal entryに対してpropertiesの取得が行えない
            
ものすごくバグっぽい仕様
          end tell
        end tell
      end tell
    end tell
  end tell
end tell

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

04/14 MacJournalで書類のプロパティを取得

MacJournal 5で書類のプロパティを取得するAppleScriptです。

スクリプト名:MacJournalで書類のプロパティを取得
tell application MacJournal
  tell document 1
    properties
  end tell
end tell
> {modified:false, class:document, path:”/Users/maro/Library/Application Support/MacJournal/MacJournal Data.mjdoc”, selected entry:missing value, name:”MacJournal Data”}

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

04/14 MacJournalでアプリのプロパティを取得

MacJournal 5のアプリケーションのプロパティを取得するAppleScriptです。

MacJournal 5は、Webの内容をスクラップしておくスクラップブックとして活用しています。このソフトは、多くの機能がAppleScriptに対応しているように見えるのですが、AppleScript系の機能は割と作り込みが甘くて、「これはないんじゃない?」とか「バグでは?」といった実装が見受けられます。

AppleScript系の機能が甘いだけであり、普通にGUIから利用している分には使い勝手のいい、よいソフトだと思っています。

スクリプト名:MacJournalでアプリのプロパティを取得
tell application MacJournal
  properties
end tell

> {frontmost:false, class:application, version:”5.1.3″, name:”MacJournal”, selected entry:missing value, main document:document “MacJournal Data” of application “MacJournal”}

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