Author Archives: susumuis

About susumuis

メイドカフェによく居るWebエンジニア

何者にもなれないエンジニアが、技術を磨くためのただ3つの方法

エンジニアの生存戦略として、よく「アウトプット大事」と言われます。

「勉強会でお客さんになっていては上達しない。発表者にならなければ!」とか「本を読むだけでなく、OSSにコミットしよう」とかは、確かにその通りだと思います。言うまでもなく、人に教えるには教わる側の数倍の知識が必要とされます。技術は実践しないと身につかないですよね。

とはいえ、会社で雇われ、平均的に働き、平凡な能力しかない大勢のエンジニアにとって、OSSにコミットしたり、勉強会でLTすることは結構敷居が高いことです。そもそも、使う価値があるからOSSは使われ、聞く価値があるから発表は聞かれるのです。世の中実力勝負です!昔よりは裾野が広がったとは言え、それでもオリジナリティって難しいのです。

そこで今日は、僕自身一平凡なエンジニアとしての視点から、普通のエンジニアが上を目指すために取るべき戦略を提案してみたいと思います。

ローカルグループ活動

○○ユーザ会主催などのガチの勉強会でいきなりLTするのはちょっと怖い高いですよね。一流の人達に混じってガクガクブルブル………しかし、一流じゃなくてもあなたの話を聞きたい人は居ます。地域や会社、友達、IT以外の趣味を持つグループなどの仲間です。そんな仲間内で、お互いに勉強しあう会を定期的に行うのはどうでしょうか?

このような近しい人の輪では、発表の内容自体よりも「○○さんは何をやっているのだろう」ということに参加者は興味を持っています。それでも発表するという行為は変わりません。この要求度に限って言えば、本当のIT勉強会となんら変わらないのです。従って、発表のやり方とかスライドの作り方が自ずと鍛えられるようになります。

ただし、このような会での発表のあり方は、ガチの勉強会と異なって、参加者が発表者の発表内容を聞きたくて来ているわけでは(必ずしも)ないところがあります。そのため、自分の専門分野外の人に専門分野のことを説明するための工夫が必要です。仕事をしているとその分野についてとても深い所で気づかず、うっかり専門用語を使ってしまいます。そういう発表をすると、とたんに寝る人が出たりします。それを防ぐためには敢えて自分の専門分野外の一般受しそうな話を持ってきたり、専門分野外のことも広く浅く(なぜなら参加者の中では例えば一番「パソコンに詳しい」と思われている)知っておくなどの準備が必要です。そういうのを好むか好まないかは人それぞれとは思いますが、エンジニアはユーザあってのエンジニアですし、意外とこういう場から世の中のニーズが見えてきたりします。

コミュニティー奉仕

「この人すごい!尊敬する!でも雲の上のような存在でなかなか声をかけられない」そんな人っていますよね?
ところで、昨今勉強会がたくさん行われていて、大抵の勉強会は受付や会場設営などのスタッフやボランティアを募集していたりします。いつもお世話になっている勉強会に「客」ではなく「スタッフ」として参加すると、あこがれのあの人と話す機会に思わず恵まれるかもしれません。

「優秀な人の輪に入る」ということは自分戦略として重要です!

タダ働き

「知り合いにPC関係のことであれやってあげたのに、さも当然のようにされて、礼も言われなかった」
という話をよく耳にします。僕自身、何度かそのような経験があります(笑)。しかし、今となってはそんなことはどうでも良いと思っています。
プログラマーが余暇を利用してコーディングというのは、なかなかできるものではありません。「日々の仕事で疲れているし、もう液晶ディスプレイなんか見たくもない!!そんな心境で、休日はつい午後まで寝て過ごしてしまったと」いう話がピンと来る方は結構いらっしゃるのではないでしょうか?

しかし、自分の技術を使って人に喜んでもらうことができるとしたら、モチベーションもグッと上がりませんか?(`・ω・´)

その際、対価は受け取らないという手法を提案します。対価を受け取ってしまうと「仕事」になってしまって途端に窮屈な感じがします。なにより、お金を取るんだから自分が完全に理解している手堅い技術を使いたくなります。そこからは成長は見込めません。プロらしくないかもしれませんが、対価を受け取らないんだから責任も軽減されます。一方で、お金を取らないのだから当然費用が発生する方法は使えません。必然的にOSS、フリーミアムのあるプラットフォームなどを利用する方向に行くと思います。最近ホットなScalaとか、GoogleAppEngineなどを使うチャンスです!そして、小さなプログラムでも、れっきとした事例です。これであなたもモテエンジニアへ一歩踏み出せます!(*´∀`)

JVM用のJavaScriptエンジンをまとめてみる

JVM上で動くJavaScriptについて調べたので、メモしておきます。

これまでの状況

まずは、Rhinoが有名です。「ライノ」と呼びます。RingoJSMayaaなど、すでに広く使われています。Java6から標準でJDKにバンドルされています。(ただし、バンドルされたものは若干バージョンが古いです。)
Rhinoの他には Apache Aptana Jaxerというサーバサイドでscriptタグを解釈するフレームワークがあります。こちらは、C言語で書かれたSpider Monkeyを利用しています(JNIでしょうか?)。
Spider MonkeyとRhinoはともに、Mozilla傘下で開発がされている姉妹関係にあります。Firefoxで使用されているのはSpider Monkeyの方で、現在のFirefoxでは、TraceMonkey, JagerMonkeyのようにパフォーマンス改善が施されています。

