mike-neckのブログ

Java or Groovy or Swift or Golang

Gradle2.10のリリースノート意訳

久々にパソコンの前に座ったので、リハビリ代わりに先月にリリースされたGradle2.10のリリースノート意訳というか、中途半端に翻訳した。分量が多かったので訳してないところがありますが、引き続き入院してるので、翻訳の続きはありません。

オリジナル(英文)はこちら

新機能と変更

ネイティブコンパイルのパフォーマンス改善

Gradleはインクリメンタルビルドする場合に、すべての入力値、入力ファイル、出力ファイルを必要としている。それによってGradleは入出力ファイルの変更がない場合にタスクをスキップできる。

ネイティブコンパイル系のタスクの場合、ディレクトリー構造も考慮しているため、インクルードされるディレクトリーが多い場合や、ルートディレクトリーがインクルードされている場合にパフォーマンス上の問題が発生した。UP-TO-DATEチェックを速くするために、以下の変更をおこなった。

  • インクルードディレクトリーも入力値として扱う
  • 実際に参照されるヘッダーファイルだけを入力情報として扱う

我々のベンチマークでは非常に大きなプロジェクトのインクリメンタルビルドにおいて多大な改善がみられた。

C++および関連言語では、Gradleはソースファイルをパースしてインクルードされるヘッダーファイルを特定する。Gradleがヘッダーファイルの特定ができない場合は、古いメカニズムを採用する。つまり、マクロによって#include句を定義することは、新しい仕組みを利用できなくなるため、推奨されない。

テストキット依存性の改善

gradleTestKit()を使ってGradleテストキットをテスト時ランタイムクラスパスに組み込むことができる。以前のバージョンではテストキットがGradleのコアに依存しているため、コアクラスもテスト実行時のクラスパスに組み込んでしまっていた。そのため、テストキットにより追加される実行時ライブラリーとユーザーが利用する依存ライブラリーとの間でバージョンのコンフリクトが発生してしまっていた。

Gradleテストキットは実行時クラスパスの汚染を避けるために、テストキットが依存するGradleのコアクラスおよび依存ライブラリーをオールインワンjarの形で利用するように修正する。

buildScript 依存性を図示する新しいタスク

buildEnvironmentタスクによって、buildscriptブロックで宣言された依存性を表示できるようにした。これによって、ビルド時のビルドのデバッグなどがよりやりやすくなる。

チェックスタイルレポートのHTML出力

チェックスタイルタスクがXMLに加えてHTMLの形式でもレポートを出力するように変更した。このHTMLレポートはデフォルトで利用できる。

eclipseプロジェクトにてTooling APIがソースレベルで開示されるように修正

tooling APIJavaソースレベルでAPIを開示するようにして、eclipseプロジェクトでjavaSourceSettingsプロパティから参照できる。Buildshipなどで煩わしかった設定が簡素化される。

Javaソフトウェアモデルにおける依存性管理機能

今回のリリースでJavaソフトウェアモデルに依存性管理の機能が追加された。

コンポーネントレベルでの依存性管理

ソースで依存性を表現するよりもコンポーネントを用いた方がやりやすい。

plugins {
  id 'jvm-component'
}
model {
  components {
    main(JvmLibrarySpec) {
      dependencies {
        library "core"
      }
    }
    core(JvmLibrarySpec) {
    }
  }
}

外部依存性管理

ソフトウェアモデルでの外部依存性管理も利用可能になった。

apply plugin: 'jvm-component'
repositories {
  jcenter()
}
model {
  components {
    main (JvmLibrarySpec) {
      dependencies {
        // 外部依存性はmoduleでもgroupでも始められる
        group 'com.acme' module 'artifact' version '1.0'
        module 'artifact' group 'com.acme' version '1.0'
        // ショートハンドスタイルも利用可能
        module 'com.acme:artifact:1.42'
      }
    }
  }
}

ソフトウェアモデルにおけるDSLの改善

モデル空間のDSLを修正した。

ネストしたルール

ModelMapの生成や設定ではネストしたルールを利用できる。

model {
  components {
    myLib { … }
    test {
      // `myLib`を入力値として利用する。
      // このコードが実行されると`test`が完全に定義されて、model 以外からは変更できなくなる。
      targetPlatform = $.components.myLib.targetPlatform
    }
  }
}

tasksModelMapであるため、タスクは他のタスクを使って定義することができるようになった。

