Zabbixサーバ構築

CentOS 6.6で行った。

Zabbixサーバ構築

#リポジトリの登録
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

# Zabbixサーバのインストール
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese

# MySQLのインストール
yum install -y mysql-server

# MySQLの環境設定
vim /etc/my.cnf で以下の2行つけたす
default-character-set=utf8
skip-character-set-client-handshak

# MySQL起動
service mysqld start

# Zabbix用データベースの作成
mysql -uroot
create database database_name;
grant all privileges on database_name.* to username@localhost identified by 'password';
flush privileges;
exit

# 初期データベースのインポート
cd /usr/share/doc/zabbix-server-mysql-2.2.11/create
mysql -uroot database_name < schema.sql
mysql -uroot database_name < images.sql
mysql -uroot database_name < data.sql

# Zabbixサーバの環境設定
vim /etc/zabbix/zabbix_server.conf で
DBPassword= をコメントアウトして適当な値を入れる

# Zabbixサーバの起動 
service zabbix-server start

# PHPの環境設定
vim /etc/httpd/conf.d/zabbix.conf で
タイムゾーンをAsia/Tokyoにする

# Apacheの起動
service httpd start

# 自動起動の設定
chkconfig mysqld on
chkconfig zabbix-server on
chkconfig httpd on

Zabbixエージェント

# Zabbixエージェントのインストール
yum install -y zabbix-agent

# Zabbixエージェントの設定
vim /etc/zabbix/zabbix_agentd.conf で
Server=server IP Address
ServerActive=Server IP address

# 自動起動の設定と起動
chkconfig zabbix-agent on
service zabbix-agent start

PythonでMySQL基本操作

ライブラリのインストール

ここからmysql-connector-pythonのzipファイルをダウンロード.

Index of Packages : Python Package Index

そして、解凍先へ行って

python setup.py install

するだけ。

コード

import mysql.connector

try:
    cnn = mysql.connector.connect(host='localhost',
                                  db='データベース名',
                                  user='ユーザ名',
                                  passwd='パスワード',
                                  port=ポート番号,
                                  charset='文字コード'
                                  )

    # 例で t1 というテーブル作ってます
    cur = cnn.cursor(buffered=True)
    cur.execute("drop table if exists t1")
    cur.execute("create table t1 (a int,b int)")

    sql = "insert into t1 values "

    for j in range(100):
        for i in range(10000):
            sql += "("+str(i)+","+str(i)+"),"
        sql += "("+str(-1)+","+str(-1)+")"
        cur.execute(sql)
        cnn.commit()
        sql = "insert into t1 values "

except Exception as e:
    print e

参考文献

[Python][SQL]mysql.connectorが使えるようになるまで | Momentum

MySQL 基本文法2 メモ

並べ替えと抽出

# カラム名で昇順
select * from テーブル名 order by カラム名;

# カラム名で降順
select * from テーブル名 order by カラム名 desc;

# グループ化->抽出
select カラム名 from  テーブル名 group by カラム名 having 条件
select bang,sum(uria) from tb group by bang having sum(uria)>100;

更新

# 指定したカラム名の値すべて変更
update テーブル名 set カラム名=値;

# 条件に一致したレコードのカラムだけ修正
update テーブル名 set カラム名=値 where 条件;

統合

# 基本統合(重複分はunion allで出せる)
(select カラム名 from テーブル名1 where 条件)
union
(select カラム名 from テーブル名2 where 条件);

結合

# 内部結合
select カラム名 from テーブル名1
join 結合するテーブル名2 on テーブル名1.カラム名=テーブル名2.カラム名;

# 左外部結合
select カラム名 from テーブル名1
left join テーブル名2 using(カラム名);

#右外部結合
select カラム名 from テーブル名1
right join テーブル名2 using(カラム名);

サブクエリ

# tb1内のtosiの平均値以上のtosiをもつレコードの抽出
select * from tb1 where tosi >= (select avg(tosi) from tb1);

