ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

このエラーの対応方法 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

  • バイナリ提供なし
  • パッチは反映したりしなかったり
  • ライセンス: GPL V2 + classpath exception

OracleJDK

  • バイナリ提供あり
  • パッチはOracleで開発
  • JavaFX,JFR/JMC, installer etc... を追加
  • ライセンス: BCL

JDK9以降

OpenJDK

  • バイナリ提供なし => バイナリ提供あり(Oracleがビルド)
  • パッチは反映したりしなかったり
  • ライセンス: GPL V2 + classpath exception

OracleJDK

  • バイナリ提供あり
  • パッチはOracleで開発
  • JavaFX,JFR/JMC, installer etc... OpenJDK11からそちらにマージ
  • ライセンス: BCL

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

https://adoptopenjdk.net/

これを使うことが多くなるのではないだろうか? サポート: 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'

本家はこちら

Macmysqlを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();
    }

}