サーバサイドJSといえば、Node.jsが有名ですが、JVM上では、RingoJSというフレームワークがあります。これはRhinoをベースにしています。

その他、Java上でChromeOSで使われているV8エンジンを使おうという試みもあります。
http://rbackhouse.blogspot.com/2011/03/using-google-v8-javascript-engine-in.html

これからの動き?

Java7から、invokeDynamic機能が搭載されました。これによって状況が変わりました。なぜかというと、invokeDynamicを使用すると、JVM上で動くスクリプト言語のパフォーマンスを向上できるからです。Rhinoはパフォーマンスのために、ソースコードが職人芸になってしまい、読みづらいと言われています。
OracleはJava8で、新しいJVM上でのJavaScript実装 Nashorn をRhinoの置き換えとしてリリースするとアナウンスしました。Nashornとは、ドイツ語で「サイ」を意味する(中性)名詞です。「ナズホーン」と呼びます。ちなみにRhinoは英語で「サイ」という意味です。ソースが公開されるのかについての言及はないので、商用製品としてリリースされる可能性があります。
他にDyn.jsというプロジェクトがApache2.0ライセンスで開発が進められています。これは、Dynalinkantlr3という、同じApache2.0ライセンスのライブラリをうまく利用して、ソースを読んで見ましたが非常に綺麗な印象を受けました。
Rhinoも開発が続けられていて、invokeDynamic対応が進められています。

今後どうなるのか?

2011年12月3日時点zipでダウンロード出来るバージョンのDyn.jsをダウンロードして実行したところ、次のコードが誤って実行されていました。

(funcion(x){print(x)})(1)

x

これはバグです。Rhinoで同じコードを書くと

1

と出力されます。最新版ソースからビルドしたものを使えば直っているかもしれませんが、やはりまだまだ開発途中という印象があります。ドキュメントが充実していないので、例えば、Javaオブジェクトとの連携方法がよくわかりません。RhinoではPackages.パッケージ.クラス名でアクセスできますが、この記法で統一されるのでしょうか?

Java8のリリースは2013年と言われているのでまだ時間があります。Rhino自体はパフォーマンスに問題がないため、今後も使われていくでしょう。NashornはOracleの力で、もしかしたら今後普及するかもしれません。Dyn.jsはソースが非常に美しいので、頑張って欲しいと思います。

HTML5ブラウザを内包するアプリケーションをJavaで作る場合は、V8エンジン+JNIを検討するのも選択肢として良いかもしれません。

Javaやが知るべき5つのJSエンジン

という釣りタイトルで以下のエンジンを列記した際は当エントリへ、今時流行らないトラックバックでもくださいw

  • Rhino
  • SpiderMonkey
  • V8
  • Nashorn
  • Dyn.js

5人揃ったので

赤ライノ、青スパイダー、緑ブイ、ピンクナズホン、イエローディーン、5人揃ってJSエンジャー

追記

2011/12/03 22:33 Aptana JaxerをApacheと記入してしまっていたので修正しました。やや言い回しやレイアウトなど修正しました。

この記事は以前多くのブックマーク・コメントを頂きました。

これからブックマークされる方はこちら↓

変態Comparatorを書いてユニットテストをしてみた

変態アドベントカレンダーが止まってしまいそうなので支援します。

最近、勤務先の会社で、アルバイト希望の学生に試験を出したりしているのですが、Comparatorが書ける子いないので、(ある意味)模範例のつもりで颯爽と書いてみたいと思います。(いえーい!みんな見てるー?w)

どんなときでも"hentai"または"HENTAI"が先頭に来るコンパレーターです。

import java.util.Comparator;
public class HentaiComparator implements Comparator<String> {
    public int compare(String o1, String o2) {
        if ("hentai".equalsIgnoreCase(o1)) {
            if ("hentai".equalsIgnoreCase(o2)) {
                return o1.compareTo(o2);
            }
            return -1;
        } else if ("hentai".equalsIgnoreCase(o2)) {
            return 1;
        }
        if (o1 == null) {
            if (o2 == null) {
                return 0;
            }
            return 1;
        }
        if (o2 == null) {
            return -1;
        }
        return o1.compareTo(o2);
    };
}

ついでにユニットテストも書いてみましょう。


import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.util.Iterator; import java.util.TreeSet; import org.junit.Test; public class HentaiCompareTest { @Test public void 並び順テスト() { TreeSet<String> hentaiSet = new TreeSet<String>(new HentaiComparator()); hentaiSet.add("susumuis"); hentaiSet.add("hoge"); hentaiSet.add("HENTAI"); hentaiSet.add("fuga"); hentaiSet.add(null); hentaiSet.add("hentai"); Iterator<String> iter = hentaiSet.iterator(); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), is("HENTAI")); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), is("hentai")); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), is("fuga")); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), is("hoge")); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), is("susumuis")); assertThat(iter.hasNext(), is(true)); assertThat(iter.next(), nullValue()); assertThat(iter.hasNext(), is(false)); } }

注意:このコードを参考にして弊社の試験を落ちても何の保証もできません。