怒Mは思いつきでモノを言う

やったことメモなどなど

Fn Projectについて調べて見た。③

前回はfn invokeで失敗しまいました。

do-m-gatoru.hatenablog.com

原因はFn Serverのバージョンが古かった

調べても同じ様なバグ報告がなかったので、環境がおかしいと考えました。
Fn CLIbrewを使うことでアップデートできますが、Fn Serverのバージョンは7月にインストールした時点のバージョンから変わりません。
Fn CLIの内容を改めて確認しみました。

$ fn help
Fn Command Line Tool  -  Version 0.5.15
                                 
ENVIRONMENT VARIABLES
  FN_API_URL      Fn server address
  FN_REGISTRY     Docker registry to push images to, use username only to push to Docker Hub - [[registry.hub.docker.com/]USERNAME]
               
GENERAL COMMANDS
  version         Display Fn CLI and Fn Server versions
  help, h         Shows a list of commands or help for one command
  
DEVELOPMENT COMMANDS
  build, bu            Build function version
  bump, bm             Bump function version
  call, cl             Prompts for migration.
  deploy, dp           Deploys a function to the functions server (bumps, build, pushes and updates functions and/or triggers).
  init, in             Create a local func.yaml file
  invoke, iv           Invoke a remote function
  migrate, m           Migrate a local func.yaml file to the latest version
  push, p              Push function to docker registry
  
MANAGEMENT COMMANDS
  config, cf           Set configuration for an object
  create, c            Create a new object
  delete, d            Delete an object
  get, g               Get an object to retrieve its information
  inspect, i           Retrieve properties of an object
  list, ls             Return a list of created objects
  unset, un            Unset elements of a created object
  update, up           Update a created object
  use, u               Select context for further commands
  
SERVER COMMANDS
  build-server         Build custom Fn server
  start                Start a local Fn server
  stop                 Stop a function server
                
GLOBAL OPTIONS
  --context value      Use --context to select context configuration file
  --registry value     Use --registry to select registry
  --verbose, -v        Use --verbose to enable verbose mode for debugging
  --help, -h           show help
  --version            Display version
                         
FURTHER HELP:  See 'fn <command> --help' for more information about a command.
                       
LEARN MORE:    https://github.com/fnproject/fn

管理コマンドupdateというのがあるではないですか。
節穴でした。(この時点でServerは0.3.495)

$ fn update server
Using default tag: latest
latest: Pulling from fnproject/fnserver
〜中略〜
Status: Downloaded newer image for fnproject/fnserver:latest
2018/10/11 23:59:08 Process finished gracefully

$ fn version
Client version is latest version: 0.5.15
Server version:  0.3.595

無事に更新ができました。
fn startしてfn invokeを確認します。

$ fn deploy --app myapp --local
Deploying fntest to app: myapp
Bumped to version 0.0.15
Building image fntest:0.0.15 
Updating function fntest using image fntest:0.0.15...

$ fn invoke myapp fntest
Hello, world!

やっと出ました!嬉しい!

Fn の更新手順

Fnを更新する際は以下の順番で更新した方が良いです。

  1. brew upgrade fnでFn CLIを更新
  2. fn update serverで Fn Serverを更新

Fn Projectについて調べて見た。②

前回はInstall Fnまでやりました。
今回はJavaのIntroductionをやります。

まずは Fn CLI の更新

fn run を実行してもエラーになってしまいます。 そもそも何のコマンドだったか思い出せずGitHubを確認したら、runコマンドは壊れてるらしいです。

github.com

約3ヶ月ぶりなので、まずはFn CLIを更新します。
(2018/10/6時点でver0.5.8)

$ brew upgrade fn

Functionの作成

$ fn init --runtime java --trigger http fntest
Creating function at: /fntest
Function boilerplate generated.
func.yaml created.

実行後、以下の様にディレクトリ、ファイルが作成されます。

fntest
├── func.yaml
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── example
    │               └── fn
    │                   └── HelloFunction.java
    └── test
        └── java
            └── com
                └── example
                    └── fn
                        └── HelloFunctionTest.java

func.yamlの中身

schema_version: 20180708
name: fntest
version: 0.0.1
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk9-1.0.72
run_image: fnproject/fn-java-fdk:jdk9-1.0.72
cmd: com.example.fn.HelloFunction::handleRequest
format: http-stream
triggers:
- name: fntest-trigger
  type: http
  source: /fntest-trigger

yamlにはFunctionに関するメタデータが含まれています。

Fn Introductionより抜粋

  • schema_version–identifies the version of the schema for this function file.
  • version–the version of the function.
  • runtime–the language used for this function.
  • cmd–the cmd property is set to the fully qualified name of the function class and the method that should be invoked when your javafn function is called.
  • build_image–the image used to build your function’s image.
  • run_image–the image your function runs in.
  • format–the function uses JSON as its input/output method (see: Open Function Format).
  • triggers–identifies the automatically generated trigger name and source. For example, this function would be executed from the URL http://localhost:8080/t/appname/gofn-trigger. Where appname is the name of the app chosen for your function when it is deployed.

Functionのバージョンや言語のほか、Functionが呼び出された時に実行されるメソッドなどが記載されています。

FunctionをDeploy。しかし、失敗。

$ fn deploy --app myapp --local
Deploying fntest to app: myapp
Bumped to version 0.0.5
Building image fntest:0.0.5 
Updating function fntest using image fntest:0.0.5...

Fn: Invalid format on Fn

See 'fn <command> --help' for more information. Client version: 0.5.8

なぜかデプロイができません。
ビルドしてみます。

$ fn build
Building image fntest:0.0.5 
Function fntest:0.0.5 built successfully.

ビルドは成功します。