# tb内のuriaの最大値をもつレコードの抽出
select * from tb where uria in (select max(uria) from tb);

# tbにあってtb1にないやつ以外の情報の中でtb1にあるレコードを抽出
select * from tb1 where exists (select * from tb where tb.bang=tb1.bang);

# tbにあってtb1にないやつの情報の中でtb1にあるレコードを抽出
select * from tb1 where not exists (select * from tb where tb.bang=tb1.bang);

ストアドプロシージャ

# 定義
delimiter //
create procedure pr2(d int)
begin
select * from tb where uria>=d;
end
delimter ;
//

# 呼び出し
call pr2

# 内容表示
show create procedure pr2;

# 削除
drop procedure pr2;

ストアドファンクション

# 定義
delimiter //
create function fu1(sintyo int) returns double
begin
return sintyo * sintyo * 22 / 10000;
end
//
delimiter ;

# 呼び出し
select fu1(174);

# 変数定義
delimiter //
create function fu2() returns double
begin
declare r double;
select avg(uria) into r from tb;
return r;
end
//
delimter ;

# 内容表示
show create function fu2;

# 削除
drop function fu2;

トリガ

# 定義
delimiter //
create trigger tr1 before delete on tb1 for each row
begin
insert into tb1M values (old.bang, old.nama, old.tosi);
end
//
delimiter ;

# 確認
show triggers;

# 削除
drop trigger tr1;

ストレージエンジン

# ストレージエンジンの確認
show create table tb;

トランザクション処理

# トランザクションの開始
start transaction;

# ロールバック
rollback;

# コミット
commit;

# 自動コミットをオフ
set autocommit=0;

# 自動でコミットされる処理
drop database
drop table
drop
alter table

ファイル

# コマンドが書かれたファイルの読み込んで実行
source ファイルのパス

# CSV読み込み
load data infile 'CSVファイルのパス' into table テーブル名 fields terminated by ',';

# CSV書き込み
select * into outfile 'CSVファイルのパス' fields terminated by ',' from テーブル名;

# 実行コマンドと結果をファイルに書き込み開始
## 始まり
tee ファイル名
## 終わり
notee

参考文献

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

MySQL 基本文法 メモ

ログインとログアウト

ログイン

# 対話モード
mysql -u username -p password

# ファイルを読み込ませて実行
mysql -u username -p password -e ファイルのパス

ログアウト

quit
or
exit

設定

# ユーザの作成
create user username@localhost identified bypassword’;

# ユーザの削除
drop user username;

# 権限の付与
grant authority on database_name.table_name to username@localhost;

# 情報の表示
status

データベース操作

# データベースの作成
create database new_table_name;

# データベースの表示
show databases;

# データベースの削除
drop database データベース名;

# 使用するデータベースを決める
use database_name;

# 現在使用しているデータベースの表示
select database();

テーブル基本操作

# テーブルの作成
create table table_name(column_name1 data_type1, column_name2 data_type2, ……) charset=utf8;

# 指定のテーブルが存在しているときに削除
drop table if exists テーブル名; 

# 自動インクリメントの初期化
alter table table_name auto_increment=0

# すべてのテーブルの表示
show tables;

# テーブルの属性構造の表示
desc table_name;

# テーブルのコピー
create table new_table_name select * from table_name;

データ操作

# データの挿入
insert into table_name values(data1, data2,…...);

# データの表示
select カラム名1, カラム名2,... from table_name;

# すべてのデータ表示
select * from table_name;

# レコードの削除
delete from テーブル名;

# カラムのデータ型の変更
alter table table_name modify カラム名 データ型

# カラムの追加
alter table table_name add カラム名 データ型;

# カラム位置の変更
alter table table_name modify カラム名 データ型 first # 先頭
alter table table_name modify カラム名 データ型 after bang # bangの後

