iOSのKindleアプリから、Kindleストアの商品ページを開くショートカット

6月 25th, 2020
[`evernote` not found]
Facebook にシェア

iOSのKindleアプリでは、Kindle電子書籍を直接購入できない。Appleのポリシーがうんたらかんたららしいが、とにかく不便だ。特にシリーズ物のコミックを読んでいるときなど、Safariで商品ページを開いては続刊を購入するという作業を繰り返さないといけない。

以前、Pythonistaを使い、Kindleアプリで開いている電子書籍の商品ページをSafariで開くスクリプトを作成した。商品ページが開けば、そこから続刊を買うのも楽だ。

調べてみると、iOS標準機能の「ショートカット」だけでも同様の処理ができることがわかったので作ってみた。「ショートカット」から下記のショートカットを作成。

Kindleアプリから「共有」→「Kindle商品ページをSafariで開く」を選ぶと、Amazonの該当ページが開く。

Markdownテキストを一瞬でPDFスライドに変換(macOS用)

2月 22nd, 2019
[`evernote` not found]
Facebook にシェア

Markdownテキストでプレゼンを行うDeckset

簡単なプレゼン用スライドを作らないといけないことが増えてきたのだけど、PowerPointやKeynoteでは正直かったるくてやっていられない。短いテキストとちょっとした画像を入れられればいいだけ……ということでたどり着いたのがMarkdown形式テキストをスライドに変換するというやり方。

Markdownでプレゼンを行うためのツールはいろいろ出ているけど、macOS用としてはDecksetの人気が高いようだ。Markdownを開くだけで、いい感じにレイアウトしてくれるし、ある程度スタイルもカスタマイズできるし、PDFとして出力もできる。

ただ、慣れてくるとさらに横着になってくるもので、いちいちDecksetを開かずにPDFに変換したくなってくる。

Deckset用に、Markdown to PDFというシェルスクリプトが公開されていたので、使ってみるとこれがなかなか便利。ターミナルからコマンドを打ち込むのも面倒になってきたので、macOSのFinderからクイックアクションですぐこのスクリプトを呼び出せるようにした。

Automatorでワークフローを作成する

macOSの「Automator」を起動して、「新規書類」→「クイックアクション」を選択。

「ワークフローが受け取る現在の項目」を「ファイルまたはフォルダ」、検索対象を「Finder.app」にする。

左側の「アクション」→「ユーティリティ」から「シェルスクリプトを実行」を、右側のワークフローにドラッグ・アンド・ドロップ。

「入力の引き渡し方法」を「引数にして」にし、先述のmarkdown-to-pdf.shの15行目以降の内容(OVERWRITE=0……という行以降)をペーストする(すごい適当な説明だ……)。作成したワークフローに適当な名前を付けて保存する。

※(すでに同名のPDFが存在する場合はエラーが発生するが、強制的にファイルを上書きしてもよいなら、「OVERWRITE=1」にしておく)

Finderからクイックアクションを呼び出す

あとは、変換したいMarkdownをFinder上で選択し、右クリック→「クイックアクション」から先ほど作成したワークフローを呼び出すだけ。Decksetが立ち上がって、PDFを出力する処理まで自動で行ってくれる。

ripgrep(rg)の検索結果をCotEditorで開いてタグジャンプ

2月 19th, 2019
[`evernote` not found]
Facebook にシェア



(2019年2月19日修正:macOS Mojaveでは外部のOSAXライブラリをサポートしなくなったため、satimageのライブラリを使わないように変更。正規表現のルーチンは、sed – Can’t figure out how to implement REGEX with AppleScript – Stack Overflowに掲載されていたものを使わせてもらった)

指定した文字列を含むテキストファイルを、特定のフォルダ内から検索。テキストエディタで検索結果を開き、該当ファイルの該当行を一発で開けるようにしてみました。
テキスト検索ツールとしてはripgrep、テキストエディタはCotEditor(macOS用)を使っています。

事前準備

ripgrepのインストール

Homebrewをすでに使っているなら、ターミナルから

brew install ripgrep

と入力するだけ。

テキストエディタCotEditorのインストール

CotEditorは、Mac App Storeからインストールできる。

ターミナルからCotEditorを起動できるようにする

CotEditorには「cot」というコマンドラインツールが用意されている。ターミナルから

ln -s /Applications/CotEditor.app/Contents/SharedSupport/bin/cot /usr/local/bin/cot

と入力してシンボリックリンクを作成する。

CotEditor用のスクリプトをインストール

