奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

色々な言語でユーザー登録フォームを作る(PHP版)

ちょっと、Pythonでプログラムを書くにあたって、何か作った方が良いなと思いまして。

それで、昔PHPで書いていた「ユーザー登録フォーム」が良いんじゃないかと思い、

それを書き切ってみました。

github.com

しかし、思ったよりも考える事が多かったという(苦笑)

以前にも書いた、 以下のモデルの実装もありますし、

あと、バリデーションやファイルアップロードもありましたしね。

続・MVCのMのクラス設計草案など - 奇特なブログ

なので、まだまだ改善の余地は大アリですが、PHPはひとまずここまでにしておきます。



Pythonが本番なので、これからが本番なんですが、

ユーザー登録フォームだと、結構大変かもしれないですね。

ただ、Pythonでは「SQLAlchemy」というのが、

以下を見ても、「おお」という感じだったので、興味深いなと。

www.slideshare.net

良い感じのクラス設計にしたい所ですね。

優先順位の付け方

「優先順位」「優先順位」「優先順位」「優先順位」、もう「耳タコ」ですね(笑)

「プログラムもバッチリ」「データベースもバッチリ」「ドキュメントもバッチリ」「何もかもバッチリ」、

うん「不可能」ですね。

なので、以下の記事を参考にして、ちょっと考えてみようかなと。

テストなんか書かなくて良い 僕の考えるサービス開発の肝 - mosa_siru’s blog

あと、↑の記事を引用している、以下の記事も。

興味深いので乗っかってみる - gallu’s blog

あと、以下の大事な前提ですね。


以下は少人数で"普通"のアプリやWebサービスを自社で新規開発するときのことを想定しています。大人数で重厚なソシャゲを作るとか、ガチガチの金融系サービスを作るとか、コンシューマーゲーム開発とか、個人で好きなものを作るとか、受託とかは全く想定していません。


どうせ新規事業なんてほとんど当たらないんだから。

これなんですが、「いや、この事業は普通"じゃない"ので、気にしなくて良い」と考えていそうな方(目標が現実離れしている)に対しては、

「競合の有無」のお話をすれば良いと思いますね。認識しているのか、調べていないのか。

競合がいない(か少ない)んなら、普通"じゃない"も説得力が出てくるので、

↓に書く優先順位の、少なくとも下の方については、無視してもあまり問題にならないと思いますのでね。

だから、競合不在(真似したくても出来ないなら尚更)って、考えている以上に「強い」と思いますよ。


という所で、そろそろ本題に入りたいと思います。

上の、2つの記事を読んだ上で、というかそうじゃないなら読まない方が良いと思いますね。

あと、優先順位を決める基準として、

下に書いてある事を「しなかった」時に起きる問題を考えてみると良いのではないかと思いますね。



1.システムが動くコードを書く

これをしなければ・・・何も成立しないですね。

なので、問答無用で1番上。



2.パフォーマンスチューニングをする

3.セキュリティ対策をする

これは、やらなかった時に起きる内容によって、前後するかなと。

パフォーマンスだと、「動くけど、1分以上レスポンスまで時間がかかる」だと、流石にでしょうし、

「20秒→3秒」ぐらいのチューニングでも、優先的にやった方が良いでしょうし。

でも、「3秒→2秒」とかぐらいなら、やらなくても問題にならない可能性が高くなるので、

それなら、優先順位を下げても良いと思いますね。

あと、どうしても時間がかかる処理もありますが、どれだけ長くても・・・「5秒」以内ぐらいじゃないですかね。

「1処理で沢山の処理をしない様に分ける」ってのも、一つの考え方ですが。


セキュリティは、対策しなかった時に「"任意"のスクリプト(or コマンド or SQL)実行」がどうかと。

任意って、「そのスクリプト言語(or コマンド or SQL)で出来る事なら、"何でも"」なんですが、怖くないんですかね。

逆に、任意じゃないのだとCSRF(存在する機能の悪用なので)ですが、いやCSRFをしなくて良いという意味ではなくね。

あと、脆弱性によりますが、CSRFやファイルアップロードのファイルの中身のチェックの様に、

対策が、100%は不可能(か極めて困難)なケースもあり、

そういう時に、例えば対策率を95→99%にするのに、異常に時間をかけるのは?とは思いますね。

「時間」って書いている以上、実装者に依存するので、すぐ出来るならした方が良いわけですが。

100%に中々ならない一例として、CSRFだと推測困難とはいえ「トークンが"偶然"一致する」可能性があるので、

トークンのチェックに「加えて」、パスワードも入力してもらう。

でも、パスワードも「"偶然"一致する」可能性があるので、

CAPTCHAのチェックも追加する。

でも、CAPTCHAも「"偶然"一致する」可能性があるので、

二段階認証も追加する。

でも、二段階認証も「端末が盗まれる」可能性があるので、

指紋認証(誤検知しないか、人によって"絶対に"指紋が異なるのなら100%?)もする・・・

「オンラインバンキングの送金」とかでも、ここまでするかレベルな気もしますが、

中々、100%にするのは大変ですね。

ファイルの中身の方も、関数1本で殆ど検出は出来るわけですが、

あれ、ホントに100%になります?

「同じxlsファイルじゃないのか?」ってのを、過去に見た事があるので。

ただ、だからといって、ここでギャンブル脳全開?で、

「100%にならないなら、0%と一緒」としてしまうのはどう見てもなので、

「重要な処理"毎"」にセキュリティレベルを決めておけば良いと思いますね。

「送金はガチガチに対策だけど、ログアウトは何もしなくて良いや」とか。

セキュリティは、方程式じゃないですが、

