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

やったことメモなどなど

JJUGナイトセミナー「Oracle Groundbreakers APAC Tour in Tokyo」に行ってきた。

jjug.doorkeeper.jp

行ってきました。
何度も言っていますが英語はからっきしですので、内容が入ってくるかは不安でした。
案の定からっきしでしたが、メモれた内容は残しておこうと思います。

Java TrackとDevOps/DB Trackが行われていましたが、私はJava Trackのみを聞いていました。
誰かがレポート書くかな?

Oracle Groundbreakersとは?

community.oracle.com

twitter.com

コミュニティに貢献している開発者達という感じ?
世界各国を周って今回のようなセッションを行ってくれているようです。
※間違ってたら教えてください。

Serverless, the future of the Cloud (Bert Ertman)

www.slideshare.net

↑のスライドにはないですが、「Serverless removes 'R' from ComputeR」というのがありました。

computerの意味・使い方 - 英和辞典 Weblio辞書

computeの意味・使い方 - 英和辞典 Weblio辞書

多分説明してくれていたと思うんですけど、聞き取れていません。
「コンピューター」を意識することなく、「計算する」ことだけを意識できるようになる、と解釈しました。

landscape.cncf.io

上記のサイトを紹介していました。
Severlessに関わらずCloud Native Trail Mapとして参考になりそうです。
結構頻繁に更新されているようです。

デモでEclipseからAWSに連携していたようですが、そんなこともできるんですー。
今更ながらに知りました。

AWS Toolkit for Eclipse | AWS

あとは、Bert氏はSTAR WARSが好きそうだということは察しました。

Java in a World of Containers(David Buck)

日本語セッションでしたw
内容はJava Day Tokyo [JSE-1]と同じ感じでした。
仕事で使う機会は今のところ全くないのですが、jlinkについてはやはり、今後ちゃんと学ぶ必要がありますね。

DockerでJavaで動かす際にCPU、メモリをちゃんと割り当てられるようになりました。その内容はJDK8にバックポートされたとのことです。

@Mitsuyuki Shiibaさんが試されています。 bufferings.hatenablog.com

個人的にはDavid氏から聞けるちょっとした小ネタが好きです。

OpenJDK: Portola Project

今回はAlpineに関するProject Portolaが、
何で「Portola」になったかという話し。

www.google.com

地図を見ていただくと分かるのですが、Portolaという道がAlpineという道に合流しています。
「PortolaはAlpineに繋がっている」という意味のようですが、そのようにこじつけたらしいw

Microservices Gone Wrong! (Bert Ertman)

www.slideshare.net

Google翻訳をエディタとして、スライドでわからない単語や文章をひたすら打ち込んで、何の話をしているかを理解するのに費やしました。
リスニング云々ではなく、単語の意味が全くわからないのは、ダメすぎるなと実感しました。

Microservicesは聞いたこともあって、雰囲気はフワフワっと知っていましたが、基礎のような内容だったので、あとでじっくり見返してみたいと思います。

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

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

Fn ProjectのTutorialを通して知った内容をメモります。
不明点はソース見ながら調べるので、ゆっくりやる予定です。

Fn Project について

Fn ProjectオープンソースのFaaSプラットフォームです。

Fn Projectの特徴については@hhiroshell氏が本家を和訳してくれていますので、そちらを参照していただくのがいいと思います。

Fn Projectは4つのコンポーネントで構成されています。

  • Fn Server
  • Fn Load Balancer
  • Fn FDK's
  • Fn Flow

今回は、Fn ServerとFn FDK(Java)を使ってTutorialをやってみます。

Tutorials

準備インストール

Docker

Before you Begin Before we can install Fn you’ll need:

  1. A computer running Linux or MacOS. If you have a Windows machine the easiest thing to do is install VirtualBox and run a free Linux virtual machine.
  2. Docker 17.10 (or higher) needs to be installed and running.

私の実行環境はMac上で動かすので、Dockerをインストールします。

Docker Store