model {
  tasks {
    jar { … }
    dist(Zip) {
      // `jar`タスクを入力として利用する
      // この定義はモデル空間で定義されて、model 以外からは変更できない
      def jar = $.tasks.jar
      from jar.output
      into "someDir"
    }
  }
}

このようなModelMapメソッドを利用した定義も可能である。

model {
  components {
    all {
      // すべてのcomponentに適用される定義
    }
    withType(JvmLibrarySpec) {
      // JvmLibrarySpec型のコンポーネントに適用される定義
    }
  }
}
@Managedが付与された型のオブジェクトに対するプロパティの設定

@Managedが付与された型のオブジェクトが保持するプロパティはネストしたクロージャーで定義することができるようになった

model {
  components {
  myLib {
      sources {
        // `myLib.sources`に対する定義
      }
      binaries {
        // `myLib.binaries`に対する定義
      }
    }
  }
}

@Managedが付与された型のオブジェクト、あるいはModelMap<T>インスタンス、あるいはModelSet<T>インスタンス、これらのプロパティにてこの変更が利用できる。ネストされたクロージャーではネストしたルールを定義できないこと、および更にクロージャーがネストした場合にすぐに実行されてしまう(実行を遅らせることができない)ことの二点に注意が必要である。この点については次のGradleのリリースで改善される予定である。

より詳しくはモデルDSLを参考。

スカラー型のプロパティがより簡単になった

モデルDSLにて自動的にスカラー型の自動的な規約がサポートされた。具体的にはStringスカラー型の値として利用できるように。

enum FailType {
  FAIL_BUILD,
  WARNING
}

@Managed
interface CoverageConfiguration {
  double getMinClassCoverage()
  void setMinClassCoverage(double minCoverage)

  double getMinPackageCoverage()
  void setMinPackageCoverage(double minCoverage)

  FailType getFailType()
  void setFailType(FailType failType)

  File getReportTemplateDir()
  void setReportTemplateDir(File file)
}

model {
  coverage {
    minClassCoverage = '0.7' // `String`で`double`の値を設定可能
    minPackageCoverage = 1L // `long`で`double`の値を設定可能
    failType = 'WARNING' // `String`を`Enum`の代わりに利用可能
    templateReportDir = 'src/templates/coverage' // `File`オブジェクトをプロジェクトからの相対パスで作成可能
  }
}

ソフトウェアモデルでのプラグイン開発のサポート

今回のリリースにはプラグイン開発者がソフトウェアモデルを拡張することを可能としている。

LanguageSourceSetモデルへのサポート

今回のリリースでモデル空間の任意の箇所にソースセット(LanguageSourceSetのサブタイプ)を追加可能にしている。@Managedモデル型のプロパティとして、あるいはModelMap<T>ModelSet<T>の値(Tの型)として、あるいはモデル要素のトップレベル要素としてLanguageSourceSet型を追加可能になった。

バイナリーおよびコンポーネント

BinarySpec型もしくはComponentSpec型を継承した型を、メソッドの実装なしに、@Managedアノテーションを付与することで作成することができるようになった。同様にLibrarySpec型とApplicationSpec型も拡張できるようになっている。

@Managed
interface SampleLibrarySpec extends LibrarySpec {
  String getPublicData()
  void setPublicData(String publicData)
}

class RegisterComponentRules extends RuleSource {
  @ComponentType
  void register(ComponentTypeBuilder<SampleLibrarySpec> builder) {
  }
}
apply plugin: RegisterComponentRules

model {
  components {
    sampleLib(SampleLibrarySpec) {
      publicData = "public"
    }
  }
}
バイナリー型、コンポーネント型用内部モデル
@Managed
interface MyJarBinarySpecInternal extends JarBinarySpec {
    String getInternal()
    void setInternal(String internal)
}

class CustomPlugin extends RuleSource {
    @BinaryType
    public void register(BinaryTypeBuilder<JarBinarySpec> builder) {
        builder.internalView(MyJarBinarySpecInternal)
    }

    @Mutate
    void mutateInternal(ModelMap<MyJarBinarySpecInternal> binaries) {
        // ...
    }
}

apply plugin: "jvm-component"

model {
    components {
        myComponent(JvmLibrarySpec) {
            binaries.withType(MyJarBinarySpecInternal) { binary ->
                binary.internal = "..."
            }
        }
    }
}
// This won't work:
model {
    binaries.withType(MyJarBinarySpecInternal) {
        // ...
    }
}
管理対象外のバイナリー型およびコンポーネント型のデフォルト実装