「事故が起きる確率」×「事故の際の想定被害額」とか出来ればとは思うんですが、

数値化が困難なのがねぇ・・・出来たら天才でしょうけど。



4.綺麗なコードを書く

強いて言えば4番目なんですが、

でも、綺麗なコードにしなければ、↑の2と3をするのに時間がかかるという話も。

どこまで綺麗にするんだい?ってのは、

クラス設計だと、「親クラスの充実」が最優先かと。

だから、以下なんかは良いと思いますしね。

CakePHP3のbakeによるコード自動生成のプラクティス - Qiita

子クラスは、その子クラスに「しかない」処理とかは、

そんなにムキにならなくてもとは思いますね。

綺麗に「しなかった」時でも、その子クラス「しか」問題にならないわけですし。

逆に、親を綺麗にしてないと・・・ですね。

要するに、共通化なわけですが、これ「だけ」でも「全然違う」ので、最低限ならコレじゃないですかね。


あと、テーブル設計ですが、プログラム以上に「リファクタが大変」と思うので、

少なくとも、↑の子クラスの処理を綺麗にするよりは優先した方が良いと思いますね。

いや、むしろ全般的に、こっちの方が優先かも。

で、テーブルについても色々と考えられますが、

「主キーの決め方が雑」、正確には「どの単位で"一意"にしたいの?」って所でしょうか。

ユーザーテーブルというのがあったとして、

「連番の数値のユーザーIDで一意」

「システム側で自動発行した文字列のユーザーIDで一意」

「メールアドレスで一意」とか、候補キーが色々考えられるわけで。

あと、複合主キーに多いんですが、カラムAとBで一意になるとして、

「カラムAが1で、カラムBが1」、「カラムAが1で、カラムBが2」って当然入るんですが、

これが想定通りか?複合主キーが3つ以上じゃないと、あまり間違えないかもしれないですけどね。

あと、「過去データは入らない」と思っていたテーブルが、「過去データも入る」となると、

場合によっては「1件取得の所を、複数件取得に変更」する必要がありますね。

なので、「このテーブルは、履歴テーブルなの?そうじゃないの?」って所ですが、

そのテーブルの「性格(という言い方を思い付いただけですが)」を決めるのも大事だと思いますね。

命名」や「データ型」や「制約」とか、他にも色々あるわけですが、

まず、どういうデータ(これは間違えないと思いますが)が、

どういう形で入るテーブルなのかって所が、やらなかった時に一番大変じゃないかと。



5.定数を整備する

6.コメントを書く

7.テストケースを書く

この3つ辺りで、また前後する様に思いますね。

で、定数は↑の綺麗なコードに入れても良いのですが、

定数って、処理と違って「移動が簡単」なので、

少し下げても良いのではと。

特に「エラーメッセージ」なんかは。

ただ、過去に消費税率の数値が「0.08」とか「8」とかで散逸していたケースもあったので、

「移動するのに、手間がかからない定数かどうか?」で検討してみるのが良いんじゃないかと。

コメントも、例えば「isset」と「array_key_exists」を、

やりたいことに応じて、適切に使い分けられれば「コメント不要」と思いますけどね。

え?ダメですか?

ただ、「何で、SQLで書かずに、プログラムで処理しようとしてるの?」みたいなコードには、

「パフォーマンスの為、プログラムで処理している」とかは書いた方が良いと思いますけど。

テストケースは・・・テストコードじゃないけど、排他制御のコードはテスト目的で書いたりしますけどね。

いや、画面の操作じゃテストしにくい(出来ない)ですし。

なので、「複雑な処理」の方が優先ですかね。



8.ログ出力するコードを書く

9.例外処理を整備する

10.エラーページを整備する

11.コードレビューをする

この辺でまた、前後する感じですかね。

「いや、ログは無いと、運用が大変」なのは確かですが、

でも↑の7つをしなかったのに比べれば・・・

全く書かないというよりは、

「ログ・例外処理・エラーページ」って、仕様が「決まってないか無い」ケースが殆どだったりするので、

「決まっていない所に、異常に時間をかけるのは」ってニュアンスの方が強いですけどね。

決まっているなら、「サッと書いて終了」で良いわけですし。

コードレビューは、この記事の前のダイジェストにも書かれてますが。

無理をしないコードレビュー - クックパッド開発者ブログ

↑の記事の、特に「文脈によるレビュー内容の変化」ですかね。

だから、レビュイーは、

「こういう機能なので、この辺を重点的にお願いします」

って感じで依頼すれば良いんじゃないですかね。



12.会議をする

これは作業じゃないわけですが、

なんか、会議が「多過ぎる or 少な過ぎる」ケースがあるので、

最低限だと、2週間に1回以上は、とは思いますね。

会議の内容は、まさにこの記事の各項目について話をすれば良いんじゃないですかね。

もう少し正確だと、「複数人がいないと出来ない」内容について会議で話をすると。

といっても、チャットで済むケースもあるので、

この辺はコミュニケーションデザイン(プロジェクトによって変わる)を構築するのが先だと思いますけど。



13.ドキュメントを書く

「なんで、一番下なんだよ!一番上に決まってるだろうが!」ってのは極端としても、

ドキュメントが「無い」時に、↑の項目に比べて起きる問題が上回るかどうか?

とすると、「例外処理を作り込まない」よりも「ドキュメントが"全く"無い」方がマズいってケースもあり得るので、

どうしても、多少は前後もしちゃうもんですけどね。

ドキュメントは、

「そのドキュメントは、リバースが出来るかどうか」

「書く内容は、重要な処理かどうか」

って辺りがポイントなんじゃないかと思いますね。

