カテゴリー別アーカイブ: お知らせ

待望のJetBrains IDE本発売! – IntelliJ IDEA ハンズオン 〜基本操作からプロジェクト管理までマスター〜 #ijbook

待望のJetBrains IDE – IntelliJ IDEAの本が発売になります。

この本は名前の通り、実際にIntelliJ IDEAを操作しながら効率的なIDEの利用方法を覚えられる実践的な本です。
日本のJetBrainsといえばこの人!今井勝信さんと、私の共著です。

私は主に第1部の基本開発編を担当しました。是非本を手に取って、ふんだんなスクリーンショットを参考にしながらIDEを実際に操作して快適な環境の虜になっていただければ幸いです。

多くのパートはIntelliJ IDEAだけでなくRubyMine、PhpStorm、PyCharm、WebStormといったJetBrains製のIDE全般で参考になる内容となっています。

紙の書籍の購入はこちらから。220ページで比較的サイズの大きい本ですが大変軽い紙で出来ています!
IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター | 山本 裕介, 今井 勝信 |本 | 通販 | Amazon

電子書籍はこちらから。PDF / EPUBをダウンロード出来ますのでiPadやKindleで読めます。
IntelliJ IDEAハンズオン ――基本操作からプロジェクト管理までマスター | Gihyo Digital Publishing … 技術評論社の電子書籍

目次は以下の通りです。
第1部 基本操作編
第1章 はじめに
1.1 IntelliJ IDEAとは
1.2 IntelliJ IDEAのインストール
1.3 IntelliJ IDEAの初期設定
1.4 IntelliJ IDEAをカスタマイズする

第2章 開発を始める
2.1 プロジェクトの作成
2.2 JetBrains IDEのレイアウト

第3章 ファイルの編集
3.1 HTMLファイルの作成とプレビュー
3.2 編集・補完

第4章 実行・デバッグ
4.1 FizzBuzzコードの記述
4.2 FizzBuzzの実行
4.3 FizzBuzzのデバッグ
4.4 実行結果の巻き戻し
4.5 テストケースの作成
4.6 テストケースの実行

第5章 プロジェクト内の移動(Navigation)
5.1 シンボル間のNavigation
5.2 ファイルのNavigation
5.3 ディレクトリのNavigation
5.4 編集箇所に戻る
5.5 ファイル名やシンボル名を指定して開く

第6章 バージョン管理システム
6.1 実行バイナリの指定
6.2 リポジトリの初期化
6.3 Version Controlツールウィンドウ
6.4 コミットの基本
6.5 ブランチの確認と作成
6.6 差分をコミットする
6.7 コンフリクトの解決
6.8 リモートリポジトリの設定とプッシュ

第7章 データベースを操作する
7.1 IntelliJ IDEAのデータベース機能
7.2 データベースに接続する
7.3 Databaseツールウィンドウ
7.4 テーブルのデータ編集(テーブルエディタ)
7.5 Databaseコンソールによるデータベースの操作
7.6 ソースコードとの連係
7.7 いろいろなデータベース操作

第2部 本格開発編
第8章 IntelliJ IDEAのプロジェクト管理
8.1 プロジェクトの考え方
8.2 プロジェクトの設定(Project Structureダイアログ)
8.3 プロジェクト管理の実際
8.4 プロジェクトの設定でよくある悩み

第9章 Java EEプロジェクトで開発する
9.1 Java EEプロジェクトを用意する
9.2 Java EEプロジェクトを実行してみよう
9.3 Java EEプロジェクトで開発してみよう

第10章 いろいろなプロジェクトで開発する
10.1 Springプロジェクト
10.2 Java VMベースの開発言語を使う
10.3 さまざまな開発言語を使う

これまで体験してきたメール送信の難しさ #SendGrid_jp

SendGrid Advent Calendar 2016の12月22日分です。

メールを送る際、プロトコルとしてSMTPが使われていてメールサーバにはPostfixやGoogleのメールサーバなどを使えば簡単というのは割と有名です。
が、送るのは簡単だけど何かと問題が発生するものです。

私のこれまでの経験をちょっとメモしておこうと思います。

メール配信周りの運用経験

1. 自宅サーバ運用の掲示板(James、2000年〜)
2000年くらいから自宅サーバで掲示板を運用していました。Tomcatで動くServlet + JSPのアプリケーションで、メールアドレスを登録しておくと新規書き込みがメールで通知されるというものです。
メールの配信にはPure JavaのメールサーバであるJamesを使っていました。
自宅サーバで運用してた(今も動いてるけど)のは勉強、練習みたいなもので特にサーバの運用が好きなわけではありません。なんかガラケーで届かないと訴える人が多いなーと思いながらなんとなく運用していました。

