Scala IntelliJ でError:Abnormal build process termination

いろいろな事情があり、Scalaに取り組んでいる私です。

ちょっと前のコードをメンテする的なやつなので、そんなに踏み込んで勉強する気はありません。2020年、Scalaの立ち位置ってどうなんでしょうね。

興味のある方は、2018年の下記記事をご覧ください。田島メンターによると、Scalaは年収が一番高い言語らしいw そんで、学習コストも高いんだって。
https://techacademy.jp/magazine/17334

で、私の環境ですが、Windows10+IntelliJ (Community 2020.1) でやっていこうと思います。

最初にテスト的に下記リンクにある公式のチュートリアルをやります。

Intellij で Scala を始める

https://docs.scala-lang.org/ja/getting-started/intellij-track/getting-started-with-scala-in-intellij.html

で、Runしようとしたら、タイトルのエラーですよ。

Error:Abnormal build process termination: 
C:\Users\杉田玄白.jdks\openjdk-14.0.1\bin\java.exe -Xmx700m -Djava.awt.headless=true -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/HelloWorld -Dpreload.config.path=C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Dio.netty.initialSeedUniquifier=3471885264834181241 -Dfile.encoding=windows-31j -Duser.language=ja -Duser.country=JP -Didea.paths.selector=IdeaIC2020.1 "-Didea.home.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.1.2" -Didea.config.path=C:\Users\杉田玄白\AppData\Roaming\JetBrains\IdeaIC2020.1 -Didea.plugins.path=C:\Users\杉田玄白\AppData\Roaming\JetBrains\IdeaIC2020.1\plugins -Djps.log.dir=C:/Users/杉田玄白/AppData/Local/JetBrains/IdeaIC2020.1/log/build-log "-Djps.fallback.jdk.home=C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/jbr" -Djps.fallback.jdk.version=11.0.7 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/杉田玄白/AppData/Local/JetBrains/IdeaIC2020.1/compile-server/helloworld_f3806def/temp -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilation=true -Dkotlin.incremental.compilation.js=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path=\"C:\Users\杉田玄白\AppData\Local\Temp\kotlin-idea-14938841863943177906-is-running\" -Dscala.compiler.indices.rebuild=true -classpath "C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/jps-launcher.jar" org.jetbrains.jps.cmdline.Launcher "C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-model-builder-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/jps-model.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/idea_rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-resolver-provider-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/plexus-interpolation-1.25.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/gson-2.8.6.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/slf4j-api-1.7.25.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/protobuf-java-3.5.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/forms-1.1-preview.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-model-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/jna.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/jps-builders-6.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/platform-api.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/lz4-java-1.7.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-builder-support-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/maven-resolver-transport-http-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/httpclient-4.5.12.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/plexus-utils-3.2.0.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/maven-resolver-transport-file-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/annotations.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/netty-common-4.1.47.Final.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/jps-builders.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/netty-transport-4.1.47.Final.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-resolver-api-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/jdom.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/netty-codec-4.1.47.Final.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/log4j.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/asm-all-7.0.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/aether-dependency-resolver.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/util.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/trove4j.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/commons-lang3-3.9.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/commons-logging-1.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/netty-buffer-4.1.47.Final.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/jna-platform.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/oro-2.0.8.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/plexus-component-annotations-1.7.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/netty-resolver-4.1.47.Final.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/nanoxml-2.2.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/javac2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/guava-28.2-jre.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/qdox-2.0-M10.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/httpcore-4.4.13.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-resolver-spi-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/resources_en.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-artifact-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-repository-metadata-3.6.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-resolver-impl-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/maven-resolver-util-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/java/lib/maven-resolver-connector-basic-1.3.3.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/gson-2.8.6.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/jarutils.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/guava-28.2-jre.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/common-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/gradle/lib/gradle-api-6.1.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/gson-2.8.6.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/jarutils.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/lib/guava-28.2-jre.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/common-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/gradle/lib/gradle-api-6.1.1.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/IntelliLang/lib/intellilang-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/eclipse/lib/eclipse-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/eclipse/lib/common-eclipse-util.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/ant/lib/ant-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Groovy/lib/groovy-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Groovy/lib/groovy-rt-constants.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/maven/lib/maven-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/gradle-java/lib/gradle-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Kotlin/lib/jps/kotlin-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Kotlin/lib/kotlin-stdlib.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Kotlin/lib/kotlin-reflect.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/Kotlin/lib/kotlin-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/uiDesigner/lib/jps/ui-designer-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/devkit/lib/devkit-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/javaFX/lib/javaFX-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/javaFX/lib/common-javaFX-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/jps/android-jps-plugin.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/android-common.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/build-common.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/android-rt.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/android-extensions-ide.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/sdk-common-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/common-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/repository-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/sdklib-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/jarutils.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/layoutlib-api-26.6.0.2.jar;C:/Program Files/JetBrains/IntelliJ IDEA Community Edition 2020.1.2/plugins/android/lib/manifest-merger-26.6.0.2.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/scala-library.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/compiler-shared.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/jps/nailgun.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/jps/compiler-jps.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/jps/sbt-interface.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/jps/incremental-compiler.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/spray-json_2.12-1.3.4.jar;C:/Users/杉田玄白/AppData/Roaming/JetBrains/IdeaIC2020.1/plugins/Scala/lib/scala-compiler-indices-protocol_2.12-0.1.1.jar" org.jetbrains.jps.cmdline.BuildMain 127.0.0.1 65281 d607197f-42f1-4fc9-b319-d3aff1d2dc11 C:/Users/杉田玄白/AppData/Local/JetBrains/IdeaIC2020.1/compile-server
Error occurred during initialization of VM
Failed setting boot class path.

