PHPからGmailにメールを送る。

  • とりあえず困ったら sudo apt-get remove --purge postfixとsudo apt-get install postfixで全部消してやり直そう。
  • どうも何らかの信頼できる?サーバー経由でないとメールは送れないようなので、自分のgmailアカウントから送信できるように設定した。設定方法はhttps://blog.ymyzk.com/2017/06/postfix-smarthost-gmail/ を非常に参考にした。
  • sendmailコマンドで送れるようになったし、直接htdocsのソースがあるフォルダでphpコマンドで実行すればメールが送れるのに、何故かブラウザからアクセスするとできない。これは途中でPHPを再インストールした事と関係あるんだろうか。
  • ↑xamppのphpコマンドと、sudo aptでインストールしたphp二つ入っているっぽいのが原因かも。
  • メールのエラーログは/var/log/mail.logに書いてある。
  • ↑のは全てLinux Mint上でやっていたが、これについては諦めることにした。いずれレンタルサーバー上でやってみようと思う。

Spring徹底入門14章チュートリアルと自作のチャットアプリ用

データベースセットアップ

  • ユーザ情報確認 select Host, User from mysql.user;
  • ユーザ登録を、ハッシュ関数を指定してハッシュ化したパスワードを用いて行いたい。
  • MySQL8.0だと、create use syntaxで、IDENTIFIED WITH auth_plugin AS 'auth_string'の形式で、auth_pluginの形でハッシュ化されたパスワードで登録できるようである。MySQL5.7だと、IDENTIFIED BY PASSWORD 'auth_string'の形で同様の事ができたようだが、今はもうない形式のようである。
  • mysqljdbcのurl設定は、spring.datasource.url=jdbc:mysql://localhost:3306/chat?serverTimezone=JST.Timezoneを指定しないとエラーが出る。
  • ObjectクラスのhashCodeメソッドは何故この素数をフィールド数分掛けて後はフィールドに応じて色々足す感じの実装が多いというか一般的なんだろう。
  • equalsメソッドでthis==objという感じで引数のobjと==比較しているのは、何を比較しているのか。
  • JPAの複合キー指定のアノテーションは、@JoinColumnsがあるらしい。@JoinColumnを入れる事ができるようだ。
  • MySQLDROP TABLWのCASCADEオプションは何も意味が無いようだ。他のシステムからの移植を容易にするためにあるとのこと。
  • MySQLのkeyの属性のSERIALはSERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.とあり、色々な属性の組み合わせのようである。
  • @ManyToOneと@OneToManyでは、付けたエンティティが読み込まれるタイミングが異なるようである。@ManyToOneではJOIN FETCHされ、その都度?読み込まれるようで、@OneToManyでは最初に読み込まれる?
  • Repositoryでの@Queryでのエンティティ指定は、完全修飾名でやれば問題ないっぽい。
  • もしかしてやたら受け取るクエリの結果が多かったのは受け取り型が間違っていたからでは?専用のクラスを作らないといけないのかもしれない。ただ、やはり受け取る型もまたエンティティで、データベースでテーブルが無ければならないようだ。https://k-webs.jp/javaindex/post-1176 に詳しく書いてある。素晴らしい。
  • @OneToManyや@ManyToOneの間違いがあったようだ。多分。難しいし、最初は使わないようにしよう。JOIN ON文で指定すればどうにかなる。
  • @OneToManyや@ManyToOneを設定すれば、JOINで設定したエンティティ間のid一致等の条件を課さずに、勝手に結合してくれると思っていたが、そうでもないのかな?
  • クライアント側からサーバー側への送信は、基本的にURLを用いて行われるようである。@RequestParamを用いればコントローラ側でURLで指定したパラメータを取得できる。
  • ↑これは、Spring MVCやThymeleafだと、フォームの入力受け取り用のJavaBeansを定義してやって、それぞれの方式でタグにそのBeansを指定してやれば、Controller側でmodelの要素として受け取れるようである。
  • @ModelAttributeは、Controllerのメソッドに付ける時と引数に付ける時で挙動が異なるようで、受け取り用のJavaBeansクラスの型のオブジェクトを返すメソッドに付けておくことでビューからの入力をそのJavaBeans型としてmodelに格納し、postするControllerのメソッドの引数に付ける事で、Modelの中から指定した型のJavaBeansを探してきて、POSTしてきたビューの入力と紐付けるようである。https://kazkn.com/post/2017/use-model-attribute/に詳しく書いている。
  • model.addAttributeした属性は、いつまでアクセスできるんだろう。画面遷移またいでもアクセスできるようだが。
  • .loginProcessingUrl("/login")はの"/login"はフォーム認証でデフォルトでログイン処理を行うハンドラメソッドとのこと。
  • Spring Securityをpom.xmlに設定した時に出てくるログイン画面とコンソールに出てくる生成されたパスワードはSpring Boot のAutoConfigurationで出てくるように設定されているようだ。
  • MyChat.domain.service.room.LoginUserDetailsService.loadUserByUsername(String)をオーバーライドするとパスワードが出なくなるのは、@ConditionalOnMissingBeanがorg.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfigurationに設定されているため。
  • Collection<? extends GrantedAuthority>getAuthorities()の<? extends GrantedAuthority>がよく分からない。とりあえずcreateAuthorityListメソッドではSimpleGrantedAuthorityクラスのオブジェクトを格納するようだ。433pによると、Spring SecurityではROLE_で始まる権限情報をロールとして扱うようで、ROLE_プレフィックスは必ずいるようだ。
  • ピリオド3つは可変長引数を表す。
  • Spring Securityのログイン処理用フォームの入力値例外処理ってどうやるんだろうか。
  • ↑をやるためにログインフォームから認証処理までに一つコントローラを置いて、そこで認証処理をするようにしたら、Controllerからデフォルトの認証処理URL"/login"にフォワードさせると、何故かこのコントローラに書いた処理は全く使用されず、ログイン成功した。認証処理URLを"/login"から適当なものに変えると、このコントローラの処理は行われるが、認証処理URLには届かなくなった。どうやらサーブレットフィルタ等の設定をしなければならないらしい。
  • web.xmlをどこに配置すればいいか分からん。←基本的にSpring Bootではweb.xmlは使わない?
  • フォワードを許すには、springSecurityFilterChainの名前で登録されているフィルタの設定をいじる必要がある。設定を変えるにはAbstractSecurityWebApplicationInitializerを継承したクラスで色々やるらしい。
  • servletContext.getFilterRegistration(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME).addMappingForUrlPatterns(EnumSet.of(DispatcherType.FORWARD), true, "/loginProcessing"); をWebSecurityConfigのconfigメソッドで実行する事でSpring Securityフィルタにログイン処理URLをマッピングしてFORWARDでもアクセスできるようにすることに成功した。