2. 自宅サーバ運用の掲示板(Google Apps、2007年〜)
たしか自宅サーバのマシンを更改するタイミングでJamesの運用が面倒になり、Google Apps for Domainからメールを送るようにしました。
なんとなくガラケーにも届きやすくなったような??

3. いくつかのドメインでのメール運用(Google Apps)
友人知人のWebサイトやドメインを運用する中、もちろんたいしてお金はもらっておらず責任はとれないということで自宅サーバでの運用ではなくGoogleでメールの送信をしていました。

4. 会社のメール運用(Google Apps、2013年〜)
会社のメールもやはりGoogle Apps(現G Suite?)を使ってます。

勉強不足で、ボンヤリと「メール配信はなんとなく自前でサーバを建ててもよいし、GoogleのSMTPサーバを使うも良いし、なんでも良い」と長年思っていました。時々配信に失敗しているなーと思いつつ。

起きたトラブル

1. ガラケーに配信されないことがある
ガラケーの、いわゆる「キャリアメール」については「届かないことがある」「全く届かない」という話がボチボチありました。自宅掲示板サーバは商用環境の運用ではないので大して調べもせず、ドメインのホワイトリストに入っていないからとか、リンク入りのメールは全部拒否する設定になっているとか、PCメールは受け付けない設定になっているから、といった理由だと思っていました。(それらの理由による不達も多いにあると思いますが
実感的にJamesからGoogle Appsにしてから到達率は少し増えたように感じます。

2. ガラケーじゃなくても配信されないことがある
Google Apps for Domainを使っていればガラケー以外は大丈夫だろうとたかをくくっていましたが、会社のメールもたまにとどいてないらしいことが分かりました。長い間、相手側のサーバの不具合だと決めつけていました。

3. 文字化けが起きる
メールのエンコーディングは日本語を送るのに一番無難(と思っている)ISO-2022-JPで送っていました。UTF-8に固定しているような人でないかぎり正常に読んでいただけます。
が、お客様のお名前で「山﨑」といった異体字が使われているとJavaのプログラム内では正常に扱えても、ISO-2022-JPに変換するタイミングで"?"に化けてしまいます。

4. 24時間メールが配信できなくなる
オフィスを移転した際、移転のお知らせをお客様にメールで一斉に送付しました。自作のプログラムで、顧客リストをグルグル回しながら順に送っていったのですが、途中から送信できなくなりました。エラーメッセージを調べると、どうやらGoogle Apps for Domainではメール配信数に上限があることがわかりました。(無料だと24時間で500、有料では2000件)
移転のお知らせを送れないのは全く困りませんが、受注の確認や、ライセンスが送付出来ないのは大問題です。

とった対策

1. / 2. SPFレコードを設定しました。知っている人からすればビックリでしょうが、なんと会社を立ち上げて2年もの間SPFレコードを設定していませんでした。

SPFレコードはDNSに設定するもので、「このドメインからはこのIPアドレスからメールを配信するよ」という宣言です。得体の知れない人(送信元IPアドレス)が「これが株式会社サムライズムからのメールです」と主張して手渡してきても確証が得られないので、「これは送信元ドメインを偽装しているのでは?」と疑われてしまうわけです。
SPFレコードを設定しておけば「弊社からのメールはGoogleのSMTPサーバから配信されますよ」と宣言できるので、疑われにくくなるという仕組みです。
「メール配信はPostfixでもなんでも、メールサーバがあれば送れるさ!」と思っているエンジニアは結構多いので気をつけましょう。

3. 「必要に応じて」UTF-8にする
異体字に対応すべく、ある時期からメールを全部UTF-8で配信するようにしました。イマドキさすがにUTF-8が読めないクライアントはないだろう、と踏んでのことです。
が、それなりの数のお客様から「化けていて読めない」という声を頂くようになりました。異体字が含まれるメール以上の数なので問題です。
そこで今では「基本的にISO-2022-JP、ISO-2022-JPで表せない異体字が含まれる場合はUTF-8」で送信するようにしています。以降文字化けは起きていません(聞く限りは)。

4. 大量配信しない
問題解決ではなく、消極的な回避ですがまとめて配信することは移転のお知らせで一回やっただけでやめにしました。

以上、SendGridとは間接的にしか関係ないけれども「メール配信をナメてかかると痛い目に遭うよ」という話でした。
文字だらけで申し訳ないですが、経験に学ぶのは愚か者なので、これからメール配信をする可能性のある方は歴史に学んでいるSendGridを初めとするメール配信サービスを利用することをお勧めします。
株式会社サムライズムでは少しずつ検証を重ねながら、今週から全面的にSendGridでメール配信をするように切り替えました

現状どのように使っているか、どういう点につまずいたのか、などはまた別途まとめたいと思います。

BPMエンジンとしてのJIRA #augj

TL;DR

JIRAでBPMとか考えるのはやめましょう。でもちょっとしたシステムと人間系ワークフローとの連携に使うのは良いアイディアです。

今更だけどJIRAって?

JIRAは一般的にバグトラッキング、または課題トラッキングシステムと分類される製品です。

良くあるのがソフトウエア製品の今後追加する機能やバグを課題として登録しておき、担当者を決めて、終わったら完了済課題としてマークしていく使い方ですね。

JIRAが導入されている企業、プロジェクトは非常に多く、そして様々な場面で利用できるようカスタマイズの幅も広いです。

ワークフロー

中でも便利なのが「ワークフロー」です。つまり、課題が登録されてオープン状態なのか、完了してクローズしている状態なのかだけでなく、課題が登録されてから完了するまでワークフローがたどる可能性のある状態をグラフで表せる機能です。例えば注文を頂いたら

・受注内容を確認する
・確認完了したら上長の決裁を待つ
・決裁が完了したら手配して終わり

というワークフローがあれば以下のように定義します

ちなみにこのグラフィカルに定義できる仕組みは元々サードパーティーのプラグインだったのが、出来が良いので買収の上取り込まれたという経緯があります。ステキ。

ワークフロー上で状態を遷移するタイミングで決まった人に担当を変えるとか、特定の条件が揃っていないと状態を遷移できないとか、遷移のタイミングでWebhookを呼び出すといったこともできます。

ビジネスプロセスマネジメントとワークフロー

エンタープライズ系のベンダに勤めていた私はワークフローと聞けばBPM(ビジネスプロセスマネジメント)を思い浮かべます。BPMはビジネスプロセスを分析/解析して、可視化・システム化して、監視、改善していくことです。

なんとなく口頭伝承されてきたプロセスは人によってブレがあったり、間違いがあったりします。必ずしも人間の作業をシステムで全部置き換えるところまでいかなくても、まずは作業の流れを統一してブレをなくすことが大事です。

その後は運用状態を監視して、どこにボトルネックがあるのか、手戻りが発生しやすいのはどこなのか、ここは自動化すべきなのでは、といったことを分析して改善していきます。

BPM用の製品として(自分的に)有名なのがAlfrescoや、jBPMです。

BPM製品では人間系がからむ承認といった手順とシステムで自動化させたフローを管理できます。

JIRAでBPM・・・に向かない

結論から言うと、JIRAでBPMを行うには制約が大きすぎます。理由はさくっと2つ思い付きます。(細かいこと考えるといくらでもあります)

1. フローの平行パスを定義出来ない
ビジネスプロセスを分析すれば、例えば
「課長と部長の承認がいるけれども順番は問わない」
「システムが集計しているのと平行して人間は請求書を投函する」
みたいな平行パスが現れてきます。JIRAのワークフローは2つ以上の状態を持つことができないので、フラグ用のフィールドを持たせるとか、サブタスクを定義するといった設計上の工夫が必要になります。「工夫」で回避できますが、ビジネスプロセスを俯瞰して監視、管理したいという点からするとちょっと辛いですね。

2. トランザクション管理ができない
エンタープライズシステムでは1にも2にもトランザクションです。特定の処理が失敗したら関連する処理はまとめてロールバックしたいところ。JIRAで、状態遷移するタイミングでWebhookで何らかの一連の処理を呼び出すことはできますが、処理が失敗したからといってまとめてロールバックしてくれるわけではありません。まぁHTTPを超えてトランザクションを管理しようとする試みは間違いだということは歴史が証明しているのでJIRAのワークフローとトランザクショナルな処理を絡めようという発想はやめましょう。

というわけでBPMをしたいならBPM製品を使うべきです。

JIRAでBPMができるパターン

本格的なBPMには向きませんが、ちょっとした人間系フローと、システムの連携にJIRAは便利です。ざっと2パターン紹介します。

・おい人間やっとけパターン
弊社=株式会社サムライズムで活用しているパターンです。ソフトウェアの販売をしているサムライズムですが、ご注文頂いたライセンスを手配する作業は*だいたい*システム化しています。*だいたい*というのが肝で、システムで自動化できていない部分があるのです。
具体的には一定の割合で請求書の書面を郵送して欲しいというお客様に対して
・請求書を印刷
・3つ折りにして封筒に入れる
・投函する
という作業が発生します。こちらはMisoca APIとかを使えば自動化できるのですが頻度、分量としては多くないので人間が運用でカバーしています。
人間がやるべき作業は忘れてしまいがちなので、システムから自動的に課題を登録して作業の完遂を促しています。システムから課題の作成するには公式のJavaライブラリを使っていますが、Atlassian独自醸造Apache HttpClientライブラリに依存しており数多くの他製品と競合しますので皆さんがんばってください。REST APIを直接叩くのがいいかも・・・。

郵送が必要な場合、機械が人間に依頼するコード(㍿サムライズムの本物のコード)

・人間も機械も仲良くパターン
ワークフローに平行パスがなく、一部システムで処理をしたい部分があればちょっとしたBPM的にJIRAのワークフローを使えます。そしてシステムが処理するのは遷移中にWebhookを呼び出すのではなく、状態として定義するのが良いです。(たぶん。でも場合による)。
システム用にユーザーを一人割り当て、状態遷移のタイミングで担当者をシステムに割り振るように設定しましょう。するとシステム処理中、人間には「担当している課題」として見えないので安心ですね。システム側で処理がうまくいかない場合、リトライを重ねることもできますし、リトライ試行回数を超えたら「失敗しました」、みたいな状態に遷移させてもokです。
(BPM製品だとビジネスプロセスとしてリトライ回数や例外系へのジャンプの定義が出来たりします。JIRAでやる場合は自前で)

いかがでしたでしょうか。長々と文字だけで書き連ねてしまいました。JIRAは主に人間系の課題の管理に使うのに向いていますが、工夫次第ではシステムと人間の連携にも使えます。
あまりにも工夫が必要な場合はJIRAを適用すべき場面ではないかもしれません。うまいことやってください。

4/2(土) Kotlin 1.0リリース記念勉強会 in 京都に行ってきました #kotlin_kansai #jkug

JetBrains黙認Kotlinエバンジェリストである@ngsw_taroに誘われ、4/2(土) Kotlin 1.0リリース記念勉強会 in 京都に行ってきました。

ふと気がついたら通常参加枠が満席でLT枠のみ!ちょうど良いので背水の陣ドリブンで自社システムへのKotlin導入をして勉強会に臨みました。
スライドはこちら↓

セッションで話したのは"左側"のみですが、会場では予想以上に"右側"を楽しんで頂けたようでなによりです!

KotlinはJavaに慣れている人にとって導入障壁が低く、かつモダンな言語の恩恵にあずかることが出来て良さそうだなーと思っていました。実際に試してみたところ予想以上にスムースに導入でき、作業を始めた当日にすんなりとプロダクションシステムに組み込むことができました。
既存のJavaのエコシステムに乗っかりやすく開発ワークフローを変える必要がなく、大変好みです。

最後にみんなでKotlinポーズ!

その他の方々のセッションの資料は以下のイベントのページに掲載されています。
4/2(土) Kotlin 1.0リリース記念勉強会 in 京都

まだまだ自分が試していない機能について紹介があり勉強になりました。自社システムで着々とKotlin化を進めていきたいと思います。
主催の関ジャバの皆様、ありがとうございました!

7/20(月)〜8/2(日)のクラウド関連の勉強会・イベント

7/20(月)
Sphinx-Users.jp + JAWS-UG CLI専門支部 祝日スペシャル
ABC裏会in我が家
MQTTとアンドロイドで本格的IoTを体験しよう
MQTTとアンドロイドで本格的IoTを体験しよう
JAWS-UG CLI専門支部 #24 – 祝日スペシャル (Sphinx x S3静的Webサイトホスティング)
DevOps勉強会@東京 #2 爆速アプリ開発を実現する継続的インテグレーション編(CI)

7/22(水)
【20名限定・無料セミナー】フジテレビのゲーム開発エンジニアが語る!ベアメタルクラウドの使い方 & 他社クラウドと比較したメリット
【NCセミナー】クラウド業界トップガンセミナー
AWS個別相談会 大阪(大阪府)
【iBeacon&Monaca】MonacaとmBaaSでiBeaconを使ったO2Oアプリを体験しよう
【受託開発事業者様向け】 MonacaとmBaaSでプッシュ通知を体験しよう
TMCNetworking Night Vol.02 with GMOクラウド
まつもとコネクト♯02
Couchbase MeetUP Tokyo – #14 – Couchbase Server 事例紹介-

7/23(木)
Tech-Circle Pepperで機械学習体験ハンズオン勉強会inアトリエ秋葉原
四国出身者が支える、ニッポンのクラウド
Ansible勉強会
クラウドワークス x freee x エウレカ x ホワイトプラス 〜今をトキメクCTO渋谷に集結〜
【集中講座】MonacaとmBaaSでWebコンテンツをスマホアプリ化して、プッシュ通知で更新通知を送ろう
アドテクに学ぶデータ分析導入AtoZ ~Yahoo!ビッグデータインサイト活用セミナー vol.01 ~
テッククロール第③回
【IBM Bluemixコンテスト応援企画】 Watson画像認識を使ってみる(7/23)

7/24(金)
Donuts Meetup ♯1
【入門】Docker コンテナ構築
FirefoxOS × NCMB ハンズオン
AWS個別相談会 【7月】(東京都)
kintone Café 東京 Vol.3 ~kintone と AWS 最新のビッグアップデートを学ぼう!~
クラウド時代のエンジニアの役割〜AWSを使い続けて気づいたこと〜

7/25(土)
GAE (Go/Python) もくもく勉強会 in 横浜タネマキ vol.19
まつもと市民大学【全8講座 お申込専用ページ】
まつもと市民大学 テーマ1)起業×地域 講師:本荘修二
第11回 クラウド女子会 〜コミュニティの式年遷宮!?初めてさんもお馴染みさんもいらっしゃーい〜
信州スタートアップカンファレンス2015 SUMMER @Knower(s)