func.yamlで問題の切り分けをする。

以前(2018/7/2時点)のyamlとの違う点をいじってみました。 format http-streamの箇所をformat httpに変更しています。
(versionは試行錯誤の跡ですw)

schema_version: 20180708
name: fntest
version: 0.0.11
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk9-1.0.72
run_image: fnproject/fn-java-fdk:jdk9-1.0.72
cmd: com.example.fn.HelloFunction::handleRequest
format: http
triggers:
- name: fntest-trigger
  type: http
  source: /fntest-trigger

デプロイしてみます。

$ fn deploy --app myapp --local
Deploying fntest to app: myapp
Bumped to version 0.0.11
Building image fntest:0.0.11 
Updating function fntest using image fntest:0.0.11...
Successfully created function: fntest with fntest:0.0.11
Successfully created trigger: fntest-trigger

成功しました。
format http-streamに問題があるのか、やり方やインストール時に問題があったのかはわかりません。 チュートリアル通りにfn initするとやはりformat http-streamfunc.yamlが作成されます。
(client ver0.5.15で再確認済み)

Functionを呼び出す。しかし、失敗。

$ fn invoke myapp fntest

Fn: Fn invoke url annotation not present, fnproject.io/fn/invokeEndpoint

See 'fn <command> --help' for more information. Client version: 0.5.15

なぜすんなり行かないのか。
7月上旬にチュートリアルを一通りやった時には、こんな困らなかったのですが。
ソース読んでエラー発生箇所は分かりましたが、どうしたらいいのかサッパリです。
もう少し調べます。

備忘

fn invoke
format http-stream

JJUGナイトセミナー「Javaの言語仕様策定とリリースモデルを学ぼう」に行ってきた。

リリースモデルが変わったという話しはチラホラ耳にしていましたが、
ちゃんと知らなかったので、参加しました。
本日は3本立て。

「新しいJDKリリースモデル解説」by 伊藤 敬さん

www.slideshare.net

セミナーは今回用の更新版スライドだったと思います。
公開され次第、貼り直します。*1

OpenJDKとOracle JDKの関係を正しく理解していなかったので、 今回の説明で理解することができたのは良かったです。

リリースモデル変更による、 OpenJDKとOracle JDKのバイナリの状態やサポート内容について対比して説明されていたので、 非常にわかりやすかったです。

Oracle JDKは原則有償サポートですが、 「開発・テスト・試作・デモの利用目的であれば無償で利用可能になる予定」とのことでした。
※「予定」なので、変更の可能性がある点はご注意ください。

Oracle JDKのLTSに対応するバージョンの他に、OpenJDKと同様に各バージョンが有償でリリースされるようです。 てっきり、3年毎のバージョンアップだけかと思っていました。

Oracle Java SE Subscriptionについても話題がありました。
購入は年単位で購入する必要があり、購入するとライセンス、サポート、商用機能の利用が可能になるようです。 対象はデスクトップとサーバで、それぞれ料金体系が公開されています。 2018年7月17日現在はドルの料金表だけですが、近日中に円の料金表が公開されるとのことです。

Java SE Subscription FAQ

質疑応答の内容です。間違っていたら指摘ください。

Q1. 有償サポートを打ち切った後のOracle JDKバイナリの使用権はどうなるのか?
A1. 確認します。
(2018/7/20追記)
FAQに記載がありました。 オラクル Java SE Subscription FAQ

サブスクリプションを更新しない場合はどうなりますか?
Java SE Subscription が終了した時点で、 Java SE Subscription が有効だった期間にダウンロードしたすべての商用ソフトウェアの権利とオラクル Premiere サポートへのアクセスが終了します。もし Java SE Subscription を継続する意思がない場合、 Java SE Subscription が終了する前に、使用中の Java SE アプリケーションをオラクルの OpenJDK バイナリ (GPLライセンス)に移行することをお勧めします。これによって中断することなく、引き続きアプリケーションを実行することができます。

Q2. Deprecatedになった機能はLTSのバージョンであればアップデートリリースはされるのか?
A2. わからない。多分だが、そのような状況にならないように考慮すると思います。

Q3. JREはどうなる?
A3. JREは無くなります。JDKに内容されているJREを使うことになる。なので、今後はJDKをインストールしてもらう。

「これからのJCPについてー活動内容のアップデート」 by Naoko Hamamoto さん

JCP = Java Community Process
「JSR = Java Specification Requests」
JCPとはJSRを通じてJava技術規格を開発、改定するためのオープンなプロセスです。
JSRは誰でも提案は可能ですが、Excecutive Community(EC)の投票による承認が必要です。
JCPの運営プロセスもJSRで決まり、現在改訂版を提案しているところ。(JSR387)

JCPへの参加は簡単に個人でもできるので、ぜひ参加してほしいとのこと。

Java新機能観察日記 by きしだなおきさん

www.slideshare.net

Java開発プロセスの実態の印象として、JCPはカヤの外の印象があるらしい。
理由としては、OpenJDKはコードをガンガン書いて仕様を固めていく感じになっていて、 仕様を決めてからコードという現在のJCPのプロセスに合っていない感じがある。
JCPのプロセス改定には「Code first」が盛り込まれているので、今後はもっとJCPが絡むようになるかもしれません。
この辺、浜本さんがどう考えているのか聞いてみたかったです。友人の誕生会に行くのに懇親会は欠席したので。。

最新の動向や決定までの裏事情なんかは、メーリスなどを見ることでわかるので楽しそう。

最後に

会社内でリリースモデルについての説明とかやってみようかなー。
後、Type-CからVGAに変換するアダプタは需要があって、普段使わなくても持っているといざという時にモテる。

*1:公開されたためスライドを差し替えました。2018/7/20