VMwareを使う勘所

VMwareを使う上で、いくつかポイントがあるので今更ながら自分用のメモとしてまとめておく。

メモリ関連のチューニング

一番パフォーマンスに影響するチューニング。
仮想環境を作ったら、いの一番にこれをコピペする。

構成ファイル(vmxファイル)をテキストエディタで開いて下記を追記する。

mainMem.useNamedFile= "FALSE"
MemTrimRate = "0"
sched.mem.pshare.enable = "FALSE"
prefvmx.useRecommendedLockedMemSize = "TRUE"
MemAllowAutoScaleDown = "FALSE"

以下、主なものの説明する。

mainMem.useNamedFile= "FALSE"

標準ではゲストOSのメモリ内容をvmemファイルに出力するが、それを使用しないように設定する。

MemTrimRate = "0"

メモリ割り当てを全て実メモリに割り当てる設定。


他の設定はオマジナイとして書く。

当然のことながら、ゲストOSに割り当てたメモリを実メモリに展開できないとアウト。
ホストのメモリを潤沢にするか、ゲストOSに割り当てるメモリを緻密に計算すること。

ディスク容量関連のチューニング

仮想OSを使用していると徐々にディスクファイルが大きくなる(可変長にしている場合)。
時々最適化して圧縮すると良い。

今度はゲストOSからの操作で、コマンドプロンプトを立ち上げて、ゲストOSにインストールされているVMware Toolsの下記コマンドを実行する。

"C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe" disk shrink C:\

Dドライブを圧縮するなら

"C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe" disk shrink D:\

対象のドライブを表示したいなら

"C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe" disk list

実行にはかなりの時間がかかるのと、ホストOSのディスクを一時的に大量消費するので、時間とディスクにゆとりがあるときに実行する。
(ホストOSのディスク容量がなくなったから実行しようとしても、容量オーバーで実行できなかったのは自分)


ちなみにLinuxの場合は

sudo vmware-toolbox-cmd disk shrink /

ドライブの表示は

sudo vmware-toolbox-cmd disk list


Macの場合は

sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk shrink /

ドライブの表示は

sudo /Library/Application\ Support/VMware\ Tools/vmware-tools-cli disk list

でも手元にLinuxMacもないから試していない。

ドラッグアンドドロップ領域の削除

ゲストOSにファイルをコピーするのに、ゲストOSにファイルをドロップしてコピーするが、それは一時的にゲストOSの下記にコピーされる。

C:\Users\%ログインユーザー%\AppData\Local\Temp\VMwareDnD

「%ログインユーザー%」はユーザーごとに読み替えること。

ゲストOSのシャットダウン等、タイミングを見て消してくれるらしいが、たまに残ったままなので気になった時に消すと良い。
前述のディスク容量関連のチューニングをする前には必ず消すこと。
ここが残ってたら圧縮の妨げになる。

ディスクを読み取り専用にする

構成ファイル(vmxファイル)をテキストエディタで開いて下記を追記する。

scsi0:0.mode = "independent-nonpersistent"

指定したディスクとパーティションを「読み取り専用」にして起動してくれる。

UUIDを常に更新する/更新しない

仮想環境には必ずUUIDが割り当てられる。
このUUIDは下記のページによると「物理コンピュータの識別子と仮想マシンの構成ファイルのパスを基に決められます」とあるので、仮想環境を別のPCに移動すると起動時に「この仮想マシンは移動またはコピーされた可能性があります。」とメッセージが表示されて移動したのかコピーしたのか問われる。
この時に「コピーした」と答えると新たなUUIDが生成され更新される(併せてMACアドレスも生成される)。
「移動した」と答えるとUUIDは更新されない。

VMware KB: 移動した仮想マシンの UUID の変更または保持

このメッセージ出力を抑制して常に「コピーした」とするか「移動した」とするかの制御が構成ファイル(vmxファイル)の「uuid.action」の値で制御出来る。

構成ファイルのパスを変更した時にUUIDを常に更新する場合は、構成ファイル(vmxファイル)をテキストエディタで開いて下記を追記する。

uuid.action = "create"

逆に構成ファイルのパスを変更してもUUIDを更新しない場合は、構成ファイル(vmxファイル)をテキストエディタで開いて下記を追記する。