# カラム名とデータ型の変更
alter table table_name change 変更前カラム名 変更後カラム名 変更後データ型;

# カラムの削除
alter table table_name drop カラム名;

# カラム情報だけコピー
create table 新しいテーブル名 like テーブル名;

# 他のテーブルのデータをコピー
insert into コピー先のテーブル名 select * from コピー元のテーブル名;

# 特定のカラムを選択してコピー
insert into コピー先のテーブル名 (カラム名) select カラム名 from コピー元のテーブル名;

インデックス操作

# インデックス作成
create index インデックス名 on テーブル名(カラム名);

# インデックスの表示
show index from テーブル名 \G

# インデックスの削除
drop index インデックス名 on テーブル名;

テーブルいろいろ操作

# 主キー設定
create table table_name(column_name1 data_type1 primary key, column_name2 data_type2, ……) charset=utf8;

# UNIQUE
create table table_name(column_name1 data_type1 unique, column_name2 data_type2, ……) charset=utf8;

# 自動インクリメント
create table table_name(column_name1 data_type1 auto_increment primary key, column_name2 data_type2, ……) charset=utf8;

# デフォルト値
create table table_name(column_name1 data_type1 default 初期値, column_name2 data_type2, ……) charset=utf8;

条件に一致したレコードの表示

# 条件に一致したレコードの表示
select カラム名 from テーブル名 where 条件;
演算子 内容
A in B Bの中にAがある
A not in B Bの中にAがない
A between B and C BからCにAがある
A not between B and C BからCにAがない

# カラム名に4か5をもつレコードの表示
select * from テーブル名 where カラム名 in (4,5)

# あいまい検索 like
# %は任意の文字列, _は任意の1文字
select * from tb where カラム名 like 条件
select * from tb where bang like '%03_'; # 一致
select * from tb where bang not like '%03_'; # 不一致
select * from tb where bang is null; # null

参考文献

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

各言語での実行時間計測

各言語での実行時間の計測メモ。

シェルスクリプト

#!/bin/sh

TIME_START=`date +%s` 

# start

# end

TIME_END=`date +%s` 
PT=`expr ${TIME_END} - ${TIME_START}`
H=`expr ${PT} / 3600`
PT=`expr ${PT} % 3600`
M=`expr ${PT} / 60`
S=`expr ${PT} % 60`
echo "${H}:${M}:${S}"

Python

import time
start = time.time()

# start

# end

end = time.time() - start

print end

Ruby

require 'benchmark'

result = Benchmark.realtime do
  
# start

# end

end
puts "#{result}s"

参考

シェルプログラムで処理時間計測やタイムスタンプ出力 | トミリュウ・コム

Rails - Rubyで処理の時間計測方法 - Qiita

スレッド Python

スレッドの使い方のメモ。

# coding:utf-8

import threading

# スレッドクラスの継承
# 独自スレッドクラス定義
class MyThread(threading.Thread):

    # 初期化処理
    def __init__(self):
        super(MyThread, self).__init__()

    # スレッドの処理
    def run(self):
        print "Class Thread"

# スレッドにさせたい処理
def inc(h):
    for i in range(5):
        print i
    print threading.currentThread().getName()+ ": " + h

# Main
if __name__ == '__main__':

    # スレッド定義と処理開始
    th = threading.Thread(target=inc,name="th",args=("hello",))
    th.start()

    # Mainスレッドの処理
    print threading.currentThread().getName()

    # 独自スレッド定義と処理開始
    th_c = MyThread()
    th_c.start()

統計の基礎とPython

本読みながらコード書いて勉強しています。

Rで統計したことあるけども、Pythonでも。 以下コードメモ。

# coding:utf-8
import numpy as np

# データ
data = np.array([34,35,47,51,58,62,81])

# 平均計算
ave = np.average(data)
print(u"平均:"+str(ave))

# 分散計算
var = np.var(data)
print(u"分散:"+str(var))