僕が数学を好きになった理由

小学生のころまでは、単純な計算は得意だったが、パズル的な問題になると途端に解けなくなっていた。

中学生になって「算数」が「数学」というちょっとかっこいい名前になってからも、最初のあたりは計算の比重が大きかったし、解いているうちに段々理解できたので、そんなに苦労はしなかった。しかし、2年になって少し難しい内容になってきた時期と、宮崎の付属中から福岡の付属中に転校してきた時期が重なり、一部の範囲をやらないままに進んでいったため、少しずつ苦手になってきたのを覚えている(福岡の中学が宮崎の中学よりもレベルが高かったというのもあった。)

まともに数学と向き合うようになったのは中学三年の4月頃、数学の教師が皆に出した「ラングレーの問題」が最初だった。「ラングレーの問題」とは、次のような問題だ。

角度を地道に計算していっても、全く求まらず、全然解けなかった。そして誰一人解けないので、授業時間の半分あたりを過ぎたところで、先生が前の黒板にヒントを書いた。僕はなんだか悔しいので見なかったのだが、他の人たちの会話から、どこかに平行線を引けば良いらしいと知り、色々試行錯誤して、昼休みが終わるころには解くことができた。先生はどうやら見ていてくれたらしく、解けたと知るとこっちにきて答え合わせをしてくれた。今思うといい先生だったと思う。(僕が持ってきた美術の作品をほかの先生の前で笑ったのは酷かったと思うが。)

 

そんなわけで、その日から数学に少し興味をもつようになった。

本屋で図形問題の載っている問題集を買い、解くようになった。特に「目で解く幾何」シリーズを何周もしていたと思う。先述の通り、福岡の中学は宮崎の中学よりもレベルが高かったため、宮崎ではかなり上位だった僕も、中の上くらいになっていたから、一つでも他の人より勝る教科ができて嬉しかった覚えがある。(今思えば、他の人と同じように塾に行っていればよかった。)

さて、そんな風にして色々な問題集を解いていると、ある日数学オリンピック本選の図形の問題に出会った。確かある特殊な正三角形の面積を求める問題だった。その問題が2、3分で解けたことで、自分を過大評価するようになった。(今思えば単に巡りあわせが良かっただけだったのに)

この頃から、難しい問題をクラスメイトに見せては、解けなかったらこう解くんだと自慢し、段々ウザがられるようになった。(正直俺が全面的に悪かったように思う。中二病だったのだ。今となってはものすごく恥ずかしい。元クラスメイトの人たちごめんなさい。)

その後、ジュニア数学オリンピックの予選を受けてみるも、12問中4問程度の正解数で、当然落ちた。(ここで素直に自分の力不足を認めていればよかったものを)

その後、たまたま高専のパンフレットを配られたことで、高専の存在とその自由な校風を知り、ここに入ってひたすら数学の勉強をして、数学オリンピックに出たいと思うようになった(何て身の程知らずだったんだろう)

そして高専に受かり、入学することとなる。その後の堕落はまた別の記事で書きたい。