さわらブログ

さわら(@xhiroga)の技術ブログ

Javaでフォーク/ジョインやったらReal時間 < CPU時間になった

現場でマルチスレッド処理を手がけており、それ関係のFWを触っていたら面白いことを知ったのでメモ。

Javaのマルチスレッド FWとは

Javaでは昔からマルチスレッドでプログラミングするためのクラスが用意されていたが、Java5とJava7から新しいFWが出てきた。

f:id:hiroga_cc:20171129221704j:plain

整理すると...
Java5で実装
- タスクの非同期処理周りを隠蔽するExecutorService
- ↑のインターフェースの実装クラスを生成するExecutorsクラスとnew***(); メソッド
Java7で実装
- ExecutorServiceインターフェースを実装したForkJoinPoolなどのクラス。newで生成可能。

トランザクションを非同期で発行するだけならJava5までのやり方のほうが(オーバーヘッドがなくて)よく、 再帰的な(=スレッドを無数に生成する)処理ならフォーク/ジョインを使うのがよいらしい。

参考:
multithreading - Java's Fork/Join vs ExecutorService - when to use which? - Stack Overflow

今回はJava7で追加された前者でいきます。

パフォーマンス測定手法

マルチスレッドのプログラムのCPU時間の測り方を見るのが目的!
フィボナッチ数列をシングルスレッド/マルチスレッドでそれぞれ計算するプログラムを作りました。
これらをターミナルから実行し、timeコマンドで測定します。
シングルスレッドとマルチスレッドの性能比較ではないので悪しからず

作ったプログラム

シングルスレッド版
gist.github.com

マルチスレッド版
gist.github.com

計測結果

$ time java Fib
1134903170(←注:計算結果)

real    0m7.859s
user    0m7.429s
sys 0m0.167s

$ time java Fib7
1134903170

real    0m30.679s
user    1m40.597s
sys 0m0.863s

シングルスレッドではreal ≒ user + sys なのに対し、マルチスレッドでは real > user + sys である。これはどういうことか。

なぜReal時間 < CPU時間なのか

要するに各スレッドで使用したCPU時間の合計が表示されるらしい。

参考にさせていただいた記事。
real time/user CPU time/system CPU timeの違いをメモ | Siguniang's Blog

参考資料

Oracleさんのドキュメント

Executors (Java Platform SE 7)

ExecutorService (Java Platform SE 7)

ForkJoinPool (Java Platform SE 8)

実装の参考にさせていただいたブログ記事

ExecutorServiceを使って、Javaでマルチスレッド処理 - Qiita

Java で簡単マルチスレッドプログラミング - にょきにょきブログ

Fork/Join Frameworkでフィボナッチ数を求める - Qiita

JJUG CCC 2017 Fall初参加&ボランティアレポート

JJUG CCC(ジェイジャグ シーシーシー=日本 JavaUserGroup クロスコミュニティカンファレンス)に参加してJavaの見方が変わった( ´ ▽ ` )ノ
実はJavaってダサいイメージがあったけど、JJUGから一夜明けて「Javaもすごいんだな〜」と思ってます。

きっかけ

職場でモックプログラムの新規作成を担当したのがきっかけ。 現在SIerで入社3年目、開発にアサインされたのが2年目の半ばなのでエンジニア歴は正味1年ちょいくらい。
しかも去年までは既存プログラムの改修をやっていて、そんなにプログラミングの能力が必要なかった。
(既存の改修なので、分からない事があっても近くのコードに合わせて書けば何とかなる)

ところがいざ新規作成となって、3年目なのに分からなくなっていて恥ずかしい事が大量に出てきた。
Javaのmainクラスの作り方、コマンドラインからコンパイルして実行する方法、JDBCドライバの使い方...etc。

そういう状況になって、これまでJavaの勉強をダサいと敬遠していた*1 のが恥ずかしくなり、「いっちょ勉強会とか出てみるか」と思ったのがきっかけ。

参加するまで

ぶっちゃけ行っても話の内容が分かんなくて(´・ω・`)になりそうだったので、ボランティア枠は速攻申し込んだ。
JJUG CCCのメンバー登録したら、たまたま数日後にJJUG CCC 2017 Fallのボランティアの通知が来た。
イベントスタッフとか好きなのもあって速攻登録。その後すぐ満員になってしまった(ただし繰り上がりはあったぽい)

