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

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

お世話になった本を紹介いたします【プログラミング編】

WEBエンジニアなって一年とちょっと
自分のスキルを上げるためにいろんな本を買って読んできました。

そこでお世話になった本をいくつか紹介します。

最初に「読む」PHP

たぶん初めて買ったPHPの本。
XAMPPのインストールからプログラミングの基本とWEBの基礎知識について
書かれています。超初心者本

PHP逆引きレシピ 第2版

こういうことがしたい!って思ったときにサッと調べられる便利な本
私の職場の机にも置いてあります(笑)

パーフェクトPHP
パーフェクトPHP (PERFECT SERIES 3)

既にPHPをある程度習得しているか、他の言語で、フレームワークオブジェクト指向、リレーショナルデータベースを使った開発をしたことがある人向け。PHPについて詳しく書かれています。
初心者には難しすぎると思います。


体系的に学ぶ 安全なWebアプリケーションの作り方
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

徳丸先生の本。もし公開するサービスを作ろうとしているなら確実に読んだ方がいいと思います。
VMWareを用いて実際に脆弱性を確認するため、非常に分かりやすいです。



効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門
効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門

上で紹介したパーフェクトPHPを書いている人が書いた本です。
デザインパターンから開発手法、テストツールの使い方まで広く紹介しています。
フレームワークはSymfony2を使っています。


プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5jQuery-Mobile
プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5、jQuery-Mobile (Software Design plus)

JavaScript初心者には難しすぎる本でした。
私も一度断念しました。
jQuery・node.jsに関しても、専門書やリファレンスに続くための基礎を身につけるためのテーマがしっかりと書かれています。



はじめてのフレームワークとしてのFuelPHP 改訂版
はじめてのフレームワークとしてのFuelPHP 改訂版

FuelPHPが気になったので買ってみました。
内容はFuelPHPの構造がよく書かれており、インストール、環境構築(XAMMP,MAMP,Vagrant)、基本、実践、
テストのやり方まで解説してあり、大変参考になりました。
いつかFuelPHPで開発してみたい!

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

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 を再起動し、変更を反映させます。