月: 2012年10月

PHPプログラム内でPOSTを飛ばしたらContent-type not specified assuming application/x-www-form-urlencoded

PHPのプログラム内からPOSTでリクエストを飛ばしたときに
出たエラーのメモ。

■エラーが出た状態

$url='http://wwww.example.com/xxxx.php';
$data=array(
    'data1' => 'xxxxxxxx',
    'data2' => 'yyyyyyyy'
);

$options = array(
    'http' => array(
        'method' => 'POST',
        'content' => http_build_query($data)
    )
);
$contents = file_get_contents($url, false, stream_context_create($options));

■発生したエラー

Severity: Notice –> file_get_contents() [function.file-get-contents]: Content-type not specified assuming application/x-www-form-urlencoded xxxxxxxxx.php 80

headerを追加して対応。

■修正版

$url='http://wwww.example.com/xxxx.php';
$data=array(
    'data1' => 'xxxxxxxx',
    'data2' => 'yyyyyyyy'
);

$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: '.strlen(http_build_query($data))
        );

$options = array(
    'http' => array(
        'method' => 'POST',
        'content' => http_build_query($data),
        'header' => implode("\r\n", $headers),
    )
);
$contents = file_get_contents($url, false, stream_context_create($options));

■参考URL

とても簡単にPHPからPOSTリクエストを送信する方法【PHP】

[PHPエラー] Content-type not specified assuming application/x-www-form-urlencoded の対処法

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする設定を
していたけど、すっかり忘れていたのでメモ。

ホストはCentOS6.2

■大体の構成

ホストサーバにOpenVZをいれて複数のゲストサーバ
を立てて社内の開発環境を構築していて、ゲスト側
で社内の他のNASにアクセスできるように設定を行っている。
主にホストの「/etc/fstab」と「/etc/rc.d/rc.local」で
実現している。

「/etc/rc.d/rc.local」とは起動プロセスの最後に実行されるシェルスクリプトのこと。

今回はこれが思い出せなかった・・・。

■そもそもなんでそんなことになったのか。

OpenVZを使ってゲスト側で直接NAS(TeraStasion)を
マウントしようとしてもcifsのエラーが出てmount
出来なかった。

■回避方法

ホスト側で起動時にマウントを行うようにし、
マウントしてOpenVZが起動し終わったあとに
/etc/rc.d/rc.local
で各ゲストにbindするように設定してみた。

■ホスト側の/etc/fstabサンプル

#
# /etc/fstab
# Created by anaconda on Thu Mar 15 05:40:21 2012
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=2f2b3876-c89f-49b9-896b-4436a2cf4199 /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0

# mount1
192.168.1.xx:/mnt/array1/folder1 /mnt/mout_folder1 nfs rsize=8192,wsize=8192,nolock,hard,intr 0 0
# mount2
192.168.1.xx:/mnt/array1/folder2 /mnt/mout_folder2 nfs rsize=8192,wsize=8192,hard,intr 0 0

「mnt/array1」とかなっているマウントしたい対象のNASは
今回のケースではBuffaloのTeraStation。
TeraStationはNFSの機能が付いていたのでNFSフォルダーと
NFSクライアント設定を事前に作成しておいた。

■ホスト側の/etc/rc.d/rc.localサンプル

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
#bind
mount --bind /mnt/mout_folder1 /home/vz/root/180/var/www/html/clients
以下続く・・・。

上記はホストでマウントしたフォルダをホスト上にあるOpenVZのゲストのフォルダにbindしている。
これで結果的にゲスト側でもマウントしているような状態でファイルが操作できる。
mount –bindはマウントしたファイルシステムの一部を別のディレクトリにマウントし直すと
いうシンボリック的な役割をしてくれる。

 

こうやって書いてみると面倒な仕組みになってるなー。
他にやり方ないのかな?

 

特定のファイル(URL)を除いたindex.htmlの有り、無しの統一

特定のファイル(URL)を除いたindex.htmlの有り、無しの統一

mod_rewriteは何度調べても全然覚えられません。。

SEO関連で調整するよう言われたので調査。
index.htmlの有り、無しの統一というありがちな話。
こんな感じ。
hogehoge/index.htmlをhogehoge/にする。

