三姉妹年子ママのtoi toi toi!日記

長女5歳、次女4歳、三女3歳の子育て中です。いつの間にか3人の子供に囲まれて日々過ごしています。3年育休から復職し、慌ただしい日々ですが、この日々を少しでも残しておきたいと思い書いています。最近は特に子供の教育についてばかり考えています。

子供の勉強に電子パットを導入!

長女の英単語の書く練習で困ったことが!
1回ノートに書いた後、もう一度見ないで書いてみようとした場合、書いたものを消すか、新しいページに書くかで、とても非効率か資源の無駄で、いい方法はないかと考えていました。

それで思いついたのが電子パットです!
BTLIN 電子パッド お子様のお絵かき 単語帳 筆談ボード LCD画面 ロック機能 8.5インチ ブルー

書いて消すだけの単純な機能しかないので、重さと厚さ的にもおもちゃみたいです。
値段的にも壊れてもいいやという感じで、子供のお絵かきや練習用にはとても良いです!

書き心地もすごい滑らかで、書いた感じもiPadのような大人用のパットとは全然違って、鉛筆で書いているような感覚です。子供は思わず消しゴムで消そうとしたくらいです。

・長女の単語練習
もう一回見ないで書いてという事が簡単に出来て、導入大成功でした。
f:id:mirea-no-k:20190126063942j:plain

・次女の算数
いつもくもんのプリントが終わった後、苦手なところを追加でノートに書いてやらせてたのですが、紙の節約になりそうです。
f:id:mirea-no-k:20190126064130j:plain

車や電車、外での空き時間にも使えそうだし、子供に1台購入しようかと思っています。

KITTE5F「ピッツェリア エ トラットリアダ・ボッチャーノ」のランチ

今日は少しゆっくりとランチの時間があったので、行ってみたかったお店の1つに行ってみました。

KITTEはオープンしてもうすぐ6年経つんですね。オープン当時長蛇の列で行けなかった世界一のピッツァがあると話題だった「ピッツェリア エ トラットリアダ・ボッチャーノ」です。
jptower-kitte.jp

今日は着いたのが12時ちょっと過ぎでしたが、すぐに入れました。
注文したのはランチセットで1450円(税抜)の一番安いコースですが、これも丸の内金額と考えれば標準というところでしょうか?

ボッチャーノランチ  1450円(税抜)
・本日の日替り 前菜8種盛り合わせ
・お好きなピッツァ または パスタ(1品)
・本日のドルチェ
・お好きなドリンク

やはりピッツァで有名なので、ピッツァで以下を注文。
ピッツァパッツァ (マルゲリータと4種のチーズのピッツァのハーフ&ハーフ。 ) +280円(税別)

お目当てのピッツァ。結構ボリュームがあります。↓
f:id:mirea-no-k:20190123192942j:plain


前菜盛り合わせは8種類あるとうれしいですね。
f:id:mirea-no-k:20190123193001j:plain

お店も混んでなくゆっくりとできたので、時間があるときにゆっくりランチするにはいいですね。
また行こうかなと思います。

くもんの英語は我が家の子供たちには合っている模様

久々のくもん情報です!
くもんで昨年の11月に無料体験があったので、4歳の長女は英語を初めることにし、先週A〜C教材が全て終わりました。約2ヶ月半ですね。

2ヶ月半やってみた感想としては、うちの子達には合ってるのかなと。

これまでの英語勉強履歴
2歳半〜3歳 : ECCキッズに通う、あんふぁにぃというプレイグランドで英語に週2回ほど触れる
3歳〜現在 : 保育園で20分ほどの英語が週2回ある
4歳半〜現在 : くもんの英語

これまで色々と試してはいるのですが、くもんの英語できちんと上達しているのが目に見れて、親としてはとても嬉しいです。何よりとても楽しそうに英語を勉強しています。

我が家にはくもんのeペンシルがあっているようです!
それに教科書もとても工夫されています。
例えば、I am a doctor. という文の練習の場合、
以下の順序で細かくeペンシルで教えてくれるので、最後には言えるようになっているから不思議ですね。
I am
a doctor
I am a doctor
冊子の最後の方に英語の歌が数曲あり、それもeペンシルで聞けるので、それも子供たちに大好評です‼

