WEBエンジニアのメモブログ

いろいろ書いていきます。このブログを見た人がなんらかのお役に立てば幸いです。

【データベース】インデックスについて

SQLにインデックスという機能があり、SQLチューニングには欠かせない機能です。
辞書の目次みたいなもので検索を早くします。
ですが やみくもに作れば良いと
いうわけではありません。


インデックスを作成する列として適不適を判断するための
最も重要な情報はカーディナリティです。

特定の列の値が、どれくらいの種類の多さを持つかという意味です。

簡単な例を出します。

性別」の場合 男と女がという2種類の値があります。

この列が10万行あったとしても 男と女の2種類しかないわけで
この場合 カーディナリティが低いと言えます。

しかし、電話番号ならどうでしょうか?
こちらは複数の種類がありますよね

電話番号は絶対に被らないので10万行あったら
カーディナリティが高いと言えます。

このようにインデックスを作成する際はこうした
カーディナリティが高い列を選ぶことが基本です。

ただし、値が偏らず、平均的に分散していることがベストです。

【PHP】PHPのセッションについて

ログイン機能を持たせるときに
セッション機能を使いますが PHPのセッションについて調べてみました。


php.iniの設定がデフォルトなら
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440

sessionの初期化処理が実行される時
1/1000の確率で24分(1440秒)以上アクセスされないsession情報を破棄。

もしテスト環境でデフォルトのphp.iniの設定の場合なら
いつまで経ってもsession timeout が発生しない可能生があります。

timeoutの確認をしたい場合は、/etc/php.iniを以下のように変更して、3分(180秒)後に、別sessionで同じアプリにアクセスしてからタイムアウトしてるかどうかを確認すればいいと思います。

session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 180




なお、最近のフレームワークはここらへんを自由に設定できるいたいですね
便利!

[CentOS6]簡単LAMP環境 構築

CentOS7の時代かもしれませんがとりあえず

CentOS6のLAMP環境構築したときのインストールログを書いておきます。

CentOS7は次回で!

 

CentOS-6.5-x86_64-bin-DVD1

まずはyum update


ntpのインストール

# yum -y install ntp

# vi /etc/ntp.conf

ローカルからの時刻同期を許可
# Hosts on local network are less restricted.
# restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

時刻同期先のNTPサーバを変更
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# server 0.centos.pool.ntp.org
# server 1.centos.pool.ntp.org
# server 2.centos.pool.ntp.org

server ntp.nict.jp
server ntp.jst.mfeed.ad.jp
server ntp.ring.gr.jp


NTPサーバを起動する
1.ntpdateで手動でサーバの時刻を合わせる.大幅にズレているとNTPサーバを起動できない場合がある.

2./etc/rc.d/init.d/ntpd startでNTPサーバを起動する

3.chkconfig onで自動起動設定(--listで確認できる)