なので、考察元の以下の内容も、

「内部の処理フローもリバース出来るなら、ドキュメント化しても良いのでは」と思いますけどね。

必要なの?と聞かれたら、う~んですけど(笑)


ただし、APIインターフェース/データベーススキーマ/認証フロー 等は最低限書いておくのを勧める。ここで言ってるのは、内部の処理フローを完全に書くとかそういうレベルの話だ。ドキュメントは100点を求めようとすると途端に運用上のコスパが悪くなる。最低限書くべきことを決めて、50点でもいいから運用可能なレベルで妥協すること。

認証フローも、「重要」だから書いておいた方がって事じゃないですかね。

リバースといえば、APIインターフェースは、そういうツールって・・・あぁ「Swagger」ね。

「大変」というのだけ覚えてるので、ホントに大変なのかって所でしょうかね。



14.おまけ

雑談をする
帰る前に話す

なんだこりゃですが(笑)

これらは、「しなかった時に、どういう問題が起きるか」と言われても困るわけで(笑)

「雑談をする」については、急に文脈が変わってしまいますが、一つの指針としては、以下がありますかね。


ぞろぞろみんなでうろつくことない uh…
わざわざ知らん顔することもない

B'z drive to MY WORLD 歌詞
http://j-lyric.net/artist/a00067d/l000d42.html

だから、「毎日、きちんと挨拶をしましょう!」と言われても「軍隊?」って思うので違和感感じますし、

だからといって、わざわざ知らん顔しなくても良いのでは?って思いますね。

「帰る前に話す」は「帰る」とあるので常駐前提なのですが、こちらも同じですね。

別に、ルール化する必要など全くないと思いますし。



こんな所でしょうか。

そもそも、項目自体が不足しているかもしれないですが、

どうやら、こうして書いてみると、

最初に書いた「しなかった時に、どういう問題が起きるか」ってアプローチで、

比較的スムーズに決めれそうに思いますね。

2019年4月28日のダイジェスト

1. 富士通などのSIerの惨状を見ていると、太平洋戦争で負けた大日本帝国を思い出す | 文春オンライン

戦後って書いてるので、長~いスパンで考えるなら、
単一民族国家でやってきて、それが強みで上手くやってきた部分があったけど、
逆に、今はそれがデメリットになって、弱みになっている様に思いますね。
といっても今後、移民(を、事実上受け入れざるを得ないと思うので)との交流が増えていくことで、
日本「人」のモデルが明確になっていくんじゃないかと。
どっかで読んだんですけどね、
国独自のローカル文化がはっきりしていない(あるいは、共有されて認識されていないか、認識されているけど容認されていないか)んじゃないかと。
他国との競争なわけですから、よく分からないんじゃ手の打ちようないと思いますし。
「輸出して、支持されたもの」じゃないですかね、他の国には無い要素なんでしょうし。


2. この問題にはジョークソフトを作成している立場から、非常に注視しています。これが世の流れか。: INASOFT 管理人のひとこと

一連の話を見て、もう、ネットは「アングラじゃない」と思いましたけどね。
10年前(もっと前からあるけど)のネット、5年前のネット、
今で比較しても人も増えてそれだけ影響力が出てきたって事じゃないです?
「いたずら」とか「ジョーク」とか「冗談」なのは確かなんでしょうけど、
自分がやられた「側」の時に、それらを受け入れられない事だってありません?
だったら、「真面目」とか「誠実」とか「真っ当」とかにやれば良いんじゃないですかね。


3. Coinhive事件裁判費用の寄付のお願い - 一般社団法人日本ハッカー協会

「ああ、寄付しようか→締め切り→また再開→よし、寄付しよう→締め切り→えっと・・・」
という展開に、残念ながらなってしまいましたね(苦笑)


4. AIが瞬時に契約書の内容をレビューする「LegalForce」が正式ローンチ | TechCrunch Japan

あぁ、これは凄いですね。
たまに差分を見たい時があるので、検討してみましょうか。


5. 物語の「トンネル」を通りたくない人は意外と多いのかもしれない - ジゴワットレポート

ハマると結構、嫌な印象を後に引きずったりというのは確かに経験ありますけど、
ただ、「フィクションは、どこまでいってもフィクション」とも思ったので、
特に気にならなくなりましたけどね。


6. キングコング西野が近畿大学の卒業式でスピーチ!登場シーンをやり直したwww | 話題の画像プラス

芸人で厄介なのって、
「芸人」としての言動なのか「本人」としての言動なのかってのが分かりにくいってのが。
江頭さんとか、もっとえげつない(芸でも、警察出動するのも仕方ないレベルかと)と思うんですけど、
でも、あれは普段の人格と全然違うので「ハッキリ」しているから、問題にならない(少なくとも見た事はない)のかと。
「仕事のノリを、家庭に持ち込む」方が問題だと思うので、
むしろ人格はハッキリしていた方が良いとも思いますしね。


7. パスワードを平文で送ってくるっぽいサイトまとめ

これは凄いまとめっぷりですが・・・ディスクユニオンさ~ん頑張って~
あと、ニトリも~


8.結婚した人をまた一人

見かけたわけですが、
「なんでしてない(出来ない)のか分からない」って人は男女問わず結構見るので、
潜在的には、まだまだいらっしゃる印象ですけどね。
僕?というか、「よく分からない人」って、一番ハードル高いと思いますね。
「ビジネスマンなのか、オタクなのかよく分からない」とか、数え切れないですけど(笑)
・・・別に、Yes or Noみたいな排他的概念じゃないし、両立すると思うんですけどね。


9. 起源は江戸時代の「自己責任論」 論者が分析するその姿|NEWSポストセブン