子供への英語教育は早い方がいいとか遅い方がいいとか色々あり、私自身すごい悩んでいたのですが、ある程度日本語が話せるようになってきた4歳くらいから、英語を覚えさせ始めていいのはではないかと思います。
長女というか子供の記憶力ってすごいなぁっと英語で実感している日々です。
f:id:mirea-no-k:20190123185331j:plain
A〜Cは冊子で記入することはなく、eペンシルで発音を聞いて真似るだけで、プリントに記入することがないので、長女の教材を使って、次女も少しづつやっています。
2人目以降は、冊子が一通り終わる頃から始める方が授業料抑えられます!

TomcatのSessionManagerを利用しpostgre上でセッション情報共有する方法

Amazon Linux上にApacheとTomcatにてクラスタ構成を構築後、セッション情報をDBに格納してセッション共有を行う方法を試す。

前提環境:以下の構成がすべて終わっていること
EC2上にApache+Tomcat9のクラスタ構成構築 - 三姉妹年子ママのtoi toi toi!日記


・postgresインストール

#  yum install postgresql8.x86_64
# yum install postgresql8-server.x86_64
# passwd postgres
Changing password for user postgres.
New password:postgres
# su - postgres
Last failed login: Thu Jan 10 00:00:43 UTC 2019 from 113.22.4.10 on ssh:notty
There were 159 failed login attempts since the last successful login.
-bash-4.2$ initdb
-bash-4.2$ pg_ctl start -w
waiting for server to start.... done
server started
-bash-4.2$ psql
psql (8.4.20)
Type "help" for help.
postgres=# create database tomcat;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 tomcat    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)
postgres=# \connect tomcat
psql (8.4.20)
You are now connected to database "tomcat".
tomcat=# CREATE TABLE tomcat_sessions
tomcat-# (
tomcat(# session_id varchar(100) NOT NULL,
tomcat(# valid_session char(1) NOT NULL,
tomcat(# max_inactive int4 NOT NULL,
tomcat(# last_access int8 NOT NULL,
tomcat(# app_name varchar(255),
tomcat(# session_data bytea,
tomcat(# PRIMARY KEY (session_id)
tomcat(# );
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tomcat_sessions_pkey" for table "tomcat_sessions"
CREATE TABLE
tomcat=# select * from tomcat_sessions;
 session_id | valid_session | max_inactive | last_access | app_name | session_data
------------+---------------+--------------+-------------+----------+--------------
(0 rows)

tomcat=# CREATE INDEX idx_tomcat_sessions_app_name ON tomcat_sessions(app_name);
CREATE INDEX

これでDBの作成は終わり。

DB接続するために、TomcatのXMLファイルの修正を行います。
やり方1:毎回DBにConectしに行く方法
やり方2:JNDI接続し、JDBCコネクションプールを使う方法

やり方1
・context.xmlを修正

<Context>

    <Manager className="org.apache.catalina.session.PersistentManager"
        maxIdleBackup="1"
        minIdleSwap="0"
        maxIdleSwap="0"
        processExpiresFrequency="1"
        saveOnRestart='true'
        >

        <Store className="org.apache.catalina.session.JDBCStore"
                connectionURL="jdbc:postgresql://localhost:5432/tomcat?user=postgres&amp;password=postgres"
                driverName="org.postgresql.Driver"
                sessionAppCol="app_name"
                sessionDataCol="session_data"
                sessionIdCol="session_id"
                sessionLastAccessedCol="last_access"
                sessionMaxInactiveCol="max_inactive"
                sessionTable="tomcat_sessions"
                sessionValidCol="valid_session"
                />
    </Manager>

</Context>

やり方2
・context.xmlを修正

<Context>

    <Manager className="org.apache.catalina.session.PersistentManager"
        maxIdleBackup="1"
        minIdleSwap="0"
        maxIdleSwap="0"
        processExpiresFrequency="1"
        saveOnRestart='true'
        >

        <Store className="org.apache.catalina.session.JDBCStore"
                dataSourceName="jdbc/postgres"
                driverName="org.postgresql.Driver"
                sessionAppCol="app_name"
                sessionDataCol="session_data"
                sessionIdCol="session_id"
                sessionLastAccessedCol="last_access"
                sessionMaxInactiveCol="max_inactive"
                sessionTable="tomcat_sessions"
                sessionValidCol="valid_session"
                />
    </Manager>
<Resource name="jdbc/postgres"
          auth="Container"
          username="postgres"
          password="postgres"
          driverClassName="org.postgresql.Driver"
          type="javax.sql.DataSource"
          url="jdbc:postgresql://localhost:5432/tomcat?user=postgres&amp;password=postgres"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
/>

</Context>

どちらの方法でもいいので、修正したら、あとはTomcatを再起動。
portは8080と8181と交互に表示されるが、port(session)は8080か8181どちらかに固定されている。
f:id:mirea-no-k:20190123092011p:plain

おまけ
JMeterでレスポンス検証を実施。
コネクションプールを使用したほうが早いことが分かった。
f:id:mirea-no-k:20190129190009p:plain

検証環境

[root@ip-172-31-30-8 etc]# cat system-release
Amazon Linux AMI release 2018.03

-bash-4.2$ postgres --version
postgres (PostgreSQL) 8.4.20

[root@ip-172-31-30-8 /]# rpm -qa | grep httpd
httpd24-2.4.37-1.83.amzn1.x86_64
httpd24-tools-2.4.37-1.83.amzn1.x86_64
[root@ip-172-31-30-8 /]#

[root@ip-172-31-30-8 bin]# ./version.sh
Using CATALINA_BASE:   /opt/apache-tomcat-9.0.14
Using CATALINA_HOME:   /opt/apache-tomcat-9.0.14
Using CATALINA_TMPDIR: /opt/apache-tomcat-9.0.14/temp
Using JRE_HOME:        /usr/lib/jvm/java
Using CLASSPATH:       /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.14
Server built:   Dec 6 2018 21:13:53 UTC
Server number:  9.0.14.0
OS Name:        Linux
OS Version:     4.14.88-72.73.amzn1.x86_64
Architecture:   amd64
JVM Version:    1.8.0_191-b12
JVM Vendor:     Oracle Corporation
[root@ip-172-31-30-8 bin]#

EC2上にApache+Tomcat9のクラスタ構成構築

Amazon Linuxを1ノード作成し、1ノード上にApache+Tomcat9のクラスタ構成方法です。

まず、最新のJavaをインストール
・Javaのバージョンを確認

$ java -version

・yumを更新

$ sudo yum update -y

・javaを探す

$ sudo yum search java
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment

・インストール

$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64

・Javaのコマンドのヴァージョンを切り替える

$ sudo alternatives --config java
※2を選択
Enter to keep the current selection[+], or type selection number: 2

・Javaのバージョンを確認

# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

次に、Tomcatをインストール
・TomcatのZIPをダウンロード
https://tomcat.apache.org/download-90.cgi
apache-tomcat-9.0.14.zip

・/optに置く

#unzip apache-tomcat-9.0.14.zip

・/opt/apache-tomcat-9.0.14/binの下のシェルの権限を変更

#chmod u+x *.sh

・Tomcat起動

#/opt/apache-tomcat-9.0.14/bin/startup.sh

・Javaのプロセス確認すると起動されている

# ps -ef |grep java
root     11436     1  0 Jan11 ?        00:01:21 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14 -Dcatalina.home=/opt/apache-tomcat-9.0.14 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14/temp org.apache.catalina.startup.Bootstrap start
root     19983 19743  0 06:37 pts/1    00:00:00 grep --color=auto java

・以下をブラウザに入力すると、Tomcatの画面が出てきたら成功

http://localhost:8080/

次に、もう1つのTomcatを手早く作成
・インストールされているディレクトリをコピー

#cp -r /opt/apache-tomcat-9.0.14 /opt/apache-tomcat-9.0.14_2

・ポート番号が被らないようにserver.xmlを変更
/opt/apache-tomcat-9.0.14 /conf/server.xml
以下の4種類の数字を何か所かあるのですべて変更
8005→8006
8080→8181
8443→8444
8009→8010

<Server port="8005" shutdown="SHUTDOWN">
↓
<Server port="8006" shutdown="SHUTDOWN">


    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
↓
    <Connector port="8181" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
↓
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

・Tomcat2号機を起動してみる

/opt/apache-tomcat-9.0.14_2/bin/startup.sh

・プロセス確認して起動されている

[root@ip-172-31-30-8 conf]# ps -ef |grep java
root     11436     1  0 Jan11 ?        00:01:21 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14 -Dcatalina.home=/opt/apache-tomcat-9.0.14 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14/temp org.apache.catalina.startup.Bootstrap start
root     11490     1  0 Jan11 ?        00:01:19 /usr/lib/jvm/java/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.14_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.14_2/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14_2/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.14_2 -Dcatalina.home=/opt/apache-tomcat-9.0.14_2 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.14_2/temp org.apache.catalina.startup.Bootstrap start
root     19983 19743  0 06:37 pts/1    00:00:00 grep --color=auto java
[root@ip-172-31-30-8 conf]#

・以下をブラウザに入力すると、Tomcatの画面が出てきたら成功

http://localhost:8181/

最後にApacheのインストール
・バージョン確認して何も出てこなければインストール

$ httpd -version

・パッケージを確認

$ yum list | grep httpd24
httpd24.x86_64 

・Apacheインストール

$ sudo yum install -y httpd24

・/etc/httpd/conf/httpd.confに以下を追加

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<IfModule proxy_module>
ProxyRequests Off
<Proxy balancer://mycluster/>
BalancerMember http://localhost:8080
BalancerMember http://localhost:8081
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</IfModule>

・Apache起動

$ sudo service httpd start


これで割り振り完成
サンプルアプリなどデプロイし、ラウンドロビンされているのを確認してみてください。
Javaのサンプル
Testというプロジェクトにて以下のプログラムを入ったWARファイルを用意

import java.io.IOException;
import java.io.PrintWriter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class HelloWorldServlet extends HttpServlet {
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
     Logger logger = LogManager.getLogger(HelloWorldServlet.class);
     try { 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("<p>First Servlet</p>");
        out.println("</body></html>");
        
        PrintWriter out1 = response.getWriter();
        HttpSession session = request.getSession();
        String port = (String)session.getAttribute("port");
        if(port == null) {
            port = String.valueOf(request.getLocalPort());
            session.setAttribute("port", port);
        }   
        out1.println("port:" + String.valueOf(request.getLocalPort()));
        out1.println("port(session):" + port);
        
     } catch (Exception e) {
      //ex.printStackTrace();
      logger.error("error", e);
     }
    }
}

・WARファイルをデプロイ
以下のようにWAR配置し、Tomcat再起動
/opt/apache-tomcat-9.0.14/webapps/Test.war
/opt/apache-tomcat-9.0.14_2/webapps/Test.war


・以下を連続してクリックすると、8080と8181が交互に出てくる

http://18.136.21.227/Test/HelloWorldServlet

Fluentdのmultilineを使ってスタックトーレスを1行に変換し転送~エラー出力のサンプルアプリあり

ここ数週間の備忘録UPです。

【やりたかったこと】
Tomcatのデフォルト標準出力ではメッセージに日付等のヘッダー情報が付与されない為、log4jを利用し日付のヘッダーログを出力する。
これにより、スタックトレースを1つのブロックとして認識させるようにし、Fluentdのmultilineにてスタックトレースを1行に変換し転送させる。

◆開発環境にてサンプルアプリの準備
まず、
●ecripseにてエラーを出すアプリを作成する
●ecripseにlog4j2のJARファイル取り込む
●ecripseにlog4j2.xmlを配置する
を実施。
ecripseのイメージは以下。
log4j2.xmlの配置場所とlog4j2のJARファイルの置き場所に注意。
JARファイルはPCにダウンロードしたファイルをecripseにスライドすると取り込む事が出来ます。
f:id:mirea-no-k:20181229211609p:plain

アプリのポイント
・NullPointerExceptionを発生
・log4j2のLoggerでエラー出力
アプリのコード

package Sample;

import java.io.IOException;
import java.io.PrintWriter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloWorldServlet
 */
@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorldServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
     Logger logger = LogManager.getLogger(HelloWorldServlet.class);
     try { 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("<p>First Servlet</p>");
        out.println("</body></html>");
        
        throw new NullPointerException();
        
     } catch (Exception e) {
      //ex.printStackTrace();
      logger.error("error", e);
     }
    }

}

log4j2.xmlのコード

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<configuration status="OFF">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <!-- <PatternLayout pattern="%d{DEFAULT} [%t] %-5level %msg%n"/> -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="test" level="error" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="test2" level="info">
            <AppenderRef ref="Console" />
        </Logger>
    </Loggers>
</configuration>

次に
●ecripseにTomcat9を登録し実行
Tomcatの登録方法を以下のサイトを参考にした。
EclipseにTomcatを登録する手順 | ITSakura

今回はVM引数に追加

-Dlog4j.configurationFile=file://C:\apache-tomcat-9.0.13\apache-tomcat-9.0.13\lib\log4j2.xml

f:id:mirea-no-k:20181230232941p:plain

サーバーで実行した結果
f:id:mirea-no-k:20181230233318p:plain

◆Linux環境の準備
サンプルアプリが完成したので、WARファイルでエクスポートし、AWS環境で実行していきます。
AWS上にログの送信サーバー用と受信サーバー用の2サーバーEC2で作成します。
EC2はLinuxであればなんでもよく、セキュリティーグループのインバウンドの設定にてポート24224が開いていれば大丈夫です。
f:id:mirea-no-k:20181230234513p:plain

サーバーが完成したら以下の通り実施。
概要
●送信サーバー側のみ
・Tomcat9インストール
・サンプルアプリのWARファイル(log4j2のJARファイルはWARファイルの中に取り込まれてる)
・log4j2.xml
●送信サーバーよ受信サーバー両方
・Fluentdインストール

●送信サーバー側のみ
TomcatをPCにダウンロード、TelnetにてZIPファイルを転送し、unzipで解答する。
xmlやWARファイルを以下のように配置する。
/opt/apache-tomcat-9.0.14
/opt/apache-tomcat-9.0.14/lib/log4j2.xml
/opt/apache-tomcat-9.0.14/webapps/Test.war

Tomcatを起動・停止して稼働確認を行う。
/opt/apache-tomcat-9.0.14/binの下のシェルを実行できない場合は以下のコマンドを。

chmod u+x *.sh

以下のURLにて”HelloWorld”画面が表示されれば成功。

http://X.X.X.X:8080/Test/HelloWorldServlet

●送信サーバーよ受信サーバー両方
Fluentdインストールします。
Fluentdインストールは以下で紹介しているのでそちらを参照。
EC2にFluentdをインストールしてS3へ転送する方法 - 三姉妹年子ママのtoi toi toi!日記

root権限で実行するように以下のファイルを編集。
/opt/td-agent/etc/systemd/td-agent.service

[Service]
User=root
Group=root

両サーバーのconfファイルをそれぞれ編集し、td-agentをrestartします。
/etc/td-agent/td-agent.conf

送信サーバー

<source>
  @type tail
  path /opt/apache-tomcat-9.0.14/logs/catalina.out
  pos_file /var/log/td-agent/catalina.pos
  tag catalina.out
  <parse>
#     @type none
    @type multiline
    format_firstline /\d{4}-\d{1,2}-\d{1,2}/
    format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\] (?<level>[^\s]+)(?<message>.*)/
  </parse>
</source>


<match catalina.out>
  @type forward
  <server>
    host X.X.X.X
    port 24224
  </server>
  flush_interval 10s
</match>

受信サーバー

<source>
  @type forward
  port 24224
  bind 0.0.0.0
  tag catalina.out
</source>

<match catalina.out>
  @type file
  path /var/log/td-agent/test.log
  time_slice_format %Y%m%d
  time_slice_wait 1m
</match>


これでサンプルのエラーログが1行になって転送されます。
catalina.outの生ログ

2018-12-30 15:28:54 [http-nio-8080-exec-4] ERROR error
java.lang.NullPointerException: null
        at Sample.HelloWorldServlet.doGet(HelloWorldServlet.java:47) [classes/:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) [servlet-api.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:?]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.14]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.14]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.14]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:9.0.14]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.14]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [catalina.jar:9.0.14]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.14]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.14]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) [catalina.jar:9.0.14]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.14]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.14]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.14]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.14]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-coyote.jar:9.0.14]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-coyote.jar:9.0.14]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.14]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.14]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]