タイムゾーン東京に設定
[# vi /etc/sysconfig/clock
# 例として東京に変更
ZONE="Asia/Tokyo"
UTC="false"
# source /etc/sysconfig/clock # 変更を反映
# タイムゾーンファイルを上書きコピー
# cp -p /usr/share/zo

 

 

SELinux無効

SELinuxは、侵入された後の被害を少なくすることを目的としたものです。

本来であれば、有効にしておいたほうが良いのですが、
個人情報などをあつかうような業務で使うようなものでない限り、不要かと思いますので、今回は無効にします。

getenforce 状態確認

# vi /etc/sysconfig/selinux
SELINUX=enforcing

SELINUX=disabled

※間違えるとrebootしたときにカーネルパニックを起こすので注意

 

 

#Apacheのインストール
$ yum install httpd

#Apacheの起動
$ /etc/init.d/httpd start

#Apacheの起動の確認
$ /etc/init.d/httpd status
httpd (pid 1297) を実行中...

#サービス自動起動の確認

$ chkconfig --list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

#httpdのサービスを自動起動にする
$ chkconfig httpd on

#サービス自動起動の確認
$ chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 


#iptablesがインストールされているか確認
$ yum list installed iptables

#iptablesの設定内容確認(参考)
$ iptables -L

#iptablesの設定を編集
$ vi /etc/sysconfig/iptables

# SSH
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# HTTP
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

# Mysql
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

#iptablesの再起動
$ /etc/rc.d/init.d/iptables restart

httpdのサービス自動起動

 

 Apachehttpd.confの設定
[# vi /etc/httpd/conf/httpd.conf ← httpd設定ファイル編集
ServerTokens OS

ServerTokens Prod ← エラーページ等でOS名を表示しないようにする

# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
  ↓
AllowOverride All ← .htaccessの許可

ServerSignature On

ServerSignature Off ← エラーページでサーバー情報を表示しないようにする

AddDefaultCharset UTF-8

#AddDefaultCharset UTF-8 ← コメントアウト(文字化け対応)


「ja」を先頭に追加
------------------------
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
------------------------

バーチャルホストの設定
サブドメインを切ったりする場合に使用
------------------------
#NameVirtualHost *:80

NameVirtualHost *:80

 

ヴァーチャルホストを使う場合

confファイルを作成してインクルードするかhttpd.conf」末尾に追加してください

------------------------
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot サイトのプログラムを設置しているディレクトリ
ServerName ドメイン名またはIP
ErrorLog エラーログを出力するディレクトリ
CustomLog アクセスログを出力するディレクトリ
php_value include_path ".:インクルードするディレクトリ"
</VirtualHost>
------------------------


PHPインストール

今回はリポジトリを使わずそのまま入れます。

yum list | php
yum list installed | grep php*
yum install php53.x86_64
yum install php-pgsql.x86_64
yum install php-mysql.x86_64
php-common.x86_64 5.3.3-27.el6_5.2
php-devel.x86_64 5.3.3-27.el6_5.2
php-mbstring.x86_64 5.3.3-27.el6_5.2
php-mysql.x86_64 5.3.3-27.el6_5.2
php-pdo.x86_64 5.3.3-27.el6_5.2
php-pear.noarch 1:1.9.4-4.el6

php.ini 設定

vi /etc/php.ini

short_open_tag = Off

short_open_tag = On ←変更(short_open_tag有効)

 

error_reporting = E_ALL

error_reporting = E_ALL & ~E_NOTICE ←変更(出力するエラーの種類)

エラーを出力する
------------------------
display_errors = On
------------------------

;default_charset = "iso-8859-1"

default_charset = "UTF-8" ←コメント解除&変更(デフォルト文字コード)

post_max_size = 8M

post_max_size = 20M ←変更(最大POSTアップロードサイズ)

upload_max_filesize = 2M

upload_max_filesize = 20M ←変更(最大アップロードサイズ)

;date.timezone =

date.timezone = Asia/Tokyo ←コメント解除&変更(タイムゾーン指定)

;mbstring.language = Japanese

mbstring.language = Japanese ←コメント解除(デフォルト言語)

;mbstring.internal_encoding = EUC-JP

mbstring.internal_encoding = UTF-8 ←コメント解除&変更(内部文字エンコーディングのデフォルト値)

;mbstring.http_input = auto

mbstring.http_input = UTF-8 ←コメント解除&変更(HTTP入力文字エンコーディング)

;mbstring.http_output = SJIS

mbstring.http_output = pass ←コメント解除&変更(HTTP出力文字エンコーディング)

;mbstring.encoding_translation = Off

mbstring.encoding_translation = On ←コメント解除&変更(内部文字エンコーディングの有効・無効)

;mbstring.detect_order = auto

mbstring.detect_order = auto ←コメント解除(文字コード検出のデフォルト値)

;mbstring.substitute_character = none;

mbstring.substitute_character = none; ←コメント解除(無効な文字を代替する文字を定義)

終ったら 
service httpd restart

 

Mysql

#yum install mysql-server

#/etc/rc.d/init.d/mysqld start ← MySQL起動

#sudo chkconfig mysqld on 自動起動

# chkconfig --list | grep mysqld 確認

#show variables LIKE 'port'; ポート確認

 

mysql 設定ファイル変更

# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server=utf8  ← 追加

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

[mysql]          ← 追加
default-character-set=utf8  ← 追加

 

# mysql -u root -p ログイン
mysql> show databases;
(データベースの一覧が表示される)
mysql> create database test_db;
mysql> show databases;
(データベースの一覧にtest_db表示されることを確認)
mysql> grant all privileges on vuserdb.* to test@192.168.100.100 identified by 'hogehoge';
(192.168.100.100からtestのユーザーでアクセスを許可する。パスワードはhogehogeに記述したが、任意に決めてよい)

 

ネットワーク種別:MySQL(TCP/IP)
ホスト名/IP:192.168.100.100(Centos側のIPアドレス
ユーザー:test
パスワード:hogehoge
ポート:3306
データベース:test_db

これで外部DBツールから接続できます。

 

 

以上! 

次はCentOS7を書きます!

 

 

 



DNSのレコードついて

自分でドメインを設定していて
レコードについて気になっていたので調べてみた。

主に使うのはIPとドメインを紐付けるAレコードです。

他にもあるので一覧を書いておきます。

レコードの種類意味
AIPアドレス
PTRドメインに対するIPアドレス
NSネームサーバー
MXドメインのメールサーバー

【Apache】画像ファイル,CSS,javaScriptへのアクセスを記録しない

Apacheにはアクセスログをとっている箇所がありますが
画像に対してまで記録すると、ログファイルがすぐに一杯になりますので
画像ファイルへのリクエストに対してログを記録しない様に設定します。

ログの内容を解析しやすくなりますし、I/O利用量の削減効果もあります。

ごく微量だとは思いますが、Apache のパフォーマンスも向上するかもしれません。


httpd.conf

SetEnvIf Request_URI "\.(gif|jpeg|jpg|png|js|css|swf|ico|)$" no_log
CustomLog /var/log/httpd/access_log combined env=!no_log


設定ができたら、Apache を再起動し、変更を反映させます。

【PHP】無名関数について

無名関数とは、そのままの意味で名前のない関数です。

どういうことかと言うと、変数を代入したり、コールバックとして指定できます。

実用例が少ないのが現実ですが、無名関数は非常に強力な機能です。


以下の例では無名関数を使うとコールバック関数として指定するべき関数をいちいち
名前をつけなくても使用できます。





array_mapについてはこちらを参照してください。

PHP: array_map - Manual

$array  = array('あいうえお','<BR>','<hr>');

$escape = array_map(function($value){
	return htmlspecialchars($value,ENT_QUOTES,'UTF-8');
}, $array);

var_dump($escape);

array(3) { [0]=> string(15) "あいうえお" [1]=> string(10) "<BR>" [2]=> string(10) "<hr>" }

オブジェクト指向思考の原則

オブジェクト指向の三大要素

この三つを基礎して用いて作成されているが、オブジェクト指向の本質的な利点

を活かすための原則をいくつか紹介します。

 

DRYの原則

Don't  repaet  yourself』の略で重複すべきでないという考え。

コードを打つときにコピペを使うときがあるかもしれませんが、同じコードは修正を

困難にするときがあります。

何箇所も修正もしなければないのに、一箇所でも修正漏れがある場合

バグの原因となります。

同じ機能はコピペじゃなく、クラスやメソッドを用いて共通化する。

 

YAGNIの原則

You ain't gonna need it』(ヤグニと読むらしいです)

機能が実際に必要になるなで実装しないという原則です。

後できっと使うだろうと思い、作ったがいいもの結局使わなかったことがあると思います。必要ないものを作り込むことは、それが必要になったときには助かりますが、実装にコストがかかるし、無駄にリスクがある。コードの量も増えるのでメンテナスが大変になる。それどころか余計な複雑性を盛り込むことになる。

 

オープン・クローズドの原則

オブジェクト指向の本質は既存のコードを修正することなく拡張すること。

オープン・クローズド(Open/Closed Principle)の原則はコードの修正が必要になった場合、既存のクラスを直接変更するのではなく、拡張して対応すべいという原則。

 

 

他にもたくさんありますがこのへんで終わらせます笑