デフォルト実装をバイナリー型およびコンポーネント型に与えることが可能になった。

interface MyBaseBinarySpec extends BinarySpec {}

class MyBaseBinarySpecImpl extends BaseBinarySpec implements MyBaseBinarySpec {}

class BasePlugin extends RuleSource {
    @ComponentType
    public void registerMyBaseBinarySpec(ComponentTypeBuilder<MyBaseBinarySpec> builder) {
        builder.defaultImplementation(MyBaseBinarySpecImpl.class);
    }
}

@Managed
interface MyCustomBinarySpec extends BaseBinarySpec {
    // Add some further managed properties
}

class CustomPlugin extends RuleSource {
    @ComponentType
    public void registerMyCustomBinarySpec(ComponentTypeBuilder<MyCustomBinarySpec> builder) {
        // No default implementation required
    }
}
管理対象外のバイナリー型、コンポーネント型用内部モデル
/**
 * Documented public type exposed by the plugin
 */
interface MyBinarySpec extends BinarySpec {
    // Functionality exposed to the public
}

// Undocumented internal type used by the plugin itself only
interface MyBinarySpecInternal extends MyBinarySpec {
    String getInternalData();
    void setInternalData(String internalData);
}

class MyBinarySpecImpl implements MyBinarySpecInternal {
    private String internalData;
    String getInternalData() { return internalData; }
    void setInternalData(String internalData) { this.internalData = internalData; }
}

class MyBinarySpecPlugin extends RuleSource {
    @BinaryType
    public void registerMyBinarySpec(BinaryTypeBuilder<MyBinarySpec> builder) {
        builder.defaultImplementation(MyBinarySpecImpl.class);
        builder.internalView(MyBinarySpecInternal.class);
    }
}

修正されたイシュー


問題が発生する可能性のある修正

テストキットの実行時クラスパス

コンパイルに用いるヘッダーファイル

DSLのモデル空間の変更

ソフトウェアモデルの修正

Javaソフトウェアモデルの修正

ネイティブモデルの修正

既知の問題

エンジニアが勉強し続ける理由

これはほとんどネタです。

ここ最近、マルクスを再読していました。貧富の格差、貧困の問題とかワーキングプアーなどがニュースになっていることを見るにつけ、マルクスが気になっていたからです。マルクス資本論を書くための準備していた時期の『経済学・哲学草稿』などに、貧富の格差、ワーキングプアーといった今とまったく同じ問題が記述されていたので、マルクス経済学は超克したとかいいつつ、実は全く何も超克していないのだと思いつつ有ります。

時折、話題になる労働に関するテーマなどがあり、それらについてもマルクスの著書ですでに述べられていることがあったりします。


例えば、エンジニアが勉強し続けることについてです。

今年、このことの元になった記事はこれだと思います。

101回死んだエンジニア: 業務時間外で勉強をしなければいけない理由

簡単にまとめると、技術者は技術だけが武器であり、それが通用しなくなると歪んだ環境を生み出してしまうということだでそうです。

反応1

ga-chronicle.hateblo.jp

このエントリーでは勉強しない者の視点からの反応が書かれているが、このブログの著者の方自体戦略を備えていて、

ga-chronicle.hateblo.jp

自分の脳力にあわせて勉強するという選択を行っている。

反応2

ogatism.jp

まとめると、好きだからやっている。好きでない人に強制するものではないという立場である。

反応3

paiza.hatenablog.com

勉強は投資であって、投資しない場合は投資しないなりの選択肢しかもつことができないということらしい。

反応4

iritec.jp

これも投資であるという考え。リターンされない場合のリスクなどについても言及している。勉強しない技術者については、その人が不安を感じたならば、不安を駆動源にして勉強するということのようです。


これらが大体適当に取り上げた反応たち。元ネタとあわせてまとめてみると

  • 技術者としての精神的なスタンス
  • 投資を比喩としたもの
  • 技術者としての競争に勝つための必要条件

労働者間の関係はよいとして、時間を貨幣と比喩しての交換、この二つは良いとして、残りが精神的なものというのが、若干僕的には不満だったりします。


では、労働者、生産物(商品)、資本これらの抽象的なものおよび関係で記述した場合、エンジニアが技術を勉強する理由はどのように見えてくるのだろうか?少し長めにマルクスから引用しよう。

(引用者註:社会の富が増える条件として)(α) 多くの労働が寄せ集めなければならない。資本とは積み上げられた労働なのだから。となれば、労働者の生産物はますます労働者の手から奪い取られ、かれ自身の労働はますます他人の所有に帰し、かれの生存と活動の手段はますます資本家の手に集中する。

