神曲プロデューサー、生徒会探偵キリカ1

神曲プロデューサー

神曲プロデューサー

たしか発売してすぐに買って割とすぐに1章を読んだのだけど、どうしても電車内で読む気がしなくてずっと積んでた。そしたら楽聖少女4巻の口絵にプロデューサーの話が書いてあって、そろそろ読むかーって気になってきたので読みました。

基本的に杉井光の話って、どうしようもないクズな主人公がいつものように精一杯頑張ったんだけどクズなので頑張る方向を間違えて気づいたら失敗していてでも頑張ったんだから少しぐらいは報われてもいいだろうみたいな話で、それなのにいつもクソ面白くて悔しいのでこんなクソみたいな話二度と読まねえって思ってるんだが、なんだかこの本は普通にいつものやつだったのに杉井光の本で初めて何度でも読み返したくなる本だった。

やっぱり杉井光の何かを解決する話は好きだな。やっぱもう諦めるしか無いのかな→何かに気づく→突拍子もないことを思いつく→お前ホントにそんなことできるのかよ→できます(ハッタリ)→なんとかする。の流れ、いつもワンパターンなのにすごい気に入ってしまうのですごい悔しいんだよね。というわけで読んだのが生徒会探偵キリカです。

生徒会探偵キリカ1 (講談社ラノベ文庫)

生徒会探偵キリカ1 (講談社ラノベ文庫)

神曲プロデューサーの少し重めの話を読んだあとで、キリカを読んだのは正解でした。すごい読みやすくて安心感ある。妻とも話したんだけど低年齢層向けで、神メモをまんま明るく軽くして、ヒロインをピアノソナタから持ってきて、みたいな話。キリカは続刊もどんどん読んでしまおうかと思います。

楽聖少女 4

出だしからベートーヴェンの交響曲第5番「運命」のイントロを、ベートーヴェン自身の口で「四回も八回もドアをノックするのは借金取りだけだよ!」とか言わせてて、まあひどい解釈もあったもんだなあとか思うわけですが。

今回は音楽の話というよりかは、どちらかと言えば中世ヨーロッパの歴史の話がメインだったように感じる。というのも読みながらなんとなく世界ふしぎ発見!あたりのイメージが浮かび上がってくる感じがした。それと、世界史の先生の授業シーンは毎回楽しみにしてるシーンなんだけど、今回は特に面白かったなあ。

ラストの解決法もなかなか強引ではあったけれど、まあ面白かったし良かったかなー。いろいろ伏線が張られているので次巻もお楽しみにってところですね。

JJUG CCC 2013 Fall に参加してきた

2013/11/11 いろいろ書き忘れてたりスライド公開されたりしたので追記しました。

基調講演-2 2013 エンタープライズ Java 最前線

日本オラクルの寺田佳央さんの基調講演。 GlassFish, JavaEE 7, Project Avatarの話がメインだった。

GlassFish

GlassFish4からは商用サポートがなくなって、オープンソース版のGlassFishのみの提供になるらしい。 Oracleからの商用サポートが欲しければWebLogicを使ってねって話だった。

Java EE 7

JavaEE7は、JavaEE6をベースにしているので、JavaEE6をまずお勉強してから差分をお勉強するといいのではないか。 JavaEE7で新規追加はConcurrency, Batch, JSON, WebSocket。この4つのうちではWebSocketがトレンドらしい。

Project Avatar

JavaScriptでサーバーサイドプログラミングできるよ!ってやつみたい。 現状のRhinoですでにJSをJVM上で動かすのはできてたけど、Java7のIndyを使った新しいJSエンジンのNashornを使うともっと早くなるよという話があった。 Java開発者にJavaSciptへ転向しろって話なのか?って質問があったけど、HTML5アプリが今のトレンドなので、その開発に対する選択肢を増やす目的と言ってた。 まあJavaScript苦手なのであんまり触らないかな、という感じがした。

H-1 ジェネリクスの基礎とクラス設計への応用

Generics Hell

自分が大学でJava触り始めた頃はすでにそろそろJava6が出るぞという頃だったので、仕事とかでJava1.4とか触らざるを得ないとだいぶしんどい。そういう意味でもGenericsはHellを与えてくれる。

基礎知識

