My Photo

« January 2015 | Main | March 2015 »

February 22, 2015

[CentOS 6.6]PHP5.5のインストール

関連記事:
[CentOS 6.6]PHP5.5のインストール準備(EPEL、REMIリポジトリの追加)

PHP5.5のインストール

EPEL、REMIリポジトリを追加したのにいよいよインストール。
既存のリポジトリを無効にしなければいけないと書いてあるサイトもあったが、そんなこともなく、以下のようにインストールできた。

# yum --enablerepo=remi --enablerepo=remi-php55 install php php-gd php-pdo php-xml
読み込んだプラグイン:downloadonly, fastestmirror, refresh-packagekit
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * remi: remi.kazukioishi.net
 * remi-php55: remi.kazukioishi.net
 * updates: www.ftp.ne.jp
依存性の解決をしています
(中略)
依存性を解決しました

================================================================================
 パッケージ         アーキテクチャ
                               バージョン                  リポジトリー    容量
================================================================================
インストールしています:
 php                x86_64     5.5.21-1.el6.remi           remi-php55     2.6 M
 php-gd             x86_64     5.5.21-1.el6.remi           remi-php55      72 k
 php-pdo            x86_64     5.5.21-1.el6.remi           remi-php55     112 k
 php-xml            x86_64     5.5.21-1.el6.remi           remi-php55     208 k
依存性関連でのインストールをします。:
 gd-last            x86_64     2.1.1-1.el6.remi            remi           135 k
 libXpm             x86_64     3.5.10-2.el6                base            51 k
 php-cli            x86_64     5.5.21-1.el6.remi           remi-php55     3.7 M
 php-common         x86_64     5.5.21-1.el6.remi           remi-php55     1.0 M
 php-pear           noarch     1:1.9.5-3.el6.remi          remi           375 k
 php-pecl-jsonc     x86_64     1.3.6-1.el6.remi.5.5.1      remi-php55      47 k
 php-pecl-zip       x86_64     1.12.4-1.el6.remi.5.5       remi-php55     269 k
 php-process        x86_64     5.5.21-1.el6.remi           remi-php55      57 k
 t1lib              x86_64     5.1.2-6.el6_2.1             base           160 k

トランザクションの要約
================================================================================
インストール        13 パッケージ
(中略)
完了しました!

とりあえずphp本体の他に php-gd、php-pdo、php-xml をパラメータとして指定した。依存関係からpearなどもインストールされた。

php-mcryptのインストール

Laravelには php-mcrypt が必要というのでインストールしようとしたが、すんなりとはいかなかった。
php本体と同様にインストールしようとしたら、「libmcryptが必要」というエラーが出た。

# yum --enablerepo=remi --enablerepo=remi-php55 install php-mcrypt
(中略)
エラー: パッケージ: php-mcrypt-5.5.22-1.el6.remi.x86_64 (remi-php55)
             要求: libmcrypt.so.4()(64bit)
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest

標準のリポジトリやREMIに libmcrypt はなかったが、EPELにあったのでインストール。
何かワーニング出たけどインストールできた。

# yum --enablerepo=epel install libmcrypt.x86_64
(中略)
依存性を解決しました

================================================================================
 パッケージ         アーキテクチャ  バージョン              リポジトリー   容量
================================================================================
インストールしています:
 libmcrypt          x86_64          2.5.8-9.el6             epel           96 k

(中略)
パッケージをダウンロードしています:
libmcrypt-2.5.8-9.el6.x86_64.rpm                         |  96 kB     00:00     
警告: rpmts_HdrFromFdno: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Importing GPG key 0x0608B895:
 Userid : EPEL (6) <epel@fedoraproject.org>
 Package: epel-release-6-8.noarch (@extras)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
(中略)
インストール:
  libmcrypt.x86_64 0:2.5.8-9.el6                                                

完了しました!

それからphp-mcryptをインストールする。今度はエラーとならずに完了。同時にphp自体も5.5.21から5.5.22にアップデートされた。
#PHP5.5のインストールは実は先週行ったので、1週間の間に新しいバージョンが出たようだ。
libmcryptのインストール時の警告は気になるが、とりあえずこの状態からlarabelのインストールを目指そう。

# yum --enablerepo=remi --enablerepo=remi-php55 install php-mcrypt
(中略)
依存性を解決しました

================================================================================
 パッケージ        アーキテクチャ
                                バージョン               リポジトリー      容量