最後のページの、一番最後の下りを読んで、
以下を思い出しましたね。

寄るべきは 相手じゃなくて 己が腕 - gallu’s blog

なので、あと気になるのは、どうしてサラリーマンにする必要があったのか、って所でしょうかね。


10. 「10年分の前払いもできるほど預金があるのに家賃6万の審査に落ちた」フリーランスは家を借りるのにも苦労するという話 - Togetter

クレジットカードの審査が~って聞いてはいたけど、全然通ったんですけどね。
・・・あぁ、過去の完済実績を見ているかもしれないですね。キャバの(笑)


11. PostgreSQLアンチパターン:外部キー制約の更新コストを見くびる - Qiita

参照先はNOT NULLなのに、参照元は書いてないのは、すぐに気付きましたけどね。
「明示的に」って事だと、流石に以下はやり過ぎかと思うけど、今後は「常に」したい感じですね。
真面目な話、「(バージョンを上げて)関数の仕様が変わる」ケースだってあり得るでしょうし。

if (戻り値がbooleanの関数() === true)


12. 2019-04-18 「運用自動化」に対する幻想 /operation-automation-illusion - Speaker Deck

その保守作業を「行う頻度」「変更される確率」「複雑度("自分"にとってじゃなく、"現場"としてどうか)」ってのは、
あるかなぁとはボンヤリ思ってましたけどね。


13. コードレビューの長所と短所-その2 | プログラミングアカデミー ゼロプラスワン

あぁ、極端なケースにぶち当たったので、それが標準になった様な気がしますね。
その1の方に書かれていましたけど、以下ぐらいが良いんじゃないかと思いますね。

無理をしないコードレビュー - クックパッド開発者ブログ

あと、レビューって、コードだけじゃなくて「仕様」「設計(テーブルとかクラスとか)」もありますし、
分けた方が良いとも思いますしね。

あと、本題とズレますけど。


しかし、仕事をしていると他者のために配慮してくれる善人ばかりではなく自分の事しか考えない人もいます。

これ、悪い例として書かれていますけど、僕は自分の事「しか」考えていないですけどね。
仮に「自分の事以外も考えている」様に見えたとしても、でも自分の事「しか」考えていないですね。
ソースのコメントは、「明日」「1週間後」「1か月後」「1年後」「5年後」の自分(と他人)の事を考えてですし、
このブログは、記事によりますけど、後に自分が読み返す時(あまりないけど、たまに)の為にですし。
多分、上記の人は、「そんなに」自分の事を考えていないんじゃないですかね。


14. 属人性のジレンマについて - セカイノカタチ

これはこれで良い話ですけど、それでも属人性を「排する」方向の方が良いと思いますね。
というか、排する「方法自体」に属人性が出るから、
何をどうしても属人性はゼロに出来ないってのが正確な所ですけど(笑)
「全く同じ考え」だとしても、喋り方・文章の書き方が違って、
あの人は苦手で、この人の方が良いってケースなんてザラでしょうし。


15. 「悪い方が良い」原則と僕の体験談|Rui Ueyama|note

あぁ、僕がプライベートと現場でコードが違うのなんかは、コレに該当していると思いますね。
「状況(重視し過ぎ?)」を気にしてしまうので、
致命的でなければあまり気にしないですね。


16. 技術的負債への後悔と返済|timakin|note


大体そういう議論をしている人で、負債を作った当初から完済まで開発に関与し続けた人、つまり自分の作った負債によるDXの低下の被害を自分で被った人というのは少ないと思う。

ここがポイントに思いますね。
そういえば昔、「最初が肝心」って言って、
やり過ぎじゃない?ってぐらいに、プロジェクトの最初から全力投球していた人(レアじゃないかと)がいましたが、
上記の話を意識していたんですかね。


17. 「平和な時」こそが「戦争」の「本番」だ - gallu’s blog

もう少し単純に、「備えあれば憂いなし」の一言で終わる様な。
「ビジネスで、競合に負けた」の一因に、「準備不足」もあると思いますし。
「だから、スピードを上げないと」は、その通りなんですが、
それは、ご自身のUPDATEも高速(場合によっては「超」高速)で行う必要がありますよってだけで。
「自分は知ってるけど、他の人は知らない」って、それホントですか?
厳密にいえば、このブログ自体もそうですが、
「自分"だけ"が知らなくて、このブログを読んだ人は"全員"知っていた」って可能性は「あり得ます」からね。
・・・さすがに無いですかね?


18. 思いっきりmemo - gallu’s blog

あぁ、昔全部読んだかは覚えていないですけど、URL変わったんですね。
で、1番目の記事ですけど、要は以下の記事の「レディメイド」で良いって事じゃないですかね。

業務にシステムを合わせるのか? システムに業務を合わせるのか? - gallu’s blog

ラーメンなら、職人技が不要で、誰でも作れるカップラーメンで十分と。
だから、以下の記事の1番最初の「ある物で満足する必要」がってのに繋がる。

2017年3月11日のダイジェスト - 奇特なブログ

「信用してみたが、裏切られた。
信用出来ないものに、お金なんか出せない。
なのでタダ(あるいは安く)」って経験値が積み重なった部分が大きいんじゃないかと思うわけですが。
雑に、「高級」と「低級」ってのに分けると、

高級(高い)
肩書き
○賞受賞
日本一(世界一)
大企業
権威的
人気がある
実績がある
歴史のある暗号化方式

