ログ日記

作業ログと日記とメモ

Googleの検索順位を手軽に数えるブックマークレット

普段ブラウザのブックマークレットとして登録しているけれど、他のPCで使いたくなったとき用にメモ。

まず、Googleの検索オプションで100件表示にする。
シークレットウィンドウでも使うために、規定の検索エンジンのURLに「&num=100」を付け足すのでも良い。


その後、検索結果ページ(SERP)のHTMLをJavaScriptで調べる。

javascript:s = prompt('url'); document.querySelectorAll('#search a h3').forEach((v, i) => {if (v.parentNode.href && v.parentNode.href.match(s)) alert(v.parentNode.href +': ' + (i+1) + '位')})

alertしているけれど、コピペするならconsole.logで表示または画面に独自ダイアログを表示しても良いかも。


HTMLに影響されるのでSERPのHTMLに変更があったらその都度対応していく必要があるかもしれない。

PHPでDDDのようなClean Architectureのような単純なLayeredとIoC

最近PHPコードをリファクタリングしている。

DDDやクリーンアーキテクチャの記事や
5年間 Laravel を使って辿り着いた,全然頑張らない「なんちゃってクリーンアーキテクチャ」という落としどころ
この辺の記事を読んだりして、自分なりの最適解を探している。


まだやり始めたところだけど、現状をメモしておく。


まず、PHPで今書いているコードは基本的にUIに関連する処理が最も多く、ドメインロジック的なものよりプレゼンテーションロジックが多いということをふまえて。

src/
└── Ddd
    ├── Application
    │   ├── UseCase
    │   │   └── Cart
    │   └── ViewUseCase
    │       ├── Cart
    │       └── Product
    ├── Domain
    │   ├── Cart
    │   └── Product
    └── Io
        └── Infrastructure
            ├── Cart
            ├── Order
            └── Product

アプリケーション層のユースケースと同じ階層に表示のためのユースケースを入れる。
これは、表示のための文字列を整形する処理が結構な分量あり、それをテストしたいため。CQRS(というかCQS)のクエリ結果を整形して、それが正しく整形されたかチェックしたい。なので複雑なクエリもアプリケーション層に入れる。
ViewUseCaseではデータの保存は無し。
「保存 => 結果を取得して表示」の場合はまずUseCaseで保存して ViewUseCase のクエリで表示用のデータを取得する。

また、リポジトリはアプリケーション層に所属する。ドメインリポジトリを扱わない。
他のDDDなどの解説で、ドメインロジックがfindやstoreを実行しているけど、それってユースケースでは?という単純な疑問がある。あとユースケースに沿ったSQLを書きたくて、ドメイン用の全部入りSQLは発行したくないので。
それにstrict layeredとの相性も悪そうだった。
ドメインロジックは、ロジックというか型変換に徹する。DomainではなくてType というネームスペースにしようか迷ったぐらい。基本的にはユースケースのコードが膨らむことになる。
そこは諦めてテストを書く。
そうすると結局、昔ながらのレイヤー構造+IoCリポジトリだけ依存関係を逆転させた普通の構造になったかもしれない。



テストはユースケースに対して行う。ドメイン(というかここでは細かい型用のクラス)はリファクタリングしたいのでテストを細かく書かない。
ユースケースにプレゼンテーションを含めたことにより、ブラウザが表示するUIと直結しているので、UIのテストも多少は兼ねることになっている。


PHPのファイルも込みで並べると

└── src
    ├── Controller
    │   ├── Cart
    │   │   └── IndexPage.php
    │   └── Product
    │       ├── DetailPage.php
    │       └── IndexPage.php
    └── Ddd
        ├── Application
        │   ├── UseCase
        │   │   └── Cart
        │   │       ├── AddCartUseCase.php
        │   │       ├── CartItemRow.php
        │   │       ├── CartRepository.php
        │   │       └── CartRow.php
        │   └── ViewUseCase
        │       ├── Cart
        │       │   ├── CartDto.php
        │       │   ├── CartItemDto.php
        │       │   ├── CartQuery.php
        │       │   ├── GetCartPageUseCase.php
        │       │   └── RowDtoConverter.php
        │       └── Product
        ├── Domain
        │   ├── Cart
        │   │   ├── Cart.php
        │   │   └── CartItem.php
        │   └── Product
        └── Io
            └── Infrastructure
                ├── Cart
                │   ├── CartQueryImpl.php
                │   └── CartRepositoryImpl.php
                ├── Order
                └── Product

こんな感じになっている。
UseCaseからViewUseCaseへの参照は無し。逆はあり。