================================================================================
インストールしています:
 php-mcrypt        x86_64       5.5.22-1.el6.remi        remi-php55        43 k
依存性関連での更新をします。:
 php               x86_64       5.5.22-1.el6.remi        remi-php55       2.6 M
 php-cli           x86_64       5.5.22-1.el6.remi        remi-php55       3.7 M
 php-common        x86_64       5.5.22-1.el6.remi        remi-php55       1.0 M
 php-gd            x86_64       5.5.22-1.el6.remi        remi-php55        72 k
 php-pdo           x86_64       5.5.22-1.el6.remi        remi-php55       112 k
 php-process       x86_64       5.5.22-1.el6.remi        remi-php55        57 k
 php-xml           x86_64       5.5.22-1.el6.remi        remi-php55       208 k
(中略)
インストール:
  php-mcrypt.x86_64 0:5.5.22-1.el6.remi                                         

依存性を更新しました:
  php.x86_64 0:5.5.22-1.el6.remi         php-cli.x86_64 0:5.5.22-1.el6.remi     
  php-common.x86_64 0:5.5.22-1.el6.remi  php-gd.x86_64 0:5.5.22-1.el6.remi      
  php-pdo.x86_64 0:5.5.22-1.el6.remi     php-process.x86_64 0:5.5.22-1.el6.remi 
  php-xml.x86_64 0:5.5.22-1.el6.remi    

完了しました!

2015/05/07追記
Laravelにはphp-mbstringも必要だった。php-mbstringをインストールしたときの記事は以下。
Laravelのインストール

参考ページ:
CentOS6.x - CentOS6.6に php5.5をインストールしてみる。 - Qiita
【CentOS, PHP】CentOSへのPHP5.5, MySQL5.6環境の構築 - Qiita
CentOS 6.5 にphp5.5とMySQL5.6をyumでインストールする - Qiita
CentOS6.5にPHP5.5をインストールする - inari blog (@inari111)
CentOS 6.6 LAMPサーバ インストールメモ【CentOS6.6+Apache+MySQL+PHP】 | あぱーブログ
Laravel - The PHP Framework For Web Artisans
CentOSでlibmcryptをインストール | Me-ISM

February 15, 2015

[CentOS 6.6]PHP5.5のインストール準備(EPEL、REMIリポジトリの追加)

関連記事:
[CentOS 6.6]PHPのインストール

仕事でLaravelを使うことがあるかもなーって感じになってきた。で、ちょっと試してみようかなと思ったが、Laravel4 は PHP 5.4 以降が必要。先日、VirtualBox上のCentOS 6.6 にPHPをインストールしたが、バージョン5.3だ。
なので、VirtualBox のスナップショットで "PHP サポート" インストール前の状態に戻してPHP5.5をインストールすることにした。なぜ5.4じゃなくて5.5かというと、ググッてインストールに関する情報を調べたら5.4より5.5の方が多かったから。

ソースからコンパイルは面倒そうなのでyumを使ってインストールしたいのだが、標準のリポジトリにはPHP5.5はない。
PHP5.5のインストールでいるようにするには、EPELとremiというサードパーディのリポジトリを使えるようにしないといけないらしい。
まず、とりあえずで yum の upgrde と update をしておいた。必要かどうかわからないが。

EPELは以下のようにyumコマンドで簡単にできた。

# yum install epel-release

ただ、このままだと常時EPELリポジトリを利用することになる。なのでEPELリポジトリの設定ファイル /etc/yum.repos.d/epel.repo の "[epel]" のenabledを以下のように "1" から "0" に修正する。
この修正を行えば"--enablerepo=リポジトリ名" とオプションで指定したときだけそのリポジトリが利用可能になる。

[epel]
…(中略)
enabled=0
…(以下略)

remiリポジトリはrpmコマンドでインストールした。まずGPGキーのインポート。これはremiリポジトリからrpmファイルをダウンロードした時に、ファイルの正当性をチェックするためのものだろうか?
「yumにリポジトリを追加する方法」をググって見ると "rpm -i" については多くの記事があるが、GPGキーのインポートについては書いてあったり、なかったり。必ず必要な作業かどうか良くわからなかったが、とりあえずやっておいた。

rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

それからリポジトリのインストール?「リポジトリのインストール」というのは変な気がする。リポジトリの設定ファイル /etc/yum.repos.d/remi.repo のインストールだろうか。 指定した "remi-release-6.rpm" の6というのはCentOS 6 の6っぽい。CentOS 7 だと remi-release-7.rpm になるんだろか。

rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

これでEPELとremiの追加完了。PHP5.5のインストールの準備完了。

参考ページ:
CentOS6.6 64bitのyumリポジトリにEPELを追加 | kakiro-web カキローウェブ
Yum - EPEL/REMIリポジトリを追加(CentOS) - Qiita
CentOS6でRPMforge、Remi、EPELをyumレポジトリに追加する方法 - DQNEO起業日記
【メモ】EPELリポジトリをRed Hat Enterprise Linuxで使うには | Pocketstudio.jp log3
CentOS に EPEL リポジトリを追加する | Webセキュリティの小部屋
yum upgradeとyum updateの違いについて勘違いしてた - kanonjiの日記

February 14, 2015

MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編)

関連記事:
MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

大分前にJava+MySQLでAUTO_INCREMENTな列の値をINSERT後に取得する方法について記事を書いた。
今、仕事はPHPばかりなので、PHPでのやり方についてメモ。

列idがPKでAUTO_INCREMENTだとして、以下のようなidの指定を省略したINSERT文を実行する。

INSERT INTO test_tbl_01 (name) VALUES ('テスト名前')

これにより作成されたレコードのidを取得する。
最初はINSERTの直後に LAST_INSERT_ID() を使って

SELECT LAST_INSERT_ID() AS last_id

を実行していた。しかし、やりたいのはINSERTだけなのにSQLを2回発行するのは面倒くさい。
他の方法がないか調べるとPDOクラスの lastInsertId() というメソッドがを見つけた。
サンプルコードは以下。Windows7+Apache2.2+PHP5.3.29で動作を確認した。

$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8';
$username = 'username';
$password = 'password';

// PHP5.3.6より前
//$options = array(
//	PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
//); 

try {
	$db = new PDO($dsn, $username, $password);
//	$db = new PDO($dsn, $username, $password, $options);	// PHP5.3.6より前
	
//	$db->beginTransaction();	// トランザクション開始
	
	$sql = 'INSERT INTO test_tbl_01 (name) VALUES (?)';
	$stmt = $db->prepare($sql);
	
	$stmt->execute(array('テスト氏名'));
	
	$last_id = $db->lastInsertId();
	print("id={$last_id}\n");
	
//	$db->commit();	// トランザクション終了
	
} catch (PDOException $e) {
	exit('DBエラー:' . $e->getMessage());
}

トランザクション内で使わなければならないということを書いてあるサイトもあったが、オートコミットモードでも問題なく使用できた。

参考ページ:
PHP: PDO_MYSQL DSN - Manual
PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM - Qiita
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PHP: PDO::lastInsertId - Manual
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PDOを利用して、last insert idを取得する -でじうぃき

February 12, 2015

MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く

MySQLではTIMESTAMP型の列にNULL制約かNOT NULL制約を付けないと自動的にNOT NULL制約が付く。これには驚いた。どういう理由でこういうことになってるんだろう。
例えば、以下のようなテーブルを作る。

CREATE TABLE tbl1 (
  id INT,
  dt1 TIMESTAMP,
  dt2 TIMESTAMP
)
ENGINE=InnoDB

そして以下のINSERT文を実行する。

INSERT INTO tbl1 (id) VALUES (1)

そうすると作成されたレコードのdt1,dt2はともにNULLだろうと、MySQL初心者の自分は思った。
しかし実際、そのレコードは以下のようになっている。入れた覚えのない値がdt1、dt2に入っている。

iddt1dt2
12015-02-12 22:47:320000-00-00 00:00:00

"SHOW CREATE TABLE tbl1" としてみると、結果は以下のようになる。

