January 20, 2018, 12:44 am
↧
January 20, 2018, 10:11 pm
■ 負荷テストのボトルネック/エラーを考える
【1】攻撃ツール
【2】ロードバランサ
【3】OS/サーバ
【4】アプリケーション
【5】DB
【4】アプリケーション
* フレームワークが遅い
* ログを多く出力している
+ topコマンドで、sys の使用率が増える
↧
↧
January 22, 2018, 4:19 am
■ 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 でアクセスする
↧
January 24, 2018, 6:43 am
■ サンプル
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;
}
}
}
↧
January 17, 2018, 6:24 am
■ 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)
↧
↧
January 29, 2018, 5:27 am
■ 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
↧
January 30, 2018, 5:50 am
■ Raspberry PI で音声合成を行う
[1] Open JTalk <= これを使う
[2] AquesTalk
[3] AquesTalk2
[4] Galatea Talk
■ 設定手順
前準備:音が出るかを確認
# 優先する出力先を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
↧
January 31, 2018, 7:16 am
■ 設定手順
[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
~~~~
↧
February 7, 2018, 7:14 am
■ 環境
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にアクセスできる
↧
↧
February 2, 2018, 7:02 pm
■ はじめに
* EC2内で、EC2 の情報を取得する方法を調べてみた
【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)
↧
February 9, 2018, 6:54 pm
↧
February 2, 2018, 1:15 am
■ 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
↧
February 13, 2018, 6:40 am
■ 環境構築
# シェルに実行権限を付与
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
↧
↧
February 14, 2018, 5:12 am
■ 現象
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
↧
February 4, 2018, 6:37 am
■ 制限事項
* 前回の状態を保持しない
=> 以下「気を付ける事項」の「【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
↧
February 15, 2018, 6:20 am
■ 環境設定
* Gradle を使用
* 以下の関連記事の「準備 : Buildship: Eclipse Plug-ins for Gradle のインストール」を行い
Gradle プロジェクトを作成し、Eclipseの対象プロジェクトを右クリックし、
[Gradle]-[Refresh Gradle Project]を選択しモジュールをダウンロード
https://blogs.yahoo.co.jp/dk521123/37204914.htmlbuild.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)
=> 圧倒的に速い!!
↧
February 5, 2018, 4:50 am
↧
↧
February 15, 2018, 5:35 pm
■ TensorFlow (テンソルフロー)とは?
* 人工知能・機械学習向けライブラリ
ライセンス
* Apache 2.0
■ 種類
* TensorFlow
* TensorFlow for Mobile
* TensorFlow Lite
↧
February 16, 2018, 5:29 pm
■ 設定環境
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
~~~~~
↧
February 17, 2018, 10:10 pm
■ チュートリアルを動かしてみる
ファーストステップとして、
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] 評価する
↧