uuid.action = "keep"

Gitの基本的な使い方

こんな感じで合ってるのかな?

初期化

git init

ローカルフォルダに管理用の「.git」フォルダが作られるはず。

クローン作成

git clone [URL]

既存のリモートリポジトリからファイルを取得。

除外ファイルの登録

git initしたフォルダに「.gitignore」を作って、ソース管理から除外するフォルダやファイルを指定する。
たとえば「target」フォルダを除外するなら

target\

たとえば拡張子「class」のファイルをを除外するなら

*.class

「.gitignore」はGitの管理下に置きたいので、

!.gitignore

他、詳しくはググること。

ファイル更新

git add -A

全ての更新をローカルリポジトリに登録。

ローカルリポジトリにコミット

git commit -m [コメント]

ローカルリポジトリにコミット。
「-m」を付けるとエディタを起動せずにコメントメッセージを記述できる。

リモートリポジトリにコミット

git push

その他

あとは追々。

Gitを入れた

一般的になりつつあるGitを入れてみた。

Gitのインストール

下記ページを参考にgitを入れた。

http://d.hatena.ne.jp/m-hiyama/20140203/1391381365


Windows環境なので、Git for Windowsをインストール。

http://msysgit.github.io/

Git for Windowsbashは使えないとのことなので、「Adjusting your PATH environment」は
真ん中の「Use Git from the Windows Command Prompt」を選択。

Gitの設定

社内でやっている以上、プロキシがいるのでプロキシの設定をする。
コマンドプロンクトを立ち上げて下記を実行。

以下がHTTP。

git config --global http.proxy http://host:port

以下がHTTPS

git config --global https.proxy http://host:port

実行するとホームディレクトリに「.gitconfig」が出来て、上のコマンド内容が反映される。

[http]
	proxy = http://host:port
[https]
	proxy = http://host:port

今後はこのファイルを変更しても良いということかな。

試しにローカルリポジトリを作ってみる

適当なフォルダを作って、コマンドプロンプトでそこまで行って(Shift+右クリックで「コマンド ウィンドウをここで開く」が便利)、下記コマンドでローカルリポジトリを作成。

git init

どこかのリモートリポジトリからソースを取得してみる。

git clone http://github.com/schacon/grit.git

動き出した・・・。

Cloning into 'grit'...
remote: Counting objects: 4051, done.
remote: Compressing objects: 100% (2824/2824), done.
remote: Total 4051 (delta 1170), reused 4051 (delta 1170)
Receiving objects: 100% (4051/4051), 2.10 MiB | 529.00 KiB/s, done.
Resolving deltas: 100% (1170/1170), done.
Checking connectivity... done.

エクスプローラで見たら、ソースが取得できてた。

Spring Boot/第一回 Spring Boot事始め

Spring Bootを使ってみたのでメモする。

参考にしたのは「はじめての Spring Boot」。

Mavenでプロジェクト作成

以下でプロジェクト作成。

mvn archetype:create -DgroupId=tools.springsample.springsample01 -DartifactId=SpringSample01 -Dversion1.0.0-SNAPSHOT

準備(Mavenまわりの設定)

pom.xmlにSpring Boot関係の記述を追加する。

セントラルリポジトリの指定(なぜか指定しないとエラーになる)。

  <!-- append start -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central.maven.org/maven2/</url>
    </repository>
  </repositories>
  <!-- append end -->

Spring Bootのテンプレートを親に。

  <!-- append start -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.5.RELEASE</version>
  </parent>
  <!-- append end -->

Spring Bootの依存関係を追加。

  <dependencies>
    <!-- append start -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- append end -->
  </dependencies>

Spring Bootのプラグインを追加。

  <!-- append start -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <!-- append end -->

ビルドターゲットは Java8。

  <properties>
    <!-- append start -->
    <java.version>1.8</java.version>
    <!-- append end -->
  </properties>

Spring Bootとは関係ないが、アクセサメソッドを作るのが面倒なのでLombokを使う。

  <dependencies>
    <!-- append start -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.12.2</version>
      <scope>provided</scope>
    </dependency>
    <!-- append end -->
  </dependencies>

