safari029’s blog

暗号通貨、セキュリティ、データ解析、プログラミング等の技術を中心とした適当なメモです。。。

機械学習の勉強をはじめてみる。

以前から気になっていた機械学習を勉強をはじめてみる。

事前知識

pythonを利用すると比較的楽にお勉強ができる。 ・機械学習にもいろいろ種類がある、最新のはやりはDeepLearning(googleの画像解析etc) ・数学はちゃんと勉強しておけばよかった。→必要性を感じて初めてやる気が出た。

初歩から勉強したらどうしたらいいのだろう、とりあえず以下を参考に単純ベイズ法とやらを自分実装しながら、数式も理解していく。

機械学習の Python との出会い

環境

''' $ python --version
Python 2.7.10

$ pip list | grep numpy numpy (1.10.1)

$ pip list | grep ipython ipython (4.0.0) ipython-genutils (0.1.0) '''

単純ベイズ

クラスを作成するところから勉強する。 fitで実際にの学習を行い、

# -*- coding:utf-8 -*-

#URL: http://www.kamishima.net/mlmpyja/

import numpy as np
import scipy as sp
#import matplotlib.pyplot as plt
import sklearn

class NaiveBayes1(object):
    #todo: make class

    def __init__(self):
        self.pY_= None
        self.pXgY_ = None

    def fit(self,X,y):

        # constants
        # n_features:xの特徴種類,n_fvalues:xの値
        n_samples = X.shape[0]
        n_features = X.shape[1]

        # n_classes:yのクラス ,n_fvalues:yの値
        n_classes = 2
        n_fvalues = 2

        if n_samples != len(y):
            raise ValueError('Mismatched number of samples.')

        nY = np.zeros(n_classes, dtype=np.int)
        for i in xrange(n_samples):
            nY[y[i]] += 1

        self.pY_ = np.empty(n_classes,dtype=np.float)
        for i in xrange(n_classes):
            self.pY_[i]= nY[i] / np.float(n_samples)

        nXY = np.zeros((n_features,n_fvalues,n_classes),dtype=np.int)
        for i in xrange(n_samples):
            for j in xrange(n_features):
                nXY[j,X[i,j],y[i]] +=1

        self.pXgY_ = np.empty((n_features,n_fvalues,n_classes),dtype=np.float)
        for j in xrange(n_features):
            for xi in xrange(n_fvalues):
                for yi in xrange(n_classes):
                    self.pXgY_[j,xi,yi]= nXY[j,xi,yi] / np.float(nY[yi])

    def predict(self, X):

        # constants
        n_samples = X.shape[0]
        n_features = X.shape[1]

        # memory for return values
        y = np.empty(n_samples, dtype=np.int)


        for i, xi in enumerate(X):

            #calc predict
            logpXY = np.log(self.pY_) + \
                     np.sum(np.log(self.pXgY_[np.arange(n_features),xi,:]),axis=0)

            y[i] = np.argmax(logpXY)

        return y

実行してみる。

import numpy as np

from nbayes1 import NaiveBayes1

data = np.genfromtxt('vote_filled.tsv',dtype=np.int)

X = data[:, :-1]
y = data[:, -1]

clr = NaiveBayes1()
clr.fit(X,y)

pre_y = clr.predict(X[:10,:])
for i in xrange(10):
    print i,y[i],pre_y[i]

tsvファイルはここから取得します。 sample data

感想

・書くことで数式はなんとなく理解できたが、予想(predict)の公式どうやって導けるのかはよくわからん。やっぱ数学の知識は大事。

pandas備忘録

私が引っかかったポイントまとめ。

データ入力

read_csv文字コード指定

基本的にread_csvでデータを読むことが多いので、read_csv利用時の注意事項。

csvデータのエンコード形式に注意、特にWindows+excelで作成したcsvファイルの読み込み時

df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JIS')

"UnicodeDecodeError:"が発生した。これは文字コードが正しく指定できていないということ、 Shift_JISx0213 を指定するとうまく通った。

df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JISx0213')

データ整形

正規表現によるSeirieからの文字抽出

下記のように","区切りで読み込めないようなファイルから、正規表現で必要な文字列だけを抽出してDataFrameにする方法