ぎゃー!!

イヤー!!

助けて、田島メンター!!

ってなりますよね。

残念ながら田島メンターは近くにいないので、ググります。

でました。

StackOverflowさんは本当に神ですね。(>_<)

https://stackoverflow.com/questions/43294333/intellij-idea-abnormal-build-process-termination-after-heap-size-change

JDKが32bitだとこうなるらしいです。

64bit版のJDKをインストールして、IntelliJ でのJDKの指定を64bitのものになおすと、治りました!


Win10 Hyper-Vを無効にした起動設定の作り方

VagrantとVirtualBoxでローカルの開発環境を構築している人向けです。

Hyper-V

Win10 Proで使えるようになった仮想化システム「Hyper-V」、つよそうですよね。

Dockerとかと組み合わせると捗りそうな代物です。

ところで、Hyper-Vが有効化されていると、VirtualBoxと競合してうまく動かなかったりしませんか?

VirtualBoxのアプデでHyper-Vとの共存が可能になったという話もありましたが、アプデしたり環境を再び整えるのが面倒くさい(環境が壊れる懸念もある)そこのあなたにこちらの記事をプレゼント。

Hyper-Vを都合よく手軽に無効にしたい

単に有効化と無効化を切り替えるだけであれば、コントロールパネル > プログラム > Windowsの機能の有効化または無効化から切り替えて再起動するだけですが、切り替えの度にいちいち設定画面を出すのがだるい。デフォで無効にしておきたい。PC起動時に選択できるようにしてくれ。というニーズがあるはずです。

できます。

Hyper-Vを無効にした状態で起動するブートモードの作り方

参考: Windowsのbcdeditでブートメニューの項目を追加する:Tech TIPS – @IT
参考: 他の仮想環境を利用するためにHyper-Vを一時的に無効にする:Tech TIPS – @IT

cmd.exeを管理者権限で開き、下記の手順を実施します。

1. 現状の確認

C:\WINDOWS\system32>bcdedit
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
badmemoryaccess         Yes
default                 {current}
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Windows ブート ローダー
--------------------------------
identifier              {current}
device                  partition=C:
path                    \WINDOWS\system32\winload.efi
description             Windows 10
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {e005d74c-4ee8-11ea-87f9-c9149b72445e}
displaymessageoverride  Recovery
recoveryenabled         Yes
badmemoryaccess         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \WINDOWS
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
nx                      OptIn
bootmenupolicy          Standard
hypervisorlaunchtype    Auto

2. 起動設定の複製