ボランティアスタッフの説明会とかその後の飲み会とか行ったりした。
(これは正解だった。初めてのカンファレンスで、顔を知っている人がいるのは嬉しい!)

公式サイトのタイムスケジュールも見て、参加したいセッションがないかチェックした。
正直半分くらいしかタイトルの意味が分からなかったけど、 「あっ、Spring Bootって先輩が言ってた」とか「KotlinってAndroidの開発言語になったやつだっけ?サーバサイドで使えるの?」とかで申し込んだ。

参加してみて

JavaとかJVM言語を使っているかっこいい大人がたくさんいてイメージが変わった!
ほんと恥ずかしいんだけどJavaってSIの現場で使っているイメージしかなくて、かつSIの現場って「プログラミング大好き!」って人ばっかりでもないからイメージ悪かった。

でも登壇者さんの所属とか協賛企業とか見てみて、「えっ!こんなベンチャー企業が?」みたいにびっくりした。
例えばSmartNewsさんやビズリーチさん、サイバーエージェントさんなど。

ちなみにその感想をJJUGの偉い人に(ボランティアスタッフの打ち上げで)正直に言ったら、優しく笑いながら「やっぱり?」って言われた。

ボランティアスタッフはやっぱり正解だった!
ボランティアとはいえ午前の担当だったから午後はほぼ自由にセッション参加できたし、一緒のシフトの人と仲良くなれた!(セッションも一緒に見に行った)
懇親会とかも、知らない人に話しかけるのも楽しかったけど、顔を知ってる人がいた方が安心するよね〜😊

あとはいつものようにTwitter実況してた。#jjug_ccc でたくさん出てくるよ。

f:id:hiroga_cc:20171119164438j:plain
お絵かきとかもしてた

セッションから

サーバサイドKotlin はKotlinの話だった!
JVM言語ではScalaとKotlinの二つがよく話題に上っていたけど、KotinはScalaほど尖っておらず、でもJavaよりイケてるらしい。
家で実際にやってみたら確かに文法は楽チンだった。

ゴールドマン・サックスにおけるCamundaを用いたビジネスプロセスの可視化とワークフローの自動化 で何が驚いたって、副社長さんが出てきたところ!
GSの技術チームは何と全社員の25%以上らしい。力を入れてるのねえ。
あとはCamundaというワークフローシステムをGUIベースのダッシュボードから自動生成するソフトウェアの紹介。
ワークフローをバージョン管理ツールで管理できるのは綺麗でいいな〜。もっとも、普通の日本企業がそういうの導入するのって想像が難しいけど。

オレオレJVM言語を作ってみる(四則演算するだけだけど)では言語の仕組みがちょいわかった。

Spring BootとKafkaでCQRSなアプリを動かしてみる は登壇者さんの話し方のせいかすごいホッコリした。
その登壇者さんがこんなことを言ってました。

その通りだな〜。心がけよう。

まとめ

Javaでもいろんな新しい動きがあり、世の中でこれからも使われていく言語なんだな〜ということが分かって良かった。
現場で普通にシステム開発しているだけだと視点が下がってしまうと思った。
次回の2018 Springも楽しみ!

*1 「家でJavaとか書きませんよ〜笑」 とか言ってた。代わりにアプリ作ったりハッカソン出たりしてた(それでプログラミングが身についたかは怪しい)

First Aidがクリックできない場合(Macbook起動時に「?」マークの対応)

Macbookを起動したら「?」マークのついたフォルダのイラストが点滅しており、起動できなかった時の対策です。

f:id:hiroga_cc:20171119093655j:plain

基本的にはAppleのウェブサイトの手順通りに対応します。 support.apple.com

First Aidがクリックできない

ディスクユーティリティからFIrst Aidがクリックできない場合、「View > Show All Divices」(日本語版だとなんて書いてあるかは知りません)を選択。
そうするとディスクユーティリティ左側の内臓デバイスに「Macintosh HD」がツリー上に表示されます。
クリックすると暗号化されたディスクのロックを解除するように指示されるので、その通り操作するとFirst Aidがクリックできるようになります。

ARstudioやってみた&ハマりどころ(ソースもあるよ👻)

Facebook AR studioがめっちゃ楽しい。
超簡単にカメラエフェクトが自作できる。

f:id:hiroga_cc:20171115230527p:plain
この涙が顔の動きについてくる。

