unnamed

Javaとか、http://twitter.com/sugarlife

公式配布のソフトウェアだけでWindowsでMOVファイルをWMVファイルに変換する方法

不慣れな人が動画変換をする場合、無料でやるためによく解らないフリーウェアを入れて変換することが多い。しかしMOVからWMVに変換するだけなら、公式で配布しているソフトウェア(無料)で変換することができた。検索してもやり方が見つかり辛いので備忘録として残す。

MP4(H.264)に変換したい場合は、餅は餅屋ということでここらへんを参考にすると良い。

前準備

  • Microsoft Expression Encoder 4 を入手して、インストールする。
    • 環境によっては.NET Framework 4.0や、Silverlightのインストールが求められる。それぞれのダウンロード先は表示されるので手順に従ってインストールする。
  • Quick Time を入手して、インストールする。
    • Expression EncoderだけではMOVファイルを認識できないが、Quick Timeをインストールすれば認識できる。

これらのソフトウェアは有料(Pro)版も販売されているが、無料版も用意されているのでそれを使う。上記リンク先は全部無料版なので、ここでは気にせず導入すると良い。

変換

  1. Microsoft Expression Encoder 4を起動する。
  2. 画面下部のメディアコンテンツ欄に変換したいMOVファイルをドラッグ&ドロップする
  3. エンコードボタンを押す。
    1. 変換形式を変えたい場合は、画面右側のエンコードタブの出力形式から選ぶ。
  4. エンコードが完了したら、画面右側の出力タブをクリックする。
  5. 真ん中あたりにあるジョブ出力のディレクトリ先に変換済みのファイル場所が表示されているので、そのディレクトリを開けば変換済みファイルがある。

Enjoy :)

JavaでFull GCを実行する方法

Full GCを任意のタイミングで実行させ、負荷の高い処理に備えておくという戦略を取りたい時がたまにあります。基本的にはチューニングで解決すべきですが、緊急or暫定策の備忘録として。

jmap -histo:live <pid>

LinuxはJDK5から、WindowsはJDK6から利用可能。生存中のオブジェクトのみ抽出したメモリーマップを作成するために、直前にFull GCを実行するのでこれを利用する。
対象のJavaプロセスを実行しているユーザで実行する必要があるので注意。

jcmd <pid> GC.heap_dump <output_filename>

Linux、WindowsともにJDK7から。これも上のjmap -histo:live と同じく、生存中のオブジェクトのみ抽出するためにFull GCを実行する。これもJavaプロセス実行ユーザと同じユーザで実行する。

Full GCを実行する機能について

JDKでは、恐らく上記の生存オブジェクトのヒープ情報を取得する(HeapInspection)場合でしか、明示的にFull GCを実行する方法は準備されていないと思われる。
実際に呼び出されるコードは以下。

./hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp
VM_GC_HeapInspection(outputStream* out, bool request_full_gc, bool need_prologue)から以下を呼ぶ
VM_GC_Operation(0 /* total collections, dummy, ignored */,
                GCCause::_heap_inspection /* GC Cause */,
                0 /* total full collections, dummy, ignored */,
                request_full_gc /* live=true, all=false */) 

GCを起動させる方法(追記)

以下はGCが実行され、条件によってはFull GCが呼ばれる。これは上のVM_GC_Operationとは別ルートで、この記事のコメントにあるルートで呼ばれる。条件については未確認なので注意。条件についてはとは書いているが、基本的に Full GC になることを期待できる…はず。

  • Runtime.getRuntime().gc() / System.gc()
  • jcmd <pid> GC.run
  • jconsole の 「Perform GC」ボタン

以下は上のJVM_GC_OperationでFullGCがリクエストされない形で呼ばれるため、普通のGCが起動される。GCなのでヒープ状況次第ではFullGCも呼ばれる。

  • jmap -histo <pid>

Java SE 7 JavaDoc 日本語版 公開

前回の記事でJava SE 7 の日本語版 JavaDoc は公開されていないと書きましたが、先日の Java Day Tokyo 2013 で公開されました!
なんてタイミングだ\(^o^)/