7/26(日)
GCPUG Okayama! #3
【SoftLayerハンズオンセミナー】高速でスケーラブルなウェブサイトをNginxとWordPressでSoftLayer上に構築しよう

7/27(月)
多様なキャリアのエンジニアと考える、キャリア戦略会議 #2
Twilioビジネスセミナー Vol.15 – Twilioで創る新しい「顧客とのコミュニケーション」
【MA準備企画】ニフティクラウドmobile backend と色々なAPIを組み合わせた アプリを作って受賞を狙おう!~Twilioと楽天トラベル空室検索APIを使って~
【MQTT&iOSアプリ】 MQTTとmBaaSでチャットアプリを作る(iOS)
JAWS-UGコンテナ支部 Docker入門 #1
JAWS-UGコンテナ支部 #1
JAWS-UGコンテナ支部 懇親会 #1

7/28(火)
BPStudy#95
第二回 説明会
MicrosoftとライブラリOSの最前線
JAWS-UG IoT専門支部 #1 もくもくIoTカフェ
「freee(会計フリー)」スマート導入&マスター講座(東京都)
「サイトオーナー必見!いま知っておくべきWebセキュリティ対策」CPI Fan☆トークナイト! Vol.10

7/29(水)
OpenStackがビジネスにもたらすベネフィット
【cocos2d-x】新ツール「Cocos」の魅力を知る!ハンズオンセミナー【初心者歓迎!】
第27回 PaaS勉強会
HEATWAVE×生明塾 Dreamweaver らくらくマークアップ&コーディング

