読者です 読者をやめる 読者になる 読者になる

PCで編集し、iPhoneのウィジェットで開くEvernoteの同期メモ(+AppleScript)

その他 その他-ワークフロー紹介 その他-Mac

f:id:four_or_three:20170301163307j:plain

EvernoteのノートブックをPCとiPhoneウィジェット間で同期させる方法を紹介します。
PCで取ったメモをiPhoneでさっと確認する用途に。

手順

  1. PC/MacEvernoteでノートブックを作成し、ショートカットに登録 f:id:four_or_three:20170301161010j:plain
    この作業は、メモを取るならショートカットに入れておくと楽だよねというだけのことです。

  2. iPhoneウィジェットにワークフローを配置

▼インポート
https://workflow.is/workflows/1cb44d52502a45ecbf54ea47612e8bf9

・In Notebookで手順1 のノートブックを指定
・表示する順番を変えたい場合はFilter FilesアクションのSort byを設定

動作させるとこんな感じ。

f:id:four_or_three:20170301161546p:plain:w250
    ↓
f:id:four_or_three:20170301161556p:plain:w250

OKをタップするとEvernoteでノートを開きます。

このワークフローは、単に特定のノートブックのノートを素早く開きたいという用途でも使用できます。
その場合は、Show Alertアクションを削除するといいと思います。

実行のたびにEvernote APIの帯域を消費しますので、短い時間で多用するとAPIの使用制限が発動するかもしれません(使用制限は1時間で解除)。

ノートブックを一発で開くAppleScript

BetterTouchToolやAlfred等でキーボードショートカットやキーワード起動に設定しておくと、同期メモにすばやくアクセスできます。

set THE_NOTEBOOK to "ノートブック名"

tell application "Evernote"
    if application "Evernote" is running then
        activate
    else
        activate
        delay 1
    end if
    set opened_windows to every window
    if opened_windows is not {} then
        repeat with the_window in opened_windows
            set the_name to name of the_window
            if the_name is THE_NOTEBOOK & " — Evernote" then
                if (visible of the_window) is true then
                    set visible of the_window to false
                end if
                set visible of the_window to true
                return
            end if
        end repeat
    end if
    open collection window with query string "notebook:" & THE_NOTEBOOK
end tell

Make Video from GIF

Actions Actions-Photos & Video

f:id:four_or_three:20170228221246p:plain:w250

GIFアニメをビデオ(mp4)に変換します。

  • Loop n Times : GIFアニメをn回ループさせてビデオ化
    • 元のGIFアニメ1ループ分をn回繰り返し
      例えば、元のGIFアニメが3ループしていても3n回繰り返しとはならない

[Input](単体)
アニメーションGIF(Giphyアイテム、App Store app、メディアファイル、Contact、リッチテキスト、iTunes artist、iTunes media、画像、Photo media、iTunes product、Location、Bar code、Evernoteノート)

[Result]
ビデオ(メディアファイル)

Open In...

Actions Actions-Documents

f:id:four_or_three:20170224222433p:plain:w250

Inputしたファイルを他のアプリへOpen In(コピーを引き渡す)します。
Open URLs等と同様、他のアプリへ遷移しますので、戻ってきてフローの続きをしたい場合は後段にWait to Returnを入れておく必要があります。

  • Show Open In Menu
    • ON : メニューを呼び出してアプリを選択
    • OFF : Open Inするアプリをあらかじめ設定しておく
      • Workflowがサポートしているアプリのみ
      • サポートしていないアプリは、検索結果から簡単にリクエストできる

[Input](単体)
ファイル

[Result]
Inputをそのまま出力

Mac +「Run Script Over SSH」 超簡単 openコマンドの使い方

その他 その他-Tips

リモートコンピュータに接続し、スクリプトを実行する「Run Script Over SSH」アクションは大変便利ですが、使いこなすにはシェルスクリプトやその他のプログラミング言語の知識が必要なため、なかなかハードルが高いアクションです。

今回は、特別な知識が不要でそこそこ使いでのある、Macのopenコマンドの使い方を紹介します。

WorkflowからMacSSH接続するための設定は、Run Script Over SSHを参照下さい。

openコマンドでできること
  • ファイルを開く
  • フォルダを開く
  • URLを開く
  • アプリを起動する
  • アプリにファイルやフォルダ(の中のファイル全部)やURLを渡す

基本

open "開きたいもの"

openスペースに続いて、開きたいものをダブルクォーテーションで囲って記述します。
開きたいものの部分には、ファイルのフルパス、フォルダのフルパス、URLを記述します。

jpegファイルをデフォルトアプリケーションで開く

open "/Users/ユーザ名/Downloads/abcde.jpg"

DropboxフォルダをFinderで開く

open "/Users/ユーザ名/Dropbox"

あるいは

open "$HOME/Dropbox"