1行になったログ

2018-12-30T15:28:52+00:00       catalina.out    {"thread":"http-nio-8080-exec-6","level":"ERROR","message":" error\njava.lang.NullPointerException: null\n\tat Sample.HelloWorldServlet.doGet(HelloWorldServlet.java:47) [classes/:?]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:634) [servlet-api.jar:?]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [servlet-api.jar:?]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.14]\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.14]\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.14]\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.14]\n\tat org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) [catalina.jar:9.0.14]\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.14]\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.14]\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.14]\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.14]\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-coyote.jar:9.0.14]\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-coyote.jar:9.0.14]\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.14]\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.14]\n\tat java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]"}

我が家もリビング学習机を配置

リビング学習の場合、どこで勉強させてるでしょうか?

我が家ではこれまでダイニングテーブルで勉強させていました。

ただご飯の用意や片付けに影響受けるので、勉強用の机を置きたいなとずーっと思っていました。

でも、3人姉妹に1つづつは置けないなと悩んでいたのですが、とうとうコンパクト机を置いてみました!

90cm✖️45cmと少し小ぶりですが、リビングで勉強させるには大きすぎず良さそうです。

上記は2つですが、これを3つ繋げると横幅270㎝になり、こんな感じになります。

f:id:mirea-no-k:20181225163235j:plain

 中学生くらいになると小さくなってしまいそうですが、小学生までだったら使っていけそうです。リビングに置くにはいい感じです!

 

 

 

 

