2014年 4月
Windows
今さらですが Windows 8.1 のシステム修復ディスクの作成方法を紹介します。
はっきり言って Windows 8 以降 USB ストレージに回復環境を作って利用するほうが速くて便利です。
しかし、どうしても Windows 7 以前のようにシステム修復ディスクが必要だというあなたのために!
今回紹介する方法は Windows 8 がリリースされて、システム修復ディスクの作成がなくなっているため
力技で作る方法をマイクロソフトコミュニティのフォーラムで紹介されていた方からの情報です。
あくまでも自己責任でお願いします。
まず、USB メモリーに回復ドライブを作成します。
既に作成済みの方は読み飛ばしてください。
コントロールパネルを起動して、表示方法を「小さいアイコン」にします。
次に、「回復」をクリックします。
「回復ドライブの作成」をクリックします。
回復ドライブを作成するために「次へ」をクリックします。
回復ドライブを作成する USB ストレージ(メモリー)を選択します。
そして、「次へ」をクリックします。
注意事項を良く読んで間違いがないか確認して「作成」をクリックします。
これで回復ドライブの作成は終了です。
Windows 8.1 Update 用 Windows アセスメント & デプロイメント キット (Windows ADK) を下記アドレスより
ダウンロード、インストールします。
http://www.microsoft.com/ja-jp/download/details.aspx?id=39982
「ダウンロード」をクリックします。
直接インストールする場合は「実行」をクリックします。
ファイルサイズが大きいので時間がかかりますのでのんびりしてください。
「場所の指定」は特に問題がなければデフォルトのままでいいでしょう。
「カスタマー エクスペリエンス向上プログラム(CEIP)への参加」はお好みで。
「使用許諾契約」をよく読んで問題なければ「同意する」をクリックします。
インストールするコンポーネントは
「Deployment Tools」
「Windows Preinstallation Environment (Windows PE) 」
の二つだけです。
「インストール」をクリックしてインストールを開始します。
インストールが完了するとこのような画面が表示されます。
「閉じる」をクリックして終了します。
それではシステム修復ディスクを作成するために必要な材料は揃ったので早速取りかかりましょう。
任意の場所に「Restemp」と言う名前のディレクトリ(フォルダー)を作ります。(ディレクトリの名前は適当でいいです。)
私は E ドライブ直下に作りました。
そして、「Restemp」ディレクトリの中に「ISO」ディレクトリを作ります。
次に、先ほど作成した回復ドライブの中身をすべてを「ISO」ディレクトリにコピーします。
回復ドライブの中のファイルはシステムによって違う場合がありますが、私の環境は下図のようになってました。
次のステップに移ります。
「Restemp」ディレクトリの中に先ほどインストールした Windows 8.1 Update 用 Windows アセスメント & デプロイメント キット (Windows ADK) から
「etfsboot.com」 ファイルをコピーします。
「etfsboot.com」 ファイルの場所はデフォルトのインストール場所だと
C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg 配下にあります。
これで下準備はできたのでシステム修復ディスクの ISO ファイルを Windows 8.1 Update 用 Windows アセスメント & デプロイメント キット (Windows ADK) を使用して作成します。
スタート画面のアプリ一覧(アプリビュー)の中の 「Windows Kits」[Windows ADK」「展開およびイメージング ツール環境」 を右クリックし、「管理者として実行」 を選択する。
下図はスタートメニューを復活させるサードパーティーのアプリケーションをインストールしている私の環境の場合です。
次のコマンドを入力します。
oscdimg -n -h -l回復 -bE:\Restemp\etfsboot.com E:\Restemp\ISO E:\Restemp\Recoverydisk.iso
無事にシステム修復ディスクの ISO ファイルが作成されれば Done. と最後に表示されます。
E ドライブ直下の 「Restemp」に「Recoverydisk.iso」ファイルが作成されています。
そのファイルを CD 書き込んで終了となります。
「Recoverydisk.iso」ファイルを右クリックして表示されるコンテキストメニューより「ディスク イメージの書き込み」をクリックして
あとは出来上がるの待つだけです。
非常に簡単に作成できます。
Windows 8.1 Update 用 Windows アセスメント & デプロイメント キット (Windows ADK) をコネコネして必要コンポーネントをマウントして
コミットしてグリグリするよりもお手軽です。
ただ作成したシステム修復ディスクは起動に時間がかかります。
システムによっては5分くらいかかる場合がありますのでフリーズした。もしくは上手く起動しないと勘違いされる場合もあります。
気長に待ってみてください。
それではWindows 8.1 のシステム修復ディスクの作成方法 (裏技)を終わります。(^_^)
TAGS: Windows |
2014年4月23日1:49 PM |
Java
「創るJava」 の著者である、きしださんが「Java8時代の文字列連結まとめ」という面白い記事を書いてくれた。
文字列連結だと Java8 での Stream API でコネコネしても感動的な結果は得られず残念な結果となった。
つまり文字列連結は今まで通りのほうが速いよってことのようです。
さて、それではあまりにも Java8 の Stream API が可愛そうなので Stream API 威力を発揮するようなプログラムを組んでみます。
といっても簡単でシンプルなものにします。
みんな大好き素数を表示させるプログラムです。
素数と言えばエラトステネスの篩だと誰もが思うのですが、それは無かったことにしてください。( ̄。 ̄;)
それでは一番シンプルで Java8 じゃないプログラムを組んでみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
package jp.yucchi.primenumber_old; import java.util.ArrayList; import java.util.List; /** * * @author Yucchi */ public class PrimeNumber_Old { private static final int UP_NUMBER = 32_000_000; public static void main(String[] args) { long startTime = System.nanoTime(); List<Integer> primes = new ArrayList<>(); for (int i = 2; i < UP_NUMBER + 1; i++) { if ((i & 0b1) == 0 && i > 0b10) { continue; } int j; for (j = (int) Math.sqrt(i); i % j != 0; j--) { } if (j == 0b1 && i != 0b1) { primes.add(i); } } System.out.println(primes.size() + "個の素数を検出しました。"); long time = System.nanoTime() - startTime; System.out.println((int) (time * 1e-9) / 3_600 + "時間" + (int) ((time * 1e-9) / 60) % 60 + "分" + (int) (time * 1e-9 % 60) + "秒" + Double.toString((time * 1e-9 % 60) % 1).substring(2)); // for (Integer result : primes) { // System.out.println(result); // } } } |
このプログラムは 32,000,000 までの自然数に素数がいくつあるか検出し、その処理時間を計測しています。
ちなみに検出された素数はコメントアウトしてある部分を解除すれば表示されます。
それでは気になる処理時間は次のようにけっこう時間かかってます。(>_<。)
1973815個の素数を検出しました。
0時間2分53秒40869402600000626
それではこのプログラムを現代的に並行処理させてみます。
これも Java8 じゃないプログラムです。
そう、Executor を使って平行処理プログラムを組んでみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
package jp.yucchi.primenumber4executor; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Yucchi */ public class PrimeNumber4Executor implements Callable<List<Integer>>{ private static final int UP_NUMBER = 32_000_000; private final int from; private final int to; public PrimeNumber4Executor(final int from, final int to) { this.from = from; this.to = to; } public static void main(String[] args) { long startTime = System.nanoTime(); final int procs = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(); ExecutorService executor = Executors.newFixedThreadPool(procs); final int range = UP_NUMBER / procs; List<Future<List<Integer>>> futures = new ArrayList<>(); for (int i = 0; i < procs; i++) { final int from = i * range + 1; final int to = (i + 1) * range; futures.add(executor.submit(new PrimeNumber4Executor(from, to))); } executor.shutdown(); List<Integer> totalPrimes = new ArrayList<>(); for (Future<List<Integer>> future : futures) { try { List<Integer> primes = future.get(); totalPrimes.addAll(primes); } catch (InterruptedException | ExecutionException ex) { Logger.getLogger(PrimeNumber4Executor.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println(totalPrimes.size() + "個の素数を検出しました。"); long time = System.nanoTime() - startTime; System.out.println((int) (time * 1e-9) / 3_600 + "時間" + (int) ((time * 1e-9) / 60) % 60 + "分" + (int) (time * 1e-9 % 60) + "秒" + Double.toString((time * 1e-9 % 60) % 1).substring(2)); // for (Integer result : totalPrimes){ // System.out.println(result); // } } @Override public List<Integer> call() throws Exception { List<Integer> primes = new ArrayList<>(); for (int i = from; i < to + 1; i++) { if ((i & 0b1) == 0 && i > 0b10) { continue; } int j; for (j = (int) Math.sqrt(i); i % j != 0; j--) { } if (j == 1 && i != 1) { primes.add(i); } } return primes; } } |
実はこのプログラムは随分前に Executor の学習にネットで見つけたサンプルをほぼいただいてます。
こういうのは思いつかなかったなぁ・・・
で、きっと処理時間が短縮されているだろうと予想される結果は次のとおりです。
1973815個の素数を検出しました。
0時間0分14秒2449762050000004
おおっ! 凄いぞ! さすが Java5 の主役の Executor だ!
ついでだから NetBeans のプロファイラでのスレッドと CPU を貼っておきます。
さて、そろそろ古き時代のコードは見飽きた頃合いになってきましたね。
Java8 時代の素数を求めるプログラムを組んでみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
package jp.yucchi.primenumber4parallelstream; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * * @author Yucchi */ public class PrimeNumber4ParallelStream { private static final int UP_NUMBER = 32_000_000; public static void main(String[] args) { long startTime = System.nanoTime(); List<Integer> primeList = IntStream.rangeClosed(1, UP_NUMBER) .parallel() .filter(n -> ((n & 0b1) != 0 || n == 0b10) && n > 0b1) .filter(PrimeNumber4ParallelStream::isPrime) .boxed() .collect(Collectors.toList()); System.out.println(primeList.size() + "個の素数を検出しました。"); long time = System.nanoTime() - startTime; System.out.println((int) (time * 1e-9) / 3_600 + "時間" + (int) ((time * 1e-9) / 60) % 60 + "分" + (int) (time * 1e-9 % 60) + "秒" + Double.toString((time * 1e-9 % 60) % 1).substring(2)); // primeList.forEach(System.out::println); } private static boolean isPrime(int number) { return IntStream.rangeClosed(2, (int) Math.sqrt(number)) .allMatch(n -> (number % n) != 0); } } |
凄くシンプルで Java5 時代の Executor より綺麗です!
それに Java8 に慣れるとこちらの方がソースコードの可読性が良いと思うようになります。
さぁ、Java8 時代の素数を求めるコードの処理速度はどうなんだ!?
1973815個の素数を検出しました。
0時間0分3秒5042672730000004
なんと! Executor 使って並行処理してプログラムより5倍近く高速に処理されてます!
ParallelStream 使いどころを誤らなければ凄く幸せになれそうな気がする。
このプログラムは parallel() メソッドをちょこっと書くだけでなんと並行処理をしてくれます。
内部でJava7 の主役? として活躍した Fork/Join Framework が使われています。
こちらもついでにスレッドと CPU のプロファイル画像を貼っておきます。
Fork/Join Framework が使われているのが確認できますね。
この Java8 時代のプログラムですが 20 行目の parallel() メソッドをコメントアウトして
シーケンシャル処理させると処理時間は次のようになりました。
1973815個の素数を検出しました。
0時間0分49秒009503713000000857
一番最初に紹介した古いプログラムよりかは高速ですね。でも。遅いよね。
ちなみにスレッドモニターでシーケンシャル処理されていることが確認できます。
文字列連結では Java8 時代のプログラムは残念な結果となったけど素数検出プログラムでは本領発揮といったところですね!
最後に、Java8 凄い!(^_^)
TAGS: Java |
2014年4月16日5:39 PM |
General Java
OTN Newsletter のお年玉キャンペーンに何気に応募していた。
すっかり忘れていたのですが(当たると思っていなかった)昨日怪しげな白い包みが届いていた。
なんだろうと思っていたが PC の調子が悪く、そちらの修理におわれていた。
やっと一段落ついたので怪しげな白い包みを開けてきたところ Duke の T シャツが入っていた。
白い包みには小さな赤い文字で ORACLE と書かれていた。
やっとお年玉キャンペーンで当たったんだなと理解した。^_^;
このところ、ベビースターラーメンのメガタオル、パン屋さんのキャンペーンでの食パンをイメージした座椅子、
KitKat の Nexus7 と応募していたがことごとく外れた。
このお年玉は凄くうれしい!
今年はこれを着てドヤ顔で夏を楽しもう!
Oracle さん、ありがとう (^_^)
TAGS: Java |
2014年4月5日7:39 PM |