以下サンプルデータ、そのままread_csvするとカラム数が違うためエラーとなる。

value1=12333,value2(fuga,hoge),value3=fuga
value1=111,value2(hoge),value3=fugahoge

読み取る場合はまず一列のデータとして読み取る。

In[2]: import pandas as pd
In[3]: df = pd.read_csv('test.csv',header=None,sep='\t')
In[4]: df
Out[4]: 
                                            0
0  value1=12333,value2(fuga,hoge),value3=fuga
1     value1=111,value2(hoge),value3=fugahoge

正規表現を持ちいた分割にはSeries.str.extract()を利用して分割する。

In[5]: df[0].str.extract('value1=(?P<val1>\d+),value2\((?P<val2>[\w,]+)\),value3=(?P<val3>.*)')
Out[5]: 
    val1       val2      val3
0  12333  fuga,hoge      fuga
1    111       hoge  fugahoge

”()”の中身が実際に抽出する値、”?P<hoge>”の部分でカラム名を指定できる。 指定しない場合は頭から順番に番号が振られる。

また、抽出した値はobjectとして返されるので、int型等に適宜変更する必要がある。

リンク元

http://minus9d.hatenablog.com/entry/2015/07/30/225841

pythonによるスクレイピング

macの環境にBeautifulSoupをインストールします。

 

pip install BeautifulSoup4

…Successfully installed BeautifulSoup4-4.4.1

 

※古いバージョンをインストールしないよう注意

pip install BeautifulSoup

…Successfully installed BeautifulSoup-3.2.1

 

適当にCUIで試してみる。

 

from bs4 import BeautifulSoup

import urllib2,HTMLParser

page = urllib2.urlopen('hxxp://example.com')

soup=BeautifulSoup(page)

#a tag情報のみを取得

atag=soup.findAll('a')

 

pandasによるデータ解析作業メモ

pandasに関する作業メモ置き場。

・inputフォルダ直下のcsvファイルをresult(DataFrame)にまとめて呼び出す。

 

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

 

 

phpMyFAQインストールメモ(CentOS6.6)

FAQシステム(phpMyFAQ)をインストールするのでメモ書き

 

構築環境

 

インストール

以下のサイトを参考にインストールします。

phpMyFAQ × CentOS7 (2) phpMyFAQのインストール – CLARA ONLINE techblog

事前準備編

yumのアップデート

yum update

 

wget,unzipは作業で使うのでインストール

yum install wget unzip -y

 

必要なサーバインストール

yum install mysql mysql-server mysql-devel httpd -y

 

phpモジュール追加

yum install php-mysql php-mbstring php-gd php-xml

httpd起動

 service httpd start

 

mysql文字コード指定

vim /etc/my.cnf