ただ今回は特定のファイル(URL)の場合を除くという指令。

サンプルフォルダ構成

— base
|– a
| `– index.html
|– b
| `– index.html
|– c
| |– cc
| | `– index.html
| `– index.html
`– index.html

.htaccessの記述

RewriteEngine on
RewriteCond %{THE_REQUEST} !^.*/b/index.html
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.com/base/$1 [R=301,L]

この場合
http://example.com/base/b/index.html
だけindex.htmlが書き換えられない。

RewriteCondは連続して書くとANDになるから。
ORでつなげたい場合は[OR]をつける
RewriteCondの条件で大文字小文字を区別しない場合は[NC]をつける

■RewireRuleの書式
RewriteRule Pattern Substitution [flags]
くわしくはこちら

■flagsの種類

  • redirect|R [=code] (強制 redirect)
  • forbidden|F (URL を強制的に forbidden(禁止)にする)
  • gone|G (URL を強制的に gone(消去済み)にする)
  • proxy|P (強制 proxy)
  • last|L (last(最後の)ルール)
  • next|N (next(次の)一周)
  • chain|C (次のルールにchained (チェイン))
  • type|T=MIME-type (MIME type の強制指定)
  • nosubreq|NS (内部の sub-request が no (ない) 時のみ 使われる)
  • nocase|NC (no case)
  • qsappend|QSA (query string append)
  • noescape|NE (no URI escaping of output)
  • passthrough|PT (pass through to next handler)
  • skip|S=数字 (skip next rule(s))
  • env|E=VAR:VAL (set environment variable)

参考サイト

楽:技林ブログ>mod_rewrite サンプル集

技林TOP > 自宅サーバ構築メモ > mod_rewrite

index.html「あり・なし」のURL正規化 – 301リダイレクト応用編

A Users Guide to URL Rewriting with the Apache Webserver

mod_rewrite モジュール URL 書き換えエンジン

超音波ネズミ駆除器~その後の効果~

2007年の年末に友人からねずみ退治にいい方法がないかと相談され、
超音波ネズミ駆除器 「ペストコントロ」を紹介してみたんだけれど最近その
効果について聞く機会があったので報告。

効果はものすごくあったようで、設置以来まったくネズミが出なくなったらしい。
ただし最初は装置の近くでは「ミュイーン、ミュイーン」という音が少し聞こえたらしい。
そのうち慣れてすごく意識しないと聞こえないようになったということ。
※これは人によるみたい。

設置したのは屋根裏に1つ。それで2階建ての家全体に効果があったらしい。

「ペストコントロ」を設置するまではかごで捕獲したり、そこそこ投資していた
らしい。かごで捕獲した場合はその後の処理に困ったりしていたらしいので、
そもそも姿が見えなくなったのがとっても素敵だと。

調べて教えてあげただけだけど効果絶大でいいことした気分!

PHPでセッションの有効期限を延ばす設定

セッションの寿命を延ばす

クッキーに有効期限を設定できる場合はこれが簡単。
主に徳丸本より。

PHPの場合

session_set_cookie_params関数でセッションIDを保持するクッキーの有効期限を設定する。
php.iniもしくは.htaccess等でsession.gc_maxlifetime設定の時間を延ばす。
session.gc_maxlifetimeはデフォルトで1440秒(24分)に設定されている。

php.iniで有効期限を最低3時間にする例

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 10800

【参考サイト】

【PHP】セッションタイムアウトの時間を設定する

セッション(session)の有効期限を設定するには

セッションのガーベッジコレクションをテストする

PHP のセッション寿命の設定

session_set_cookie_params関数

session_get_cookie_params関数

session.gc_maxlifetime

session.gc_probability

session.gc_divisor

HEADのラケット購入

 

HEADのラケットが欲しいけど、「PRO」とか「MP」とかOSとかの
違いがわからなかったので調べてみたらいいサイトがあった。

HEADテニスラケット早見表

大体こんなラインナップでProから段々ウェイトが軽くなったり、
フェイス、フレーム厚が変わっていくらしい。

  • Pro
  • Mid
  • MP16×19
  • MP18×20
  • 300
  • OS
  • Elite
  • Lite

今回はネットの口コミとかいろいろ参考にして
ユーテック IG エクストリーム MPを購入。

ストリングはGOSEN エッグパワー 17 ブラックを55ポンドで。

これでレジャー用ラケットから卒業だ!

参考サイト

みんなで作る『テニスラケットデータベース』
試打コミ! - みんなの・テニス口コミ・コミュニティ -

 

効率的なWebアプリケーションの作り方のメモ


最近「効率的なWebアプリケーションの作り方」読んで写経してます。
目次

■Part1 MVC開発の基礎知識

  • 1章 MVC開発の概要
  • 2章 オブジェクト指向

■Part2 フレームワークを利用する利点

  • 3章 レガシーコードの欠点
  • 4章 リファクタリング・デザインパターン実践
  • 5章 フレームワークを活用する

■Part3 モダンPHP Webアプリケーション開発

  • 6章 アプリケーション開発を始めるための準備
  • 7章 データベースとエンティティ
  • 8章 コントローラとビュー
  • 9章 フォームとデータベース

■Part4 機能の作成と実装のパターン化

  • 10章 ユーザ登録
  • 11章 イテレーション
  • 12章 管理画面
  • 13章 コマンドラインスクリプト
  • 14章 ユニットテスト
  • 15章 機能テスト

Part1、Part2はオブジェクト指向、フレームワークに関することがすごく
コンパクトにまとめられててとってもいいと思った。

ここにまとめられていることはオブジェクト指向の分厚い本で出てくる内容なので
先にこの本で概要を見てから分厚い本に取り組めばより理解しやすいんじゃないかなと思う。
普通のPHPの本では触れられていないところが記載されている感じ。

Part3からはSymfony2を使っての開発を一通り行う構成。
この本が出た当初のSymfonyのバージョンは2.0.11だけど9月に2.1.2が
出てるので公式サイトからそのまま落とすと設定ファイルの内容が違ったりして
テンパる。
本に沿って写経するなら公式サイトから2.0.17のstandardをダウンロードする。

Download

そのほかにPart3を現在写経するにあたって問題がありそうなのは、
7章のデータフィクスチャのところ。
本に記述してあるやり方では入らなかったので公式サイトに書いてある
やり方で設定する必要がある。
DoctrineFixturesBundle
このページでも2.0バージョンを選択しないとやり方が違うので注意。

あとは8章のViewを作っていくところで、サンプルのソースコードを
そのまま入力するとまだ読み込んでいないパラメータとかを使っていて
エラーがでるので、画面のエラーメッセージを見つつ修正していく必要があった。

あとは技術評論社のサポートページからサンプルソースを落として
見比べながらやっていけばOK。

ほかの書評記事でも書いている通り初心者がSymfony2を覚えるための本では
ないなーという感じ。
PHPでDDDで組むための参考にはちょうどいいと感じた。

まだ習得できてないけどね。

LPI Level1 の記録

先日取得したLPI Level1の記録。

出題範囲が2年前に買ったLPIC レベル1の本の範囲と変わるということで
勿体無いのと、なんか資格欲しいかもと思ったので受験。
LPI Level1 Exam 101 670点
LPI Level1 Exam 102 630点

試験範囲が変わる直前にLPI Level1 取得。

勉強は小豆本のRelease3.0対応本と

Ping-tで勉強。全部金にするまでやって、コマ問までやった。
とりあえず上記のことをすれば普通に合格できると思う。

ただ、満点取るのは難しいとおもう。
実際に見たことも無い問題が少し出題されて焦った。。

勉強してみてLevel1はLinuxに慣れるという意味では結構
いいんじゃないかなと思った。
でも実際のサーバの設定系はLevel2からなので実務に関係する
のはLevel2以降なんだなと。

今からLevel1の取得を目指す人は出題範囲が変わったので

↑こっちを買わないといけないので注意。

次はLevel2を目指します。年内に取れたらいいな。
とりあえずRelease3.5対応の小豆本が発売されるの待ってます。

LPI Level3の取得までが目標。