Row はリポジトリからのマッピングクラス、Dto はUIへのマッピングクラスになっている。
本当はここもインターフェースと実装クラスを分ける方が綺麗だけど、大量にあるカラムのgetterを用意するのが面倒なので、オブジェクトのpublicプロパティにした。そうするとユースケースがDBのカラムを少し知っていることになるけれど、これは妥協で。インフラ層で詰め替えてもいいけど、インフラは基本的にコードを少なくしたくて、何の加工もせずにそのまま返したい。加工はアプリケーション層でやって、それはテスト対象になる。本気で切り離してもあまりメリットはなく、変更を追いやすく修正しやすければ良いので。

基本的にstrict layered、つまり階層を飛び越えて参照しない。
コントローラーからはドメインを参照しない。ここを甘くするとテンプレートでメソッドを呼び出したりしてしまうので。
テンプレートエンジンに渡すのは、ユースケースから返ってきたDtoをそのまま渡す。
コントローラーでフォームの処理とエラーチェックをしているけど、本当は Io\Form 等に入れたい。まだそこまで行ってない。

とりあえず今はこんな感じ。

GnuPG を使えるメーラーを探す

Thunderbird 78 で OpenPGP が組み込み機能になった代わりに Enigmail プラグインが使えなくなって GnuPG と連携ができなくなったらしい。
Thunderbird 78 系で GnuPG を使う【ただし不完全】 | text.Baldanders.info
インポートしたら使えたけど、鍵の管理が別々になってしまう。
プラグインの方が使いやすかった。

他のメーラーを探すと Sylpheed というものがあるらしい。軽さがウリでデフォルトでGnuPGが使えるらしい。
これは機能がシンプルすぎるので、SylpheedからフォークしたClaws Mailをインストールした。

apt install claws-mail claws-mail-tools

でもGmailIMAPログインできず…。セキュリティを下げてパスワード認証に対応する設定が必要になるみたい。
あとClaws Mailのアカウント設定画面を開こうとすると segmentation fault で落ちる。


今すぐ必要というわけでもないのでThunderbirdの更新を待つか…。



その他。

GnuPGP で利用法(Usage、暗号化とか署名とか)を変更する。
security.stackexchange.com
change-usage という隠しコマンドがあるようだ。
これで [SC] になっているものを [C] だけに変更したりできる。隠しコマンドというかhelpに追記忘れ?とりあえず実行してみたら問題なく使えてるっぽい。


メモ
gpg のはなし · GitHub


# 2021/03/26 追記
ひとまず前のバージョンのThunderbird をDLしてきてインストールした。
オプションで自動更新をオフにしておく。
やっぱりこっちの方が使いやすい。

macOS Big Sur に更新すると VMware Fusion 10 が動かなくなった

修理の前にMacを更新して、そのあとあまり動作確認していなかった。
どうやらVMware Fusionが動かなくなっていた模様。

構成した設定でこの仮想マシンをパワーオンするには物理メモリが不足しています

というエラーだったのでメモリやディスクが原因かと思って遠回りしてしまった。

元々使っていた VMware Fusion 10 はBig Surに対応していないらしい。
他にも色々問題があったようだ。

VMware Fusion 12.1公開 - ゲスト内仮想環境機能復活、macOS Big Sur対応 | TECH+

macOS のバージョンを上げるたびにVMwareのアップグレード版を買うのはつらい。
仕方がないので VMware Fusion Player 12.1 をインストールした。


古いVMware Fusion はそのまま Player をインストールすると自動的に上書きされる?
特に問題なく起動した。
仮想マシンの複数起動もできるし、特に違いは無いっぽい?

技術駆動パッケージングとstrict layered

一般的な用語かどうか分からないけど、DDDなどの構造に関する方式メモ。


「技術駆動パッケージング」
DDDをいざやろうとして、実際にファイルをどこに置くの?どういうカテゴリーでディレクトリにまとめるの?という疑問への回答。
これはアンチパターン派が多そう。

ただ、この図を見ると、コントローラーも同じディレクトリにまとめてしまった方が分かりやすくない?と思うのだけれど。
コントローラーやDBアクセス(リポジトリの実装クラス)ごと一つの機能の構成単位としてディレクトリにまとめてしまっても良いような。設計が綺麗じゃない感じがするけど、フレームワークもDBも変更しない前提なら特にデメリットは無いような気がする。



「strict layered と relaxed layered」
レイヤーを飛び越えてアクセスしても良いかどうか。
これはそれぞれ自分で選んでねということらしい。

qiita.com