ジェネリクスはI/Oの関係性を示す。関係がないときは型変数を使わずに"?"を使う。

境界
  • <? extends T> → 引数にTがあるメソッドが使えない
  • <? super T>  → 戻り値にTがあるメソッドが使えない

ジェネリクスメソッドとかを作る側になった時に覚えておくと便利そう。

それから、初めて知ったのはこれ。

<? extends T & Serializable & ...>

extends以降は"クラス & インターフェース & ... "って続かないとダメみたい。なので、extendsのあとインターフェースだけで境界を設定したい場合は、

<? extends Object & Serializable>

って書かないといけないらしい。まじか。。。

H-2 徹底解説!Project Lambdaのすべて

ジェネリクス→ラムダの流れいいね。ついったーでも何回か言ってたけど、本当に素晴らしくて楽しいセッションだった。

何故Lambdaが必要なのか、Lambdaを導入するにあたっての解決すべき項目、解決手段、結果の順に追って説明してあって、すごいわかりやすかったし、スライドもあとから見てわかりやすく作ってあった。

へえーと思ったところ

  • ラムダ式の引数でだけ、"_"(アンダーバー)が予約語になってて使えないらしい。
  • 型合成マジキチw
  • Objectのデフォルト実装はできない
  • strictfpは使わないわ……
  • Interfaceにpublic static void mainを書いて実行!やったー!!

H-4 リーンスタートアップ x Java

会社を立ち上げてから、どんな感じでJavaを作業の自動化に導入してきたか、という話をしていた。普段から仕事の合間に作業をJavaで自動化したりすることの多い自分にとって、まずは手動でやってからミスが起きたりめんどくささが勝ち始めたあたりで自動化する、という流れはは非常に頷けるものがあった。

Adobe Acrobat Proのフィールド埋め込み機能はすごいなあれ。普通に仕事で使えると思う。あーやってフィールド埋め込むだけなら1ライセンスあれば十分だしな。

その他もろもろ

  • 角印技術ぱねえ!
  • Selenium便利すぎる
  • 需要ありそうなものはどこかのタイミングでOSSにしていくの自分も心がけたい。
  • Googleフォームは自動折り返しだけでもほんと実装して欲しいよね……

R2-5 ScalaでJavaFXのWebViewを愛でる試み

Scalaって書いてあって行ったけど、自分はsbtもJavaFXもほとんど触ってなかったのでターゲットではなかった……。

http://shizone.github.io/slides/jjugccc_2013fall/

プレゼンツールを作ったよ!って話だったんだけど、そのプレゼンツールを実際に使ってました。このプレゼンツール、カンペ機能があるぞ!markdownでスライド内容が書けて、ブラウザで表示できるし、シンプルなところがいいなー。

個人的に欲しい機能としては、カンペ画面で今表示してるやつの次のスライドとか見れるといいな!

R2-6 [BOF] JVM言語パネルディスカッション

Kotlin派として参加しました!!!!

Scalaのあべさん、Clojureのニャンパス*1登尾さん、Kotlinの長澤さん、Kinkの宮川さん、Groovyの山本さん&中野さんの5組でパネルディスカッションでした。

めっちゃ人いる!……って思ったけど、最後の枠の時間になったら半分ぐらい減ってた。圧倒的に時間の足りない感じのするパネルディスカッションでしたね……。もっと時間ほしい感じだった。

Kinkは末尾再帰最適化してるのがいいよね。Scalaで再帰でループするのカッコイイとか思ってしまったのでなかなかうらやましい。

Groovyの人はNTTソフトウェアの人だったんだけど、なんと社内にGrails推進室とかいう部署があるらしくて、そこに勤めてるらしい。いいなーいいなー。

それからKotlinのNull-Safety機構、あとから反応を見てみると割と気になってる人もいるみたいで、このスライドみて気になる人はとにかくKotlinやりましょう!

パネルディスカッションまとめ

  • Scala「先っちょだけ理論」
  • Clojure「カッコがどうせ多いんでしょ」
  • Kotlin「JSは生に限る」
  • Kink「bashよりは早い」
  • Groovy「互換性大事だから」

まとめ

