せてぃーずノート

Javaのイベント参加レポートとかを書いたりします。

JvmCasualNightへ行ってきた!

LL言語な人たちの参加がほとんどだったせいか、スーツ率5%未満という素敵な会場。
多分、数少ないJavaでアプリ作ってる側での参加者だったと思います。

SlideShareリンク

不足分は後ほど追加ということで・・・。

NorikraのJVMチューンで苦労している話

運用に効く!JVMオプション三選

Jvm operation casual talks

感想

JVMの話も面白かったのですが、違う世界を垣間見れたのが一番の収穫かも。

  • JVMを使う理由は、必要なミドルウェアを使用するためにJVMが必要だから。
    Lucene、Cassandra、HBaseとか。

  • JVMをライブラリの前提で使ってる人は、JVMの利点をあまり感じていない?
    強いて挙げられた感のある利点としては、「スレッドが軽量で実用性がある」「高負荷に耐える」「型がある言語」というところくらい?

  • プロセスに考え方がそもそも違う
    こちとらJavaメインなので、プロセスダウンしないようにチューニングしたりする。 でもLL言語の人たちにとってのプロセスは、ダメになった殺せばいいじゃんっていう考え方(だとお思う)
    帰りのエレベーターの中でも「FullGCで止まる前にプロセスを殺せないかなぁ」という話が聞けたり。
    確かにすぐに殺しちゃえっていう人からすると起動が遅いって致命的だよね・・・。

同じJVMに関わる立場でも、異なる視点や使い方の人の考えや意見を聞けたのはとてもいい経験に慣れたと思います。

Windowsでvagrantを試してみる

参考にするのはこのページ

仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する - さくらのナレッジ

本当はdockerを試そうと思っていました。
でもdockerのチュートリアルをやろうとしたら、最初にvagrantを入れろって言うので仕方なく入れます。

って思っていたのですが、vagrantもすげー面白い!
むしろこれ極めればdockerいらないんじゃない?とか思っちゃうかも

vagrantのインストール

vagrantにはWindows向けのインストーラーがちゃんとあります。
プログラムファイルには出てきませんが、パスも通してくれるのでインストールすればすぐに使えます。
再起動は必要ですけどね。

最初の仮想マシン作成

で、早速initしてみる。

d:\vm>vagrant init centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

【てきとーな訳】
Vagrantfileがこのディレクトリが完成した
ただちにvagrant upで最初のVM環境を作ってみたまえ!

VagrantfileにはインストールするOSの種類や仮想マシンの環境とかを定義します。
詳しいことはここを読むといいっぽい。

Vagrantfile - Vagrant Documentation

言われたとおりにvagrant upを実行すると、OSダウンロードして仮想マシンを作成。 その後起動までしてくれます。
OSのダウンロードは最初の1回だけでいいそうです。

d:\vm>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Box 'centos-6-x64' was not found. Fetching box from specified URL for
the provider 'virtualbox'. Note that if the URL does not have
a box for this provider, you should interrupt Vagrant now and add
the box yourself. Otherwise Vagrant will attempt to download the
full box prior to discovering this error.
Downloading box from URL: http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x
64-vbox4210.box
Extracting box...ate: 2300k/s, Estimated time remaining: --:--:--)
Successfully added box 'centos-6-x64' with provider 'virtualbox'!
[default] Importing base box 'centos-6-x64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
DL is deprecated, please use Fiddle
[default] Machine booted and ready!
[default] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
prevent things such as shared folders from working properly. If you see
shared folder errors, please make sure the guest additions within the
virtual machine match the version of VirtualBox you have installed on
your host and reload your VM.

Guest Additions Version: 4.2.10
VirtualBox Version: 4.3
[default] Mounting shared folders...
[default] -- /vagrant

VirtualBoxを開いてみると仮想マシンが作成されて動いています。やったね。

今日のまとめ

ここまでの所要時間DL時間含めて5分かからずです。
これが自分で作った場合、isoを落としてVMにOS入れて初期設定して・・・と倍の時間はかかるでしょう。
目的にもよりますが、テスト環境を構築したいときなんかvagrantのほうが断然おすすめと思われます。

BBASもどきを作ってます

ボーダーブレイクネタです。
自分の勉強も兼ねて、BBASもどきを開発してます。

おりじなるは以下のURL。

http://daxs.info/bbas/

とりあえず、データ集計部分は今週くらいでできそうです。
こーんなな感じで使っているアセンとか武器を収集してます。

