このエラーの対応方法 org.im4java.core.CommandException: convert: no decode delegate for this image format
本家はこちら
macでim4javaを使おうとしたらこんなエラーが
org.im4java.core.CommandException: convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/509.
どうやらコーデックに対応していないとのこと。 Linuxでの対応サイトでは、ソースからインストールすればいいとのことなので、brewでもそれをやる
$ brew remove imagemagick
$ brew install imagemagick --build-from-source
コンパイルに時間はかかるけど、これでいけます。
Spring Webfluxでのinterceptorメモ
本家はこちら
Spring WebfluxはServlet使えないのでInterceptorとかないらしい。
Spring WebfluxではWebFilterを使うらしいので、メモ。
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.web.server.WebSession;
import reactor.core.publisher.Mono;
@Configuration
@Component
@Slf4j
public class SampleWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange)
.doOnRequest(value -> onRequest(exchange))
.doOnSuccess(done -> onSuccess())
.doOnSuccessOrError((success, error) -> onSuccessOrError());
}
// controller前に呼ばれる
private void onRequest(ServerWebExchange exchange) {
log.info("{}", exchange);
Mono<WebSession> session = exchange.getSession();
log.info("{}", session);
SecurityContext context = SecurityContextHolder.getContext();
log.info("{}", context);
log.info("onRequest");
}
// exception発生しないときに呼ばれる
private void onSuccess() {
log.info("onSuccess");
}
// exception発生しないときに呼ばれる
private void onError() {
log.info("onError");
}
// 成功でもエラーでも呼ばれる
private void onSuccessOrError() {
log.info("onSuccessOrError");
}
}
リクエストの中身もとれるのだが、thread localを使わないほうがいいらしいので、そこで処理したものはどうしたらいいんだろ...
doOnEach()
と doOnSuccessOrError()
の違いはまだわかってないw
Spring5 Reactive(webflux)での@validのBindingResultの書き方かわってたのでメモ
本家はこちら
もしかしたらwebflux関係ないかもだけど、Spring5 Reactive触ってたら、(@valid Form form , BindingResult bindingResult)
こんなのが動かなくて調べたらメソッドとして独立するようになっていた
こんな感じ。 modelも引数にとれるので、viewを使ってるときは、これで対応可能。
@ExceptionHandler(WebExchangeBindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Object handleException(WebExchangeBindException errors, Model model){
Response response = new Response();
response.setErrors(errors.getBindingResult());
return response;
}
JJUGナイトセミナーのメモ(これからのJavaのライセンス・サポート)
本家はこちら
6/20 JJUGナイトセミナー 『JJUG ナイトセミナー 「緊急特集! Javaの無償版はなくならないぞ!」』のメモ。
興味あるところだけまとめ。
JDK8まで
OpenJDK
OracleJDK
JDK9以降
OpenJDK
OracleJDK
JDK11以降
OpenJDK
- バイナリ提供あり
- リリース: 3月と9月
- アップデートリリース: (セキュリティパッチ配布) 1,4,7,10月に提供
- サポート: (無償) 次のリリースがでたら終了、移行期間なし
- ライセンス: GPL V2 + classpath exception
OracleJDK
- バイナリ提供あり
- リリース: 3年ごと
- アップデートリリース: (セキュリティパッチ配布) 1,4,7,10月に提供
- サポート: (有償)最長8年
- JavaFX,JFR/JMC, installer etc... OpenJDK11からそちらにマージ
- ライセンス: BCL
ということで、無償だとサポート期間が短すぎて、有償だと長いけど、費用かかる。 Java諦めるか?ってなるけど、いいJDKがリリースされる
AdoptOpenJDK
これを使うことが多くなるのではないだろうか? サポート: JDK8 2022/9まで ライセンス: Apache License, Version 2.0. OpenJDK code itself is licensed under GPL v2 with Classpath Exception. スポンサー: IBM , ロンドンJUG , MicroSoftとか。。。 (https://adoptopenjdk.net/sponsors.html)
と、OpenJDKとOracleJDKでは帯に短し襷に長しな感じだったが、AdoptOpenJDKがかなり有力になるんじゃないかなーと思う。
間違ってたらツッコミをお願いします
awsのlambdaをserverless framework runtime Java8の環境構築
本家はこちら
AWSのlambdaをserverless frameworkでJavaで動かそうとしているので、環境構築メモ
serverless frameworkインストール
まずはnpmでインストール
$ npm install -g serverless
templateプロジェクト作成
今回は、aws-gradle-java
で作ることに
$ serverless create --template aws-java-gradle --path ${プロジェクト名}
$ cd ${プロジェクト名}
ローカル環境で実行
Javaプロジェクトをビルドしたあとにローカル環境で実行してみる hello というエンドポイントが設定されてるので、これで実行してみる
$ serverless invoke local --function hello
Serverless: In order to get human-readable output, please implement "toString()" method of your "ApiGatewayResponse" object.
log4j:WARN No appenders could be found for logger (com.serverless.Handler).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
com.serverless.ApiGatewayResponse@475530b9
こんな感じで、Javaが実行される
awsのアップロード等は次回
dockerのmysqlでCan't create/write to file '/var/lib/mysql/is_writable'
本家はこちら
Macでmysqlをdockerを動かしてるとこんなのがでていた。どうやらpermissionが原因らしく、下記をセットすると動作したので、一旦メモ
下記でエラー
services:
db-data:
container_name: mysql-data
image: busybox
volumes:
- ./volume-data/mysql:/var/lib/mysql:rw
web:
image: nginx:1.13.12-alpine
ports:
- "8080:80"
db:
container_name: mysql-db
image: mysql:5.7
volumes_from:
- db-data
environment:
MYSQL_ROOT_PASSWORD: spring_boot_root
ports:
- "3306:3306"
dbのところで、user: "100:50"
を追加する
services:
db-data:
container_name: mysql-data
image: busybox
volumes:
- ./volume-data/mysql:/var/lib/mysql:rw
web:
image: nginx:1.13.12-alpine
ports:
- "8080:80"
db:
container_name: mysql-db
image: mysql:5.7
user: "1000:50"
volumes_from:
- db-data
environment:
MYSQL_ROOT_PASSWORD: spring_boot_root
ports:
- "3306:3306"
これで無事起動できた
SpringBoot2.0で There is no PasswordEncoder mapped for the id "null" エラーが...
本家はこちら
SpringBoot2.0でいろいろ試してたら、 起動時にThere is no PasswordEncoder mapped for the id "null"
のエラーがでてた。
どうやら、passwordencoder設定されてないとでるらしい。
DeprecatedだがNoOpPasswordEncoder
というのがあるので、こちらをセットしたら起動できた。
@Configuration
@EnableWebSecurity
@ComponentScan
public class WebSecruityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().access("isAuthenticated()")
.and()
.formLogin()
.and()
.rememberMe();
}
public void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.inMemoryAuthentication()
.withUser("hoge")
.password("fuga")
.authorities(Collections.emptyList());
}
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
}