Googleをデフォルトブラウザで開く

open "https://www.google.co.jp"

アプリを起動する

open -a "英語のアプリ名"

英語のアプリ名は、"◯◯.app"の◯◯の部分です。 スペースや、大文字小文字も正確に。

アプリ名がFinder上で日本語表記になっているものは、「情報を見る」を開き、中ほどにある「名前と拡張子」の項目で英語名が確認できます。

Chromeを起動する

open -a "Google Chrome"

アプリにファイルやURLを渡す

open -a  "英語のアプリ名" "渡すもの"

渡すものの部分には、ファイルのフルパス、フォルダのフルパス、URLを記述します。

GoogleFirefoxで開く

open -a "Firefox" "https://www.google.co.jp"

jpegファイルをSkitchで開く

open -a "Skitch" "/Users/ユーザ名/Downloads/abcde.jpg"

複数開く

open "開きたいもの1"
open "開きたいもの2"
...

▼複数のjpegファイルをデフォルトアプリケーションで開く

open "/Users/ユーザ名/Downloads/abc.jpg"
open "/Users/ユーザ名/Downloads/def.jpg"

GoogleYahoo!Chromeで開く

open -a "Google Chrome" "https://www.google.co.jp"
open -a "Google Chrome" "http://www.yahoo.co.jp"

アプリのURLも開ける

Evernoteのノートリンクを開く

open evernote:///view/◯◯◯

▼OmniFocusのタスクのリンクを開く

open omnifocus:///task/◯◯◯

もっと色々やりたい時の参考

コマンド/open - MacWiki

Correct Spelling

Actions Actions-Text

f:id:four_or_three:20170222222805p:plain:w250

Inputしたテキストのスペル(英語)を修正します。


[Input](単体、複数)
テキスト

[Result]
テキスト

デスクトップからたすくまへ最速でタスクを登録するAutomatorアプリとシェルスクリプト

その他 その他-Mac

プッシュ通知サービスのPushoverを使って、たすくまのタスク登録用URLスキームをMacからiPhoneへサクッと送信するAutomatorアプリを作りました。 

中身はただのシェルスクリプトなので、Bash on Windowsで動作させるのも可能なのではないかと思います。多分。
Windows用に多少手直ししたコードをこの記事の最後に載せておきます。

最近Pushoverのライセンスを購入しましたので、サービスが長く続いてくれるよう応援の意味も込めたエントリーです。


▼母艦のキーボードでタスクをタイプしてOKすると
f:id:four_or_three:20170218110307j:plain
▼5秒くらいで登録用URLがiPhoneに届きます
f:id:four_or_three:20170218105850p:plain:w250

青い文字にリンクが貼られています。

今回のエントリーでは、基本となるキーボードでテキストを入力するアプリと、テキスト選択の右クリックから実行するAutomatorサービスを紹介します。
エクセルのセルコピーから一括送信とか、WorkFlowyの選択コピーから一括送信できるバージョンなどは、需要がありましたら。

ダウンロード

https://www.dropbox.com/sh/1mo74u8wkpn3ml7/AADNrXlEYmlQ4jdGcl3WNrGVa?dl=0

◯◯.appがアプリ、◯◯.workflowがサービスです。
サービスはダブルクリックでインポートされます。


↓このエントリーとは直接関係はありませんが、Pushoverを補助するツール2つ作ったやつ

使用開始までの手続き

  1. iPhoneにPushoverをインストール後、Pushoverのアカウントを作る

    Pushover Notifications

    Pushover Notifications

    • Superblock
    • ユーティリティ
    • 無料
    有料アプリですが、7日間はフル機能がお試しできます。
    過去にお試ししたことがある場合でも、再試用は可能だと思います。

  2. PushoverのSettingsでUser Keyとデバイス名を確認する

  3. https://pushover.net/apps/buildで新規アプリを登録し、APIトークンを発行
    Type:Script、Description:適当、URL:空欄、Icon:なしでOK
  4. アプリ、サービスをAutomatorで開き、シェルスクリプトの1〜3行目に2.3.を記入して上書き保存
    サービスは/Users/ユーザ名/Library/Servicesにあります。

以上で完了です。

アプリ版は、初回起動だけ 右クリックメニュー → 開く、として下さい。

サービス版の「変数の値を設定」、「テキストの入力を求める」の2つのアクションは、右クリックで取り込んだテキストに見積もり時間やプロジェクトを追記するためのものですので、必要ない場合はこの2つのアクションを削除してください。

入力するテキストの書き方

基本
タスク1<tab>20<tab>プロジェクト1
タスク2<tab>30<tab>プロジェクト2


このように、タスク名と見積もり時間とプロジェクト名をタブ文字で区切って記述します。
これを基本として、だいたいどのような書き方でも読み込めるようになっています。

タスク名だけ

