きしだのはてな このページをアンテナに追加 RSSフィード

2017-10-21(土) Windowsが起動しなくなったら結局 電源が壊れてた話

Windowsが起動しなくなったら結局 電源が壊れてた話 05:12  Windowsが起動しなくなったら結局 電源が壊れてた話を含むブックマーク

Windows 10でjdk10をビルドしようと思って、Visual Studio Express 2010とかインストールしようと思ってたら、VC++9.0が入らないっていいだして、2度目のインストールを試してみたところ、再起動したらWindowsが起動しなくなった。

なんかセットアップに失敗したかと思ったけど、セーフモードすら起動しない。


いろいろBIOSの設定を試してみたんだけど、OSブートのタイミングで落ちてしまう。

試しにUbuntuが入ってるHDDからブートしてみたんだけど、やっぱりダメ。

ハードディスクからのブートをやめてみても、ブートのタイミングで落ちてしまう。


最初はBIOSに変なデータが書き込まれたかと思ったのだけど、これはなんかハードウェアの問題だなと思いつつ、現実逃避に部屋を片付ける。

んで、とりあえずUSBをキーボードマウス以外全部抜いてみたら、Ubuntuが起動した(ブート順を変えていた)。

やっぱ電源が怪しい。


ということで、ヨドバシに行って電源を買った。ついでにテレビチューナーボード買おうと思って箱を持っていったら品切れっていわれた。品切れなら箱 置くなよ・・・

あと、NAS買った。

電源を入れ替えたら、無事起動。よかった。


Visual Studioインストール中の再起動だったので、Visual Studioが悪いと思い込んでしまっていた。

結局Visual Studioはインストールできてない。なのでjdk10もビルドできてない。


※ 10/24 同じ現象が再発したので、電源じゃないかも。

トラックバック - http://d.hatena.ne.jp/nowokay/20171021

2017-10-12(木) JUnit5で変わるテストの書き方

[] JUnit5で変わるテストの書き方 09:44  JUnit5で変わるテストの書き方を含むブックマーク

JUnit5が案外よさげなので、JUnit5を使うとどんな感じでテストが変わるのか考えてみます。

実際にどこが変わったかとか、使い方自体はいろいろまとめられたブログがあるし、公式ドキュメントも読みやすいのでそちらを。

http://junit.org/junit5/docs/current/user-guide/


メソッドごとのテスト

JUnit5でいいのは、Nestedですね。

いままで、いろんなメソッドを対象にしたテストが入り混じってたと思います。

import org.junit.Before;
import org.junit.Test;
public class PurchaseTest {
    @Before
    public void setup() {
        // 全体のセットアップ
        // purchase()用のセットアップ
        // history()用のセットアップ
    }
    
    @Test
    public void purchase_success() {
    }
    
    @Test
    public void purchase_insufficient() {
    }
    
    @Test
    public void purchase_soldout(){ 
    }
    
    @Test
    public void history() {
    }
    
    @Test
    public void history_nodata() {
    }
}

こんな感じ。hoge_case1みたいなのがたくさん並んで、わかりにくかった。

各メソッド用のセットアップも、全部まとめるか、セットアップ用メソッドを定義して呼び出すか、みたいになっていました。


これをNested使うと、こう。

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class PurchaseTest {
    @BeforeEach
    void setup() {
        // 全体のセットアップ
    }
    
    @Nested
    class purchase {
        @BeforeEach
        void setup() {
            // purchase()用のセットアップ
        }
        
        @Test
        void success() {
        }

        @Test
        @DisplayName("金額不足")
        void insufficient() {
        }

        @Test
        void soldout(){ 
        }
    }
    
    @Nested
    class history {
        @BeforeEach
        void setup() {
            // history()用のセットアップ
        }
        
        @Test
        void normal() {
        }

        @Test
        void nodata() {
        }
    }
}

public指定が不要になったのも、地味にありがたい。

メソッドごとのテストをNestedするためのクラス名は、メソッドにあわせて小文字始まりにするのもいいかなと思うけど、IDEとかに警告されそうでもある。


テスト区分

JUnit5からcategoryの代わりにtagが導入されましたが、アノテーションが短くなったところで、いちいちつけるのは面倒。