7/30(木)
コストをかけずに売上アップ! クラウドソーシングの発注方法(東京都)
セミナー クラウド完結型社会への民間からのアプローチ
【集中講座】MonacaとmBaaSでWebコンテンツをスマホアプリ化して、プッシュ通知で更新通知を送ろう

7/31(金)
Python ボルダリング部 #66
AWS体験ハンズオン 大阪 【7月】(大阪府)
【iBeacon&Monaca】MonacaとmBaaSでiBeaconを使ったO2Oアプリを体験しよう
【MQTT&iOSアプリ】 MQTTとmBaaSでチャットアプリを作る(iOS)
開発・運用エンジニアのAWSの現場 〜JAWS-UG中央線 × DevLOVE〜

8/1(土)
でじぽろ #1
第十二回 #渋谷java
【エンジニア枠】仕事で使える『マインドマップ』基礎ワークショップ at Co-Edo
Twilio Meetup Tokyo – ネットの世界を電話で盛り上げる 〜 TwilioJP-UGのご紹介!
JAWS-UG愛媛 (日本 Amazon Web Serviceユーザ会愛媛)第3回勉強会
はじめて女子応援企画!事例から学ぶもくもく&もぐもぐ会【女子限定】【人数限定】

このエントリはZusaarこくちーず(告知’s)PARTAKEDoorkeeperイベントアテンドATNDconnpassに登録されている来週一週間分のイベントからクラウド関連のキーワードが含まれているものをまとめたものです。Powered by AZusaar! API