作ってみたので試してみてください😊
Napstablookのカメラエフェクト
最後にソースもあるよ。

ハマりどころと個人的な対策

※ 2017年11月現在、ARstudioはベータ版で一般公開されていません。この記事は公開後に読まれるのを想定しています。
※ 執筆時点のバグは修正されている可能性があります。

  1. AR studioを保存すると、ファイル形式が.arproj になることがある。 → ファイル形式を.fbfxprojに無理やり書き換えてしまって問題なさそう。(自己責任で。バックアップ取ってね)

  2. オブジェクトが表示されない。
    → Scene内のオブジェクトは、レイヤーが下の層ほど手前に表示される。PhotoShopなどとは逆なので注意。

  3. オブジェクトのプロパティが編集できない。
    → Scriptが動きっぱなしになっていないか確認する。

  4. オブジェクトをコピーしたら表示されなくなった。
    → レイヤーの設定がバグっていないか確認する。

  5. スクリプトの変更が反映されない。
    スクリプト開きっぱなしでプロジェクトを再起動してませんか?プロジェクト内のscript.jsを開き直してください。

  6. Scene.root.child('hoge')がうまく機能しない。
    → とりあえずchild('hoge')の代わりにfind('hoge')を使っておくのが無難。

  7. 画面をタップできない。
    → PC上でのタップは、以下を設定した上でCmd+タップ。 f:id:hiroga_cc:20171113231957p:plain

  8. リファレンスどこだっけ?
    → ここです。
    Camera Effects Platform - ドキュメンテーション - 開発者向けFacebook

  9. 自分がFacebookにアップしたエフェクト、どこで確認できるんだっけ?
    → ここです。
    https://www.facebook.com/fbcameraeffects/manage/

ソース

GitHub - hiroga-cc/napsta: become Napstablook by Facebook camera effect

script for Napstablook camera effect · GitHub

Facebook ARstudioで顔ぴったりフィットのコツ+その他ハマりどころ

f:id:hiroga_cc:20171113225312j:plain
奇跡的にフィットするサンシャイン池崎(比較写真)

AR Studioについて

FacebookのAR Studioがすごい。Facebookアプリを右側にスライドするとSNOWみたいなことができるカメラが起動するんだけど、
そこで使えるエフェクトを開発者向けに解放するSDKがAR Studioである。 developers.facebook.com

2017年11月11日~12日、Facebookさん主催でAT Studioのベータ版を試せるハッカソンがあり、IBMが協賛している縁で参加させていただけることに!

FaceMeshについて

FaceMeshはAR Studio内の3Dオブジェクトである。カメラで捉えた顔の動きを自動的に真似してくれる。

f:id:hiroga_cc:20171113231157j:plain
Face Meshに顔写真を設定する仕組み

でも綺麗にフィットする顔素材を作るのがとにかく難しい!

気をつけるべきポイントは以下の通り。
- 正面を向いている写真であること。
- もとから口が開いている写真であること。
- 余白が適当であること。
- 顔写真の形がフェイスメッシュとだいたい同じであること。

全てに失敗するとこうなる。

f:id:hiroga_cc:20171113231542p:plain
櫻井くんの写真はこのあと10種類くらい試しました

顔写真用の型紙とか作っておけばよかったなあ〜!
ちなみに冒頭の池崎は拾い物の画像で一発OKでした。奇跡か。

その他のハマりどころ

  • Mac上でのタッチ操作はProject設定を編集し、さらにCommandを押しながらクリックする必要がある! f:id:hiroga_cc:20171113231957p:plain

  • 音声は.m4a形式のmonoに対応している。.mp3は変換の必要あり!
    これ使いました。

    To M4A Converter Lite

    To M4A Converter Lite

    • NIKOLAY KOZLOV
    • ミュージック
    • 無料

初参戦でJJUG CCCを楽しむマイ心構え'17秋

来たる11月18日(土)、JJUG CCCに初参戦します。
とはいえ知り合いはほぼいないし、このままでは行って帰るだけになる可能性が大。楽しむための戦略を徹底的に練っておく!

背景

普段使っているJavaのこと全然知らないなと思ったのがきっかけ。

JJUG(日本Javaユーザーグループ、ジェイジャグと読むらしい)の存在を調べ、DoorKeeperに登録しておくと早速イベントの通知が。
JJUG CCC 2017 Fall ボランティアスタッフ募集のお知らせ | 日本Javaユーザーグループ