新しい起動設定はno Hyper-Vという名前で作成することにしました。

C:\WINDOWS\system32>bcdedit /copy {current} /d "no Hyper-V"
エントリは {e005d750-4ee8-11ea-87f9-c9149b72445e} に正常にコピーされました。

起動設定が複製されていることを確認します。
新しいブートローダーが登録され、ブートマネージャーのdisplayorderの項目にも値が増えています。
説明文(description)以外はすべて元のコピーになっています。

C:\WINDOWS\system32>bcdedit
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
badmemoryaccess         Yes
default                 {c78ef55b-4ee8-11ea-8e1c-a5b3457f836d}
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
displayorder            {current}
                        {e005d750-4ee8-11ea-87f9-c9149b72445e}
toolsdisplayorder       {memdiag}
timeout                 30

Windows ブート ローダー
--------------------------------
identifier              {current}
device                  partition=C:
path                    \WINDOWS\system32\winload.efi
description             Windows 10
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {e005d74c-4ee8-11ea-87f9-c9149b72445e}
displaymessageoverride  Recovery
recoveryenabled         Yes
badmemoryaccess         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \WINDOWS
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
nx                      OptIn
bootmenupolicy          Standard
hypervisorlaunchtype    Auto

Windows ブート ローダー
--------------------------------
identifier              {e005d750-4ee8-11ea-87f9-c9149b72445e}
device                  partition=C:
path                    \WINDOWS\system32\winload.efi
description             no Hyper-V
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {e005d74c-4ee8-11ea-87f9-c9149b72445e}
displaymessageoverride  Recovery
recoveryenabled         Yes
badmemoryaccess         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \WINDOWS
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
nx                      OptIn
bootmenupolicy          Standard
hypervisorlaunchtype    Auto

3. Hyper-Vを無効化

C:\WINDOWS\system32>bcdedit /set {e005d750-4ee8-11ea-87f9-c9149b72445e} hypervisorlaunchtype off
この操作を正しく終了しました。

変更の結果を確認

C:\WINDOWS\system32>bcdedit
(略)

Windows ブート ローダー
--------------------------------
identifier              {e005d750-4ee8-11ea-87f9-c9149b72445e}
device                  partition=C:
path                    \WINDOWS\system32\winload.efi
description             no Hyper-V
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {e005d74c-4ee8-11ea-87f9-c9149b72445e}
displaymessageoverride  Recovery
recoveryenabled         Yes
badmemoryaccess         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \WINDOWS
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
nx                      OptIn
bootmenupolicy          Standard
hypervisorlaunchtype    off

hypervisorlaunchtypeの項目がoffに変化していることがわかります。

※ 有効化するときは、onではなくauto

C:\WINDOWS\system32>bcdedit /set {e005d750-4ee8-11ea-87f9-c9149b72445e} hypervisorlaunchtype Auto

これにて、Hyper-Vを無効にした状態で起動するブートモードの作成ができました。

PCを再起動すると、「オペレーティングシステムの選択」画面が出て、どちらのブートモードで起動するか選ぶことができるようになります。

※デフォルトでは、選択せずに30秒経過すると自動的に優先度の高いブートモードで起動します。
※デフォルトのモードを変更したい場合は、ブートモード選択画面下部の「規定の起動設定やその他オプションの変更」から設定することもできますが、このままコマンドライン上で設定することもできます。

ブートモードの優先順位を変更

「出社したら勝手に再起動されてんだけどウケるw」という事故はしばしば発生いたします。

せっかくHyper-Vを無効にしたブートモードを作っておいても、勝手に起動するときにはデフォルトのブートモードで立ち上がってしまいます。厄介ですね。

というわけで、ブートモードの優先順位を変更します。

やり方は大きく2通り

それぞれ手順を説明します。

bcdeditコマンドによる変更

現状の確認

C:\WINDOWS\system32>bcdedit
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
badmemoryaccess         Yes
default                 {current}
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
displayorder            {current}
                        {e005d750-4ee8-11ea-87f9-c9149b72445e}
toolsdisplayorder       {memdiag}
timeout                 30

(略)