低級(安い)
肩書き無し
無名
零細企業(フリーランス
人気がない
実績がない
歴史のない暗号化方式

・・・う~ん、「内容による」としか(苦笑)
信じては裏切られ、信じては裏切られで、
もう何も信じられない結果としての「閉塞感」なんですかね。
でも、信じない事には、進まないし回らないんですがね。


19. 音楽

(1)中島みゆき

2枚目のアルバムにして、早くも。

中島みゆき 五才の頃
http://j-lyric.net/artist/a000701/l00f557.html

あぁ・・・生まれつき「良く泣く子」とは言われていましたね。
といっても、涙って、「悲しくて泣く」「悔しくて泣く」「嬉しくて泣く」「感動して泣く」とかあるから、
常に、ネガティブだとは思ってないんですがね(笑)


(2)あいみょん

邦楽だと、最近の人は初めてですかね。
どのくらいの知名度(さすがに無名ではないと思いますが)なのかが不明なんですが、
以下の曲を聴いて、「おお」と思いまして。

あいみょん - 君はロックを聴かない 【OFFICIAL MUSIC VIDEO】 - YouTube

日本は、まだそうでもないですが、
海外だとロックは、衰退の一途を辿っているみたいですし、
なので、余計に刺さるなと(笑)
ということで、以下を聴いてみました。

青春のエキサイトメン
https://www.amazon.co.jp/dp/B074MMVNS6

以下の様に、他にも良い曲がありましたね。

憧れてきたんだ
http://j-lyric.net/artist/a05996f/l04249c.html

あぁ、昔同じ職場だった、あの人とかこの人とか、
まだ業界にいるかなぁとかが、走馬灯の様に駆け巡りましたね。

あいみょん - 生きていたんだよな 【OFFICIAL MUSIC VIDEO】 - YouTube


「今ある命を精一杯生きなさい」なんて
綺麗事だな。
精一杯勇気を振り絞って彼女は空を飛んだ

あいみょん 生きていたんだよな 歌詞
http://j-lyric.net/artist/a05996f/l03cea0.html

単純じゃないのは知ってますけど、
自殺する人って、ある意味で勇気や度胸があるって思いますね。
僕は、出来なかっただけに、そう思いますね。

他も、良い曲が多かったですね。

あと、以下は新曲の様ですが、これはやりますね。

あいみょん – ハルノヒ【OFFICIAL MUSIC VIDEO】 - YouTube

あと、意外と冷静かもしれないですね。

あいみょんから年下の子たち&大人へ 直感と瞬間の大切さを語る - インタビュー : CINRA.NET

う~ん、これは他も・・・またか(笑)


(3)THE YELLOW MONKEY

再結成を知って、「おお、そういえば」と思いまして。
以下は、オリジナルは昔聴いたんですが、忘れていたので改めて。

COMPLETE SICKS
https://www.amazon.co.jp/dp/B002PKAAIK


過去は消えないだろう未来もうたがうだろう
それじゃ悲しいだろうやるせないだろう
いつも僕らは汚されて目覚めてゆく
MAKE YOU FREE 永久に碧く

THE YELLOW MONKEY 楽園 歌詞
http://j-lyric.net/artist/a0025ea/l007208.html

このアルバムには入ってないですが、「SO YOUNG」という曲がありまして、
「青春(自分が若かった頃は~とか)」というのは、
「今と状況が違う」っていうのも念頭に置いて、咀嚼していく必要がある様に思いましたね。

あと、やっぱり「天国旅行」ですかね。


身体バラバラ 溶けてダラダラ
天国が好き 僕は幸せ

THE YELLOW MONKEY 天国旅行 歌詞
http://j-lyric.net/artist/a0025ea/l013ce7.html

去年、親が亡くなった時の火葬の時の、骨を思い出しましたね。
「俺もいつかこうなるか」と。

あと、以下もこのアルバムには入ってないですし、
吉井さん曰く「お気楽ソング」らしいですが。


「愛とはあなたのため」だとか言ったら
疑われるけど がんばっちゃうもんね

「愛とは自分のため」だとか言ったら
嫌がられるけど それもあるんだよね

僕らは天使で悪魔さ どちらも愛の化身だよ

THE YELLOW MONKEY LOVE LOVE SHOW 歌詞
http://j-lyric.net/artist/a0025ea/l0072f0.html

片方「だけ」だったらねとは思いますけど、鋭いとしか(笑)
あと、最後はメガテンみたいですね(笑)
当時は、何とも思わない詞でしたが。

あと、以下の代表曲のエピソードも面白かったですね。

THE YELLOW MONKEY ファン選曲ベストアルバム特集 (4/7) - 音楽ナタリー 特集・インタビュー

う~ん、最近アルバムも出たみたいですし、これは他も・・・またか(笑)


(4)globe

globeは、1stアルバムまでは、かなり聴いていたんですが、
その後は不明だったんですよね。
でも、以下をどこかで知り。

globe / FACES PLACES - YouTube

で、同名のアルバムを聴いてみたと。
そしたら、え~っと、3人ともどうしちゃったんですかね(苦笑)特に小室さん。
1stアルバムと「完全に別物」レベルの差異なので。
↑のFACES PLACESだと。


Love I が 利用される
感覚がなくなるまで 支配したり

globe FACES PLACES 歌詞
http://j-lyric.net/artist/a003dd1/l0072a4.html

やりがい搾取ですかね。


どこかに泊まるのと 街をさまようのと
どっちが悪いなんて 誰が決めるの?

globe FACES PLACES 歌詞
http://j-lyric.net/artist/a003dd1/l0072a4.html

良い悪い決めれる話では、無い様に思いますね。


こうして歩いて
色んな顔して

globe FACES PLACES 歌詞
http://j-lyric.net/artist/a003dd1/l0072a4.html

テレビに出るのも「営業の一環」でしょうし、
営業が本職の人は、特にピンとくるんじゃないですかね。

そして、


I'm still I'm still I'm still
lookin' for the FACES...

globe FACES PLACES 歌詞
http://j-lyric.net/artist/a003dd1/l0072a4.html

「まだ」っていうのは、死ぬまで続く様に思いますけどね。
別に、特に暗い曲だとも思わなくて、
居場所(PLACES)について、一例として「自分」→「家族」→「中小企業」→「大企業」みたいな感じで、
少しずつ、居場所自体が大きくなっていくイメージじゃない?と、特にPVを観て思いましたし。
交わらなければ問題が起きようもないのに、でも交わろうとするから問題が起きる。
安全を確保する為だったり平和にする為に、居場所を広げようとするから。

あと、年数は「ターニングポイント」みたいもんだと思いますね。
この詞の年数自体は、小室さんにとってみたいですが。

「邦楽の中で一番良い」って人をちょいちょい見かけて、
「それは言い過ぎ」と思いましたが・・・かもしれないですね。

他も、「Anytime smokin' cigarette」なんかは、
タバコを「いつもやっている事」に置き換えればと思いますし、
「a picture on my mind」も、写真にそういう発想は無かったので、驚きましたね。

と、この時点で結構ビックリなんですが・・・プログレ?トランス?

globe「globe special live -genesis of next-」ダイジェスト - YouTube

う~む(笑)これも全部・・・


(5)Musu Bore

前回のダイジェストにもあった、以下の記事を読みまして。

作曲を教える時は「好きな曲を100曲、どこの何の楽器がどう好きか紙に書け」と言う。その理由とは?あらゆる分野に当てはまる大事なポイントかも - Togetter

じゃあ、聴いてみようということで、以下を聴いてみました。

Recursive call
https://www.amazon.co.jp/dp/B07MNWH3MY

「ひじょ~~に」難しいんですが、「音」が「ロジカル」なんじゃないですかねコレ。
↑のあいみょんの記事にもありましたけど、
「緻密に分析して理論的に構築している」と言いますか。
「理路整然」という感じ。
特に、以下の曲が気に入りましたね。

C'est La Vie (album edit) / Musu Bore - YouTube

何という心地よさ・・・(笑)

なんですが、これじゃあ「売れない」ですよね。
KOKIAの時も思ったんですが、「売れ線」とか「ポップス」を、
どうして「わざわざ」避けるのか。
最近思ったんですがね、
「売れ線」って、以下の「便利な言葉」じゃないかと。

「便利な言葉」という危険な言葉 - gallu’s blog

全くアテにならないって事は勿論ないですが、完全に齟齬がないとも言えず、
なので、「実体が今一つ不明」的な。
Radioheadをポップスって言ってた人もいましたし(苦笑)
「実体が不明なものを否定」って、よく分からないじゃないですか。

あと、商業的だろうが何だろうが、音楽で忘れてはいけないのは、
「リスナーに刺さるかどうか」って点。
勿論、↑の様な曲もあって良いわけですが、
もう少し、メリハリを付けた方が良いんじゃないかと。
極端な例だと、「アルバム10曲中、1曲だけ異常に良くて、他9曲はクソ曲」みたいな。
曲の完成度も大事ですが、曲を広める為の戦略だって大事じゃないですかね。


(6)Adele(アデル)

こちらは、以下の歴代アルバム売上ランキングをボーっと眺めていて、
「やっぱり、昔が多いと思っていたら、え?"2011"年?」と驚きまして。

List of best-selling albums - Wikipedia

いや、海外では日本以上にアルバムが売れなくなっているって事で、
その中での「3000万(一桁少ないなら分かるんですが)」ですからね。
ということで、以下を聴いてみました。

21 [解説・歌詞対訳 / ボーナストラック4曲収録 / 国内盤]
https://www.amazon.co.jp/dp/B06XGMBDLJ

うん、普通に良いですね。シングルカット出来そうな曲が沢山揃っている印象。
1曲なら「I'll Be Waiting」かな。
「Don't You Remember」も捨てがたいですけど。
3000万売れるほど?と言われると、どうだろう?とは思いますけど。

一桁多いって事で、あっちにとっては「スタンダード」なんじゃないですかね。
日本でいう、米津玄師の「Lemon」の様な。

あと、「レディ・ガガ」が同時期でして、
「ガガは知ってるけど、アデルは知らない(僕はコレ)」って所が気になりまして、
以下の、アーティストの総売上を調査してみました。

List of best-selling music artists - Wikipedia

ここの「JPN:」って所の数値を、
「Total available certified units(主要国の総売上みたいなもん?)」で割る事で、
「そのアーティストの売上に対する、日本の比率」が分かるので、
「日本で支持される要素が多いのでは?」ってのが分かるかなと。
で、日本の比率(%)が、2%(正確な数値は随時変わってるみたいですが)以上だったアーティストは、

Michael Jackson(Pop / Rock / Dance / Soul / R&B):2.52%
Madonna(Pop / Dance / Electronica):3.78%
Mariah Carey(R&B / Pop / Soul / Hip-hop):10.58%
Celine Dion(Pop):5.72%
Queen(Rock):2.36%
Whitney Houston(R&B / Soul / Pop):3.77%
ABBA(Pop / Disco):2.47%
Eminem(Hip-hop):2.18%
Aerosmith(Hard rock):3.19%
Lady Gaga(Pop / Dance / Electronic):5.44%
Bon Jovi(Hard rock / Glam metal):5.23%
Beyoncé(R&B / Pop):2.10%
Britney Spears(Pop / Dance / Dance-pop):2.67%
Guns N' Roses(Hard rock / Heavy metal):2.29%
Backstreet Boys(Pop):7.50%
Janet Jackson(R&B / Pop):3.07%
Stevie Wonder(Funk / R&B / Soul):3.03%

ガガは、↑に入ってますね。
あと、ジャンル分けが適切じゃないって感もありますが、ジャンルも重要。
で、アデルは、

Adele(Pop, soul):0.10%

と。どうやら、明確には、ジャンルではないっぽいですね。
あとは、以下の記事がありました。

アデルの21が2000万枚ておかしい

一部、引用してみると。


日本人は声に奥行きも広がりも個性も皆無で高い声で鳥の喉潰したような不愉快な声のド下手しかいないから、そういうのばかり聴いてる日本人にはアデルは理解できないだろう。

上手い下手は、特に思わないですけど、
声「質」が、「太い」のが日本受けしにくいとは思いましたね。


アイドルからの指摘は当たってるかもね。
マライア・キャリーがその昔日本で人気を博したことを考えても、日本は「Kawaii」の国。
アデルは自身も曲も可愛いやアイドルの対極にある人だから、日本で人気でないのかも。

アデルは、みゆきさんに、少し似てるかなぁとは思いましたけどね。
あと、マライアは、↑にもある通りですし、
可愛いというか、容姿は、あいみょんも言われていましたね。
あとは、以下とか。

片平里菜「日本の女性シンガーは不細工だと売れない 洋楽シンガーが羨ましい」-

「カワイイ」については、KOKIAで抜いたことがある(笑)ので否定は出来ませんが、
音楽の場合、「曲が主役」だと思うので、容姿は「おまけ(脇役)」じゃないですかね。
あと、カワイイでも、それを「顔」に限定してしまうと、
「賞味期限」が、どうしても短くなりがちってのも。
「おっさん」もそうですが、「おばさん」って別に、disられ用語じゃないと思いますしね。
「中年女性」が、ミニスカとか露出度高めの服装の方が、はるかに違和感感じません?

あと、ジャンルに関しては、
アデルは「ソウル要素」が強めなのも少しあるかもですね。
こういうのは、あまりピンポイントで「コレ」というのは難しいと思いますので。

あと、アデル以外のジャンルだと、
「Pop」「Dance」「R&B」が目立ちますね。
ダンスは、時代によって違いそうですが、
自分が踊るというより、他人が踊る鑑賞としてのダンスがってのがある様に思いますね。

あと、アデルの他の曲ですが、

Adele - When We Were Young (Live at The Church Studios) - YouTube

う~ん、全部聴きたい・・・


(7)Aphex Twinエイフェックス・ツイン

Radioheadと、前回のMarconi Union経由で知りました。
前回、ジャンルを書いてませんでしたが、「アンビエント環境音楽)」ですね。