技術系のイベント、初めてだったんだけどめちゃくちゃ楽しかったです。あと懇親会は、ちょっと緊張してあんまり多くの人とは話せなかったけど、次回はどんどん話していきたい感じ。 Kotlinの長澤さんと話すって目標を達成できたのでよかったです!

*1:にゃんぱすー

私がJVM系関数型プログラミング言語を知るまで

記憶の整理のためにまとめ。

はじめは、普段から読んでいたブログにJava8、Groovy、Gradle、Scala、PlayFrameworkとか、その辺りの単語をよく見るようになって、そこから興味が湧いたのだと思います。最初はとっつきやすそうなGroovyを選びました。

Groovy

公式の日本語ドキュメントを読みながら覚えました。

Groovyを触ってて感じたこと

  • Eclipseだとあんまりカラーリング効かない?
  • 補完もあんまり高機能じゃない……動的型付けだから?
  • Javaの構文がほぼ使えるのはありがたい
  • 関数とメソッドの違いがなんとなくわかった
  • どんどんクロージャを引数にとるメソッドで繋げて書けて楽しい
  • メソッド繋げすぎてスパゲッティ化しました……
  • PowerAssertとか、GStringとか便利
  • Javaのライブラリが違和感なく使える
  • 名前がチャラい

Scala

ある程度Groovy触って動的型付け苦手かもな……と感じている頃、Scalaが静的型付け言語だということを知り、Scalaをお勉強し始めました。

Groovyを触ってほんの少し関数の知識はついたので、公式のマニュアルと、関数型Scalaの翻訳記事を読みながら覚えました。

Scalaを触ってて感じたこと

  • Eclipseでのカラーリング&補完のあたりが空気読める
  • 言語仕様が多くて把握しきれないし、理解するのに時間がかかるものも多い。
  • 一度理解できればとても便利な機能やメソッドが多い。
  • 関数定義の文法とか、記号メソッドとかがいまだに覚えられない
  • Groovyやってた時より、関数型の理解が深まって楽しくなってきた
  • 名前が優等生くさい

Kotlin

Scalaもほんの少しわかってきて他の言語も触ってみようと思って、ScalaとかGroovyのWikipediaのページの下の方にある、「VM上で動くプログラミング言語」のところを見てKotlinを発見する。Intellij IDEA を作っているJetBrainsが開発しているらしい。

めっちゃわかりやすくまとまっているKotlinのAdventCalendarがあって、これでほぼ全部覚えられた。

Kotlinを触って感じたこと

  • Groovy、ScalaよりJavaをベースにしている感じが強い
  • ScalaほどCollection系のメソッドが多くない
  • というよりは全体的に機能がまだ少ないと感じる
  • Java側のライブラリでnullを返さないメソッドでも、?と!!を使わなきゃならない
  • データクラスと多重宣言がおもしろい
  • Kotlinを触ることで、Groovy, Scalaでわからなかった部分が少しわかってきた
  • Java8になってからどう変わっていくのかが楽しみ
  • 名前がかわいい

その他のいろいろ

今のところ、この3つのうちではKotlinが一番気に入って触ってて、あとScalaも少し触ってます。Groovyはあんまり触ってないです。 まだどの言語もフレームワーク周辺を全然触っていないので、その辺触りだしたらまたどの言語が良いとかは変わってくる思うけど、今までの経緯としてはこんな感じです。 次はGrails、Play Framework、Kara Web Frameworkあたりを触ってみようかなと思っています。

異世界因果のトラベローグ 1

異世界因果のトラベローグ 1 (オーバーラップ文庫)

異世界因果のトラベローグ 1 (オーバーラップ文庫)

1年半ぶりに書きます。

ここ最近ドはまりしているスズノネセブン!カミカゼ☆エクスプローラー!等のメインライターをしている姫ノ木あくのライトノベルデビュー作「異世界因果のトラベローグ」1巻を読みました。

最初に言っておきますが、カミカゼ☆エクスプローラー!はR-18要素を差し引いても、学園異能系ストーリーとして非常に完成度の高い作品なので本作が気に入った方は是非プレイすることをおすすめします

で、本編の話ですが、前述のスズノネ、カミカゼと比べて全体的にラノベ風味のキャラ付けになってるんだけど*1、敵味方ともに上記作品でよくあるポジションのキャラばっかりなので、姫ノ木あく作品を気に入っている人は読んで損はないと思います。

