もう一人のY君

iPhoneアプリのレビューやアップデートレビューなどを書いています. たまに数学の記事も書きます.

もう一人のY君 MENU

【iPhoneショートカット】USLauncherのコンテンツを追加しました【20211201】

f:id:thetheorier:20201201145203p:plain

 定例のデータ更新です.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

ダウンロード

www.dropbox.com

 基本的には過去に保存した場所と同じフォルダーにすると楽です.

 ※リクエストに伴い個別配布した方もこちらに差し替えてください.

 

 USLauncher自身の更新はありません.

 RoutineHub • USLauncher ver3.1

 

 

URLスキームの追加・削除

 バージョンの後ろに"?"がついているものは, 調べたバージョンより古いバージョンから変更された可能性があります.

 

 

  • Amazon Z to Z v4.0.5156
    追加:pendo-3117a84d://
  • Box v5.7.0
    追加:box-diagnosis-intunemam://
    追加:msauth.com.microsoft.intunemam://
    追加:msauth.net.box.BoxNet://
    追加:msauth.net.box.BoxNet-intunemam://
  • Drafts v29.1
    追加:com.googleusercontent.apps.639604012593-s8nrj1rbjoa8ajhoksm01fs2gqmpq6ks://
  • Kumoo v1.4.1
    追加:sa248b9bb5://
    追加:twitterkit-57rNIn8BQ9g6uAMSP1OBlvnIS://
  • LastPass Authenticator v2.2.0
    追加:pendo-abe73a54://
  • Microsoft Lists v1.52.5
    追加:msauth.com.microsoft.splists://
  • Microsoft Whiteboard v21.11118.0
    追加:ms-whiteboard-preview://
  • Spark by Readdle v2.11.6
    追加:yahoo.com.readdle.smartmail://
  • 快手 v9.10.10
    追加:ks714102017905734181://
  • 原神 v2.3.0
    追加:hoyolabsdk-26180937://
  • 雀魂 v2.9
    追加:majsoulappjp://
    追加:majsouliosjp://
  • セブン-イレブン v2.6.1
    追加:openwebview://
  • ドラゴンクエスト ダイの大冒険 v1.1.0
    追加:dqdai-souls://
  • ドラゴンボールオフィシャルサイトアプリ v1.0.5
    追加(new):dbosapp://

 

 

blog.thetheorier.com

 この一ヶ月は少し忙しかったのと思いついたアイデアがなかなか形にならず投稿できる状態になりませんでした.

 先日紹介した「やりなおし」の応用を作成中です、仕方ないので妥協した状態で記事にする予定です.

 

 

 

【iPhoneショートカット】「やりなおし」できるループ処理【基礎】

f:id:thetheorier:20211121130052p:plain

 前回の例だとちょっと分かりづらいかもしれないのでもっと簡単にしたレシピを参考に説明します.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

前回

blog.thetheorier.com

 

 

今回使用するレシピ

www.icloud.com

 前回サクッと紹介した、数を数える機能とカウントした値をクリアするレシピを少し手直したしたものを使います.

 

 

f:id:thetheorier:20211122133211p:plain

 画像はレシピ全体です.

 画像に降った番号や枠を主に説明します.

 

 

f:id:thetheorier:20211122133449p:plain

 最初のこのアクションは、「ショートカットの入力」を扱うことで自動的にレシピ先頭に出てきます.

 各オプションは今回はデフォルトのままで大丈夫です.

 

 

f:id:thetheorier:20211122143351p:plain

 次にやり直したいデータをここで代入しておきます.

 今回は数字0をcountという名前の変数に起きました.

 この変数を「引き継ぎデータ」と呼ぶことにします(①).

 

 この数0(場合によってはリストや辞書)はレシピをどれだけループしても一周目から変わることがないため、初期値と同じ扱いができます.

 そこで「ショートカットを実行」でループしたときの入力に応じて、ショートカットの入力をそのまま引き継いだり、初期値を代入することで前回までの引き継ぎをクリアする…というのが今回の骨子です.

 

 

f:id:thetheorier:20211122143614p:plain

 次にifを使って「ショートカットの入力」の有無で場合分けします(②).

 引き継ぎデータでなくあくまでもショートカットの入力が対象です.

 

 

f:id:thetheorier:20211122143809p:plain

 ここからはショートカットの入力に何らかの値が存在する場合です.

 まず、ショートカットの入力を引き継ぎデータ(今回はcount)に上書きします(③).

 レシピの初めで初期値が代入されていた引き継ぎデータが、これによってループ前の最後のデータに更新されます.

 

 あとは緑で囲った枠のように、更新された引き継ぎデータを使って好きな処理を行います.

 

 

f:id:thetheorier:20211122145001p:plain

 引き継ぎデータに変更を行いたい場合は必要に応じて「変数を設定」で上書きしたり…(④)

 

 

f:id:thetheorier:20211122145113p:plain

 クリアが必要な場所では引き継ぎデータを空にします(⑤).

 

 この「引き継ぎデータの上書き」や空にする操作さえ行えばよいため、レシピ次第では「メニューから選択」や「リストから選択」で行うとは限りません.

 

 前者はより多くの組み合わせがありますが、いずれにしろこのアイデアを使ったレシピであればどこかで必ず後者のアクションを使って一度引き継ぎデータをクリアする状況があるでしょう.

 

 なにか不都合があったり例外が起きたときにクリアするのもアリですね.

 

 

f:id:thetheorier:20211122145452p:plain

 そしてレシピの一番最後に「ショートカットを実行」でこのレシピ自身を呼び出します.

 このときオプションの「入力」に必ず引き継ぎデータの変数を当てておきます.

 

 この「入力」に割り当てられた値は次のループ(厳密には「実行先のレシピ」)のショートカットの入力となります.

 

 なので引き継ぎデータが空であれば一度目の実行時と同じ状況となり、空でない場合はif文(②)の真の場合を実行します.

 

 

 

フローチャートで見る

f:id:thetheorier:20211122150420p:plain

 今回のレシピをフローチャートにすると画像のようになります.

 実際には「メニューから選択」の部分がメイン処理、好きに処理する部分となります.

 

 

 ここでレシピ上の注意があります.

 

 

f:id:thetheorier:20211122150659p:plain

 ループの何周目かどうかに関係なく、もしそのループの初めに「ショートカットの入力」が空であった場合は画像上の明るいままのフローに従います.

 具体的には

 

  • ショートカットの入力 → 空
  • 引き継ぎデータ → 初期値

 

となります.

 

 「ショートカットの入力」が空となるループは、今回の場合以下の2種類です

 

  1. 一周目(実行時なので「ショートカットの入力」は必ず空)
  2. 引き継ぎデータを空にしたときの次のループ

 

 後者が「クリア」に相当するわけですね.

 

 この場合、最後の「ショートカットを実行」の入力に変数count、つまりレシピ先頭で初期値を代入した値が入っているため、次のループでの「ショートカットの入力」にはこの値が代入されるため、この状況からこのフローを2度通ることは決してありません.

 

 

 クリアしたことによる例外処理などを行う場合、前者が面倒事になりそうです.

 引き継ぎデータの型を辞書にして専用フラグを用意するのが無難でしょうかね.

 

 

 

f:id:thetheorier:20211122151954p:plain

 二周目、または引き継ぎデータをクリアしなかった次のループは上の画像の明るいままの部分のフローに従います.

 

 このとき、レシピ先頭で毎回初期値を代入していた引き継ぎデータの変数は「ショートカットの入力」によるif文の後に「ショートカットの入力」に上書き更新されます.

 

 この中で引き継ぎデータをクリアしなければ、次のループも今回と同じになり、またクリアする操作を行えば、最後の「ショートカットを実行」の入力が空であるため、次のループの「ショートカットの入力」が空となり、今度はこの画像で暗くした方のフローへと変わります.

 

 ということはそのフローによって引き継ぎデータに初期値が代入されたままループし、それが「ショートカットの入力」となる…ということが繰り返されます.

 

 

 

 このアイデアのキモは

 

  • ショートカットの入力が空かどうかを判定する
  • 「ショートカットの実行」で次のループに更新されたデータを渡すか空のデータを渡すか

 