下記のスクリプトを、macOS搭載の「AppleScriptエディタ」で入力して適当なファイル名を付け、CotEditorのスクリプトフォルダ(“~/Library/Application Scripts/com.coteditor.CotEditor”)に保存。私は「tagjump.@~j.scpt」という名前を付けた。

(※”@~”と付いているのは、command+option+jというショートカットキーでこのスクリプトを呼び出せるようにするため。詳しくはCotEditorのヘルプを参照)


use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
tell application "CotEditor"
	if exists front document then
		tell front document
			
			-- get selection's positional data
			set {locLength, selectionLength} to range of selection
			set {locLines, selectionLines} to line range of selection
			set looseSelect to 0
			-- whole lines select
			if (selectionLines is greater than or equal to looseSelect as number) then
				set line range of selection to {locLines, selectionLines}
				set {locLength, selectionLength} to range of selection
			end if
			
			-- ignore last line break
			if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
			set theSelection to contents of selection
		end tell
	end if
end tell

set regex to "^(/.+):([0-9]+):(.*)"
set aRes to re_match from theSelection against regex given replacement:"/usr/local/bin/cot $1 -l $2"
if aRes is not equal to {} then
	delay 0.2
	do shell script aRes
end if

on re_match against pattern from str given replacement:fmt
	set regex to current application's NSRegularExpression's ¬
		regularExpressionWithPattern:pattern ¬
			options:(current application's ¬
			NSRegularExpressionCaseInsensitive) ¬
			|error|:(missing value)
	
	(regex's stringByReplacingMatchesInString:str ¬
		options:0 range:{0, length of str} ¬
		withTemplate:fmt) ¬
		as text
end re_match

使い方

ターミナルからripgrepで検索を実行

ターミルから

rg -n -e 検索したいパターン 検索対象フォルダのフルパス | cot

と入力する。
フルパスを手入力するのは面倒くさいけど、Finderから対象フォルダをターミナルにドラッグ&ドロップすると簡単に入力できる。

検索結果がCotEditorで開かれる。

Ripgrep coteditor 1

CotEditor上からスクリプトを実行

開きたいファイル名のところにカーソルを移動し、スクリプトメニューから「tagjump.@~j.scpt」を実行(この場合は、command+option+jキーで実行できる)

該当ファイルの該当行がCotEditorで開かれる。

(2018/01/03追記)フルパスを書くのが面倒なら、例えば下記のようなシェルスクリプト(rgcot.sh)を書いておいて、「rgcot.sh 検索パターン」のように実行すると便利。この例では、カレントディレクトリ以下から検索パターンを検索し、結果をCotEditorで開く。

#!/bin/sh
abs_path=$(cd . && pwd)
rg -n -e $1 "$abs_path" | cot -n

iOS用Kindleアプリから、該当電子書籍のAmazon商品ページを開くスクリプト

12月 11th, 2018
[`evernote` not found]
Facebook にシェア


Appleの戦略のせいで、iOS用のKindleアプリから直接電子書籍を購入できなくて実に不便だ。マンガの続きの巻を読みたいと思っても、サンプルをダウンロードするか、ほしい物リストに追加するしかできなくて、実際に購入するにはSafariでいちいちAmazonのサイトにアクセスしないといけない。
そこで、Kindleアプリで読んでいる電子書籍の、Amazon商品ページをSafariで開くPythonスクリプトを書いてみた(スクリプトを実行するには、Pythonista 3が必要)。

■準備

①Pythonista 3上で下記のスクリプトを入力して、適当なファイル名を付けて保存。

import urllib.request
import re
import appex
from objc_util import *

def main():
    input_url = appex.get_url()
    if input_url == None:
        print("No URL")
    else:   
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
            }
        
        req = urllib.request.Request(input_url, None, headers)
        res = urllib.request.urlopen(req).geturl()
        
        regex = 'asin=([a-zA-Z0-9]+)'
        matchobj = re.search(regex, res)
        if matchobj:
            amazon_url= 'http://amazon.jp/dp/' +matchobj.group(1)
            UIApplication.sharedApplication()._openURL_(nsurl(amazon_url))

if __name__ == '__main__':
    main()

②Pythonista 3の”Settings”→”Share Extension Shortcuts”を選択。

IMG 1058

③「+」ボタンをタップして、先ほど保存したスクリプトを指定。

IMG 1059

■Kindleアプリからスクリプトを呼び出す

①Kindleアプリから、iOSの「共有」メニューを開き、「Run Pythonista Script」をタップ。
(Pythonista 3をインストールしているのにこの項目が表示されていない時は、共有メニューの「その他」から追加する)。