# 標準偏差計算
std = np.std(data)
print(u"標準偏差:"+str(std))

不偏分散と標本分散

Nの値(標本数)を増やしていくと、不偏分散と標本分散の値の差が少なくなる。

# 標本分散
def bunsan(n):
    ret = 0
    for i in range(len(n)):
        ret += (n[i]-np.average(n))**2
    return ret/len(n)

# 不偏分散
def bunsan2(n):
    ret = 0
    for i in range(len(n)):
        ret += (n[i]-np.average(n))**2
    return ret/(len(n)-1)

N = 100000
r = np.random.random(N)*100
print(bunsan(r))
print(bunsan2(r))

参考文献

まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)

まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)

Python でのエラー処理

たまに忘れるんでメモ。

エラー処理

Javaなら例えば

try{
      #  したい処理
}catch(Exception e){
      #  エラー処理
}

というふうに書く。

Pythonなら

try:
      #  したい処理
except:
      #  エラー処理

で、エラーのオブジェクトがほしいときは

try:
      #  したい処理
except Exception as e:
      #  print e.args

とする。

PowerShell上でのシャドウコピーの作成

シャドウコピーとは

ここら辺参照。

Volume Shadow Copy Service (Windows)

Windows用語集 - ボリューム・シャドウ・コピー:ITpro

シャドウコピーとは|shadow copy|シャドーコピー - 意味/解説/説明/定義 : IT用語辞典

作成 (Windows8)

シャドウコピーを手動で作ろうとすると、Windowsの「システムの保護」っていう機能から、GUI的にポチポチしていけばできる。f:id:carumisu:20151113104514p:plain

「コントロールパネル」-> 「システムとセキュリティ」-> 「システム」-> 「システムの保護」で出てくる。

GUIでポチポチするのが面倒くさいときは、PowerShellを管理者権限で起動して以下を起動。

> Get-WmiObject -list win32_shadowcopy).Create("C:\","ClientAccessible")

とするだけ。

PowerShell メモ

Power Shell ISEなんか使いにくい。

実行環境

スクリプトを実行できるようにする。 Windows Power Shellを管理者権限で起動し以下を入力する。

Set-ExecutionPolicy RemoteSigned

で、ポリシーを変更するとスクリプトを処理できるようになる。

Hello World

echo “Hello World”

コマンドレット

PS(PowerShell)でのコマンドをコマンドレットという。 Set-LocationとかGet-Contentとか。 Unixコマンドの名前でAliasされているものもある。

alias

で見られる。

コマンドレットのヘルプは

help コマンドレット

で見られる。

コメント

# 単一行コメント

<#
複数行コメント
#>

基本的な文法

# test.ps1

# 引数定義
Param($p1, $p2)

# 変数定義
$test = "Test"
${こんにちは世界} = "Hello World"
[int] $one = 1
echo $test
echo ${こんにちは世界}
echo $one

# .NETモジュールのAPIを使用可能
echo $test.ToUpper() 

# ""なら展開される
echo "Hello $test"

# 文字列連結
echo ("a"+"b")

# 配列
$array = "one", "two", "three"
$number = 1..3
echo $array[1]
echo $number

# ループ
foreach($i in @(1,2,3,4)){
    echo $i
}
for($i=0;$i -lt 3;$i++){
    echo $i
}

# if
if($true){
    echo $true # $true, $false はすでに登録されている
}elseif($false){
    echo $false
}else{
    echo "else"
}

# 引数
echo $args.Length
echo $p1
echo $p2

# 関数
function func(){
    echo "func"
}
function func1($a){
    echo $a
    return 0
}
func
$ret = func1("Hello")
echo $ret

# 定数
set CONST "const" -option constant
echo $CONST
# $CONST = "error" エラーになる

# コマンドの実行結果取得
$ret = (ls)
echo $ret


参考文献

Windows - PowerShell 使い方メモ - Qiita