【データベース】インデックスについて
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は次回で!
まずは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
Apacheのhttpd.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
#/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を書きます!
【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についてはこちらを参照してください。
$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)の原則はコードの修正が必要になった場合、既存のクラスを直接変更するのではなく、拡張して対応すべいという原則。
他にもたくさんありますがこのへんで終わらせます笑