知り合いゼロでいきなり行っても楽しめる自信がないので、ボランティア登録してみた。
これはほんと正解で、ベテランボランティア勢の皆さんから事前に楽しみ方を教えてもらうことに成功した!

楽しむポイント

ずばり、懇親会で話したい人をマークしておく
ベテラン勢曰く、技術系カンファレンスは懇親会を楽しむもの。そうであれば、仲良くならないのは損である!

という訳で仲良くなりたい人リストを作ってみた。

お世話になってます枠

twitter.com 研修中は毎日読んでた「スッキリわかるJava入門」の著者さん!IBMのグループ会社で働いていたっぽい(間違ってたら申し訳ない)

セッション聞きました枠

さわらは以下のセッションに参戦予定なので、そのスピーカーさんと話してみたい!(なお午前中はボランティア) - サーバサイドKotlin - ゴールドマン・サックスにおけるCamundaを用いたビジネスプロセスの可視化とワークフローの自動化 - オレオレJVM言語を作ってみる - Spring BootとKafkaでCQRSを動かしてみる

名前は聞くKotlin、実際どんな文法でどんな利点があるのか全然知らない。Camundaというのは業務フロー図を描くのに便利らしい・・・それJavaとどう関係するんですか?
JVM言語を作るってのは、そもそも言語を自分で作るのが面白そうで参加!CQRSっていうのは新しいアーキテクチャーらしい。理解したら先輩に自慢しよう。

親近感覚えます枠

twitter.com IBMのWebSphereの担当者さん!普段使っている製品だけに一言お話ししてみたい。

twitter.com 社会人1年目で登壇されるみたい!すごいなあ・・・

なお春の懇親会はお寿司🍣が出たらしい。秋も期待していいのかな?

【小ワザ】Notesのメール送信ボタンをVerseで再現する(モバイル対応)

Notesには、ボタンクリックで新規メールが立ち上がる機能があると思います。
ところが、Verseなどのメーラーを使っているとNotesのボタンは機能しないので本当に困ります。

そこで、HTMLのmailtoスキームを使ってVerseでも任意テンプレートのメールをボタンぽちで作成できる方法をまとめました。

概要

HTMLのmailtoスキームとは、メールアドレスをクリックするとメーラーが立ち上がるリンクに使われている仕組み。
普通はローカルのメーラーが立ち上がるが、Verse上でクリックすればVerseの新規メールが立ち上がることを利用する。 VerseがWebメールである関係上、テンプレートのメール本文にスペース・改行を使う際にはエスケープに気を使うので、その点も触れる。

手順

1.Verseで新規メールを立ち上げます。

2.ブラウザの開発者ツールを開き、メールをHTMLとして編集します。
こちらの手順を参考に...
www.ibm.com

f:id:hiroga_cc:20171031232246p:plain

メール文中に目印になる文字列を書き込み → 開発者ツールを起動して文字列を検索 → 当該箇所で右クリックして"HTMLを編集" → mailtoスキームを含むhtmlタグを貼り付け

mailtoスキーム入りのHTMLタグのサンプルはこちら。

<a href="mailto:example.com?subject=出席報告&body=
    私はご飯会に参加します。<br>
    &nbsp;食べたいもの:<br>
    &nbsp;苦手なもの:<br>
    &nbsp;コースのみ or コース%26飲み放題:<br>
">
クリックして出席のお返事
</a>

3.送信します。
受信者はクリックすればメールを新規作成できます。

ポイント:

  • メール文中の"&"は、hrefの値として解釈する時に邪魔になってしまいます。URLエンコーディングして"%26"に置き換えましょう。
  • メール文中にスペースを出現させたい場合、HTML特殊文字で"&nbsp;"を入力します。
  • メール文中に改行を出現させたい場合、<br>タグを挿入するとよいです。
    通常のメーラーが相手ならURLエンコーディングで改行すればよいのですが、Verseで新規メール作成する場合、URLデコードした結果がさらにHTMLとして解釈されるようです。
    結果、URLエンコーディングによる改行(%0D%0A)はスペースになってしまいます。なのでHTMLタグを使用しました。

参考資料

RFC 2368 - The mailto URL scheme
RFCのmailリンクの定義

ローカルHTMLとメーラーを連動してみる - Qiita
実践している記事