IMG 1060

②先に用意したPythonista 3のスクリプトをタップ。

IMG 1061

③Amazonの商品ページが開く。

IMG 1062

Karabiner Elements(macOS用)のみでNICOLA配列(親指シフト)

6月 11th, 2018
[`evernote` not found]
Facebook にシェア


macOS Sierra以降、キーボードカスタマイズツールの「Karabiner」が動作しなくなり、親指シフト入力(NICOLA)のために、Lacailleに乗り換えた。
Karabinerの方は、Karabiner Elementsになって着々とバージョンアップし、最近のバージョンではsimultaneous、つまり親指シフトで必要な同時打鍵のためのオプションが追加された。しかも、NICOLA配列のための設定ファイルまで用意されている! これなら、Lacailleを使わずKarabinerだけでMacの親指シフト環境を実現できる……と思ったら、残念、一部の配列だけを記述したサンプルでした。
しょうがないので、全部の配列を記述した設定ファイルを作成。システムに近いレベルで、キー入力の変換を行っているため、キーの取りこぼしがなくなり、動作もキビキビしている感じ。

(※ダウンロードして解凍した「Japanese-NICOLA.json」ファイルを、“~/.config/karabiner/assets/complex_modifications”に保存。Karabiner Elementsの「Preferences」→「Complex Modifications」タブ→「Rules」で、「Add rules」ボタンをクリック。リスト内から「Japanese NICOLA」の「Enable」ボタンをクリックして有効にする)

動作検証はMacBook Pro 13インチ/タッチバーなし、JIS配列モデル(2017)にて。「英数」キーを親指左シフト、スペースキーを親指右シフトとして使う設定。

コピー&ペーストで記述を追加していったら、設定ファイルが100KBを超えてしまったんだけど、はたしてこれでいいんだろうか。

P.S. Lacaille、Karabiner Elementsの作者さんに感謝です!

2018年11月24日(土) 追記

左シフト+「,」で、「ペ」の入力に失敗することがあったので修正。

2018年11月27日(火) 追記

右シフト+「6」「7」で半角の「[」、「]」、右シフト+「8」「9」で「(」「)」を入力するように修正。

2019年01月27日(火) 追記

右シフト+「う」で「ヴ」を入力する設定がされてなかった(!)ので修正

ヘトヘトになっても成果は出ない!ピョートル・フェリークス・グジバチ『Google流 疲れない働き方』

3月 12th, 2018
[`evernote` not found]
Facebook にシェア


「こんなにヘトヘトになるまで働いているのに、成果は全然出なくて、給料は上がらない……」なんて思っている人はいませんか?
でも、本当は逆。ヘトヘトになっているから、成果が出ないんですよ。
ポーランド出身で元Google社員のピョートル・フェリークス・グジバチが語る、究極の「心と体の整え方」。SBクリエイティブより発売中!(山路は構成をお手伝いしました)

■目次:

  • 序章 なぜ、毎日疲れるだけで、成果も上がらないのか
  • 1章 3倍の成果を出すための「集中力」と仕事のマネジメント
  • 2章 疲れる組織と疲れない組織
  • 3章 確実に自分をチャージする食事・睡眠・運動の習慣
  • 4章 疲れない働き方

勤続年数で決まる給与、果てしない残業……そんな会社にいるならどうする?青野慶久『会社というモンスターが、僕たちを不幸にしているのかもしれない。』

3月 8th, 2018
[`evernote` not found]
Facebook にシェア



成果ではなく勤続年数で決まる給与・役職や、果てしない残業、転勤など「社員を我慢させて働かせる仕組み」で回ってきた日本の会社。
・代表(社長)の夢やビジョンが見えない
・「お客様第一」と言いながら、現場では今月のノルマ達成の話ばかり
・若手社員のモチベーションが低く、新しいアイデアが出てこない
そんな会社にあなたが今いるとしたら、どうすべきか?

会社で楽しく働くために、サイボウズの実験から見えてきた“法則"=「モチベーション創造メソッド」と「フラスコ理論」とは?

『会社というモンスターが、僕たちを不幸にしているのかもしれない。』は、やりがいをもって働きたい人、転職を検討している人、仕事とプライベートの両立に悩んでいる人に加え、チームのマネジメントに悩むリーダー層にも今後の指針を与えてくれる1冊です。(山路は構成を担当しました)