7/20(月)〜8/2(日)のHTML5 / JavaScript関連の勉強会・イベント

7/21(火)
[chatbox.school] はじめてのjQuery – イベント操作を学ぶ
NodeSchool Osaka #8

7/22(水)
7/22【#techbuzz】第9回Swift勉強会【テーマ:調整中!】
【iBeacon&Monaca】MonacaとmBaaSでiBeaconを使ったO2Oアプリを体験しよう
【受託開発事業者様向け】 MonacaとmBaaSでプッシュ通知を体験しよう

7/23(木)
7/23【#TechBuzz】第8回ノンゲーム系アプリ勉強会 【テーマ:調整中】
[chatbox.school] はじめてのjQuery – 値の処理を学ぶ
世の中の仕組みをテクノロジーの力で変革させる企業のサービス開発とは?
世の中の仕組みをテクノロジーの力で変革させる企業のサービス開発とは?(Web6社の共同イベント)
Sencha Ext JS 5 無料セミナー #14
【集中講座】MonacaとmBaaSでWebコンテンツをスマホアプリ化して、プッシュ通知で更新通知を送ろう
NetCommons3 もくもく技術勉強会

7/24(金)
FirefoxOS × NCMB ハンズオン
7/24【#TechBuzz】モバイル・コンシューマ「開発比較」勉強会#2【テーマ調整中!】
NodeSchool Tokyo in BizReach & Node.jsもくもく会
JINS MEME ハンズ・オン 【 #MA11 ハッカソン参加者限定企画】〜Powered by Mashup Awards〜
kintone Café 東京 Vol.3 ~kintone と AWS 最新のビッグアップデートを学ぼう!~