ディズニー セレブレーションホテルに泊まってみた💕

先週末、東京ディズニーセレブレーションホテルのウィッシュに泊まってきました。

まず最終的な感想としては、、、
ディズニーランドホテルやアンバサダーに比べると部屋はこじんまりとしていますが、一晩寝て開演15分前に入園できる権利があると思えば、値段的にもありかなと思います!

入ってすぐに出迎えてくれる、ミニーちゃんやティーカップを見た途端に子供達のテンションは急上昇でした。

f:id:mirea-no-k:20181219082108j:plain


子供たち用のソファーも他のホテルに比べると、1番豪華だと思います。

f:id:mirea-no-k:20181219082510j:plain


外のお庭も綺麗で走り回っていました。

f:id:mirea-no-k:20181219082802j:plain


ロビーだけでも子供たちは大喜びで、来てよかったと思わせてくれました。

肝心の部屋はベットを3つくっつけて川の字に寝れる形にでき、我が家にはピッタリでした。

f:id:mirea-no-k:20181219084231j:plain


ただし、お風呂はちっちゃかったー。

幼児3人は入れましたが、そこに自分は一緒には入れませんでした。でもなんか楽しそうでした。

f:id:mirea-no-k:20181219084731j:plain


そして嬉しかったのは、子供用の寝巻きが借りれて、子供たちも喜んでました。タオル生地で安心でした。

