

[研修アイデア]リーダブルコード
書籍「リーダブルコード」を読んだうえで、リファクタリングを体験します。テーマあなたはプログラミングを勉強中の新入社員です。先輩からプログラミング練習のためにじゃんけんゲームの作成課題が出されました。課題は、次のようなものでした。雛形として提供されたJankenクラスをもとにじゃんけんを実装しますプレイヤーが勝つか負けるまでゲームは続きますプロンプト例を再現しますプロンプト例1=Rock,2=Paper,3=Scissors...[1/2/3]:2ChosebyYou:2=PaperChosebyCOM:2=Paper1=Rock,2=Paper,3=Scissors...[1/2/3]:1ChosebyYou:1=RockChosebyCOM:1=Rock1=Rock,2=Paper,3=Scissors...[1/2/3]:1ChosebyYou:1=RockChosebyCOM:3=S2026.01.18
[研修アイデア]APIプログラミング
ドメイン駆動設計を意識して、APIプログラミングを体験します。開発テーマあなたは日々の業務を記録するために、日報を作成しています。日報の一部を以下に例示します。日付:2026/1/11報告者:石川啄木はたらけどはたらけど猶なほわが生活楽にならざりぢっと手を見る日付:2026年1月12日報告者:石川啄木実務には役に立たざるうた人と我を見る人に金借りにけり一度でも我に頭を下げさせし人みな死ねといのりてしこと1月13日啄木わが抱く思想はすべて金なきに(あとで書く)あなたは後から日付を指定して、過去の日報を振り返りたいと考えています。しかし、日報をテキストファイルで管理しているため、この作業が煩わしいと感じています。そこで、この日報の管理をシステム化したいと考えました。システム化要件システム化するにあたり、以下のような機能を備えたいと考えています。日報を書けること日報を下書きできること下書きを編集2026.01.11
ドメイン駆動設計におけるアーキテクチャの比較(レイヤードアーキテクチャ vs クリーンアーキテクチャ)
近年ドメイン駆動設計が、驚くほど流行しています。ドメイン駆動設計の登場当時、原典たるエヴァンス本ではレイヤードアーキテクチャを中心に解説されていましたが、現在では、クリーンアーキテクチャが人気を集めているようです。(筆者はレイヤードアーキテクチャを好んでいます。)レイヤードアーキテクチャの登場から、クリーンアーキテクチャの登場に至るまで、ヘキサゴナルアーキテクチャ、オニオンアーキテクチャなど、様々なアーキテクチャが誕生しましたが、いずれも、ドメイン中心の設計を支援するという目的は共通しています。それではなぜ、クリーンアーキテクチャが生まれなければならなかったのか?本稿では、その理由を考えてみます。レイヤードアーキテクチャとクリーンアーキテクチャの実装における違い各コンポーネントを、層状に配置するか、同心円状に配置するか。これはそれぞれのアーキテクチャの違いを考えるうえで、本質的な違いではあ2025.08.14
なぜ自前のブログを持つのか
ひとに説明するためのポスト。なぜ自前のブログを持つのか、理由は明快である。勉強になるから、ただそれだけである。勉強とは、単にアウトプットするだけのことを指してはいない。当然アウトプットそのものの学習効果の高さというのも理由の一つではある。インプットよりもアウトプットのほうが学習効果が高いことを疑う人はいないだろう。アウトプットの過程で、文章の体裁を整えるために何度も反芻し、書いたことの正しさを裏付けるためにソースを確認する。そういった行為が必然的に学習効果を高めてくれる。こんな雑記ですら何度も反芻している。文章をアウトプットしたいだけであれば、NotionやZenn、Note、Qiitaといったサービスを利用することもできる。これを否定するわけではない。これらにも大きな学習効果は存在する。しかし、そうはしない。これが本題である。なぜか。学習機会を損ねてしまうためだ。このブログの場合、一般的2023.11.28
Next.jsのnextraテーマを試す
nextraは、標準でサイト内検索などを備えているNext.jsのテーマ。ここではドキュメント向けのテーマを使用した手順を残しておく。公式でデモページを用意してくれているので、使い勝手はこちらを確認すると良い。https://nextra-docs-template.vercel.app/公式の手順を追っているだけなので詳細は公式を確認。https://nextra.site/docs/docs-theme/start環境Node.jsv18.17.1npm9.6.7プロジェクトの作成mkdir-pnextracdnextranpminextreactreact-domnextranextra-theme-docspackage.jsonに起動スクリプトを追加NEW_JSON=$(node-e'json=require(`./package.json`);json[`scripts`]={2023.11.26
KeycloakでのSSOと認可コードフローの流れを確認する
KeycloakでSSOする際に発生する認可コードフローと、取り交わされるAccessToken,RefreshToken,IDTokenが、どう返され、使われるのかを図に起こしたので貼っておく。環境Keycloak9.0.3フロー参考http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#Overviewhttp://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#IDToken2022.11.29
Gitで不都合なファイルをコミットから削除する
Gitのホスティングサービス移行をしていたところ、100MB超のファイルが過去コミットに含まれていたせいで、GitHubへのプッシュ時にエラーが出てしまった場合の対応についてのメモ。環境Bitbucket(移行元)GitHub(移行先)Git2.33.0git--versiongitversion2.33.0発生した問題ホスティングサービスを移行しようと思い、GitHubのリポジトリインポートからインポートを試みるもエラーが発生。WebUI上で作業していても原因がわからないので、コマンドライン上で同様の操作をしてみると、以下のようなエラーが吐かれました。remote:error:Trace:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdefremote:error:Seehttp://git.io/iEPt8gf2022.05.11
Java11環境でSOAPサービスを呼び出そうとしたら大変だった
Java11上で動かしているJBoss(RedHatSSO)環境で、SOAPサービスを呼び出そうとしたら、とても大変だったのでそのまとめです。環境AdoptOpenJDKHotspot11.0.11+9RedHatSSO7.4(JBossEAP7.3.7)ApacheCXF3.4.3ひとつめの問題RedHatSSOに、カスタムプロバイダ(認証機能を拡張するモジュール)を載せた状態で当該機能にアクセスした際、以下のような例外が発生しました。08:03:12,265ERROR[org.keycloak.services.error.KeycloakErrorHandler](defaulttask-5)Uncaughtservererror:javax.xml.ws.WebServiceException:Providercom.sun.xml.internal.ws.spi.Provider2021.06.07
Google Chrome のスワイプによる戻るを無効化する
GoogleChromeを使っていたらいつからか左右スワイプでHistoryBack/Forwardされるようになっていたのだけれど、個人的にはスワイプでページ移動したくなかったので無効化したいなと思い、方法を調べたもの。環境要件GoogleChromeバージョン:89.0.4389.90(OfficialBuild)(64ビット)無効化ネットで軽く検索してみると、chrome://flags/#overscroll-history-navigationから設定の変更が可能であると紹介しているページが多数見つかります。ところが、現在のGoogleChromeからはこのフラグが削除されており、同様の方法では無効化できません。どうやら現在のGoogleChromeではこのスワイプ動作を、CSSのOverscrillBehaviorという、ウィンドウ領域外にスクロールを行った場合の挙動に吸収させ2021.03.30
FF のウィンドウ風カードデザイン
FFI-FFXまでを再現した一覧は以下。/panelsFF6.window-ff6{position:relative;margin:0;padding:1.5rem1.5rem1rem;color:#fff;text-shadow:#0001px1px;background:linear-gradient(180deg,#7b7bd60,#7b7bd65%,#7373ce5%,#7373ce10%,#6b6bc610%,#6b6bc615%,#6363bd15%,#6363bd20%,#5a5ab520%,#5a5ab525%,#5252ad25%,#5252ad30%,#4a4aa530%,#4a4aa535%,#42429c35%,#42429c40%,#39399440%,#39399445%,#31318c45%,#31318c50%,#29298450%,#29298455%,2020.09.17
R2DBC と Repository パターンについての現時点での評価と所感
R2DBCもだいぶ成熟してきたのかなと思い使ってみたところ、ちょっと思ってたのと違ったので、そのメモ。結論から。誤解を恐れずに端的に言うならば、DDDを意識したプロジェクトの場合、R2DBC(ReactiveProgramming)は現時点で採用に値しない。これに尽きます。R2DBCだけではなく、ReactiveProgramming全体にまで言及しているのは、R2DBCを採用せず、WebFluxだけ採用してもリソース効率の最適化といった点において、あまり大きな効果を発揮できない(犠牲になる保守性に対して、採用するだけの価値が見出だせない)ためです。採用に値しないとまで断じた理由を以下、メリット・デメリットを挙げながら確認していこうと思います。メリットわたしの理解しているReactiveProgramming最大のメリットとは、リソース効率を最適化することです。処理の遅延評価を進め、パイプ2020.09.13
WSL 2 の Ubuntu 20.04 で timesyncd が動いてない
タイトルはtimesyncdですが、systemctlが動かない、というのが本題です。WSL2でUbuntu20.04を操作していたときのこと。gitcommitしたときにコミット時間に数時間のズレが生じていることに気が付きました。そこでtimesyncdによる時間の同期が動いているのか確認してみたところ、そもそもsystemctlが動作しなかった、というものです。そのとき返されたエラーは以下のようなものでした。$systemctlstatussystemd-timesyncd.serviceSystemhasnotbeenbootedwithsystemdasinitsystem(PID1).Can'toperate.Failedtoconnecttobus:HostisdownSystemhasnotbeenbootedwithsystemdasinitsystem(PID1).を見る2020.09.05
Spring 初学者が最初に知るべき責務とレイヤーと DDD (2020年 改訂)
DDDが身近になり、適用ハードルもずいぶん低くなってきたように感じてきていたため、以前のポストからところどころ書き直しました。レイヤードアーキテクチャSpringでは各コンポーネントの責務に応じたステレオタイプアノテーションが用意されており、これらがどう連携するかについては、レイヤードアーキテクチャをイメージすると理解しやすいです。Springでの各コンポーネントは、以下のように連携します。また、いくつかのアノテーションは、ドメイン駆動開発にそのヒントを得て用意されているため、実際のクラスやパッケージの配置については、もう少しDDDに気を使ったものとするのが良いでしょう。具体的には以前のポストでも使用した、以下の図を参考にしてみてください。トランザクションスクリプトとDDD以下、各コンポーネントについて、簡単に説明してみます。ViewSpringにおけるビューは、一般的なHTMLページを構2020.09.02
トランザクションスクリプトとDDD
エヴァンスが2003年に書籍Domain-DrivenDesignで紹介してから早17年。やっと時代が追いつき、近年ではこれまでにないほどDDDが注目を集めている。注目が高まるとともに、DDDを取り扱う良質な書籍も増え、私自身も複数のDDDの実践を経て、以前よりも理解は進んできたように思う。そこで、私の現時点でのDDDに対する解釈を、一度ここに書き起こし、残してみようと思う。(これはあくまで現時点での解釈であり、解釈のアップデートがあれば書き換えるかもしれない。)なお本稿では、ドメインエキスパートや、ユビキタス言語といった、DDDのプロジェクトへの適用側面には触れず、あくまでプログラミングする際にどのように理解、適用していけばよいかを中心に見ていく。2011年9月、SpringFramework3.0.6がリリースされて間もない頃、SpringのAPIドキュメント内にDDDの文字を見つける2020.09.01
ビジネスサービス・ファサード
造語と思われるこの耳馴染みのない単語は、Springのドキュメント内に登場する。https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Service.html(DeepLによる機械翻訳)注釈されたクラスが「サービス」であることを示します。これは、もともとDomain-DrivenDesign(Evans,2003)によって「モデル内で独立したインターフェースとして提供され、カプセル化された状態を持たない操作」として定義されていました。また、クラスが「ビジネスサービス・ファサード」(CoreJ2EEパターンの意味で)であることを示す場合もあります。このアノテーションは汎用的なステレオタイプであり、個々のチームがセマンティクスを絞り込んで適切に使用することができる。このアノテー2020.08.28
WSL のデフォルトディストリを変更する
WindowsStoreからLinuxディストリをダウンロードしたはずなのに、DockerDesktopがターミナルデフォルトになってしまっていたので、変更の仕方を調べてみたときのメモ。Windowsで、IntelliJIDEAのターミナルペインからWSLを使用する場合、このデフォルトディストリがターミナルシェルとして使用されるため、設定を知っておくと便利です。なお、IntelliJのターミナルをWSLに変更する手順は、以前のポストを確認してください。環境要件Windowsの環境設定ということで、本稿ではWindowsPowerShellを使って設定を行います。Windows10Build19041WSL2(WindowsSubsystemforLinux2)WindowsPowerShellPSC:\Users\****>Get-WmiObjectWin32_OperatingSyste2020.06.16
Windows IntelliJ のターミナルシェルを WSL に変更する
WSL2もリリースされたことで、Windowsでの開発がだいぶmacOSに近づいてきました。それでもWindowsのデフォルトシェル環境は相変わらずcmd.exeなので、IntelliJのターミナルシェルも相変わらずcmd.exeです。さすがにそのままだと使いづらいので、これをWSLに変更します。環境要件IntelliJIDEAULTIMATE2020.1ただし、このバージョンはあくまで執筆確認時のものというだけで、ULTIMATEである必要もなければ、2020.1ほど新しいバージョンでなく以前のバージョンでも問題ありません。シェルの変更GUIでぽちぽち設定していきます。以下のように設定を開いていきます。[File]>[Settings...]>[Tools]>[Terminal][Applicationsettings]の[Shellpath]をC:\Windows\System32\w2020.06.05
IntelliJ の置換でグループキャプチャする
IntelliJIDEAを使った置換で正規表現検索が使えるのは、利用者であれば誰でも知るところですが、実はこの正規表現検索、グループのキャプチャができます。これがもう非常に便利なので、その方法を書き残しておきます。環境要件IntelliJIDEAULTIMATE2020.1ただし、このバージョンはあくまで執筆確認時のものというだけで、ULTIMATEである必要もなければ、2020.1ほど新しいバージョンでなく以前のバージョンでも問題ありません。グループのキャプチャ通常のキャプチャ書式としては(PATTERN)でグループを定義する、というのは標準的な正規表現の使い方と変わりません。キャプチャした変数をどのように参照するのか、というのが実装によりけりで、IntelliJではどうするのか、というのが本題です。IntelliJでは$1,$2,..という書き方で、マッチしたグループの順にインデックス2020.06.03
Java agent をつくってみる
Javaagentを使うことはあっても作ったことないなと思い、調べつつ作ってみたのでそのメモ。環境要件Java8java-versionopenjdkversion"1.8.0_212"OpenJDKRuntimeEnvironmentCorretto-8.212.04.1(build1.8.0_212-b04)OpenJDK64-BitServerVMCorretto-8.212.04.1(build25.212-b04,mixedmode)サンプルコードhttps://github.com/yo1000/demo-javaagenthttps://github.com/yo1000/demo-javaagent-jettyエージェントパッケージの作成まず作成をするにあたって、エージェントパッケージの要件を確認します。エージェントであるためには、以下の要件を満たす必要があります。prem2020.05.18
Executable JAR のリソースを参照する
リソース取得なんてどうせgetResourceでしょとタカをくくっていたらハマってしまったので、ExecutableJAR(実行可能JAR)のリソース取得では、ここに気をつけようというのを残しておきます。環境要件Java8Kotlin1.3java-versionopenjdkversion"1.8.0_212"OpenJDKRuntimeEnvironmentCorretto-8.212.04.1(build1.8.0_212-b04)OpenJDK64-BitServerVMCorretto-8.212.04.1(build25.212-b04,mixedmode)サンプルコードhttps://github.com/yo1000/demo-config-props-vars/blob/master/src/main/kotlin/com/yo1000/demo/DemoApplicat2020.05.17
検証アノテーションを合成する
Javaでフィールドバリデーションをする場合、検証アノテーションを使うことになりますが、言語仕様によりアノテーションは派生クラスを作成できません。しかし、検証アノテーションでは近い意味合いの注釈を表現するために、既存のアノテーションを再利用したいと考えるシーンは少なくありません。そんなときにどう書くか、というのを何度か調べ直しているので残しておきます。環境要件Java8java-versionopenjdkversion"1.8.0_222"OpenJDKRuntimeEnvironment(AdoptOpenJDK)(build1.8.0_222-b10)OpenJDK64-BitServerVM(AdoptOpenJDK)(build25.222-b10,mixedmode)検証アノテーションの合成知っていれば簡単で、大きくは以下2つの要件を満たすだけです。アノテーションに合成したいア2020.04.07
mk2data で Markdown からテストデータ構築
mk2dataという小さなモジュールを作りました。マークダウンを使って、テストデータのセットアップや検証ができるようになるものです。なんでこんなものを作ったのかと申しますと。DB周りのテストを書く場合に、データのセットアップや検証のために、INSERTやSELECTを発行して確認するシーン、けっこうあると思います。でもこれ、面倒じゃないですか。プロダクションコードではバリバリORM使うのに、テストではあんまり使っていなかったり、標準APIを使って直接SQL発行してデータ作ってたり。そして煩雑になったSQL発行処理に、データのサマリや説明をつらつらとコメントしたりする。かくいうわたしも、以下のようなことをしていたんですね。dataSource.connection.use{conn->conn.createStatement().use{stmt->/*|id|name|age|blood|2020.03.07
Windows Terminal で Ctrl+Shift+C, V
(2020-06-06)この記事の内容は古く、現在はWindowsTerminalのデフォルト設定のままでCrtl+C,Ctrl+Vが使用可能になっています。シグナルを送信するためのCtrl+Cとも共存可能な状態が実現されており、追加の設定は不要になりました。https://github.com/microsoft/terminal/pull/5217/files#diff-c810a386e5041cec5e671e90b425c1c0R60-R61WindowsTerminal、プレビュー版ですが公開されました。さっそく使ってみたんですが、WindowsSubsystemforLinux(WSL)も、Powershellも、Cmdも、WindowsTerminalひとつで全部扱えて、見た目もスッキリ、使い勝手も全く問題なしで、すっかり気に入ってしまいました。設定も非常にシンプルで、設定2020.02.17
RustでSQLを発行してみる
RustでSQLを発行してみます。RustでSQLというとDieselばかりが検索に引っかかります。Dieselのように事前のセットアップをしたくない場合とか、すでにデータソースの用意がある場合等、SQLを直接書きたいシーンというのも少なくないと思うのですが、この例があまり出てきません。SQLを直接記述、発行する場合、r2d2_mysqlというCrateを使います。リポジトリやライブラリの紹介ページは以下のとおりです。Crates.ior2d2_mysqlGitHuboutersky/r2d2-mysqlここでひとつ、注意しなければならないことがあります。それぞれのページからリンクされているドキュメントが古いのです。Crates.ioからリンクされているドキュメントはv0.2.0、GitHubからリンクされているドキュメントはv3.0.0となっています。ところが、現在公開されているr2d22019.10.28
秒数算出するときはDurationがべんり
Cookie#setMaxAge(int)やHttpSession#setMaxInactiveInterval(int)のように期間を秒数で受けるようなAPIは少なくありません。旧来のJava7以前であれば、秒数計算をしていたかと思いますが、Java8以降ではjava.time.Durationを使用して、これをスマートにわかりやすく記述できるようになっています。環境要件OpenJDKJDK10.0.2+13デモhttps://repl.it/@yo1000/TimeUnitConversion従来の書き方(Java7まで)こんな書き方。よくやってましたよね。publicclassMain{publicstaticvoidmain(String[]args)throwsException{longsecondsOf30Days=30L*24L*60L*60L;//days*hours*m2019.10.14
Kotlin typealiasの効果的な使いどころ
Kotlinに用意されているtypealiasですが、これは新たな型を作るわけではなく、単に別名を付けてクラスへの参照経路を複数用意してあげるだけのものです。完全に別の型になるというわけではなく、エイリアスとエイリアスを付けられた型同士には互換性があるため、value-objectのような使い方をするためのものではありません。では、どのような場面で使うのが効果的なのか。以下で例を見ていきます。同一名前空間上で同名のクラスを使いたい場合これはtypealiasを使うのにとても適しており、また度々遭遇する場面でもあります。typealiasを使う前と、使ったあとの例を比較してみます。typealiasを使わない場合ありがちな話ですが、異なるパッケージの同名クラスを同時に使用したい場合、通常は一方のクラスをFQCNで記述しなければなりません。importorg.springframework.u2019.09.08
WSLでlibGL.so.1が開けないエラー
WSL環境で、あるGatsbyテンプレートを使用してgatsbydevelopを実行してみたところ、エラーが発生し開発モードでの起動に失敗してしまったため、そのトラブルシュート。なお一通り対応してみた限り、Gatsby自体に直接の原因があるわけではなく、WSL上におけるNode.jsでのビルド時に、依存関係次第では同様の現象が発生するように思われました。環境要件WSL(WindowsSubsystemforLinux)Ubuntu18.04.2LTSNode.js11.0.0npm6.10.2$cat/etc/lsb-releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=18.04DISTRIB_CODENAME=bionicDISTRIB_DESCRIPTION="Ubuntu18.04.2LTS"$node--versionv11.0.0$npm--versi2019.08.04
GitHubで草活して1年が経った
すこし前の話になりますが、GitHubで草を育てる活動をはじめて、1年が経ちました。忘れないように活動中に感じていたことなど残しておこうと思います。一年で生えた草は以下のようになりました。1日だけ草の生えていない日は、第二子が生まれて数日後の日曜日で、いろいろと忙しくてどうしても何も手につかなかった日です。良かったこと日常的に、なにかコントリビュートできないかと思いを巡らせるようになった。(半ば強制的に。)タスクごとにコマメにIssueやPR作成するようになり、課題やPRの粒度感がちょうどよくなった。いろいろなものをGitHubで管理するようになった。(このブログも。)あまり良くなかったことコントリビュートに寄与しない活動の優先度が下がる。検証作業とか。まとまった規模の変更とか。(避けたくても発生するときはするので。)コントリビュートの発生していない日は、頭の何処かでずっとそれを考えてしま2019.06.28
MITライセンスの派生物に自分の権利表示を追加する
もともとMITライセンスが付与されていた著作物に対して、自分で加えた変更部分に対する権利表示を、どう適用するかという話。MITライセンスの内容自体に関することはここでは触れません。なお、他のライセンスについても、派生物に自身の権利を含めることを許可しているものについては、概ね同様に対応すればよいかと思われますが、実際にライセンスを適用する際には、念のためそれぞれのライセンスごとに改めて調べてみるのが良さそうです。ライセンスの追加適用調べてみるとStackoverflowが引っかかり、これを参考にしてみると、単にコピーライト行を追加すればよいだけのようです。以下のYour-Name行のように著作者を追記します。TheMITLicense(MIT)Copyright(c)2019Your-NameCopyright(c)2018Original-AuthorPermissionishereby2019.06.26
お名前ドットコムからGoogleDomainsにドメイン移管する
GoogleDomainsで、トップレベルドメインdevの提供が開始されたのを機に、保有ドメインを移管してみました。ドメイン登録事業者は数多くありますが、それらの中でもお名前ドットコムを使っていた理由のひとつが、ドメイン名の取扱いだけではなく、同サービス上でDNSを無償提供しているという点にありました。ところがGoogleDomainsでもDNSは無償提供されているんですね。となるとGoogleDomainsに移管してしまえば、わざわざお名前ドットコムで、使いづらいコントロールパネルを使い続けなくてもいいわけです。そこで移管を考えるにあたり、それぞれ気になる部分の特徴を比較してみます。お名前ドットコムGoogleDomainsDNS提供👍無償👍無償Whois代行👍できる👍できるコントロールパネル❌わかりづらい👍わかりやすいメアド作成❌できない👍Gmailのエイリアスにできるドメ2019.03.09
FlywayのSQLにはプレースホルダが使える
FlywayによるDBマイグレーションで、ユーザーテーブルのようなものをセットアップしたい場合に、SQLに直接パスワードを書きたくないなと調べたところ、プレースホルダーを使えることがわかったので、そのメモです。SpringBootを組み合わせると、さらに便利に使えるようになるので、今回はSpringBootを使ったサンプルになります。環境要件OracleJDK1.8.0_161Kotlin1.2.71SpringBoot2.1.3.RELEASEFlyway5.2.4プレースホルダーの書き方プレースホルダーを使うには、変数化したい箇所を${variable.name}のように書き換えるだけです。はじめに書いたような、パスワードをSQLから追い出したいような場合は、以下のように書きます。なお今回のサンプルは、MySQLで確認しています。INSERTINTO`users`(`id`,`user2019.03.02
Netlifyのサブドメインをプライマリドメインにリダイレクトする
Netlifyでは、自分のドメインを持っていなくとも、netlify.comのサブドメインとして、デプロイしたサイトが公開されます。ところが、自分のドメインをすでに持っており、カスタムドメインを設定しているような場合、同一コンテンツが複数のドメインで同時に配信されることになってしまいます。このような状態に対し、SEO上の懸念を感じた場合にしておくとよいのが、リダイレクト設定です。環境要件Netlify2019-02-28現在リダイレクトファイルを配置するNetlifyでは、公開ディレクトリのルートに_redirectsファイルを配置することで、リダイレクトルールを定義することができます。例えばGatsbyJSを使ったブログでは、staticディレクトリに配置したファイルは、ビルドするとそのままpublicディレクトリに出力され、これが公開ディレクトリとなります。そのため、staticディレ2019.02.27
KotlinでJPA使用時にデフォルトコンストラクタ要求を回避する
KotlinでJPAを使用する場合、エンティティクラスにデフォルトコンストラクタが存在しないと、以下のような例外がスローされます。org.springframework.orm.jpa.JpaSystemException:Nodefaultconstructorforentity::..;nestedexceptionisorg.hibernate.InstantiationException:Nodefaultconstructorforentity::..これはJPA実装のひとつであるHibernateが、エンティティクラスのインスタンス生成時に、引数付きコンストラクタではなく、デフォルトコンストラクタを使おうとするために発生する例外ですが、Kotlinでは、コンストラクタとプロパティを一緒に記述できるため、多くの場合デフォルトコンストラクタが用意されません。Kotlinでデフォルト2019.02.26
KotlinやJavaのファイルスキームURLをパスに変換する
fileスキームのURLを、ローカルファイルを参照可能なパスに変換しようとしたところ、単純な文字列操作以外の方法でこれを取り扱うのが、思ったよりも手こずったのでメモ。手こずったとはいえ、方法を知っていれば難しくはないのですが、知らなかったなあということで。環境要件OracleJava1.8.0_161Kotlin1.2.71ApacheMaven3.6.0$./mvnw-versionApacheMaven3.6.0(97c98ec64a1fdfee7767ce5ffb20918da4f719f3;2018-10-25T03:41:47+09:00)Mavenhome:~/.m2/wrapper/dists/apache-maven-3.6.0-bin/2dakv70gp803gtm5ve1ufmvttn/apache-maven-3.6.0Javaversion:1.8.0_161,ve2019.02.22
SlackとJIRAを連携する
SlackとJIRAを連携するには、JiraCloudを使うか、JiraServerAlertsを使うことになります。どちらでも連携自体は可能ですが、通知内容はJiraCloudのほうがよりリッチで、Slackを離れることなくIssueを把握しやすいです。ところが、JiraCloudは、セットアップ方法の説明がSlack側のドキュメントだけで完結しておらず、少々分かりづらくなっています。ドキュメントの在り処さえわかってしまえば難しい話ではないのですが、エラーメッセージをもとに検索しなければならず、少々の不便を感じます。ドキュメントはそれぞれ以下にあります。JiraとSlackを連携させる-JiraCloud"ConnectingwiththisJiraCloudinstancewasdisabledbyadministrator"というメッセージが表示されます。なぜでしょうか。ドキュメント2019.02.15
Goインストールメモやりなおし(vgo)
いまのGoは、バイナリ内にパッケージマネージャが同梱されていることを知ったのでやりなおし。depなんていらなかった。depだと、GOPATHが必要だったり、ディレクトリ構成もそこそこ縛られたりするし、goコマンドにバンドルされているvgoのほうが良かった。環境要件MacOSX10.13.6$sw_versProductName:MacOSXProductVersion:10.13.6BuildVersion:17G65GVMのインストールGVMはNVMとかと同じ、ランタイムのバージョンマネージャ。$bash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)Cloningfromhttps://github.com/moovweb/gvm.gitto/Users2019.01.26
Goインストールメモ(dep)
RustでWebサーバーを書いていたのですが、このところ非同期IOまわりの実装が活発なようで、シンプルに書こうと思うと、まだ発展途上な部分が目立ったので、筆休めにGoをはじめてみました。というわけで環境構築用の自分用メモです。環境要件MacOSX10.13.6$sw_versProductName:MacOSXProductVersion:10.13.6BuildVersion:17G65GVMのインストールGVMはNVMとかと同じ、ランタイムのバージョンマネージャ。$bash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)Cloningfromhttps://github.com/moovweb/gvm.gitto/Users/xyz/.gvmNoexis2019.01.18
Rustでコレクション操作
Rustでコレクション操作をしてみようとしたところ、基本的な部分ではありつつも、けっこう躓いたのでメモ。公式リファレンスが充実しているので、そちらを確認するのも良いですが、型引数が必要な箇所や、実際にそれをどう指定するのかまでは、例がまとまっていなかったので。HTTPリクエストで与えられたクエリ文字列を、JSONに変換してレスポンスする、というケースを例にします。今回のコードサンプルは以下。https://github.com/yo1000/rust-hyper/tree/389b425ca8要件Rust1.31.1Cargo1.31.0$rustc-Vrustc1.31.1(b6c32da9b2018-12-18)$cargo-Vcargo1.31.0(339d9f9c82018-11-16)コード例今回はコード例から。コード内で使っている操作を個別に補足説明していくスタイル。(&Met2019.01.17
RustでシンプルなWebサーバー
Webサーバーをつくるときは、Hyperというのがデファクトらしいので、これを使ってみます。(Webアプリケーションフレームワークとしてはまた別で、IronとかRocketとかがある。)今回のコードサンプルは以下。https://github.com/yo1000/rust-hyper/tree/705dc5ca10要件Rust1.31.1Cargo1.31.0$rustc-Vrustc1.31.1(b6c32da9b2018-12-18)$cargo-Vcargo1.31.0(339d9f9c82018-11-16)プロジェクトの作成プロジェクトを作成して、プロジェクトルートに移動しておきます。$cargonew--binrust-hyperCreatedbinary(application)`rust-hyper`package$cdrust-hyper/依存関係Cargo.tomlを2019.01.13
Rustインストールメモ
環境移ったときなど、毎回調べ直している気がしたので自分用メモ。読み方はrˈʌst。RustupのインストールRustupはNVMとかと同じ、ランタイムのバージョンマネージャ。curlhttps://sh.rustup.rs-sSf|sh..1)Proceedwithinstallation(default)2)Customizeinstallation3)Cancelinstallation>1source~/.cargo/envrustup-Vrustup1.16.0(beab5ac2b2018-12-06)RustのインストールRustupを使って、Rustをインストールする。rustupinstallstablerustc-Vrustc1.31.1(b6c32da9b2018-12-18)cargo-Vcargo1.31.0(339d9f9c82018-11-16)プロジェクトの作成2019.01.12
NodeJSインストールメモ
環境移ったときなど、毎回調べ直している気がしたので自分用メモ。NVMのインストールcurl-o-https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh|bashsource~/.bash_profilenvm--version0.34.0NodeJSのインストールnvminstall11.0.0node-vv11.0.0npm-v6.4.1NPMの更新npm-gupdatenpm-v6.5.0GatsbyClientのインストールこれは使わなければ、とくに用事なし。npm-ginstallgatsby-cligatsby-v2.4.8プロジェクトのビルドXYZの部分は、プロジェクトに応じて変更する。npminstallnpmrunXYZ2019.01.11
Gatsby Material StarterのRSSフィードを修正する
GatsbyMaterialStarterをしばらく使ってみたところ、生成されるRSSフィード内のURLがエンコードされていないことに気が付きました。そこで今回はフィード生成処理に手を加えて、これを修正してみます。要件Node.js11.0.0NPM6.5.0GatsbyCLI2.4.7Gatsby2.0.40Vagr9K/gatsby-material-starter2019.01.06現在$node-vv11.0.0$npm-v6.5.0$gatsby-v2.4.7RSSフィードの修正RSSフィードの生成処理をしているのは、プロジェクトルートにあるgatsby-config.jsです。以下のようにurl,guidフィールドを修正することで、URLエンコードを施します。feeds:[{serialize(ctx){const{rssMetadata}=ctx.query.site.sit2019.01.05
CSSでカーニング
CSSでもカーニングできることを知ったので使ってみたところ、とても良かったのでこれからも使えるようにメモ。CSSプロパティfont-feature-settingsを使い、値に"palt"を設定します。句読点、括弧、中黒等を字詰から除きたい場合は、"pkna"を設定しても良いです。また、文字同士の共通的な間隔についてはletter-spacingを使って調整します。html{font-feature-settings:"palt";letter-spacing:.0234375rem;}カーニング適用前。キスティス「まずは【G.F.】をジャンクションさせて。そうすれば【アビリティ】をセットすることができるわ」カーニング適用後。キスティス「まずは【G.F.】をジャンクションさせて。そうすれば【アビリティ】をセットすることができるわ」参考https://developer.mozilla.or2019.01.04
Gatsby Material Starterで行番号を表示する
ブログをGatsby移行するにあたって、すこし面倒だったシンタックスハイライトの行番号表示をまとめます。要件Node.js11.0.0NPM6.5.0GatsbyCLI2.4.7Gatsby2.0.40Vagr9K/gatsby-material-starter2019.01.04現在gatsby-remark-prismjs3.0.3$node-vv11.0.0$npm-v6.5.0$gatsby-v2.4.7Vagr9K/gatsby-material-starterをGatsbyテンプレートとして使用しますが、基本的にはどのStarterで始めても同じような対応で問題ないはずです。(スタイルは多少調整が必要になります。)シンタックスハイライト設定Vagr9K/gatsby-material-starterには、シンタックスハイライトするためのプラグインgatsby-remark-pr2019.01.03
Gatsbyことはじめ
Gatsbyのはじめ方に少し手間取ったのでメモ。要件Node.js11.0.0NPM6.5.0GatsbyCLI2.4.7$node-vv11.0.0$npm-v6.5.0$gatsby-v2.4.7GatsbyCLIのインストールNode.js,NPMさえ入っていれば、これは手こずりません。GatsbyクイックスタートのとおりにNPM経由でインストールします。npminstall--globalgatsby-cliGatsbyサイトの作成Gatsbyサイトを作成するには、GatsbyCLIのnewコマンドを使用します。しかし、ゼロからサイトを作成するのは大変なので、今回はStarterと呼ばれるサイトテンプレートを使用します。このStarterは、Gatsby1とGatsby2の間で互換性の維持されているものが(試した範囲では)見つからなかったので、ここで適切なものを選ばないと、けっこう2019.01.02
Postgresqlコマンドメモ
すぐ忘れて検索し直すので。個人的なメモとして。クライアントから接続psql-h'{hostName}'-p{portNumber}-U'{username}'-d'{databaseName}'ロール(ユーザー)作成データベース作成#roleName:LOGINNOLOGINCREATEDBetc..CREATEROLE{roleName}PASSWORD'{password}';CREATEDATABASE{databaseName};バックスラッシュ系コマンド#データベース一覧\l#テーブル一覧\d#データベース切り替え\c{databaseName}#ロール切り替え\c-{roleName}#クライアントセッション終了\q参考https://dev.classmethod.jp/server-side/db/postgresql-organize-command/http://www2018.11.11
Spring Bootプロファイルの指定あれこれ
SpringBootにはプロファイルという、環境ごとの設定やBean構成のロードを切り替える機能があります。プロファイルは、名前ベースで切り替えることができ、とても直感的に使うことができて便利です。ところが少し変わったことをしようとすると、途端に躓いてしまう部分でもあるので、プロファイルをもう一歩踏み込んで使うためのポイントをいくつかまとめてみます。要件環境Java8Kotlin1.2.41SpringBoot2.0.4.RELEASE基本的な使い方以下のようなテストがあった場合に、userへ何がDIされるかをプロファイルを使って切り替えてみます。@RunWith(SpringRunner::class)@SpringBootTestclassDemoSpringProfileApplicationTests{@Autowiredlateinitvaruser:User@Testfunco2018.08.11
Kotlinでヒアドキュメント中の文字をエスケープ
Kotlinには変数展開機能があるため、$記号を使いたい場合エスケープが必要になる。ヒアドキュメントと通常の文字列でエスケープの方法が少し異なり、クセがあるのでメモ。要件環境今回の作業環境は以下のとおりです。Java8Kotlin1.2.41デモ通常の文字列内でのエスケープprintln("\${xyz}")//OK:${xyz}ヒアドキュメント内でのエスケープprintln("""\${xyz}""".trimIndent())//NG:CompileERRORprintln("""\$\{xyz\}""".trimIndent())//NG:\$\{xyz\}println("""${'$'}{xyz}""".trimIndent())//OK:${xyz}valdoller:Char='$';println("""${doller}{xyz}""".trimIndent())//OK2018.08.09
Keycloak 4とSpring Boot 2アプリの連携 - リソースサーバー
Keycloak4がリリースされたのに合わせてkeycloak-spring-boot-2-starterもリリースされたので、SpringBoot2との連携例を紹介しようという記事の2回目です。(1回目はこちら)https://github.com/yo1000/kc4-boot2-resource要件環境今回の作業環境は以下のとおりです。Java1.8Kotlin1.2.41SpringBoot2.0.3.RELEASEKeycloak4.0.0.Final認証認可フロー今回は、SSOクライアントが複数で、それぞれがリソースサーバーとリソースクライアントの関係にある認証の流れを確認していきます。以下のような認証フローをイメージしてください。KeycloakのセットアップKeycloak3から、Keycloak4への移行によって、基本的な使い方に大きな変更が生じないのは、構成が変わっても2018.06.24
Keycloak 4.0とSpring Boot 2.0アプリの連携 - 単一クライアント
つい先日、待ちに待ったKeycloak4がいよいよリリースされました。なぜ待っていたかというと、Keycloak4用の連携モジュールからはSpringBoot2に正式対応されるからなんですね。(Keycloak3用の連携モジュールはSpringBoot1系にしか対応していませんでした。)Keycloak3の頃からIssueはあがっておりましたが、Keycloak開発チームから、Keycloak4のリリースと一緒に対応するよ、といった回答がされており、これを待っておりました。やっと材料が出揃ったということで、さっそくこれらを連携させたサンプルを確認していきたいと思います。実現したいSSOのフローに応じて、2回に分けて書きます。なお、文章はサンプルプロジェクトの内容を追いながら書いていくので、以下も併せて確認してください。https://github.com/yo1000/kc4-boot2要2018.06.23
Springで外部APIをリクエストする場合のテスト
外部APIをリクエストしている機能のテストをしたい場合、Springでは、MockRestServiceServerを使います。MockRestServiceServerを使うと、RestTemplateがリクエストしたURL等の条件に応じて、期待したレスポンスを返すようにテストを構成できるようになります。また必要に応じて、モックされたリクエストが、正しく順番通りに使用されたかどうかも検証できます。なお、今回のサンプルコードは以下にあるので、こちらも参考に。https://github.com/yo1000/example.MockRestServiceServer/tree/master/MockRestServiceServer-client要件Java1.8.0_121Maven3.5.3Kotlin1.2.41SpringBoot1.5.12.RELEASE$./mvnw-vApa2018.06.09
MavenのactiveByDefaultにはクセがある
Mavenで複数のプロファイルを切替える場合に、そのデフォルトとして、プロファイルをマークするのがactiveByDefaultという設定なわけですが、これの挙動が少し想像とズレていたのでそのメモ。サンプルは以下。https://github.com/yo1000/example.Maven-ActiveByDefaults要件Java1.8.0_121Maven3.5.3$./mvnw-vApacheMaven3.5.3(3383c37e1f9e9b3bc3df5050c29c8aff9f295297;2018-02-25T04:49:05+09:00)Mavenhome:~/.m2/wrapper/dists/apache-maven-3.5.3-bin/2c22a6s60afpuloj4v181qvild/apache-maven-3.5.3Javaversion:1.8.0_1212018.06.09
OSSのパスワードマネージャKeePassに移行する
1Passwordの課金モデル変更に伴い、サブスクリプションモデルに移行するか、LastPassに移行するかと、これからのパスワード管理について、いろいろ悩んで改めてゼロから調べ直してみたところ、KeePassというのが良さそうだったのでこれに移行してみました。KeePassとはKeePassは、OSSのパスワードマネージャです。OSSなので、当然仕様は公開されています。そのため、これに従うことで、サードパーティのクライアントからでもKeePassのパスワードデータベースに安全にアクセスすることができます。(当然データベースは暗号化されており、復号にはユーザーからのマスターパスワードの入力が必要になります)KeePassでは、パスワードデータベースファイルの管理は、ユーザーに委ねられています。そのため、複数デバイス間でこれを共有したい場合は、自分の信頼しているクラウドストレージや、任意の共2018.06.01
KotlinでMockitoを使うとanyがうまくいかない
テストでMockitoを使っていると、any(Class<T>)を使いたくなる場面は、そこそこ多いように思います。ところが、Kotlinでテストを書いていると、これを受け取ったKotlin実装のメソッドで以下のようなエラーが吐かれてしまい、テストが書けません。java.lang.IllegalStateException:Mockito.any(Hoge::class.java)mustnotbenull調べてみると、近い内容でお困りのケースが見つかったので、これを参考に対応してみました。要件Kotlin1.2.21Mockito1.10.19対処法一度Kotlin実装された別のメソッドでラップしてあげて、Kotlinで実装されたメソッドに、Null安全な状態で渡してあげれば良いようでした。以下のようにします。@Testfuntest(){valinvokerMock=Mockito.mo2018.05.28
NuxtをSPAで動かすとリダイレクト時に一瞬ページが見える
以前からVueには興味があって、このサイトもまあVuePress使っているから、まあそうなんだろうねという感じなんですけど、最近では職場でもVueが使われることが少しずつ増え始めて、今やっているプロジェクトではNuxt.js使うことになったのですよね。そんな中で、認証基盤(別ドメイン)へのリダイレクトをかけようとしたら、リダイレクトをトリガしているページが一瞬表示されてからリダイレクトが完了する、というなんとも引っかかる動きをしたわけです。今回はこれについて検証して、現行(Nuxt.js1.4.0時点)では、まずまず妥当と思われる対処法までたどり着いたのでこれを書きます。要件NodeJS9.5.0Nuxt.js1.4.0SPAモード$node-vv9.5.0検証コードをリポジトリにまとめてあるので、詳細についてはこちらのpackage.jsonを参考に。https://github.com2018.05.25
Spring初学者が最初に知るべき責務とレイヤー
こちらのポストは随分と内容が古くなってきたため、新たに書き直しました。Spring初学者が最初に知るべき責務とレイヤーとDDD(2020年改訂)このポストは、過去にQiitaで書いたものを改訂したものです。新年度を迎えるたび、Qiitaでのポストへたびたび「いいね」がつくので、入社等をきっかけに、新たな環境ではじめてSpringに触れる方もきっと多いのでしょう。自分の周囲に対しても、Springを説明する際によく使用していたポストだったので、内容の見直しも兼ねて、こちらのサイトに改訂版としてポストしておこうかと。レイヤーアーキテクチャSpringでは各コンポーネントの責務に応じたステレオタイプアノテーションが用意されており、これらがどう連携するかについては、レイヤーアーキテクチャをイメージすると理解しやすいです。Springでの各責務レイヤーは、以下のように連携します。各レイヤーの責務各レ2018.05.22
VuePressにRSSフィードを追加する
VuePressは便利なんですが製品ドキュメント向けに作られている感が強く、ブログとして使おうとすると、まだ貧弱な部分も目立ちます。今回書くRSS機能なども現在のところ用意されてはいません。(Issueで議論などはされているようなので、今後公式に実装される可能性は高いと思います。)ここでは、公式実装が待ちきれずに作ってしまった、RSS機能を見ていきます。要件RSSフィード出力のために必要な機能は以下です。RSS仕様に従いXML出力出力されたファイルを保存出力するファイルパスの解決詳細については、このサイトを生成しているリポジトリのpackage.jsonを確認するのが早いですが、簡単に必要なものを挙げておくと以下のようなものになります。vuepress:^0.8.4rss:^1.2.2なお、ファイル保存に必要なfs-extra、パス解決に必要なpathは、いずれもvuepressが依存ライ2018.05.19
GitHubからの通知をフィルタしてSlack連携する
GitHubは、現在では無くてはならない開発インフラのひとつとなっていますが、いまいちその通知機能のバランスが悪く、重要な通知(レビューリクエストや、担当Issueの更新等)を見逃してしまいがちです。この通知機能のバランスの悪さの原因は、過剰に通知が送られてくることで、重要な通知が埋もれてしまいがちなところにあるように思えます。ただ一方で、重要な通知については(総量としては過剰ではあるものの)漏らさず、しっかりと届けられてはいます。そのため、これら通知を適切に分類さえできれば、重要な通知を見逃すことがなくなるはずです。というわけで、Gmailを有効活用します。概要以下のような連携を実現します。要件今回使用するのは以下の3つ。GitHubGmailSlack(Paidplan:EmailIntegrationを使用します)設定手順GitHub通知の宛先を任意のGmailアドレスに設定します。2018.05.18
Jacksonシリアライズの循環参照を止める
Jacksonを使用したJSONの出力で、オブジェクトが循環参照を起こしているような場合、これを止める方法についてのメモ。以下のように、JsonIdentityInfoアノテーションをクラスにつけるだけで良いです。これを使用することで、循環が検出された場合に、循環しているオブジェクトの内容を、ID文字列に置き換えてくれるようになります。JPAエンティティなどをそのままJSON出力したいような場合には、OneToMany,ManyToOneを使用したオブジェクトの参照で、このようなニーズが度々発生します。@Entity@JsonIdentityInfo(property="_id",generator=ObjectIdGenerators.UUIDGenerator::class)dataclassPerson(@Idvarid:String="",varname:String="",@On2018.01.25
DynamoDB LocalをSpring Bootで使う
概要DynamoDBLocalを、SpringBootで使うメモ。SpringDataのCrudRepositoryを使用した、リポジトリクラスの定義と、自動生成や、SpringBootのAutoconfigurationの仕組みを組み合わせて、プロダクションと、テストで、データストアの使い分けができるようにしていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/ddb-local/tree/e9eb5812f6/ddb-local-spring-boot要件環境今回の作業環境は以下のとおりです。Java1.8.0_131Kotlin1.2.10DynamoDBSDK1.11.263DynamoDBLocal1.11.86SpringBoot2.0.0.M7$sw_versProductName:Ma2018.01.14
DynamoDB Localを使用したテスト
概要AmazonDynamoDBを、AWSに依存せず、ローカルでテストする流れのメモ。DynamoDBでは、AWSを利用せずとも、ローカルで検証できるように、AWS自身からDynamoDBLocalというモジュールが提供されています。このモジュールはAWSが管理しているMavenリポジトリにもホスティングされており、これを利用することで、事前に特別なコマンド等を発行することなく、JVM言語のビルドプロセス過程で、ローカルにDynamoDBを用意することができるようになります。このポストでは、Kotlinプロジェクトで、DynamoDBLocalを使用してテストする場合に、どのような設定が必要になるのかを中心に書いていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/ddb-local/tree/40c2018.01.13
KeycloakリソースサーバーJavascriptクライアントの連携例
概要Keycloakと、リソースサーバー、リソースクライアント間のSSO検証メモ。(Javascriptクライアント版)すでに検証部分の大半は過去のポストで完了しているため、ここでは主にJavascript版での差分と、Javascriptクライアントからの利用方法を中心に書いていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource/tree/e09c1dd987/kc-resource-client-js要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.FinalNodeJSv8.4.0NPM5.6.0$sw_versProductName:MacOSXProductVersion:10.2018.01.06
Keycloak認証を使うリソースサーバーのGroovy Spockテスト
概要Keycloakによる認証を使う、リソースサーバー(SpringBootクライアント)でのGroovySpockテスト実装メモ。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource/ac9914ae02#try-testing-with-only-kc-resource-serverまた、テストについては、既に過去のポストで触れているため、ここでは、GroovySpockを適用するにあたって、変更が必要となる部分について書いていきます。要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.FinalGroovy2.4.11Spock1.1-groovy-2.4$sw_versProductName:2018.01.03
Keycloak認証を使うリソースサーバーのテスト
概要Keycloakによる認証を使う、リソースサーバー(SpringBootクライアント)でのテスト実装メモ。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource/584c4c92ce#try-testing-with-only-kc-resource-serverまた、テストコード以外の部分については、過去のポストを前提としています。関連するものについては軽く触れますが、詳細を確認したい場合は、そちらを確認してください。要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.Final$sw_versProductName:MacOSXProductVersion:10.12.5BuildVersion2017.12.25
Keycloakリソースサーバー リソースクライアントの連携例
概要KeycloakによるSSO基盤構築検証のメモ。SSOサーバー(Keycloak)のセットアップと、SSOクライアント(リソースサーバー、リソースクライアント)の開発を順に見ていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.Final$sw_versProductName:MacOSXProductVersion:10.12.5BuildVersion:16F2073$java-versionjavaversion"1.8.0_131"Java(TM)SERuntimeEnvironment(build1.8.0_131-b11)J2017.12.17