7/25(土)
静岡Developers勉強会 UnityとBlenderハンズオン
Webクリエイターっぽいカフェ祭りフェス in 熊本
マカベン × HTML5fun HTML5 基礎から学んで、最新のライブラリを覚えよう!!
【10席増枠】JINS MEME HACKATHON 【 #MA11 本番直前プレ企画】〜Powered by Mashup Awards〜
みんなでわいわいソフトウェア作ろう!(MPS 第31回ミーティング)
Okinawa Frontend meetup #2

7/26(日)
Learn JS in kanazawa – Kakitai.js ver.1.0

7/27(月)
【初心者向け】jQueryで何か書いてみよう
【MA準備企画】ニフティクラウドmobile backend と色々なAPIを組み合わせた アプリを作って受賞を狙おう!~Twilioと楽天トラベル空室検索APIを使って~

7/28(火)
【限定10名】CodeCampプログラミング講師 オンライン説明会
7/28【#TechBuzz】アプリマーケティング勉強会#13【新興国ゲーム市場・産業】
[chatbox.school] はじめてのjQuery – アニメーションを学ぶ
今、話題のビルドツール gulp/Gruntを徹底解剖!~ハンズオンで基礎から学ぶ、Web制作の味方 ビルドツール~

7/29(水)
【東京】BaaS「アピアリーズ」とハイブリッド開発環境「アプリカン」で簡単iBeaconアプリ開発
7/29【#TechBuzz】Unity勉強会#33【Unityでジェネレーティブアート】

7/30(木)
7/30 【#TechBuzz】HTML5+JS勉強会#15
[chatbox.school] はじめてのjQuery – プラグインの使い方を学ぶ
Sencha Ext JS 5 無料セミナー #15
【集中講座】MonacaとmBaaSでWebコンテンツをスマホアプリ化して、プッシュ通知で更新通知を送ろう
NetCommons3 もくもく技術勉強会
Twilio & Titanium JavaScriptで作るネイティブアプリ 〜あなたのiPhoneが電話になる

7/31(金)
【iBeacon&Monaca】MonacaとmBaaSでiBeaconを使ったO2Oアプリを体験しよう

8/1(土)
【エンジニア向け】第三回ビットコインワークショップ【JavaScriptでウォレットを動かそう】
JavaScriptでiOS/Androidアプリ開発! 静岡Titanium勉強会
WordPressもくもく勉強会 at コエド 第8回

8/2(日)
「AngularJSアプリケーション開発ガイド」読書会(5) 最終回
もくもく会@ギークハウス自由が丘 / GeekHouseDay
配色・レイアウト・バナー・ブログ、知っておきたいデザインノウハウ
「Jimdoスキルアップセミナー Vol.2」
【初心者歓迎】プログラミング相談所【もくもく作業でもOK】
第18回CoderDojoさいたま – 2015年8月2日(日)15時から