f:id:mirea-no-k:20181219184333j:plain


ホテルの売店で売っていたマスクが子供たちの顔にピッタリでとっても良かったです。

子供用のマスクではまだまだ大きすぎる我が子たちですが、これはもっと小さくてピッタリでした!5パックほど買いだめしました!

2歳の末っ子でもずれずにつけれました。

f:id:mirea-no-k:20181219184712j:plain


以上、ウィッシュの良いところ紹介でした。



横浜美術館〜子どものアトリエ〜芸術爆発中

今日は念願だった横浜美術館の子どものアトリエに行ってきました!

なぜ念願だったかというと、これは要予約の日曜日限定イベントで、1週間前の日曜日にサイトで予約しないといけないのです。予約開始は12時からなのですが、なにかとバタバタしているといつのまにか15時になってたりと。。。なかなか予約できなかったのですが、ようやく先週予約出来て行くことができました!

10時から11時半までの1時間半限定のイベントです。
さっそく絵の具コーナーへ子供達はまっしぐら〜

f:id:mirea-no-k:20181125141120j:plain

こんな感じでどこに書いてもいいんです!

床にガラスになんでもありです。

f:id:mirea-no-k:20181125141233j:plain

最初はおとなしく筆で描いていた子供達ですが、まぁこうなりますよね。

