mike-neckのブログ

Java or Groovy or Swift or Golang

2018-01-01から1年間の記事一覧

URLSession による HTTP 接続と libcurl

swift で HTTP でAPIを呼び出すときなどは URLSession#dataTask(with:,completionHandler:) を使うのが一般的らしい。 guard let url = URL(string: "http://localhost:8080/api") else { throw MyURLError.invalidURL } URLSession.shared.dataTask(with: u…

周回遅れ(3周くらい)で Kubernetes 入門してみた

Kubernetes の名前は 2年ちょっと前くらいから耳にはしていたけど、全然触ったことないわりに、最近方方から聞こえてくるので触ってみることにした。 なお、基本的な内容はこちらのものを、ただコピペしてくだけの作業… docs.microsoft.com いくつかチュート…

reactor-netty コールドリーディング(4)

ChannelOperationsHandler reactor-netty が提供している ChannelHandler の実装クラス 内部に ContextHandler を持ち、これを通じて処理の登録などを行っている模様 channelActive(ChannelHandlerContext) ContextHandler#createOperations(Channel, Object…

reactor-netty コールドリーディング(3)

HttpRequest の組み立て HttpClient#get などのメソッドから HttpClient#request メソッドを呼び出し HttpClient#request にて Mono<HttpClientResponse> を返すが、実体は MonoHttpClientResponse 2.の際に HttpClient#handler というメソッドが呼び出され、 Function<HttpClientRequest,Publisher<Void>> が MonoH</httpclientrequest,publisher<void></httpclientresponse>…

reactor-netty コールドリーディング(2)

Bootstrap の組み立て Bootstrap は以下の2箇所のいずれかで組み立てる PoolResources#selectOrCreate(SocketAddress,Supplier,Consumer,EventLoopGroup) PoolResources が利用できる場合のみ PoolResources では接続先アドレス(ポート含む)ごとに Channel …

reactor-netty コードリーディング(1)

HttpClient#create(String,int) : アドレスとポートを Consumer<HttpClientOptions.Builder> にラップして(options.host(address).port(port)) HttpClient.Builder#options(Consumer<HttpClientOptions.Builder>) で設定して HttpClient を生成する HttpClientOptions.Builder は ClientOptions.Builder<B extends ClientOptions.Builder<B>> を継承した</b></httpclientoptions.builder></httpclientoptions.builder>…

Swift で JSON のデコード