ともあれ大変喜ばしい事です。一部英語の部分もありますが、順次アップデートされるそうです。日本オラクル社と寺田さんの尽力に感謝します!#てらだよしおあいしてる

Java SE 7 JavaDoc公開先:http://www.oracle.com/technetwork/jp/java/javase/documentation/

最新のOpenJDK8のJavaDoc (Java API) #yutori_history

こちらはゆとり Advent Calendar の 12 日目です。おすしたべたいので参加しました!
昨日は @mike_neck さんの mike、mikeなるままに…: ゆとりさんが鮨を奢ってくれるそうなので、感謝の気持を込めて、たくさんのプロセスに「sushi」と言わせてみた でした。
ゆとり Advent Calendar : ATND

ゆとりさん転職おめでとうございます!出会ったのは #glassfishjp で発表した日だったような気がします。GlassFish寿司おごって下さい!

そんなゆとりさんですがこんな事を呼びかけていました。


残念なことに現在の最新版である JDK7 は日本語APIドキュメントが公開されていない状況です(2013/05/15追記)公開されました。これを受けて今年の夏に出るはずだった JDK8 は、OpenJDK8をベースに有志で作成しようと先月呼び掛けておられました。私も参加します!

当初、JDK8は夏にGAリリースだったので、しばらくしたらすぐ動き始めるかなと思いきや、JDK8はhttp://mail.openjdk.java.net/pipermail/jdk8-dev/2013-April/002336.html:title:MLでの周知にもある通り、GAが来年の3月14日にズレることになりました。なので、実際にやり始めるのはもうしばらく後になると思いますが、折角なので最新のOpenJDK8のAPIを作って用意しておきましょう。

と、思ったら普通に最新(2013/05/12現在 b89)のAPIが公開されてました。
Overview (Java Platform SE 8 b89)

今日の気付き:さきにしらべとけゆとり


明日は @eiryu さんの番です!

OpenJDK 8 をFedora18でビルドする

OpenJDK と戯れるため、OpenJDK ビルド用サンドボックスとして、まっさらな Fedora 18 (x86_64) 環境を用意してビルドしてみました。
以下、再構築時のための覚え書き。

Fedora 18

Fedoraこちらのページから好きな形式で落として、KVMなりXenなりVMwareなりにインストールする。
VMWareにインストールする場合は、仮想マシン設定のディスプレイから3Dグラフィックスのアクセラレーションをオフにしないとフリーズするので注意。

インストールが終わったら前準備として環境設定を一通り実施する。

# sudoの設定
su -
visudo
# 以下を追記する。hogeは適当なユーザ名に変更する。
# hoge	ALL=(ALL)	ALL
# %wheel	ALL=(ALL)	NOPASSWD: ALL
exit
# 必要に応じてキーボードを日本語入力に
sudo setxkbmap jp -model jp106
# 必要に応じてプロクシを設定
vi ~/.bashrc
# 以下を追記する。
# export proxy=xxx.xxx.xxx.xxx:xxxx
# export http_proxy=xxx.xxx.xxx.xxx:xxxx
# export ftp_proxy=xxx.xxx.xxx.xxx:xxxx
source ~/.bashrc
sudo vi /etc/yum.conf
# 以下を追記する。
# proxy=http://xxx.xxx.xxx.xxx:xxxx

これでFedora18の最低限の設定が完了。

OpenJDK8

続いてビルドに必要なパッケージを導入しつつ、OpenJDK8の最新版を入手してビルドする。これは時間がかかるのでシェルスクリプトとして実行するのが良い。一度実行してしまえばあとはビルド部分のみで済む。

#!/bin/baash

# ソースコード取得するための hg(mercurial)導入
sudo yum install -y hg
# 最新のOpenJDK8のソースコード取得
hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk8
# ビルドに必要な関連プロジェクトのソースコード取得
cd openjdk8
./get_source.sh