以下5例はどれもOKな書き方です。
タスク1
タスク1<tab>
タスク1<tab><tab>
タスク1<tab>0
タスク1<tab>0<tab>

タスク名と見積もり時間

以下2例はどれもOKな書き方です。
タスク1<tab>20
タスク1<tab>20<tab>

タスク名とプロジェクト名

以下3例はどれもOKな書き方です。
タスク1<tab>プロジェクト1
タスク1<tab><tab>プロジェクト1
タスク1<tab>0<tab>プロジェクト1

その他

見積もり時間は全角数字でもOK
タスク1<tab>20<tab>プロジェクト1

空行OK

タスク1<tab>15<tab>プロジェクト1
タスク2<tab>20<tab>プロジェクト2

タスク3<tab>10<tab>プロジェクト3

コード

標準入力を読み取って、たすくまの登録URLを生成し、Pushoverにポストするシェルスクリプトです。
Windowsで動く(かもしれない)ように若干手直ししています(動くかもしれない)。

Macでは動きませんのでご注意。

▼使い方

$ bash this_script.sh < task_list.txt


文字コードShift-JIS、改行コードCRLFのテキストを標準入力に読み込ませてください。
テキストの書き方は、上記の「テキストの書き方」を参照下さい。

実際に使用する際には、まず上記の起動コマンドをシェルスクリプトとして保存(launch.sh)して、chmodコマンドで実行権限を与えておき、

をバッチファイルか何かで自動化できれば、MacAutomatorを使う場合と比べてそう遜色のない使い勝手になるのではないでしょうか。

#!/bin/bash

readonly APP_TOKEN="your app token"
readonly DEVICE="your device"
readonly KEY="user key/group key"
readonly TITLE="🐻たすくまに登録"
readonly SOUND="pushover"
readonly FONT_SIZE="3"

function curl_pushover() {
    curl -f \
        --form-string "token=$APP_TOKEN" \
        --form-string "user=$KEY" \
        --form-string "device=$DEVICE" \
        --form-string "title=$TITLE" \
        --form-string "sound=$SOUND" \
        --form-string "html=$1" \
        --form-string "message=$2" \
        --form-string "url=$3" \
        https://api.pushover.net/1/messages.json
}

function post_message_pushover() {
    local count_total=0
    local num_message=0
    local str_joined=()
    for line in "$@"
    do
        count_total=$(($count_total + ${#line} + 2))
        if [ $count_total -gt 990 ]; then
            ((num_message++))
            count_total=$((${#line} + 2))
        fi
        str_joined[$num_message]+="\n$line\n"
    done
    local url=""

    i=1
    for var in "${str_joined[@]}"
    do
        local message=$(echo -e "$var")
        if [ ${#str_joined[@]} -gt 1 ]; then
            message="(${i}/${#str_joined[@]})$message"
        fi
        message="<font size=\"${FONT_SIZE}\">${message}</font>"
        curl_pushover "1" "$message" "$url"
        if [ $? != 0 ]; then
            return 1
        fi
        ((i++))
    done
}

function url_encode() {
    echo "$1" | perl -MURI::Escape -lne 'print uri_escape($_)'
}

function change_to_halfnum() {
    echo "$1" | sed 'y/1234567890/1234567890/'
}

function is_numeric() {
    expr "$1" + 1 >/dev/null 2>&1
    if [ $? -lt 2 ]; then
        echo 0
    else
        echo 1
    fi
}

IFS_original=$IFS
IFS=$'\t'

text_input=$(iconv -f SHIFT-JIS -t UTF-8 | tr -d '\r' | grep -v ^\s*$)

if [ -z "$text_input" ]; then
    exit 1
fi

i=1
while read line
do
    set -- $line
    task="$1"
    task_encoded=$(url_encode "$1")
    if [ -z "$2" ]; then
        est_time=0
        project=""
        project_encoded=""
    else
        est_time=$(change_to_halfnum "$2")
        if [ $(is_numeric "$est_time") = 0 ];then
            project="$3"
            project_encoded=$(url_encode "$3")
        else
            est_time=0
            project="$2"
            project_encoded=$(url_encode "$2")
        fi
    fi
    description="$task | ${est_time}分 | $project"
    url_scheme="taskuma://add?taskname=${task_encoded}&estimated=${est_time}&project=${project_encoded}"
    message_arr=("${message_arr[@]}" "${i}. <a href=\"${url_scheme}\">${description}</a>")
    ((i++))
done << EOS
$text_input
EOS

IFS=$IFS_original

if [ ${#message_arr[@]} = 1 ]; then
    message="<font size=\"${FONT_SIZE}\"><a href=\"${url_scheme}\">${description}</a></font>"
    curl_pushover "1" "$message" "$url_scheme"
else
    post_message_pushover "${message_arr[@]}"
fi