Swift4 での JSON 文字列からオブジェクトへの変換方法のメモ. もっと詳しく調べたい場合は公式のドキュメントを調べた方がよい. これからデコードするJSON { "id": 219038 , "name": "James Thunder" , "password": "s0r23ndsn0q3mf083259" , "created_at":…

Groovy製のプロビジョニングツール infrastructor

infrastructor は Groovy でできたサーバープロビジョニングツールで、まあ、 Chef とか itamae とか Ansible の類のツールです。2018/06/07 現在のバージョンは 0.1.8 ということで、まだ開発が始まってから1年くらいの若いツールです。 github.com この記…

Swift-NIO の ChannelInboundHandler/ChannelOutboundHandler のメモ

単なるメモ Swift-NIO の ChannelInboundHandler/ChannelOutboundHandler を記述する際のポイント ChannelInboundHandler Netty の ChannelInboundHandler と同じく、基本的には channelRead(ctx:ChannelHandlerContext, data: NIOAny) を実装する NIOAny 型…

Swift Package Manager のメモ

とある理由により、 Swift Package Manager を使っているけど、どこに書いてある方法を真似しても(Swift のドキュメントですら)エラーが出てしまうので、自分用にメモを取ることにした プロジェクトの作成 プロジェクトを作成するには swift package init コ…

JJUG CCC 2018 Spring にて発表しました #jjug_ccc

表題の通り 2018/05/26 開催された JJUG CCC にて発表してきました。 www.java-users.jp セッションが1つとLTが1つです。 セッションの方は 「(俺が)はじめての Netty」 で、LT のタイトルは「Spring Boot アプリケーションの起動を速くする 108 の Tips」で…

Java Day Tokyo 2018 のセッションメモ

Java Day Tokyo 2018 に行ってきたので、そのメモ。 キーノート 目黒駅で東京駅南口行きバスのりばを探すのに時間がかかってしまったため、20分遅刻してしまった。 僕が参加したときには Java の新しいリリースモデルの説明。 OpenJDK は 半年間しかサポート…

CompletableFuture の thenApplyAsync メソッドは何度も呼び出せるのか試してみた

最近、自分専用のライブラリーを書いていて、 CompletableFuture#thenApply および CompletableFuture#thenApplyAsync などを複数回呼び出せるのかがわかっていなかったし、 Javadoc にも書いていないようなので実験してみることにしました。 書いたのは次の…

Component の インデックススキャンでどれくらい速くなるか計測してみた #jsug

JSUG のLT会で 『Spring Boot アプリケーションの起動をほんの少し気持ちだけ速くしてみた』というタイトルでLTしてきたところ、 Spring 5 から @Component のインデックススキャンがサポートされるようになったことを教えてもらったので、試してみました。 …

Class Data Sharing を試してみる

Java 10 の Class Data Sharing で Spring Boot の起動を速くしてみます。 Class Data Sharing は異なるJVM上で同一のクラスの情報を共有する仕組みです。 Java 8 の時点ですでに組み込まれていましたが、コマーシャルな機能であったため、 使っている人は少…

Future を Mono に変換する

CompletableFuture<T> から Mono<T> に関しては、 Mono#fromFuture(CompletableFuture) というメソッドがあるのだが、 Future<T> からは Mono<T> への変換メソッドはないし、もっと言えば Future<T> から CompletableFuture<T> への変換メソッドもない。 最初は次のような変換</t></t></t></t></t></t>…

Spring WebFlux Security のカスタム認証

Spring WebFlux Security でカスタム認証を実装します。ベースとなるユーザー認証部分は以前に実装したとおりです。 mike-neck.hatenadiary.com 今回は権限まわりの実装します。〜〜のパスには〜〜の権限が必要みたいなやつです。 特定のリソースへの特定の…

Spring WebFlux で Mono が empty の場合に404 を返す

Spring WebFlux フレームワークは戻り値の方は Mono<V> になるのだが、この Mono<V> が empty の場合、Spring 側でよしなにやってくれると思ったら、実はそうでもないらしい。 例えばこのようなハンドラーを作ってみる Mono<ServerResponse> test(final ServerRequest request) { f</serverresponse></v></v>…

Gradle4.6 からの JUnit5 実行方法

Gradle4.6 がリリースされ、 JUnit5 に対応しました。以下にGradle から JUnit5 のテストを実行するための build.gradle を示しますが、特殊なことをするわけではありません。 build.gradle plugins { id 'java' } repositories { mavenCentral() } test { u…

Reactor Test の StepVerifier の withVirtualTime の使い方

Spring WebFlux で project Reactor が使われていて、まだ手に馴染んでいないので、 チュートリアル をやっていたところ、 StepVerifier#withVirtualTime の使い方がわからず、検索しても要領を得ず、いろいろ試して使い方がわかったので、そのメモ tech.io …

リファクタリングの手順 メソッドの抽出 -> メソッドの別クラスへの移動

IntelliJ での基本的なリファクタリングの手順です。 次のような二つのクラスを考えます。 public class WithAccessTokenSecurityContextFactory implements WithSecurityContextFactory<WithAccessToken> { @Override public SecurityContext createSecurityContext(final Wi</withaccesstoken>…

Spring WebFlux Security で ユーザー認証を実装する + ハンドラーでユーザーの情報を取り出す

Spring Security の WebFlux Security Configuration という公式のドキュメントにあるセクションにも書いてあるのだが、ユーザー認証の実装はこれまでの Spring Security にある UserDetails の Reactive 版である ReactiveUserDetails を実装したオブジェク…

Spring Web Flux を少しさわってみただけの話

Spring 5 から Reactive Web というのになるらしく、サーバーの性能が落ちにくくなると聞いた(違うかもしれない)ので、 家で試してみることにした。 環境 Spring Boot: 2.0.0.RC1 Java: 1.8 ビルドファイル 以下の curl コマンドで取得できるもの curl https…

同一のURLに同じHTTPメソッドで異なるパラメーターを送った時に異なるメソッドを割り当てる

同じURL(/foo/bar)に異なるメソッド(baz(Baz baz) と qux(Qux qux) の二つのメソッド)を割り当てる方法 @Canonical class Text { String text } @Canonical class Bidirecional { String question String answer1 String answer2 } @Canonical class Result<T> </t>…

spring-security-oauth を用いて実装したリソースサーバーでのトークンの有効期限

spring-security-oauth を用いてリソースサーバーを実装する場合、 tokenServices という名前の ResourceServerTokenServices を実装するクラスのビーンを作ります。これを実装する時に気をつける必要があるのが、 ResourceServerTokenServices に、 loadAut…

Spring Boot CLI にて Spring Security OAuth2 によるリソースサーバーの実験

Spring Security OAuth2 を用いたリソースサーバーを、データベース連携で実装するパターンの実験をしてみた。 spring-security-oauth のドキュメント の Resource Server Configuration の部分を読むとリソースサーバーの実装については、次のように書いて…

Spring MVC で日本語URLにリダイレクトするとURLが文字化けしてしまう場合の対処

Spring MVC で日本語を含むURLにリダイレクトすると… @GetMapping(path = "bar") String somePage() { return "redirect:/to/日本語url"; } $ curl -v http://localhost:8080/foo/bar * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) por…

Spring Rest Repositories + JPA で @ManyToOne で指定されているフィールドを用いて検索するリクエストを投げる

ドキュメント探しても、ググってもstack overflowを探しても明確に書かれていなかったっぽいので(本来的には hal の仕様を見るのが正しいかもしれない) 次のような二つのエンティティが存在するものとする。 @Entity class Book { @Id private Integer id; p…