Selected Ambient Works Volume II [帯解説 / 2CD / 国内盤]
https://www.amazon.co.jp/dp/B072M2B3M8

「完全に」ハマッてしまった感が(笑)
ハードロックとか「音がうるさい」って人の気持ちも、少し分かった様に思いますね。
「確かにうるさい」(笑)なので、アンビエントが良いと。
あっても無くても殆ど変わらないんですが、
じゃあ、どうして、カフェとかでわざわざBGM的な音楽を流すのかと。
分からないですが、「人工以外」の地球上の「音」って事だと、
「動物の音」「川の音」「風の音」とかですかね。
そして、それらの音も無いと・・・完全に「無」って感じで、ちょっとゾっとしますね。
という辺りから、必要なんじゃないですかね。
やたら、マニアックになってしまいましたが。


そろそろアーティストを絞り込みたい所ですが・・・邦楽の、あの方のあの曲を無視してはねぇ・・・

サーバー側で全部HTMLエスケープする(CakePHP3の場合)

昔、Phalconで実装したことがありましたが、
Cakeだと、どうやれば良いのかと。
デフォルトで対応してくれれば良いのにと、昔から思ってるんですけどね。


あと、以下の様にプラグインを書いてる方もいらっしゃる様ですが、
プラグインなので、導入できない場合や、あと細かい調整がなぁと。
参考にした方が良さそうな所は、ありましたけどね。