の2点です.

 

 

 仕組みが分かればあとは自由に使うだけです.

 

 

【iPhoneショートカット】「やりなおし」できるループ処理

f:id:thetheorier:20211121130052p:plain

 「ショートカットの入力」をうまく使います.

 正攻法かはなんとも…

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

写真を表示する方法3種類

blog.thetheorier.com

 「ショートカットの入力」は、別のレシピを呼び出すときなどに渡すことのできる変数です.

 そのため自己完結するレシピでは「ショートカットの入力」はずっと空のままです.

 

 しかしショートカットでは「ショートカットを実行」で自分自身を呼び出すことができます、このとき入力として渡した値は「次回」のレシピにおける「ショートカットの入力」に代入されます.

 

 この性質を利用して、通常のループ処理に加えて特定条件でデータを引き継いたり、あるいはクリアすることを考えます.

 

 

レシピ

 参考例として、以下の仕様でレシピを作ってみます.

 

  1. 引き継ぐデータとして「辞書」アクションを使う
  2. 辞書のキーに加え「クリア」から一つ選択
  3. 辞書のキーを選んだ場合、そのキーの値を10倍、「クリア」の場合は辞書をクリア
  4. 3の状態の辞書を入力として「ショートカットを実行」でループ

 

 

 

f:id:thetheorier:20211121130756p:plain

 まず「辞書」アクションを追加し(名前は適当にdictとしています)、適当なキーと数の組み合わせを作っておきます.

 

 辞書でなくとも可能です.

 

 

f:id:thetheorier:20211121131232p:plain

 「ショートカットの入力」に値が存在するかどうかでif文を適用します.

 まず任意の場合、つまり「ショートカットの入力」が空でない場合です.

 

 このときは辞書dictをこの「ショートカットの入力」に上書きします.

 

 続いてdictのキーと「クリア」という文字を「テキスト」アクションに並べ、分割します.

 これでdictにあるキーと「クリア」という文字によりリストが出来上がります.

 

 

f:id:thetheorier:20211121131530p:plain

 上の分割テキストを使って「リストから選択」で一つ選びます.

 選択したものがdictのキーである場合とそうでない(「クリア」を押した場合)で場合分けします.

 

 まずキーを選択した場合.

 このときは仕様に従い、選択した項目をキーとするdictの値を10倍してdictを上書きします.

 

 「結果を表示」は「ショートカットの入力」やdictがどう変化したかを確認するものです.

 

 

f:id:thetheorier:20211121131835p:plain

 その他の場合、つまり「クリア」を押した場合は変数dict(辞書ではない)をクリアします.

 

 

f:id:thetheorier:20211121132001p:plain

 最初のif文のその他、つまり「ショートカットの入力」が空だった場合は今回は何もしません.

 

 このifを終えたら最後に「ショートカットを実行」でこのレシピ自身を実行します.

 画像では見えていませんが「ショートカットの実行」のオプションである「入力」には変数dictを入れておきます.

 

 

実行

f:id:thetheorier:20211121132245p:plain

 実際に実行してみます.

 辞書のキーいずれかを選択すると、対応するキーの値が(今回は)10倍されます.

 ここで既に「ショートカットの入力」に値が入っていますが、これは今回のレシピだとこの処理が2週目だからです(後で解説します).

 

 

f:id:thetheorier:20211121132629p:plain

 「ショートカットを実行」で変数dictを返しているため、直前のdictに辞書が代入されていれば「ショートカットの入力」にその辞書が代入された状態で再実行される、つまり「引き継ぎ」が起こります.

 

 

f:id:thetheorier:20211121132903p:plain

 「クリア」を選択すると変数dictの値が削除されるため、次に実行される際はこれが「ショートカットの入力」として代入されるため、「ショートカットの入力」が空の状態となります.



フローチャート

f:id:thetheorier:20211121133258p:plain

 今回のレシピをフローチャートにしたのが上の画像です.

 

 人間の目には見えませんが1週目は「ショートカットの入力」が空であるため、レシピに直置きされている、つまり初期状態の辞書が代入された変数dictを入力としてループします(①).

 

 そのため2週目はこのdictが「ショートカットの入力」に代入されるため、辞書のキー+「クリア」の選択画面に移行します.

 

 キーのいずれかを選択した場合は仕様に基づいて処理し、更新されたdictを入力として再び「ショートカットを実行」でループします(②).

 

 「クリア」を選択した場合は、変数dictを空にした状態でこれを入力として「ショートカットを実行」でループします(③).

 この場合でのループ後の「ショートカットの入力」は空であるため、最初のif文はNoとなり、①で移行し、初期状態の辞書を入力として再ループすることでまた②・③への選択肢へ移動します.

 

 "cleared"と書かれた「コメント」アクションは①の過程に存在します.

 上の説明により、以下の条件でここを必ず通ります.

 

  • 1周目
  • ③へ進んで再ループしたとき

 

 

応用:リセットつきカウンター

www.icloud.com

 上の例よりスッキリしているのでこっちのほうがわかりやすいかもしれません.

 初期値を0とし、「1足す」、「0にリセットする」だけの簡単なカウンタです.

 

 

 「ショートカットを実行」で変数にパラメタを渡すことがヒントになります.

 

 今回初期値として辞書を直接起きましたが、当然メモ帳やファイルアプリから読み込んでも良いです.

 記録したものを改めて初期値とすれば常に変化するデータに対して処理が可能になります.

 

 

 次回はこれを使った実用的なレシピを紹介します.

 

 

【iPhoneショートカット】一枚の写真、画像をホーム画面に表示する

f:id:thetheorier:20211118084303p:plain

 リクエストのあった内容です.

 その場でサッと画像を見せたい、見たい場合に使えます.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

写真を表示する方法3種類

 写真を表示させる方法はいくつかありますが今回は写真アプリに保存されている写真を表示することを考えます.

 

 アクションを変えれば「ファイル」アプリにある写真でも同じことが可能です.

 

 

1.最新の写真を表示する

f:id:thetheorier:20211118084610p:plain

 まずは最新の写真を表示させる、一番シンプルな場合です.

 「最新の写真を取得」アクションでカメラロールにある一番最近保存した写真を一つ取得できますから、これを「結果を表示」や「クイックルック」などで表示します(本記事では「結果を表示」で統一します).

 

 

f:id:thetheorier:20211118084823p:plain

 あとは実行するだけです.

 レシピを「ホーム画面に追加」でホーム画面にアイコンとして設置して実行してもいいですし、オートメーションで好きなタイミングで表示させるのもいいですね.

 

 デメリットとしては、写真を保存するたびに対象となる写真変わってしまうことです.

 常に特定の写真を表示させたい場合は次の方法を使います.

 

 

2.特定の写真を表示する

 カメラロールにある特定の写真を表示することを考えます.

 ショートカットには「写真を検索」アクションがあり、これにフィルタ機能があるためこれを利用します.

 

 

f:id:thetheorier:20211118085259p:plain

 写真をフィルタするために一番よいのはその写真の「名前」です.

 いつのバージョンからか不明ですが、写真アプリから対象の写真を表示し、そのまま画面を引き上げると簡単なメタデータを参照でき、その中にファイル名が載っているためこれを使います.

 

 

f:id:thetheorier:20211118085454p:plain

 「写真を検索」でフィルタとして「名前」を選択し、上で調べた名前と等しいか一致するようにさせます.

 まず問題ないでしょうが心配なら枚数制限も行います.

 

 

f:id:thetheorier:20211118085650p:plain

 こうすることでカメラロールから削除しない限り表示させることができ、また写真を撮影したり保存したりして最新の写真が変わっても影響しません.

 

 

2-1.アルバムから表示する

 たくさん写真を撮ったり保存したりしてカメラロールにある写真の枚数が多い人は少なくないはずです.

 枚数が多いと「写真を検索」の対象が増えるわけですから、当然そこから指定の一枚を探し出すのに時間がかかってしまうため実際には上の方法は結果を表示されるまで待たされてイライラするかもしれません.

 

 そこで専用のアルバムを作り、そこに対象の写真を入れた上でそこから取得することを考えます.

 

 

f:id:thetheorier:20211118090014p:plain

 まずあらかじめ、写真アプリでアルバムを作って表示させたい写真をそこに移動させておきます.

 