pom.xmlが間違えていないかコンパイルしてみる。

mvn compile

ついでに依存関係ツリーも確認

mvn dependency:tree

以下のようになる。

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building SpringSample01 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ SpringSample01 ---
[INFO] tools.springsample.springsample01:SpringSample01:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.1.5.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.1.5.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.1.5.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.1.5.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.1.5.RELEASE:compile
[INFO] |  |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.7:compile
[INFO] |  |  |  |  \- org.slf4j:slf4j-api:jar:1.7.7:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.7:compile
[INFO] |  |  |  +- org.slf4j:log4j-over-slf4j:jar:1.7.7:compile
[INFO] |  |  |  \- ch.qos.logback:logback-classic:jar:1.1.2:compile
[INFO] |  |  |     \- ch.qos.logback:logback-core:jar:1.1.2:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.13:runtime
[INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.1.5.RELEASE:compile
[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:7.0.54:compile
[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:7.0.54:compile
[INFO] |  |  \- org.apache.tomcat.embed:tomcat-embed-logging-juli:jar:7.0.54:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.3.3:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.3.3:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.3.3:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:5.0.3.Final:compile
[INFO] |  |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.1.1.GA:compile
[INFO] |  |  \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] |  +- org.springframework:spring-core:jar:4.0.6.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:4.0.6.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:4.0.6.RELEASE:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  +- org.springframework:spring-beans:jar:4.0.6.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-context:jar:4.0.6.RELEASE:compile
[INFO] |  \- org.springframework:spring-webmvc:jar:4.0.6.RELEASE:compile
[INFO] |     \- org.springframework:spring-expression:jar:4.0.6.RELEASE:compile
[INFO] +- org.springframework.boot:spring-boot-starter-test:jar:1.1.5.RELEASE:test
[INFO] |  +- org.mockito:mockito-core:jar:1.9.5:test
[INFO] |  |  \- org.objenesis:objenesis:jar:1.0:test
[INFO] |  +- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] |  +- org.hamcrest:hamcrest-library:jar:1.3:test
[INFO] |  \- org.springframework:spring-test:jar:4.0.6.RELEASE:test
[INFO] \- org.projectlombok:lombok:jar:0.12.0:provided
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.994 s
[INFO] Finished at: 2015-01-21T10:20:10+09:00
[INFO] Final Memory: 11M/27M
[INFO] ------------------------------------------------------------------------

以上で準備完了。

サービスとコントローラを作る

サービスとコントローラを作る。
サービスでビジネスロジックを記述し、コントローラでビジネスロジックの呼び出しをする。

サービス用のパッケージを「service」として、そこにサービスを作る。
まずはSpringとは関係ない普通のクラスを作成する。

package tools.springsample.springsample01.service;

public class SampleService {
    public String getMessage() {
        return "Hello world.";
    }
}

これをSpringのサービスクラスにするにはクラス宣言に「@Component」を付ける。

package tools.springsample.springsample01.service;

import org.springframework.stereotype.Component;

@Component  // a
public class SampleService {
    public String getMessage() {
        return "Hello world.";
    }
}

a -> 「@Component」を付けることにより、インスタンスDIコンテナによって管理されることになる。


コントローラを作る。
コントローラは自動生成されたAppクラスを流用する。

package tools.springsample.springsample01;

import tools.springsample.springsample01.service.SampleService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Hello world!
 *
 */
@Controller  // d
@EnableAutoConfiguration  // a
@ComponentScan  // b
public class App 
{
    @Autowired  // c
    private SampleService sampleService;

    @RequestMapping("/")  // e
    @ResponseBody  // f
    public String hello() {
        return sampleService.getMessage();
    }

    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);  // g
    }
}

DI関係の宣言は下記のとおり。
a -> Springの設定を自動でやってくれるオマジナイ。
b -> @Autowiredで指定したコンポーネントをスキャンする場所(パッケージ)を指定。(自クラス配下なのでパラメータは不要)
c -> DIコンテナからインスタンスを取得する指定。

Web関係の宣言は下記のとおり。
d -> 「@Controller」を付けることにより、コントローラクラスになり、リクエストを受け付けられるようになる。
e -> URLとメソッドマッピング
f -> 戻り値をレスポンスとして返すという意味。
g -> Springの起動。Tomcatの起動とデプロイが自動で行われる。