[Cakephp3] もう毎回 h() なんて書きたくない!! - Qiita


なので、以下を書いてみました。
個々のシステムによって、細かい調整が必要かと思いますけどね。
あと、PHPは7.1以上が必要ですが、
Cake3のマイナーバージョンまでは、良く分かりません。

<?php

// 今回の処理と関係無い所は省略しています
class AppController extends Controller
{
    // エスケープしない項目リスト
    // 必要に応じて、子クラスで値を入れておく
    private $notEscapeNameList = [];

    protected function addNotEscapeNameList($name, $value)
    {
        $this->notEscapeNameList[$name] = $value;
    }

    public function beforeRender(Event $event)
    {
        // レンダリングする直前なので、以下のエスケープ処理終了後に書いた方が良いか?
        parent::beforeRender($event);
        // viewVarsに、子クラスで$this->setされた内容が入っている
        foreach ($this->viewVars as $name => $value)
        {
            // エスケープしない項目リストに含まれている場合は、何もしない
            if (false === array_key_exists($name, $this->notEscapeNameList))
            {
                $this->viewVars[$name] = $this->htmlEscape($value);
            }
        }
    }

    protected function htmlEscape($value)
    {
        if (true === is_null($value) ||
            true === is_bool($value) ||
            true === is_callable($value) ||
            true === is_double($value) ||
            true === is_float($value) ||
            true === is_int($value))
        {
            // エスケープ不要な型(のはず)
            return $value;
        }
        else if (true === is_iterable($value))
        {
            // 配列以外に、ResultSetの場合もここに入るので、
            // テンプレート側では、ResultSetでのデータ操作は行えない(けど問題ある?)
            $ret = [];
            foreach ($value as $key => $val)
            {
                $ret[$key] = $this->htmlEscape($val);
            }
            return $ret;
        }
        else if ($value instanceof Entity)
        {
            $array = $value->toArray();
            foreach ($array as $key => $val)
            {
                $value->$key = $this->htmlEscape($val);
            }
            // Entityは一応、配列にしないで型は維持しておく
            return $value;
        }
        else if (true === is_resource($value))
        {
            // Cakeの場合、MySQLのbinary・varbinary・blob型は、Entity内ではリソース型になる模様
            // これは、どうにもならないか?
            return $value;
        }
        else if ($value instanceof \Cake\I18n\FrozenTime)
        {
            // そもそもエスケープしなくても良い気もするが
            // コメントアウトした以下と、どっちが良いか?
            //return $this->htmlEscape($value->format('Y-m-d H:i:s'));
            return new \Cake\I18n\FrozenTime($this->htmlEscape($value->format('Y-m-d H:i:s')));
        }
        else if ($value instanceof \Cake\I18n\FrozenDate)
        {
            // そもそもエスケープしなくても良い気もするが
            // コメントアウトした以下と、どっちが良いか?
            //return $this->htmlEscape($value->format('Y-m-d'));
            return new \Cake\I18n\FrozenDate($this->htmlEscape($value->format('Y-m-d')));
        }
        // オブジェクトは、汎用的過ぎて上手い方法が無い?のでコメントアウト
      	/*
      	else if (true === is_object($value))
      	{
      		$obj = new \stdClass();
        	$properties = get_object_vars($value);
		//var_dump($properties);
        	foreach ($properties as $n => $v)
        	{
          	    $obj->$n = $this->htmlEscape($v);
        	}
        	return $obj;
      	}
      	*/
        else
        {
            return h($value);
        }
    }
}