f:id:thetheorier:20211118090130p:plain

 先ほどと同じレシピですが、「写真を検索」のフィルターにアルバムの指定を追加します.

 

 こうすることで検索対象がカメラロール全体からアルバムに縮小されます.

 

 執筆時の僕のiPhoneにはカメラロールに656枚の写真がありますが、これだけでもはっきりと差を感じることができます.

 

 

3.複数枚選択できるようにする

 一枚だけサッと表示するのもいいですが、状況によっては少数だとしても複数枚を対象にしたいことがあるものです.

 

 

f:id:thetheorier:20211118090717p:plain

 その場合は上の2-1の場合から名前のフィルターを外してアルバムのフィルターのみにします.

 また枚数制限を外し、その次に「リストから選択」アクションで一つ選ばせてから結果を表示するよう変更します.

 

 

f:id:thetheorier:20211118091029p:plain

 これで予め指定アルバムに入れておいた写真を素早く表示させることができます.

 

 

 あとはこれをホーム画面やウィジェットに追加して使用したり、オートメーションで好きなタイミングで実行させればいいです.

 

 ちなみに時刻をトリガーとしたオートメーションに適用してスリープ状態からでもちゃんと使えますね.

 パスコードがオンの状態では流石にワンタップ必要です.

 

 

【iPhoneショートカット】レシピの補助アプリActions

f:id:thetheorier:20211113114436p:plain

 ショートカットにあるアクションにない機能を追加します.

 

 

Actions

Actions

  • Sindre Sorhus
  • ユーティリティ
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のバージョン : iOS1.1.0

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

レシピの処理を補助

f:id:thetheorier:20211113114510p:plain

 ショートカットにアクションを追加して使う専用タイプのアプリなため、本アプリ単体では何もできません.

 

f:id:thetheorier:20211113114719p:plain

 アクションの一部を簡単に紹介します.

 例えば"Add to List"というアクションでは与えられたリストに項目を追加します.

 

 

f:id:thetheorier:20211113122313p:plain

 "Append"をタップして"Prepend"にすると、リストの先頭に追加されます.

 

 

 

f:id:thetheorier:20211113122705p:plain

 参考にもうひとつ.

 "Sort List"というアクションは対象のリストを設定した決まりで並び替えます.

 デフォルトでは"Ascending"、そしてオプションの"Sort Type"は"Natural"となっています.

 この状態だと自然な昇順で並び替えが行われます.

 

 

f:id:thetheorier:20211113123030p:plain

 "Sort Type"を"Localized"にすると、テキストの先頭を見て並び替える方式になります.

 デフォルトで使える「ファイルにフィルタを適用」のオプションにある「並び順所」はこれに当たります.

 

 

f:id:thetheorier:20211113123237p:plain

 また"Ascending"をタップして"Descending"にすると、昇順から降順になります.

 

 

 このように、本来ショートカットでは対応していない、対応していても多くのアクションを要する処理をこなすことができるようになります.

 

 

blog.thetheorier.com

 先日作った数を並び替えるレシピも、このアプリを使えばアクション一つで済むわけです.

 

 

 

アクション一覧

 以下は執筆時点のバージョンでサポートしているアクションの簡単な日本語説明です.

 

 

  • Add to List
     指定したリストに項目を追加します.
     先頭・末尾の指定が可能、またシングルタップだと「ファイル」アプリから強制選択されますが長押ししてマジック変数を指定できます.
  • Apply Capture Date
     対象のイメージのオリジナル撮影日時(EXIFメターデータ)をファイルの作成日時、修正日時に修正します.
     メタデータのない場合はスルーします.
  • Clamp Number
     対象の数値を、指定した範囲に「かしめ」ます.
     つまり、対象の数値が範囲が範囲内であればそのまま、範囲を下回るならば範囲の最小値、上回るならば最大値を返します.
  • Create URL
     コンポーネントからURLを生成します.
  • Date to UNIX Time
     入力した日付のUNIX時間を返します.
     Unixエポック(協定世界時)からの経過秒数を取得したい場合は"now"を指定します.
  • Format Date Difference
     「昨日」や「2週間前」といったある日と別の日との相対時間をフォーマットします.
  • Generate UUID
     デバイスのUUID(ハイフンあり)を返します.
  • Get File Path
     入力したファイルのパスもしくはURLを返します.
  • Get Uniform Type Identifier
     入力したファイルのデータタイプ(UTI)を取得します.
     例えばJPEGファイルであれば"public.jpeg"を返します.
  • Random Boolean
     デフォルトで使える「乱数」アクションが「指定範囲内の整数」であるのに対し、このアクションは「ブール値」をランダムで返します.
     出力は「はい」「いいえ」になります.
  • Random Color
     ランダムな色を16進数のカラーコード表記で返します.
  • Random Date and Time
     指定した日付・時刻の範囲からランダムに日付・時刻を返します.
  • Random Emotion
     ランダムにエモーション(絵文字)を一つ返します.
  • Random Floating-Point Number
     指定した実数範囲からランダムで浮動小数点で値を返します.
  • Random Text
     指定した数を長さとする文字列をランダムに生成します.
     パスワードやトークンの生成などに便利です.
  • Remove Duplicate Lines
     指定したリストの重複する行を削除します.
     空行や空白のみの行は重複とみなされません.
     オプションの"Case Insensitive"で大文字小文字の区別をするか変更できます.
  • Remove Duplicates from List
     指定したリストから重複するデータを削除します.
     リストの要素は比較する際にテキストに変換されます.
     上の"Remove Duplicate Line"と違い、こちらは空行や空白のみの行も対象となります.
  • Remove Emoji
     入力されたテキストに含まれるすべての絵文字を削除します.
  • Remove Empty Lines
     入力されたテキストから空行や空白のみの行を削除します.
     "Remove Duplicate Lines"と組み合わせれば"Remove Duplicate from List"と同じ処理になると思われます.
  • Remove from List
     入力したリストからアイテムを削除します.
     インデックス指定などの仕様はデフォルトの「リストから項目を取得」と同じです.
  • Reverse List
     入力したリストの項目順を反転します.
  • Sample Color from Screen (macOS-only)
     画面から選択した色を16進数のカラーコードで取得できます.
  • Set Creation and Modification Date of File
     対象のファイルの作成日と更新日を指定した値に設定します.
  • Shuffle List
     入力したリストの項目順をシャッフルします.
  • Sort List
     入力したリストを並び替えます.
     "Ascending"だと昇順、"Descending"だと「降順」になります(空行は任意の項目より「前」とみなされます).
     オプションの"Sort Type"については"Natural"はごく一般的な並び替え、"Localized"だと先頭の1文字ずつ並び替えの判定を行います.
     ここの仕様は記事の初めに画像付きで紹介したものを見たほうが早いです.
  • Transform Text
     入力したテキストを指定した方法で繋げます.
     camelCase:単語の先頭を大文字にして繋げる
     PascalCase:camelCaseに加え最初の単語も大文字で始めます
     snake_case:すべて小文字にし、アンダースコア"_"で繋げる
     CONSTANT_CASE:すべて大文字にし、アンダースコア"_"で繋げる
     dash_case:すべて小文字にし、ハイフン"-"で繋げる
  • Transform Text with JavaScript
     入力されたテキストを、与えられたJavaScriptコードで変換します.
     入力テキストは$textというグローバル変数に格納されています.
     入力されたテキストを変換したのち、文字列を返すことが求められます.
     非同期処理は使えないようです.
     またコードはJXAでなく、JavaScriptCodeとして出力されます.
  • Trim Whitespace
     入力されたテキストから、先頭および末尾の空白や改行を取り除いた状態で返します.
  • Unix Time to Date
     入力したUnix時間を日付に変換します.
     時差の変更はできないようです. 

 

 執筆時点のバージョン1.1.0では以上の29アクションが収録されています.

 

 見ての通り、主にテキストやリストの編集をサポートします.

 

 

blog.thetheorier.com

 

blog.thetheorier.com

 過去に紹介したように、本来ショートカットアプリにない機能を持ち合わせたアプリはいくつかあります.

 

 

Toolbox Pro for Shortcuts

