Quantcast
Channel: プログラム の個人的なメモ
Viewing all 860 articles
Browse latest View live

【Tomcat】設定ファイル server.xml ~ Valve 編~

$
0
0

□ Valve

Valve(バルブ)。ぱっと見、Valueかと思った
 * 親コンポーネントへのリクエストをフィルタし、処理を行う

参考文献

https://thinkit.co.jp/free/article/0708/2/8?page=0%2C1

■ Stuck Thread Detection Valve

org.apache.catalina.valves.StuckThreadDetectionValve (From Tomcat7)
 * 長時間処理しているリクエストを検知する

設定例

<Valve
 className="org.apache.catalina.valves.StuckThreadDetectionValve"
 threshold="60" />
`説明
`属性
備考
className「org.apache.catalina.valves.StuckThreadDetectionValve」を設定
threshold閾値。「0」なら非活性。デフォルト:600[秒]
interruptThreadThreshold「-1」なら非活性。interruptThreadThreshold >= thresholdにする必要有

公式サイト

[[http://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Stuck_Thread_Detection_Valve]]

参考文献

http://benzaiten.dyndns.org/roller/ugya/entry/tomcat7-hangup
https://qiita.com/tamura__246/items/dae31a6a7e24c756b756
http://d.hatena.ne.jp/Kazuhira/20121014/1350217927
http://se-bikou.blogspot.jp/2017/06/tomcatstuckthreaddetectionvalve.html

■ Error Report Valve

 * HTTPエラー時のエラーページの設定

公式サイト

[[http://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Error_Report_Valve]]

参考文献

http://www.tec-q.com/note/2007/03/tomcat.html

■ Access Log Valve

 * アクセスログを出力する
 * デフォルトで既に追加されている

公式サイト

[[http://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Access_Log_Valve]]

参考文献

http://www.m-bsys.com/code/tomcat-accesslog

関連記事

【Tomcat】設定ファイル server.xml ~ Connector / Attributes 編~

https://blogs.yahoo.co.jp/dk521123/34658624.html

【Tomcat】設定ファイル server.xml ~ Connector / Special Features 編~

https://blogs.yahoo.co.jp/dk521123/35255676.html

Tomcat のスレッド制御 ~ Connectorタグ / Executorタグ ~

https://blogs.yahoo.co.jp/dk521123/37307732.html

【AWS】負荷テストのボトルネック/エラーを考える

$
0
0

■ 負荷テストのボトルネック/エラーを考える

【1】攻撃ツール
【2】ロードバランサ
【3】OS/サーバ
【4】アプリケーション
【5】DB

【1】攻撃ツール

ex. JMeter
 * TCPポートの枯渇
 * ネットワーク不備
  + KeepAliveしていない
 * ハードのパワー不足

Linux

 * ファイルディスクリプタ不足
~~~~~
ulimit -n 65535
~~~~~

JMeter

 * 攻撃ツールのヒープサイズ不足(以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/36910281.html
 * DNSレコードをキャッシュしないようにテストする(以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/37336628.html

【2】ロードバランサ

 * エラー
  + HTTP 502: Bad Gateway (以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/37336810.html

【3】OS/サーバ

 * TCPポートの枯渇
 * ハードのパワー不足 / サーバリソース不足
https://blogs.yahoo.co.jp/dk521123/37348697.html

Tomcat

 * Stuck Thread Detection Valveで、長時間処理しているリクエストを検知し、ログ出力
   (以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/37348697.html

【4】アプリケーション

 * フレームワークが遅い
 * ログを多く出力している
  + topコマンドで、sys の使用率が増える

【5】DB

MySQL/Aurora

 * 実行時間が掛かるSQLの監視する(以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/37342827.html

関連記事

【AWS】AWS での 負荷テスト あれこれ

https://blogs.yahoo.co.jp/dk521123/37336628.html

【負荷テスト】 【JMeter】JMeter ~ あれこれ 編 ~

https://blogs.yahoo.co.jp/dk521123/36910281.html

【Tomcat】設定ファイル server.xml ~ Valve 編~

https://blogs.yahoo.co.jp/dk521123/37348697.html

【AWS】ロードバランサ ~ HTTP 502: Bad Gateway」が表示された場合 ~

https://blogs.yahoo.co.jp/dk521123/37336810.html

【MySQL】【Aurora】 実行時間が掛かるSQLの監視手法

https://blogs.yahoo.co.jp/dk521123/37342827.html

【Eclipse】【Jetty】 Eclipse で Jettyプラグイン を使う

$
0
0

■ Jetty

 * Tomcatの同様、Java Servletコンテナ/Webサーバ
 * Java製
 * Since 1995年(Tomcatは、1999年)

■ 設定手順

[1] Eclipse の [Help]-[Eclipse Marketplace]で、Find欄に「Jetty」と入力
[2] 以下をそれぞれ Install し、Eclipseを再起動する
 + Eclipse Jetty
 + Run-Jetty-Run

■ 実行方法

[1] 対象のプロジェクトを右クリックし、[Run As]-[Run Jetty]を選択
 => デフォルト・ポート 8080 でアクセスする

【Java】ZIP 処理 ~パスワード付ZIPファイル / Zip4j 編~

$
0
0

■ ダウンロード

 * 以下のサイトから、JARファイル「zip4j_1.3.2.jar」をダウンロードする
http://www.lingala.net/zip4j/download.php

■ サンプル

import java.io.File;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class ZipDemo {

  public static void main(String[] args) {
    String source = "ZIPファイル.zip";
    String destination = "etc";
    String password = "password1";

    System.out.println("Done " + zip(source, destination, password));
  }

  public static boolean zip(String outFile, String input, String password) {
    try {
      ZipFile zipFile = new ZipFile(outFile);
      zipFile.setFileNameCharset("UTF-8");

      ZipParameters parameters = new ZipParameters();
      // 圧縮率
      parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
      // 暗号化
      parameters.setEncryptFiles(true);
      parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
      parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
      parameters.setPassword(password);

      File inputFile = new File(input);
      if (inputFile.isDirectory()) {
        zipFile.createZipFileFromFolder(inputFile, parameters, false, 0);
      } else {
        zipFile.addFile(inputFile, parameters);
      }

      return true;
    } catch (ZipException ex) {
      ex.printStackTrace();
      return false;
    }
  }
}


関連記事

ZIP 処理 ~圧縮編~

http://blogs.yahoo.co.jp/dk521123/33497835.html

ZIP 処理 ~解凍編~

http://blogs.yahoo.co.jp/dk521123/33645352.html

【分散リポジトリ】【HG】 Mercurial ~ リベース / マージ 編~

$
0
0

■ EclipseでのMercurialのリベース

select source revision
□ Rebase from the selected revision
 => リベースしたい元のリビジョンからリベースする(以下の例だと「826」を指定)

□ Rebase from the base of the selected revision
 => 指定したリビジョンを遡りリベースしてくれる(以下の例だと「829」を指定)
select destination revision
□ Rebase onto the selected revision
 => リベース先のリビジョンを指定(以下の例だと「828」を指定)

【リベース前】
825    826                         829
-*------*---------------------------*---- local <= 「826」「829」をMasterに移す
     |
     +--------*------------*------------- Master
             827          828
【リベース後】
-*------------*------------*------*------------*--------------- Master
825          827          828    826'(829)    829'(830)

関連記事

【分散リポジトリ】【HG】 Mercurial ~環境構築編~

https://blogs.yahoo.co.jp/dk521123/36290337.html

【MySQL】 CONCAT / GROUP_CONCAT

$
0
0

■ CONCAT

 * 文字列を結合する

サンプル

例1
select CONCAT('Hello', ' ', 'World', '!!')
出力結果例
Hello World!!
例2
select CONCAT(c.first_name, ' ', c.family_name) from customer c
出力結果例
Mike Abel
Ken Allen
Kevin Cox
Smith Abel
Ken Dean
Tom Abel

参考文献

http://db.yulib.com/mysql/000031.html

■ GROUP_CONCAT

 * 複数レコードを1行に纏める

サンプル

select GROUP_CONCAT(c.first_name separator '/') from customer c
出力結果例
Mike/Ken/Kevin/Smith/Ken/Tom

参考文献

https://qiita.com/kyuu1999/items/93b02128f07c577b3e48

【Raspberry PI】音声合成 ~ Open JTalk ~

$
0
0

■ Raspberry PI で音声合成を行う

[1] Open JTalk <= これを使う
[2] AquesTalk
[3] AquesTalk2
[4] Galatea Talk

■ Open JTalk

デモサイト

http://open-jtalk.sp.nitech.ac.jp/index.php

■ 設定手順

前準備:音が出るかを確認

# 優先する出力先を1(アナログ)に設定
amixer cset numid=3 1

aplay /usr/share/sounds/alsa/Front_Center.wav

Open JTalkのインストール

sudo apt-get install open-jtalk

sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

動作確認

再生する文章ファイル(txt)を用意する
$ cat helloworld.txt
はろーわーるど
音声合成を行う(音声ファイルを作成する)
open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow helloworld.wav helloworld.txt
音声ファイルを再生する(「はろーわーるど」って言ったらOK)
aplay helloworld.wav

■ Pythonから音声合成を行う

ソースを書く

openJTalk.py
#coding: utf-8
import subprocess

def openJTalk(speech_content):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(speech_content)
    c.stdin.close()
    c.wait()
    aplay = ['aplay','-q','open_jtalk.wav']
    wr = subprocess.Popen(aplay)
helloworld.py
#coding: utf-8
import openJTalk

openJTalk.openJTalk('はろーわーるど')

実行する

python openJTalk.py

# 「はろーわーるど」って言ったらOK
python helloworld.py

【Linux】sendmail コマンド

$
0
0

■ 設定手順

[1] Postfixがインストールされているか確認するために、以下を実行
~~~~
sudo yum list installed | grep postfix
~~~~

[2] インストールされていない場合は、以下を実行
~~~~
sudo yum install postfix
~~~~

[3] インストールしたPostfixを確認するために、以下を実行
~~~~
postconf  mail_version
~~~~

[4] Linux上で使用しているMTAをPostfixに設定するために、以下を実行
~~~~
sudo alternatives --config mta
# 「/usr/sbin/sendmail.postfix」の番号を選択
~~~~

[5] Postfixをスタートする
~~~~
systemctl start postfix

systemctl enable postfix
~~~~


関連記事

【Linux】Postfix ~ 入門編 ~

https://blogs.yahoo.co.jp/dk521123/36373100.html

【Linux】 Postfix ~ 環境構築編 ~

https://blogs.yahoo.co.jp/dk521123/36557661.html

【AWS】Windowsのブラウザから、sshポートフォワーディングを使って、Webサーバにアクセスする

$
0
0

■ 環境

EC2(サーバ)側

 * OS : CentOS7
 * Server : Tomcat8.5(Port:8080)
AWS / セキュリティグループ
 * インバウンド:SSH (Port:22)

クライアント側

 * OS : Windows7
 * SSHクライアント:Putty

■ 環境設定

クライアント側において、以下を行う
[0] putty をダウンロードし、インストールする
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
[1] putty を立ち上げて、以下を設定する
 1-1) [Session]を選択し、以下を入力
  + Host Name : 【EC2のホスト名】
  + Port      : 22
 1-2) [Connection]-[SSH]-[Auth]を選択し、以下を入力
  + Private Key file for authentication : EC2の秘密鍵
 1-3) [Connection]-[SSH]-[Tunnels]を選択し、以下を入力し「Add」ボタン押下
  + Source Port : 任意ポート(例「38080」)
  + Destincation:【EC2のホスト名】:【ポート番号(例「8080」)】

[2] ブラウザを立ち上げて、「http://localhost:38080/」にアクセスする
 => 指定したサーバの指定したportにアクセスできる

【AWS】EC2内で、EC2 の情報を取得するには...

$
0
0

■ はじめに

 * EC2内で、EC2 の情報を取得する方法を調べてみた

■ 実現方法

 * 以下のURLから取得可能で、curlコマンドを利用する

http://169.254.169.254/latest/meta-data/【取得したいインスタンス項目】
「curlコマンド」については、以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/37283055.html

【1】 インスタンスID

curl -s http://169.254.169.254/latest/meta-data/instance-id
シェル内で使用する場合
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

【2】 プライベート IPv4 DNS ホスト名

PUBLIC_DNS_HOSTNAME=$(curl -s http://169.254.169.254/latest/meta-data/hostname)

【AWS】AWS CLI [4] ~ CloudWatch で、EC2 上にある プロセスを監視することを考える ~

$
0
0

■ はじめに

 EC2(OS:CentOS7)内のウィルスソフトのプロセスを Amazon CloudWatch で監視したい。
調べてみると、以下の「当初調べてみたサイト」が見つかった。

 しかし、よくよく調べてみると、
「mon-put-data」などの「Amazon CloudWatch Command Line Interface」は、
2017/11/07からサポートが終了しているらしいので、別の方法を調べてみる。
(以下の公式サイト「Amazon CloudWatch Command Line Interface」を参照)

当初調べてみたサイト

http://hiratake55.hatenadiary.jp/entry/20130127/1359301757
http://higehiki.hateblo.jp/entry/2014/04/21/175223
http://toatoshi.hatenablog.com/entry/2013/06/13/192824

公式サイト「Amazon CloudWatch Command Line Interface」

https://docs.aws.amazon.com/AmazonCloudWatch/latest/cli/CLIReference.html
より抜粋
As of November 7, 2017, we are no longer supporting this CloudWatch command line interface
 with new functionality and it is no longer available for download.

■ 実現方法を考える

 * 「AWS CLI」の「put-metric-data」で実現する

公式サイト

put-metric-data
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html

プロセスをカウントするコマンド

ps -e | grep 【対象プロセス名(ex. clamav, httpd)】 | wc -l


関連記事

AWS CLI [1] ~ AWS CLIでEC2を操作する ~

https://blogs.yahoo.co.jp/dk521123/37271666.html

AWS CLI [2] ~ AWS CLIでEC2を操作する ~

https://blogs.yahoo.co.jp/dk521123/36799017.html

AWS CLI [3] ~ AWS CLIでログ転送するシェル・スクリプトを作成する ~

https://blogs.yahoo.co.jp/dk521123/37102180.html

【Linux】ps コマンド ~ プロセス一覧の表示 ~

$
0
0

■ psコマンド

 * OS内部で現在実行されているプロセス一覧およびCPUの使用時間を表示するコマンド

実行例

  PID TTY          TIME CMD
 4459 pts/1    00:00:00 bash
 4465 pts/1    00:00:00 top
 4490 pts/1    00:00:03 top
 5037 pts/1    00:00:00 ps

■ オプション

`オプション
`#
説明
1-a自分以外のユーザーのプロセスも表示
2-uユーザ名と開始時刻を表示
3-x制御端末のないプロセスの情報も表示
4-w出力時の幅を広げる
5-eコマンド名の後に環境変数などを表示
6-pプロセスIDを指定して表示

■ サンプル

Apache(httpd)のプロセスのみ表示

grep とパイプを使う
ps aux | grep httpd

プロセス番号(PID)を指定する

ps -p 23231


関連記事

【Linux】パフォーマンスに関わるコマンド ~ Linux編 ~

http://blogs.yahoo.co.jp/dk521123/34615658.html

【Linux】プロセスを強制終了するには...

* 以下の関連記事で強制終了時に使用している
http://blogs.yahoo.co.jp/dk521123/34704299.html

【Linux】文字列検索 / グレップ ~ grep / egrep / fgrep ~

https://blogs.yahoo.co.jp/dk521123/37046050.html

【AWS】AWS CLI [4]-2 ~ CloudWatch で、EC2 上にある プロセスのアラームを作成する ~

$
0
0


■ 環境構築

# シェルに実行権限を付与
sudo chmod u+x /opt/aws/cloudwatch/create-delete-alerm.sh
/etc/systemd/system/cloudwatch-alerm.service
[Unit]
Description = Create & Delete Cloud Watch Alarm

[Service]
ExecStart=/opt/aws/cloudwatch/create-delete-alerm.sh start
ExecStop=/opt/aws/cloudwatch/create-delete-alerm.sh stop
PIDFile=/var/lock/subsys/cloud_watch_alerm
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
/opt/aws/cloudwatch/create-delete-alerm.sh
#!/bin/bash

# description: Create & Delete Cloud Watch Alarm

PROCESS_NAME="clamav"
METRIC_NAME="ProcessNumberOf${PROCESS_NAME}"
HOST_NAME=$(hostname)
NAMESPACE="Sample/Ec2/${PROCESS_NAME}"
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
ALARM_NAME=VirusScanProcessZero-${INSTANCE_ID}
DIMENSIONS="Hostname=${HOST_NAME},InstanceId=${INSTANCE_ID}"
UNIT="Count"
REGION="ap-northeast-1"

case "$1" in
  start)

      # Create alarm
      aws cloudwatch put-metric-alarm \
      --alarm-name ${ALARM_NAME} \
      --alarm-description "Alarm when Virs scan process become zero." \
      --metric-name ${METRIC_NAME} \
      --namespace ${NAMESPACE} \
      --statistic Minimum \
      --dimensions ${DIMENSIONS} \
      --period 900 \
      --unit ${UNIT} \
      --evaluation-periods 1 \
      --threshold 0.0 \
      --comparison-operator LessThanOrEqualToThreshold

      ;;
  stop)
      # Delete alarm
      aws cloudwatch delete-alarms --alarm-names ${ALARM_NAME}

      ;;
  restart)
      ;;
  *)
      echo $"Usage: $0 {start|stop}"
      exit 2
esac

exit


関連記事

【AWS】AWS CLI [4]-1 ~ CloudWatch で、EC2 上にある プロセスを監視することを考える ~

https://blogs.yahoo.co.jp/dk521123/37387073.html

【Linux】 systemd でサービスを立ち上げる

https://blogs.yahoo.co.jp/dk521123/37022877.html

【Linux】systemd で、systemctl start ***.service 実行後、Active: inactive (dead) になってしまう

$
0
0

■ 現象

https://blogs.yahoo.co.jp/dk521123/37393788.html
で、systemd を利用して、独自のサービスを立ち上げようと試みた。
systemctl start ***.service 実行後に、systemctl status ***.service 実行したら、
「running」ではなく、「Active: inactive (dead) 」でサービスがうまく立ち上がらない

内部で使用しているスクリプトは、単独で実行した場合は、意図した動作をしている。

■ 原因

コマンドの実行終了後もステータスをアクティブにしておきたいのだが、
「RemainAfterExit=yes」の設定がなかったため、そのまま終了していた

■ 対応案

 * 「RemainAfterExit=yes」を追記する

# 「Type=oneshot」でなく、ほかのタイプにしても、「RemainAfterExit=yes」は必要。

/etc/systemd/system/cloudwatch-alerm.service

[Unit]
Description = Create & Delete Cloud Watch Alarm

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/aws/cloudwatch/create-delete-alerm.sh start
ExecStop=/opt/aws/cloudwatch/create-delete-alerm.sh stop
KillMode=none

[Install]
WantedBy=multi-user.target


関連記事

AWS CLI [4]-2 ~ CloudWatch で、EC2 上にある プロセスのアラームを作成する ~

https://blogs.yahoo.co.jp/dk521123/37393788.html

【Linux】 systemd でサービスを立ち上げる

https://blogs.yahoo.co.jp/dk521123/37022877.html

【AWS】Lambda で気を付ける事項

$
0
0

■ 制限事項

 * 前回の状態を保持しない
  => 以下「気を付ける事項」の「【1】作成するアプリは、冪等性であるべき」に関連

 * 最大稼働時間は、5分間
  => システム全体のアーキテクチャを考えた際に、小さい部品を組み合わせるように設計する

■ /tmp領域

一時的な領域として、/tmp領域が使用可能だが、以下の事項に注意する
 * 使用領域の最大は、512MB
 * 前回のファイルが残っている可能性がある

■ 気を付ける事項

【1】作成するアプリは、冪等性であるべき
【2】 デフォルトの時間/タイムゾーンは、日本時間じゃない

【1】作成するアプリは、冪等性であるべき

 * 作成するアプリは、冪等性(※)であるべき
  => AWS Lambdaで保証しているのは最低1回実⾏することであり1回しか実⾏しないことではなく
     2回起動される可能性もあるので、DynamoDBを利⽤するなどして冪等性を担保する必要がある
※:冪等性(べきとうせい)とは?
 * ある操作を、1回行っても複数回行っても、結果が変わらない特性

【2】デフォルトの時間/タイムゾーンは、日本時間じゃない

対応策
 * 環境変数を TZ・Asia/Tokyo に変更する
参考文献
https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6

関連記事

【AWS】Lambda ~ 知識編 ~

https://blogs.yahoo.co.jp/dk521123/36806782.html

【Java】DB Connection Pool ~ HikariCP 編 ~

$
0
0

■ 公式サイト

http://brettwooldridge.github.io/HikariCP/

Requirements

 * Java 6 and above
 * slf4j library

■ 環境設定

 * Gradle を使用
 * 以下の関連記事の「準備 : Buildship: Eclipse Plug-ins for Gradle のインストール」を行い
   Gradle プロジェクトを作成し、Eclipseの対象プロジェクトを右クリックし、
   [Gradle]-[Refresh Gradle Project]を選択しモジュールをダウンロード
https://blogs.yahoo.co.jp/dk521123/37204914.html

build.gradle

// Apply the java-library plugin to add support for Java Library
apply plugin: 'java-library'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // !! HikariCP for Java8/9 !!
    compile group: 'com.zaxxer', name: 'HikariCP', version: '2.7.7'
    testCompile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'

    // MySQL
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.13'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}

■ サンプル

DataSource.java

import java.io.Closeable;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class DataSource implements Closeable {
  private HikariDataSource dataSource;

  public DataSource() {
    HikariConfig config = new HikariConfig();

    // MySQL用ドライバを設定
    config.setDriverClassName("com.mysql.jdbc.Driver");

    // URL指定
    config.setJdbcUrl("jdbc:mysql://localhost:3306/sampledb?useSSL=false");

    // ユーザ名、パスワード指定
    config.addDataSourceProperty("user", "root");
    config.addDataSourceProperty("password", "password");

    // キャッシュ系の設定(任意)
    config.addDataSourceProperty("cachePrepStmts", "true");
    config.addDataSourceProperty("prepStmtCacheSize", "250");
    config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
    // サーバサイドプリペアードステートメントを使用する(任意)
    config.addDataSourceProperty("useServerPrepStmts", "true");

    // 接続をテストするためのクエリ
    config.setConnectionInitSql("SELECT 1");

    // 接続
    this.dataSource = new HikariDataSource(config);
  }

  @Override
  public void close() {
    if (this.dataSource != null) {
      this.dataSource.close();
    }
  }

  public HikariDataSource getDataSource() {
    return this.dataSource;
  }
}

Main.java

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

  public static void main(String[] args) {
    DataSource dataSource = new DataSource();
    try (Connection connection = dataSource.getDataSource().getConnection();
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from person");) {
      while (resultSet.next()) {
        System.out.println("Id:" + resultSet.getString("id") + " Name:" + resultSet.getString("name"));
      }
    } catch (SQLException ex) {
      ex.printStackTrace();
    }
    dataSource.close();
  }
}

■ パフォーマンス検証

HikariCPの検証プログラム

HikariCpDemo.java
import java.sql.Connection;
import java.sql.SQLException;

public class HikariCpDemo {
  public static void main(String[] args) {
    DataSource dataSource = new DataSource();

    long start = System.currentTimeMillis();
    for (int i = 0; i < 101; i++) {
      long lap = System.currentTimeMillis();
      try (Connection connection = dataSource.getDataSource().getConnection();) {
      } catch (SQLException ex) {
        ex.printStackTrace();
      }
      System.out.println("[" + i + "]" + (System.currentTimeMillis() - lap));
    }
    long end = System.currentTimeMillis();
    System.out.println("[Done]" + (end - start));

    dataSource.close();
  }
}

検証結果

まず、以下の関連記事で行った検証結果。
https://blogs.yahoo.co.jp/dk521123/37305626.html
【1】Poolなしの検証プログラム
1回目:769ms(うち初回接続:395ms)
2回目:744ms(うち初回接続:379ms)
3回目:750ms(うち初回接続:390ms)
【2】 Tomcat JDBC Connection Poolの検証プログラム
1回目:397ms(うち初回接続:374ms)
2回目:415ms(うち初回接続:392ms)
3回目:396ms(うち初回接続:373ms)
★今回★ HikariCPの検証プログラム
1回目:32ms(うち初回接続:21ms)
2回目:45ms(うち初回接続:20ms)
3回目:26ms(うち初回接続:17ms)

 => 圧倒的に速い!!

参考文献

他のDB Connection Poolにも言及
http://hatappo.hatenadiary.jp/entry/2015/08/09/200037
プロパティに関する説明が詳しい
http://time-complexity.blogspot.jp/2015/03/db-connection-pool-hikaricp.html
シンプルなサンプルが掲載
https://jyn.jp/java-hikaricp-mysql-sqlite/

関連記事

【Java】DB Connection Pool ~ Tomcat JDBC Connection Pool 編 ~

https://blogs.yahoo.co.jp/dk521123/37305626.html

【Linux】時間/日付/タイムゾーン関連のコマンド

【機械学習】 TensorFlow ~ 入門編 ~

$
0
0

■ TensorFlow (テンソルフロー)とは?

 * 人工知能・機械学習向けライブラリ

ライセンス

 * Apache 2.0

■ できること

 * 画像認識 / 顔認識
 * 音声認識
 * 各種数値計算

etc...
}}

= ■ サポート言語 =
{{{
 * C / C++
 * Python
 * Go
 * Java

Java

https://www.tensorflow.org/install/install_java
Warning: The TensorFlow Java API is not covered by the TensorFlow API stability guarantees.
警告:TensorFlow Java APIは、TensorFlow API安定版の保証はカバーされません
日本語
http://tensorflow.classcat.com/2017/04/29/tensorflow-install-install-java/

■ 種類

 * TensorFlow
 * TensorFlow for Mobile
 * TensorFlow Lite

関連記事

【機械学習】 TensorFlow ~ 環境構築 / Windows 編 ~

https://blogs.yahoo.co.jp/dk521123/37399347.html

【機械学習】 TensorFlow ~ 環境構築 / Windows 編 ~

$
0
0

■ 設定環境

`項目`備考
`#
`項目値
1 OS Windows10 普通のノートPC 2 環境 Anaconda3-5.1.0(Python 3.6 version) 3 機械学習向けライブラリ TensorFlow

補足

Anaconda(アナコンダ)について
 * Python本体と、Pythonでよく利用されるライブラリを簡単に導入できる
 * 詳細は以下のサイトを参照のこと。
http://programming-study.com/trouble/anaconda/
http://nonbiri-tereka.hatenablog.com/entry/2017/03/07/080000#Anaconda%E3%81%A8%E3%81%AF

■ 構築手順

【1】Anacondaのインストール
【2】Anaconda仮想環境作成
【3】TensorFlowのインストール
【4】確認

※ 以下のサイトを見ながら、やるといい。
https://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a

【1】Anacondaのインストール

[1-1] 以下のサイトからダウンロード(今回は「Python 3.6 version」の「Anaconda3-5.1.0-Windows-x86_64.exe」)し、
      Exeファイルをたたくだけ
https://www.anaconda.com/download/

【2】Anaconda仮想環境作成

[2-1] [Enviroments]-[Create]を選択し、以下を入力し「Create」ボタン押下
 + Name : tensorflow
 + Package : Python3.5 (★注意★ Python3.6ではない)
[2-2] [Home]を選択し、「Application on」で[2-1]で作成した「tensorflow」を選択
[2-3]「Jupytor Notebook」の「Install」ボタン押下して、Jupytor Notebookをインストールする

【3】TensorFlowのインストール

[3-1] [Enviroments]を選択し、「Application on」で[2-1]で作成した「tensorflow」の「▶」アイコン→
      「Open Terminal」を選択(コマンドプロンプトが開く)
[3-2] コマンドプロンプトで以下を入力し、TensorFlowをインストールする
~~~~~
pip install --ignore-installed --upgrade tensorflow 
~~~~~

【4】確認

[4-1] コマンドプロンプトで以下を入力し、Pythonする
~~~~~
python
~~~~~

[4-2] コマンドプロンプトで以下を入力し、TensorFlow のバージョン確認
~~~~~
import tensorflow as tf
tf.__version__

# '1.5.0' と表示
~~~~~

[4-3] コマンドプロンプトで以下を入力し、Hello World
~~~~~
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
~~~~~

[4-4] コマンドプロンプトで以下を入力し、終了
~~~~~
exit()

# 仮想環境から抜けるには「deactivate」コマンドを実行
deactivate

exit
~~~~~

■ 画像認識

https://qiita.com/FukuharaYohei/items/3bc6d83f0e24110534b2
を参考に、画像認識を行ってみる

手順

[1] 以下のサイトから「classify_image.py」をダウンロードする
https://github.com/tensorflow/models/blob/master/tutorials/image/imagenet/classify_image.py
[2] [Enviroments]を選択し、「Application on」で[2-1]で作成した「tensorflow」の「▶」アイコン→
      「Open Terminal」を選択し、コマンドプロンプトが開く
[3] 以下を入力
~~~~~
# 仮想環境有効化
activate tensorflow

# classify_image.pyを置いたディレクトリに移動
cd C:\Users\User\Downloads

# 
python classify_image.py
~~~~~

[4] 「python classify_image.py --image_file=【画像認識対象の画像ファイル】」で画像認識
~~~~~
python classify_image.py --image_file=candle.jpg
~~~~~


関連記事

【機械学習】 TensorFlow ~ 入門編 ~

https://blogs.yahoo.co.jp/dk521123/37399356.html

【機械学習】 TensorFlow ~ 自作データでの画像分類 / 準備編 ~

$
0
0

■ チュートリアルを動かしてみる

 ファーストステップとして、
CIFAR-10 (サイファー・テン) というデータセットを使って
機械学習の感じを掴む。
`ファイル名`備考
`#
`説明
1 cifar10_input.py CIFAR-10のバイナリファイル読込 2 cifar10.py CIFAR-10のモデル構築 3 cifar10_train.py CIFAR-10のモデルを訓練 4 cifar10_eval.py CIFAR-10のモデルを評価
https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10

■ TensorFlow での機械学習 / 画像分類の流れ

[1] 学習用データを集める(ついでに評価用のデータも)
[2] 学習する
[3] 評価する


関連記事

【機械学習】 TensorFlow ~ 入門編 ~

https://blogs.yahoo.co.jp/dk521123/37399356.html

【機械学習】 TensorFlow ~ 環境構築 / Windows 編 ~

https://blogs.yahoo.co.jp/dk521123/37399347.html
Viewing all 860 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>