第1章 仕事が楽しくないのは、カイシャというモンスターのせいかもしれない
第2章 カイシャで楽しく働くためには、こう考えればいいかもしれない
第3章 楽しく働けないカイシャは、どんどん弱っていくかもしれない
第4章 サイボウズでやってきた実験は、意外と参考になるかもしれない
第5章 未来のカイシャでは、「やりたいこと」につき進む人の価値が上がっていくかもしれない

『Googleの72時間』の韓国語版が発売されました

2月 1st, 2018
[`evernote` not found]
Facebook にシェア



随分前に、林信行氏といっしょに書いた『Googleの72時間 東日本大震災と情報、インターネット』の韓国語版が発売になりました。
日本語版の発売が2013年なので5年近く前の書籍なんですが、翻訳版が出るというのはうれしいですね。
日本語←→韓国語の機械翻訳は10年くらい前でもかなりの精度だったようですが、最近はさらに精度が上がって翻訳コストが下がっているのかもしれませんね。昔書いた本の韓国語版が出たという知り合いの話もちらほら聞きますし。

30年間の平成消費を俯瞰する、原田曜平の『平成トレンド史 これから日本人は何を買うのか?』

1月 10th, 2018
[`evernote` not found]
Facebook にシェア


バブルの絶頂期で始まった平成時代。しかし長引く不況、リーマンショック、東日本大震災などで消費は冷え込んでいった。消費者のマインドはどのように変化したのか? そして今後、日本人は何を買うのか?
『ヤンキー経済』などで知られるマーケティングアナリスト、原田曜平が、平成のトレンドと、これからの消費の可能性を語る『平成トレンド史 これから日本人は何を買うのか?』、1月10日発売です。(山路は構成を担当しました)

<目次>
・第1期:1989~1992年(平成元年~4年)不自由と享楽
・第2期:1993~1995年(平成5年~7年)デフレと団塊ジュニア
・第3期:1996~2000年(平成8年~12年)ネットとケータイ
・第4期:2001~2006年(平成13年~18年)変化への期待
・第5期:2007~2012年(平成19年~24年)失望と不安
・第6期:2013~2017年(平成25年~29年)SNSと炎上

Markdownの見出しレベルを変更するスクリプト(CotEditor用)

1月 9th, 2018
[`evernote` not found]
Facebook にシェア


CotEditorでMarkdownのテキストを書いている時、見出しレベル(#で始まる行)をショートカットキーで変更できると便利そうだと思ったので、スクリプトを書いてみました。
下記のスクリプトをmacOS標準のAppleScriptエディタで入力し、適当なファイル名を付けて、CotEditorのスクリプトフォルダに保存します。
ファイル名例に付いている「^@k」、「^@j」というのはショートカットキーの指定(CotEditorの機能)。ここでは、control+command+kで見出しレベルを下げる、control+command+jで上げるように設定しています。

見出しレベルを下げる(md_heading_down.^@k.applescript)

tell application "CotEditor"
   if exists front document then
      tell front document
            if coloring style is not in {"Markdown"} then
              quit
           end if
         
           -- get selection's positional data
         set {locLength, selectionLength} to range of selection
         set {locLines, selectionLines} to line range of selection
          set looseSelect to 0
           -- whole lines select
          if (selectionLines is greater than or equal to looseSelect as number) then
             set line range of selection to {locLines, selectionLines}
              set {locLength, selectionLength} to range of selection
         end if
         
           -- ignore last line break
          if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
          
           -- get contents
            set theSelection to contents of selection
          if rich text 1 of theSelection is equal to "#" then
                set contents of selection to "#" & theSelection
            end if
     end tell
   end if
end tell

見出しレベルを上げる(md_heading_up.^@j.applescript)

tell application "CotEditor"
   if exists front document then
      tell front document
            if coloring style is not in {"Markdown"} then
              quit
           end if
         
           -- get selection's positional data
         set {locLength, selectionLength} to range of selection
         set {locLines, selectionLines} to line range of selection
          set looseSelect to 0
           -- whole lines select
          if (selectionLines is greater than or equal to looseSelect as number) then
             set line range of selection to {locLines, selectionLines}
              set {locLength, selectionLength} to range of selection
         end if
         
           -- ignore last line break
          if contents of selection ends with "
" then set range of selection to {locLength, selectionLength - 1}
          
           -- get contents
            set theSelection to contents of selection
          if (selectionLength ≥ 2) and (rich text 1 thru 2 of theSelection is equal to "##") then
              set contents of selection to rich text 2 thru -1 of theSelection
           end if
     end tell
   end if
end tell