Assenble{headParts='セイバーI型', handParts='B.U.Z.-α', bodyParts='ヘヴィガードIV型', footParts='E.D.G.-θ', assultWepon=Wepon{main='電磁加速砲・速式', sub='MSL-ナイダス', hozyo='マーシャルソード', special='AC-ディスタンス'}, heavyWepon=Wepon{main='ウィーゼル機関銃', sub='サワード・バラージ', hozyo='改良型ECMグレネード', special='バリアユニットγ'}, sniperWepon=Wepon{main='炸薬狙撃銃・絶火', sub='スティッキーボム', hozyo='セントリーガンLZ', special='光学迷彩・耐久型'}, supportWepon=Wepon{main='レイジスマック', sub='リムペットボムV', hozyo='自律型弾薬BOX', special='リペアフィールド'}, callWepon='BA:オートガン', tipList=[ExceedTip{name='タックル', cost=0}, ExceedTip{name='投てき適性', cost=0}, ExceedTip{name='爆発範囲拡大II', cost=0}]}

オリジナルにない要素として

  • MAP別の人数とポイトン
  • 地域別のポイトン

とか盛り込んでみようかと考え中です。

たぶんオープンソースカンファレンスに行ってきた

多分っていうのは、なんか萌えキャラとゆるキャラが多すぎてそっちの印象しか残ってないから。
別にいいんですけど、そういうの受け入れない層もあるわけで、もうちょっと抑えてもいいかなぁと思ったり。

Hadoopの話

Hadoop1系と2系の違いのお話。
会場にいた人の半分以上がHadoopを知らないという予想外の展開。
消化できるのか!?

Hadoop1系と2系の違いは

  • Java7に対応した!8はまだ・・・?
  • MapReduce以外も出来るようになる
  • HDFSのSnapshotがとれたりとか色々改良
  • みんな大好き象さんは続投
  • 何を使うにせよ、データを蓄えることが大切!

1系は今後どうなるかよくわからないとのこと。
HDFSの代わりにインメモリを利用するApacheSparkを使うのはそのうち試してみたい。

TOPPERSの話

組み込み系のOSです。
全く縁のない組み込み系ですが、なんとなく聞いてみました。

  • 産官学一体のプロジェクトなのはいいけど、足かせがありそうな感じ。
    せっかく工夫して作ったものも「公式認定」が必要とかもったいない
  • 子供向け教育セットみたいなものを出すみたいだけど2万円は微妙な気がする。。。
    RegoとかRaspberry Piが競合製品になりそうだけど勝てるのか?
  • OSを作る人達の集まりなので、使う人達のことをあまり考えていない。

多分、日本でも優秀な技術者を投入していると思うんです。
成果物も色々ありそうなんですけど、敷居高くてユーザが増えにくい気がします。

雨と開催地が遠くても熱気に溢れたイベントでした。
まりんかさん可愛かったし。

JJUG ナイトセミナ「3大IDE頂上決戦」に行ってきた

「それ○○でも出来るよ」というツイートが裏で飛び交う、熱く激しいバトルでした。

イベント告知ページ

【東京】JJUG ナイトセミナ 「2.19 Eclipse、NetBeans、IntelliJ IDEA 3大IDE頂上決戦 」 - 日本Javaユーザーグループ | Doorkeeper

Togetterまとめ

JJUG ナイトセミナ 「2.19 Eclipse、NetBeans、IntelliJ IDEA 3大IDE頂上決戦 」 #jjug #idewars - Togetterまとめ

それぞれ印象に残った点を簡単にまとめ

NetBeans

IntelliJ IDEA

Eclipse

  • ユーザ数はナンバーワン!
  • CTRL+1で何とかしてくれる
  • みんな意外と使いこなせてない?

感想

  • まずはどれでもいいのでIDEを使いこなせるようになろう
    重いテキストエディタ化している人はもったいない どれか一つマスターしてから次のIDEに行っても遅くはない
  • どれも素晴らしいけど最初に触るのはNetBeansがいいと思う 特にSI屋の新人教育担当の人! Eclipseのセットアップで時間を潰すくらいなら、オールインワンNetBeansで実装を学ぶ時間を増やすほうがいいと思いますよ