Toolbox Pro for Shortcuts

  • Alexander Hay
  • ユーティリティ
  • 無料

 今回のようなアクションを補うタイプのひとつに"Toolbox"というアプリがあります.

 重複するアクションもありますが仕様が異なるアクションもあります、使い分けてより便利にレシピを作ることができます.

 

 

 こういったアプリをどんどん使って行きたいものですが、個々のみなさんがダウンロードしてくれるとは限らないのが難しいところです.

 どうしても…という場合は積極的に使っていくかもしれません.

 

 

【iPhoneショートカット】国土地理院のタイル地図を取得する

f:id:thetheorier:20211105141157p:plain

 今回は国土地理院が提供する基本測量成果です.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

国土地理院のタイル地図

maps.gsi.go.jp

 地球は(おおよそ)球体であるため、特定の位置を指定するのに角度(緯度・経度)を用いる方法と、球面を平面に移した座標系を用いる方法があります.

 

 我々が「地図」として見るそれは平面であるため、画像として地図を取得するにはその場所を含む範囲を平面に置き換えたものでなければなりません.

 その場合、どこを中心(基準)とするかで世界測地系とかピクセル座標系などと言われます.

 今回は我々が普段使っている緯度・経度によって結果を得ることにします.

 

 タイル地図は目的によって複数種類ありますが、どれも共通するのは3つのパラメータです.

 

 

基本情報

 まずひとつ目はズームレベルzです.

 名前の通り地図の倍率に関わるパラメータで値が大きいほど拡大されます.

 地図の種類によって値の範囲が異なります.

 

 次に位置を示すxとyです.

 ただし緯度経度と異なり、同じ場所でもズームレベルに応じて値が異なります.

 

 例えば名古屋駅を含むタイルの場合、ズームレベル10だとx=901、y=405、ズームレベル16だとx=57686、y=25920になります.

 以下にアクセスして違いを確認してみてください.

 

https://cyberjapandata.gsi.go.jp/xyz/std/10/901/405.png

 

https://cyberjapandata.gsi.go.jp/xyz/std/16/57686/25920.png

 

hosohashi.blog59.fc2.com

 

www.trail-note.net

 緯度経度からこのx,yの値をどう計算するか…はこちらが紹介しています.

 ややこしいのですが、紹介されている式x,yはピクセル座標であり、今回使うパラメタx,yはそこから更に256で割る必要があります(1つ目に紹介した記事の前半にその言及があり、後半でピクセル座標の式があります).

 

 というわけで今回の目的に沿って改めて書くと、緯度 \phi 、経度 \psi 、ズームレベルzに対して以下になります.

 

 \displaystyle x=\frac{2^{z+7}}{256}\left( \frac{\psi}{180}+1 \right)

 

 \displaystyle y=\frac{2^{z+7}}{256\pi}\left\{ -\tanh^{-1}\left( \sin{\left( \frac{\pi}{180} \right)\psi} \right)+\tanh^{-1}\left( \sin{\left( \frac{\pi}{180} \right)L} \right) \right\} 
 L:= 85.05112878

 

 結果はまず間違いなく整数ではないため、小数点以下を切り捨てることとなります.

 

 また指定位置が画像の中心に来るとは限りません.

 具体的にはこれらのx,yをそれぞれ256で割った余りが、画像のピクセル座標に一致します.

 なのでたまたま中心だったり、画像のギリギリ端っこだったりします.

 

 

 いずれにしろ、この変形式さえ分かれば後はどうとでもなります.

 以降はどれだけ機能を増やすか…ですね.

 

 

レシピ

 今回は位置の指定として

 

  • 予め緯度経度を指定
  • その場で入力(カスタム)
  • 現在位置(GPS)

 

の3つを考えます.

 

 またタイル地図もいくつか種類があるのですが、そのうち

 

  • 標準地図
  • 単色地図
  • 写真
  • 色別標高図

 

の4種を選択できるようにします.

 

 

f:id:thetheorier:20211105151634p:plain

 まずは位置情報からです.

 値は「辞書」にしておきます.

 

 

f:id:thetheorier:20211105151758p:plain

 値の中で緯度と経度をそれぞれキーとした値を入れておきます.

 これで各々の位置情報のセットができました.

 

 カスタムと現在位置は後で追加します.

 

 

f:id:thetheorier:20211105152024p:plain

 「メニューから選択」アクションを追加してタイル地図4種の名前を追加します.

 各々をタップしたときの処理は概ね共通なので以下では標準地図の場合のみ書きます.

 

 

f:id:thetheorier:20211105152234p:plain

 ズームレベルzの値を「入力を要求」で入力します.

 今回要求されるべき値が5~18という範囲になっているため、エラー処理のために入力値xに対して(x-5)(x-18)を計算します.

 もし入力した値xが5から18までの場合、この結果は0以下の数に、それ以外の場合は正整数になるためif文一つで場合分けできます.

 

 

f:id:thetheorier:20211105152629p:plain

 まず先の計算結果が0より大きい場合.

 このときは入力した値が範囲から外れているので例外処理を行います.

 レシピを再実行するか終了するか選べるようにしていますが見ての通りゴチャゴチャします.

 項目が増えれば増えるほど例外処理のアクション数も嵩みます、仕方ないですね.

 

 

f:id:thetheorier:20211105153834p:plain

 次に計算結果が正でない場合です.

 このときは入力した値が指定範囲となっているため、必要な処理を行います.

 まず入力したズームレベル値を正式に変数zに代入します.

 また位置情報タイトルも変数に置きます(必須ではないです).

 

 最後にタイル地図のURLを変数に置きます.

 但しこの時点ではまだパラメータx,yが決まっていないため、とりあえずパラメータが入る部分をstatusという文字列におき、最後に置換することにします.

 このメニュー選択の前でx,yを計算してもいいのですが、zの例外処理を前提とするなら、せっかくx,yを計算したのにzが範囲外でやりなおし…というのは非効率だからです.

 実際にはそう大して待たされることではないですが、まったく関係ない別のレシピを作るときに参考になるかもしれません.

 

 というわけで、これを残り3つについても同様に行います.

 

 

 

f:id:thetheorier:20211105154656p:plain

 ズームレベルzが決まったら次は緯度と経度を決めます.

 レシピの最初に作った「辞書」のキーに加え、手打ちするための「カスタム」と「現在位置」の文字列を「テキスト」アクションに並べ、「テキストを分割」で改行で分割した上で「リストから選択」で一つ選ばせます.

 リストはこのようにして繋げて分割することで項目を追加することができます.

 

 

f:id:thetheorier:20211105155021p:plain

 「リストから選択」の結果に応じて緯度と経度を取得します.

 まず「カスタム」が選ばれた場合です.

 このときは手打ちなので「入力を要求」で各々の値を取得します.

 

 

f:id:thetheorier:20211105155210p:plain

 次は現在位置を選んだ場合です.

 この場合は「場所」アクションで「現在地」を選択し、ここから緯度を経度を取り出します.

 ここで設定アプリの位置情報サービスから設定できる「正確な位置情報」をオフにすると、ズームレベルが高いほど結果がズレる可能性が当然考えられます.

 

 

f:id:thetheorier:20211105155619p:plain

 そしてそのどちらでもない場合です.

 このときは一番最初に追加した「辞書」に登録した緯度と経度を取得することになります.

 

 これで3つのパラメータz,φ,ψが決まったのでタイル座標x,yを求めることができます.

 

 

f:id:thetheorier:20211105155801p:plain

 まずはタイル座標xです.

 計算後「端数を処理」アクションで小数点以下を切り捨ててから変数に代入します.

 

 

f:id:thetheorier:20211105160100p:plain

 次にタイル座標yです.

 数式がそれなりに長く複雑なため、「計算式」アクション一発ではメチャクチャになるのでやむなく分割しています.

 

 

 

f:id:thetheorier:20211105160252p:plain

 これで選択肢に応じたパラメータz,x,yが求まりました.

 最後に既に与えておいたURLの"status"の箇所をパラメータ付きの正式なものに差し替え、結果を「入力からイメージを取得」で画像を取得、表示して終了です.

 

 

 

実行

f:id:thetheorier:20211105160507p:plain

 結果を確認します.

 タイル地図の種類を選び、ズームレベルを指定します.

 入力したズームレベルの値に問題があればここでやり直しです.

 

 

