【Vue】ブラウザで長押しによる画像ダウンロードを禁止する

まず以下で実現できる。
しかしクリックイベント受け付けなくなってしまう。

img {
  pointer-events: none;
}

他には以下を書けばよいと色んな記事に書いてあった。
これでiphoneandroidでは制御できた。
しかしipadsafarichrome)で長押しできてしまう。

img {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -moz-touch-callout: none;
  -moz-user-select: none;
  touch-callout: none;
  user-select: none;
  -ms-user-select:none;
}

最終的に以下を追加してipadでも長押しできなくなった。

img {
  -webkit-user-drag: none;
}

【Clean Architecture】第8章 オープン・クローズドの原則

「Clean Architecture」の学習記録。
「第8章 オープン・クローズドの原則」のまとめ。

原則

オープン・クローズドの原則(OCP)とは、ソフトウェアの振る舞いは既存の成果物を変更せず拡張できるようにすべき、という原則。

具体例

例として、財務情報をウェブページに表示するシステムが存在するとする。
追加機能として、画面の内容をプリンターで印刷できるようにしなければならない。

このとき、よくできたアーキテクチャなら既存コードにの修正は必要最低限に抑えられる。

方法としては、

  • まず変更する理由が異なるものは、単一責任の原則(SRP)で適切に分割する
  • それらの依存関係を依存関係逆転の原則(DIP)で適切にまとめる

処理をクラスに分割して、それぞれのクラスをコンポーネントにまとめる。
以下はコンポーネントを表す図。

通常の矢印は使用、白抜きの矢印は実装や継承を表す。

http://www.plantuml.com/plantuml/png/XOz12i9034NtFKLFq1E852m5TqL1r-du5mFJfAGfRZoyK2dKqD7jl3T9NZqPgSr3Ae8Cep3OoZOoSOYKBXX5xIHiAYb1DyurAC2TOWBR5-aqiks1E_fRn7EhDgrxSQlFR50A9hhdD6JKquIYo5vS7bvLvO_ze_i2z_lZh36BwzYQbLzJLiSVgLcoZD_fhy6FUKXl

矢印の向かっている先が、自分自身を変更したときに影響を及ぼしたくないコンポーネントである。

  • 例えばPresenterを変更したときに、Controllerを変更する必要をなくしたい。
  • Viewを変更したときに、Presenterを変更する必要をなくしたい。
  • 他の全てを変更したときに、Interactorを変更する必要をなくしたい。

この中でOCPに最も適しているのはInteractorである。
なぜこのコンポーネントが特権的な位置づけになるかというと、ビジネスルールを含んでいるからである。
Interactorはアプリケーションの最上位レベルの方針を含んでおり、中心となる関心事を処理している。
その他のコンポーネントは周辺の関心事を処理している。

レベルの概念に基づいて保護の階層が出いている。

  • Interactorは最上位レベルの概念なので最も保護される
  • Viewは最下位レベルの概念なので、保護レベルは最も低くなる

これがアーキテクチャレベルにおけるオープン・クローズドの原則である。

  • アーキテクトは、いつどのような理由でどのように変更するかを考えて機能を分割する。
  • 分割した機能をコンポーネントの階層にまとめる。
  • 上位レベルにあるコンポーネントは、下位レベルのコンポーネントが変更されたとしても変更する必要はない。

方向の制御

本書のクラス図では、インタフェースが存在することで依存性が逆転している。
例えばInteractorコンポーネントからDatabaseコンポーネントへの依存関係を逆転させている。
※インタフェースがないと、InteractorからDatabaseへ依存してしまう。

情報の隠蔽

また、インタフェースは依存するコンポーネントの内部を知りすぎないようにする役割もある。
あらゆる変更からInteractorを保護することが最優先だが、Interactorの変更からも例えばControllerを保護したい。
そのために、ContollerからInteractorへInterfaceを介してアクセスすることで、Interactorの内部を知りすぎないようにできる。

Firebaseとの連携

Firebaseでプロジェクト作成

f:id:kyonc5:20211107111840p:plain

IntelliJでコンソールから操作する

IntelliJ内でAlt + F12 でコンソールを表示。

f:id:kyonc5:20211107113212p:plain

後は一度やったことがある手順をIntelliJ内のコンソールで行う。

qiita.com

Error: Failed to list Firebase projects. See firebase-debug.log for more info.

このエラーが出ていたためfirebase logout、firebase loginした。

qiita.com

firebase initするとGitHub Actionsの設定が出来るようになっていた。
リンク先の手順で設定した。
これで昔調べたCircleCIは使わなくても良さそう。

zenn.dev

Firebaseへdeployする

コンソールで firebase deploy する。

f:id:kyonc5:20211107115319p:plain

これでdeployされる。

GitHub Actionsで自動的にdeployする

生成された以下のファイルをコミットしておく。

  • .github/workflows
  • src/.firebaserc、firebase.json

f:id:kyonc5:20211107121956p:plain

pushするとGitHub Actionsで自動的にdeployされるようになった。

f:id:kyonc5:20211107122219p:plain

IntelliJでVue.jsの環境構築

プラグインを入れる

f:id:kyonc5:20211107104233p:plain

プロジェクトを作成する

File - New - Project...

f:id:kyonc5:20211107104319p:plain

Nextで進みプロジェクト名を付け作成する。

vue-cli が入っていないと途中で止まるらしい。
以前入れてたから問題なかった。

f:id:kyonc5:20211107104921p:plain

動かす

Run - Run 'nmp serve'

f:id:kyonc5:20211107110146p:plain

f:id:kyonc5:20211107110218p:plain

http://localhost:8080/ へアクセス

f:id:kyonc5:20211107110231p:plain

Gitへpush

f:id:kyonc5:20211107110610p:plain

参考

pleiades.io

qiita.com

静的サイトジェネレータ

Static Site Generator = SSG 。
入力ファイルから静的ページを構築するためのツール。
静的サイトジェネレータはサーバへファイルがアップロードされ、ビルド時HTMLが生成される。そのためレスポンスが速い。
従来のWordPressなどはアクセスがあったときに動的にページが生成される。

こちらで静的サイトジェネレータの人気ランキングを確認できる。

jamstack.org

現時点では以下の順になっている。

f:id:kyonc5:20211106175155p:plain

nmp trends というサイトでトレンドを確認すると、

www.npmtrends.com

Nextが伸びている。

f:id:kyonc5:20211106180119p:plain