2010年3月4日木曜日
移転

はてなダイアリーに移転することにしました。
http://d.hatena.ne.jp/u87/

コードとか見やすくなると思います。
ここの記事はまとめなおしたりして、むこうにも書く予定。

おせわになりました。



0 コメント | コメントを書く | コメントの表示
2010年3月2日火曜日
地図の中央に常に十字マークを表示する - Google Maps API v3

元ネタはここ↓
4-2:地図の中心に常に『十字マーク』を表示する - Google Maps 活用講座
でもここはversion 2なので、version 3向けに改造する必要がある。

と言ってもそう難しいものではなく、地図が移動したら十字マークを描画すると読み替えれば簡単です。
4-2:地図の中心に常に『十字マーク』を表示する - Google Maps 活用講座


こう書いてあるとおり、画像をマーカーに使って、移動するたびにその画像を地図中央に移動させている。
ただversion 3だとmapイベントにmoveがない。

Google Maps API version 3 リファレンス (Google Maps API Version3 日本語ドキュメント(非公式))
リファレンスを確認すると、dragがそれのようだ。

画像はそのままパクらせて頂きました。
まずはマーカーに使う画像の情報を定義します。
var image = new google.maps.MarkerImage(
'images/center.gif'
, new google.maps.Size(39, 39)
, new google.maps.Point(0,0)
, new google.maps.Point(19,19)
);

細かなプロパティはリファレンスを参照していただくとして、簡単に説明。
まずはURLを指定。相対で大丈夫らしい。
続くsizeはその画像のサイズ。
次はその画像の表示開始座標であるorigin。version 3では大きなサイズの画像も使用できるようになっている。なので、複数のアイコンをつなげた大きな画像を用意して、その画像のどこから開始するのかを記載する。これと上の画像サイズの指定で見せたい箇所を指定することができる。
anchorが判りにくくて困った。
表示する際に開始地点(指定された緯度経度)をどこにするか、ということだと解釈した。
デフォルトでは、アンカーはイメージの下辺 - 中央(幅 / 2, 高さ の座標値)。つまりマーカーは指定された LatLng の位置に配置されたときは、アンカーの定義されたピクセル値は指定されたLatLngの位置です。
Google Maps API version 3 リファレンス (Google Maps API Version3 日本語ドキュメント(非公式))

デフォルトのマーカーは画像の下辺の中央がその地点であることを考えると、そうなのかな?って。
なので、画像の中央をその地点にしたいのであれば、XもYもサイズの半分を指定すればいいということだと思ったけど(伝わる?)。

これでプロパティの設定が完了。
次にマーカー…というか、画像マーカーを設定する。
var centerIcon = new google.maps.Marker({
icon: image
});

とりあえずfunctionの外側に書いた。

でもってonload=""で読み込んでる初期化関数で、地図上にマークしてやる。
centerIcon.setMap(map);
centerIcon.setPosition(myLatLng);

setMap()とsetPosistion()はnewの中でやってもいいかな?
var centerIcon = new google.maps.Marker({
icon: image
, map: map
, position: myLatLng;
});


これでとりあえず中央に表示されるようになる。
まだイベントを追加してないので、最初に設定した場所から移動してくれない。


dragイベントを追加してやる。
google.maps.event.addListener(map, 'drag', function() {
drawMarker(map.getCenter());
});

ちなみにイベント処理後にも同じようにdrawMarker()を追加しないと、ドラッグが発生するまでマーカーを表示してくれない。

で、drawMarker()はこれだけ。
function drawMarker(centerLocation){
centerIcon.setPosition(centerLocation);
}

地図の中央を引数にして、その場所に移動させてやる。



…がしかし!

なんだろう、この重さは。


ドラッグしても一瞬、地図についていっちゃうのね。
メモリがグルグルしてるので、恐らく処理的に思いのかもしれない。
ソースを最適化してやる必要があるのかな?
JavaScriptはよー判らん。



0 コメント | コメントを書く | コメントの表示
ひとりごと

元々別にブログを持っていたが、他の記事との兼ね合いでプログラミングやサーバ関連をここに持ってきた。
それはそれでいいんだけど、日本のブログサービスと比較すると、やっぱり不親切に感じることが多いbloggerである。それが放置してきた一因でもあるんだけど。

移転しようかなぁ?

ブックマークだけ使ってるはてなあたりに。



0 コメント | コメントを書く | コメントの表示
2010年3月1日月曜日
緯度経度から住所を取得してみる - Google Maps API v3

緯度経度から住所を取得する

サンプルはここにある。
http://code.google.com/intl/ja/apis/maps/documentation/v3/services.html#ReverseGeocoding

まずはGoogle Maps APIにおける、Geocoderのリクエスト方法から。
下記URLを見ると、プロパティの一覧がある。
GeocoderRequest
Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code

住所や郵便番号から検索する場合は、addressプロパティに住所か郵便番号を入れてやる。
緯度経度から検索する場合は、latLngに緯度経度を入れてやる。

レスポンスは以下。

GeocoderResponse
Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code


formatted_addressというのが、例えば「日本,愛知県名古屋市○○区○○N丁目NNN」のような形式の文字列。

テストは、クリックした箇所を地図の中心にしてマーカーを置くサンプルを下にしました。
http://code.google.com/intl/ja/apis/maps/documentation/v3/examples/event-arguments.html
クリックした箇所の緯度経度はイベントオブジェクトから簡単に取得できるので、そいつをGeocoderに入れてやるようにソースを修正すればいい。

ソースのイメージはこんなふう。

var geocoder = new google.maps.Geocoder();
geocoder.geocode({latLng: location}, function(results, status){
if(status == google.maps.GeocoderStatus.OK){
// 正常に処理ができた場合
} else {
// エラーの場合
}
});