顔も足も絵の具だらけの子もいっぱいでした。笑

f:id:mirea-no-k:20181125141826j:plain

ということで、今日の反省です。

汚れてもいい服は必須。

長靴を持って行くべきでした。

レインコートを着てる子もいました。


1時間ほど寒さを忘れ絵の具を堪能した後は粘土コーナーへ。

f:id:mirea-no-k:20181125142546j:plain


他にもクラフトコーナーがあったのですが、そこまで行き着かずタイムアウトです。

でもたっぷり1時間半遊び満足した様子でした。子供たちもとってもいい顔していました。


またここ来たーいと最後はニコニコで帰りました。


富士サファリパーク ジャングルバス

今日は富士サファリパークに行ってきました。

 

◉サファリ

お目当てはジャングルバスです!

f:id:mirea-no-k:20181123205600j:plain

クマ、ライオン、ラクダいに餌やりすることが出来、とっても近くで見れることができました。

ライオンが目の前で餌争いでケンカすると、なかなかの迫力ですね‼︎

子供たちも大興奮でした。

 

今回は進行方向の右側に座りました。餌場ではバスの周りをぐるぐるまわってきてくれるのですが、クマもライオンも右側方向にあります。ただぞうは左側からしか見えません。

 

ジャングルバスは当日券もありますが、富士サファリクラブに入っていると、Webで事前予約ができます。

富士サファリクラブは登録は無料なのですが、会員カード発行までに1ヶ月かかり、手元にカードが届かないとWebの事前予約ができないので、計画的に事前に登録する必要があります。

 

11月23日から子育てキャンペーンと富士サファリクラブで、通常6900円のところ3000円で入園できて、ラッキーでした。

f:id:mirea-no-k:20181123210453j:plain

 

◉どうぶつ村

どうぶつ村では餌やりができました。

うさぎやモルモットにはトングでキャベツをあげることができます。

f:id:mirea-no-k:20181124123824j:plainf:id:mirea-no-k:20181124123837j:plain

 

 

 