そうでもない人も、ライターによくある会話文の多い文体になってはいるけど、さっきも言ったラノベ風味のキャラ付けがうまく会話文体に反映されてるので、誰が喋ってるのか見失うこともなく、すらすら読めるかと思います。

今までに私が読んできた姫ノ木あくの主人公は、だいたい特徴として、"理解が早い"、"適応力が高い"、"決定力が高い"、"おっぱいが好き"ってところがあって、 この主人公がうまいこと話をテンポよく進めているところが評価高いですね。ちゃんと主人公してるあたりも好感度高い。

ひと通り読んでみて一番好みだなと思ったのは、枕野なるあかな……。まあ、スズノネでいうと代官山すみれ、カミカゼでいうと宇佐美沙織が好きなのでそうでしょうともと言った感じですね。姫ノ木あくの低身長キャラは濃くて楽しい。

*1:まあ当然か

メンバ変数宣言時の初期化=コンストラクタによる初期化

適当にわけのわからない処理を生産してたらよくわからないことになってハマったのでメモっておく。

上記の実行結果は以下のようになる。

parent
null

ChildInitAtMemberDeclを逆コンパイルすると以下のようになる。

class ChildInitAtMemberDecl extends ParentInitAtMemberDecl
{

    ChildInitAtMemberDecl()
    {
        childStr = null;
    }

    protected void init()
    {
        super.init();
        childStr = "child";
    }

    public String getChildStr()
    {
        return childStr;
    }

    private String childStr;
}

見て分かる通り、メンバ変数宣言時に初期化 = コンストラクタで初期化となる。

ChildInitAtMemberDeclの初期化手順は以下のようになる。

  1. ChildのコンストラクタでParentのコンストラクタを呼ぶ
  2. ParentのコンストラクタからChildでオーバーライドしたinitが呼ばれる
  3. super.initでparentStrに文字列をセット
  4. Childのinitに処理が戻り、childStrに文字列をセット
  5. Parentのコンストラクタに処理が戻る
  6. Childのコンストラクタに処理が戻り、childStrにnullをセット


まあ、(前記事に引き続き)最初からこんなコーディングするなという話……。

Java6,7で可変長引数を持つメソッドをオーバーロードしている際にコンパイル結果が違う時がある

コンパイル結果の違うソース

上記のソースをJDK6のjavac、JDK7のJavacでそれぞれコンパイルすると、結果が違うことがわかる。

JDK6

D:\dev\Java>javac.exe CompileResultDiffTest.java

D:\dev\Java>

JDK7

D:\dev\Java>javac.exe CompileResultDiffTest.java
CompileResultDiffTest.java:6: エラー: testの参照はあいまいです。Compil
eResultDiffTestのメソッド test(int,Object...)とCompileResultDiffTestのメソッド test(Object...)が両方適合します
                test(0, "a");
                ^
エラー1個

D:\dev\Java>

同じクラスの可変長引数をもつメソッドをオーバーロードしているメソッドで

他に用意されている引数が可変長引数のクラスにオートボクシング出来る場合に

Java7ではあいまいエラーとして解釈するようになった?

そもそもそんなオーバーロードするなという話でもあるが……。


eclipse側の問題

問題はeclipse側のコンパイラ

eclipseコンパイラJDKコンパイラと別のモノだというのは下記サイトとかにある。

http://www.myeclipseide.jp/blog/2009/06/eclipse-jdt.html

http://feather.cocolog-nifty.com/weblog/2004/08/eclipsej2sdk.html


eclipseでコンパイルする際にどのJDKバージョンに従うかは、設定(Java>コンパイラ)でコンパイラー準拠レベルを設定すればよい。

しかし、コンパイラー準拠レベルの設定にかかわらず、上記ソースのコンパイル結果は以下のようになる。*1

バージョン曖昧エラー発生有無
eclipse3.7(Indigo)あいまいエラーは発生しない
eclipse4.2(Juno)あいまいエラーが発生する

そのため、Java7を使って開発するけど、eclipseはどんなバージョンでも構わない という場合に

Indigoを使って書いたコードが、Junoでコンパイル通らない、という状況が発生する場合があるので、

気をつけたほうが良いかもしれない。

*1:Indigo以前のバージョンは試していない。