レスポンスである配列resultsの構成はこうなっている。
{types[]: String,
formatted_address: String,
address_components[]: {
short_name: String,
long_name: String,
types[]: String
},
geometry: {
location: LatLng,
location_type: GeocoderLocationType,
viewport: LatLngBounds,
bounds: LatLngBounds?
}
}


まずはresults[].formatted_addressを表示してみる。

名古屋パルコの西館はこういうふうに取得できた
[0]日本, 愛知県名古屋市中区栄3丁目29?1
[1]〒460-8681
[2]〒460-8406
[3]〒460-8430
[4]〒460-8432
[5]〒460-8791
[6]日本, 愛知県名古屋市中区栄3丁目29
[7]日本, 愛知県名古屋市中区栄3丁目
[8]日本, 愛知県名古屋市中区栄
[9]日本, 愛知県名古屋市中区

※ただしクリックする箇所によって番地や郵便番号(の並び)は微妙に異なる。

名古屋パルコといえば、対になるのはナディアパークだよな?ってことでナディアパークはこちら。

[0]日本, 伊勢町通り
[1]〒460-8434
[2]〒460-8435
[3]〒460-8678
[4]〒460-8685
[5]〒460-8433
[6]〒460-8444
[7]〒460-8432
[8]〒460-8674
[9]〒460-8688


住所じゃなくて、通りの名前と郵便番号が取得できた。

名古屋ってことで、市役所はどうかと思って、調べてみると…

[0]〒460-8508
[1]〒460-8501
[2]〒460-8534
[3]〒460-8520
[4]〒460-8522
[5]〒460-8521
[6]〒460-8528
[7]〒460-8513
[8]〒460-8507
[9]〒460-8514

※これもクリックする箇所によって郵便番号の並びが変わったり、「日本,大津通」が出てくる。

こちらも郵便番号。
どういう違いがあるのだろう?

今度はresults[].address_components[]を確認する。
これにはshort_name、long_name、types[]の三つがあるので、それぞれ表示させる。
面倒なのでresults[0]だけを対象にする。

名古屋パルコ(西館)
---------------
[0]short name : 1
[0]long name : 1
[0]types[0] : sublocality
[0]types[1] : political
---------------
[1]short name : 29
[1]long name : 29
[1]types[0] : sublocality
[1]types[1] : political
---------------
[2]short name : 3丁目
[2]long name : 3丁目
[2]types[0] : sublocality
[2]types[1] : political
---------------
[3]short name : 栄
[3]long name : 栄
[3]types[0] : sublocality
[3]types[1] : political
---------------
[4]short name : 中区
[4]long name : 中区
[4]types[0] : locality
[4]types[1] : political
---------------
[5]short name : 名古屋市
[5]long name : 名古屋市
[5]types[0] : locality
[5]types[1] : political
---------------
[6]short name : 愛知県
[6]long name : 愛知県
[6]types[0] : administrative_area_level_1
[6]types[1] : political
---------------
[7]short name : JP
[7]long name : 日本
[7]types[0] : country
[7]types[1] : political
---------------

※勿論住所が短ければ、配列の数も少なくなる。
「愛知県名古屋市X区XXXN丁目NNN」で終われば、パルコの例よりも配列の要素がひとつ少なくなる。

ナディアパーク
---------------
[0]short name : 伊勢町通り
[0]long name : 伊勢町通り
[0]types[0] : route
---------------
[1]short name : JP
[1]long name : 日本
[1]types[0] : country
[1]types[1] : political
---------------


名古屋市役所
---------------
[0]short name : 460-8508
[0]long name : 460-8508
[0]types[0] : postal_code
---------------
[1]short name : JP
[1]long name : 日本
[1]types[0] : country
[1]types[1] : political
---------------


address_componentsの含まれるshort_nameとlong_nameについて、「日本」か「JP」の違いしかないようなので、日本ではあまり意味はないか。
typesにはその値の種別が入っていると思っていいのかな?
「日本」が「country」で、「愛知県」が「administrative_area_level_1」か。

…とここまで調べてて、日本語のリファレンスにがっちり載ってたことに気づいた。
http://sites.google.com/site/gmapsapi3/Home/services
折角なので、調べたことは残しておくことにする。

それによると、「administrative_area_level_2」「administrative_area_level_3」まであるようだけど、日本じゃ関係ない。

ただ、これらの結果とリファレンスを見る限り、Google Maps APIのGeocoderを使って緯度経度から住所を取るというのは考え物だと思った。
上の例のように、パルコならまだしも、ナディアパークや市役所のようなパターンになった場合、郵便番号だけだったり、近隣の通りの名前しか取れないパターンがあるんじゃ、判断に困るしなぁ。
例えば一つのresults[]にshort_nameかlong_nameが三つ以上であれば、それは(それなりの)住所を取得できていると判断するか?



0 コメント | コメントを書く | コメントの表示
2010年2月26日金曜日
ブラウザの違い

いやはや、ハマった。
とりあえずGoogle Maps API v3のテストをしてて、時間があるのでCSSでテストページの見栄えを整えていたら…

その1 何故か、Google Chromeに値がPOSTされない!

ヴァージョンは4.0.249.89。
IEとFirefoxは問題なかったんだけど、何故かchromeだけ$_POSTが空。
で、フォームの値をalert()してやるとダイアログには値が出てくる。
<html>に「xmlns="http://www.w3.org/1999/xhtml"」が指定してあったんだけど(コピペしてきたヤツを元にしているので。僕だったら入れない)、これを削除したら正常に動いた。
「え? これが原因?」と思って「xmlns」を戻したら、正常に値が送られた。
原因はこれじゃないってこと??
ますます判らん。


その2 FirefoxにはinnerText()が使えない。

知るかよ!ってカンジだ。


それだけ。
忘れないようにメモ(とくにその2ね)。
その1は…なんだったんだろう??



0 コメント | コメントを書く | コメントの表示
ルート表示の困った - Google Maps API v3

指定した地点から、指定した距離(km)離れている施設の検索は出来るようになった。
機能的には不要だが、ルート表示をしてみようと思い、サンプルを参考にやってみた。