Fn CLI

Homebrewがインストールされれば、以下のコマンドでインストールされます。

$ brew install fn

Linuxでは以下のコマンドでインストールできます。(Macでも大丈夫)

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

インストールできたか試してみましょう。
以下のように出たらOKです。
初回はローカルにfnserverのDockerイメージがない場合は、Docker Hubから取得します。

$ fn start

Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver

(中略)
        ______
       / ____/___
      / /_  / __ \
     / __/ / / / /
    /_/   /_/ /_/
        v0.3.495

time="2018-06-30T11:42:17Z" level=info msg="Fn serving on `:8080`" type=full

Dockerがインストールされていない or デーモンが動いていない場合は以下のエラーが出て失敗します。

$ fn start
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
2018/06/30 19:54:58 Error: processed finished with error exit status 125

fn start 実行時には Dockerイメージ fnproject/fnserver を使って fnserver というコンテナを生成・起動します。

新人にJJUG CCCが楽しかったことを話してみた。

JJUG CCCに行ってから、社外でのコミュニティ参加が楽しいよって話を社内新人向けしてみました。
興味を持ってくれた人が数人いたので、やってよかったです。

「Java Day Tokyo 2018」に行ってきた。③

2018年5月17日(木)に開催されたJava Day Tokyo 2018に行ってきました。 基調講演は途中から参加で、用事があった夕方頃までセッションを聞きました。 で、気になった点をメモ書き。ラスト。書くの遅くなりました。

[TEC-4] Java in Serverless Land

Serverlessとはサーバを管理しなくてよく、サーバを意識せずにアプリケーションが作れる という特徴を持つアーキテクチャです。 Function as a Service(Fass)はServerlessアーキテクチャの1つです。
FaaSは短命(Short-lived)で、状態を持たず(Stateless)、イベント駆動型(Event Driven)というのが特徴です。

Serverlessで使用されているプログラミング言語の内訳は以下のような状態です。

lang %
1 Python 35%
2 JS 35%
3 Java 10%

ServerlessにおいてJavaが何故利用されていないのでしょうか。

  • ServerlessでJavaを使用することはできますか?⇨Yes!
  • FaaSはWebのスクリプト言語以上の物ですか?⇨Yes!
  • FaaSにJava開発の習慣を使用できますか?⇨Yes!
  • JVMが短命のアプリケーションを効果的に実行できますか?⇨Yes!

今日の成長したJava開発はどのように見えているでしょうか。

  1. 普通のJavaを使用したプログラム
  2. オープンソースの強力な受け入れ
  3. 利用可能なツール/ライブラリの豊富さ
  4. 複雑なアプリケーション
  5. JVMを効果的に使用する

Fn ProjectはオープンソースのFaaSプラットフォームです。 これはJavaで簡単に導入・使用することができます。

Fn Flowは以下の特徴があります。

  • 信頼性の高いスケーラブルなアプリケーションを構築できる
  • 豊富な並列処理オプションをサポート
  • 関数でワークフローを定義できる
  • 関数は純粋にコードとして書かれる

Fn FlowはJDK8のCompletionStage APIに着想を得ています。
CompletionStageは、非同期アクションのワークフローはメモリに構築され、ForkJoinPoolを使用して非同期にて完了します。
Fn Flowは非同期のワークフローはFlow Serverで構築され、FaaSを使用して非同期に完了します。

これまで、CompletionStage APIで行なっていたことを、Fn Flowで出来ます。

Fn Functionは単なるコンテナです。 私たちは、早く起動し、コンテナイメージを小さく、環境を汚さないことを望んでいます。

早く起動するためにメモリをJVMとシェアします。 また、起動アクティビティをキャッシュして、起動時間を短縮します。(CDS、AppCDS、AOT)

コンテナイメージを小さくするために、Alpineを使ったり、jlinkで不要なJDKモジュールを排除したり工夫をします。

最後に

Fn Projectが面白そうなので、とりあえず動かしてみよう。