モックではなく実際のメソッドで呼び出したい典型的なケース モックではなく実際のメソッドで呼び出したい典型的なケースとしては、メソッドが単なる文| grep Tips *
JavaでX-Forwarded-Forを取る JavaでX-Forwarded-Forを取るため、以下のコードを書いた。 String xff = httpServletRequest.getHeader("X-Forwarded-For"); ローカル環境| grep Tips *
Spring Boot: 3.2.6 Nginx: 1.25 Spring Bootで相対パスのリダイレクト Spring Bootでリダイレクトする際にreturn "redirect:/path"| grep Tips *
使用している技術は以下の通り Java: 21 Spring Boot: 3.2.6 MyBatis: 3.5.14 MySQL: 8.0 @Transactionalをつける対象 Serviceのクラスかメソッドか @Transacti| grep Tips *
CSSの部分一致セレクタとカスタムプロパティを組み合わせてコードを簡潔にする。 具体例として、別々の要素のborder-colorとbackg| Posts on grep Tips *
アプリの挙動が変わった後もキャッシュを使い続けると起こる問題 デシリアライズに失敗する or 追加項目がnullになる メソッド修正を行い戻り値の型が| grep Tips *
大量のJSON配列を受け取らなければいけなかった背景 API提供元がレスポンスの件数制限機能やページング機能を提供しておらず、先頭10件しか必| grep Tips *
画面の入力欄が空のとき、APIのリクエストボディをどうハンドリングすべきかについて考える。 フロントエンドの観点 画面の入力欄が空の状態での保存| Posts on grep Tips *
Spring Boot: 3.2.5 Spring Bootの公式ドキュメントのAuto configuration Classesのセクションを見る Spring Bootが何の実装クラスをBeanとしてアプリケーションコン| Posts on grep Tips *
JavaScriptで改行を含む文字列を作成したい。 例えば以下のような文字列を作成する方法を考える。 1st line 2nd line 3rd line 方法はいくつかあるが、テンプ| grep Tips *
単純なカラム追加をオンラインDDLで実行しようとするとエラーが発生した MySQLのversionは8.0.19。 カラム追加のalter tab| Posts on grep Tips *
:not(.parent) > .target :notを親/先祖に対して使う タイトルの通り、「親/先祖が〜〜でない」要素を示すCSSを:notを使用して書く。 まず以下のようなHTM| grep Tips *
input type='number'でmaxlengthが使えない <input>のtypeがtextの場合であれば、先頭n文字だけ入力可| grep Tips *
MySQLで同じ行ごとに結合する SQLで同じ行ごとに結合することはできない。INNER JOIN, LEFT JOINなら結合カラムを指定するし、指定しないでC| grep Tips *
jOOQを使ったときに感じた2つのストレス jOOQを使ったときにストレスを感じたことが2つあり、それを解消したい。 1つ目は、JSON型を含む| grep Tips *
環境 Java 17 MyBatis 3.5.9 Spring Boot 2.6.2 MyBatisでJSONを扱うためにJSON専用のTypeHandlerを定義する JsonTypeHandlerを作成する| grep Tips *
Springのapplication.propertiesを環境毎に分ける Springのapplication.propertiesはローカ| grep Tips *
FreeMarkerの全template共通で使用する変数をShared variablesで設定する Shared variables FreeMarkerの全てのテンプレ| grep Tips *
APIの同時実行を防ぐ 課金処理や外部連携など、APIが同時に実行されては困るような時は何らかの方法でロックを取る必要がある。 データベースのト| grep Tips *
AES-256-CBC AES-256-CBCでは、暗号化と復号する際に以下が必要になる。 256 bitの秘密のkey 16 bitのiv(初期化ベクトル, initialization vector. 暗号化対象ごと| grep Tips *
環境 Java 17 Spring Boot 2.6.0 Jackson 2.13.0 Redis 6 関連 Spring SecurityでREST API + JSONによる認証を行う(Session/Cookie + Redis編) ※Sessi| grep Tips *
環境 Kotlin 1.6 Spring Boot 2.6.0 Spring Security 5.6.0 com.auth0:java-jwt 3.18.2 Gradleの設定含め詳細はGitHubにて記載 関連 Spring SecurityでREST API + JSONによる認証を行う(Ses| grep Tips *
環境 Kotlin 1.6 Spring Boot 2.6.0 Spring Security 5.6.0 Redis 6 Gradleの設定含め詳細はGitHubにて記載 関連 Spring SecurityでREST API + JSONによる認証を行う(JWT| grep Tips *
環境 Java 17 Spring Boot 2.5.6 Redis 6.2.5 関連記事 ローカルキャッシュとRedisキャッシュ 大きなRedisキャッシュの弊害 同時リクエスト数とアプリケーションサーバー| grep Tips *
curl 7.54.0 -I(--head)オプションと-XPOSTを一緒に指定すると発生する問題 curl -I -XPOST "${url}"でレスポンスのHTT| grep Tips *
動作確認環境 Java 16 Jackson 2.12.5 JsonNodeを取得する path, get, at keyが存在する場合 JsonNodeを取得するにはpath, get, atの3つの方法がある。 p| grep Tips *
動作確認環境 Java 16 Jackson 2.12.5 クラスでJSONの型を定義する JacksonでJSONをJavaのオブジェクトに、あるいはその逆をするには、クラスでJS| grep Tips *
動作確認環境 Java 11 Spring Boot 2.5.5 一定量以上のoffsetや意図しないSortによる問題 一定量以上のoffset Spring Bootによるpage, sizeへの制| grep Tips *
動作確認環境 Java 11 Retrofit 2 OkHttp 3 Spring Boot 2.5.5 JUnit 5.7.2 JavaでRetrofit + OkHttpを使う JavaとRetrofit/OkHttpと検査例外とエラーハ| grep Tips *
SELECTで最適化されるサブクエリ MySQLのサブクエリは他のRDBMSに比べて性能の最適化面で劣っている印象だが、単純なSELECT文に| grep Tips *
JUnitで使うMockitoの設定をテストごとにわかりやすく変える 動作確認環境 Java 11 JUnit 5.7.2 関連記事 JUnitで使うDTOの各フィールド値のバリ| grep Tips *
JUnitで使うDTOの各フィールド値のバリエーションを作る 動作確認環境 Java 11 JUnit 5.7.2 関連記事 JUnitで使うMockitoの設定をテストごとにわ| grep Tips *
Spring BootのControllerのJUnitで使うリクエストボディを作る 動作確認環境 Java 11 Spring Boot 2.2 JUnit 4.12 paramかparamsでリクエストボディ| grep Tips *
Spring Bootの@Scheduledの注意点 動作確認環境 Java 11 Spring Boot 2.2 JUnitで@Scheduledが起動してしまう 一定間隔でメソッドを実行してく| grep Tips *
データベースで日時を保存するカラムの命名ルールを検討する created_at データベースで日時を保存するカラムの命名ルールを考える。 調査前、created_a| grep Tips *
シャード数を1にすべき理由 scoreによるソート Elasticsearch Clusterでクエリのユニットテストをするときはシャード数を1にした方がいい。 特にsco| grep Tips *
メソッドの前後にAOPのように一律で処理を入れたい メソッドの前後にAOP(アスペクト指向プログラミング)のように一律で処理を入れたいが、プロ| grep Tips *
環境 ローカルキャッシュとRedisキャッシュについて考える前に、使用する技術や環境を記載する。 項目 環境 言語 Java 16 フレームワーク Spring Boot 2.5.2 ローカルキ| grep Tips *
JSONを文字列に変換したいユースケース JSONを文字列に変換したい場合がある。 ユースケースを一つ挙げるとREST APIでデータをJSONで| grep Tips *
getter vs publicフィールド Javaでgetter/setterを常につけるのは、フィールドをpublicで宣言するのと何が違うのか、という話| grep Tips *
getterにロジックを書かない方がいい getterにはロジックを書かない方がいい。 単純なgetterとロジックを含むgetterの判別がつ| grep Tips *
二つのMySQLのユーザー定義変数の設定方法 @をつけて@変数で定義できるユーザー変数には、MySQL 8.0(現時点の最新)までで二つの設定方| grep Tips *
curlのconfigである.curlrcにwrite-out = "\n"を書くと便利、ということが書きたいが、.curl| grep Tips *
MySQL 8で導入されたSKIP LOCKED MySQL 8でSELECT ... FOR UPDATEにSKIP LOCKEDというオプションが加わった。これはロックされている行を除い| grep Tips *
@Transactionalと検査例外・非検査例外 ロールバック Spring Bootの@Transactionalは、デフォルトでは検査例外が発生したと| grep Tips *
JUnitの並列実行で起こる問題 gradleでtestのmaxParallelForksを設定してJUnitを並列で実行できるようにしている| grep Tips *
まずは結論から SpringのDIコンテナに管理してもらいたいクラスが、自分で作成しているクラスなのか、それとも外部のライブラリ(サードパーテ| grep Tips *
ESC + B, ESC + F 単語ごとにカーソル移動するには 、ESC + Bで戻る、ESC + Fで進む、なのだが、ESCを押したまま連続で移動できない。押したままB| grep Tips *
環境: Java 11 jcmdのヒープ・ヒストグラムでJavaヒープを分析する jcmdでヒープ・ヒストグラムを作成すると、現在のヒープにおいて、どのクラ| grep Tips *
列番号を列名から簡単に求める たとえばテキストファイルの5列目を抜き出したければawk '{print $5}' txtのようにprint $列番号と書く。しかし1行目| grep Tips *
Elasticsearchで全文検索する際にmatchとmatch_phraseの違いがはっきり身についていないのでまとめてみる。 version: Elasticsearch 7.5 ma| grep Tips *
TL;DR ヒント句を使ってWHEREでのINDEXを使わないようにする。 また、同時にORDER BYでINDEXを使うように明示すると可読性が上がる。| grep Tips *
MySQLでUPDATEするときの列順とその影響 MySQLのUPDATE文でSET col1 = col1 + 1, col2 = co1としたとき、col2 = col1のcol| grep Tips *
JSON_TABLE()を使ってMySQLのJSONをテーブルに変換する MySQL 8.0のJSONをテーブルに変換するにはJSON_TABLE()を| grep Tips *
動作確認version: Java11 パターンを含まない部分否定の正規表現 パターンで始まらない文字かチェックする場合 否定先読み あるパターンを含まない正規| grep Tips *
JSONの深い階層にある値を取るには JSONの深い階層にある値を取ろうとすると、第一階層から順にパス式を記載しなければならない。アドホックな| grep Tips *
1対多の結合をしても1の方でマッチする行数のみ取得する SQLで1対多の結合をすると行数が多の方に合わせて取得できるが、プログラム上では1の方| grep Tips *
SQLのバッチ実行 大量にUPDATE, DELETE, INSERTする場合JDBCのバッチ実行機能を使用しないとパフォーマンスが悪化する。 バッチ実行でなく| grep Tips *
Version Java 11 Apache Commons Lang 3.3.9 空文字をsplitした時の挙動 空文字をスペースで分割したい時、StringUtilsを使うと空配列ができるが、Stringの標| grep Tips *
動作確認version: Java11 なぜ現在日時を変える必要があるか JUnitレベルではなく実際にWebサーバを起動してイベントの開始・終了の制御等を| grep Tips *
redis-cliのINFOコマンドの出力の改行はCRLF redis-cliのINFOコマンドの出力の改行コードはドキュメント記載の通りLF| grep Tips *
DNAT, SNATをつかった通信の転送 グローバルIPをもっていないMySQLに外部から接続したい場合、グローバルIPをもっている別のサーバのipta| grep Tips *
port番号を変える理由 MySQL等、内部通信しか許可していないが、オフィスからはグローバル経由で接続したいとする。念のためport番号をデ| grep Tips *
Munin FastCGIの問題点 MuninをFastCGIで表示するときにおこるDynazoomページのURLがおかしくなるバグの対処法で「Muni| grep Tips *
S3に保存するときのパス FluentdでS3にファイルを保存するときのパスはs3_object_key_formatで決定される。 https://docs.fluentd.org/v1.0/articles/out_s3#s3_object_key_format デフォル| grep Tips *
Fluentd v1でのfluent-plugin-s3の設定方法が以前とは結構変わっているため、どのように書くべきか記載する。 Fluentd v1より前の書き方 以前は| grep Tips *
Fluentdの監視項目 Fluentdの監視をしたい項目は四つ。 port監視 バッファーに蓄積されているキューの数が上限に達していないか バッフ| grep Tips *
検証したミドルウェアのバージョン $ nginx -v nginx version: nginx/1.14.0 $ td-agent --version td-agent 0.12.40 Nginxのconf アクセスログの形式 HTTPのHostヘッダはNginxのログでse| grep Tips *
トップディレクトリもfindの処理対象 findコマンドでファイルを検索すると、検索のトップディレクトリがfindの条件に合うとき、それも出力| grep Tips *
ファイルのリダイレクト方法 systemdでコマンドを実行し、ファイルにリダイレクトしても、ファイルに実行結果は記載されない。 ファイルにリダイ| grep Tips *
IAM認証 + Cognito IAM認証とCognitoを組み合わせる方法。CognitoがIAMを返して、そのIAMに基づいて、API GatewayはLa| grep Tips *
MuninをFastCGIで表示するときにおこるDynazoomページのURLがおかしくなるバグ Muninを高速に表示するためには、グラフと| grep Tips *
MySQL 5.7でSSL接続が有効になる条件 MySQL 5.7から、SSL接続が有効になっている場合、クライアントからSSL接続を行うと明示しなくても自動でS| grep Tips *
AWSのEC2のTagにName: host名のTagを設定しているとする。このTagをもとに起動しているEC2についてhostsファイルを生| grep Tips *
SSHのMultiplexingによって発生するAnsibleの問題 OpenSSHの問題なのかAnsibleの問題なのか、あるいは自分の書い| grep Tips *
Software Collections(SCL)のメリット rbenvでinstallしたRubyへsymlinkを貼り、cron等から使えるようにするやr| grep Tips *
はじめに 以前、シェルスクリプトでAtomicなファイル操作をするでロックファイルをAtomicに作成する方法を書いた。 ロックファイルを使って| grep Tips *
Muninプラグインの実行ユーザ Muninプラグインの実行ユーザはnobodyになる。プラグインのスクリプトからファイルを操作したい場合など| grep Tips *
Muninのmemoryプラグインの配色 Munin 2.0.33のときのmemoryプラグインの各項目の表示順は以下の通りだった。 しかしMunin 2.| grep Tips *
Ansibleのshellモジュールとインデント 確認version Ansible 2.7.0 Python 3.6.5 Ansibleのshellモジュールに記載した実行コマンドは、スペ| grep Tips *
Basic認証でBalancing 同じURIにアクセスしても、Basic認証で使用したユーザ名によって、管理用のアプリケーションにProxy| grep Tips *
Jinja2のWhitespace Control Python 3.6.5 Jinja 2.10 Jinja2でforやifを使ってテンプレートを書くと、出力される文字列に空行が多く入ってしまう| grep Tips *
Python venv環境設定 Pythonのvenv環境を作るには以下のようにpython3.6 -m venv <venv_dir_name>としたあと| grep Tips *
プログラムからJSONを出力する場合、Object内のkeyの順番が固定されている保証はない。二つのJSONを比較したい場合、出力のたびにk| grep Tips *
Templateファイル シェル変数が書かれたファイルを読み込み変数展開できれば、Templateファイルのように使える。 次のようなファイルが| grep Tips *
バケットポリシーでS3のアクセス制限 S3を静的サイトホスティングでWeb公開するが、特定のIPかVPC内のEC2からのみアクセスできるように| grep Tips *
jqで相対パスを指定してJSONの要素を取得したい。 以下のようなJSONから"aaaa"だけ抜き出したい場合を考える。 $| grep Tips *
はじめに Ansibleで変数が定義されていれば処理を行い、定義されていなければ処理を行わないというロジックはwhen: var_x is definedある| grep Tips *
はじめに Ansibleでループ処理をするためにwith_itemsにリストを渡すというのはよくあるが、リストから一部のリストを除外するいい方| grep Tips *
NginxとLuaでリクエストHTTPヘッダを全てログに残す NginxでリクエストHTTPヘッダを全てログに残すにはLuaスクリプトを使うと| grep Tips *
はじめに 別のRepositoryにpushしたいとき、そのままpushすると今までのコミット履歴がすべて残ってしまう。新しいReposito| grep Tips *
state:absentとpath:/directoryの挙動 Ansible Version: 2.3 Ansibleのfileモジュールのstateでabsentを指定すると| grep Tips *
前提 パブリックIPを持つサーバ iptablesで疎通設定をしている AWSのセキュリティグループのようにサーバの外側で別途疎通設定をしていない| grep Tips *
rbenvを使ってRubyをinstallした場合、/etc/profileや.bashrc等でrbenvの環境変数を読み込むことでRuby| grep Tips *
dirname $0の問題点 スクリプト自体にシンボリックリンクをはって実行する場合、dirname $0をスクリプト内で実行するとスクリプト本体のディレクト| grep Tips *
はじめに Bashでのファイルの読み込み、変数への格納、一時的な環境変数について、forよりもwhile readを使うと便利な点を記載する。 例| grep Tips *
Gitフックでブランチの派生元を制御したい バグフィックスのためにfixブランチをmasterブランチから切り、また、機能開発のためにfeat| grep Tips *
Zabbixで値が変わったことを検知するとき、一定時間検知を続けるため、diffやlast(0)#prev()を使うのではなく、deltaを| grep Tips *
前提 MongoDBのデータ領域がファイルシステム上30GB程度(wiredTigerのsnappyを使用)、gzip圧縮されたdumpファイ| grep Tips *
MongoDBのReplica Setを障害から復旧させる方法を二通り書く。 MongoDB 3.4 構成について 以下の3台構成の場合の復旧方法について書く。 primary arbiter secondary(hidden)| grep Tips *