詰め替えのコードが少ない手間で書けるのなら全部詰め替えた方が良いんだろうけど、増えてくると結構な手間がかかりそう。言語による?

ThinkPadに入れたDebianホスト VMware Windowsゲストでスマートカードリーダーを使う

ThinkPad の P17 のオプションでスマートカードリーダー付きにしたので使ってみる。
カーネル
Lenovo ThinkPad P17 に Debianをインストールする - ログ日記
ここで5.8 に更新済み。

まずはLinuxにカードリーダーを認識させる。

# uname -r
5.8.0-0.bpo.2-amd64

# lsusb |grep AU9540
Bus 001 Device 005: ID 058f:9540 Alcor Micro Corp. AU9540 Smartcard Reader

apt install pcscd pcsc-tools

pcsc_scan を実行して、ICカードを挿して反応を見る。

# pcsc_scan
Using reader plug'n play mechanism
Scanning present readers...
0: Alcor Micro AU9560 00 00
 
Sat Feb 27 15:30:14 2021
 Reader 0: Alcor Micro AU9560 00 00
  Event number: 0
  Card state: Card removed, 

VMwareWindowsを立ち上げて、カードリーダーのドライバーをインストールする。
再起動して、メニューから Removable Devices => Shared Alcor Micro AU9560 00 00 => Connect をクリックしてWindowsに接続する。

バイスマネージャーに「スマートカード読み取り装置」が生えてきたらOK。


ちなみにUSB接続のACR39-NTTComは

UdevQt: unhandled device action "bind"

というメッセージが出るけど、認識に問題はないようだ。

 Reader 0: ACS ACR39U ICC Reader 00 00
  Event number: 4
  Card state: Card removed, 

同様にVMwareでconnectすればWindowsでも使える。

MacBook Proを修理に出した

バッテリーが膨張したので修理に出した。

結構前からこうなっていて、でも仕事用PCがこれしかなかったので修理に出せなかった。

MacBook Pro 2017 15inch の Touch Bar が壊れた - ログ日記
更に前からTouch Barは壊れていたんだけど、さすがにバッテリーがもし完全に壊れたらちょっと大変っぽいしね…。

ひとまず近所の代理店に予約を入れて話を聞くと、バッテリーの修理2万円またはTouch Barなどの修理で8万円になるとのことだった。
Touch Barがバッテリーが原因による故障でバッテリー修理のカテゴリーで直してもらって2万円で収まるのか、別要因で追加で費用がかかるのか、Appleに送ってみないと分からないということらしい。


その場ではひとまず持ち帰って、少し考えてちょっと遠いApple Storeまで行ってきた。
でも結局同じような回答だった。
代理店の手数料5000円分?だけ安いけど、これは配送修理と同じ値段なので交通費の分だけ若干損になったかもわからん。
いや、でも対面じゃない状態でチェックされて本体見ずに8万円って確定されたら困るし、しゃーない。配送修理ってどうやって見積もるんだろう。

Apple Storeの人は、とりあえず2万円で送っておきますね〜金額は変わるかも〜ということだった。
どうなることやら。
iPhoneはかなり長持ちしてるからMacBookも丈夫なんだと勝手に思ってたけど全然そんなことなかったようだ。

中のデータは、わざと消すようなことはないのでなるべく残すという方向になるようだ。


# 2/23 追記

2/20 に修理から返ってきた。
金額は2万円でいけたようだった。
Touch Barもバッテリー価格で直してもらって、ひとまず安心。ディスクも元のままだった。
修理の前にアップデートしたらKarabiner-Elementsが動かなくなってアップデートもエラーになったので新しいバージョンをDLして再インストールした。

Apple Storeで聞いた話だと、電源を繋ぎっぱなしで使っているとバッテリーが膨張しやすい模様。
電源を繋ぎっぱなしの方が良いという意見と繋ぎっぱなしはダメという意見が両方あってどちらが本当か分からないが、ひとまずApple Storeで聞いたことを信じて充電100%に近いときは電源を繋がないようにしてやってみる。


バッテリー膨張したMacBook Pro(2017, 15-inch)を修理に出したら無料&3日で帰ってきた - ほりべあぶろぐ
何かMacBook Pro 2017 15-inch 特有の問題があったのかな?
最初にちょっとおかしかった段階で修理に出していたら無料だったりしたのだろうか…。

MacBook Pro (15-inch, 2018) のバッテリーが膨張してトラックパッドが浮き上がってきたので修理に出してきた話 | Interest Speaker
2018の例。当たりハズレがあるのだろうか。