メタアノテーションが使えるので、これも便利に。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("integration")
@Test
public @interface MySqlIT {
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("integration")
@Test
public @interface SpringIT {
}

こんな感じのアノテーションを定義して、


@MySqlIT
void store() {
  // 外部のMySQLにアクセスしちゃうテスト
}

@SpringIT
void login() {
  // よそのSpringを呼び出したりするテスト
}

みたいな感じでテストを書ける。


で、ビルドスクリプトには一括でexcludeできたり。

<configuration>
  <properties>
    <excludeTags>integration</excludeTags>
  </properties>
</configuration>

細分化しすぎると使いにくそうだけど。


パラメタライズテスト

ちょっとずつパラメータ変えたテストを書くのも面倒だったけど、だいぶ楽になります。

junit-jupiter-paramsを別にdependencyに付け加える必要があるので注意。

@ParameterizedTest(name="param test {0}")
@ValueSource(strings = {"one", "two"})
void paramTest(String param) {
    Assertions.assertEquals("one", param);
}

値の生成には、@ValueSourceのほかにも@CsvSourceとか@MethodSourceとかあるので便利そう。


pom

参考までに、これ動かしたpom。

モジュール構成はこんな感じになってます。

f:id:nowokay:20171012093851p:image


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>kis</groupId>
    <artifactId>junit5sample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <junit.jupiter.version>5.0.1</junit.jupiter.version>
        <junit.platform.version>1.0.1</junit.platform.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit.platform.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${junit.platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>        
    </dependencies>
</project>

2017-10-07(土) 新しいリリースモデルはJavaを使う人 全員要注目だった

[]新しいリリースモデルはJavaを使う人 全員要注目だった 19:05 新しいリリースモデルはJavaを使う人 全員要注目だったを含むブックマーク

9月の頭くらいに、Javaのリリースモデルが6ヶ月ごとの短期リリースになるということが発表されてました。

で、「へぇ〜」みたいな感じで見てたのですけど、JavaOneでの話を聞くと、これ結構大変なのかも、ということになってそうなので、ちょっとまとめてみます。


Javaの新しいリリースモデル

公式情報はこちらにまとめられています。(10/4にアップデートされてます)

http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html


ざっくり言えば、6ヶ月ごとに機能リリースを行い、3ヶ月ごとにメンテナンス/セキュリティリリースを行い、基本的にはサポートは次の機能リリースが出るまでだけど、3年ごとに長期サポート付きのLTSリリースを行う、という話で、いままでも話されてました。


けど、これだけだと大事なことが抜けています。

LTSはOracle JDKのみで、オラクルと契約した人だけがダウンロードできるようになる、ということです。

f:id:nowokay:20171006073637j:image

つまり、6ヶ月ごとにOpenJDKがリリースされ、その1ヶ月後と4ヶ月後にメンテナンスアップデートが出て、6ヶ月後に新しい機能を持ったOpenJDKがリリースされて、前のバージョンのOpenJDKはサポート終了。そして3年ごとにLTS付きのOracle JDKがOrackeと契約してる人に提供され、こちらはサポート期間中メンテナンスアップデートが提供される、ということになります。


よく見ると、Oracle JDKが顧客向けになることはOracle Blogsで触れられてますね。

Oracle JDKは、OpenJDKのバイナリがOracle JDKと置き換え可能になると(2018年後半ごろ予定)、主に商用およびサポートの顧客向けになります。

https://orablogs-jp.blogspot.com/2017/09/faster-and-easier-use-and.html


Java 8の公式アップデートは2018/9まで

Java 8は2018/9までで、そしてそこまではJava 9もJava 18.3も短期サポートなので、アップデートするぞーって言ってもなかなか難しそう。


無償で安全に使うなら半年ごとに機能アップデートのOpenJDKを入れていく必要がある

ということになりますね。

ただ、これ結構つらそうで、例えば18.3ではvarが入ると発表されたように、言語仕様がかわるリリースも6ヶ月リリースの中で出てくることになります。

Java VMの仕様が変わるプロジェクトにも、SpecializationやValueTypeが入る「Valhalla」、配列の仕様変更やSIMD命令対応などが入る「Panama」、JITのような実行時ネイティブコンパイルではなく事前ネイティブコンパイルができる「AoT」、コンパイラの再設計でVMにも変更がある「Graal」など、それぞれのプロジェクトが出来た機能を逐次リリースするということになります。

ScalaとかGroovyみたいなJVM言語を作る人たちも対応が大変そう。LTSをターゲットにする、みたいな感じになるのかなという気はするけど。


Java 10は出ない

Java9が最後のメジャーバージョンになる、という話をしていました。

ただ、例えば書籍に「Java 19.3対応!」みたいなことが書いてあっても、いまいちよくわかんないって感じになりそう。OCJとかもどうするんだろう?って思ったけど、これそもそもいまだにSE 6までしかないのか。

まあでも、Java EEのバージョンが、複数独立してバージョンアップされるプロダクトのタグという意味合いであったように、なんらかタグとしてのわかりやすいバージョンは欲しいところです。

ValhallaとAmberが全部入ったらJava10って言って欲しい。


けど、実際どうなるかわからない

これ、実際に世の中がまわっていくモデルじゃない気がするので、今後どうなるかわかんないですね。

冒頭の公式情報も、18.9の公式アップデートがどうなるか書いてないし、Open JDKにLTSがないというのもSafe harbor statement(今から話すのは確定情報じゃないよ、というやつ)付きのJavaOneセッションでの情報だし。

トラックバック - http://d.hatena.ne.jp/nowokay/20171007

2017-10-05(木) JavaOneサンフランシスコ 2017 5日目

[][][]JavaOneサンフランシスコ 2017 5日目 10:39 JavaOneサンフランシスコ 2017 5日目を含むブックマーク

さて、今日は最終日です。

f:id:nowokay:20171006110521j:image


帰りの会」であるコミュニティキーノートがあったのですが、ちょっと体調がわるかったので、そのあとから。

よこな氏がカンフーマスターだったらしいので見たかったのだけど。


Introduction to Machine Learning with Apache Spark MLlib [CON3165]

SparkとMLlibによる機械学習のセッション

f:id:nowokay:20171006044149j:image


なんか、歌詞からヘビメタかポップかを判別していた

f:id:nowokay:20171006044343j:image


こういったパイプラインが、

f:id:nowokay:20171006044313j:image


Javaコードにそのまま出てますよ、と。

f:id:nowokay:20171006045446j:image


楽しいセッションでした。


Vectors with Values on the JVM [CON4826]

Javaでベクトル計算を行うというセッション。Project Panamaの一部です。

f:id:nowokay:20171006050451j:image


ベクトル計算の場合、ループをアンロールして1ループごとに複数演算を行うということをやります。これをAVX-512などの命令に置き換えるということですね。

f:id:nowokay:20171006052039j:image


Vector APIとしてaddなどのメソッドが用意されています。

f:id:nowokay:20171006052526j:image


パッケージは今のところjdk.incubator.vectorですね。

f:id:nowokay:20171006052730j:image


こんな感じのコードになっています。

f:id:nowokay:20171006053307j:image


128bit以上でハードウェアとの対応ができていません。

f:id:nowokay:20171006054000j:image


で、本来ならValueTypeを使うべきなのだけど、ValhallaとPanamaは別プロジェクトなので、今のところ頼れない、と。

f:id:nowokay:20171006054307j:image


低レベルに対応したAPI呼び出しを、ハードウェア命令にコンパイルするという感じで対応します。

f:id:nowokay:20171006054918j:image


こちらも参照。

http://openjdk.java.net/projects/panama/

https://software.intel.com/en-us/articles/vector-api-developer-program-for-java


How to Make a Project Java 9–Compatible [CON2448]

Java9対応をどうするか、という話。

f:id:nowokay:20171006061740j:image


なんかずっとライブコーディング。

f:id:nowokay:20171006061919j:image

eclipse collectionsでリフレクション使ってるからvmフラグをつけるか新しいバージョンにしましょうね、くらいしか理解できなかった。。。

せめて何に気を付けるべきかというサマリーは1枚資料を作ってほしかった。


Changes to the JDK Release Model [CON8200]

新しいJDKリリースモデルの話。

f:id:nowokay:20171006071158j:image

内容についてはすでにこちらでまとめています。

http://d.hatena.ne.jp/nowokay/20171007#1507284356


6カ月ごとにリリースされて、3年ごとにLTSが出ますよ、という話。

f:id:nowokay:20171006073231j:image


だったのだけど、色が塗り替えられて、LTSはOracleJDKのみと。

f:id:nowokay:20171006073638j:image


あと、Java9が最後のメジャーリリースになる、という話。

f:id:nowokay:20171006074152j:image


今後の動きに要注目でした。

しかし、大事な話なのに、キャパ50人くらいの部屋に35人しか入っていない。気づいてなかったけど、事前にはなくて直前に入ったセッションだったらしい。


カニOne!

最後は日本人参加者が集まってのカニOneです。

f:id:nowokay:20171006114553j:image


今年もお疲れさまでした!

来年は2018/10/28-11/1です。

トラックバック - http://d.hatena.ne.jp/nowokay/20171005

2017-10-04(水) JavaOneサンフランシスコ 2017 4日目

[][][]JavaOneサンフランシスコ 2017 4日目 07:34 JavaOneサンフランシスコ 2017 4日目を含むブックマーク

水曜日は遠足の日です。去年からはAT&Tパークになってますけど。ライブとかビールとかあります。

f:id:nowokay:20171005131834j:image


Machine Learning for Java Developers in 45 Minutes [CON2977]

朝、8:30から来てみた。

f:id:nowokay:20171005004624j:image


機械学習とは何か、みたいな話をしていた。

f:id:nowokay:20171005005725j:image


まずCommons Mathで線形回帰。

http://commons.apache.org/proper/commons-math/

f:id:nowokay:20171005011144j:image


それからWekaでロジスティック回帰

https://www.cs.waikato.ac.nz/~ml/weka/index.html

f:id:nowokay:20171005012024j:image


あと最後にDeepNettsでニューラルネット

http://www.deepnetts.com/product.html

f:id:nowokay:20171005012305j:image


これは裏番組のKafka+TensorFlow+H2O.aiのセッションのほうがよさそうだった。


Code Generation with Annotation Processors: State of the Art in Java 9 [CON3282]

APTのJava9対応のセッション

f:id:nowokay:20171005014755j:image


まずアノテーションアノテーションプロセッサの説明

f:id:nowokay:20171005015345j:image


生成されたコードにつける@Generatedアノテーションとか、RoundEnvironmentに追加されたgetElementsAnnotatedWithAnyメソッド、あと、クラス名表記のモジュール対応について。

f:id:nowokay:20171005020606j:image


Scale Up with Lock-Free Algorithms [CON1330]

ロックフリーなアルゴリズムについて。

f:id:nowokay:20171005030309j:image


Stackの実装を、Synchronizeを使ったものからAtomicReferenceを使うものにして、VarHandleを使って、最後にAtomicFUを使うという説明をしていました。

http://github.com/Kotlin/kotlinx.atomicfu


ベンチマークはJMHで。ロックフリーのほうがコア数が増えるにしたがったパフォーマンスが出せている、という話。

http://openjdk.java.net/projects/code-tools/jmh/

f:id:nowokay:20171005033355j:image


お昼

なんかJavaOneランチを取るのも面倒だし、kojilinさんとごはんを食べに。

ハワードのステージで流れてる曲がすごく生々しいと思ったら、ライブしてた。ベースとドラムがめちゃうま。

f:id:nowokay:20171005040224j:image


で、パスタを食べに。

f:id:nowokay:20171005043225j:image


G1GC Concepts and Performance Tuning [CON4577]

G1GCの話

f:id:nowokay:20171005050523j:image


パフォーマンスをFlightRecorderで見て。

f:id:nowokay:20171005051345j:image


チューニングするよ、みたいな。

f:id:nowokay:20171005051635j:image


Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [CON3738]

事前ネイティブコンパイルの話です。

f:id:nowokay:20171005070106j:image


コンパイル結果を共有するよ、という話。OpenJ9と似てる。

f:id:nowokay:20171005071943j:image


AOTを行うコマンドラインツールjaotcの説明。

f:id:nowokay:20171005072728j:image


その結果を使う実行オプション。

f:id:nowokay:20171005073150j:image


あと、なんでVM設定を同期する必要があるかという話。

圧縮Oop(オブジェクトポインタ)という仕組みがあって、ポインタアドレスを全部保持するのではなくて32ビットだけ保持する仕組みがあります。

http://www.oracle.com/technetwork/jp/articles/java/compressedoops-427542-ja.html


4GBだと下位32ビットだけ。32GBまでだと8byteパディングがあるので下位3ビットを無視すればOK、という話。こういうのがあるからVMオプションを同じにしておかないといけない、ということらしい。

f:id:nowokay:20171005074118j:image



Virtual Reality in Java: Is It Possible? [CON1653]

VRのセッション。

f:id:nowokay:20171005084837j:image


VRがどういうものか説明。

f:id:nowokay:20171005085537j:image


そして、jMonkeyEngine3の話を進めるのかと思いきや。

http://jmonkeyengine.org/

f:id:nowokay:20171005085712j:image


Android!JavaOneでJavaでどうこうというタイトルのセッションでAndroidの話するのすげーな、って思った。

f:id:nowokay:20171005090429j:image


あと、Rajawaliをちょっと紹介。

http://github.com/Rajawali/Rajawali

f:id:nowokay:20171005091207j:image


UnityとかWebVRとかもちらっと見せておわった。

f:id:nowokay:20171005092606j:image


Blockchain? What Is Blockchain? Why Do I Care? [CON2276]

ブロックチェーンの説明のセッション。

f:id:nowokay:20171005095409j:image


普通にブロックチェーンの説明してた。Javaが出てくる気配がないので、隣のセッションに。

f:id:nowokay:20171005095510j:image


Amazon Alexa Skills Versus Google Home Actions: The Big Java VUI Face-off [CON3616]

Google HomeとAmazon Echoでいろいろ動かす話。たのしそうだった。

f:id:nowokay:20171005102629j:image


ライブ!

バスで行きます。

f:id:nowokay:20171005110258j:image


よこな氏の希望により、うまみバーガーを食べに。

f:id:nowokay:20171005111922j:image

f:id:nowokay:20171005114240j:image


AT&T PARKにつきます。

f:id:nowokay:20171005120902j:image


Ellie Gouldingという人のライブをやっていました。

f:id:nowokay:20171005125442j:image


あとビール!

f:id:nowokay:20171005131156j:image


帰りにMosconeの前を通ったら、もう解体が始まっていました。

f:id:nowokay:20171005145138j:image

トラックバック - http://d.hatena.ne.jp/nowokay/20171004