mike-neckのブログ

Java or Groovy or Swift or Golang

az コマンドあんちょこ

あんちょこは誰かが作っているものだし、それを見ればだいたい分かることがおおいのだが、自分でやってみるのとそうでないのとで天と地ほどの経験の差ができるので、az コマンドのあんちょこを作ることにした。なお、内容は随時更新予定。

libcurl の curl_multi_socket_action のメモ

Swift の URLSession の中で呼び出されている curl_multi_socket_action の動作を調べていたので、そのメモ。

Gradle で BOM を扱う

Spring の dependencyManagementPlugin は使わないで、これをやる方法。

Reactor の Flux を flatten する3つのパターン

ここ最近 Reactor をいじって一定間隔の無限ストリームを生成するなどしていたこともあって、まとめることにした。タイトルに数字が入っていると読まれやすいっぽいので、タイトルには「3つのパターン」と書いたが、実際に flatMap 、 flatMapSequential 、 …

Swift で Foundation を import するとヘッダーまわりでエラーが発生する場合の対処

以前書いたエントリー mike-neck.hatenadiary.com の対処法が間違えていて、ビルドもなにもできなくなった上に、 REPL で import Foundation をやっても同じエラーが出てしまう割と深刻な状況の対処法。 (巷にある ~/Library/Developer/Xcode を消すやつが何…

Spring WebFlux の Router Function のテスト

久々に Spring WebFlux を書いてたのだが、いまいちルーティングがうまくできず、 Routing Function に対してテストを書いてみることにした。 で、テストの書き方を調べてみたのだが、とりあえず何も見つからなかった(サーバーを起動するパターンは見つかっ…

Swift Package Manager が Objectiv-C module 'Darwin' をビルドできなかったときの対策

Swift Package Manager が不調(?)で、 swift package generate-xcodeproj すると、コケる 【2018/08/05 22:27 追記】この方法は正しくない。正しい対処の仕方は不明。 $ swift --version Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2) T…

Netty で HTTP クライアントを記述する

Netty で HTTP クライアントの書き方を調べてみたら、意外なことにほとんど見つからなかったので、ブログに書くことにしました。 ChannelInitializer Pipeline に加えるハンドラーと順番は次のとおり SslHandler HttpClientCodec HttpContentDecompressor Ht…

Swift-NIO で HTTP Client を書いてみる

この前の土日に Swift-NIO を使って HTTP Client を書いてみたが、うまく動かなかった。 Bootstrap 基本的には Netty と同じ。 ClientBootstrap のイニシャライザーを呼び出して、 EventLoopGroup と ChannelOption と ChannelInitializer(Channel -> EventL…

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>…