このエントリはZusaarこくちーず(告知’s)PARTAKEDoorkeeperイベントアテンドATNDconnpassに登録されている来週一週間分のイベントからHTML5 / JavaScript関連のキーワードが含まれているものをまとめたものです。Powered by AZusaar! API

逆引きNashorn – やりたいことからNashornのサンプルコードを引く

機械校正ツールであるRedPen(ライブデモ)は、デフォルトで内蔵している沢山の校正ロジックに加え、ユーザーがカスタムロジックを実装することができます。
自分で実装するにはJavaでValidatorというクラスを拡張すれば良いのですが、間口を広げるためにJavaScriptでもロジックを実装できるようにしました。
RedPen自体はJavaで実装しており、JavaからV8などを呼び出すのは大変なのでJava8に内蔵されているJavaScriptエンジンであるNashornを使いました。

あちこちの情報をかき集めて工夫をしたので、ここにまとめておきます。
やりたいことと、実現するためのコードを逆引き的に並べています。実現方法は全部違うけれども、どのコードもHello Nashornと出力するだけです。

JavaScriptを呼び出す
JavaScriptの関数をJavaから呼び出す
JavaのstaticメソッドをJavaScriptから呼び出す
JavaScriptからJavaのオブジェクトを参照する(バインドする)
JavaScriptをコンパイルしてから呼び出す
JavaオブジェクトのメソッドをJavaScriptの標準関数のように呼び出す

簡単にビルド、実行できるようまとめたものはGitHubに置いてあります。(ASLと書いてあるけど、創造性を微塵も感じさせないコードなので好き勝手コピペしていただいても大丈夫かと)

JavaScriptを呼び出す
print関数を呼び出すだけのJavaScriptを実行します。getEngineByName()の引数はjsでもJavaScriptでもNashornでもok。
SimpleNashorn.java

public class SimpleNashorn {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
// works also with "js" / "javascript"
ScriptEngine engine = manager.getEngineByName("nashorn");
// prints "Hello Nashorn"
engine.eval("print('Hello Nashorn');");
}
}

JavaScriptの関数をJavaから呼び出す
JavaScript内で定義してある関数をJavaコードから呼び出す。invokeFunctionの第一引数が関数名、第二引数は可変長引数で、第一引数で指定した関数に渡すパラメータを任意の個数渡せる。
InvokeJavaScriptFunctions.java

public class InvokeJavaScriptFunction {
public static void main(String... args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval("function hello(message){print(message);}");
Invocable invocable = (Invocable) engine;
// prints "Hello Nashorn"
invocable.invokeFunction("hello", "Hello Nashorn");
}
}

JavaのstaticメソッドをJavaScriptから呼び出す
Java.typeっていうNashorn固有の機能を使います。
InvokeJavaStaticMethod.java

public class InvokeJavaStaticMethod {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// prints "Hello Nashorn"
engine.eval("Java.type('nashornsampler.InvokeJavaStaticMethod').hello('Hello Nashorn');");
}

public static void hello(String message) {
System.out.println(message);
}
}

JavaScriptからJavaのオブジェクトを参照する(バインドする)
JavaScriptとJavaで相互に作用のあるコードを書くときはこんな風に。
BindJavaObject.java

public class BindJavaObject {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("myObj", new BindJavaObject());
// prints "Hello Nashorn"
engine.eval("myObj.hello();");
}

public void hello(){
System.out.println("Hello Nashorn");
}
}

JavaScriptをコンパイルしてから呼び出す
JavaScriptコードを一旦Javaのバイトコードにコンパイルしてから実行します。繰り返し呼び出す場合は高速。Java8u40以降であればコンパイル結果はキャッシュされるのでJVMを再起動しても速攻でコンパイル結果が得られるらしい。
InvokeCompiledJavaScriptFunction.java

public class InvokeCompiledJavaScriptFunction {
public static void main(String... args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
CompiledScript compiledScript = ((Compilable) engine).compile("function hello(message){print(message);}");
compiledScript.eval();
Invocable invocable = (Invocable) engine;
// prints "Hello Nashorn"
invocable.invokeFunction("hello", "Hello Nashorn");
}
}

JavaオブジェクトのメソッドをJavaScriptの標準関数のように呼び出す
JavaオブジェクトメソッドをJavaScriptよりobj.method()ではなく、単にmethod()と呼び出したい場合はこんな風に。
(恐らく要Java8u40以降)
BindJavaMethod.java