http://code.google.com/intl/ja/apis/maps/documentation/v3/examples/directions-simple.html

ただこれ、ルートだけじゃなくて、開始位置とゴールにマーカーを置くんだよね。
検索結果として表示している地図には、既にマーカーが置かれてる。だからいちいちAとBのマーカーが置かれると困るんだ。
まぁ、検索範囲の中央を示す地点には(いまのところ)なにも置いてないのでAのマーカーは我慢しようじゃないか。
しかし、ゴールのBのマーカーはいらん!

解決策はないものか?



0 コメント | コメントを書く | コメントの表示
2010年2月24日水曜日
Google Maps API v3で円を描いてみる

郵便番号(三桁、四桁別々)と半径(キロメートル)を入力して、ボタンを押下すると、地図上に円を描くようにしてみる。
忘れないように、とりあえずfunctionだけ書いておく。
JavaScriptは始めたばかりなので、スマートかどうかは自信がない。

参考にしたのはここ。
Circle Object - Google Maps API V3 Reference - Google Maps JavaScript API V3 - Google Code
Maps API V3 Overlays (Google Maps API Version3 日本語ドキュメント(非公式))

Google Maps API V3 Demo Gallery - Google Maps JavaScript API V3 - Google Code
このページにリンクがはってるこのデモが一番参考になるのかな?
Circle Overlay
Drag the marker to move the circle


入力チェックをしてないので、注意すること。
一応、Version3で検証。

var map;
var circle;
// onloadは割愛
function drawCircle(){
// 我ながら値の取得方法については不細工だなぁと
var zip1 = document.getElementsByName('zip1')[0].value;
var zip2 = document.getElementsByName('zip2')[0].value;
var zipcode = zip1 + "-" + zip2;
// Circle Overlayのサンプルに3000kmを3000000と指定していた
// リファレンスを見たら、単位はメートルだったね
var radi = document.getElementsByName('radi')[0].value * 1000;
// 色の指定はテキトー
var circleColor = "#00AAFF";

// 指定された郵便番号から緯度経度を取得する
var geocoder = new google.maps.Geocoder();
geocoder.geocode({address: zipcode}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
// 地図を移動させる
map.setCenter(results[0].geometry.location);
map.setZoom(10);
// 再描画の場合は、一旦前の円を消す
if(circle){
circle.setMap(null);
}
// 円の設定
circle = new google.maps.Circle({
fillColor: circleColor
, strokeWeight: 1
, radius: radi
, center: results[0].geometry.location
});
// 円の描画
circle.setMap(map);
} else {
alert(zipcode + ' not found');
}
});
}


new Circle()するところで、参考にしたデモのソースが「map: map」とかしてたんで何も考えずにそうやってたら、再描画が上手くいかなかった。

とりあえず指定した郵便番号を中心とした円を描いてくれる。新しく郵便番号を入れて実行すれば前のを消して、新しい円を描いてくれる…はず。



0 コメント | コメントを書く | コメントの表示
2010年2月22日月曜日
version3はこっちか

すぐさま更新!

Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API - Google Code
http://code.google.com/intl/ja/apis/maps/articles/phpsqlsearch_v3.html


version3用はこのページだったね。
HTMLを入れ替えたら動いた。



0 コメント | コメントを書く | コメントの表示
PHPとMySQLで地点検索 - Google Maps API

色々調べてみると、なんか面倒な雰囲気で、さっそく挫折しそう。

Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API - Google Code
http://code.google.com/intl/ja/apis/maps/articles/phpsqlsearch.html


ググってて出てきたのが上のサイト。ま、Googleからの情報ですけど。

PHPとMySQLでっていうのはいいね。
見てみると、緯度経度をそれぞれFLOATで持つんだね。