この正規表現は、どんな文字がマッチするのか調べたい時など

※PHP7.2以上じゃないと動かない関数を使ってます


主目的としては、タイトルの通りですが「この正規表現って、どんな文字ならマッチするの?」って初見で思う様な、

パッと見複雑な正規表現を見る時が、ちょいちょいあるわけですよ。

だから、そういう時に使えるかなと。

また、タイトル以外の目的として、

「ファイル名をチェックする正規表現」というのもあるんですけどね。

ただ、この正規表現は許可したい文字を定義しているので、

ここから、ちょこちょこ調整が必要とは思いますけど。特に「記号(カオス過ぎますね)」は。

あと、そもそもファイル名以外のチェックの正規表現でも使えるかもしれないですね。

ただ、正規表現使わなくても、配列のキーをコードポイント値にして、
許可したい文字の配列を定義してチェックとかでも良いんでしょうけどね。

<?php

// これをしないと、だいぶ時間がかかるので
ini_set('memory_limit', '-1');

$result = '';

// 許容する文字
// Unicodeのコードポイント値は、 https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7%E8%A1%A8 参照
$white_list = '/\A(?:[';
// ひらがな
$white_list .= '\x{3041}-\x{3096}';
// カタカナ
$white_list .= '\x{30A1}-\x{30FA}\x{31F0}-\x{31FF}\x{FF66}-\x{FF6F}\x{FF71}-\x{FF9D}';
$white_list .= '][';
// 濁点・半濁点
$white_list .= '\x{3099}\x{309A}';
$white_list .= ']?|';
// 長音
$white_list .= '\x{30FC}';
$white_list .= '|';
// 漢字(一部の文字は\p{Han}でも良いけど、明示的な方が良いかと)
$white_list .= '[\x{2E80}-\x{2FDF}\x{3005}\x{3007}\x{3021}-\x{3029}\x{3038}-\x{303B}\x{3400}-\x{4DBF}\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}\x{20000}-\x{2FFFF}][\x{E0100}-\x{E01EF}\x{FE00}-\x{FE02}]';
$white_list .= '?|';
// 全角英数字・半角英数字
$white_list .= '[a-zA-Z0-9a-zA-Z0-9]';
$white_list .= '|[';
// 以下の全角記号(エディタによっては半角に見えます)と全角スペース
// ‐ ― ‖ ‘ ’ “ ” ′ ″ ※   、 。 〈 〉 《 》 「 」 『 』 【 】 〒 〔 〕 〖 〗 〜 〝 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ ¥
$white_list .= '\x{2010}\x{2015}\x{2016}\x{2018}\x{2019}\x{201C}-\x{201D}\x{2032}\x{2033}\x{203B}\x{3000}-\x{3002}\x{3008}-\x{3012}\x{3014}-\x{3017}\x{301C}-\x{301D}\x{FF01}-\x{FF0F}\x{FF1A}-\x{FF20}\x{FF3B}-\x{FF40}\x{FF5B}-\x{FF5E}\x{FFE5}';
$white_list .= ']|';
// アンダーバー・半角スペース・ドット
$white_list .= '[_ .]';
$white_list .= ')+\z/u';

var_dump($white_list);

for ($i = 0; $i <= 0x10FFFF; $i++) {
        // 1文字ずつ取得して、マッチしていたら出力対象に
        $str = mb_chr($i, 'UTF-8');
        if (1 === preg_match($white_list, $str)) {
                $result .= $i . ':' . dechex($i) . ':' . $str . PHP_EOL;
        }
}

file_put_contents('出力したい場所', $result);