リスザルにはひまわりにタネ。筒の上に置くと、手が伸びてきてとても可愛かったです。

f:id:mirea-no-k:20181124123853j:plain 

その他にもアルパカやハツカネズミにも餌をあげることができます。

子供達は餌やりが大好きですね。とても楽しんでいました。

 

1回100円なのですが、両替機がないので100円を用意した方がいいですね。

100円がない場合は、自動販売機で飲み物を買って100円をゲットする方法しかありません。飼育員の方は両替は無理とのことでした。

 

だいぶ寒くなってきたので、防寒対策はした方がいいです。だいたい富士山の1合目あたりの標高らしいです。

 

クリスマスツリー

今日はクリスマスツリーを出しました。

ベースはFrancFrancで購入したクリスマスツリーにオーナメントを足しました。

子供達と一緒に仕上げて30分ほどで完成!

f:id:mirea-no-k:20181123191042j:plain

1万円なんですが結構豪華なんです!数量限定で今年も販売されています。

f:id:mirea-no-k:20181123190536j:plain 

これにディズニーランドで買ったオーナメントと100均で購入した靴下3つです。

f:id:mirea-no-k:20181123191753j:plainf:id:mirea-no-k:20181123191941j:plain

 

靴下にサンタさんの手紙を入れておいてねーと言ったところ、長女が早速手紙を入れていました。

f:id:mirea-no-k:20181123192447j:plain

3つも欲しい物を書いてました。

親の私はわかりました。笑

「ミッキー くまをちょうだい

    百人一首をちょうだい

    アリエルをちょうだい」

サンタさんはどれをくれるでしょうか?

 

 

 

 

サンタさんからの手紙 英語の例文・サンプル

ハロウィンが終わると、気が早い私はクリスマスに向けそわそわし始めます。

昨年我が家では、サンタさんに向けて欲しいものを手紙に書いて、赤い靴下に入れておきました。その返信として、サンタからの手紙がプレゼント共に添えられているのです。


サンタクロースからの手紙は私が書いたのですが、誰かの参考になればと思います。

英語の先生に協力してもらったので、間違いは無いと思います。


◉3歳の長女の場合

今年君はとてもいい子だったとエルフ達が教えてくれたよ。素晴らしい!

3歳にしては君はとてもタフで賢いね。サンタは誇りに思っているよ。

これはプレゼントだよ。気に入ってくれるといいけど。

また1年いい子にしていたら戻ってくるよ。

メリークリスマス

愛を込めて

サンタクロース


Dear Name


My elves tell me that you were a good girl this year, thats excellent! 

Being 2 years old is tough and you are such a smart boy/girl for your age. 

I'm so proud of you!


Heres a present for you. I hope you like it.

Be a good girl next year as well.

I will be coming again.


Merry Christmas!!

Lot of love,

Santa Clause


◉2歳の次女の場合

エルフみんなが君の事を話していたのを知ってるかい?

君がとってもいい子だって、みんなとても感心していたよ。

サンタはとても誇りに思うよ。

これはプレゼントだよ。気に入ってくれるといいけど。

また1年いい子にしていたら戻ってくるよ。

メリークリスマス

愛を込めて

サンタクロース


Dear Name


Did you know that all my elves had been talking about you?

They are all very impressed that you were a good girl this year. 

I am proud of you too!


Heres a present for you. I hope you like it.

Be a good girl next year as well.

I will be coming again.


Merry Christmas!!

Lot of love,

Santa Clause


◉1歳の三女の場合

君がこの世界に産まれて来てくれてとても嬉しいよ。

これはプレゼントだよ。気に入ってくれるといいけど。

いい子でね

メリークリスマス

愛を込めて

サンタクロース


Dear Name


I'm so happy to have you in this world!

Heres a present for you

I hope you like it.

Be a good girl.


Ho ho ho

Merry Christmas!!

Lot of love,

Santa Clause

今年はどんな手紙を返そうか考え中です。




やっぱり手際最高!チョッキンズ 港北店

無事、次女の七五三が終わり、久しぶりに髪の毛を切りに行きました。

子供の髪の毛はいつも子供専門店のチョッキンズにお世話になっています。

 

毎回行って思うのが、早い、上手、すっごい楽!です。

家でご自分で切られてる方はすごいなぁと思います。長女の散髪を家でやってみましたが、上手にできないし、片付けも大変で、あれを3人分するのは考えられず。。。

 

行ったことがない方のご参考に!

まず、好きな色の車を選び、好きなDVDを選びます。