CREATE TABLE `markers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 60 ) NOT NULL ,
`address` VARCHAR( 80 ) NOT NULL ,
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;


で、ある地点(の緯度経度)から距離を出して、指定した半径(キロメートルorマイル)内のものをピックアップするというSQLがこれ。
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

実際にPHPでやると、こう。
$query = sprintf("SELECT address, name, lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
mysql_real_escape_string($center_lat),
mysql_real_escape_string($center_lng),
mysql_real_escape_string($center_lat),
mysql_real_escape_string($radius));
$result = mysql_query($query);


この場合25マイル未満ってこと。ちなみにキロメートルでやるなら3959を6371に置き換えること。

中心となる地点はJavaScriptで取得して、GETでパラメタを送るようだ。

実際に使う場合は画面遷移も必要だし、POSTするだろうから、随分変更点が出てきそう。
とはいえ、緯度経度をFLOATで持っててもOKなら、SQLiteでもなんとかならんかな?


忘れないように、ここにメモしておこう。


メモだけじゃなく、実際にやってみた。
とりあえずコピペして動くかどうかテスト。

環境はXAMPP Lite Windows版で、version 1.7.1。古いのかどうか判りません。

とりあえずデータベースを付属のphpMyAdminから作成した。当然UTF-8ね。
テーブルも、記事にある通りに作る。GUIで作れるけど、SQL文をコピペして作成。
次はデータのインポート…と思ったけど、CSVファイルをインポート出来ないの? インポートする形式のところに上記サイトで見たようなCSVという項目がない!
困った…と思ったら、INSERT文を羅列したファイルが用意されてた。抜かりないな。

さて、データベースの準備は完了。あとはファイルをコピペして作成するだけ。

データベース情報を格納したphpsqlsearch_dbinfo.php、検索ロジックと検索結果をXMLで吐き出すphpsqlsearch_genxml.php、HTMLファイルのphpsqlsearch_map.htmlの三つ。
さすがにphpsqlsearch_dbinfo.phpだけは環境に合わせて書き換えて、保存。当然UTF-8。

出来ました。

お手本サイトどおり、mountain view caで検索すると、ちゃーんとマーカーが出てくる(マウンテンビューで検索してもOKなのはさすがだね)。

var searchUrl = 'phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;

入力した地名から緯度経度を取得して、プルダウンで選択した距離をGETでPHPファイルに送ってるだけ。

最終的に作る(かもしれない)のは検索結果を一覧表示するパターンなので、値をhiddenの項目にでもぶっこんでsubmit()するのがいいかな?(地図を併記する必要がなければ、だけど)
地図や詳細情報を表示するための個別ページは、地点のIDをGETパラメタにでも入れて作るのでいいかな?(是非ブクマしてください!といわんばかりに)

あとは…
郵便番号から検索するパターンか。入力された郵便番号を中心に、一定の範囲を区切って検索するか。どの程度までがリアリティのある範囲なのか、難しいところかな。
郵便番号での周辺検索の範囲って、みんなどうしてるんだろう??

今気づいたけど、これ、version2のコードなんだね。
version3用に書き換えるには、どうすべ? また今度。



0 コメント | コメントを書く | コメントの表示
2010年2月19日金曜日
Google Maps API はじめました

タイトルどおり、今日から始めました。

ソースが読みにくいのはご勘弁。
テンプレートを替えようかな?

開発者ガイド (Google Maps API Version3 日本語ドキュメント(非公式))
http://sites.google.com/site/gmapsapi3/


Geekなぺーじ : Google MAPS APIプログラミング
http://www.geekpage.jp/web/google-maps-api/


とりあえずJavaScriptも覚えないといかんかなぁ?

手始めにversion3の日本語ドキュメントのチュートリアルから始める。
まぁ、ここは表示するだけなので、特に問題はない。

次はイベント。
Google Maps API Version3 イベント (Google Maps API Version3 日本語ドキュメント(非公式))
http://sites.google.com/site/gmapsapi3/Home/mapsapi-v3


「UIイベントの中の引数にアクセスする」という項目がある。
クリックした箇所にマーカーを置いて、そこをブラウザのセンターに持ってくるというヤツ。
折角なので、マーカーに吹き出しを付けてみる。
次の項目「イベントリスナでクロージャを利用する」で吹き出しの出し方が出てるので、流用する。

元のソースはこちら。


function placeMarker(location) {
var clickedLocation = new google.maps.LatLng(location);
var marker = new google.maps.Marker({
position: location
, map: map
});
map.setCenter(location);
}


変更後
function placeMarker(location) {
var clickedLocation = new google.maps.LatLng(location);
var marker = new google.maps.Marker({
position: location
, map: map
});
// マーカーにタイトル(ツールチップ)を追加する
marker.setTitle('テスト');
// 吹き出しの設定
var infowindow = new google.maps.InfoWindow({
content: 'クリックされたのはここです<br>緯度:'
+ location.lat()
+ '<br>経度'
+ location.lng()
, size: new google.maps.Size(50,50)
});
// 吹き出しの表示
infowindow.open(map, marker);
// クリックした箇所をセンターに移動させる
map.setCenter(location);
}

ボチボチいきますか。



0 コメント | コメントを書く | コメントの表示
2010年1月27日水曜日
シビア過ぎる… - xamppでsendmail

いい加減、ローカルでもメールの送信テストが出来るようにと、xamppをあれこれいじってみる。

まずはphp.iniから。
バージョンによって場所が違うかもしれないので、パスは書かない。

[mail function]
という項目があるはず。
とりあえずは以下の項目を編集

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path = "インストールディレクトリ\sendmail\sendmail.exe -t"


SMTPとsmtp_portには、使用したいメールサーバの設定を記述する。
sendmail_fromはそのままにしておきました。どーせphpで送信する場合にはfromを設定するから。
でもって、sendmail_pathもコメントを外して、パスの確認。

[mail function]
; For Win32 only.
SMTP = smtp.xxxxx.co.jp
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "インストールディレクトリ\sendmail\sendmail.exe -t"


続いてはsendmailの設定をしたいので、xamppをインストールしたディレクトリ直下にあるsendmailディレクトリのsendmail.iniを開く。

ここでも同じようにsmtp_serverとsmtp_portの設定を行う。php.iniの記述と合わせるのは当然のこと。
hostnameはとりあえずlocalhostのまま。
force_senderは変更してみた。意味があるかどうかは判らないけど。

デバッグログやエラーログが取りたい場合は、debug_logfile、error_logfileの項目のコメントを外して、有効にする。ファイル名だけだから、sendmailディレクトリに出来るんだろう。フルパスや相対パスを書くと変更できるのかな?

念の為、xamppでapacheの再起動(停止→起動)しておく。


で、いよいよテスト。

送信!


…届かない。

小一時間ほどあれこれ試してみましたが、よく判らない。
デバッグログを眺めていると…

10/01/27 10:16:54 ** Cc:
10/01/27 10:16:54 ** Bcc:Content-Type: text/plain; charset=ISO-2022-JP


あ!

改行コードが抜けとるがや!

phpのソースに
."\r\n".
を追加して再度実行してみると、無事に送信できました。

Content-typeの記述を追加した際に、改行コードを付け忘れたってだけか。

ううむ…
そんなヘッダでも送信できてたサーバのsendmailが大雑把なのか、xampp付属のsendmail.exeがシビアなのかどうか…

そもそも記述を間違える僕がいけないっつー話なんだけど。



0 コメント | コメントを書く | コメントの表示
2010年1月15日金曜日
PHPでメールを送るけど、Beckyだけが…

PHPでサイト構築しました。
メールを送るんだけど、まぁこんなカンジ。
抜粋ね。

mb_language('ja');
mb_internal_encoding('UTF-8');
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');
$mail_header = "From: ".$admin_name." <".$admin_mail.">\r\n";
$mail_header .= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$mail_header .= "Content-Transfer-Encoding: 7bit";
mb_send_mail($mail, $subject, $body, $mail_header);


mb_language()とかmb_internal_encoding()とかは冗長かとは思ったんだけど、改めて指定してみた。

問題は$admin_nameなんだな。
要するに送信者名を日本語で設定したいというので、mb_encode_mimeheader()を使うことになった。

色々とテストしてみると、何故かBecky!だけが化ける。
いくつかのケータイとiphone、Windows Live Mailで試したけど、問題なし。
Becky!だけが問題。

受信メールの一覧、メールのプロパティでは正常に表示されている。
しかしメールを表示する際のミドルバー上の差出人とヘッダ表示ではまともに表示できていない。

試しに返信してみると、宛先の日本語表示は正しい。

色々調べるが、有効な情報は見つからない。

まぁ、Becky!はクセがあるみたいだしなぁ…


じゃ、僕のコードがまずいんだろうなってことで、Content-Typeを消してみたり、Content-Transfer-Encodingを消してみたり色々試したが一向に改善されない。

改めてphpinfo()を確認するが、mb_internal_encodingはUTF-8である。


結論はこれ。
$admin_name = mb_encode_mimeheader($admin_name, 'UTF-8');


ここで指定している'UTF-8'を外すと、Becky!でも正常に表示されました。

$admin_name = mb_encode_mimeheader($admin_name);


$admin_nameで指定している文字コードもUTF-8だし、改めて指定する必要もないかな??
一応Windows Live Mailでも正常に受け取れたし…

なんだったんだろう?
全然ワカラン。

実は根本的なことが判ってないのかも。



0 コメント | コメントを書く | コメントの表示
2009年12月22日火曜日
弱ったなぁ

弱った。
というか、困った。

ケータイサイトを作れ、だとさ。

うーん。
ぼちぼちPHP使ってるけどなぁ、ケータイサイトはどうしたらいいか判らんなあ。



0 コメント | コメントを書く | コメントの表示
2009年11月5日木曜日
webalizerの画像が文字化けする

調べれば結構出てくるんだけど、僕の場合の対応策をメモっとく。

HTML自体は文字化けしてなくても、画像が文字化けする場合、TrueTypeFontがないかららしい。
なので、とりあえずフォントを探してみる。

OSによって違いがあるかもしれないけど、/usr/share/fonts/あたりを探してみる。

で、どこかにTrueTypeってディレクトリがあると思うので、日本語のTTFのパスをチェックして、webalizerのconfファイルに書く。

TrueTypeFont 日本語TTFのパス

こいつを追記してやればOK。



0 コメント | コメントを書く | コメントの表示
2009年10月28日水曜日
httpd.confのSetEnvIfの定義

ログ採取の条件を変更したかったので、あれこれ弄繰り回してたんだけど、なかなか…

自社のIPアドレスは除外
画像へのリクエストも除外

この条件があらかじめ設定されている状態だった。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log

CustomLog /home/www/logs/access_log combined env=!no_log

これで指定されたIPアドレス、画像の拡張子以外をaccess_logに書き込むようになる。

問題はここから。

ある特定のディレクトリだけは、別のログに書きたい。
なので、こうしてみた。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log
SetEnvIf Request_URI "^/abc/" no_log
SetEnvIf Request_URI "^/abc/" abc_log

CustomLog /home/www/logs/access_log combined env=!no_log
CustomLog /home/www/logs/abc_access_log combined env=abc_log

でもこれじゃダメ。
アクセスログでは除外してあったIPアドレスと画像のリクエストが抜かれていない。

ってことで色々調べてみたけど、なんだか上手くいかない。
正規表現だろってことで、"^/abc/"を否定してみたかったんだけど、上手くいかない(多分、僕の正規表現がまずかったのかな)。
そもそもenv=(env=!)が複数指定できないのが痛い。

mod_setenvif - Apache HTTP サーバ
ここにSetEnvIfの構文について書いてある。

SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

このenv-variableの指定の仕方について、こう書いてある。
これは、

varname
!varname
varname=value
のどれかの形式になります。

最初の形式では、値は "1" に設定されます。 二つ目はもし値が定義されていればそれを取り除きます。 三つ目は変数を value の与えられた値に設定します。 2.0.51 以降では、regex 内に $1..$9 が存在すればそれを認識し、regex の対応する丸括弧で囲まれた部分で 置換します。mod_setenvif - Apache HTTP サーバ


「!」をつけると単純に否定されるワケではなくて、あらかじめセットされているものから除外されるようになるってことかな?

まずはこれで、おおまかに採取したいログを定義する。
SetEnvIf Request_URI "^/abc/" abc_log

そのabc_logから除外したいものを選択する。
SetEnvIf Remote_Addr XXX.XXX.XXX.XXX !abc_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" !no_log

そうすれば「/abc/」にあったリクエストから、特定のIPアドレスやURLが除外される、と。

ただ、このRequest_URIって、QUERY_STRINGが読めないみたいで、例えば画像を呼び出すだけのようなxxxx.php?image=test.jpgとかって来られると困るんだよなぁ。
これはmod_rewriteで対処できるようだけど、そこまでする必要があるのかどうか…



0 コメント | コメントを書く | コメントの表示
2009年10月26日月曜日
CPANで苦労してみたり

先日のエントリは言わばテストであって、本日本番環境へインストールを試みたワケです。

今日はこのあたりのサイトを参考にさせていただきました。
[ヅラド] FTP が利用できない環境で Perl CPAN の環境を設定する on Linux
http://www.nilab.info/zurazure2/000246.html

CPANのダウンロードサイトにローカルを追加する - azrizの日記
http://d.hatena.ne.jp/azriz/20090815/1250311032#


まずはCPANを実行する。

$ perl -MCPAN -e shell
We have to reconfigure CPAN.pm due to following uninitialized parameters:

cpan_home, keep_source_where, build_dir, build_cache, scan_cache, index_expire, gzip, tar, unzip, make, pager, makepl_arg, make_arg, make_install_arg, urllist, inhibit_startup_message, ftp_proxy, http_proxy, no_proxy, prerequisites_policy, cache_metadata

/usr/lib/perl5/5.8.5/CPAN/Config.pm initialized.
(以下省略)


問題はこのあと。
Your ftp_proxy?  
Your http_proxy?
Your no_proxy?
You have no /root/.cpan/sources/MIRRORED.BY
I'm trying to fetch one
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.gz
Fetching with Net::FTP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
Fetching with Net::FTP
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.gz

Trying with "/usr/bin/links -source" to get
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
ERROR at dump.c:188: Receive timeout


タイムアウト?

どうもftp.perl.orgが死んでるらしい。
ってことで、FTPをCtrl+cで中断して、別のサイト(http)を追加してみる。
ftp.perl.org|163.143.1.21|:21 に接続しています... Issuing "/usr/kerberos/bin/ftp -n"

Not connected.
Local directory now /root/.cpan/sources
Not connected.
Not connected.
Not connected.
Not connected.
Not connected.
Bad luck... Still failed!
Can't access URL ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.

Please check, if the URLs I found in your configuration file () are valid.
The urllist can be edited. E.g. with 'o conf urllist push ftp://myurl/'

Could not fetch MIRRORED.BY
CPAN.pm needs at least one URL where it can fetch CPAN files from.

Please enter your CPAN site: [] http://ftp.cpan.jp/
Enter another URL or RETURN to quit: []
New set of picks:
http://ftp.cpan.jp/


commit: wrote /usr/lib/perl5/5.8.5/CPAN/Config.pm
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan>


http://ftp.cpan.jp/を選んだのは、特に意味はない。調べてみたら、一番多く出てくるのできっと使えるサイトなのだろうと思った程度。

心配なので、テストインストールしてみる。
cpan> test GD
CPAN: Storable loaded ok
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
http://ftp.cpan.jp/authors/01mailrc.txt.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/authors/01mailrc.txt.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/authors/01mailrc.txt.gz" > /root/.cpan/sources/authors/01mailrc.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/authors/01mailrc.txt.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/authors/01mailrc.txt.gz
--13:10:55-- http://ftp.cpan.jp/authors/01mailrc.txt.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/authors/01mailrc.txt.gz" > /root/.cpan/sources/authors/01mailrc.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/authors/01mailrc.txt.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch authors/01mailrc.txt.gz
Fetching with LWP:
http://ftp.cpan.jp/modules/02packages.details.txt.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/modules/02packages.details.txt.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/modules/02packages.details.txt.gz" > /root/.cpan/sources/modules/02packages.details.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/02packages.details.txt.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/modules/02packages.details.txt.gz
--13:10:58-- http://ftp.cpan.jp/modules/02packages.details.txt.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/modules/02packages.details.txt.gz" > /root/.cpan/sources/modules/02packages.details.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/02packages.details.txt.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch modules/02packages.details.txt.gz
Fetching with LWP:
http://ftp.cpan.jp/modules/03modlist.data.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/modules/03modlist.data.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/modules/03modlist.data.gz" > /root/.cpan/sources/modules/03modlist.data"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/03modlist.data.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/modules/03modlist.data.gz
--13:11:00-- http://ftp.cpan.jp/modules/03modlist.data.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/modules/03modlist.data.gz" > /root/.cpan/sources/modules/03modlist.data"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/03modlist.data.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch modules/03modlist.data.gz
Going to write /root/.cpan/Metadata
Warning: Cannot test GD, don't know what it is.
Try the command

i /GD/

to find objects with matching identifiers.

cpan>


ftp.cpan.jpはダメってこと!?

んじゃぁ、つなぎに行く先を変更したり増やしたりしないといかんなぁ。

対象のサイトはCPAN/SITESからピックアップ。出来ればhttpね。

CPAN/SITES
http://www.perl.com/CPAN/SITES.html


cpan> o conf urllist
urllist
http://ftp.cpan.jp/
Type 'o conf' to view configuration edit options


cpan> o conf urllist unshift http://ftp.jaist.ac.jp/pub/CPAN/

cpan> o conf urllist
urllist
http://ftp.jaist.ac.jp/pub/CPAN/
http://ftp.cpan.jp/
Type 'o conf' to view configuration edit options


cpan>


追加した後に、再度installしてみる(テストすべきでしたね)。

cpan> install GD
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
Warning: Found only 0 objects in /root/.cpan/Metadata
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
http://ftp.jaist.ac.jp/pub/CPAN/authors/01mailrc.txt.gz
Going to read /root/.cpan/sources/authors/01mailrc.txt.gz
Fetching with LWP:
http://ftp.jaist.ac.jp/pub/CPAN/modules/02packages.details.txt.gz
Going to read /root/.cpan/sources/modules/02packages.details.txt.gz
Database was generated on Mon, 26 Oct 2009 02:30:16 GMT

There's a new CPAN.pm version (v1.9402) available!
[Current version is v1.7601]
You might want to try
install Bundle::CPAN
reload cpan
without quitting the current session. It should be a seamless upgrade
while we are running...
(以下省略)


無事、入りました。

確認したサイトとともに、メモを残しておきます。



0 コメント | コメントを書く | コメントの表示
2009年10月20日火曜日
CentOS5 にあれこれインストール

ちょっと別のサーバの環境をいじる機会があったので、忘れないようにメモしておきます。

OSはCentOS5です。

色々とあってPerl+SQLiteの環境が欲しかったので、とりあえずSQLiteのファイルを作って、アクセス確認用のファイルを書いてみた。

SQLite - Perl
http://www.tuyudaku.net/sqlite/perl.html

「PerlでSQLiteに接続」という記事を参考にしてみた。

とりあえずVirtualHostの設定を確認するのも面倒なので、コマンドラインからアクセスしてみる。

# perl -f sqlite.pl
Can't connect to data source SQLite:dbname=test.db, no database driver specified and DBI_DSN env var not set at sqlite.pl line 5
#


まぁ、SQLiteのモジュールがないんだろうなって思って、インストール。
ここを参考にしました。
CPAN経由でLinuxにモジュールを組み込む
http://y-kit.jp/saba/xp/cpan.htm


# perl -MCPAN -e shell
Are you ready for manual configuration? [yes]
CPAN build and cache directory? [/root/.cpan]
Cache size for build directory (in MB)? [10]
Perform cache scanning (atstart or never)? [atstart]
Cache metadata (yes/no)? [yes]
Your terminal expects ISO-8859-1 (yes/no)? [yes]
File to save your history? [/root/.cpan/histfile]
Number of lines to save? [100]
Policy on building prerequisites (follow, ask or ignore)? [ask]


プログラムのパスを指定する箇所が続くけど、いくつかは無視した。

Where is your gzip program? [/bin/gzip]
Where is your tar program? [/bin/tar]
Where is your unzip program? [/usr/bin/unzip]
Where is your make program? [/usr/bin/make]
Where is your links program? [/usr/bin/links]
Where is your wget program? [/usr/bin/wget]
Warning: ncftpget not found in PATH
Where is your ncftpget program? []
Warning: ncftp not found in PATH
Where is your ncftp program? []
Where is your ftp program? [/usr/kerberos/bin/ftp]
Where is your gpg program? [/usr/bin/gpg]
What is your favorite pager program? [/usr/bin/less]
What is your favorite shell? [/bin/bash]

'perl Makefile.PL'コマンドのパラメタ

Your choice: []

今度は'make'コマンドのパラメタ

Your choice: []

今度は'make install'コマンドのパラメタ

Your choice: [] UNINST=1

あと少し…

Timeout for inactivity during Makefile.PL? [0]
Your ftp_proxy?
Your http_proxy?
Your no_proxy?


このあとサイトを探しに行くみたい。
(1) Africa
(2) Asia
(3) Australasia
(4) Central America
(5) Europe
(6) North America
(7) Oceania
(8) South America
Select your continent (or several nearby continents) [] 2
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) China
(2) Hong Kong
(3) India
(4) Indonesia
(5) Japan
(6) Kazakhstan
(7) Republic of Korea
(8) Russia
(9) Singapore
(10) Taiwan
(11) Thailand
(12) Turkey
Select your country (or several nearby countries) [] 5
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) ftp://ftp.dti.ad.jp/pub/lang/CPAN/
(2) ftp://ftp.jaist.ac.jp/pub/CPAN/
(3) ftp://ftp.kddilabs.jp/CPAN/
(4) ftp://ftp.nara.wide.ad.jp/pub/CPAN/
(5) ftp://ftp.riken.jp/lang/CPAN/
(6) ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
(7) ftp://ftp.u-aizu.ac.jp/pub/CPAN
(8) ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
Select as many URLs as you like (by number),
put them on one line, separated by blanks, e.g. '1 4 5' [] 1 2 3 4 5 6 7 8

なんか問題あるとイヤだから、全部指定してみた。

Enter another URL or RETURN to quit: []
New set of picks:
ftp://ftp.dti.ad.jp/pub/lang/CPAN/
ftp://ftp.jaist.ac.jp/pub/CPAN/
ftp://ftp.kddilabs.jp/CPAN/
ftp://ftp.nara.wide.ad.jp/pub/CPAN/
ftp://ftp.riken.jp/lang/CPAN/
ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
ftp://ftp.u-aizu.ac.jp/pub/CPAN
ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/


commit: wrote /usr/lib/perl5/5.8.8/CPAN/Config.pm
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan>


これでCPANの準備が終わった。んでDBD::SQLiteをインストールするんだけど…
cpan> install DBD::SQLite
(中略)
CPAN.pm: Going to build A/AD/ADAMK/DBD-SQLite-1.25.tar.gz

DBI 1.57 is required to configure this module, please install it or upgrade your CPAN/CPANPLUS shell
make: *** ターゲットが指定されておらず, makefile も見つかりません. 中止.
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
make had returned bad status, install seems impossible

cpan>


はぁ…
DBIがない(or 古い)ってこと?
じゃぁ
cpan> install DBI
(中略)
gcc -c -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DVERSION=\"1.609\" -DXS_VERSION=\"1.609\" -fPIC "-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE" -W -Wall -Wpointer-arith -Wbad-function-cast -Wno-comment -Wno-sign-compare -Wno-cast-qual -Wmissing-noreturn -Wno-unused-parameter Perl.c
/bin/sh: gcc: command not found
make: *** [Perl.o] エラー 127
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
make had returned bad status, install seems impossible

cpan>


まさか、gccがないなんて!

ってことで、今度はgccを入れるぜ!
いろんなサイトでyumを使ってgccを入れるにはこれだ!みたいなのがあったので、コピペしてみる。
# yum install gcc* compat-gcc* compat-glibc* compat-lib*
Loaded plugins: downloadonly, fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository addons is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* epel: ftp.iij.ad.jp
* rpmforge: apt.sw.be
epel | 3.4 kB 00:00
rpmforge | 1.1 kB 00:00
primary.xml.gz | 0 B 00:30
http://apt.sw.be/redhat/el5/en/i386/rpmforge/repodata/primary.xml.gz: [Errno 4] Socket Error: timed out
Trying other mirror.
(以下省略)

つまり、yumがダメ。
管理者に訊いてみると、どうもyumがタイムアウトするらしい。
最初はサイトが悪いのかと思って、yumの設定を変えてみたりするもダメ。

gccのrpmとかって、どこに落ちてんだ?

そろそろ諦めようかと、ちょっとした息抜きの後にグーグル先生に尋ねてみたら、このページに行き当たった。
教えて!Ziddyちゃん gccのダウンロードインストールのやりかたを教えてください。
http://ziddy.japan.zdnet.com/qa5360918.html


そこに、こんなコマンドが書かれていた。
「# yum --disablerepo=\* --enablerepo=base groupinstall "Development Tools"」
とりあえず、実行してみる。
# yum --disablerepo=\* --enablerepo=base groupinstall "Development Tools"
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
base | 1.1 kB 00:00
(中略)
Install 57 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 59 M
Is this ok [y/N]:

あ、動く!?

でも59MBもインストールしてられない。
モノは試しだ。
# yum --disablerepo=\* --enablerepo=base install gcc
(中略)
Installed: gcc.i386 0:4.1.2-44.el5
Dependency Installed: glibc-devel.i386 0:2.5-34 glibc-headers.i386 0:2.5-34 kernel-headers.i386 0:2.6.18-128.el5 libgomp.i386 0:4.3.2-7.el5
Complete!
#

は…入った?
# which gcc
/usr/bin/gcc
#

スゲー。

あとはCPANで「install DBI」やって「install DBD::SQLite」をやればOK。
「perl -f sqlite.pl」で正常にSQLiteのデータが読み出せました。

あー、疲れた。



0 コメント | コメントを書く | コメントの表示
2009年10月16日金曜日
PHP4とSQLite2とか3とか

久しぶりにてこずったので、忘れないようにメモしておく。
てこずったといっても、半分くらいは自分の責任なんだけど…

現在、お仕事でwebサーバのお引越しをしていて、前の環境と新しい環境を同じにしようとあれこれやってました。
んで、phpinfo()を見ると、どうやらSQLITE3が入ってるようなので、同じように入れてみた。

/usr/ports/databases/sqlite3/ に移動して、make config → make install clean を実施。

あれ?
Apache再起動しても、phpinfo()に反映されねー!

よく調べてみたら、PHP用のsqliteは /usr/ports/database/php-sqlite3/ にあるじゃないか。
再びインストール。

テキトーにphpを書いて、動作確認。

Fatal error: Call to undefined function: sqlite_open() in /xxx/xxx/public_html/test.php on line 5

えぇー!!
undefinedって…

元のサーバも、念のために実行してみました。

Fatal error: Call to undefined function: sqlite_open() in /xxx/xxx/public_html/test.php on line 5

あぁ、そういうことですか。
確かにSQLite使ってる箇所がなかったけど、動かないモジュール入れてるとは想像しませんでした。

でも、こうなったらなんとしてもSQLiteを動くようにしてやるってんで、SQLite2を導入することに。


とりあえず /usr/ports/databases/sqlite2/ でインストール!

案の定、phpでSQLiteが動きません。

じゃ、どっかからtgzを落としてこなきゃならないの??とかって検索しまくった結果…

東西社ホームページ -開発日誌-(http://www.tozaisya.jp/archive/200706.html)にこんな記載がありました。

FreeBSD 6で、Apach + PHP 4でsqliteを動かすには、portsのpecl-sqliteをインストールすれば動くようです。

東西社ホームページ -開発日誌- PHP 4とsqlite 2 2007年6月13日


天の助けとはこのことか。

無事動きました。



0 コメント | コメントを書く | コメントの表示
2009年9月18日金曜日
PHPでPOSTの漢字が文字化けっつーか壊れる?

担当しているサイトがボチボチリリースです。

で、社内から文字化けが起きると指摘が。

調べてみると、検索処理のところで漢字を入れると文字化け…というか「??」とかって表示されたり、値そのものが消えてなくなる。

で、かな混じりだと、正常に値が受け取れる。
あれこれ試したり考えたりした結果、に日本語を埋めるというその場しのぎの対応を入れてみた。

仕事が落ち着いたので、Google先生にお伺いを立ててみると、こういうのが出てきた。

[2378] 文字コードの検出に失敗 - PHPの基礎体力掲示板
http://www.sound-uz.jp/php/bbs/thread/2378?view=flat#


どうも、「mbstring.http_input」の設定が悪さしてる可能性があるらしい。
ってことで、お客さんのサーバを確認すると、案の定「auto」になっていた。

XAMPPで実行していたローカル環境はどうかというと、「pass」だった。
じゃ、社内のテストサーバは? と思ったけど、こっちは「auto」で正常に動作してた。
む… テスト環境ではUTF-8で動かしてたのを客先に合わせてEUC-JPに慌てて変換したのがいかんかった?

php.iniの変更をお願いする?
ちょっと難しいなかぁ?
仕方ないから、暫定対応で行くか…
公開は短期間だし、いいよね?



0 コメント | コメントを書く | コメントの表示
2009年7月16日木曜日
C:\fakepath

勢い余って、IE8にアップグレードしてしまった。

でもって、ぼちぼちサイトの開発してたら問題が…

<input type="file"> のvalueが「C:\fakepath\ファイル名」になる。

これって、きちんとアップロードできるの?

そう思って、ググってみると、どうも無理っぽい(サイト構築し始めなので、ディレクトリ作ったりするのが面倒なので、本当に無理かは試してない)。
しかもIE8になってセキュリティ面の強化の賜物だとか。

でもって回避方法をメモっておく。


(1)セキュリティレベルの変更
「インターネットオプション」を開き、「セキュリティ」タブを選択。
ゾーンの中から「インターネット」を選択し、「レベルのカスタマイズ」を押下する。
で、ずーっと下の方の「その他」の中になある「サーバにファイルをアップロードするときにローカルのディレクトリパスを含める」を無効から有効に変更する。

(2)信頼済みサイト
同じく、「セキュリティ」タブのゾーンから「信頼済みサイト」を選択し、ゾーンの右下あたりにある「サイト」ボタンを押下する。
で、アップしたいサイトを信頼済みとして登録する。
「https」ではなく「http」の場合には、きちんとチェックボックスをオフにする、と。

まぁ、どうなんでしょう?

----------------------------------------------

ちょっと追記。
PHPとかはフツーにパスが取れるので、誤解なきよう。



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.