印象に残った言葉

  • 思考を止めずに実装しよう
    これすごく重要だと思う。
    そのためにIDEだし。
  • メソッド名なんて後で変えたくなるから最初は適当に
    まずはxxxxxxxxとかにして、メソッド名を考えることで実装のリズムを止めない。
    思い返してみると名前で悩んでしまうことはおおいので、これから実践してみようと思う。
  • 出来るエンジニアはブランチを切る(キリッ

SpringSNSのチュートリアルを試してみた

なんか変な感じに忙しい日々が続いてちょっと間隔あいちゃったけど、今日はこれを試してみた。

Getting Started · Accessing Twitter Data

試す前にTwitter側のセットアップを済ませておく必要がある。
OAuth認証も利用するので、コールバックURLの設定もしておく。

アプリケーションの動きとしては、こんな感じ。 起動してhttp://localhost:8080/にアクセスすると、Twitterへのコネクションがあるかを判定する。
最初にアクセスした時はコネクションがないので、/connect/twitterにリダイレクトする。

if (connectionRepository.findPrimaryConnection(Twitter.class) == null) {
    return "redirect:/connect/twitter";
}

この時のViewはtemplateフォルダにある"connect/{provider ID}Connect"が呼び出される。
twitterなら"connect/twitterConnect"、facebookなら"connect/facebookConnect"になる。

twitterConnect.htmlには/connect/twitterをPOSTで呼び出す処理を書く。
/connect/twitterを呼び出すと、SpringSNSはOAuth認証のページに遷移してくれる。
OAuth認証が終わると、これまた自動的に"connect/{provider ID}Connected"のページが呼び出される。
あとはhttp://localhost:8080/に再び遷移することで、TwitterAPIを利用できるようになる。

気になる点としてはtwitter4Jとの使い分け。
APIの使い勝手とかconsumer keyなどの指定は個人的な好みの部分もあるので、好きな方を使えばいいとは思う。
使ってみた感想としては、OAuth認証がSpringSNSの方が楽なのと、様々なSNSを利用する場合にAPIごとに使い方を覚える必要がないのがいいと思う。

Springのチュートリアル〜第1回 SpringMVCその1

今日はServing Web Content with Spring MVCを動かしてみます。

ダウンロードは↓から。

Getting Started · Serving Web Content with Spring MVC

作るコードもリンク先にあるので、ここには書いたりしません。

ソースの作成

このチュートリアルは3つのクラスを作ります。
コピペすれば一瞬ですが、量も大したことないので全部打ち込んで試してみることをおすすめします。

  • 実行するmainメソッドを持つクラス
  • Controllerクラス
  • ビューであるテンプレートファイル(html)

まずはControllerクラスです。
@Controllerアノテーションを付ける。
URLとの紐付けは@RequestMapping("/greeting")で行う。
Spring3.2とあまり違いはなさそう。

ビューとなる部分は、JSPじゃなくてThymeleafというテンプレートエンジンを使います。
ネームスペースに

<html xmlns:th="http://www.thymeleaf.org">

と書いて、置換する部分は

<p th:text="'Hello, ' + ${name} + '!'" />

と書くだけでOKです。

実行

実行する方法は2つあります。

  • WARを作って配備する
  • mainメソッドを呼び出す

今回の推奨は当然後者です。 mainメソッドを呼び出すとこんなロゴが出てSpringBootが起動します。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::             (v0.5.0.M6)

起動が完了するとhttp://localhost:8080/greeting/にアクセスして作成したアプリケーションが呼び出されます。
動いているのはSpringBootに内蔵されたTomcatです。
http://localhost:8080/にアクセスすれば、Tomcatの404画面が出てきます。

Executable Jarの作成

build.gradleを修正することで、実行可能なJarファイルを作れます。
java -jarで実行すると、mainメソッドを実行した時と同じようにTomcatが起動します。
Jarファイルの大きさは10MB程度。
TomcatやSpringのlibraryがぎっしり入っています。

Manifestファイルはこんなかんじです。

Manifest-Version: 1.0
Start-Class: hello.Application
Spring-Boot-Version: 1.0.0.RC1
Main-Class: org.springframework.boot.loader.JarLauncher

JarLauncherクラスについては別の機会に見ていこうと思います。

制約?

mainメソッドを持つApplicationクラスは@ComponentScanアノテーションが付加されています。
このアノテーションが付いている場合、Springは同一パッケージを検索してコンポーネントを探し出します
今回作成したControllerクラスとApplicationクラスのパッケージを変えてみると、Tomcatは起動しますがコンポーネントはパッケージが違うのでロードされません。
なので、http://localhost:8080/greeting/にアクセスしても404になります。

Applicationクラスで違うパッケージのControllerを指定できるといいのになぁ。

出来ました。
@ComponentScanにパッケージを指定できます。

@ComponentScan(basePackages="hello.component")

クラスのフィルターなどもできるので、起動が遅い場合は指定してみるとかできますね。

まとめ

SpringBootを使うことで、面倒な環境設定をせずにWebアプリケーションを作成することができます。
NetBeansGlassfishに比べれば学習にかかるコストは小さいと思います。

ただ「本番はWebLogicを使う開発」みたいなものにはあまり利点を生かせないかも。
アプリケーションサーバを使用する開発はJava EE、Herokuなどクラウド環境で動かす場合はSpringというように、住み分けができると面白いかも。