コンパイルする。

mvn compile

起動する。

mvn spring-boot:run

スタックトレースが出なければ起動に成功していると思われるので、ブラウザでアクセスする。
http://localhost:8080/

Hello world.」が出れば成功。
コントローラからサービスを呼んで、サービスの結果を出力出来た。

Xperia Z3の保護ガラス・シート

これで落ち着いた。

表面

ガラスを貼ってツルツルに。
0.2mmと薄いのも良い。

裏面

ガラスではなくシートにしてすべり止め。
ガラスだと、ほんのすこしの傾きでも机から滑り落ちる。

衝撃吸収保護フィルム Xperia Z3 背面のみ

衝撃吸収保護フィルム Xperia Z3 背面のみ

表と裏に貼ると、充電スタンドのアタッチメントを変えないと収まらないので注意が必要。
アタッチメントは同梱されているものでOK。

今更ながらMavenを使ってみた

大雑把な使い方をメモする。

1.新規プロジェクトを作成

下記コマンドで新規プロジェクトを作成。

mvn archetype:create   -DgroupId=(パッケージ名) -DartifactId=(プロジェクト名) -Dversion1.0.0-SNAPSHOT

2.調整

pom.xmlの/project/repositoriesタグに、参照するライブラリの「場所」を記述。
ただし「セントラルリポジトリ」にあるライブラリは記述不要。
セントラルリポジトリに何が登録されているかは下記のサイトで確認する。
http://search.maven.org/#browse

pom.xmlの/project/dependenciesタグに、参照するライブラリの「モノ」を記述。
どのように記述するかは、各ライブラリのサイトで確認する。

例えばSeasarなら、
・repositoriesタグ内に以下を追加
Seasarはセントラルリポジトリに登録されていないのでrepositoriesの記述が必要)

    <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven Repository</name>
      <url>http://maven.seasar.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>maven-snapshot.seasar.org</id>
      <name>The Seasar Foundation Maven Snapshot Repository</name>
      <url>http://maven.seasar.org/maven2-snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </snapshots>
    </repository>

・dependenciesタグ内に以下を追加

    <dependency>
      <groupId>org.seasar.container</groupId>
      <artifactId>s2-framework</artifactId>
      <version>2.4.46</version>
    </dependency>
    <dependency>
      <groupId>org.seasar.container</groupId>
      <artifactId>s2-extension</artifactId>
      <version>2.4.46</version>
    </dependency>
    <dependency>
      <groupId>org.seasar.container</groupId>
      <artifactId>s2-tiger</artifactId>
      <version>2.4.46</version>
    </dependency>
  </dependencies>

例えばSpring bootなら、
(Spring bootはセントラルリポジトリに登録されているのでrepositoriesの記述は不要)
・dependenciesタグ内に以下を追加

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>


セントラルリポジトリからダウンロードしたローカルリポジトリはユーザーホームの「.m2/repository」になる。

3.必要に応じて

pom.xmlの/project/build/pluginsタグに、参照するライブラリの「プラグイン」を記述。

例えばSpring bootなら、

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>


4.その他
社内でやると十中八九セントラルリポジトリのアクセスがプロキシに拒まれるので、MAVEN_HOMEのconf/settings.xmlにプロキシ設定を追記。

  <proxy>
    <active>true</active>
    <protocol>http</protocol>
    <host>xxx.xxx.xxx.xxx</host>
    <port>xxxx</port>
  </proxy>

Eclipseの起動時にパラメータを渡してワークスペースを切り替える

Eclipseワークスペースをプロジェクトごとに分けているのだが、Eclipseを起動するたびにワークスペースを選択するのが面倒くさい。

f:id:nave_kazu:20150114103036p:plain


Eclipseの起動時にパラメータを渡してワークスペースを選択するのと同等のことは出来ないかと思ったら、ちゃんと方法があった。

 eclipse.exe -data [ワークスペースのパス]


この方法を使ってプロジェクトごとのeclipse.exeのショートカットを用意することにする。
例えば以下のように。

f:id:nave_kazu:20150114103124p:plain