(β)資本の蓄積は分業を促進し、分業は労働者の数を増加させる。逆に、労働者の数の増加は分業を促進し、分業は資本の蓄積を大きくする。分業の促進と資本の蓄積にともなって、労働者はますます労働に依存し、特定の、きわめて一面的な、機械に類する労働に依存することになる。かくて、労働者は精神的・肉体的に機械へと格下げされ、人間であることをやめて一つの抽象的な活動体ないし胃袋となるのだが、そうなると、市場価格の変動や資本の投下や金持のきまぐれにますます左右される。同様に、ただ労働するしかない人間の増加によって、労働者間の競争が激しくなり、労働価格が引き下げられる。労働者のこうした境遇は向上労働において頂点に達する。

(γ) 景気の良い社会で金利生活ができるのは大金持だけだ。…以前資本家だったものの一部が労働者の階級に転落する。ために、労働の供給が高まり、またしても賃金が引き下げられるとともに、労働者は小数の大資本家にまずます依存することになる。資本家の数が減少したのだから、かれらのあいだでの労働者の奪い合いはほとんどなくなるが、労働者の数は増加したのだから、かれらのあいだの競争はさらに激しく、不自然で、暴力的なものになる。こうして、労働者の一部は乞食や餓死の状態に追い込まれ、中流の資本家の一部は労働者とならざるをえない。

マルクス『経済学・哲学草稿』長谷川訳、22〜23ページ

賃金の上昇は、資本の蓄積を前提とするが、資本の蓄積を推進もするので、ために、労働の生産物は労働者にとってますます疎遠なものとなる。同様に、分業の細密化は、労働者をますます一面的かつ従属的な存在とし、とともに、人間同士の競争だけでなく、機械との競争までも招き寄せる。労働者が機械に転落したとなると、機械が競争相手になるというわけだ。

同、23ページ〜24ページ

ここで、用語を整理すると、労働者は技術者、資本家は企業、生産物はソフトウェア、機械もソフトウェアと読み替えられる。労働はその集積体である生産物をソフトウェアとするもので、労働が資本家の手に集中する状態というのは、ソフトウェアを販売して、貨幣と交換する権利を資本家がもつということである。ソフトウェアと貨幣との交換、労働者の雇用は『経済学批判』における「W-G」、「G-W」に該当するが、この交換理論についてはここでは扱わない。

労働者は、自分の生産する富が大きくなればなるほど、自分の生産活動の力と規模が大きくなればなるほど、みずからはまずしくなる。商品をたくさん作れば作るほど、かれ自身は安価な商品になる。物の世界の価値が高まるのに比例して、人間の世界の価値が低下していく(引用者註:ここで言っている「価値」は交換価値であると思われる)。労働は商品を生産するだけではない。労働と労働者とを商品として生産する。商品生産が盛んになるにつれて、労働と労働者の商品化の度合いも大きくなる。

右の事実に示されているのは、労働の生産物が、労働にとって疎遠な存在として、生産者から独立した力として登場してくる、ということにほかならない。労働の生産物は、労働が対象のうちに固定されて物となった姿であり、労働の対象化だ。労働の現実化とは労働を対象化することだ。こうした労働の現実化が、国民経済学の当面する状況の下では、労働者の価値低下としてあらわれる。…

同、91ページ〜92ページ

労働者としての技術者が、労働し、生産物=ソフトウェアをつくると、労働者が保持していた技術は現実化したソフトウェアとなり、その技術は安価なものとなってしまう。したがって、その技術を保有していた労働者も安価になっていく。これが多くの技術者の間で現実化していくため、技術および労働者の交換価値はますます低下していく。

この状態を放置すれば、「賃金が引き下げられ」「労働者の一部は乞食や餓死の状態に追い込まれ」るわけだから、対象化された技術にかわる新たな技術を取り込み労働者として交換価値を保って行かなければならなくなる。


以上のように、技術者が勉強をしなければならない理由はマルクスの言葉で説明できることがわかった。だからといって、僕は人にマルクスを読めとは言わない。そんなものを読むくらいなら、よいコードを読むほうが大事であるし、コードを書いている方がマシである。

おそらく技術者もしくは労働者のキャリアとして悩むことの多くはこの約200年間なにも変わっていないのであろう。

Jigsawのモジュールのリスト作ってみた #java #Jigsaw

さっきのエントリー