f:id:thetheorier:20211105160657p:plain
国土地理院提供のベースマップをもとに作成

 問題なければ画像のようにタイル地図が表示されます.

 

 

 国土地理院ではここで挙げた以外のタイル地図も公開されています.

 

 レシピの配布については、国土地理院への承認申請に関わると判断して控えることにします(これを見てレシピを作成し、個人利用する分には問題ありません).

 

 

 

【iPhoneショートカット】気象データAPI「JJWD」を使ったアメダス観測値レシピ

f:id:thetheorier:20211011103852p:plain

 今年はじめに注目されていたAPIなんですが, ショートカットレシピとして作るのをすっかり忘れていました.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

これまでに作ったレシピ

blog.thetheorier.com

 先日紹介したこのレシピは, サービス終了したlivedoor天気の代わりとして作られたAPIを利用したものでした.

 ショートカットのアクションでも天気情報を取得するアクションはありますが, 天気予報の質の点で他を使いたいという人は当然存在します.

 

 

今回使うAPI

jjwd.info

 今回使うAPIは, 気象庁による各観測地のアメダス観測値を取得します.

 ただし気象庁が公開するデータはCSV形式であり, もちろんこれをそのまま引っ張ってきて欲しいデータを取り出せないことはないですが, とても面倒な作業です.

 JJWDではそれをJSONに変換することで扱いやすくなっています.

 

 

レシピ

 ではレシピを見ていきます.

 

 

f:id:thetheorier:20211011110606p:plain

 対象の観測値データは

https://jjwd.info/api/v2/station/[観測所番号]

 

にアクセスします(画像では観測「値」と誤字ってます).

 

https://www.jma.go.jp/jma/kishou/know/amedas/ame_master_20211005.pdf

 

 観測所番号は上のリンクから探してください, 因みに52586は岐阜地方気象台の観測所番号です.

 PDFでも触れられていますが, 観測所によって観測対象が降水量だけだったり降水量、気温、風光、風速まで観測したり…と異なります.

 最寄りの観測所を選んでも降水量しかデータがない…なんてことがあるのでそこは他の観測所を選ぶなど妥協する必要があります.

(この投稿で僕の地元である一宮市でなく岐阜市の観測所を選んでいるのではそのせいです)

 

 このURLを「Webの内容を取得」で中身を取り出し, 「入力から辞書を取得」で辞書として取り込みます.

 

 

f:id:thetheorier:20211011111216p:plain

  因みに以前紹介しましたが, 「辞書」アクションではより深い階層の値を取り出す際の記法があります.

 例えば画像にある"station"をキーとする辞書"pref_ja"キーの値「岐阜」を取り出したい場合, いちいち"station"の値を辞書にして"pref_ja"の値を取得…という面倒なことをせず,

station.pref_ja

 

と, 間にドットを挟むことで値「岐阜」を取り出せます.

 むしろこれを使わないと全体のアクションがどんどん膨れ上がってしまうので必須のテクニックです.

 

 

 以降は公式サイトにあるAPIドキュメントに従って欲しいデータを辞書dictからひたすら引っ張ってきます.

 

 

f:id:thetheorier:20211011112831p:plain

 まずは都道府県名と観測所名を取得します.

 それぞれstationキーのpref_jaおよびstn_name_jaなので「辞書の値を取得」でそれぞれ

 

station.pref_ja
station.stn_name_ja

 

をキーとすれば取り出せます.

 

 これを「テキスト」アクションで体裁を整えておきます.

 

 

 

f:id:thetheorier:20211011113304p:plain

 次は降水量です.

 まずは観測データを記録した現在時刻から.

 APIドキュメントに従った, 「辞書」アクションに当てはめるキーは以下になります.

 

キー 詳細
station.preall.year
station.preall.month
station.preall.day
station.preall.hour
station.preall.minute

 

 時刻の各々の単位がバラバラなので「テキスト」アクションで繋げます.

 全部はいらない…という場合は必要な値だけでももちろん大丈夫です.

 

 

f:id:thetheorier:20211011114037p:plain

 上のように「テキスト」アクションなどに直接辞書の値を置くには画像のように行います.

 まず「テキスト」アクションに対象の辞書(変数)を追加し, それをタップして画面下に出てきたメニューを下にスワイプすると, 一番下に灰色で「キーの値を取得」という入力枠があるので, そこに上に書いたようなキーを入力します.

 

 

f:id:thetheorier:20211011114319p:plain

 この調子でどんどんデータを取り出していきます.

 1時間降水量はキーstation.preall.precip_1hで得られます.

 

 

f:id:thetheorier:20211011114444p:plain

 似たデータがここではたくさんあるので必要な分だけ使います.

 

キー 詳細
station.preall.precip_1h 1時間降水量
station.preall.precip_3h 3時間降水量
station.preall.precip_6h 6時間降水量
station.preall.precip_12h 12時間降水量
station.preall.precip_24h 24時間降水量
station.preall.precip_48h 48時間降水量
station.preall.precip_72h 72時間降水量
station.preall.precip_day 日時間降水量

 

 

f:id:thetheorier:20211011114846p:plain

 あとは「テキスト」アクションで体裁を整えて適当な変数で置いておきます.

 

 

 

f:id:thetheorier:20211011114956p:plain

 次は最大風速です.

 これもやはり以下のキーを使って観測時刻を取得できます(観測情報によって各々の観測時刻は一致しないため各々の時刻を取得しておいた方がいいです).

 

キー 詳細
station.max_wind.year
station.max_wind.month
station.max_wind.day
station.max_wind.hour
station.max_wind.minute

 

 

f:id:thetheorier:20211011115244p:plain

 風速最大値はキーstation.max_wind.max_wind_dailyで得られます.

 

 

f:id:thetheorier:20211011115405p:plain

 次は風速最大値の風向です.

 取得した時点で風向の値は東西南北をそれぞれアルファベットのEWSNによって与えられているため, キーstation.max_wind.max_wind_daily_dirで得た結果を読みやすくするために「テキストを置き換え」で東西南北の言葉で置き換えたものを使います.

 

 

f:id:thetheorier:20211011115803p:plain

 観測データによっては, 観測時刻とは別に, 実際に発生した時刻である「起時」があります.

 風速最大の起時は以下によって得られます.

 

キー 詳細
station.max_wind.max_wind_daily_hour
station.max_wind.max_wind_daily_minute

 

 以上これらの値を「テキスト」アクションで体裁を整えて変数に置きます.

 

 

 

f:id:thetheorier:20211011120313p:plain

 続く「最大瞬間風速」は「最大風速」と中身はまったく同じでキーの文字列が異なるだけです.

 まずは観測時刻.

 

キー 詳細
station.max_gust.year
station.max_gust.month
station.max_gust.day
station.max_gust.hour
station.max_gust.minute

 

 そして最大瞬間風速の最大値のキーはstation.max_gust.max_gust_dailyです.

 

 

f:id:thetheorier:20211011120615p:plain

 最大瞬間風速最大値の風向はキーstation.max_gust.max_gust_daily_dirで取得し, 最大風速の風向と同じく東西南北で置き換えます.

 

f:id:thetheorier:20211011130646p:plain

 最大瞬間風速にも最大値起時があります.

 

 

f:id:thetheorier:20211011130814p:plain

 次は最高気温です.

 観測時刻を得るキーは以下になります.

 

キー 詳細
station.max_temp.year
station.max_temp.month
station.max_temp.day
station.max_temp.hour
station.max_temp.minute

 

 

f:id:thetheorier:20211011131002p:plain

 最高気温のキーはstation.max_temp.temp_daily_maxになります.

 

 

f:id:thetheorier:20211011131119p:plain

 最高気温きも起時があり, 以下のキーで得られます.

 

キー 詳細
station.max_temp.temp_daily_max_time_hour
station.max_temp.temp_daiky_max_time_minute

 

 

f:id:thetheorier:20211011131347p:plain

 最高気温のデータ群には「前日比」のキーがあり, station.max_temp.temp_daily_max_diff_to_yesterdayで得られます.

 今回は使っていませんが平年差もあります.

 

 

f:id:thetheorier:20211011131705p:plain

 最後に「テキスト」アクションで体裁を整えます.

 今回は前日比が時間帯によって値がない場合があるため,

 

  • 値がない
  • 前日比が非負
  • 前日比が負

 

の場合で体裁を変え, 値がある場合は最高気温の表示の後ろに表記するようにしています.

 

 

 最低気温については最高気温の場合でキーの"max"を"min"に変えるだけなので省略します.

 

 

f:id:thetheorier:20211011132035p:plain

 最後にすべての結果を表示させて終わりです.

 

 

実行

f:id:thetheorier:20211105140029p:plain

  結果は画像の通りです.

 

 

 毎度変数に置くのが煩わしいですが, ここまでの数をマジック変数のまま扱う方がもっとややこしいので仕方ないですね.

 

 

 このサービス(アメダス)は更新時点での記録であり、天気予報ではないので注意です.

 

 

【iPhoneショートカット】データ形式を変更したUSLauncher ver3.1をリリース【RoutineHub】

f:id:thetheorier:20211031130418p:plain

 iOSのアップデートに伴い動作に支障が出てしまったことによる修正です.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

ダウンロード

routinehub.co

 

 

www.dropbox.com

 配布データがver3.0以前から大幅に変わっているため必ずこちらに差し替えてください.

 

 

USLauncher ver3.1 の変更・修正

 

  • 配布データをplistからJSONに変更
     少なくともiOS15.0.2以降で、plistを使って「入力から辞書を取得」を行うのにこれまで以上に時間がかかるようになってしまいました.
     前回配布したファイルサイズで、このアクションを終えるまでに2分以上もかかってしまいます.
     そのため配布データをJSONに変更しました.
  • 若干のレシピ修正
     配布データの形式を変更したことにより、レシピの中身が若干変わりました.
     配布データの差し替えに変更はないため気づかないレベルです. 

 

 

URLスキームの追加・削除

 レシピの更新に合わせて投稿したためここで書いておきます.

 

  • 1Password v7.9.2
    削除:org-appextension-feature-password-management://
  • Adobe Capture v8.0
    追加:com.adobe.capture.ios://
  • Adobe Connect v3.1
    削除:appcenter-37f794db-b097-4ec3-92e3-2c2b69210a0f://
  • Microsoft Teams v3.17.0
    追加:com.googleusercontent.apps.445112211283-fpg1mls86usj97upe95l3u8itc447rjm://
    追加:com.googleusercontent.apps.445112211283-i3tvsbc5dhp3p0n5co5c1in6ih4v23un://
    追加:com.googleusercontent.apps.445112211283-lt7quik71qr499fpbv003be25fv32ah6://
  • Microsoft Whiteboard v21.1108.0
    削除:ms-whiteboard-iosauth://
    削除:ms-whiteboard-iosauth-intunemam://
    削除:ms-whiteboard-preview://
    削除:ms-whiteboard-preview-intunemam://
    追加:msauth.com.microsoft.intunemam://
    追加:msauth.com.microsoft.whiteboard://
  • Microsoft Whiteboard v21.11026.0
    削除:msauth.com.microsoft.intunemam://
    追加:msauth.com.microsoft.whiteboard-intunemam://
  • note v5.18.1
    削除:fb665869046808089://
  • 保護者向け Google ファミリーリンク v1.87.2051
    削除:comgooglefamilycompassulr://

 

 

 データ形式をJSONにした結果読み込み処理自体が速くなりました.

 タイミングが良いと読み込みにかかる時間がコンマ秒で済みます.

 plistとJSONでこんなに違うとは思ってませんでした.

 

 

 

【iPhoneショートカット】数字のソートを利用して統計量を計算する

f:id:thetheorier:20210926111815p:plain

 先日の投稿で数字を並び替える方法を紹介しました.

 これを利用して並び替えが前提の統計量などを計算するレシピを作ります.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.0.1

 

 

スポンサーリンク

 


 

 

既存のものも含める

 いくつかの統計量は「統計を計算」アクションから簡単に計算できます.

 それ以外はこちらで工夫しなければなりません.

 

 

レシピ

f:id:thetheorier:20210926112342p:plain

 まず評価したい数のデータを用意します.

 今回は「テキスト」アクションに直書きです.

 

 

f:id:thetheorier:20210926112429p:plain

 続いて「リスト」アクションに各種統計量の項目を並べます.

 今回は思いついた順に

 

  • 最小値
  • 最大値
  • 平均値
  • 中央値
  • 四分位数
  • 最頻値
  • 分散
  • 標準偏差
  • 歪度
  • 尖度
  • 中点値
  • 範囲

 

の12項目です.

 各々を単独で計算したかったのですが全体の処理に時間がかかってしまうため一部は他を流用することにします.

 

 

f:id:thetheorier:20210926112731p:plain

 統計値のリストを「リストから選択」で複数選択します.

 続いてデータを書き込んだ「テキスト」アクションを改行で分割したものを変数listで置きます.

 この時点でlistはきちんと昇順で並んでいるとは限らないため, ソートする必要があります.

 

 

f:id:thetheorier:20210926113019p:plain

 その前にいくつかの情報は先に取得しておきます.

 まずはlistの行数, つまりデータの標本数です.

 すべての情報は変数valueに追加することにします.

 

 

f:id:thetheorier:20210926113141p:plain

 続いてlistの整数部の最大桁digitsを求めます.

 対象のデータが整数とは限らないため, listの最大値Maximumに対して「計算式」アクションを用いて

 

floor(log([Maximum])+1)

 

で最大桁数を求めます.

 

 

f:id:thetheorier:20210926113535p:plain

 前回の投稿に倣い, 各データを0埋めします.
 整数でないことを想定し, 最大桁で右から最大桁文字取り出すのでなく, 先頭から

 

[0埋めで使った0の文字数]-digits+floor(log([繰り返し項目])+1)

 

の分だけ文字を取り除くことになります(第3項は繰り返し項目の整数部桁数).

 

 

f:id:thetheorier:20210926114059p:plain

 こうして0埋めして整数部を揃えたデータリストに対して「ファイルにフィルタを適用」で名前に対して昇順に並び替えます.
 結果を変数sortedで置きます(「ファイル」の種類を数字にしておくことを忘れずに).

 今後はこのソート済みのデータsortedを使って色んな統計量を計算することになります.

 

 また後の処理の簡約化のために, この時点で平均値を求めておきます.

 

 

 

 ここからは具体的な統計量を求めていきます.

 

 

 

f:id:thetheorier:20210926114424p:plain

 まずは最小値です.

 最小値は「統計を計算」アクションに対応しているためこれを使います.

 「テキスト」アクションで体裁を整え, 変数valueに追加します(この処理は今後も共有なので以降の説明は省略します).

 

 

f:id:thetheorier:20210926114641p:plain

 最大値も同様です.

 

 

f:id:thetheorier:20210926114728p:plain

 中央値も「統計を計算」アクションを使います.

 

 

f:id:thetheorier:20210926114815p:plain

 平均値も「統計を計算」アクションに対応していますし, そもそも上で計算済みなのでそれを使います.

 

f:id:thetheorier:20210926114915p:plain

 最頻値(モード)も「統計を計算」アクションにあります.

 

 

f:id:thetheorier:20210926115004p:plain

 中央値以外の四分位数 Q_1,Q_3は「統計を計算」アクションにないため, 何らかの方法で計算しなければなりません.

 

 

blog.thetheorier.com

 四分位数の定義は複数あり, それを抜きにしても何らかの形で場合分けは避けれられません.

 今回は上の記事の定義D, WikipediaやExcelで用いられる定義を採用します.

 

 計算のしやすさのためにデータ数を4で割ったときの商k, そして同じく4で割った余りのrを計算しておきます.

 

 

f:id:thetheorier:20210926150559p:plain

 まずはr=0, つまりデータ数が4の倍数のときです.
 このときの第一四分位数は今回の定義では

 

\displaystyle Q_1=\frac{x_k+3_{k+1}}{4}

 

で得られます.

 なのでsortedのデータのうちk番目とk+1番目が分かれば計算可能ですね.

 

 

f:id:thetheorier:20210926151030p:plain

 同じく第三四分位数は

\displaystyle Q_3=\frac{x_{3k}+x_{3k+1}}{2}

 