CREATE TABLE `tbl1` (
   `id` int(11) DEFAULT NULL,
   `dt1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `dt2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

dt1、dt2ともにNOT NULL制約が付いていて、さらにdt1はCURRENT_TIMESTAMP、dt2には意味不明なデフォルト値が設定される。
これは親切のつもりなんだろうか?BIGなお世話だ。それとも正当な理由があるんだろうか?そもそもdt2のデフォルト値の"0000-00-00"ってなんだ?西暦は1年から、元号も元年(1年)からで、「0年0月0日」なんて聞いたことがない。

MySQLではTIMESTAMP型の列ではNULLを許す場合、次のように明示的にNULL制約(?)を書いてやらないといけないようだ。そうでないと、上記のように勝手にNOT NULL制約とデフォルト値が付けられる。

CREATE TABLE tbl1 (
  id INT,
  dt1 TIMESTAMP NULL,
  dt2 TIMESTAMP NULL
)
ENGINE=InnoDB;

"SHOW CREATE TABLE tbl1" の結果は以下のようになる。

CREATE TABLE `tbl1` (
   `id` int(11) DEFAULT NULL,
   `dt1` timestamp NULL DEFAULT NULL,
   `dt2` timestamp NULL DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

参考ページ:
SQLのTIMESTAMP型と日付「0000-00-00」 - ディノオープンラボラトリ

February 11, 2015

MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする

MySQL Workbench でテーブルで TRUNCATE TABLE を実行したら、エラーになった。
原因はMySQLのクライアントがsafe updateモードという状態で、その状態ではWHEREやLIMITで制限をしていないDALETE文やUPDATE文、それにTRUNCATE TABLEは実行できないようになっているらしい。間違ってデータを全削除したり全更新するのを防ぐためだろうか。間違って全更新ならやったことあるなあ^^;
TRUNCATE TABLEできるようにするには、システム変数sql_safe_updatesを以下のようにして0にセットすればよい。

SET SQL_SAFE_UPDATES = 0;

現在、safe updateモードかどうかは以下のどちらかで調べられる。
SELECTの方は0か1、SHOWの方はONかOFFと表示される。

SELECT @@sql_safe_updates;
SHOW VARIABLES LIKE 'sql_safe_updates';

参考ページ:
MySQL Workbench でデータベースに接続してみる | セルティスラボ
MySQL ワークベンチで、TRUNCATE TABLE が失敗する-Oboe吹きプログラマの黙示録
MysqlWorkbenchでエラー(TRUNCATEとか)の対処|システム屋さんって何やねん!!
MySQL4.1/9.MySQLの実験/1.システム変数の参照と変更 - Ground-SunLight
田舎暮らしプログラマの技術メモ [MySQL] システム変数を表示する
mysql - How to check if sql_safe_updates is on? - Stack Overflow

February 08, 2015

MySQLメモ017:CREATE文、AUTO_INCREMENT、ENGINE

関連記事:
MySQLメモ004:テーブルの作成:
MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

MySQLについては前に少し勉強したが、ほとんど忘れてしまった。
既存のシステムでMySQLを使っているものは触ったことはあるが、新規の開発でMySQLというのは初めてなので、色々メモ。

テーブルの主キーのカラムには、PostgreSQLの場合はシーケンスを用意してそこから値を取っていた。しかしMySQLにはシーケンスがない。
MySQLではカラムにAUTO_INCREMENT制約を付けてシーケンスの代わりにする。これでINSERT時に値を指定しなくても自動的に値がセットされる。初期値は1でINSERTするたびに自動的にインクリメントされる。
テーブル作成時のストレージエンジンの指定に "TYPE" を使っているものがあるが、現在は "ENGINE" が推奨されている。
CREATE TABLE文の例は以下。

CREATE TABLE test_tbl_01 (
  id INT AUTO_INCREMENT,
  name VARCHAR(20),
  mail VARCHAR(40),
  PRIMARY KEY(id)
)
ENGINE=InnoDB;

このテーブルにINSERT2回行って、SELECTする。

INSERT INTO test_tbl_01 (name) VALUES ('テスト一郎');
INSERT INTO test_tbl_01 (name, mail) VALUES ('テスト二郎', 'test.jiro@test.jp');
SELECT * FROM test_tbl_01;

SELECTの結果は以下のようになる。idには最初に1,2と連続した値が入る。

idnamemail
1テスト一郎
2テスト二郎test.jiro@test.jp

AUTO_INCREMENTの値は ALTER TABLE 文で設定できる。
また、TRUNCATE TABLEすると値はリセットされる。

参考ページ:
MySQLのauto_incrementについてメモ | Siguniang's Blog
AUTO_INCREMENTの値をリセットする方法【MySQL】 - Programming Magic select last_insert_id() - MySQL初心者日記 - MySQLグループ
ストレージエンジンの設定(ENGINE) - テーブルの作成 - MySQLの使い方

February 04, 2015

列の値を使って日時に「+n日」する

テーブルtblにtimestamp型の列dtと文字列型の列nがある。nは文字列型だけど入ってる値は"1"とか"12"のような数字のみからなる文字列。
nの値を使って「dt+n日」という計算をしたい。例えばdtの値が "2015-01-01 12:30:45" でnの値が "3" ならば
"2015-01-01 12:30:45"+3日で "2015-01-04 12:30:45" という結果が欲しい。
最初、以下のようにしたが構文エラーになった。

SELECT dt + interval (n || ' days') FROM tbl

次のようにしたら欲しい結果が得られた。

SELECT dt + CAST(n || ' days' AS interval) FROM tbl

もしnが整数型ならこうかな。

SELECT dt + CAST(TO_CHAR(n, 'FM9999') || ' days' AS interval) FROM tbl

参考ページ:
Postgresでの時間加算select current_timestamp + interval '1 hours';... - Yahoo!知恵袋

February 03, 2015

certutilでBASE64エンコード/デコード

とある事情でバイナリファイルをbase64エンコードしてテキストファイルに保存するという作業を日常的にしている。
今まではファイルをLinuxに持っていって base64 コマンドを使っていた。
しかし、Windowsのコマンドプロンプトでもできることを知った。超便利。
certutilコマンドの本来の目的は「証明機関(CA)の構成/管理」らしいが、よくわからん。わかっているのは以下の使い方だけ。

certutil -f -encode <エンコードするファイル> <エンコード結果のファイル>
certutil -f -decode <デコードするファイル> <デコード結果のファイル>

以上。

参考ページ:
Windowsでbase64エンコード・デコードする方法 - Eiji James Yoshidaの記録
Windowsコマンド集 - certutil:ITpro

February 02, 2015

AWS SDK for PHP を使ってObject Storageにアクセスする

Object Storage はAmazon S3互換のストレージサービスで、REST APIを使ってファイルをやり取りする。
NTTコミュニケーションズ、IDCフロンティアなどがサービスを提供している。Niftyもやってるっけ?
S3互換ということでAmazonが提供する AWS SDK も使えるんじゃないかと思ってやってみたら、すんなりできた。
以下、動くものではないけど、こんな感じというサンプルコード。
実際に試したのは去年の夏だか秋だかで、バージョンは2.6.16を使っていた。現在の2.7.xが出ているようだが、それは試していない。

ファイルのダウンロード

// SDKの読み込み
require_once <AWS SDK for PHPのパス>;

// 名前空間のインポート
use Aws\S3\S3Client;

$s3 = S3Client::factory(
	array(
		'key'     => <Object StorageのアクセスキーID>
		'secret'  => <Object Storageの秘密鍵>,
		'base_url'=> <Object StorageのエンドポイントのURL>
	)
);
	
try {
	$result = $s3->getObject(
		array(
			'Bucket' => $bucket,
			'Key' => $key
		)
	);
	
	// 適当なファイル名を付けてクライアントで保存してもらうようにする
	header('Content-Type: application/octet-stream');
	$filename = strftime('%Y%m%d%H%M%S') . '.dat';
	header("Content-Disposition: attachment; filename={$filename}");
	print($result['Body']);
	
} catch (Exception $e) {
	echo $e->getMessage();
}

ファイルのアップロード

// SDKの読み込み
require_once <AWS SDK for PHPのパス>;

// 名前空間のインポート
use Aws\S3\S3Client;

// S3オブジェクトの作成
$s3 = S3Client::factory(
	array(
		'key' => <Object StorageのアクセスキーID>
		'secret' => <Object Storageの秘密鍵>,
		'base_url'=> <Object StorageのエンドポイントのURL>
	)
);

try {
	// ファイルのアップロード
	$result = $s3->putObject(
		array(
			'Bucket'       => <バケット名>,
			'Key'          => <ファイル名>,
			'SourceFile'   => <アップロードするファイルのパス>,
			'ContentType'  => <アップロードするファイルのMIMEタイプ>
		)
	);
	
} catch (Exception $e) {
	echo $e->getMessage();
}

ファイルの削除

// SDKの読み込み
require_once <AWS SDK for PHPのパス>;

// 名前空間のインポート
use Aws\S3\S3Client;

// S3オブジェクトの作成
$s3 = S3Client::factory(
	array(
		'key' => <Object StorageのアクセスキーID>
		'secret' => <Object Storageの秘密鍵>,
		'base_url'=> <Object StorageのエンドポイントのURL>
	)
);

try {
	// ファイルの削除
	$result = $s3->deleteObject(
		array(
			'Bucket'       => <バケット名>,
			'Key'          => <ファイル名>
		)
	);
	
} catch (Exception $e) {
	echo $e->getMessage();
}

« January 2015 | Main | March 2015 »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof