chevron_left

メインカテゴリーを選択しなおす

cancel
きり丸
フォロー
住所
未設定
出身
未設定
ブログ村参加

2022/07/22

arrow_drop_down
  • DockerのMinioをアップデートしたら起動しなくなった

    DockerのMinioを使用していますが、イメージが古すぎてディレクトリごとアップロードができませんでした。そのため、最新イメージにアップデートしようとしたところ、エラーメッセージが出て起動しなかったその対応を記載します。 ※ プロダクション環境でMinioを使用している場合には適用できません。 環境 Docker Minio RELEASE.2019-01-31T00-31-19Z RELEASE.2024-02-13T15-35-11Z ゴール 次のエラーメッセージが出たときに、最新イメージで起動できるようにする。 ERROR Unable to use the drive /data:…

  • WSLで起動したサーバにiPhone等のモバイル端末からアクセスする

    ※ 家で検証したときはできなかったのですが、会社で検証したときはできましたので、残しておきます。 WSLで起動したサーバに対してiPhoneやAndroidからアクセスすることでモバイル端末の実機確認をしたかったのですが、単純にWSLのIPにアクセスするだけでは確認できなかったので手順を残します。 環境 WSL Ubuntu 22.04.4 LTS ゴール iPhoneでWSL上に起動しているサーバにアクセスする。 詳細 管理者権限でコマンドプロンプトを起動します 管理者権限でコマンドプロンプトを起動します。私の過去記事に簡単に管理者権限でアプリケーションを起動する方法を残しているので、参考に…

  • Gmailでテキストメールを受信して確認する(クライアント問わない方法)

    Gmailでテキストメールを送信する方法はたくさん見つかったのですが、受信してテキストメールを確認する方法は見つからなかったのでブログにします。 なお、GmailではHTMLメールとテキストメールを選んで受信はできません。そのため、受信するではなく、受信してテキストメールを確認するが本題です。 環境 Gmail 20240320時点 確認方法 テキストメールを確認したいメールのソースを確認する 確認したいメールを開き、「︙」をクリックしてメッセージのソースを確認を選択します。 デコードしてテキストメールを確認する メッセージのソースからテキストメールの箇所を探します。text/plainのブロ…

  • testcontainers-pythonでMinioを扱う

    testcontainers-pythonでminioを使う際に少々手間どったのでメモに残します。 なお、この記事ではtestcontainers自体のメリット等については記載いたしません。 環境 Python 3.12 boto3 1.34.69 minio 7.2.5 testcontainers 4.1.1 ゴール boto3でminioに対してファイルアップロードできたことを検証します。minioについてはtestcontainersでセットアップします。 下準備 testcontainersとminioをdevDependenciesに加えます。各々のパッケージマネジャで読み替えてく…

  • 【Scrap】pytestについて

    ZennのScrapsと同じような感覚の記事。間違っている可能性は十分にあります。 今回の記事ではpytestについて自分が調べたことをまとめます。 環境 Python 3.7.9 pytest 7.4.3 pytest-check 2.2.2 Pytestについて 処理順番 pytestではヒットした順番で順次テストするのではなく、collectionというテスト対象のメソッドを集めた過程を経てテストを実行します。この実行前のcollectionで先頭にTestが付いているクラス、test_がついているメソッドを探しています。感覚的には、200テストを探すのに1秒くらいかかるので、テストケー…

  • Pythonのclassは暗黙的にobjectを継承している(reportMissingSuperCallの対応)

    pyrightを使用している際に、reportMissingSuperCallが発生したので対応していました。 error: Method "__init__" does not call the method of the same name in parent class (reportMissingSuperCall) ただし、コード上は特に何も継承していません。 class Hoge: def __init__(self, name: str): self.name = name このエラーメッセージを対応するために調査した内容をメモします。 環境 Python 3.12 原因 掲題の…

  • 同じJSONやDictでも生成されるJWTは変わることがある(Pythonで例示)

    同一のJSONやDictを与えているはずなのに、生成されたJWTが変わってしまったというメモ。 なお、ライブラリの特性である可能性はあるので、すべてのJWTライブラリで発生するわけではありません。 環境 Python 3.11 python-jose 3.3.0 原因 JSONやDictとしては等価だったが、JSONを文字列化(シリアライズ)したタイミングでキーの順番が変わってしまったため。シリアライズした結果を元にencodeするので、生成されるJWTが等価にならない。 事象発生時のシリアライズ {"id": 1, "exp": 1710152710, "iss": "kirimaru"} …

  • テストのメールドメインはexamle.comのほかにもある(RFC 2606)

    テスト時に使用するメールドメインについてexample.comを使用していますが、メールドメインで制御しているコードを検証したい時にほかにも安全に使えるドメインがないかを調べたときのメモ。 すでに飽和している情報ですが自分のメモのために残します。 テストで使えるトップレベルドメイン RFC 2606 RFC 2606で定義されているものは次の4つです。 .test .example .invalid .localhost 使い分けについては、RFC 2606で提案されています。 https://datatracker.ietf.org/doc/html/rfc2606 IANA(ICANN) …

  • Pythonのエラーチェイン(例外を元に例外を投げる)には3種類あるがあまり気にしなくていい

    Pythonでフレームワークから発生した例外を元に、適切に自作した例外に変換する方法に複数あることを知ったので、それを素振りしました。 なお、結果だけ先にお伝えするとraiseするだけでも9割問題ありません。 環境 Python 3.11.6 確認方法 Pythonでは単純にエラーをraiseするだけでなく、from eとfrom Noneという構文を付けてraiseすることもできます。 try: try: 1 / 0 except ZeroDivisionError as e: raise ValueError("ERROR") # 1つ目 raise ValueError("ERROR")…

  • Gitにchmodした結果を含めない、そして復帰させた時の手順(core.fileMode)

    WSLで開発中にroot権限で作成されたファイルがあり、IntelliJ IDEAで更新できなかったファイルがありました。そのためディレクトリごとchownとchmodを行ったのですが、Gitに変更箇所があると検知されてしまい、気づかずにコミットしてしまいました。 今回の記事では、chmodを行っても検知されないようにする設定方法と誤ってコミットしてしまったときの復帰手順の操作を記載します。復帰手順に関しては、もっといいやり方がありそうですので、もし同じ事象にハマったら教えてください。 環境 Git 2.34.1 IntelliJ IDEA 2024.1 EAP 設定方法 次のコマンドを実行す…

  • RailsのRSpecテストを並列化して30分から12分に短縮した(parallel_testsと性能アップ)

    CI上のRailsのRSpecテストが30分もかかっていてストレスフルだったので、テストを並列化する等で30分かかっていた時間を12分まで削減しました。 そのときのメモ。 環境 AWS CodeBuild Ruby 2.7.2 Rails 6.0.3.6 Parallel_tests 4.4.0 MySQL 8 前提 docker composeでテストは閉じている。そのため、RDS等のアクセスは発生していない。 対応 parallel_testsライブラリを入れる 並列化ライブラリのparallel_testsを導入します。 group :development, :test do gem …

  • WSLのIPを調べる(WSLで起動したサーバに他端末からアクセスしたい)

    同一ネットワークに所属していればローカルで起動したサーバをiPhone等の他端末からアクセスできるのは知っています。Windowsの場合ipconfigで表示されたIPを指定すればアクセスできることも知っています。ただ、WSLで起動したサーバに対してはアクセスできなかったので、それを回避するためのメモ。 環境 Ubuntu 22.04.2 LTS GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64 前提条件 なし コマンド 次のコマンドで得られたIPを指定すればアクセスできます。 ip addr show eth0 grep inet …

  • WSLの時刻がズレたのでWindowsの時刻に修正する(sudo hwclock -s)

    WSLの時刻がズレたことによるエラーが発生したので、時刻修正をした時のメモ。 環境 Ubuntu 22.04.2 LTS GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64 前提条件 なし コマンド 次のコマンドをWSL上で実行することで、Windowsの時刻と一致できます。 sudo hwclock --hctosys または sudo hwclock -s 説明 WSLからWindowsのハードウェアクロック側にアクセスするので、sudo hwclockが必要です。 そのオプションとしてソフトウェアクロックをハードウェアクロックの値で更新…

  • WSLの一般ユーザのパスワードをリセットしたい

    sudoコマンドを実行したいが、パスワードを忘れたのでWSLのパスワードをリセットするときのメモ。 環境 Ubuntu 22.04.2 LTS GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64 前提条件 変更対象の一般ユーザー名が分かっていること コマンド # root ユーザでログインする wsl -u root # kirimaruユーザのパスワード変更 passwd kirimaru ソースコード なし 終わりに WSL上ではなく、Windows上で構築することに慣れてしまっているので忘れてました。 小ネタですが、残しておきます。

  • WindowsのGit操作で発生したFilename too longを解決する(git config --global core.longpaths true)

    Macを使用している他人がコミットしたファイルをpullしようとしたらFilename too longが出力されてpullできませんでした。その解決方法を残します。 環境 Windows 11 GitBash 4.4.23(1)-release ゴール 次の操作時にエラーが発生しない。 $ git reset --hard origin/develop error: unable to create file xxx/yyy/zzz[ファイルパス] :Filename too long 解決方法 Gitのcore.longpathsをtrueに設定する。 git config --globa…

  • SQLで同姓同名が何人・何種類あるかを知りたい(重複レコードの存在とどのレコードかを知りたい)

    SQLの小ネタ。 レコードが1:Nの関係のときに、Nが一定数以上のレコードが存在しうるか、存在する場合はどのようなレコードかを知りたいことがありました。 今回の記事ではユースケースとして分かりやすいように、usersテーブルからnameのうち同姓同名が何人・何種類あるかを調べることができるのをゴールとします。 環境 MySQL 8 下準備 次のテーブルを用意する。 CREATE TABLE `users` ( `id` int NOT NULL, `name` varchar(1024), ) INSERT INTO users (id, name) VALUES (1, 'あいうえお'); …

  • FastAPIのpydanticの422UnprocessableEntityはExceptionのExceptionHandlerではキャッチできない

    FastAPIで意図しないエラーが発生したときにExceptionでハンドリングしていましたが、それだけではpydanticで発生するエラーがキャッチできなかったのでメモします。 なお、pydanticはAPIのRequestとResponseのモデルで使用していますので、フロントのバリデーションエラーと考えてください。 環境 Python 3.11 FastAPI 0.105.0 pydantic 2.5.3 ゴール pydanticで発生していた次の詳細すぎるメッセージが返却されないこと。 { "detail": [ { "type": "greater_than_equal", "loc…

  • AnyIOのテストをasyncioだけで動かす(asyncioとtrioの2倍動かないようにする)

    AnyIOを使用しているテストで、意図せずにasyncioとtrioの2つで動いてしまったテストがあったので、asyncioだけにした時のメモ。 環境 Python 3.11 AnyIO 3.7.1 Pytest 7.4.3 実装 conftest.pyに次の処理を入れると、asyncioだけが動きます。 @pytest.fixture def anyio_backend(): return 'asyncio' テストをAnyIOで動かすには 次のどちらかで動きます。 # 先頭で宣言する pytestmark = pytest.mark.anyio # または、メソッドごとに定義する @pyt…

  • SQLで条件が一致しないレコードを特定する(NOT EXISTS)

    小ネタ。 特定の条件に一致するレコードを取得するのはINNER JOIN等を使う方法は知ってましたが、一致しないレコードを取得する方法を知らなかったのでメモします。 環境 MySQL 8 実装 NOT EXISTSを使えば条件一致しないレコードを特定できます。逆に条件一致するレコードを調べるときはEXISTSを使えば特定できます。 SELECT * FROM users WHERE NOT EXISTS(SELECT 1 FROM user_profiles WHERE users.id = user_profiles.id) 検証方法 USERSテーブルとUSER_PROFILESテーブルを…

  • Pythonのenumはint等のプリミティブ型を継承すると便利

    基本的には推奨されない書き方のようですが、使ってみて便利だったのでメモします。 環境 Python 3.12 実装 int等のプリミティブな型の継承は次のとおりです。 from enum import Enum class IntInheritEnum(int, Enum): ID = 1 # 列挙型ではなく、intとして振舞うため1にアクセスできる IntInheritEnum.ID # 本来のアクセス方法 IntInheritEnum.ID.value ただし、自作クラス等は継承できません。metaclassの競合が起きるため、クラスで定義したかったものがあれば、namedtuple等を使…

  • Pythonの__iter__を素振りする(First Class Collection[FCC]で使えるかも)

    Pythonではイテレータを簡単に作れます。もしかしたら何かに使えるかもしれないので、素振りします。 環境 Python 3.12 ゴール PythonのFCC(First Class Collection)にて、For文を使用する際にFCCのインスタンスのまま使用できること。 from typing import List class User(): # ... 省略 class Users(): value: List[User] # コンストラクタ省略 users = Users([]) # この記載ができることがゴール [user for user in users] # ※ もちろん…

  • Gmailで1度検索したメールをURLで開きたい(メールのID知りたい)

    Gmailで1度開いたメールを後でURLで開けるようにする方法を自分用にメモします。特に件名を検索した後に、該当のメールをURLを開く方法を知りたかった記事です。 環境 Gmail 2023/11/18時点 IDの取得方法 URLのサブディレクトリの最後がメールのIDを示しています。 https://mail.google.com/mail/u/0/#search/github/FMfcgzGwHfpLhNbfcnNVXsHPlLbmWplg 今回の場合、最後のFMfcgzGwHfpLhNbfcnNVXsHPlLbmWplgが必要です。 開けるメールにする フラグメントをinboxかallにし…

  • Pythonのデフォルト引数では配列ではなくNoneを使わないとダメ(ミュータブルはNG)

    有名な話ですがハマったのでブログにします。 環境 Python 3.9 事象 Pythonでデフォルト引数に配列を定義すると、意図せずに同じインスタンスを使用してしまう。 def target_1(value, list=[]): list.append(value) return list def test_01(): a = target_1("1") # ["1"] assert len(a) == 1 b = target_1("2") # a, b 両方とも次の値になる # ["1", "2"] assert len(a) == 2 assert len(b) == 2 # インスタ…

  • JSONPathから対象のJSONの行にフォーカスをあてる(IntelliJ IDEAのプラグインのJSON Key Finderを使用)

    JSONからJSONPathを取得する方法を記事にしたことで、開発中のファイルに作成したJSONPathを定義できるようになりました。 今回の記事では、逆にJSONPathは分かっていI18nの定義ファイルのどこで定義してあるかを知れます。 環境 IntelliJ IDEA 2023.2 JSON Key Finder 対応 プラグインのJSON Key Finderを使用すると、JSONPathでの検索ができて、フォーカスをあてられます。 プラグインのインストール 次のプラグインをインストールします。 JSON Key Finder JSON Pathでの検索 プラグインをインストールした後…

  • OldstarのHDMI 変換アダプタで表示できない場合の対応(Win11の場合)

    この記事ではOldstarのHDMI変換アダプタをWin11でも表示させる方法をブログにします。同梱されているドライバはWin10までしか対応していません。 なおWin11で表示はできるものの、10月23日時点ではドライバの品質が悪く、使用に耐えられない描画遅延が発生しているので返品しました。 対象商品 https://www.amazon.co.jp/gp/product/B0CJ2KFHXC 対応 同梱されているドライバではなく、公式ページの最新ドライバを使用してください。まだ英語対応されていないのか、中国語のインストーラが起動します。 http://www.ultrasemi.com/u…

  • Javaでメルセンヌ数を求める

    Javaでメルセンヌ数(2の冪-1)を求める方法を記載します。 メルセンヌ数についてはWikipediaを参考にしてください。 前提 Java 21 対応 2の冪-1が整数となる値を求めるために次の式を使用します。 private static boolean isMersenne(int value) { return log2(value + 1) % 1 == 0; } public static double log2(int value) { return Math.log(value) / Math.log(2); } 解説 2の冪-1 = メルセンヌ数ですので、式変形して2の冪=…

  • Javaで二進対数(log2x)を求める

    Javaで用意されているMathクラスだと十進対数(logx)だけしかないので二進対数(log2x)で計算する方法をメモします。 前提 Java 21 対応 十進対数から二進対数を割るだけです。 public static double log2(int value) { return Math.log(value) / Math.log(2); } ソースコード https://github.com/hirotoKirimaru/cucumber-sample/blob/c32978ce459ead32f54683830851e3d110f68fe9/kirimaru-core/src/te…

  • 【Bash】別ファイルに定義した変数を使用する

    小ネタ。なお、特に説明はしていませんが、関数も変数と同じように使えます。 環境 Bash GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu) Ubuntu 20.04.2 LTS GitHub Codespaces 概要 変数を使用したいシェルからsourceコマンドで変数を定義したシェルを呼びます 対応 変数を使用したいシェル sourceコマンドで変数を定義しているファイルを呼びます。 ファイル名:main.sh #!/bin/bash # 変数を定義しているシェルを呼ぶ source ./property/it.sh ech…

  • Excelで保存時にA1セルに保存する(VBAマクロ使用)

    Excelは保存時に強調したいセルがある、等々の理由がない限りA1セルに合わせる、というマナーがあります。そのマナーの是非について問うつもりはありません。 今回の記事では、保存時に自動でA1セルに合わせるマクロを記載します。 前提 Excel Microsoft Office Home And Business 2019 対応 概要 全シートをA1セルに合わせるメソッドを定義 保存時に起動するイベントプロシージャを定義 全シートをA1セルに合わせるメソッドを定義 ThisWorkbook.Worksheetsを呼ぶとシートの数分だけループ処理が走ります。 あとは全シートをA1セルに合わせるため…

  • IntelliJ IDEAで目的のJSONパスを取得する

    JSONでI18n対応していると、目的の文言を出力する時にJSONパスが必要です。深い構造ほどパスの把握に時間がかかります。 VS Code, IntelliJ IDEAのIDEでJSONの目的のパスにフォーカスしていると、画面の上部や下部にJSONパスが表示されます。それを手打ちしてコピーしていたのですが、IntelliJ IDEAの機能でJSONパスを一発で取得できる方法がわかったので記事に残します。 前提 IntelliJ IDEA 2023.2.2 対応 目的のパスにフォーカスしている状態で、右クリックしてCopyをしたらJSONパスを取得できます。 # Copy Reference …

  • Pythonで配列から特定のキーだけで検索したい時は辞書型を経由すると速い

    当たり前の話ではありますが。 Userクラスの配列からuser_idをキーに検索したい、emailをキーに検索したい等々の特定のキーがある場合、辞書型を経由すると非常に早く値を取得できます。 前提 Python 3.9 対応 配列を辞書型に変換する 最初にUserクラスを定義します。 class User: def __init__(self, user_id): self.user_id = user_id user_id: str 作成したUserクラスを元にuser_idをkeyとして、valueがUserクラスの辞書型を作成します。 # ユーザ配列の作成 users = [User(u…

  • 001等の左0埋めのコード値を使うのはやめよう。それは8進数と判断される可能性がある

    小ネタ。 前提 なし 詳細 私が関わっているシステムでは、001, 002等で種類を表すコード値を使っていることがあります。基本的には文字列で処理するので問題はほとんど発生しないのですが、状況によっては8進数の文字列と解釈されることがあります。可能な限りE001, I001等のprefixを付与するか、0埋めのコード値を使うことを回避してください。 参考 各進数表現のフォーマットを記載します。 8進数は言語によってフォーマットが異なるので注意してください。 2進数 0bを先頭に付与する 0b01 8進数 0を先頭に付与する 07 C言語やC++言語、Java、JavaScript(ES5以前)…

  • Excelで縦回転するマウスホイールで横スクロールしたい

    小ネタ。 横スクロールできるホイール(チルトホイール)がマウスについていたら嬉しいのですが、無いマウスを使用することもあるので備忘録として。 前提 Excel Microsoft Office Home And Business 2019 Windows Mac 未確認 方法 Shift + Ctrl + 縦スクロールで横スクロールができる。 Macの場合はShift + 縦スクロールで横スクロールができるようですが、私の環境では動作確認していません。 終わりに Twitterで見かけたので、自分用のメモとして残します。 参考情報 後輩君「え、横にも動けるチルトホイールのマウス勧めたのに買わな…

  • EXCELで最新のデータ(一番下、一番右)だけを参照する(数式とINDIRECT)

    地味に毎回調べるのでメモ。 環境 Microsoft Office Home and Business 2019 Microsoft® Excel® 2019 MSO (16.0.14228.20216) 64 ビット ゴール 1月から12月のデータを入力する項目があります。現在入力している最新の月(一番下、一番右)のデータだけを参照します。 前提として、歯抜けデータは存在しない。 行対応 まず、データ数を取得します。セルに値が入力されている場合、入力されたセル数を返却するCOUNTA()を使用します。画像の状態だと8を返却します。 次に一番下のセル番地を取得します。画像で入力されている中で最…

  • ソフトウェア工数見積で意識すべきABPとHPとパーキンソンの法則(CCPMの文脈)

    よくABPとHPの正式名称を忘れるので自分用にまとめます。 前提 クリティカルチェーン・プロジェクトマネジメント 略称はCCPM ABPとは ABPとはAggressive But Possibleの略称です。日本語訳としては「積極的に行えば可能」「頑張れば可能」です。私の感覚では、バッファを積まずに7割くらいの確率で達成できる時間を指してます。 HPとは HPとはHighly Possibleの略称です。日本語訳としては「だいたい可能」です。私の感覚では、バッファを積んで9.5割くらいの確率で達成できる時間を指してます。 パーキンソンの法則とは パーキンソンの法則とは仕事の量は完成のために与…

  • ブログのURLをChatGPTに考えてもらっている【ChatGPT有効活用】

    小ネタ。 タイトルとおりの記事でそれ以上の感想はありません。 前提 ChatGPT 3.5 20230813時点 経緯 最初の頃は、はてなブログ標準機能のURLを使用していました。 ただそれだとGoogle Analyticsで人気のページを確認する際に、何の記事か分かりませんでした。次に日本語URLにしたのですが、URLエンコーディングの結果よくわからない文言になってしまいました。 最後に英語URLに変更しています。英語URLだとエンコーディングが入らない分、ちゃんと理解できる文章になります。ただ、英語が得意ではないため、ブログ書いた後にタイトルを決定するのに地味に時間がかかっていたのですが…

  • Javaのtransientで本来は関わりのないデータであることを強調する

    本来の使い方とは異なります。黙って使うと怒られるかもしれないので、導入の際は念のため確認してください。 Javaにはtransientという修飾子があります。これを使うことでコードで表現できることが増えます。 環境 Java 15 ユースケース コードの表現力を増やす 関係がないデータであることを表現する Transientとは Transientは、和名で一時的という意味を持ちます。 この意味から私は「処理のために一時的に持たせた値」であることを、表現しています。 本来のTransientの役割 transientがついているフィールドをシリアライズの対象から外します。 シリアライズとはデー…

  • SpringBootの@Valueではstatic変数には設定できない(設定ファイルの値をstatic変数に設定できるようにする)

    SpringBootの@Valueを使用すると、設定ファイルの値を取得して変数に設定できます。しかし、static変数に関しては直接的に@Valueで設定できません。 今回の記事では、設定ファイルの値をstatic変数にも設定できるようにします。 前提 org.springframework.boot 2.7.0 lombok 対応 static変数でなければ、@Valueは動きます。そのため、コンストラクタで@Valueし、コンストラクタでstatic変数に設定できます。 直接取得 @SpringJUnitConfig @TestPropertySource(properties = {"d…

  • SpringBootの@Valueではstatic変数には設定できない(設定ファイルの値をstatic変数に設定できるようにする)

    SpringBootの@Valueを使用すると、設定ファイルの値を取得して変数に設定できます。しかし、static変数に関しては直接的に@Valueで設定できません。 今回の記事では、設定ファイルの値をstatic変数にも設定できるようにします。 前提 org.springframework.boot 2.7.0 lombok 対応 static変数でなければ、@Valueは動きます。そのため、コンストラクタで@Valueし、コンストラクタでstatic変数に設定できます。 直接取得 @SpringJUnitConfig @TestPropertySource(properties = {"d…

  • Javaでpropertiesファイルを読み込む

    SpringBoot等のフレームワークの機能を使用すると、簡単に設定ファイルが読み込めるようになりました。 しかし、E2Eの試験をするだけのプロジェクト等では重くなりがちなフレームワークを導入したくありません。 今回の記事では、Javaのみでpropertiesファイルを読み込む方法を記載します。なお、調べれば簡単に出る内容ではありますので、新規性はありません。 環境 Java 15 Gradle ゴール Javaで設定ファイルのpropertiesを読み込む。ymlファイルは対象外。 方法 propertiesファイルを用意する resourcesディレクトリの配下にpropertiesファ…

  • SQLAlchemyでwhere条件を変数化し、動的に変数に条件を追加する(1でも、2でも使えるはず)

    ※ 一部再現しきれていないので、誤っている可能性があります。 前提 SQLAlchemy 2.0.11 ソースコードありません 1.4.32 対応 次のどちらかで対応できます。 配列にand_インスタンスを設定し、最後に*で展開する ※ 2.0.11, 1.4.32でも確認できています。 criteria = [] criteria.append(and_(User.name == 1)) criteria.append(and_(User.email == "1@example.com")) criteria.append(and_(User.age == 30)) (await db.ex…

  • Railsでfirstを指定しているのにたまに11件取得していた(原因不明)

    当記事は問題解決に向けた記事ではありません。調べても原因が分からなかったので、事象の報告記事となります。 環境 Ruby 2.7.2 Rails 6.0.0 発生事象 ActiveRecord::Baseを継承したクラスにて、特定の条件のレコードの1行目を取得したかったので、次のようにfirstメソッドを使用していました。 User::Address.where(postCode: "1112222").first module User class Address < ActiveRecord::Base end end ただし、なぜか実行するタイミングによっては、どちらかのSQLが発行され…

  • Javaの自作アノテーションのプロパティの値を取得する(ConstraintValidator)

    以前、Javaの自作アノテーションを作成する方法をブログにしました。しかし、自作アノテーションに定義した変数を取り出して、バリデーションを行う方法がちょっとだけ面倒だったので、ブログに残します。 環境 Java 17 前提 テストする方法は、こちらの記事を参考にしてください。 ユースケース 文字数バリデーションをかけたい 今回の例では、バイト数と文字数のチェックをかけるアノテーションを付与します。 // 30バイト、10文字まで許容 @AppStringValid(byteCount = 30, wordCount = 10) private String targetStr; 対応 アノテー…

  • Javaで特定の文字数まで0埋めや任意の文字で埋めたい(padLeft, padRightのような動き)

    小ネタ。 環境 Java 17 対応 java.lang.Stringを使用します。内部的にはjava.util.Formatterを使用しています。 intの場合は%0{特定の文字数}d。Stringの場合は%{特定の文字数}sで半角スペースで左埋めしたあと、replace(半角スペース, 任意の文字)で半角スペースを任意の文字に書き換えます。 // 次の書き方は全て、1を0左埋めして001に書き換わります // intを渡す場合 String.format("%03d", 1); // Java15以降でできる書き方 "%03d".formatted(1); // Stringを渡す場合(…

  • IntelliJ IDEAのデフォルトTerminalを変更する

    公式ヘルプ読めば一発のお話。 ターミナルに強いこだわりはないのですが、ターミナルだとlsを無意識に打ってしまう癖があるので、エラーが起きないようにIntelliJ IDEAのデフォルトターミナルをGit Bashに変更しました。 その手順を残します。 環境 IntelliJ IDEA 2021.2.3 Windows 設定方法 Ctrl + Alt + SでSettingsを開きます。 Tools > Terminalを開きます。 Application SettingsのShell pathを変更します。 なお、IntelliJ IDEAは頭がいいので、プルダウンを選択するだけで終わりました…

  • Lombokの自動生成コードのsetterにブレークポイントを張って容易にデバッグしたい

    小ネタ。特定項目が処理の開始時は1だったのに、処理の終了時には1000が代入されていたとします。規模が小さいうちはSetterやBuilder等々の呼び出し元にブレークポイントを張っていればいいのですが、規模が大きくなってくるとブレークポイントを張るだけでも一苦労です。 今回の記事では、Lombokの自動生成コードにブレークポイントを張って、容易にデバッグできるようにします。 環境 Java 17 Lombok 1.18.24 デコンパイルできる環境 IntelliJ IDEA 2022.2.3 FernFlower decompiler 対応 Lombokは生成先のメソッドが存在する場合には…

  • JJUG CCC 2023 Springに20分枠で登壇したレポート

    5-10分枠のLTで登壇することはそれなりに重ねてきましたが、カンファレンスに登壇したことがなかったので思い切って登壇してきました。その登壇した自分語りですので、他の方の発表については特にこの記事では言及しません。 JJUG CCCとは 日本Javaユーザーグループ(JJUG)は、Java技術の向上・発展、開発者の支援を目的とした任意団体です。その団体が年に2回、春と秋に行うカンファレンスです。 ここ最近はコロナ禍だったので、オンラインでのカンファレンスが多かったのですが、今回はハイブリッドでの開催でした。現地参加・ビデオ参加・リモート参加を選べて、私はリモート参加していました。 発表内容 J…

  • JavaScriptでundefinedのときにデフォルト値を設定する(Null合体演算子 ??)(JavaのOptional.orEleseみたいなの)

    地味に知らなかったので。 前提 JavaScript 対応 Null合体演算子??を使用する。 const item = { "A": "1" }; console.log(item.A.toString()); // "1" console.log(item.B?.toString()); // undefined console.log(item.A.toString() ?? "100"); // "1" console.log(item.B?.toString() ?? "200"); // "200" 三項演算子を使用せずとも容易に使用できる点がよい点です。 Javaの場合 Java…

  • IntelliJ IDEAで必要なファイルだけをrevertしたい(revert selected)

    コミット全体をRevertするのではなく、特定のファイルだけをRevertかけたい時の操作を記載します。 環境 IntelliJ IDEA 2022.3.3 対応 GitタブでRevertしたいコミットログを探し、対象のファイルを右クリックします。 選択した変更を元に戻すを選択すると、特定のファイルだけRevertします。 間違えやすい点 特定のファイルだけをRevertをかけたいユースケースは、ファイルの修正履歴を見てからその修正が適切であったかを判断し、結果として特定のファイルだけが誤っていたことが判明したのでRevertをすると思います。 ただ、ファイルの履歴から追えるのは特定のファイル…

  • Git Rebaseするときに自動でstashとstash popするオプションや設定(autostash)

    Git Rebaseをする際に、ローカルの修正が残っている場合はgit stash, git stash popをしないと実行できません。 毎回そのコマンドを入力するのは面倒ですが、オプションや設定でstashコマンドを実行せずに済むのでそれを記事にしました。 環境 git version 2.24.1.windows.2 対応 --autostashオプションを付与してください。または、常に実行したい場合はrebase.autostashをtrueに設定してください。 # 実行時にオプションを付与する git rebase main --autostash # 常にauto.stashをする…

  • 画面全体はportrait(縦)なのにiframeで最小化を実装したらlandscape(横)で判定された

    タイトルの出オチ記事。 前提 Chrome 2023/05/02時点 原因 portrait, landscapeは画面のwidthとheightの縦横比で決まる iframeの画面サイズは親画面サイズに依存しない 上記2つの原因により、iframeで作られた画面を最小化(ヘッダだけ見える状態にする)すると、縦横比が変わるためlandscapeとして判定されます。 対応 landscapeとして処理される前提で、目的の処理のみ動くように回避します。 次のCSS Media Queryは、スマートフォンでlandscapeにした時にはメッセージが表示されるが、PCやタブレットを含めたそのほかでは…

  • PythonでJSONを一部項目を無視して比較したい(I want to compare JSON in Python while ignoring certain items by deepdiff)

    PythonでJSONを比較したいという記事を過去に書きました。しかし、日付項目等々の固定しづらい項目を無視して比較するというユースケースが達成できていませんでした。 今回の記事では、一部項目を無視して比較する方法を記載します。 前提 Python 3.11 DeepDiff 6.3.0 対応 DeepDiffを使用します。 導入 DeepDiffをインストールしてください。 pip install deepdiff pipenv install deepdiff 比較 DeepDiffを使うには、DeepDiffのインスタンスを元に比較します。過去の記事と同様に、json.loadsメソッド…

  • GitHubのPRをブランチ名でフィルタしたい(filtering pr by branch name in github)

    基本的には公式ヘルプ読んでください。 環境 GitHub 2022/11/04時点 対応 base:ブランチ名で特定のブランチに対するPRをフィルタリングできます。fromではなく、toのブランチ名を指しています。ブランチを切るときのbaseとして考えると、意味合いは正しいのですが、混乱しました。 base:{ブランチ名} base:develop 逆にfromブランチでフィルタしたい場合は、head:ブランチ名を使用します。 head:{ブランチ名} head:feature なお、baseもheadも前方一致で検索できます。 ※ View advanced search syntaxから該…

  • Pythonでメソッド呼び出し元がNoneパラメータを渡さないようにする(doesn't call none parameter in Python)

    メソッド呼び出し元で引数が指定されていない場合は、デフォルト値を与えられます。キーワード引数を使用すると、任意のパラメータに値を与えられます。 ただし、意図的にメソッド呼び出し元でNoneを渡してしまった場合、デフォルト値を使用できません。 今回の記事では、パラメータの値がNoneの場合はメソッドに渡さず、値が含まれている場合はメソッドに渡します。 前提 Python 3.11 対応 辞書型をパラメータに使用します。辞書型で**を使用するとキーワード引数に展開されて使用できます。 class DictDomain: @staticmethod def action(a: str = "1", …

  • Pythonの辞書型の値がNoneならキーを削除する(value-is-none-so-remove-key-in-Python-dictionary)

    辞書型の値がNoneの場合に、キーを削除したいことがあったので残します。 前提 Python 3.11 対応 辞書型の値がNoneのとき、キーを削除するのは次のコードです。 {k: v for k, v in dict.items() if v is not None} dict = {"a": "1", "b": "2", "c": None} all_key_has_value_dict = {k: v for k, v in dict.items() if v is not None} # {"a": "1", "b": "2"} ソースコード https://github.com/hi…

  • AWS 認定ソリューションアーキテクト(AWS SAA-C03)の合格記

    掲題のとおり、AWS認定ソリューションアーキテクト(SAA-C03)を受験し、合格したので合格記を記します。 前提 AWSは本業でほぼ使ったことがない 副業で使ってはいるが、基本的にAWSにログインして操作することはない 合格日 2023年03月30日(木) 合格した時の点数 786点。 合計1000点、合格ラインは720点です。3-4問ほど余力を持って合格できたようです。 どんな試験か 公式引用。 AWS 認定ソリューションアーキテクト – アソシエイトは、幅広い AWS のサービスにわたる AWS テクノロジーに関する知識とスキルを示します。この認定の焦点は、コストとパフォーマンスが最適化…

  • Dockerfileを静的解析できるhadolintを使う(Haskell Docker Linter)

    Dockerfileを静的解析できるhadolint(Haskell Docker Linter)を使ってみました。詳細は公式やほかの方のブログを見てください。 環境 20230312時点 対応 Dockerfileが存在するディレクトリで、次のコマンドを実行するとDockerfileに対してlintをかけられます。 docker run --rm -i hadolint/hadolint < Dockerfile GitHub Actionsもあるため、次の使い方でlintをかけられます。 - uses: hadolint/hadolint-action@v3.1.0 with: docke…

  • Pythonで関数とNoneの型ヒントをつけたい(Resolve TypeError: unsupported operand type(s) for : 'function' and 'NoneType')

    Pythonで関数とNoneが取りうるパラメータに対して、Union型で型ヒントを与えようとしたところエラーになったので解決方法をメモします。 環境 Python 3.9 対応 Union型を使わずに、Optional型でヒントを与えます。今回ハマっていたのは、sqlalchemyでand_条件をパラメータとして渡したかったので、そのユースケースを記載します。 def test( OK: Optional[and_], NG: and_ None ): pass NG側の型ヒントだと、次のようなエラーが発生してしまいます。 E TypeError: unsupported operand …

  • Git LFSでプロキシを経由させる・させない(HTTPS_PROXY, NO_PROXY)

    Git Large File System(Git LFS)のツールを使っていて、プロキシを経由させたり、経由させないようにする方法が見つからなかったのでメモします。 環境 Mac zsh 対応 次の設定値を使用します。大文字と小文字で設定値の優先度が異なります。 # 上に記載しているほど優先度が高いです # プロキシサーバの設定 HTTPS_PROXY https_proxy HTTP_PROXY http_proxy # プロキシを経由させない設定 NO_PROXY no_proxy その設定や優先度はどこから読み取れるか、というのは次のソースコードに載っています。 https://git…

  • SpringのValueに初期値を与える(エラーを起こさずにnullも初期値にする)

    小ネタ。@Valueで初期値を与えたい時の記法をメモします。マッピングするプロパティがない場合、BeanCreationExceptionが発生してしまうので、それが発生しないようにします。 環境 Java 17 SpringBootTest 2.7.4 ゴール SpringのValueで初期値を渡す マッピング先がない場合にExceptionではなくnullを設定する # 次のExceptionが発生しないようにする org.springframework.beans.factory.BeanCreationException: Error creating bean with name '…

  • SpringでRedisを使う(データベース、キャッシュとしての使い方)

    本業はJavaのバックエンドエンジニアなのですが、Redisを使ったことがないので、素振りします。 今回の記事では、データベース、キャッシュとしての機能を検証することをゴールとします。メッセージブローカー、キューとしての挙動は記載いたしません。 環境 Java 17 Redis 7.0.5 org.springframework.boot 2.6.4 org.testcontainers:junit-jupiter 1.17.4 Gradle Lombok Docker 対応 Gradleを記載する Redisを使えるように、依存関係に含めます。テストについても記載するのでTestContai…

  • SpringのDisabledIfを素振りする

    条件によってはテストを実行しないアノテーション、JUnit5のDisabledIfだけでなく、SpringのDisabledIfもあります。 基本的にはJUnit5のDisabledIfシリーズで十分なことが多いのですが、Spring側で用意されているものも素振りします。 環境 Java 17 SpringBootTest 2.7.4 前提 設定ファイルの準備 SpringのDisabledIfを使用する最大のメリットは、設定ファイルによって挙動を変更できるところです。そのため、application.ymlを定義します。 app: config: appName: "Kirimaru" lo…

  • vmwpを終了したい(kill vmwp)

    ピアソンVUEの自宅受験(OnVUE (オンビュー) - オンライン監督)をしたかったのですが、vmwpのプロセスの殺し方が分からなかったので残します。 環境 Windows 対応 vmwpはWSLで使用されているようです。そのため、WSLを停止したらvmwpは殺しきれるはずです。 wsl --shutdown もし、vmwpのプロセスが残っている場合は、Dockerで使用している可能性があるので、Dockerも停止してください。 終わりに OnVUEでの禁止アプリケーションとしてはExcel, Slack等々の名前が理解できるプロセス名だったのですが、vmwpだけはピンと来なくて困りました。…

  • Flywayで特定のDBだけSQLを実行する(Spring, vender, Postgres)

    小ネタ。なお、私のユースケースを満たせていなかったので、調査結果だけです。 環境 Java 17 org.flywaydb 8.5.13 org.springframework.boot 2.7.7 対応 設定ファイルの変更 PostgresやOracle等々で実行するSQLを変更するために、spring.flyway.locationsにclasspath:db/migration/{vendor}を設定します。 spring.flyway.locations: classpath:db/migration/{vendor} ディレクトリを作成する ディレクトリを用意します。{vender}…

  • Gitのコミット時間を変更する(git commit --amend --date="`date -R`")(git squash と組み合わせる)

    小ネタ。 環境 Git git version 2.24.1.windows.2 対応 次のコマンドを実行すると、最新のコミット更新時間が現在時刻になります。また、特定の時間に更新したい場合は、Git internal format、RFC2822、ISO 8601形式のどれかで渡してください。 # 現在時刻で更新 git commit --amend --date="`date -R`" # 特定の日時で更新 git commit --amend --date="Wed Feb 18 22:34:51 2022 +0900" 終わりに 私は、作業中は別ブランチにして、ちょっとでも変更したら別…

  • Javaで1行でNull許容の配列を作りたかった

    結局、願ったとおりに動かなかったので、思考錯誤したときのメモだけ残します。 環境 Java 17 対応 Collections.singletonList(T o)を使用することで、1行でnull許容した配列を作成できます。 動作確認 1行で配列を作成する方法は、List.of(), Arrays.asListのどちらもありますが、NotNull制約があるので、作成できません。 ArrayListはnullも追加可能ですが、初期配列の作成時には使えません。そもそも、初期配列の作成時のパラメータ自体が配列となるため、内部処理にてエラーが発生します。 var sample = new ArrayL…

  • IntelliJ IDEA ULTIMATEでOpen APIのコードを生成する

    小ネタ。以前、OpenAPI Generatorをカスタマイズしたコードを生成する(Swagger Codegenとほぼ同じ)という記事を書きました。 上記の記事では、openapi-generatorのjarをCLIで実行してソースコードを生成しています。その検証中に、IntelliJ IDEA ULTIMATEの機能を使えば、簡単にソースコード生成ができることが分かったので、ブログにします。 環境 IntelliJ IDEA 2022.2.3 対応 下準備 OpenAPIで用意しているサンプルファイルをダウンロードします。 https://raw.githubusercontent.com…

  • 何をもってN月第1週とする?

    普段N月M週という表現で何となく通じていますが、具体的な定義があるかをしらべました。 結論を先に述べると、明確な定義をしている表現はありませんでした。ですが、週について色々と調べたのでまとめておきます。 木曜日を起点として1年を週に分割する(ISO 8601/JIS X0301の定義) 正規表現で「YYYY-Www-D」と表記する方法があります。こちらの定義では、「最初の木曜日を含む週が、その年の第1週である」としています。 この定義に合わせて、最初の木曜日を含む週がその月の第1週と表現しても問題ないでしょう。ただし、あくまで1年間を週として分割する際の定義ですので、月に関してまでは厳密に定義…

  • Pytestにてネストしたテストケースを作成する

    JUnit 5だと@Nestedアノテーションを付与すると、テストクラス内にさらにテストクラスを用意できます。 Pytestでも同様にテストクラスをネストさせたかったのですが、ググってもすぐには出てこなかったので、自分のブログにまとめます。 環境 Pytest 7.1.1 分かること Pytestでネストしたテストクラスを書ける @pytest.fixtureを使用してもネストしたテストクラスを書ける ユースケース テストクラスを特定の粒度ごとに作成する。 最低でも、テストクラス -> テストメソッドの1段落ネストしておくのはオススメです。 - テストクラス1 - テストメソッド1 - テスト…

  • 開始日と解約"月"を元に暦上で日割のない解約"日"を求める(Java)

    小ネタ。「今年の12月に解約したい。日割りが必要ない日付を教えてほしい」といった、解約する「年月」までは把握しているが、解約する「年月日」までは分からないといったケースに対応するロジックをJavaで求めます。 環境 Java 17 対応 暦上の1ヵ月の定義については、こちらの記事を見てください。 雑に表現すると次のどちらかです。 開始日の"日" -1日 月末 月末はYearMonth型を使用すると非常に楽ですので、まずは「解約月」をYearMonth型に変換します。 YearMonth#isValidDayにて、指定日付が存在するかをチェックできます。YearMonth#atDayにて、指定の…

  • Pythonで初期配列をset型で作りたければbrace {} リスト型はbracket []

    小ネタ。いつもset([data for data in datum])のように、List型を経由してたので、備忘録。なお、タイトルの出オチ記事です。 環境 Python 3.8 対応 ブレース(brace, {})でくくると、set型になります。 ブラケット(bracket, [])でくくると、list型になります。 set_datum: set = {"A", "A", "B", "C"} list_datum: list = ["A", "A", "B", "C"] # わざわざ、listを経由する必要はない set_constructor_datum: set = set(list_d…

  • WindowsのVS CodeのデフォルトターミナルをGit Bashに変更する

    WindowsのVS Codeのデフォルトターミナルを変更したかったので、Git Bashに変更する方法を残します。 環境 VS Code 1.64.2 Windows 11 Git Bash 4.4.23 方法 VS Codeのsettings.jsonを開く。 $HOME/AppData/Roaming/Code/User/settings.json settings.jsonに次の設定を追加する。 { "terminal.integrated.defaultProfile.windows": "Git Bash" } もし、起動時のターミナルにパラメータを渡したい等があれば、カスタマイズ…

  • よく使うInterfaceの活用方法[Java]

    Java Advent Calendar 2022の8日目の記事です。指摘コメントよろしくお願いします。 Javaに限らず、interfaceは使い道を理解することは難しいです。この記事では、私が普段使用しているinterfaceの使い方実例を記すことで、情報共有を行うことを目的としています。なお、ソースコードはイメージですので動かない可能性があることは御了承ください。 環境と背景 Java 17 境界としての使い方 interface(境界面)という言葉の意味どおりの使い方です。 MVCフレームワークだと伝わりやすい境界面がないので、アーキテクチャとしてはポートアンドアダプターを理解している…

  • nohupと&を使用して、性能試験をバックグラウンドで実行する

    性能試験でJMeterを使用しているのですが、24時間負荷をかけ続ける長期安定の性能試験を使用するときに失敗したのでメモとして残します。 環境 CentOS 対応 nohupと負荷をかけたいコマンドを記載する。 nohup コマンド & # nohup jmeter xxxx & 失敗した理由 &だけを使用していたため。 &だけでもnohupと同じようにバックグラウンドでコマンドが実行されます。ただし、&だけの場合はSIGHUPシグナルを受け取ったタイミングで処理を終了してしまいます。 sshの接続終了するとSIGHUPシグナルを送ってしまうため、30-60分の負荷試験なら問題ありませんが、2…

  • JavaのMockitoで部分モックをしたい・本物のメソッドを呼びたい(PartialMock, Answer)

    JavaのMockitoを使って、対象クラスをモックにすることがあります。ただし、該当クラスのメソッドすべてではなく一部だけモックにして、他は本物のメソッドを呼びたいことがあります。 今回は、モッククラスから本当のメソッドを呼ぶ方法、デフォルト設定で本当のメソッドを呼ぶモックにする方法を記載します。 なお、このように部分的にモックすることを部分モック、Partial Mockと呼びますので、以後はそのように記載します。 環境 Java 17 org.mockito:mockito-core 4.5.1 ユースケース クラス全体ではなく、一部だけ本物のメソッドを呼びたい 私は、日付Utilクラス…

  • MyBatisでEagerLoad, LazyLoadをする(Annotationにて)

    MyBatisのアノテーションで親クラスのデータ取得時に、子や孫クラスを一緒に取得する方法(EAGER LOAD)、必要になってから取得する方法(LAZY LOAD)を記載します。 なお、常に子クラスと一緒に扱うときはEAGER LOAD, 必要に応じて子クラスを使用する場合はLAZY LOADをよく使用します。 環境 Java 17 org.springframework.boot:spring-boot-starter-jdbc 2.6.4 org.mybatis.spring.boot:mybatis-spring-boot-starter 2.2.0 前提 論理的には3階層、物理的には…

  • LazyLoadのエンティティを取得しようとしてClass Not Foundが発生した(原因不明・Spring・MyBatis)

    自宅で再現できなかったので原因はわかっていません。しかし、対策はうまくいったので残します。 MyBatisにてLazyLoadで取得したエンティティの子データをJavaでgetter経由で取得しようとしました。その時にClass Not Foundが発生しました。詳細なメッセージを読んでいくと、「User_$$_sas3qsdクラスから、Userクラスにキャストできません。User_$$_sas3qsdクラスをうまく読み込めなかったので、リロードしてください。」といった意図のメッセージが出ていました。ただし、メッセージの通りに再起動しても、うまくいきません。 この記事は、このメッセージを元に、…

  • SQLで複合したキーの検索条件でIN句検索する(複合、複数の組み合わせで条件検索)

    1組の乱太郎、2組のきり丸、3組のしんべヱの情報が欲しい、といった組と名前の両方をキーにした検索をしたい時があります。 この記事では、単純にANDで結合できず、複数の条件を組み合わせた複合でのキーを検索条件として実行する方法を記載します。 環境 MySQL PostgreSQL 全DBでは確認していないので、ローカルDBでの動作確認をお願いします。 対応 次のどちらかで対応できます。 -- シンプル (?, ?) IN ((?, ?), (?, ?)) -- AND と ORを組み合わせる ((? AND ?) OR (? AND ?)) 具体的には次のSQLとなります。 WHERE (組, …

  • Javaでデバッグ用にnullは出力しないToStringのようなメッセージを出力したい(JSON, Object Mapper, JsonInclude.Include.NON_NULL)

    タイトルではToStringを加工するような書き方をしていますが、処理イメージを伝えるものですのでToStringは使用しません。 デバッグのためにLombokで大量のフィールドをもつクラスをToStringで出力すると、当然大きな文字列となります。基本的には全フィールドを出力する方がよいのですが、場合によっては不要なフィールドを除いたメッセージの方が読みやすいです。 今回の記事では、値がnullの項目を除去したデバッグメッセージを出力する方法を記載します。なお、最終的には比較が目的のため、今回はJSON形式での出力をゴールとします。 環境 Java 17 com.fasterxml.jack…

  • ビジネス統計スペシャリスト エクセル分析ベーシックの合格記

    掲題のとおり、ビジネス統計スペシャリスト エクセル分析ベーシックを受験し、合格したので合格記を記します。 前提 Excelは最低限のSUMやVLOOKUPしか知らない 普段業務では使用していない 合格日 2022年10月12日(水) 合格した時の点数 925点。 合計1000点、合格ラインは700点です。 どんな試験か 公式引用。 エクセル分析ベーシックは、データの平均値や標準偏差などの基本的な情報を把握したり、Excelのグラフ機能や関数を使用してデータの傾向や相関などを発見・分析する基礎的な分析スキルを証明する資格です。 分野 試験における比重 ビジネスデータ把握力 不明 ビジネス課題発見…

  • Pythonで可変長引数のメソッドに配列を渡したい(位置引数、positional argument)

    Pythonで可変長引数のメソッドしか用意されていないものの、処理上は配列にしてパラメータを渡すしかないことがあります。 今回の記事では、配列を可変長引数に渡せるようにする方法を残します。 環境 Python 3.9 方法 配列の変数に対して*を付与すると、可変長引数のメソッドにパラメータを渡せます。なお、これを位置引数(positional argument)と呼びます。 print([x for x in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(*[x for x in range(10)]) # 0 1 2 3 4 5 6 7…

  • Docker + Poetryでライブラリを追加する(cannot operation `poetry add library`)

    Docker環境のPoetryで構築しているアプリケーションがありましたが、poetry add libraryではライブラリの追加ができませんでした。 今回の記事では、Docker環境のPoetryで構築しているアプリケーションに対してライブラリを追加して、poetry add libraryと同等の挙動させます。 環境 GitHub Codespaces 2022/10/10時点 Docker 20.10.18+azure-1 前提 Docker Composeファイルにて、サービス名をapiとしています。 動かなかった処理 本来Poetryであれば、こちらで済むのですが、うまくいきません…

  • 途中に余計なBOMが付与されたファイルが作成された(FastAPI, StreamingResponse, Generator)

    PythonのFastAPIのStreamingResponseでGeneratorを使用しながら、UTF-8 BOMのファイルをダウンロードさせるAPIを作成しました。ただ、作成したファイルを確認したところ、ファイルの途中で余計なBOM(\ufeff)が付与されてしまっていました。 今回の記事では、ファイルの途中でBOMが挟まれてしまった原因を残します。 環境 FastAPI 0.75.2 (Pandas) 1.5.0 理由 Generatorで処理するたびに、BOMを付与していたため。 言葉で見れば当たり前の話ですので、ソースコードで見れば納得していただけると思います。 詳細 ファイルを作…

  • build.gradleファイルを分割する(別gradleファイルを読み込む)

    JavaでGradleで開発していると、build.gradleに静的解析タスクであったり、コード自動生成タスクであったり、間接的なタスクが増えることがあります。 今回は不要なタスクを別ファイルのgradleファイルに分割する方法を記事にします。 環境 Java 17 Gradle 7.5.1 対応 別のgradleファイルを作成します。今回は静的解析タスクを切り出すので、analysis.gradleファイルを作成します。 その後、適切にタスクを分割して、build.gradleに次の記載をすれば終わりです。 apply from: 'analysis.gradle' ソースコード http…

  • OpenAPI Generatorをカスタマイズしたコードを生成する(Swagger Codegenとほぼ同じ)

    OpenAPI Generatorの使用方法については、基本的にSwagger Codegenと同じようにカスタマイズできます。 今回の記事では、OpenAPI Generatorの生成コードをカスタマイズします。 環境 OpenAPI-Generator-CLI 6.2.0 ゴール 任意のカスタマイズしたコードを生成することがゴールです。今回の場合は、生成されるモデルにlombokの@Builderを付与します。 YAMLは公式が提供しているサンプルを使用します。 修正前コード import javax.annotation.Generated; /** * A pet for sale i…

  • Javaで現在行を取得する

    Javaで現在行を取得する方法を記載します。 環境 Java 17 対応 現在スレッドのlineNumberを取得すれば、現在行が取得できます。 return Thread.currentThread().getStackTrace()[2].getLineNumber(); 0番目 Threadクラス 1番目 この処理している行 2番目 呼び出し元の行 他にも、クラス名getClassName()、メソッド名getMethodNameも取得できるので、デバッグ文言を加工したいときは利用できます。 テストクラス 実装クラスは、interfaceのdefaultメソッド、staticメソッドの両…

  • JMeterでproxyを経由したくない(no proxy, non_proxy)

    JMeterでproxy設定をする記事は見つかりましたが、proxyを経由しない設定が公式マニュアルを見ないと見つからなかったので、記事にします。 環境 JMeter 5.5 対応 CLIでの設定 起動時のオプションで-Nを付与すると、proxyを経由しなくなります。 jmeter -N *.apache.org localhost # 負荷をかけたいIPやドメインを設定します。 # 複数の場合は で区切ります。 propertiesでの設定 私は試していませんが、ヘルプによるとpropertiesでも設定できるようです。負荷先のIPやドメインをpropertiesで設定していることが多い…

  • SpringのInterceptorでGETメソッド以外を拒否するようにコードで表現する

    ※ 特に見どころはありません。 業務都合にて、「アプリケーションをメンテナンスモードに切り替えても、参照系APIだけは参照できるようにしたい。更新系APIは拒否したい。」との要望が出てきました。 そもそも、「そんなこと可能?」ということを素振りしただけの記事です。 環境 Java 17 SpringBoot 2.6.4 前提 既にInterceptorは実装されている前提で進めます。Interceptorの実装、テストに関しては当記事を参照してください。 実装 AsyncHandlerInterceptor#preHandleメソッドの第1引数のHttpServletRequestにリクエスト…

  • リンク先の目的の段落を開いたり、強調した状態のURLのパーツ(URIフラグメント)

    URLに記述していてもサーバにデータは送らない箇所があり、それをURIフラグメントと呼びます。具体的には次のURLのうち、#以降の#:~:text=nainaistarを指します。 https://nainaistar.hatenablog.com/#:~:text=nainaistar URIフラグメントは、リンク先のWebページの特定情報の場所を指定するために用いられます。さきほどのURLをChrome80以降のバージョンで開くと、「nainaistar」という文字列がハイライトされている状態で開くことが分かります。 今回の記事では、自分なりにURIフラグメントについて調べたことを残します…

  • 文字列結合でも日付を数字ではなく目的のフォーマットで表示する(MM/DD)(Excelとスプレッドシート両方とも可)

    Excelとスプレッドシートの両方でも活用できる方法です。 「04/18」と表示したい場合、セルの書式設定を変更して目的のフォーマットで表示するのが一般的だと思います。 しかし、「【日報】きり丸 04/18」のような固定文言 + 今日の日付をCONCAT関数を使用して作成したい時、「【日報】きり丸 44669」と数字で表示されてしまいます。セルで「04/18」と表示されているものを参照しても、同様の結果となってしまいます。 今回はそれを回避して、「【日報】きり丸 04/18」を表示できる方法を記載します。 環境 Excel Microsoft® Excel® 2019 MSO (バージョン 2…

  • Node.jsで記述されたPlayWrightの実行環境をDockerで用意する

    職場でE2EツールとしてPlayWrightを使用しており、ソースコードをPythonで書いています。そのときのPlayWrightの環境構築手順はこちら。 ただ、PlayWright単体はどの言語で書かれても問題ないものの、どうしてもテストライブラリ等のエコシステムは言語により得意不得意があります。フロントエンドはNode.jsで書かれることが多いのか、PlayWrightの公式に記載されているテストの書き方はNode.jsが一番充足しています。 作りこめばどの言語でも同じことはできるとは分かっているものの、環境構築に勉強のコストを掛けたくないので、Node.jsで学ぶことにしました。 今回…

  • Javaで期間と期間を比較して重複チェックする

    よくある内容の記事ですので、特別な内容はありません。私が迷わないようにするための記事です。 日付と日付を比較することは簡単ですが、日付の開始日と終了日をまとめた期間と期間を比較して、重複があることをチェックするのはたいへんです。なお、次の式を満たせれば重複していることのチェックができます。誤りやすいので、テストはコピー&ペーストでもいいので書きましょう。 基準.開始日 <= 対象.終了日 && 対象.開始日 <= 基準.終了日 # 対象日を含むかどうかは、仕様に寄ります 環境 Java 17 対象 期間クラスを作成し、重複確認メソッドを作成する。 ※recordを使用しているので、読み方に慣れ…

  • Recursionの有料会員を使用した感想

    Recursionというアメリカ発のオンラインでプログラミング、コンピュータサイエンスを学べるサービスがあります。今回の記事では、Recursionを有料会員を使用した感想を記載します。 結論だけ記載すると、非常に良質な学習ができてよいサービスだと感じました。 Recursionとは Recursionの会社概要ページより引用させていただきます。 Recursionは「世界で通用するエンジニア」を理念とした、コンピュータサイエンスをアウトプットによって学習できるプラットフォームです。Recursionでは新しいプログラミング学習法に価値があると信じており、アウトプット型のカリキュラム開発に力を…

  • 【障害メモ】PythonのSQLAlchemyを使用したテストコードで参照系処理を2回実行したら2回目で不具合発生

    掲題の事象が発生しました。結論を出すと、ただの私の認識誤りです。ただ、よくある内容ですので、二度目が発生しないようにメモします。 Pythonと記載していますが、同様の条件が揃えば他のライブラリでも発生しうる内容です。JavaのMyBatisでも似た事象は発生しました。 環境 FastAPI 0.79 SQLAlchemy 1.4.36 Python 3.10 事象 参照系処理を2回実行したら2回目で意図しないインスタンスに変更されている。条件は次の通り。 テストコードで発生 プロダクトコードでは実行ごとに別セッションで実行するので問題なし DBアクセスのためのセッションをパラメータで渡す ト…

  • JavaScript(TypeScript)のMapでgerOrElseと同等の動きを簡潔に書く

    JavaだとMapのvalueを取得する際に、取得できなかった場合のデフォルト値を返すgetOrElseメソッドが用意されていますが、JavaScriptにはありません。今回の記事では、その同等の挙動を簡潔に書けるようにします。 環境 TypeScript 4.7.4 CodeSandboxで検証 対応 Null合体演算子(??)を組み合わせれば、getOrElseと同等の挙動させられます。 // Mapの定義 const actionMap: Map<String, number> = new Map<String, number>([ ["a", 1], ["b", 2], ["c", 3…

  • Javaでストラテジーパターンを素振りする

    ストラテジーパターンというGoFのデザインパターンが良いコード悪いコードでも紹介されていたので、素振りします。 自分の言葉で上手な言語化ができていないので、メリットは参考情報や良いコード悪いコードの購入、または別の方の記事を参考にしてください。 環境 Java 17 今回の処理 複数の言語の文章を、ひとつの言語に変換する。 ※ 変換の具体的なロジックは実装しない。 対応 文章と言語名が記載されたDTOを生成する。 @Data public class Question { private String sentence; private Locale locale; } ストラテジーパターンを…

  • JavaのStaticメソッドをMockitoでモックする(ネストしたメソッドも値を返すようにする)

    Javaのオープンチャットに「staticメソッドをMockitoでモックして値を返したい。NestするとNullが返るので、それを回避したい」という要望があったので、素振りしました。 環境 SpringBootStarterTestを基本としています。 Java 17 org.springframework.boot:spring-boot-starter-test 2.6.4 (org.mockito:mockit-core) 4.6.0 org.mockito:mockito-inline 4.6.1 下準備 Mockitoでstaticメソッドをモックにするには、mockito-inl…

  • 【小ネタ】Claspで連携したGoogle スプレッドシートを開く

    環境 GitHub Codespaces @google/clasp 2.4.1 前提 .clasp.jsonファイルのparendIdにスプレッドシートのIDが記載されていること。(create claspで作成された.clasp.jsonであること) { "scriptId": "GASエディタのID", "rootDir": "./src", "parentId": [ "スプレッドシートのID" ] } 対応 次のコマンドを実行してください。--addonオプションを指定すると、parentIdの一番初めにヒットするIDを返却します。 clasp open --addon # 返却値 …

  • Javaのラムダ式(Stream API)で複数キーでCollectors.groupingByする

    JavaのStream APIにて、複数キーでCollectors.groupingByする方法を記載します。 環境 Java 17 対応 前提として、次のrecordの項目を元に、Collectors.groupingByをします。 public record Book(String id, String language, int year, String salesTerritory, Author author) {} public record Author(String name) {} 正道な方法 COllectors.groupingByの第二引数にCollectors.gro…

  • Javaのラムダ式(Stream API)でNullableな項目にCollectors.groupingByする

    Javaのラムダ式(Stream API)にて、Collectors.groupingByというグルーピングしてくれるメソッドがあります。ただし、このメソッドの引数はNonNullである必要があり、万が一Nullが混ざってしまうとNullPointerException: element cannot be mapped to a null keyが発生してしまいます。 今回の記事では、Nullableな項目に対して、JavaのStream APIのCollectors.groupingByを実行する方法を記載します。 環境 Java 17 対応 Optional.ofNullableメソッド…

arrow_drop_down

ブログリーダー」を活用して、きり丸さんをフォローしませんか?

ハンドル名
きり丸さん
ブログタイトル
きり丸の技術日記
フォロー
きり丸の技術日記

にほんブログ村 カテゴリー一覧

商用