です.

 

 この調子でr=1,2,3についても処理していきます.

 

 

f:id:thetheorier:20210926151415p:plain

 続いてr=1の場合です.
 このとき第一四分位数は\displaystyle Q_1=x_{k+1}です.

 

 

f:id:thetheorier:20210926151625p:plain

 同じく第三四分位数は\displaystyle Q_3=x_{3k+1} です.

 

 

f:id:thetheorier:20210926151913p:plain

 次はr=2の場合です.
 このとき\displaystyle Q_1=\frac{3x_{k+1}+x_{k+2}}{4} になります.

 

 

f:id:thetheorier:20210926152048p:plain

 同じく\displaystyle Q_3=\frac{x_{3k+1}+3x_{3k+2}}{4} です.

 

 

f:id:thetheorier:20210926152210p:plain

 最後にr=3の場合です.
 このとき\displaystyle Q_1=\frac{x_{k+1}+x_{k+2}}{2} となります.

 今更ですが隣同士ですからこうして「リストから項目を取得」で2つ拾ってきて平均を取ればアクションが一つ少なくなります.

 

 

f:id:thetheorier:20210926152329p:plain

 \displaystyle Q_3=\frac{x_{3k+2}+x_{3k+3}}{2} となります.

 四分位数はこれで全部ですね.

 

 

f:id:thetheorier:20210926152948p:plain

 最後に四分位範囲 Q_3-Q_1 も計算してvalueに追加します.

 

 これで四分位数関連は終わりです.

 

 

f:id:thetheorier:20210926161920p:plain

 続いては分散です.

 ショートカットでは「統計を計算」に標準偏差があり, 分散はこの2乗であることから求めます.

 

 

f:id:thetheorier:20210926162618p:plain

 標準偏差は「統計を計算」アクションにあるのでこれを使います.

 

f:id:thetheorier:20210926154752p:plain

 次は歪度です.

 歪度は

 

\displaystyle \frac{1}{n}\sum_{i=1}^n\left( \frac{x_i-\mu}{\sigma} \right)^3

 

で定義され(μは平均、σは標準偏差), データが正規分布からどれだけ歪んでいるかを表す統計量です.

 nとσは単独固定値なので最後に計算します.

 

 

f:id:thetheorier:20210926162940p:plain

 次は尖度です.

 歪度が3乗だったのに比べこちらはそのまま4乗に変わります.

 

 

f:id:thetheorier:20210926163124p:plain

 次は中点値です.

 データのうち最小値と最大値の算術平均をとります.

 

 

f:id:thetheorier:20210926163525p:plain

 最後は範囲(モード)です.

 「統計を計算」アクションになるのでそのまま使います.

 

 最後に変数valueを表示して終わります.

 

 

実行

f:id:thetheorier:20210926164452p:plain

 あとは実行して確かめるだけです.

 

f:id:thetheorier:20210926165001p:plain

 問題なければこのようになります.

 

 

 色々詰め込んだせいで, 今回の例のようなデータ数300でも結構な時間かかります.

 目的に応じて項目を減らした方が良いですね.

 

 

【iPhoneショートカット】イメージにテキストを重ねるアクション【iOS15.1】

f:id:thetheorier:20211026105631p:plain

 iOS15.1になって新しいアクションが追加されました.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.1

 

 

スポンサーリンク

 


 

 

「テキストを重ねて表示」

f:id:thetheorier:20211026105941p:plain

 今回追加されたのは「テキストを重ねて表示」というアクションです.

 似たアクションで「イメージを重ねて表示」がありました、イメージの上の他のイメージを重ねるアクションでしたが、このアクションでは代わりに好きな文字列をイメージの上に重ねます.

 

 

f:id:thetheorier:20211026110153p:plain

 例えば適当に写真を一つ選んで…

 

f:id:thetheorier:20211026110225p:plain

 選んだイメージの上に日付を重ねることにします.

 「テキスト」と灰色になっている箇所に重ねたいテキストを入れます.

 マジック変数の強制ではないため直接入れることが可能です.

 必要に応じてフォントやフォントサイズ、カラー、回転などを指定します.

 

 

f:id:thetheorier:20211026110433p:plain

 オプションの最後にある「サイズ設定」によって文字列の相対的な大きさと位置が変わるため注意しましょう.

 

位置

f:id:thetheorier:20211026110605p:plain

 デフォルトでは「中央」になっている位置は、タップして他に変更できます.

 

f:id:thetheorier:20211026110713p:plain

 「カスタム位置」にすることでx座標y座標を指定してそこから文字を重ねることができます.

 原点は「イメージを重ねる」同様左上になります.

 

 

アウトラインテキスト

f:id:thetheorier:20211026110857p:plain

 オプションにある「アウトラインテキスト」をオンにすると、境界線(縁取り)をつけることができます(イラストレーターなどで使われる意味での「アウトライン」ではありません).

 線の幅とカラーを指定できます.

 重ねる場所と同系色のテキストを入れたい場合、とくに壁紙を切り替えるオートメーションで活躍しそうです.

 

 

blog.thetheorier.com

 これまでに同じことをしようと思ったらdataURLやhtmlなどを介して重ねる方法くらいでした.

 そっちはそっちでメリットはあるのですが今回追加されたこのアクションのほうが汎用性があり、なにより簡単です.

 

 例えばこのアクションには今の所イタリック体やボールド体(太字)などにするオプションがありません.

 ボールド体はアウトラインテキストでカバーできますけどね、なのでこの辺はまだcss,html styleに分があります.

 

 いずれにしろこれで壁紙のカスタムが更に便利になります.

 

 

 

追記:本アクションの複数かけについて

 既に使っている壁紙レシピを作り変えて気になる点がありました.

 

 

f:id:thetheorier:20211026132814p:plain

 画像上は過去に紹介した、html5を使ったもの.

 画像下はテキストオーバーレイの部分をiOS15.1で登場した「テキストを重ねて表示」に差し替えたものです.

 オーバーレイのテキスト開始位置のx座標は用意した壁紙(750×1334ピクセル)の上から800ピクセル辺りでほぼ共通です.

 フォントの種類や大きさはともかく、後者については上部分がぼやけているのが確認できます.

 

 

f:id:thetheorier:20211026133600p:plain

 重ねたテキストの最前列と最後列を切り出したものです、違いがよくわかりますね.

 この天気予報のデータ取得は同じ繰り返しアクションで行い、「変数に追加」で共通の変数に代入したものです.

 

 壁紙やテキスト生成はこれまでと同じなのでオーバーレイの処理に何らかの問題があると考えられます.

 

 考えられる要因は「テキストを重ねて表示」アクションを多用するとボケるということです.

 

 

f:id:thetheorier:20211026134423p:plain

 実際壁紙自体を比較するとやはりボケています.

 つまり

 

「テキストを重ねて表示」アクションを複数重ねるのはオススメしない

 

ということです.

 

 検証では見切れている日付の1箇所に加え、天気予報の8項目、合計9回(10-1=9)「テキストを重ねて表示」で上書きした画像を壁紙として設定しています.

 

 機種にもよるでしょうが今回検証したiPhone8では5重目辺りからボケが気になってくる印象です.

 

 

 あちこちにたくさん書く…というのは難しそうです.

 配列データは1行目しか認識しないようなので、買い物メモなど複数行を書く場合は複数がけは避けられません.

 そのためボケでも我慢するか、これまで同様html cssに頼るのが無難なようです.

 

 まだ追加されたばかりなので、仕様なのかバグなのかは不明です.

 

 

【iPhoneショートカット】予め決まった予定を日付指定してカレンダーに追加する

f:id:thetheorier:20211015085958p:plain

 Yahoo!知恵袋で回答したレシピをもう少し便利にしました.

 

 会議やゴミ捨てなど、時刻は決まってるけど不定期なイベントを簡単に素早くカレンダーに登録します.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.0.2

 

 

スポンサーリンク

 


 

 

よく登録するイベントを簡単に登録

 質問にあった内容と追加した仕様を合わせると以下になります.

 

  • 追加したいイベントのタイトル、開始時刻、終了時刻は固定(終日の場合も考える)
  • 日付と上で決まったいくつかのイベントを選ぶだけでカレンダーに追加

 

 ただし追加する前にアラートを使って確認画面とします(別の手段もあります).

 

 