mike-neck.hatenadiary.com

で、LTしてきたと書いたのですが、その際に、Jigsawのモジュールがどのように分割されたのか気になったので、調べてみました。

なお、クラス数が膨大なので、このエントリーには載せません。

github.com

上記リポジトリーのg3-mod-apiというディレクトリーに以下の二つのファイルが有ります。

上記のリポジトリーをクローンするなり、ダウンロードするなりして、確認してみてください。

  • module-list.txt - モジュールの一覧
  • module-files.txt - モジュールに含まれるクラスファイルの一覧

module-files.txtファイルを調べれば、Jigsawを利用した時にrequireするべきモジュールがわかると思います。例えばjava.sql.Driverを利用する場合などは、

$ grep "java/sql/Driver" module-files.txt
build/mods/java.sql.jmod/classes/java/sql/Driver.class
build/mods/java.sql.jmod/classes/java/sql/DriverAction.class
build/mods/java.sql.jmod/classes/java/sql/DriverInfo.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager$1.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager$2.class
build/mods/java.sql.jmod/classes/java/sql/DriverManager.class
build/mods/java.sql.jmod/classes/java/sql/DriverPropertyInfo.class

と出てくるので、require java.sql.jmod; という記述をmodule-info.javaに追加すればよいことになります。

また、Nashornを利用したい場合などは、

$ grep "javax/script/ScriptEngineManager" module-files.txt
build/mods/java.scripting.jmod/classes/javax/script/ScriptEngineManager$1.class
build/mods/java.scripting.jmod/classes/javax/script/ScriptEngineManager.class

と出てくるので、require java.scripting.jmod; という記述をmodule-info.javaに追加すれば良いことになります。

まあ、JDK9が出たら、その辺りはIDEが対応してくれると思うので、それまでの間は上のやつを使ってみてください。

おわり

【2015/11/29 2:56 追記】

さくらばさんからツッコミをもらいました。

java -listmodsでモジュールの一覧が取得できる

実行結果は以下のとおり。

$ jdk1.9.0.jdk/Contents/Home/bin/java -listmods
java.activation@9.0
java.annotations.common@9.0
java.base@9.0
java.compact1@9.0
java.compact2@9.0
java.compact3@9.0
java.compiler@9.0
java.corba@9.0
java.datatransfer@9.0
java.desktop@9.0
java.instrument@9.0
java.logging@9.0
java.management@9.0
java.naming@9.0
java.prefs@9.0
java.rmi@9.0
java.scripting@9.0
java.se@9.0
java.security.jgss@9.0
java.security.sasl@9.0
java.smartcardio@9.0
java.sql@9.0
java.sql.rowset@9.0
java.transaction@9.0
java.xml@9.0
java.xml.bind@9.0
java.xml.crypto@9.0
java.xml.ws@9.0
javafx.base@9.0
javafx.controls@9.0
javafx.deploy@9.0
javafx.fxml@9.0
javafx.graphics@9.0
javafx.media@9.0
javafx.swing@9.0
javafx.web@9.0
jdk.accessibility@9.0
jdk.attach@9.0
jdk.charsets@9.0
jdk.compiler@9.0
jdk.crypto.ec@9.0
jdk.crypto.pkcs11@9.0
jdk.deploy@9.0
jdk.deploy.osx@9.0
jdk.hotspot.agent@9.0
jdk.httpserver@9.0
jdk.internal.le@9.0
jdk.internal.opt@9.0
jdk.jartool@9.0
jdk.javadoc@9.0
jdk.javaws@9.0
jdk.jcmd@9.0
jdk.jconsole@9.0
jdk.jdeps@9.0
jdk.jdi@9.0
jdk.jdwp.agent@9.0
jdk.jfr@9.0
jdk.jlink@9.0
jdk.jvmstat@9.0
jdk.localedata@9.0
jdk.management@9.0
jdk.naming.dns@9.0
jdk.naming.rmi@9.0
jdk.pack200@9.0
jdk.plugin@9.0
jdk.plugin.dom@9.0
jdk.policytool@9.0
jdk.rmic@9.0
jdk.scripting.nashorn@9.0
jdk.scripting.nashorn.shell@9.0
jdk.sctp@9.0
jdk.security.auth@9.0
jdk.security.jgss@9.0
jdk.snmp@9.0
jdk.xml.bind@9.0
jdk.xml.dom@9.0
jdk.xml.ws@9.0
jdk.zipfs@9.0
jdepsコマンドで使っているモジュールの一覧が取得できる

