MYmemo

思い立ってやってみるけど、長続きしない。せめて記録しておく。

方眼ノート 手帳あれこれ

大昔にノートというか、手帳について書きました。
mymemo8.hatenablog.com

月日が経つのも早いもので、あれから数年。自力でノートをとる機会も減ってきました。今はすごいですね、議事録なんかはAIが勝手に作ってくれる時代。

しかし、ちょっと考え事をしたりするとき、頭の中のことを書き出してみると思考の整理が進むのは今も昔も(私は)変わりません。なので、携帯できる手帳をいつも持ち歩いてます。

  • パッと出して、パッと書きたい
  • かさばるの嫌なので、小さいヤツ、A4未満がいいですね
  • 鞄に突っ込んでも大丈夫なように表紙は固いのがいい

このあたりはこれまでの選定条件だったんですが、ここ2~3年は、以上に加えて方眼が良い!ハマってます。ひと昔前は以上の条件を満たせる手帳も少なかったのですが、昨今は爆発的に増えましたね!少品種の大量生産から多品種少量生産に代わってきている時代の流れを反映してるような感じがします。いろいろ目移りして時間がもったいないので、メモを取っておこうと思いましたのが本記事の趣旨です。




方眼ノートの魅力は?

この2年ほど方眼ノートをずっと使ってます。横罫線ノートに比べての魅力をざっと書き出すと

文字が整う

縦横のガイド線で、文字の位置やサイズを揃えやすい。方眼によって文字もカチッと引き締まった印象に見えます。なので書いていて気分がいいです。私は字が奇麗なほうではないのですが、それでも多少奇麗に見えるんですよね。箇条書きなんて、とても整って見えます。

逆に自由レイアウトしやすい

縦線「も」あるので、横罫線のように一方向・一列づつみたいな制限されず、縦・横自由な配置が可能

図やイラストが描きやすい

文字と同様、イラストだとかを下支えしてくれる感じがします。引き締まる感じですね。それから棒グラフだとかチャート系も書きやすいですよね。



という感じで、思いついたことを書く気にさせてくれるのが方眼の魅力ですね。




どんなものがある?

コクヨ PERPANEP(ペルパネプ)

紙質の異なる3タイプで商品展開しているところがユニーク

  • ツルツル:まるで無重力。滑らかで軽いタッチ
  • さらさら:心地よい筆記感。ジェルボールペンと相性が良い
  • ザラザラ:紙の凹凸を感じる書き心地。万年筆との相性が◎

方眼の種類も3,4,5mmと品種展開が群を抜いている。フラット製本でノートが180度開くので、手で押さえる必要なし。個人的には、ジェルボールペンしか使わないし、方眼も細かいほうが好きなので、紙質を選ぶ楽しさは味わえないかな~。

項目 詳細
メーカー名 コクヨ
価格帯の目安 高価
ページ数 60枚 (120ページ)
サイズ A5
方眼サイズ 3mm/4mm/5mm方眼、ステノ罫、ドット罫
表紙 ソフト
ゴムバンド なし
紐の栞 なし


コクヨ PERPANEP(ペルパネプ)ドイツ装

PERPANEPの高級仕様版。高いだけあってハードカバーが本当に上質で思わず手に取りたくなること間違いなし。  

項目 詳細
メーカー名 コクヨ
価格帯の目安 高価
ページ数 96枚 (192ページ)
サイズ A5
方眼サイズ 4mm方眼、ステノ罫、ドット罫
表紙 ハード
ゴムバンド あり
紐の栞 なし


測量野帳

現在の愛用品です。細かい方眼、スリムでポケットに入るサイズだし軽い、硬い表紙なので立ったまま書ける、180度フラットに開いて手で押さえる必要なし、何より1冊安い、割とどこでも売っている等、私好みの要素満載。唯一、一冊40枚しかないところ、これが不満点です。昔ながらの緑の表紙のものが一番安いですが、もうちょっと高くてよければ色展開や、コラボデザインなんかもあって、コレクターもいらっしゃるのでは?

