「Develop」の版間の差分
(PHP Intelephense Coding) |
(DB Other 画像データのパス/BLOBでの格納) |
||
391行目: | 391行目: | ||
* [https://gigazine.net/news/20240217-open-source-non-code-contribution/ オープンソースの開発プロジェクトではコーディング以外のドキュメント化やサポートなどの貢献が特に重要 - GIGAZINE] | * [https://gigazine.net/news/20240217-open-source-non-code-contribution/ オープンソースの開発プロジェクトではコーディング以外のドキュメント化やサポートなどの貢献が特に重要 - GIGAZINE] | ||
* [https://gigazine.net/news/20240229-open-source-project-business/ オープンソースプロジェクトを有料化して月収100万円の事業家に転身したソフトウェア開発者 - GIGAZINE] | * [https://gigazine.net/news/20240229-open-source-project-business/ オープンソースプロジェクトを有料化して月収100万円の事業家に転身したソフトウェア開発者 - GIGAZINE] | ||
== DB == | |||
=== Other === | |||
===== 画像データのパス/BLOBでの格納 ===== | |||
* [https://stackoverflow.com/questions/1347461/saving-images-files-or-blobs database - Saving images: files or blobs? - Stack Overflow] | |||
* [https://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay database - Storing Images in DB - Yea or Nay? - Stack Overflow] | |||
* [https://www.microsoft.com/en-us/research/publication/to-blob-or-not-to-blob-large-object-storage-in-a-database-or-a-filesystem/ To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem - Microsoft Research] | |||
* [https://teratail.com/questions/296506 データベースに画像を保存するメリット・デメリットと必要性について] | |||
* [https://teratail.com/questions/81233 データベースに画像を保存するのはありでしょうか?] | |||
画像のファイルサイズが1MB以下の場合は問題ない。が、それ以外だと問題があるので、ファイルパスで扱うのがいいらしい。 |
2024年4月2日 (火) 17:26時点における版
About
ソフトウェア開発作業全般
Other
ASCIIFlow: 画面構成図などの作成でテキストなので便利かもしれない。
Modelio
クラス図
- 汎化 (generalization): 実線白矢印。継承。
- 実現 (realization): 点線矢印。interfaceの継承。
- 集約: 白ひし形。
- コンポジション: 黒ひし形。子が単体で存在できない場合。親と生存期間が同一の場合。
- 関連: 実線矢印。メソッド内インスタンスなど。
- 依存: 点線矢印。引数やローカル変数、返却値。
Git
差分ファイル抽出
情報源: gitで差分ファイルを抽出する #Git - Qiita。
git archiveとgit diffを組み合わせる。
git archive --format=zip --prefix=root/ HEAD `git diff --diff-filter=d --name-only HEAD^ HEAD` -o archive.zip
ただし、この方法はファイル数がARG_MAX以下の場合だけ。ファイル数が多い場合だめ。
git diff --name-onlyで一覧を出力させて、1個ずつcp -pで階層を維持してコピーするしかないかも?
例:
mkdir -p archive git diff --name-only new_base 44765_upgrade-base-version | xargs -i cp -p --parent "{}" archive/
マージコミット後のコミット追加
マージコミット後に次の開発作業を始めることが多い。が、直後の初回のコミットを追加したい場合困る。
git rebase -iにすると、コミットが残るから。編集はできるが、その直前にコミットの追加ができない。マージコミットは扱いが特殊で直接rebaseで編集できない。
しかたないので、該当コミットでブランチを作成して、コミット。その後、既存の修正ブランチをrebaseでそのコミットの後にくっつける。これでいける。
Fossil
外部依存を排除しており、CGIでも動作するという点が非常に良い。気になる。Phorgeの検討が不要になる。
Shell
ワイルドカード
ワイルドカードで.始まりのファイルをマッチさせたい。
以下ならマッチするが、ブレース展開 (brace expansion) はPOSIX shでは使えなかった気がする。
echo {.*,*}
cmd.exe
bitsadmin
Windowsでのファイルダウンロードコマンド
Windows 7以降ではbitsadminコマンドがあり、これがwget相当となる。
書式:
bitsadmin /transfer <job name> <URL> <output path>
<job name>と<output path>は必須なので注意する。
certutil
Windowsでのハッシュの確認に使える。
certutil -hashfile file
SHA1 ハッシュ (対象 C:\moconavi\windows\Moconavi\ext\chromium\moconavium.exe): e0da85b04b6970ac1f0c33db7a9ad607fdbd44eb CertUtil: -hashfile コマンドは正常に完了しました。
rlogin.cmd
コマンドキーの送信を自動化できる?
rem rlogin.cmd @Echo off Set SERVER=192.168.0.0 Set USERNAME= Set PASSWORD= Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD% Start mstsc /v:%SERVER% Timeout 5 Cmdkey /delete:TERMSRV/%SERVER%
実行中プロセスのパスの確認
出典: Show EXE file path of running processes on the command-line in Windows - Super User。
wmic process get ProcessID,ExecutablePath wmic process where "name='mysqld.exe'" get ProcessID, ExecutablePath wmic process where "name='mysqld.exe'" get ProcessID, ExecutablePath /FORMAT:LIST
簡易編集モード/挿入モード
- 【Tips】Windows 10のコマンドプロンプトが意図せず止まってしまう問題を回避する方法 | ソフトアンテナ
- Windows command prompt freezing randomly - Super User
Windows 10のcmd.exeは [簡易編集モード] が有効になっており、コマンドプロンプトを左クリックすると、テキストの選択が始まる。テキスト選択中はコマンドの実行が止まる。長時間かかるコマンドの実行中に誤操作で止まると困るので、これは無効にしたほうがよい。
cmd.exeを起動-左上のアイコンをクリック-[規定値]/[プロパティ]-[オプション]-[□簡易編集モード] を選ぶ。
そのほか、 git log
のような制御が移るコマンドを実行してしばらくすると、操作できなくなる。
[□挿入モード] にすると回避できる模様。
Web
IP address
出典: 固定IPアドレスの取得方法 ~実は簡単!フリーランスの方も必見です~|VPN活用日記|トピックス|グローカルネットの快適VPN【公式】| 株式会社グローカルネット。
自宅サーバーを行う際、固定IPアドレスが必要になる。
取得方法がいくつかある。
- 契約しているプロバイダでオプションとして申し込む方法
- 固定IPアドレスに対応しているSIMを契約する方法
- VPNを利用した固定IPアドレスの提供会社を利用する方法
VPNの固定IPアドレスが安いらしい。ryoかsuwakoが解説していた気がする。
Authentication
認証方式がいくつかある。HTTPで定義される認証方式 (HTTP認証) が有名。
Basic認証
出典: Basic認証 - Wikipedia。
Authorization HTTPヘッダーにBasicのあとに [username:password] をBASE64でエンコードして送信する認証方式。
GET /private/index.html HTTP/1.1 Host: example.com Authorization: Basic cm9vdDpwYXNzd29yZA==
盗聴や改ざんが簡単だが、シンプルという利点がある。
OAuth
Ref
OAuth (オーオース) 権限の認可のための標準。OAuth 2.0が最新の標準。
以下が登場人物。
- resource owner: あるサイトのユーザー。
- resource server: あるサイトのユーザーのデータの保有サーバー。
- clent: クライアントアプリ。リソースサーバーのデータを使用したい。
- authorization server: クライアントにサイトへのアクセスを認証するサーバー。アクセストークンを発行して行う。
アクセストークンが実質的なパスワードのようなものだが、resource serverのパスワードを直接渡していない点が重要な違い。パスワードを直接渡さないことで、機能別に権限を細かく利用可否を制御できる。
処理の流れ。
- client->resource owner: Authorization Request。ここでユーザーが手操作でアクセスを承認する。
- client<-resource owner: Authorization Grant。
- client->authorization server: Authorization Grant。承認された情報でアクセストークンを要求。
- client<-authorization server: Access Token
- client->resource server: Access Token。アクセストークンでアクセス。
- client<-resource server: Access Token
Consumer Key/Secret: アプリ識別用のID/PW。
Access Token: サイトにアクセスするためのパスワード。
API
複数レコードの登録・更新・削除のREST APIについて調べてみた話(+@ Graph API) - junode | 個人開発ブログ
既存のAPIは単一リソースの処理しかないことが多い。JavaScriptなどで単一リソースを何回も呼べばいいというのはそうだけど、JavaScriptなしでは動作しない。一括処理用のAPIを作るしかなくないか?
REST WebAPIのプラクティス | yamarkz.com
delete_bulkなどのような一括処理用のAPIを作るしかない。内部的には単一処理のAPIを作る感じだったとしても。
curl
HTTPの通信のコマンドラインでの確認でよく使う。
Basic
- -X: メソッド指定
- -d/--data-urlencode: リクエストボディー (key=value)を指定。-X POSTも自動指定になる。
curl: (60) SSL certificate problem: self-signed certificate
Ref: curlで「自己署名証明書」を受け入れるには【curl: (60) SSL certificate problem: self signed certificate】 | LFI.
--insecureオプションを指定すると、localhostなどでの自己署名証明書を許可する。
Wireshark
TLS
Ref: SSL/TLSの復号#1 ~Wiresharkの設定~ | 東陽テクニカ | “はかる”技術で未来を創る | ワン・テクノロジーズ・カンパニー.
Wiresharkで通信パケットを確認する場合、デフォルトでTLSで暗号化されているので、内容がわからない。WiresharkでTLSに対応しておく必要がある。
[Preferences]-[Protocols]-[TCP] を選ぶ。
- ☑Allow subdissector to reassemble TCP stream
- ☑Reassemble out-of-order semgemnts
上記をチェックしておく。デフォルトでチェックされていた。
続いて、セッションごとのPre-Master Secretを登録する。
Chrome/Firefoxだと、環境変数SSLKEYLOGFILEを設定すれば、このファイルにTLSセッションキーを出力するので、これをWiresharkで読み込むことで、復号対応する。
以下のコマンド相当で、任意のファイル・場所にログファイルを指定する。
export SSLKEYLOGFILE=/tmp/sslkey.log
Macだとlaunchctlで設定しておくといい。これでWebブラウザー経由の場合は見えるようになる。
Analytics
Tool
サイト分析用のツールがいくつかある (2023年ブログランキング!おすすめブログランキングサイト比較【一般人向け】)。
- SimilarWeb
- Ubersuggest
- ahrefs
- Googleキーワードプランナー
閲覧数取得
出典: GoogleAnalyticsで自サイトの人気記事ランキングを表示する方法 | アフィリエイトJAPAN。
- [行動]-[サイトコンテンツ]-[全てのページ]
- [表示する行数]=5000
- [エクスポート]=TSV
流入元特定
「会員登録画面の流入元探索方法について - Google アナリティクス コミュニティ」どのページから会員登録があったか、会員登録に結びつく記事は非常に重要。
こんにちは。
探索レポートでユーザーセグメントを作成する集計方法はいかがでしょうか。
・自由形式レポートを作成
・セグメント作成 > ユーザーセグメント
・条件は page_view > パラメータ page_location > 含む:会員登録画面のURL を指定
・「会員登録画面閲覧ユーザー」などセグメント名をセットして保存
・探索レポートにセグメントを適用
・ディメンション:セッションの参照元 / メディア、ランディング ページ + クエリ文字列
・指標:セッション
ご確認よろしくお願いいたします。
※ページ閲覧の発生しなかったセッションはランディングページが (not set)になります。
開きっぱなしのタブから再訪問するセッションなどが該当します。ご参考までに。
PMProでも似たような回答。
Google Analytics 4 can track ecommerce conversions and then assign page value to posts that were a part of their conversion path for that engaged session.
Security
DoS攻撃
いくつか対策方法がある。
サーバーログにIPアドレスが残るから、それで攻撃元の国を特定して、該当国を一括アクセス拒否。これが効果あるかもしれない。
攻撃元の国は途上国とかが多いだろうから。IPアドレスは簡単に変更できるが、国を変えるのはたいへんだろう。
Server
httpd
Apache HTTP Server
Access Control
出典: Access Control - Apache HTTP Server Version 2.4。
DoS攻撃対策などで重要な設定。
mod_authz_core/mod_authz_hostがコアモジュール。mod_rewriteも関係ある。
基本構文は以下。
Require host <address> Require ip <ip address>
1番目の形式はドメイン名。2番目はIPアドレス。部分マッチする。マッチしたもののアクセスを許可する。
Requireの直後にnotを指定してアクセス禁止にできる。こちらが重要。
[サーバーIPがブラックリストに載ってメール送信エラーになるのを解除する方法]
Debian
PHP8
[How To Install PHP 8.0 on Debian 11/10/9 | ComputingForGeeks](https://computingforgeeks.com/how-to-install-php-on-debian-linux/)
Debian 11の場合、PHP 8には外部リポジトリーが必要なので追加する。
sudo apt update
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2
PHPパッケージを追加する。
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo apt update
これでPHP8を参照できるので、インストールする。
sudo apt install php8.2
[How to Switch between Multiple PHP Version on Debian 12/11/10 – TecAdmin](https://tecadmin.net/switch-between-multiple-php-version-on-debian/)
インストールしたら、PHPのバージョンを切り替える。
a2dismod php7.4
a2enmod php8.2
sudo systemctl restart apache2
php 8.2にするとこういうエラー。
[Sat Sep 02 11:31:02.558029 2023] [php:error] [pid 25644] [client 133.106.38.37:57181] PHP Fatal error: Uncaught Error: Undefined constant "DB_DATAOBJECT_ERROR_NODATA" in /var/www/gnusocial/public/index.php:104\nStack trace:\n#0 [internal function]: handleError()\n#1 {main}\n thrown in /var/www/gnusocial/public/index.php on line 104
念のためdockerで起動を試みましたが、同じくトップ画面を開くと同じエラーになります。
<https://notabug.org/gnusocialjp/gnusocial/src/main/docker/development> にDockerでの起動方法があります。`docker compose up -d` を実行するだけでlocalhostでアクセスできます。
私とあなたとの環境の違いを排除したいので、dockerのインストールだけ頑張って、それでdockerでも簡単に動作確認してくれませんか?
alternative
Ref: DebianAlternatives - Debian Wiki.
OS内でバージョン違いのプログラムを管理するための仕組みがある。それがupdate-alternativesコマンド。
sudo update-alternatives --display vi
sudo update-alternatives --config vi
オプションとコマンド名を指定することで、現在の実体と更新ができる。
Visual Studio Code
cscope
cscope用のプラグインが何個かある。
scope4codeのほうがいろいろできそうだが、うまく動作しなかった。使い方がよくわからない。
cscope-codeはシンプルだが動作した。こちらを当分使うことにする。
Macの場合、control-. sのように、control-.の後に、controlを話してsを押すと発動する。カーソル下のシンボルしか使えない感じなのがネック。まあいい。
Vim
VSCodedでVimのキー操作を使うためのプラグイン。これが一番人気。いや、Vimのエミューレーターは中途半端な感じだから使わないほうがいいかな。
PHP Intelephense
Ref: PHP Intelephense - Visual Studio Marketplace.
VSCodeのPHPの補完拡張として人気が高い。
Quick Start
設置後、しておくべき設定がある。
- Go to
Extensions
. - Search for
@builtin php
- Disable
PHP Language Features
. LeavePHP Language Basics
enabled for syntax highlighting.
VSCodeの [PHP Language Features] を無効にしておくとのこと。
後は、.php以外の拡張子でPHPファイルがあれば、関連付けを追加するとか。
Module
peclなどPHPの標準モジュールで一部認識できないものがある。
「php - Undefined type 'Imagick' in VSCode's intelephense - Stack Overflow」にあるように、そういう場合は [Settings]-[Stubs] で追加するとよい。
Coding
Ref: VSCode で PHP 開発するならインテリセンス最強の intelephense を使おう | 株式会社ビヨンド.
intelephenseでコード補完を認識しやすい書き方というのがある。
まず、型をつけられるものはつける。
function superMethod()
{
/** @var AwesomeService $awesomeService */
$awesomeService = $this->app->make(AwesomeService::class);
$awesomeService->awesomeMethod();
}
ローカル変数も型名を指定する。これをしないと、インスタンスでコード補完が効かない。
Project
- オープンソースの開発プロジェクトではコーディング以外のドキュメント化やサポートなどの貢献が特に重要 - GIGAZINE
- オープンソースプロジェクトを有料化して月収100万円の事業家に転身したソフトウェア開発者 - GIGAZINE
DB
Other
画像データのパス/BLOBでの格納
- database - Saving images: files or blobs? - Stack Overflow
- database - Storing Images in DB - Yea or Nay? - Stack Overflow
- To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem - Microsoft Research
- データベースに画像を保存するメリット・デメリットと必要性について
- データベースに画像を保存するのはありでしょうか?
画像のファイルサイズが1MB以下の場合は問題ない。が、それ以外だと問題があるので、ファイルパスで扱うのがいいらしい。