# ビルドに必要なパッケージ等のインストール
# Fedora標準はJREのみのため、Boot JDK用に jdk7u7 以降のJDKを導入する。
sudo yum install -y java-1.7.0-openjdk-devel
# ビルドに必要な諸々のパッケージインストール (ないとconfigure/make時にエラー)
sudo yum install -y libXtst-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel libXt-devel

# configuration
chmod +x configure
./configure
# ビルド
make all
# 動作確認(バージョン表示)
build/linux-x86_64-normal-server-release/jdk/bin/java -version

今回は特にオプションを追記せず、 make all でビルドしたが、色々なオプションがあるので Makefile 等を参照すると良い。

退職しました

本月末で某インフラグループのSI会社を退職しました。次は同グループ持株組織の研究所系のなんたらセンターに行きます。

2009年度に新卒で入社してから4年間お世話になりました。初っ端から燃え上がったJavaの鉄火場に突っ込まされたり、いつの間にかAndroidJavaScriptの性能改善に入ったり、セキュリティコンサルをしてたりしてました。手広過ぎますが、一言でまとめれば主に性能問題に対するトラブルシュータ的な位置付けだったように思います。何人もの諸先輩・後輩方に助けられつつ、故障解析に追われながらも主にインフラ面の知識を吸収しながら直ぐに試せる場を与えられたのは僥倖でした。

ここ一年はJava EE実装の検証も始め出し、GlassFish User Group Japan(#glassfishjp) での発表や、JJUGでLTするなど、Javaへの恩返しを兼ねてユーザ活動も取り組み始めました。当退職エントリの投稿を勧めて頂いた先輩の id:sh2 さんを見習ってブログももう少し真面目に取り組みたいと思います…多分。

新しい職場ではもう少しコアにJavaをやります。より広い範囲と携われるので色々と試しながら楽しみます:)

Apache TomEE 事始め

この記事は Java EE Advent Calendar 2012 の5日目です!

Apache TomEE

Apache TomEEは去年のJavaOne 2011で発表された、TomcatベースのJava EE 6 (Web Profile)対応のJava EEアプリケーションサーバです。とみーと読みます。
これにRESTfulなWebを作るのに必須なJAX-RSを載せたJAX-RS版とみー君もいます。また、Certifitedではありませんが、Full Profileに近づけた機能を持つとみーぷらす (TomEE Plus) というものもあります。
必要に応じて使いやすいとみー君を選ぶことができます。それぞれの違いはここの比較表が解りやすいです。

華々しい(?)発表の後はあまり進展のない日々が続きましたが、今年のJavaOne 2012前にバージョン1.5がリリースされました。以前は手持ちのJavaEE6サンプルが一発で動かなかった&NetBeansで動かなかったため、TomcatにOpenXXXをつなぎ合わせた『ふらんけん』状態なのかと思い、そっと閉じた経験があったのですが改めて見ていきたいと思います。

TomEEのインストール

落として、解凍。おわり。tomcatと一緒ですね。簡単な動かし方としては、以下の通りに実行できます。

  • 実行する:bin/startup.sh
  • デプロイする:bin/tomee.sh deploy
  • 終了する:bin/shutdown.sh

Web管理コンソールはTomcatと一緒で、http://localhost:8080にアクセスすると確認できます。ポートは tomcatと同様に conf/server.xml を書き換えることで変更できます。

NetBeansでTomEE

次にNetBeansでTomEEを動かします。

  1. サービスタブ > サーバー > 右クリック > サーバを追加
  2. サーバーを選択
    1. Apache Tomcat を選択。
  3. インストールとログインの詳細
    1. サーバーの場所:Apache TomEEを配置した場所
    2. ユーザ名/パスワード:デフォルトならtomee/tomee。設定はconf/tomcat-users.xmlを直接編集する。


これで終わりです。Tomcatと同じ方法でインストールできます。

Java EE 6 サンプルアプリを動かす

NetBeansに収録されている Java EE 6 (JSF & JPA)のサンプルアプリである Pet Catalog を TomEE で実行してみます。