デフォルトのブートモードを変更

C:\WINDOWS\system32>bcdedit /default {e005d750-4ee8-11ea-87f9-c9149b72445e}
この操作を正しく終了しました。

変更後の確認

C:\WINDOWS\system32>bcdedit
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
badmemoryaccess         Yes
default                 {default}
resumeobject            {c78ef55a-4ee8-11ea-8e1c-a5b3457f836d}
displayorder            {current}
                        {default}
toolsdisplayorder       {memdiag}
timeout                 30

(略)

これでデフォルトのブートモードが変更できました。

システム構成ツールによる変更

1. Windowsキーを押し、「msconfig」と入力してシステム構成ツールを開く

「システム構成ツール」とか
「System Configuration」とか

2. [ブート]タブにて、作成した「no Hyper-V」を選択し、[既定値に設定する]をクリックして[OK]で保存

これでデフォルトのブートモードが変更できました。

いずれのやり方でも一瞬。簡単。

Git SourceTreeを使って、プログラム全体を過去のある日の状態に戻す

大した話じゃないんですけどね。

「ああー、やってしまった!過去のあの日の戻れたら…。」

という後悔は人生でつきものですよね!!

プログラミングでも、一つのファイルだけじゃなくって、全体的に、プログラムを過去のバージョンへ戻したい!ということがあるかと思います。

私はSourceTreeをGithubのクライアントとして使ってます。

ちゃちゃっとできるので、メモしておきます。

SourceTreeはWindows版の3.3.8です。

①まず、転ばぬ先の杖で新しいブランチを作ります。今やっているものがどうなってもいい!という場合は、この手順は必要ありません。ここでは、サンプルとしてtime_leapブランチを作ります。

②そのブランチをチェックアウトしていることを確認します。(下記のように丸がついているのでわかると思います)

③んで、戻したい時点のコミットを、右の部分から選んで、右クリックします。

ここでは、5月15日18:40までのコミットまで戻したいとします。

現在のブランチをこのコミットまでリセット

次のダイアログで、OKを押して終わりです。

えくりぷす べんり こまんど

編集画面だとページタイトルが明朝体なので、ひらがなでタイトルを書くとなんとも言えないおかしさが生まれてちょっと好きです。

テックノートのページではバリバリのゴシック体なので、ユーモラスな印象というよりは、どこか幼い印象になってしまいますね。

余談でした。

EclipseというIDEを単なる高機能テキストエディタのように利用する、高尚な技術の結晶に対する愚弄の日々を過ごしている身として、使うとちょっと便利なコマンドを宣伝しようと思います。

※途中で口調や文体が変わっていますが、執筆日が異なるためです。
 ほぼほぼ社内向けの記事なので堅いこと言わないでほしい。

※また今回は、『「Ctrl」押しながら「変数名」や「関数名」をクリックすると、定義に飛べる』
 みたいな系統の話は含まれません。

良さげなツールやショートカットを見つけたら共有をお願いします。皆が捗ります。


Ctrl + h

まずはみんな大好き「Ctrl + h」コマンドです。
使ってない人はぜひ使ってください。

機能:

  • 特定広範囲を対象とした、文字列の高度な検索

用途:

  • デバッグ中のコールスタックを遡る際など、関数の記述箇所を探すのが手間なケースで多用
  • コーディング中に、呼び出し階層機能など、EclipseのIDE的な側面が見落とすHTMLやjs内の文字列を見逃さない検索手段として多用
  • 使われていない変数や関数を探したり、影響範囲の確認にほぼ必須

Ctrl + j

Glance検索機能を開始します。
正直「Ctrl + f」よりも使えるかもしれないコマンドです。試しにどうぞ。
(「Ctrl + f」には文字列置換という役目があるからね)

機能:

  • インクリメンタル検索
  • ヒットした箇所のハイライト表示
  • Eclipseの Ctrl + f は、Windows標準のメモ帳と同じような使用感
  • こいつはChrome等で  Ctrl + f  したときのような使用感

用途:

  • 例えばファイル内で「変数名」を検索すると、使われている箇所が一望できる
  • 一度に2単語ハイライトしたいときとか、ハイライトしながらコード修正したいときとかに便利
  • リファクタリングにも役立ちそうな便利コマンド