レシピ

f:id:thetheorier:20211015090621p:plain

 まずは「辞書」アクションを使って固定イベントを追加しておきます.

 各々の値は基本的に「辞書」になります, つまり「辞書の値が辞書」ということですね.

 

 

f:id:thetheorier:20211015090737p:plain

 辞書の値の中身は以下のキーと値を入れます.

 

  • [キー]開始時刻
     [値(テキスト)]07:50といった時刻表記にします(時,分が1桁の場合先頭に0が必要)
  • [キー]終了時刻
     上に同じ

 

 終日の場合は開始時間の値を空にするか(画像右上)、辞書自体を空にします(画像右下).

 ようは開始時刻の値の有無で終日かどうかをこの先で判定します.

 キー自体がない場合も空として判断しれくれるため画像右下の方法では問題ありません.

 

 

f:id:thetheorier:20211015091249p:plain

 続いて日時を指定します.

 「入力を要求」で日時指定できるのですが, 実際に変数として使う時、デフォルトでは時刻を含んでいます.

 そのため日時だけ使いたい場合はその箇所でフォーマットを合わせる必要があります.

 

 

f:id:thetheorier:20211015091521p:plain

 続けてはじめに追加した辞書に対して「リストから選択」で一つ選ばせます.

 はじめの辞書が対象なので選ぶ対象はイベント名、そして結果は選択したイベントの値、つまり選択したイベントの開始時刻と終了時刻からなるJSONです.

 

 

f:id:thetheorier:20211015091901p:plain

 上で得たJSONを「入力から辞書を取得」で辞書にし, 終日判定のために「開始時刻」の値を取得しておきます.

 

f:id:thetheorier:20211015092014p:plain

 上で得た開始時刻に対してif文を適用します.

 但しこの開始時刻の値はブール値にしてあります.

 開始時刻の値が真である場合は開始時刻の値が存在する…ということなので, 開始時刻と終了時刻を指定した上でカレンダーイベントを追加します.

 

 ここで、日付は「入力を要求」で指定したものであり、開始時刻および終了時刻は最初の「辞書」アクションにある固定のものです.

 よって「入力を要求」の結果をカスタムフォーマットで"yyyy/MM/dd"とし, 「リストから選択」で得た開始時刻と終了時刻の結果を同じくカスタムフォーマットで"hh:mm"としたものをそれぞれ繋げて適用します.

 

 イベント名は「リストから選択」で出た結果の「名前」で取得できます.

 

 

f:id:thetheorier:20211015092852p:plain

 その他の場合、つまり終日と判定された場合も同じようにアラートで確認した上で追加します.

 

f:id:thetheorier:20211015092951p:plain

 終日の場合は時刻は無視されるため、フォーマットを変える必要はないため開始時刻にそのまま入れます.

 同じく終日の場合は「終了時刻」が空であっても問題ありません.(終日判定を開始時刻で行っているのはこのためです)

 またオプションにある「終日」のスイッチをオンにしておきます.

 

 これでレシピは完了です.

 

 

 カスタム性を持たせる場合はイベント追加のアクションのオプションにある「作成シートを表示」をオンにして使ってください、イベント追加の前にカレンダーアプリが開いて対象の編集画面に移ります.

 if文で追加するのもアリですがその方が編集がラクです, 代わりに毎回作成シートが表示されそこで「追加」しないといけなくなります.

 

 

【iPhoneショートカット】数字のソートを行うレシピ

f:id:thetheorier:20210924081807p:plain

 今回は数字のソート, 並び替えの話です.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.0.1

 

 

スポンサーリンク

 


 

 

フィルタでは不十分

 ショートカットにある「ファイルにフィルタを適用」アクションに並び替えの項目はあるのですが, 並び替えの仕様に問題があり, 数字に並び替えに適さない問題があります.

 代わりになる単体のアクションもないため他の工夫が必要です.

 

 今回は先頭を0埋めして一番大きい数の桁の文字列だけ末尾から切り取る方法を…と言いたいのですが, これが通用するのは対象が整数のみの場合です.

 もし小数が一つでも存在するとこの方法は使えません.

 なので0埋めはしますが, 桁合わせは最も大きい数の整数部分の桁数を基準に「先頭から」不要な0を取り除く方法でいきます.

 

 

レシピ

 「ファイルにフィルタを適用」をシンプルに使った, ダメな例を含めてレシピを作っていきます.

 

 

f:id:thetheorier:20210924133332p:plain

 「テキスト」アクションに並び替えたい数を入れておきます.

 このままでは並び替えできないため「テキストを分割」で改行で分割し, これを使います.

 まずはダメな例, これをそのまま「ファイルにフィルタを適用」で名前をアルファベット昇順に並び替えるケースです.

 本来ならたったこれだけで並び替えできればいいんですが…

 

 

f:id:thetheorier:20210924133817p:plain

 次に最も大きい数の整数部分の桁数を計算します.

 列の最大値は「統計を計算」アクションを使って求めることができます.

 これを使って「計算式」アクションで

 

floor(log(Maximum)+1)

 

を計算させることでリストの最大値の整数部分の桁数digitsが求まります.

 

 

f:id:thetheorier:20210924134134p:plain

 次に数リストの0埋めを行います.

 数リストに対して「各項目を繰り返す」アクションを適用し,  「テキスト」アクションに好きな数だけ0を並べ, その後ろに繰り返し項目を置きます.

 次に「計算式」アクションで

 

x-[digits]+floor(log([繰り返し項目])+1)

 

を計算します.

 ここでxは上の「テキスト」アクションで入れた0の個数にします.

 この計算結果をもとに, 「テキストを置き換え」アクションで以下のようにします.

 

  • 置き換え前("こんにちは"と灰色になっている部分) → .{計算結果}
  • 置き換え後("世界"と灰色になっている部分) → 何も書かない
  • 正規表現 → オン

 

 正規表現における.(ドット)は任意の一文字にマッチします.

 そして{n}は「n回繰り返す」という意味です.

 例えば.{2}は「任意の2文字」にマッチします.

 今回計算した結果は20個並べた0の数20から最大桁数を引き, 繰り返し項目の整数部分の桁数を足したものです.

 

 今回与えた数のリストの最大値は10032で5桁なのでdigits=5, 例えば10032については20-5+5=20なので10032の場合は先頭に付けた0は結局全部取り払います.

 また1001.66の場合は整数部分の桁数が4なので20-5+4=19、つまり先頭に付けた0の文字20個のうち先頭の19個取り払い、結果01001.66になります.

 こうしてどの値も, 最大値の整数部分の桁数が揃うよう0が補われます.

 

 0埋めに必要な0の数は, リストの最大値と最小値の桁数の差で決まるのは容易にわかります.

 なので20個にしている理由は特にありません.

 

 

f:id:thetheorier:20210924140217p:plain

 これで整数部分の桁数が揃ったのでフィルタをかけて問題ないはずです. 

 「ファイルにフィルタを適用」で上の繰り返しの結果を適用します.

 

 

f:id:thetheorier:20210924140352p:plain

 因みに, フィルタをかけた時点ではテキストの扱いになっているためテキスト表示すれば当然埋めた0はそのまま表示されます.

 この後ただ表示するにしても更に計算などに使うにしても, 数として扱う場合は対象をタップして「種類」が「数字」になっていることを確認してください.

 

 

実行結果

f:id:thetheorier:20210924140601p:plain

 まずはリストを直接「ファイルにフィルタを適用」アクションにかけたものです.

 このアクションは手前の一文字一文字を順にソートする仕様のため, 画像のように例えば10032が21の前になってしまっています.

 

 

f:id:thetheorier:20210924140806p:plain

 0埋めをした場合はちゃんと正しい順番になっています.

 

 

 iOS15でこのフィルタソートも変わってくれないかと期待したのですが残念ながら変わらずでした.

 

 「変数に設定」などの冗長なアクションを削ったとしても, 本来2アクションで済むのが8アクションに増えてしまっています.

 データ数が少ないうちはいいんですが100個200個と増えるうちにかなり時間がかかるようになります.

 

 いい加減ソートのオプションを増やしてほしいです.