項目 詳細
メーカー名 コクヨ
価格帯の目安 安価
ページ数 40枚 (80ページ)
サイズ 165×95mm
方眼サイズ 3mm方眼(スケッチタイプ
表紙 ハード
ゴムバンド なし
紐の栞 なし


ロジカル・プライム グリッド2.5 A6スリム

測量野鳥を使う前に使ってました。2.5mmの方眼のきめ細かな方眼に加えて上質な紙は、愛用のジェルボールペンでも裏写りしにくく、小型で背と角が丸く手に優しいラウンドシェイプ。カバーもPUレザーなので柔らかいけど強度がないわけでもなく、ページを360度折り返したりしても大丈夫。手でぎゅっと丸めて遊んでも楽しい1冊でした。収録枚数も方眼ノートの中では群を抜いて多く、かといって価格もお手頃。180度フラットに開かないので、手で押さえる必要がありますんで、作業しながら片手でメモとる、みたいな作業がしづらいのが欠点でした。   

項目 詳細
メーカー名 ナカバヤシ
価格帯の目安 標準的
ページ数 120枚程度 (240ページ)
サイズ A6
方眼サイズ 2.5mm
表紙 ポリウレタンクロス
ゴムバンド なし
紐の栞 なし


EDiT B6

これより小さいB7もありますが、これはさすがに私でも小さすぎる。

EDiT|MARK'S|B6|高価|160枚|ハード|あり|あり


NOLTY ノート B6

紙の手触り感がとてもよくて、何回か衝動買いしそうになりました。もう少し小さいサイズがあれば買っちゃうと思います。

項目 詳細
メーカー名 日本能率協会マネジメントセンター(JMAM)
価格帯の目安 標準的〜高価
ページ数 88枚(176ページ)
サイズ B6
方眼サイズ 3.5mm
表紙 ハード/ソフト(シリーズによる)
ゴムバンド なし
紐の栞 なし


コクヨ キャンパス

[rakuten:gazaihonpo:10053517:detail]

項目|詳細 ---|--- メーカー名|コクヨ 価格帯|安価 ページ数|40〜100枚程度 (80〜200ページ) | サイズ|セミB5、A4など多数 方眼サイズ|5mm 表紙|ソフト ゴムバンド|なし 紐の栞|なし


まとめると

商品 メーカー サイズ 価格 枚数 表紙 ゴムバンド 栞紐
PERPANEP(通常版) コクヨ A5 高価 60枚 ソフト なし なし
PERPANEP(ドイツ装) コクヨ A5 高価 96枚 ハード あり なし
測量野帳 コクヨ 165×95mm 安価 40枚 ハード なし なし
Grid ナカバヤシ B6 標準 240枚 特殊 なし なし
EDiT MARK'S B6 高価 160枚 ハード あり あり
NOLTY ノート B6 日本能率 B6 標準 88枚 ソフト なし なし
キャンパスノート(方眼) コクヨ A4 安価 40〜100枚 ソフト なし なし

Termux上でまた動かなくなったyfinanceを無理やり動かす方法

前回記事ではyfinanceのバージョンをダウングレードすることによってtermux上で動かす話について書きましたが、そのあと別のエラーで動かなくなりました。

mymemo8.hatenablog.com


1回か2回くらいは動いたんですけどね...違うエラーになってしまうんですよね。

File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/yfinance/data.py", line 409, in _make_request
    raise YFRateLimitError()
yfinance.exceptions.YFRateLimitError: Too Many Requests. Rate limited. Try after a while.

んで、Try after a while しても結果は同じなんですよ。



yfinanceのAPI仕様変更が原因

色々調べてみたら本件の全容をやっと理解できました。私の理解は以下です(間違ってたらすみません)


Yahoo Financeがスクレイピング対策した

こちらはyfinanceのリリース情報です。
github.com

ver. 0.2.58 の変更内容の中に、こんな一文があります

switch to curl_cffi session to fix false rate-limit errors #2430 [reason=TLS fingerprinting]

これまでyfinanceではYahoo Finance APIからのデータ取得にrequestsライブラリを使っていたらしいのですがYahoo Financeがスクレイピング対策を強化した結果、requestsライブラリではデータ取得が難しくなったためデータ取得のためのライブラリをcurl_cffiに「switch」したらしい。curl_cffiライブラリを使えば、より実際のブラウザのような挙動を再現してアクセスすることができるらしい。


requestsライブラリなのかcurl_cffiライブラリなのか?は、バージョンが0.2.57以下か0.2.58以上か、ここが境目です。でバージョン0.2.57以下(requests)でも全く動かないってことではないが、API側のアクセス制限にすぐ引っ掛かってしまう結果、冒頭のエラーになってしまう。そういうことだと理解しました。



Termux側の問題

しかし、yfinanceをバージョン0.2.58以上にすると、前回記事で書いたように、それはそれでエラーになります。

ImportError: dlopen failed: library "libcurl-impersonate.so.4" not found: needed by /data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/_wrapper.abi3.so in namespace (default)


これに対するGemini先生の見解を仰ぎますと...

このエラーは、curl_cffiというライブラリが、libcurl-impersonate.so.4という共有ライブラリを見つけられないために発生しています。yfinanceは最近、スクレイピング対策のためにcurl_cffiを内部的に利用するようになっているため、この問題が発生している可能性が高いです。Termux環境にcurl_cffiが必要とすlibcurl-impersonate.so.4というライブラリがインストールされていないか、パスが正しく通っていないことが原因です。このライブラリは、標準的なlibcurlとは異なり、より高度なウェブスクレイピング(ボット対策を回避するなど)のために使われるものです。


フムフム...


残念ながら、Termuxの公式パッケージリポジトリには、現在のところlibcurl-impersonateを直接提供するパッケージは存在しないようです。応急手段としては。curl_cffiの代わりにrequestsを使うようにyfinanceをダウングレードする (推奨される可能性が高い)方法があげられます。


いや、それはアカンねん!!

他の方法は?と、前回記事で結構検討しましたね....。





TermuxにUbuntuを入れてみた

これは前回記事を書いたときも一瞬考えましたが、スマホの要領食いそうだから後回しにしてましたが、いよいよこれしか方法が思い付かなくなってきたんで、トライすることにしました。一応Gemini先生にも意見仰ぎますと

Termux上でUbuntuを動かすことは可能です。正確には、TermuxはAndroid上で動作するLinux環境ですが、そのTermux環境内にUbuntuの最小限のファイルシステムを構築し、CLIベースでUbuntuのパッケージ管理やコマンドを利用できるようになります。TermuxでUbuntuを動かす主なメリットはTermuxのデフォルトリポジトリにはない、Ubuntuリポジトリで提供されている多くのソフトウェアやライブラリを利用できることです。また、一般的なLinux環境の再現することで、Ubuntuを前提とした多くのLinuxチュートリアルや開発環境が利用できます。


いいじゃないですか!

Termux上のUbuntu環境なら、yfinanceを動かせる可能性が高くなります。libcurl-impersonate.so.4が見つからないエラーはTermuxのデフォルト環境でライブラリが提供されていないために発生します。しかしUbuntuの標準リポジトリにはlibcurl-impersonateという名前のパッケージは直接ありませんが、curl_cffiはインストール時に必要なlibcurl-impersonateを自動的にビルドするか、互換性のある既存のライブラリを利用しようとします。curl_cffiのPyPIページによると、curl_cffiはLinux(x86_64/aarch64)向けにプリコンパイルされたバイナリホイール(*.whlファイル)を提供しており、これにはlibcurl-impersonateがバンドルされている可能性があります。 Termux上のUbuntuは一般的なLinuxのaarch64アーキテクチャとして認識されるため、このホイールが利用できる可能性が高いです。


では今回はproot-distroを使いますね。Termuxの標準ツールでUbuntuの他、DebianFedoraなどの様々なLinuxディストリビューションを簡単にインストールきます。

pkg update
pkg upgrade
pkg install proot-distro
proot-distro install ubuntu
proot-distro login ubuntu
# root@localhost:~#


Ubuntu環境に入るとプロンプトがroot@****:~に変わるはず。私は1発成功でした。Ubuntu環境から出るには exitと入力ですね。ちなみにUbuntsu環境を作ったとき、Ubuntsu側からみたフォルダ構成はこんな感じになりました。こんな感じでデータの受け渡しが可能です。

/
├─root──ubuntu環境
│
└─storage─emulated─0─termux環境



せっかくなのでUbuntu内の環境を最新にします

apt update
apt install python3-pip
pip install --upgrade pip

これでどうだ!?




で、動かしてもエラーになるんだけど?

Ubuntu環境整ったんで、早速yfinance動かしてみるとだな...

ImportError: dlopen failed: library "libcurl-impersonate.so.4" not found: needed by /data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/_wrapper.abi3.so in namespace (default)

いや、エラー変わらん....

てか、なんもインストールしてないのに、そもそもなんで動くんや?!
いや、エラーよくみたらtermux側のライブラリ見に行ってるやん?!



きっちりUbuntu側の環境を使うように設定する

これは、Termux上でproot-distroを使った場合によくある状況です。proot-distroは完全に独立した仮想マシンではありません。特にTermux側のPATH環境変数や、プロセスの実行環境がUbuntu側に引き継がれてしまうことがあります。結果、Pythonを実行する際にTermux側のPythonパスが優先されてしまい、Ubuntu側にインストールしたはずのyfinanceやcurl_cffiではなく、Termux側のPythonが使われてしまうのです。


ということで、仮想環境 (venv) を使うことにします。Ubuntu環境にログインした状態で、任意のフォルダ(今回はtest_venvにします)を用意してそこに環境作ります。一連の流れは以下の通り。python3 -m venvで仮想環境venv_yfinanceができあがり、source venv_yfinance/bin/activateで仮想環境をアクティベートします。プロンプトの先頭に(venv_yfinance)のような表示が出れば、仮想環境がアクティブになっています。なお仮想環境を終了する際はdeactivateコマンドを使用します。


mkdir test_venv
cd test_venv
python3 -m venv venv_yfinance
source venv_yfinance/bin/activate
(venv_yfinance) #root@local:~/ 


フォルダ体系的には以下のようになるハズ

/
├─root(ubuntu環境)──test_venv──venv_yfinance
│
└─storage─emulated─0─termux環境


あとは必要なライブラリやなんやらをインストールしていきます。

pip install curl_cffi yfinance



ここまですれば、うごくでしょ!?



ということで、無事yfinanceを動かすことができました!

ちなみに、この状態だとpythonコマンドは明示的にUbuntu側の環境を見に行ってうごくので、termux側のディレクトリにおいてあるyfinanceも動くようになります、が、せっかく仮想環境つくったんで、ちゃんと対象ファイルを仮想環境に持っていってから動かそうかなと思います。

yfinanceでまたエラーが出たので、無駄に苦闘した話


mymemo8.hatenablog.com

色々試行したら、termux上で、またyfinanceでエラーが出るようになりました。色々やったので、上手くいかなく成りそうな理由があり過ぎて無駄に頑張った話です。


出たエラーはこちら。ちょっと長文ですが

File "/storage/emulated///test.py", line 1, in <module>
import yfinance as yf
File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/yfinance/__init__.py", line 23, in <module>
from .search import Search
File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/yfinance/search.py", line 26, in <module>
from .data import YfData
File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/yfinance/data.py", line 5, in <module>
from curl_cffi import requests
File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/__init__.py", line 47, in <module>         
from .__version__ import __curl_version__, __description__, __title__, __version__  # noqa: F401               

File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/__version__.py", line 3, in <module>
from .curl import Curl
 File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/curl.py", line 12, in <module>
from ._wrapper import ffi, lib
ImportError: dlopen failed: library "libcurl-impersonate-chrome.so.4" not found: needed by /data/data/com.termux/files/usr/lib/python3.12/site-packages/curl_cffi/_wrapper.abi3.so in namespace (default)

いきなり1行目のyfinanceモジュールをインポートするところからエラーとか初めてでして、基本的なチェックをしなかったのが話のオチなのですが、エラーにビビって、速攻Geminiだとかに聞いてみたのが話を長期化させる要因になっちゃいました。



事の発端

詳細は別記事にしたいと思いますが、emacsをいじくり回していたら、まず、pipでインストールしていた幾つかのモジュールが勝手に?無くなってました。yfinance使って作ったツールを動かそうとしたら、まずモジュールが無い旨のエラーメッセージが出たことで事態に気が付き、yfinanceを再インストールしたら、前述のエラーになりました。再インストールでエラーという時点でプロならピンと来るはずですが、この時点ではピンと来なかったんだよな〜、悔しい。




Gemini氏の見解

以下はエラーに対するありがたいアドバイスです。(結構省略しました)

エラー報告ありがとうございます。このエラー は、curl_cffi ライブラリが特定のライブラリ (libcurl-impersonate-chrome.so.4) を見つけられないために発生する問題です。


考えられる原因と対処法1

Termux 環境に、エラーメッセージで示されている libcurl-impersonate-chrome.so.4 ライブラリがインストールされていない可能性があります。このライブラリは Termux の標準パッケージとしては提供されていない可能性が高いです。curl_cffi をインストールした際に、依存関係として自動的にインストールされることを期待していたかもしれませんが、何らかの理由でインストールに失敗したか、またはカスタムビルドであるために別途用意する必要があるかもしれません。

ちょいと曖昧ですな…
とりあえずcurl_cffiを再インストールしてみるか?

pip uninstall curl_cffi
pip install curl_cffi

…ま、何も変わらんわな…。


考えられる原因と対処法2

libcurl-impersonate-chromeライブラリがTermux のどこかにインストールされているものの、Python がそれを探しに行けるパス(LD_LIBRARY_PATH など) に含まれていない可能性があります。まず、Termux 内でライブラリが存在するかどうかを確認します。以下のコマンドで探してみてください。find / -name "libcurl-impersonate-chrome.so.4" 2>/dev/null もし見つかった場合は、そのパスを LD_LIBRARY_PATH 環境変数に追加してみることを試してください。ただし、Termux でこの変数を直接操作することが推奨されるわけではありません。

推奨じゃない対処法だから、とりあえず素人の私が手を出すのは後回しだな。次お願いします。


考えられる原因と対処法3

curl_cffi のインストール中にエラーが発生したり、ファイルが破損したりしている可能性があります。curl_cffi を再インストールしてみます。

これは、さっきやった。次お願いします。


考えられる原因と対処法4

インストールされている curl_cffi のバージョンが、要求する特定のバージョンのlibcurl-impersonate-chrome と互換性がない可能性があります。curl_cffi のバージョンをダウングレードまたはアップグレードしてみることを検討してください。どのバージョンが適切かは、エラーが発生する状況や、あなたが参考にしている情報源などを確認する必要があります。

…軽くバージョンを変えてみたが、特段エラーメッセージに変化は見られないです。次お願いします。


考えられる原因と対処法5

curl_cffi の一部機能(特に "impersonate-chrome" という名前から推測される機能)は、標準の libcurl ではなく、特定のパッチが適用されたカスタムビルドの libcurl を必要とする場合があります。Termux 環境でそのカスタムビルドの libcurl を自分でビルドしてインストールする必要があるかもしれません。これは高度な手順であり、Termux の環境によっては難しい場合があります。関連する情報源(curl_cffi のドキュメントや、その機能を利用しようとしているプロジェクトのドキュメントなど)に、カスタム libcurl のビルド手順や入手方法が記載されていないか確認してください。

これは私では対処できないですな…


考えられる原因と対処法6

yfinance ライブラリのどの機能を使用しようとした際にこのエラーが発生しましたか?curl_cffi の "impersonate-chrome" 機能は、特定のWebサイトへのアクセスを模倣するために使われる特殊な機能で、yfinance の基本的な株価データ取得には必須ではない可能性があります。もしこの特殊な機能を必要としていないのであれば、curl_cffi の代わりに他の HTTP クライアントライブラリ (requests など) を yfinance が使用するように設定できるか、または curl_cffi のインストール方法を変更できるか検討してみてください。

それは確かに思ったんですけど、具体的にどうしていいかがねぇ〜。


考えられる原因と対処法7

Termux のパッケージリストとインストール済みパッケージを最新の状態に更新してみます。

これは、勿論やりました。無論効果無し。


考えられる原因と対処法8

もし仮想環境を使用している場合は、以前に提案したように、仮想環境を再構築してみるのも有効な手段です。

termux自体仮想環境みたいなもんだから、termuxごとやっちまうかだな。後でやってみよう。


考えられる原因と対処法9

curl_cffi の GitHub リポジトリなどで、同様のエラーが報告されていないか確認してみます。もし報告されていれば、解決策や回避策が見つかる可能性があります。

ざっと探したんですけど、ほぼそれらしい文献は無さそうな…。唯一と言って良さそうなのはコレ?

github.com

なんですけど、英語ワカラナイし、分かったとしてもたぶんチンプンカンプン。


Termux では、標準的な Linux 環境と比べてライブラリの管理やカスタムビルドが難しい場合があります。まずは curl_cffi の再インストールを試し、それでも解決しない場合は、そのライブラリが依存する外部ライブラリについて、より詳しく調べてみる必要があるかもしれません。もし、このエラーが発生する具体的な状況(どのような Python スクリプトを実行しようとした時か、など)が分かれば、より的確なアドバイスができる可能性があります。

ご丁寧にありがとうございました。




termuxを初期化してみる

最後にGemini氏から提案が合った初期化を試みてみました。めっちゃ時間かかるかと思いましたが、以外と現状復帰は早かったです。

初期化も色々あると思いますが、私が試したのは 設定→アプリ→termuxのストレージの消去です。 勿論、大事なデータはどっかに退避させた上でやります。これでサラの状態にして、pythonだとかを1からインストールしていきます。

過去記事を元にyfinanceもインストール。コレが一番時間かかりました。が、特段の問題もなく、インストール完了。

これでどうだ?!

が、

アカン、結果同じや。詰んだな…





が、しかし!

めっちゃブルーな気分で過去の自分の記事を何気なく見てて、あることに気が付きました。

yfinanceが機嫌よく動いていた頃と、一つだけ明らかに違う条件あるやん!

mymemo8.hatenablog.com

それは、この記事の争点でも合ったyfinanceのバージョンで、

  • 当時:Version: 0.2.54
  • 現在:Version: 0.2.58(現時点最新)

まさか、バージョン落とすだけで動いたりして?

pip install yfinance==0.2.54

すると…

動くやん!なんて初歩的な結末…。

しかし、これは根本的には解決されていないというか、コレまた前回記事のように、古いバージョンが新環境と互換性が保たれ続けられる保証は無く、実際過去記事のようにyfinanceは古いバージョンと新APIとが互換性を失って使い物にならなくなった訳で、最新バージョンで難なく使えることが望ましいんですけど。

ま、そのときはまた誰か凄い人が解決手段を提示してくれることを期待するしか無いかな。とりあえず今は機嫌よく動いてるから良しとしよう。


WOXのプラグインをPythonで作ってみた。(Sqlite3 でメールアドレスを呼び出す)

mymemo8.hatenablog.com


前回記事で紹介したWOXを使ってキーワードを下にメールアドレスを呼び出せるプラグインを作ってみました。

ちなみにメーラーOutlookを使ってます。
Windowsだと定番ですよね?

オートコンプリート機能を使っておられる方は多いハズ。便利ですからね。

Outlookで、過去に入力したアドレスなどを途中まで入力したときに、アドレス候補を自動的に補完して表示してくれる機能です。

途中まで入力することができれば、後はやってくれる。最高ですね。しかし、あくまで「途中まで入力できること」前提です。送りたいメールアドレスの先頭一文字すら思い浮かばない、なんてザラにありませんか?私が思いつくだけでも以下の通り

  • 普通アドレスって「苗字.名前@〇〇」ですけど「名前.苗字@〇〇」とかありますよね?苗字でしか呼んだことがない相手を名前から入力し始めるのは無理
  • 申し訳ないが、顔とか会社名は思い浮かぶけど、名前が思い出せない
  • 名前と関係ないアドレス、これは覚えられない

以上の様な場合、過去のやり取りを検索するとか、しないといけないですよね。

で、この検索をWOXでできるようにプラグインを作ってみました。




プラグインのフォルダ体系

プラグインを収めるPluginsフォルダは私のPCだと以下です。

C:\Users\username\AppData\Local\Wox\app-1.4.1196\Plugins

ここにWoxtestというフォルダを作りました。それ以下は以下の通りです。main.pyplugin.jsonは必須です。main.pyは、雛形が公式サイトに上がっているので、それを使いました。

Woxtest  
├─ main.py
├─ plugin.json
├─ memo.db
└──Images
        └── image.pn




plugix.json

これも雛形が公式にあります。特に重要な変更箇所はIDActionKeywordです。

ActionKeyword

プラグイン起動のためのkeyになります。今回はmlにしてみました。

ID

IDは取得する必要があります。色々やり方はありますが、私は以下のpythonファイルを作って実行しました。

import uuid
print(uuid.uuid1().hex.upper())  


plugix.json全文

{
    "ID":"7B454539E03C11EF9CCAE02E0B8D64D0",
    "ActionKeyword":"ml",
    "Name":"Hello World Python",
    "Description":"Mail address serch",
    "Author":"Wox",
    "Version":"1.0",
    "Language":"python",
    "Website":"https://github.com/Wox-launcher/Wox",
    "IcoPath":"Images\\app.png",
    "ExecuteFileName":"main.py",
    "Disabled": true
}




main.py

from wox import Wox
import pyperclip
import sqlite3


class HelloWorld(Wox):

 from wox launcher
    def query(self, query):
        con=sqlite3.connect("memo.db")
        cur=con.execute("select * from mail where name like '%"+query+"%' or company like '%"+query+"%' order by name desc")
        tmp=cur.fetchall()
        results = []
        for ii in tmp:
            results.append({
                "Title": ii[1],
                "SubTitle": ii[2]+"Query: {}".format(query),
                "IcoPath":"Images/app.png",
                "ContextData": "ctxData",
                "JsonRPCAction": {
                    'method': 'take_action',
                    'parameters': [ii[0]],
                    'dontHideAfterAction': False
                    }
                })
            
        return results


    def take_action(self, SomeArgument):
        pyperclip.copy(SomeArgument)

        return None

if __name__ == "__main__":
    HelloWorld()


memo.db(sqliteファイル)

試しに、こんな感じのテーブルを用意しました。




動作確認

woxを起動してmlと打つと、ちゃんとプラグインが起動します。株式会社を打つと先ほどのテーブルにある登録アドレスで、有限会社分だけ除外されて表示されました。表示結果をクリックしたらアドレスがコピーされるのでctrl+Vでペーストできます。

あとはsqliteに思い出せないアドレス追加していけば、という感じです。



Simplenoteの使い方の工夫

Simplenot長年愛用してます。シンプルすぎてメモる事に専念でき、超高速で同期するクラウドメモ。ただ、シンプルであるがゆえ不満は多いです。


mymemo8.hatenablog.com



前回記事では外部リンクを活用して画像を呼び出してくることについて書きました。Simplenoteは、もうこれ以上の進化は望めるはずはない(?)ので、こんな感じで外部の力を使って機能拡張というか、なんとか使う方法を考えました。


このアイディア?はこれを執筆していたときに気が付きました。

mymemo8.hatenablog.com

ランチャーからgoogle mapで特定の場所を検索して呼び出す手法を考えたとき、サイトURLを自動生成するのなら、生成してほしいURLを指定してやればいいのだ!

…この文章、合っているのだろうか??
もしよろしければ、私の国語、正してくださいませ。なお、こういう使い方は別にsimplenoteに限った話じゃなくて、別にこのはてなブログでも、なんでも応用が効きます。なんで今まで思いつかなかったんだろう。


実際に見て頂いたほうが早いということで、




Google map

グーグルマップのURLのうしろにsearch/?api=1&query=として、そのうしろに住所をいれたリンクをつくると、グーグルマップの検索窓に住所を入力して実行したのと同義になる。

例えば、東京タワーの住所入れとくと、リンクで一発で飛ぶ。ついでに公式サイトの画像リンクを勝手に拝借してMarkdownで書いてみたのが下記。

# 東京タワー  

[google mapを開く](
https://www.google.com/maps/search/?api=1&query=東京都港区芝公園4丁目2−8)

![image](https://www.tokyotower.co.jp/images/alt_img/slider_000_01.jpeg)


実際Simplenoteでプレビューしてみると、こんな感じ。ちょっとした旅行メモとか、これで良いのでは?



ちなみに、こちらの記事を参考にさせていただきました。

https://qiita.com/hiron2225/items/8d5cd1b6728b4d63434b:plain




米国株の配当日

超少額でやってます米国株式。楽しみにしている配当ですが、あまりいいサイトがありません。そんななかで一番よくまとまってるのはinvesting.comだと思います。ここの生成URLは.comの後ろにequities/銘柄名-co-dividendsで直近の配当履歴が出てきます。

例えばコカ・コーラMarkdownで書くと、

# 株investing  

[コカ・コーラ](https://jp.investing.com/equities/coca-cola-co-dividends)  

リンクに飛ぶとこんな感じです。

…配当額上がってる。売らなきゃ良かった…。

尚、ガッツリとデータを取得したいなら、yfinanceでapi叩いて取得する手段あります。




数式 Hostmath.com

分数だとか、ルートだとかが入る複雑な数式、公式をメモるのにもってこいのサイト。たぶんあんまりニーズはない…か?当該サイト自体は以下。


https://www.hostmath.com/:plain

数式自体を表現するのはちょっと骨が折れるのですが…学生の時かじったLatexが懐かしい。相対性理論の数式作ってみました。合ってます?

https://www.HostMath.com/Show.aspx?Code=E%3D%5Cfrac%7Bmc%5E%7B2%7D%7D%7B%5Csqrt%7B1-%5Cleft(%5Cfrac%7Bv%7D%7Bc%7D%5Cright)%5E%7B2%7D%7D%7D:plain


Markdownだとこんな感じ。


[e=mc2](https://www.HostMath.com/Show.aspx?Code=E%3D%5Cfrac%7Bmc%5E%7B2%7D%7D%7B%5Csqrt%7B1-%5Cleft(%5Cfrac%7Bv%7D%7Bc%7D%5Cright)%5E%7B2%7D%7D%7D)  




メーカーの商品検索

家のシーリングライトを変えたんですが、その時のメモです。このメーカーのさいとは商品の型番を元にURLを生成するので、Markdownだとこんな感じ。


[シーリングライト](https://www2.panasonic.biz/jp/member/zerolisc/a2A/move?ts=/scvb/a2A/opnItemList?search_kbn=1&use_obligation=line&s_hinban_key=LGC38200&s_insys_kbn=1)

![image](https://www2.panasonic.biz/ideacontout/CL/jp/lighting/lighting_export/image/preview/img_ga/2LGBZ3189MP2.jpg)


key=の後ろに品番入れます。プレビューするとこんな感じ。


yfinanceでエラーが出るようになった

以前作ったツールが突然エラーを出すようになりました。この記事を書く数週間前の話です。以前の記事については以下を参照ください


mymemo8.hatenablog.com



コードは全く変更してないのに急に動かなくなるとか、どーいうことよ?試しに簡単なコードを作ってみます。

import yfinance as yf
import pandas as pd


ticker_info = yf.Ticker("CVX")
print(ticker_info.actions)

ticker_df = pd.DataFrame.from_dict(ticker_info.info, orien\
t='index', columns=['Value'])

print(ticker_df)


特に問題なければ、米国株CVX(シェブロン)の基礎的な情報を取得できるはずですが、以下の通り、エラーとなりました。

$CVX: possibly delisted; no price data found  (1d 1926-03-17 -> 2025-02-20)
Series([], dtype: object)
429 Client Error: Too Many Requests for url: https://query2.finance.yahoo.com/v10/finance/quoteSummary/CVX?modules=financialData%2CquoteType%2CdefaultKeyStatistics%2CassetProfile%2CsummaryDetail&corsDomain=finance.yahoo.com&formatted=false&symbol=CVX&crumb=Edge%3A+Too+Many+Requests
:
:  

エラーメッセージ的にはこれと言ってピンと来るものはないが、考えうる対策はバージョン上げるとかだろうな。

ライブラリの現行バージョンと最新バージョンをを確認するにはpip list -oですね。やってみますか…


$ pip list -o  

Package  Version  Latest   Type
------------------------
Flask    3.0.3    3.1.0   wheel
Jinja2   3.1.4    3.1.5   wheel
lxml     5.3.0    5.3.1   sdist
numpy   1.26.5    2.2.3   sdist
pandas   2.2.2    2.2.3   sdist
pip      24.2     25.0.1  wheel
yfinance 0.2.43   0.2.54  wheel

…全体的に最新ではないんですけど、とりあえず、yfinanceだけ更新してみました。pip install -U パッケージ名を実行します。

長いですが、実行結果を全文記載します。yfinanceを動かすためには、非常に多くの他のパッケージに依存してるんだな、という気づきであります。


$ pip install -U yfinance
Requirement already satisfied: yfinance in /data/data/com.termux/files/usr/lib/python3.11/site-packages (0.2.43)
Collecting yfinance  

Downloading yfinance-0.2.54-py2.py3-none-any.whl.metadata (5.8 kB)

Requirement already satisfied: 
pandas>=1.3.0 in /usr/lib/python3.11/site-packages (from yfinance) (2.2.2)

Requirement already satisfied: 
numpy>=1.16.5 in /usr/lib/python3.11/site-packages (from yfinance) (1.26.5)

Requirement already satisfied: 
requests>=2.31 in /usr/lib/python3.11/site-packages (from yfinance) (2.32.3)

Requirement already satisfied: multitasking>=0.0.7 in /usr/lib/python3.11/
site-packages (from yfinance) (0.0.11)

Requirement already satisfied: platformdirs>=2.0.0 in /usr/lib/python3.11/site-packages (from yfinance) (4.3.3)

Requirement already satisfied: 
pytz>=2022.5 in /usr/lib/python3.11/site-packages (from yfinance) (2024.2)

Requirement already satisfied: 
frozendict>=2.3.4 in /usr/lib/python3.11/site-packages (from yfinance) (2.4.4)

Requirement already satisfied: 
peewee>=3.16.2 in /usr/lib/python3.11/site-packages (from yfinance) (3.17.6)

Requirement already satisfied: beautifulsoup4>=4.11.1 /usr/lib/python3.11/site-packages (from yfinance) (4.12.3)

Requirement already satisfied: 
soupsieve>1.2 in /usr/lib/python3.11/site-packages (from beautifulsoup4>=4.11.1->yfinance) (2.6)

Requirement already satisfied: python-dateutil>=2.8.2 in /usr/lib/python3.11/site-packages (from pandas>=1.3.0->yfinance) (2.9.0.post0)

Requirement already satisfied: 
tzdata>=2022.7 in /usr/lib/python3.11/site-packages (from pandas>=1.3.0->yfinance) (2024.1)

Requirement already satisfied: charset-normalizer<4,>=2 in /usr/lib/python3.11/site-packages (from requests>=2.31->yfinance) (3.3.2)

Requirement already satisfied: 
idna<4,>=2.5 in /usr/lib/python3.11/
site-packages (from requests>=2.31->yfinance) (3.10)

Requirement already satisfied: 
urllib3<3,>=1.21.1 in /usr/lib/python3.11/site-packages (from requests>=2.31->yfinance) (2.2.3)

Requirement already satisfied: 
certifi>=2017.4.17 in /files/usr/lib/python3.11/site-packages (from requests>=2.31->yfinance) (2024.8.30)

Requirement already satisfied: 
six>=1.5 in /usr/lib/python3.11/
site-packages (from python-dateutil>=2.8.2->pandas>=1.3.0->yfinance) (1.16.0)

Downloading yfinance-0.2.54-py2.py3-none-any.whl (108 kB)

Installing collected packages: yfinance
Attempting uninstall: yfinance
Found existing installation: yfinance 0.2.43
Uninstalling yfinance-0.2.43:
Successfully uninstalled yfinance-0.2.43
Successfully installed yfinance-0.2.54  

最新版インストール成功と出たところで、もう一度パッケージバージョンを確認します。


$ pip list -o

Package     Version   Latest    Type
------------------------------------
Flask    3.0.3     3.1.0     wheel
Jinja2   3.1.4     3.1.5     wheel
lxml      5.3.0     5.3.1    sdist
numpy     1.26.5    2.2.3     sdist
pandas     2.2.2     2.2.3     sdist
pip         24.2      25.0.1    wheel


$ pip show yfinance  

Name: yfinance
Version: 0.2.54

最新ですね。これで冒頭のスクリプトを実行しますと、エラーは出ませんでした。ちなみに出力は以下の通り。

Dividends  Stock Splits
Date
1962-01-31 0.029762          0.00
1962-05-07 0.029762          0.00
1962-08-07 0.029762          0.00
1962-11-07 0.029762          0.00
1962-12-17 0.000000          1.05
...                              ...           ...
2023-11-16 1.510000          0.00
2024-02-15 1.630000          0.00
2024-05-16 1.630000          0.00
2024-08-19 1.630000          0.00
2024-11-18 1.630000          0.00

[227 rows x 2 columns]
Value
address1  6001 Bollinger Canyon Road
city             San Ramon
state           CA
zip              94583-2324
country      United States
...                  ...
sourceInterval         15
exchangeDataDelayedBy         0
averageAnalystRating       2.0 - Buy
displayName              Chevron
trailingPegRatio          3.5643

[175 rows x 1 columns]

ランチャーアプリ WOXの紹介

ランチャーアプリとはご存知でしょうか?

ランチャーのことを端的に示す良い例があんまり見つからず、なぜか説明してる大同大学 情報学部のページから引用しますと以下の通り。

ランチャーとは、コンピュータにインストールされているアプリケーションの一覧を表示して好きなものを起動させるプログラムです。Windowsならスタートメニューがそれに当たります。あるいはプレインストールされているソフトを簡単に使えるように、コンピュータメーカーが独自に用意しているものもあるでしょう。そんなものは当たり前と思われるかもしれませんが、古いOSでは標準的に付いているものではありませんでしたから、ランチャーを別途用意したものでした。ランチャーがなければどうするかといえば、コマンドとしてプログラム名をキーボードから入力するわけです。ですから、ワープロは「JXW」とかエディタは「EMACS」だとかプログラム名を覚えておかなければなりませんでした。今では考えられないですね。ランチャー(launcher)とは、元々「発射台」という意味です。プログラムを起動するのはミサイルを発射するのと同じくらい大変なものだったということなんでしょうね


仕事上パソコンで物を探したり、何かのアプリや機能にアクセスしたりしようとしたとき、どこに有ったっけ?どうやってやるんだっけ?に費やす時間が多くないですか?

私は要領が悪い人間でして、結構あります。
これを前々から解決したくて色々なフリーソフトを試してみてます。

ランチャーも手をだしてみて、一つ良さげな物を試行中でして、これを今回紹介します。
あ、今回は仕事で使うので、利用環境はWindowsを前提としてます。


どんな物がある??

Alfred

Macだったら、これなんだろう。WOXも、これの「alternative」だと書いてるし。残念ながらWindowsでは使えない。


Power Toy

ランチャー機能だけではなくて、その他豊富多彩な機能群を提供するMicrosoft純正かつOSS

learn.microsoft.com

一回試しにインストールはしてみましたが、個人的にはイマイチといいますか、機能豊富なんですけど、ランチャー以外らほとんど私が使わない機能ばかりなので、アンインストールしました。



Flow Launcher

www.flowlauncher.com

今回紹介しますWOXを入れた後に、存在に気が付きました。私自身で試してはいませんが、記事をみてる限り、かなりWOXと似てるというか、多分源流は同じなんだろう。(WOXからの派生がFlow luncherっぽいコメントはちらほらだがホントかな?)
記事とか見てると、こっちの方が良さそうな気もするが、今更乗り換えるの面倒だ。WOXと同様、日本語記事が少なく、試してみないと評価できんかな。



Ueli

ueli.app これはそもそも、うまくインストールできませんでした。他に紹介してますのに比べて、機能はシンプルなので、あれもこれもは要らない人には向くのかな?



WOX

www.wox.one

Wox is a cross-platform launcher that simply works. It's an alternative to Alfred and Launchy

で、本日の本題です。なぜかflow luncherの存在に気が付かず、これをインストール。参考文献が中文が多かったりするので、開発はそっちの言語圏寄り中心なんでしょうか?何しろ日本語参考記事は勿論、英語記事すらあんまり無くて、中文は読めないので、使い方試行錯誤しないといけないのが最大の難点かなと。

が、便利なのは事実。更新履歴を見ると、定期的にバージョンアップしてるので、活発に開発はされているかなと。




WOXの良いところ

ランチャーなので、ワンアクションで様々な機能に高速アクセスします。起動はalt + spaceキーの同時押し。

everything連携で高速検索

image

以下、窓の社より…

ファイル検索ソフト「Everything」と連携することで高速検索機能を実現。セットアップの前に「Python」と「Everything」を導入しなければならないのが少し面倒に感じるかもしれないが、特に設定の必要などはなく、またどちらにもインストーラーが用意されているのでそれほど手間ではないだろう。

Everythingは前々から重宝してて、これが一発で呼び出せるのは結構いいですよ!お探しのファイルやアプリに一撃でアクセスできます。

mymemo8.hatenablog.com



これ気に入ってます。よく使うポータルサイトの検索窓に直接入力し、検索結果応答を表示してくれる(この表現は正しいんだろうか…)、という凄い機能です。

多分伝わらないので、絵で説明します。例えば「map 東京タワー」とすると、こんなふうに候補が出てきます。

で、候補を選択するとブラザーが開いて、グーグルマップの検索窓に「東京タワー」と入力して検索した結果の状態まで一発で行ってくれます。



プラグイン : 電卓

よくある機能だが、地味に便利。WOXをいれるまではWin + rで「calc」を起動してました。なので、若干手数が減ります。



プラグインを自作できる

Pythonなどを使って自作できます。私はアドレス検索のプラグイン作ってみました。後日追記したいと思います。




WOXの個人的な注意点

まず前述の通り、参考記事が少ない!あまりに少なくて、使って大丈夫なソフトなのか不安になるし、ちょっとの躓きすら解消できるかできないかの判断もつかないもどかしさが、なんともね…



プラグイン : Web Search

初期設定ではChromeを開く設定になってます。仕事だとEdge主体なので、変更しました。