プロジェクトを作って何も考えずに実行する
  • 新規プロジェクトでサンプル > Java EE > Pet Catalog からプロジェクトを作る。
  • プロジェクトを選んで右クリック > プロパティ > 実行 > サーバ に先ほど登録した TomEE を選択 > OK
  • 実行
12 05, 2012 6:32:51 午前 org.apache.catalina.core.StandardWrapperValve invoke
重大: Servlet.service() for servlet [Faces Servlet] in context with path [/petcatalog] threw exception [javax.el.ELException: Error reading 'pagingInfo' on type controller.Catalog] with root cause
java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
(略)
<openjpa-2.2.0-r422266:1244990 fatal general error> org.apache.openjpa.persistence.PersistenceException: java.net.ConnectException: Connection refused: connect
(略)

そうは問屋が卸さない。しかし今回はとみー君が原因ではなく、JPA周りの設定していなかったのが原因であり、ここの設定を進めれば動きそうです。

TomEE の JPA 関係の設定をする

まずはpetcatalogの永続化ユニットの設定を確認します。

  • PetCatalog > 構成ファイル > persistence.xml (実体はsrc/conf/persistence.xml)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="catalogPU" transaction-type="JTA">
        <jta-data-source>jdbc/petcatalog</jta-data-source>
        <properties>
            <property name="eclipselink.jdbc.user" value="root" />
            <property name="eclipselink.jdbc.password" value="nbuser" />
        </properties>
    </persistence-unit>
</persistence>

今回はとみー君に含まれるOpenJPAを使っているのでeclipselinkの設定を消します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="catalogPU" transaction-type="JTA">
        <jta-data-source>jdbc/petcatalog</jta-data-source>
    </persistence-unit>
</persistence>

次にとみー君のDataSourceは conf/tomee.xml で設定しています(参考)。これを開くと、以下のようなHSQLDBを使う設定がありました。

<Resource id="My DataSource" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
  UserName sa
  Password
  JtaManaged true
</Resource>

<Resource id="My Unmanaged DataSource" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:data/hsqldb/hsqldb
  UserName sa
  Password
  JtaManaged false
</Resource>

OSSのPostgreSQLの設定などに変更しても良いのですが、折角なのでHSQLDBを使います。他のデータベースを使う場合はこちらを参考に書き換えます
今回はJTAで管理しているデータソースとして jdbc/petcatalog をしているので、JtaManaged が true になっている Resource の id を合わせて変更します。

<Resource id="jdbc/petcatalog" type="DataSource">
  JdbcDriver org.hsqldb.jdbcDriver
  JdbcUrl jdbc:hsqldb:file:(適当なファイルのパス)
  UserName sa
  Password
  JtaManaged true
</Resource>

今回使うデータベースにテーブルを作る必要があります。各データベースに合わせて、PetCatalog > サーバー・リソースにある catalog.sql に書かれている SQL を実行してテーブルを作成します。今回はHSQLDBを使っているので、「java -cp lib/hsqldb-2.2.8.jar org.hsqldb.util.DatabaseManager」から HSQLDB の管理ツールを呼び出してテーブルを作成しました。

改めて実行する

サービスタブからTomEEを選択して右クリック→再起動を実施後、PetCatalogをもう一度実行してみます。

動きました!

まとめ

実際にここまでの作業をしていてストレスは余り感じないほど起動・再起動が高速でした。Tomcatに慣れているが、他のJavaEEサーバはちょっと…という人には良いかもしれません。しかし、管理コンソール/ツールが貧弱、IDEとの連携があまりなく他のJava EEサーバと比べるとIDEの恩恵が弱いという点が気になりました。普段はGlassFishを使っているのでその部分がより顕著に感じました。
余談ですが、JavaOne 2012のTomEEセッションで、「実際に商用で使えるのか?」という質問にはげふんげふんな感触でした。商用でも安定していくようであれば、戦略的に選択していく所も増えるのではないかと思います。がんばれとみー君!
同じオープンソースであるGlassFishの勉強会(#glassfishjp)が12/13(木)にあります!こちらもよろしくお願いします!

次回は @masafumi_ohta さんです!よろしくお願いします!