[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8

<p[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

mysql起動

service mysqld start

 

自動起動設定を有効化

chkconfig httpd on

chkconfig mysqld on

 

ここまでで事前準備完了。

 

phpMyFAQインストール

phpMyFAQ - Downloads より最新版のzipを落とす。

wget http://download.phpmyfaq.de/phpMyFAQ-2.8.22.zip

 

html配下に移動

mv phpmyfaq/ /var/www/html/phpmyfaq

ディレクトリ作成(phpmyfaqで必要なディレクトリ)

mkdir /var/www/html/phpmyfaq/attachments
mkdir /var/www/html/phpmyfaq/data
mkdir /var/www/html/phpmyfaq/images

権限付与

chmod -R 775 /var/www/html/phpmyfaq/attachments

chmod -R 775 /var/www/html/phpmyfaq/data

chmod -R 775 /var/www/html/phpmyfaq/image

ディレクトリ所有者変更

chown -R apache:apache /var/www/html/phpmyfaq

 

サーバの設定

phpmysqlのDB作成

 #mysqlのセキュリティ設定

mysql_secure_installation

#データベースに入る

mysql -u root -p

#DB作成

mysql>   create database DB default character set utf8;

#ユーザ作成

mysql> grant all privileges on DB名.* to ユーザ名@localhost identified by 'パスワード';

#サーバに権限テーブルを再度読み込ませ、権限の変更を反映させる

mysql> flush privileges;

mysql> quit

httpd.conf設定(/etc/httpd/conf/httpd.conf)

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html/phpmyfaq"

 ドキュメントルートをphpmyfaqに設定

 

サービス再起動 

service httpd restart

httpd を停止中: [ OK ]
httpd を起動中: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
[失敗]

service mysqld restart

mysqld を停止中: [ OK ]
mysqld を起動中: [ OK ]

DocumentRootの変更がうまくいかない、原因はSELinuxのようです。

#SELinuxを一時停止して検証 

setenforce 0

servie httpd start

httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]

検証環境なのでとりあえずOKとします。

 

phpmyfaqのGUI設定

 

http://サーバ名/install/setup.php にアクセスします。

f:id:safari029:20150423003401p:plain

設定値に何をいれるかは以下のサイトを参考にさせていただきました。phpMyFAQ - 気の向くままに・・・ - Seesaa Wiki(ウィキ)

 

とりあえずこれで動いた。

レイアウトとかいけてないのでそのうち変えよう。

 

勉強環境

各種ツール類 使っているものetc

 

*1

脆弱性体験、練習環境を提供

owaspbwa - OWASP Broken Web Applications Project - Google Project Hosting

脆弱性体験学習ツール AppGoat:IPA 独立行政法人 情報処理推進機構

日本語なのがありがたい、ヒントが豊富でわかりやすい。

診断関連

OWASP Zed Attack Proxy Project - OWASP

ターゲットのサイトを指定すれば

Penetration Testing Software | Metasploit

 最も有名な脆弱性診断ツール

 

プロキシ

Webトラフィックのモニター改編のため、プロキシを利用。

Burp Suite

Download Fiddler Web Debugging Tool for Free by Telerik

 Fiddler利用方法

 http://www.hebikuzure.com/fiddler/HajimetenoFiddler.pdf

 

 

参考サイト:

練習用脆弱Webアプリケーションの調査 - Web Application Security Memo

 

*1:以下ツールは必ず自環境のみで動かすこと!!

Snort動作確認編

 

前回 (Snortインストール編 - safari029’s blog)の続き。

 

動作確認作業

まずは適当なシグネチャを書きます。

$ vi /snort_test.conf

 

まずはホスト型IDSとして動作させます。シグネチャはとりあえずlocalに対するpingを検知する設定を作成。

alert icmp any any -> サーバのIP any (msg:”ICMP_detection”; sid:1000000;)

 

 テストコマンドで確認してみます。

$ snort -T -c snort_test.conf~略~Snort successfully validated the configuration!Snort exiting

 

successfully がでてればOK、ちなみにNGのときはERRORとなるので適宜修正します。

 

あとlogファイル保管用のディレクトリ作っておきます。

snort起動時にlog保管フォルダを指定できるのですが、指定しない場合は/var/log/snort/ 内に保存されるらしい)

$ sudo mkdir  /var/log/snort

 

では早速起動。 

snort -D -c snort_test.conf

 

ログファイルを表示させながら外部から対象サーバにpingを打ってみると…

# tail -f  /var/log/snort/alert [**] [1:1000000:0] ICMP_detection [**][Priority: 0]
11/14-23:51:38.973144 FROMのIP -> ホストのIP
ICMP TTL:119 TOS:0x0 ID:3020 IpLen:20 DgmLen:60
Type:8 Code:0 ID:61229 Seq:2 ECHO

 

無事検知されました、ちなみにシグネチャで検知されたパケットは同フォルダに「snort.log.数字」として保管されてます。こちらはWireSharkなどで確認することができます。

# ls -l /var/log/snort/
total 8
-rw-r--r-- 1 root root 788 Nov 14 23:52 alert
-rw-r--r-- 1 root root 384 Nov 14 23:52 snort.log.1415976580

 最後にsnortはkillすることをお忘れなく。

 

参考

10分で出来る snort インストールと検知テスト at www.morihi-soc.net

ゼロから始めるLinuxセキュリティ(最終回):ネットワーク型IDS「Snort」のシグネチャ作成法 - @IT

1分で建てるローカルWebサーバ — msrsblog