ためしに、Java8でコンパイルしたjarにjdepsをおこなってみた

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps build/jars/test.frameworkJar/test.framework.jar
test.framework.jar -> java.base
   test (test.framework.jar)
      -> java.lang                                          
      -> java.lang.annotation                               
      -> java.lang.invoke                                   
      -> java.util                                          
      -> java.util.function                                 
      -> java.util.stream                                   
      -> test.exception                                     test.framework.jar
      -> test.exec                                          test.framework.jar
   test.exception (test.framework.jar)
      -> java.lang
以下略

このように出力された。また、クラスに対しても同様に

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps build/classes/test.frameworkJar/test/exec/TestExecutor.class 
TestExecutor.class -> java.base
TestExecutor.class -> 見つかりません
   test.exec (TestExecutor.class)
      -> java.lang                                          
      -> java.lang.annotation                               
      -> java.lang.invoke                                   
      -> java.lang.reflect                                  
      -> java.util                                          
      -> java.util.concurrent                               
      -> java.util.function                                 
      -> java.util.stream                                   
      -> test                                               見つかりません

という表示を得た。

また、さらに、-moduleというオプションがあり、それを使うと、モジュール名のみを表示してくれるようである。

$ jdk1.9.0.jdk/Contents/Home/bin/jdeps -module build/jars/test.frameworkJar/test.framework.jar 
test.framework.jar -> java.base
   test (test.framework.jar)
      -> java.lang                                          java.base
      -> java.lang.annotation                               java.base
      -> java.lang.invoke                                   java.base
      -> java.util                                          java.base
      -> java.util.function                                 java.base
      -> java.util.stream                                   java.base
      -> test.exception                                     test.framework.jar
      -> test.exec                                          test.framework.jar
   test.exception (test.framework.jar)
      -> java.lang                                          java.base
以下略

ところで、僕が欲しいのは、java.sql.Driverからjava.sql@9.0なんですけどね…


JJUG CCC 2015 Fall にボランティアスタッフとして参加してきた #jjug_ccc

表記の通り、JJUG CCC 2015 Fallにボランティアスタッフとして参加してきました。

JJUG CCC 2015 Fall(11月28日開催) | 日本Javaユーザーグループ

jjug.doorkeeper.jp

僕が主に担当したのはCD部屋の16:00〜の会からの空席案内役。

ひとつ前のいろふさんのセッションが超満員で、その後に追加した椅子を回収するという役割があったので、最初はちょっとだけ仕事は多かったですが、後は特に難しいこともなく、参加しているセッションを眺めているという感じでした。

なお、仕事のない時間帯に参加したセッションは次のとおり

  • GH-1 JAX-RS入門および実践 by うらがみ
    • 「裏紙 JAX-RS」でググると出てくるページを丁寧に説明してくれるセッションでした。
    • それに加えて実践的な内容でうらがみさんが経験したJava EE環境でのノウハウを紹介してくれました。
    • 普段からプレゼンしているので、非常にわかりやすいセッションだったと思います。
  • How to speed up your application using JCache《通訳有》 by gregrluck
    • JCacheよくわかっていませんでしたが、僕には高度すぎましたorz
  • CD-3 よくある業務開発の自動化事情 by irof
    • JavaというよりはSIerで開発する際の自動化の進め方と退行のしかたのセッション
    • これはSIerに所属する皆さん各位が現場に持ち帰って、ちゃんと考えてくださいというセッションですね。
    • JJUGというより、デブラブとか、デブサミなんかでやるような、ちょっとメタレベルのセッション。
    • いろふさん、プレゼン慣れしてて、聞きやすい、見やすいセッションだったと思います。

懇親会では参加者多数で3分という制限時間のLTをやってきました。なお、内容的には30分くらいは話せる内容。もうちょっと準備時間があれば、1セッションくらいの内容になると思う。というか、ここ最近の僕のGradle関連のエントリーをまとめたもの。

www.slideshare.net

まあ、でもみなさんのLTの内容に比べて、クソ真面目すぎるので、盛り上がりませんでしたね(比較的どうでもいい)。


人との出会い関連、川島さんと初めてお会いしました。あと、誰だっけ、あ、そうそう、みうみうなんできたん?とも初めてお会いしました。かずひらさんをお見かけできなかったのが残念ですね。あと、ばふぁりんさん、ひじりさんとゆきーんさんがどなただったかもわからなくて残念でした。いや、まあ、その他いろいろ。


おわり