はじめに
前半にコーディング問題(AtCoder等)・後半に開発をしました。
まずは、前半のコーディング問題の記事を記載します。
普段あまり使用しないクラスや実装の考え方を備忘録としてピックアップしてまとめます。
画像表示はチャット機能の実装に無駄が多かったため修正にかなりの時間がかかりました。自戒を込めてまとめます。
内容
まず、組み合わせ。
threeWayPermutationって命名は失敗だったなぁ...。
順列の内、三つの値の順列を取得する。
この順列には{1,2,3}{1,3,2}{2,1,3}{2,3,1}...のように3!通りの重複を含む。
三つの値から構成される順列から重複を取り除いて終わり。
樹形図の考え方で落とし込む事ができた。
public static int combination(int n) {
int duplication = 3 * 2 * 1;
int threeWayPermutation = 1;
for(int i=0; i < n - (n-3); i++) {
threeWayPermutation = threeWayPermutation * (n-i);
}
int combination = threeWayPermutation / duplication;
return combination;
}
曜日のみの取り扱いのメモ
DayOfWeek (Java Platform SE 8)
int型で曜日を扱えるので便利。
Submission #43493719 - NEC Programming Contest 2022 (AtCoder Beginner Contest 267)
開発
従来は画像の受信・保存のみ実装。
STOMP over WebSocketは基本的に文字列でのデータ送受信となるので、base64で文字列に変換されたデータを送信し、サーバー側でbyteに変換し保存。(byteのメリットとしては、今後追加で行うモバイルアプリ開発ではRestAPIの実装を考えているため。)
この画像をリアルタイムで受信・後ほどアクセス時に表示・履歴取得ボタン押下で表示の3パターンの実装に追加した。
無駄は、サーバー側がロジック層で上記3パターンの処理を実装しているため冗長という点だ。本来はロジック層で既読管理とログ取得を一括で実装するべきだが、3パターン個別で実装してきたのとコントローラーで既読管理をしているというダメな実装をしていたので、優先度は低いが今後リファクタリングの対象となる。
後は、純粋に初めての実装だったのでフロント側に冗長なコードが多い。
全て削った。
Thymeleafで、いつもひっかかる部分を忘れずに書く。
変数式を含める際は、ただの結合だけで動作する。もう忘れない。
履歴取得については、「ログ取得ボタン押下」から「画面最上部で履歴を取得する」に変更。
トリガを「0pxの際にスクロールする事」とした。
また、履歴取得の際は、insertAdjustmentHTMLで要素を加えるだけなので、新しい履歴が覆いかぶさる問題が発生。
これは、履歴を加える際にダミーの要素を生成し、履歴を加えた後にscrollIntoView()でダミーの要素に戻る実装で対処。戻った後はダミーの要素を削除。
雑記
試合一週間前となりました。
仕事している期間も業務外の学習がひと段落している時期は二時間ほど練習してましたが、最近は密度が増えました。縄跳・サンドバッグ・ミット打ち・サンドバッグ打ち込み(か補強トレーニング)・スパーリングのメニューをしているので、準備運動含めて二時間ほどかかります。あっという間で楽しいです。
あと、先生のコーチングがかなりハイレベルだと思ってます。
前回の練習での私の課題点をつぶすように教えてくださいます。
また、説明が列挙ではなく、動作の要所で必要な指摘をピンポイントでくださるのですごく技術の習得が早くなります。
例えば、突然、押し合い状態で打撃を打つ技術を教わった際の話です。
先生が「押し返す。押し返す。」といいつつ、黙ってフックを打ちます。すると、私は押している状況なので、肘をあげる事でしかガードできません。次に先生がミットをボディに構えて「膝。」といいます。膝蹴りを打つと、押している状況なので体勢を維持しつつ攻撃します。
これが、「ガードして」って言われた場合は、片手を側頭部に置いたガードになってしまっていたでしょう。それをあえて言語化しない事で、私はこの技術の意味を理解できたわけです。