f:id:mirea-no-k:20181111213257j:plain

 

そして、くまさんの黄色いカバーを着せてもらいます。

お店の人いわく、カバーを着ることができたら大抵もう大丈夫だそうです。

f:id:mirea-no-k:20181111213051j:plain

目の前におもちゃを出してくれ、お姉さんが一緒に遊びながら気を紛らわせてくれます。

本当に、いたりつくせりです。

 

シャンプー台もあるのですが、まだ長女でさえも嫌がるので、まだ未経験です。

シャンプー台も、仰向けになるとモニターが見えて、漫画が見れるようになっているので、よく考えられています。

 

今日は3人同じ髪型にしてもらいました。

f:id:mirea-no-k:20181111211849j:plain

毎回最後に髪の毛を可愛く結ってくれます。

そして、ご褒美のお菓子選びです。

 

3人順番に切ってもらっても45分くらいで終わりましたので、1人あたり15分くらいです。さすがプロ、早いです。

毎回ここで切った後は、綺麗に切れてると褒められます。他で切ってもらったこともありますが、ここは本当に上手だと思います。

www.chokkins.com

 

 

届きました‼Apple Watch 4 ~ Hermès (GPS + Celluarモデル) - 40mm シンプルトゥールレザーストラップ

9月30日に予約購入し、お届け予定日が10/28-11/4でした。

まだかまだかと待ちつつ、発送通知メールが10月26日にとうとう来ました。 「お客様の商品は配送中です。」メール!

ヤマト運輸の追跡を眺める日々です。が、ほっとんど更新されないんです。上海支店で受付されてから丸3日後、やっと上海を離れました。船便なんでしょうね。ゆっくりと丸3日たった10月31日にようやく日本へ到着!

日本に到着してからは1日で届き、11月1日にやっと手元に届きました!

f:id:mirea-no-k:20181102120226j:plain

 中には2つの箱が入っていました。

f:id:mirea-no-k:20181102120312j:plain

 薄い方の箱の中にはベルトが入っていました。

革は薄くてしなやかです。肌触りがほんといいです!

f:id:mirea-no-k:20181102120341j:plain

 もう1つの箱は本体ですね。

説明書はすべて日本語だったので、ありがたいです。

本体は布に覆われていました。

f:id:mirea-no-k:20181102120353j:plain

 はじめまして、本体!

f:id:mirea-no-k:20181102120421j:plain

 手順に従いベルトを装着。ボタンを長押ししてもなかなかアップルマークは見えず、準電気を取り付けると、アップルが出てきました。

f:id:mirea-no-k:20181102120431j:plain

 iPhoneを開くと、既にアプリが立ち上がっており、ペアリングモードになっていました。

f:id:mirea-no-k:20181102120501j:plain

 言語を選び進んでいきます。

f:id:mirea-no-k:20181102120509j:plain

 設定を行いiPhoneとの同期が完了すると、時計画面が出てきました。

f:id:mirea-no-k:20181102120530j:plain

 

 傷防止のため、保護カバーを事前に買っておきました。

ちなみに、これも中国からゆっくり届きました。 

f:id:mirea-no-k:20181102120551j:plain

 特に違和感もないです。

せっかく薄くなった数ミリを取り戻してしまったかもしれませんが、おそらく保護カバーしているかどうかわからないほどだと思います。

f:id:mirea-no-k:20181102120607j:plain

 

着け心地はなかなかしっくりきます。

さっそく電話を取り損ねない活躍がありました。

まだ使いこなせてないですが、これから研究したいと思いますが、今日のところは既に満足です!

 

久しぶりのキドキド ポーネルンド〜成長を感じた瞬間

我が家の三姉妹、とうとう親抜きで遊ぶようになってくれました!

いつも「ママー、押してー!」と呼ばれていたのに、お互いに押しながら順番に遊んでいたのです。

 f:id:mirea-no-k:20181030170144j:plain


そして長女は、いつも前から駐車していたのに、後ろ向き駐車!

f:id:mirea-no-k:20181030170531j:plain

2歳の三女ははしごを一人で登ることが出来ました。

f:id:mirea-no-k:20181030170723j:plain


最近は港北のショッピングモールのプレイグラウンドに行っていたため、たまプラーザのポーネルンドは久々に来ました。


久々に来ると子供の成長をすごく感じれるんですね。いつの間にか、大きくなってるんだなぁと嬉しい反面少し寂しさも。生後数ヶ月の子を横目で見ながら懐かしさを覚える余裕が私にも出てきました。