2017年11月30日木曜日

12/2 - 12はベトナムに出張です。

12/2 - 12はベトナムはハノイに出張です。
多分、暖かいです。
2年前に12月にベトナムに行った時も暖かくて、上着は必要ないくらいでした。
確か20度くらいです。
だけど、現地のベトナム人は寒さに弱いらしく、ダウンジャケットを来てました。
今年はベトナム出張が多くて、100日以上はベトナムに滞在しています。
夏は行くものではありません。
蒸し暑いし、いきなり豪雨とかあります。
でも、日本人がベトナムに行くのは夏がいいらしいです。
理由は夏は、日本とベトナムの寒暖差が少ないから。
実際に今年の夏はベトナムに出張して日本に帰国したら、日本の方が暑いなんてこともありました。
あと、海外出張で環境が変わるせいか体調を崩す人もいます。
そして、海外出張から帰国した時に体調を崩す人も多いです。
ボクは過去に二度程、ベトナムから帰国直後に腹痛で病院に行って薬をもらってから、家で3日ぐらい寝込んでました。
海外出張時は体調に気をつけましょう。

車検が済んだ。

2年ぶりの車検。費用は152,000円。
結構な出費。

今のフォルクスワーゲンはかれこれ7年くらい乗っている。
昨年はタイミングベルト変えたり、2年前はタイヤ変えたりで、車検なくても毎年10,000円くらいは車のメンテナンス費用を使っている。

東京とかだったら、地下鉄とかバスが広範囲で本数が多いから車なくても生活に困らないけど、山口県の田舎なので、車は生活に必要なのである。
車がなかったら不便で仕方ない。

やっぱりね、ある程度は車にお金がかかってしまう。
ただ、フォルクスワーゲンなんていう外車を選んでいるからお金が余分にかかってしまっている。
今度車を買うときは、軽自動車を買うか、維持費が少ない車がいいなと思っている。

あと、外車はウインカーとワイパーの操作が左右対象なんである。
はじめて、フォルクスワーゲンを運転したときは、交差点で曲がろうとしてウインカーを点滅させようとしたら、ワイパーが動いたw。
まぁ、慣れさえすれば問題ない。
ただ、車検の時に台車は日本車なので、今度は日本車に慣れてないので逆に交差点で曲がろうとしてウインカーの代わりにワイパーを動かしてしまうのである。

それと、毎年車の任意保険で10,000円くらいの出費がある。
車は維持費がバカにならない。
生活に困らなければ、車は手放したい。

2017年11月29日水曜日

SoftBank Robot World 2017に行ってきた。

今後は仕事でAIを取り込んでいくみたいで、もう避けられない感じ。
そんで、AIと関連があるロボットについてもどんな技術があるのかということもあり
11/21、22にSoftBank Robot World 2017に行ってきた。


Pepperとかのロボットって何に使うんだろうと思って、今回わかったというか感じたことは、人の代行をできる範囲が広がってくること。

Pepperだと、ホテルの館内と周辺案内、プレゼンテーション、よくある質問の受け答え、などができる。

あと、清掃ロボットとかも展示されていた。
人の代行をすることで、よく職が奪われるというが、まず高齢少子化の人口減少による人手不足を補うために、ロボットができることで問題を緩和することが先だと思う。

あと、AIの顔認識の展示があった。