public class BindJavaMethod {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("toBeBound", new BindJavaMethod());
engine.eval("var hello = Function.prototype.bind.call(toBeBound.hello, toBeBound);");
// prints "Hello Nashorn"
engine.eval("hello('Hello Nashorn')");
}

public void hello(String message) {
System.out.println(message);
}
}

関連記事:
Heroku Buttonで簡単にHerokuにデプロイ #herokujp – #侍ズム
WebアプリケーションをIntelliJ IDEAからHerokuへデプロイする #herokujp #jbugj – #侍ズム
Java WebアプリケーションをHerokuへデプロイする #herokujp – #侍ズム
Getting Started with Java on Heroku | Heroku Dev Center
RedPen を公開しました (ベータバージョン) | Advanced Technology Lab
社内共有会で使用した RedPen 資料と進捗 | Advanced Technology Lab

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-35176364-2', 'auto');
ga('send', 'pageview');

6/29(月)〜7/12(日)のクラウド関連の勉強会・イベント

6/29(月)
GCPUG In Sendai #1
mBaaSを活用して業務システムをスマホアプリ化! ~mBaaSと自社システムの連携の仕方教えます~
【ハコスコ対応アプリ】UnityとmBaaSでネット対応のゲームを作ろう! (おかわり)

6/30(火)
AWS初級トレーニング 【6月】(東京都)
中小企業向けセミナー ゼロから学ぶ「クラウドソーシング」(東京都)
クラウドソーシング協会 第5回分科会
第24回 さくらの夕べ in 名古屋

7/1(水)
MySQLレプリケーション構成 【MHAで冗長化】
3D虎の穴無料講座
第2回【SoftLayerハンズオンセミナー (サーバー冗長化構成編)】
【10席増枠】MySQLレプリケーション構成 【MHAで冗長化】無料ハンズオン勉強会
第3回勉強会

7/2(木)
【満席御礼】ランサーズ「法人様向けディレクションサービス」事例ご紹介セミナー

7/3(金)
ネットワークプログラマビリティ勉強会 #5
メジャークラウド活用セミナー(7/3札幌)Google Apps / Office365
【ハコスコ対応アプリ】UnityとmBaaSでネット対応のゲームを作ろう!
JAWS-UG岩手 第2回勉強会

7/4(土)
第2回ペパボテックカンファレンス【福岡】
CMSどうでしょう〜MT・WP対決列島〜 大阪夏の陣
Innovation EGG 第4回 『各クラウドの現状とこれから』7月4日(土)
NT-Committee2 第21回関西勉強会
Innovation EGG 第4.1回 『懇親会(LT付き)』7月4日(土)
Innovation EGG 第4.1回 『懇親会(LT付き)』のLT登壇者登録サイト

7/5(日)
ビジネスプランの立て方やアイデアのまとめ方を学ぼう!「信州ベンチャーコンテスト2015事前セミナー」

7/6(月)
【Monaca&プッシュ通知】 MonacaとmBaaSでプッシュ通知を体験しよう
JAWS-UG CLI専門支部 #23 – ECS入門

7/7(火)
Python ボルダリング部 #65
初心者向けクラウド利用セミナー
【ヒカ☆ラボ】プロジェクトをグロースハックしたい方必見!! My365、Growth Push等、多数のプロジェクト立ち上げに関わってきたからこそ語れる、サービスに合う技術選定方法や、グロースする戦略の見つけ方を失敗談も含めて話します!!

7/8(水)
【継続開催】ビッグデータ無料ハンズオンセミナー7月8日
What’s New in Android (I/O 2015)
7/8新しい働き方 クラウドソーシング活用セミナー(埼玉県)

7/9(木)
Zabbixだけじゃない! OSSを徹底活用して運用自動化を実現
【10席追加いたしました】ランサーズ「法人様向けディレクションサービス」事例ご紹介セミナー

7/10(金)
Infrastructure as Code Casual 札幌 #0
Python札幌・勉強会 2015-07-10

7/11(土)
オープンセミナー2015@香川
第2回おなかハッカソン@仙台
アイデンティティ技術を学ぼう!
Web制作者のための仕事の作り方・向き合い方 in 大阪
第5回JAWS-UGくまもと クラウド勉強会
(加古川でやるけど)姫路インフラ系勉強会 2015.07

このエントリはZusaarこくちーず(告知’s)PARTAKEDoorkeeperイベントアテンドATNDconnpassに登録されている来週一週間分のイベントからクラウド関連のキーワードが含まれているものをまとめたものです。Powered by AZusaar! API