Ctrl + Shift + r

HTMLやらPHPやらJSやら、別ファイルを色々参照したりPOST先に指定したりといったコードが多い環境で重宝します。

機能:

  • 名称によるファイル検索
  • 柔軟な検索が可能

用途:

  • ファイル名コピってコマンド打ってペーストしてEnter押すとそのファイルが開ける(的な使用感)
  • 範囲選択してコマンド打つだけでも↑と同様の効果が得られる
  • もう脇にあるツリー表示からファイルをちょこまか探す必要は無いのです。
    (フォルダ構成をある程度眺めることも大事ではあるけど)

Ctrl + d

このあたりはぜひ使ってほしいです。

機能:

  • 行削除
  • 「カーソルのある行」、「選択範囲を含む行」を消し飛ばす

用途:

  • 選択した範囲を含む行をサクっと消せて気分がいい

Ctrl + l

シンプル行移動。

機能:

  • 入力した行にジャンプする
  • 999999とか入れると、「範囲外の行番号です」とシンプルに指摘される

用途:

  • レビューされたコードについて、レビュー箇所までスパッと飛ぶのによく使っていました♨

Ctrl + {

画面分割はよく使う機能。便利なので。

機能:

  • エディタを左右に分割表示する。
  • すでに分割表示になっている場合は、表示を元に戻す。

用途:

  • 同じファイルの別の場所を見ながら作業したいこと、ありますよね?

Ctrl + Shift + –

こちらの分割もよく使う。便利なので。

機能:

  • エディタを上下に分割表示する。
  • すでに分割表示になっている場合は、表示を元に戻す。

用途:

  • 同じファイルの別の場所を見ながら作業したいこと、ありますよね??

Ctrl + Alt + ↑/↓

コピペよりも指への負担が少ない気がする。

機能:

  • 行の複製
  • ↑を押したなら上に、↓を押したなら下に、行が複製されるだけ

用途:

  • コピペに比べ、インデント込みで確実に同じ内容を複製できるのが強み
  • 1行レベルを複製するならコマンド打つ方が楽
  • SQLでINSERTのVALUESをたくさん用意したときとか、jsonでテストデータ作ってるときとかに多用(……嘘ですAtomで作業しました)

Alt + ↑/↓

コピペってわりとミス タイプするよね。

機能:

  • 行を移動させる
  • 下に移動させる場合、直下の行と入れ替わる形で移動していく。上も同様。

用途:

  • インデントがそのまま移動していくのが強い(構造がわからなくなりにくい
  • コードを整理する際とかに使ったりする

Alt + ←/→

Chromeもこういう操作するよねー。マウスに「戻る/進む」ボタンが付いてない人向け。

機能:

  • ←:戻る →:進む
  • 作業していたファイルを順に移動する

用途:

  • 複数のファイルを並行して書き換えている際などに、マウスクリックで切り替えるのが面倒だったときなど。
  • 誤って開いていたファイルたちを閉じまくってしまったときなどに、「戻る」連打で触ったファイルを開いて回る荒業がある(ない)。

Ctrl + / or Ctrl + Shift + c

基本技。

機能:

  • コメントアウトの有無を切り替える

用途:

  • コーディング中は色々コメントアウトしたくなるのでとにかく多用

Alt + Shift + r

変数やメソッドの名称を一括で変更できるコマンド。あまり活用できていない……

機能:

  • 変数やメソッドにカーソルを合わせて使うと、その変数・メソッドの名称を一括で編集できる
  • この手のIDEにあまりない、リアルタイムな編集と反映でちょっとすごい

用途:

  • あとから変数名を変えたくなった際など、ファイル内でまとめて変換できてちょっと便利
  • 変数のスコープとか、もっと賢かったらいいんだけど……
  • 正直、「Ctrl + f」から文字列の置換で済ませがち

Ctrl + Shift + l

機能:

  • ショートカットキーの一覧が出る

用途:

  • ショートカットキーの一覧を見る

入社当初はこんな記事見てた気がするけど、結局そんなに色々なコマンド使わないまま今日を迎えている(Atomの操作の方が慣れてるから、簡単なテキスト処理はAtomでやっちゃう)。
文字のケース変更コマンドはときどき使う。

安全なプリペアードクエリ

PDO を使ってデータベース操作を行うときの、プリペアードクエリに少し躓いたのでまとめておこうと思います。

参考サイト:

PDO (PHP Data Object) とは

PHP の中で DB に接続し、操作を行うためのインターフェースです。DB の種類ごとに異なる関数を使う必要がなく、使用する DB の種類を変更する際にも対応しやすいという利点があります。

プリペアードクエリ とは

PDO が提供する、DB へ送る SQL 文を2段階に分けて実行する手法です。1段階目では、 SQL 文を 解析・コンパイル・最適化 し、2段階目で実行します。また、1段階目でパラメータをプレースホルダに置き換え、2段階目でそのプレースホルダにパラメータを渡すことが可能です。

プリペアードクエリを使うメリットは次の通りです。

  • SQL 文の解析~最適化は最初の1回だけ行えばよく、その SQL を何回も行うときに高速な動作が期待できる。
  • SQL 文の構成に入力値を使うときSQL インジェクションの危険があるが、適切にプレースホルダを用いることで容易にインジェクション対策ができる。

今回は、2つ目のインジェクション対策に焦点を当てます。

実際に使ってみる

今回はテキストボックスへの入力を受けて、下のテーブルから値を取り出し名前を表示するようにします。「きゅうり」を受け取ったら「きゅうり」を表示するという単純なものです。

+----------+-------+
| name     | price |
+----------+-------+
| キャベツ |   200 |
| きゅうり |    80 |
| かぼちゃ |   300 |
+----------+-------+

まず、プリペアードクエリを使わない方法でやってみます。コードは以下の通りです。

$sql = 'SELECT name FROM food WHERE name="'.$_POST['food'].'"';
    $foods = $db->query($sql)->fetchALL(PDO::FETCH_ASSOC);
    foreach ($foods as $food) {
        foreach ($food as $name) {
            print $name;
        }
    }

入力を行った結果を見てみます。

入力:「きゅうり」

入力:「きゅうり” or name=”キャベツ」

インジェクション対策を行ってないので、意図的に SQL 文を書き換えられています。

次に、プリペアードクエリを使いますが、入力値をプレースホルダで置き換えずにやってみます。コードは以下の通りです。

$sql = 'SELECT name FROM food WHERE name="'.$_POST['food'].'"';
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $foods = $stmt->fetchALL(PDO::FETCH_ASSOC);
    foreach ($foods as $food) {
        foreach ($food as $name) {
            print $name;
        }
    }

結果を見てみます。

入力:「きゅうり」

入力:「きゅうり” or name=”キャベツ」

プリペアードクエリを使ったのにインジェクションされています。

それでは、プレースホルダを使ったプリペアードクエリを試してみましょう。コードは以下です。

$sql = 'SELECT name FROM food WHERE name=?';
    $stmt = $db->prepare($sql);
    $stmt->execute(array($_POST['food']));
    $foods = $stmt->fetchALL(PDO::FETCH_ASSOC);
    foreach ($foods as $food) {
        foreach ($food as $name) {
            print $name;
        }
    }

結果を見てみます。

入力:「きゅうり」

入力:「きゅうり” or name=”キャベツ」

ここだけ $foods を var_dump() してます。

インジェクション を防げました!

まとめ

今回は、

  • プリペアードクエリを使わない通常クエリ
  • プレースホルダを用いないプリペアードクエリ
  • プレースホルダを用いたプリペアードクエリ

の3通りについて試し、プレースホルダを用いたプリペアードクエリのみがインジェクションを防ぐことができました。prepare() でクエリを解析した後にプレースホルダに値を渡すので、不適切な入力を防いでくれています。

なので、入力値を用いて DB を操作する際には、プレースホルダを用いてプリペアードクエリを使うのがほぼ必須になります。構文によってどうしても難しい場合は、かなり厳格な入力バリデーションが必要になります。