左の顔認識されているのがボクです。
まだ、20代に認識されている。ちょっと嬉しい。
v(^o^)が0%、(T_T)が12%、(-_-#)が1%って、なんか不幸せな人って認識されているかな。
幸せになりたいよ。

2017年11月7日火曜日

iOS11の標準カメラアプリはQRコードを認識する。

iOS11の標準カメラアプリを使っていたら、QRコードを認識した。
いつの間にか、便利になっていた。

ちなみに、iOS 10の標準カメラアプリでQRコードをかざした場合はQRコードを認識しない。というか今まではこの動きだった。

iPhone5(iOS 10.3.3)での標準カメラアプリでQRコードをかざす。

だけど、iOS 11の標準カメラアプリでQRコードをかざした場合はQRコードを認識する。


iPhone6(iOS 11.1)での標準カメラアプリでQRコードをかざす。

今後はQRリーダー用のアプリをわざわざインストールしなくてもよさそうだ。

2017年11月4日土曜日

SpringでLog4j2

以前にServletのログ出力はlog4jを使用したことがあり、Springを使用したプログラミングでもLog4jを使用と思い、Log4j2の設定をしたので、備忘録として残しておく。

まず、pom.xmlにLog4j2で必要なタグを追加する。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

次にartifactId が spring-boot-starter の箇所にLogbackを除外する設定を追加する。

<exclusions>
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
</exclusions>


設定変更後のpom.xmlは以下の通り。

* pom.xml

<?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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

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


</project>


そして、Log4j2のログ出力の設定ファイルの設定をする。



src/main/javaの直下にlog4j2.xmlを配置して、以下のように編集する。
(ログはlogsフォルダ以下に出力するようにする。)

* log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <Properties>
        <Property name="app_name">demo</Property>
        <Property name="date">%d{yyyy-MM-dd HH:mm:ss.SSS}</Property>
        <Property name="daily_log">logs/app_${app_name}_%d{yyyy-MM-dd}.log</Property>
        <Property name="monthly_log">logs/app_monthly_${app_name}_%d{yyyy-MM}.log</Property>
        <Property name="error_daily_log">logs/app_error_${app_name}_%d{yyyy-MM-dd}.log</Property>
    </Properties>
    <appenders>
        <Console
            name="Console"
            target="SYSTEM_OUT"
        >
            <PatternLayout pattern="${date}, [${app_name}], [ %-5level ], %logger{10}, %msg %n" />
        </Console>
        <RollingFile
            name="File"
            fileName="logs/app.log"
            filePattern="${daily_log}.gz"
        >
            <PatternLayout pattern="${date}, [${app_name}], [ %-5level ], %logger{10}, %msg %n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
        <RollingFile
            name="ErrorFile"
            fileName="logs/app_error.log"
            filePattern="${error_daily_log}.gz"
        >
            <RegexFilter regex="\[ ERROR \]" />
            <PatternLayout pattern="${date}, [${app_name}], [ %-5level ], %logger{10}, %msg %n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
        <RollingFile
            name="MonthlyFile"
            fileName="logs/app_monthly.log"
            filePattern="${monthly_log}.gz"
        >
            <PatternLayout pattern="${date}, [${app_name}], [ %-5level ], %logger{10}, %msg %n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </appenders>
    <loggers>
        <root level="info">
            <appender-ref ref="Console" />
            <appender-ref ref="File" />
            <appender-ref ref="MonthlyFile" />
            <appender-ref ref="ErrorFile" />
        </root>
    </loggers>
</configuration>


ひとまず、これで設定は完了。
そして、STSのメニューバーの「Run」-「Run As」-「Spring Boot App」をクリックして、Springを起動してLog4j2のログを出力していることを確認してみる。
以下のキャプチャのようにlogsフォルダ以下のlogファイル内容にログが出力されていれば、OK!


2017年11月3日金曜日

STSでjavassist-3.21.0-GA.jar読み込みエラー

SpringでHello world に引き続き
今度はSpringのThymeleafを使って、Webページ表示用のプログラムを作ってみようと試みようと思い、pom.xmlに次のタグを追加した。


* 追加したタグ

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


* 上記の追加タグを含め、pom.xmlの全体の内容

<?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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

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

</project>


すると、次のようなエラーが表示される。


Archive for required library: '/Users/[ユーザのアカウントのディレクトリ]/.m2/repository/org/javassist/javassist/3.21.0-GA/javassist-3.21.0-GA.jar' in project 'demo' cannot be read or is not a valid ZIP file


Mavenの最新のライブラリを取得すれば、解決するかもしれないと思い、STSのメニューバーの「Run」-「Run As」-「5 Maven Install」をクリックしてみるが、現象は変わらず。

そして、これらの問題の現象をググってみるも、解決らしい方法が見当たらない。

なので、javassist-3.21.0-GA.jarが置いてあるサイト(https://mvnrepository.com/artifact/org.javassist/javassist/3.21.0-GA)にアクセスして、次のフォルダに上書きコピーした。

/Users/[ユーザのアカウントのディレクトリ]/.m2/repository/org/javassist/javassist/3.21.0-GA/

すると、エラーは消えて、問題は解決した。
この方法がいいかは別として、備忘録として残しておく。

2017年11月1日水曜日

SpringでHello world

ひさしぶりにWebシステムのプログラミングをJavaでしようと思い、どのフレームワークを使おうかと思案する。

そして、昔はStrutsとかSeasarとか使っていたのだが、最近はあまり聞かなくなった。
そんで、今までに使ったことなかったSpringを使ってみることにした。
そういえば、10年以上前にDIとAOPを使ったプログラミングするから、Springにするか、Seasarにするかみたいなことを検討したことがあった。
ただ、仕事でどうしてもSeasarを使うことがあったから、Seasarを使うことになって、Springは使ったことがないままだった。

なので、とりあえずHello worldまでを本記事に残しておく。

ちなみに、Javaは1.8をすでにインストール済。
まず、https://spring.io/tools/sts より、Springのdmgファイルをダウンロードする。


Springのdmgファイルをダウンロード後に開く。
そして、「STS」を「Applications」にドラッグアンドドロップする。


STSをクリックして、Springを起動させる。



次の確認ダイアロログが表示されるが、問題ないので「開く」をクリックする。


Springが起動する。


ワークスペースが聞かれるので、予め設定されているフォルダで問題なければ「Launch」をクリック。
変更したければ、Workspace:右のテキスト箇所を変更するか、「Browse...」ボタンをクリックしてフォルダを設定する。


Springが起動後の画面


まず、Hello world表示のためのプロジェクトを作成する。
メニューバーの「File」-「New」-「Spring Starter Project」をクリック。


「Next >」をクリックして、次に進む。


Available:の「Web」-「Web」をチェックして、「Finish」をクリック。


続いて、Mavenをインストールする。
メニューバーの「Run」-「Run As」-「5 Maven Install」をクリック。


Mavenのインストールは少し待ち時間がある。
インストールが終わるとConsoleの左上に<terminated>が表示される。


Consoleを最大表示。Mavenのインストールでは、こんなログが表示されている。


さて、その次はプロジェクトを起動してみる。
メニューバーの「Run」-「Run As」-「Spring Boot App」をクリック。
ちなみに、左側のプロジェクトにフォーカスがあたってないと、メニューバーの「Run」-「Run As」からの「Spring Boot App」が選択できない。


Consoleのログの最下部のStarted...が出力されたら、ブラウザで確認してみる。


ブラウザで、http://localhost:8080 を表示してみる。
すると、エラーが表示される。
"/"へマッピングされたプログラムがないから。


なので、"/"へのマッピングされたプログラムを作成する。
そのプログラムでHello worldを表示するようにする。

メニューバーの「File」-「New」-「Class」をクリック。


Name に "DemoController" を入力して、「Finish」をクリック。


生成された DemoControllerに"/"へマッピングして、Hello worldを表示するプログラムを設定する。


ソースは次の通り。


package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping("/")
    public String index() {
        return "Hello World.";
    }
}


そして、再度、メニューバーの「Run」-「Run As」-「Spring Boot App」をクリック。


ブラウザで、http://localhost:8080 を表示してみる。
無事に Hello world が表示された。