2012年2月16日木曜日

①㈱特殊文字テスト

あとで消します

2012年2月5日日曜日

共有サーバー(ロリポップ、さくら、チカッパ)で簡単にPEARをインストール方法 2012年2月 @iis_hara_dev

何かと面倒な共有サーバーでのPEARのインストールを簡単に
行える方法としてgo-pear.phpがありますが
現在webの検索で引っかかるものでは古かったりするものが多いのでまとめました。

今回はロリポップで設置・動作をしましたが基本的に共有サーバーで動くはずです

参考サイト
  1. http://www.karate-style.jp/2007/06/13/pear-2/
  2. http://masha.maakikaku.jp/2008/05/gopearpear.php
  3. http://d.hatena.ne.jp/tdoi/20111228/1325054820

(1)まずgo-pear.phpを用意する必要がありますが
よく出てくる http://go-pear.org/ はドメイン切れ。
http://pear.php.net/go-pear では古いためエラーとなって
動きません
の中で記述されている
を使う必要があります。
こちらをダウンロードしてgo-pear.phpという名前で保存してください

(2)これを適当なディレクトリにFTP等でアッフロードします。
今回は
/home/foo/bar/web/lib/go-pear.php とします

そしてブラウザから
http://xxxxxx/lib/go-pear.php にアクセスします

(3)下部のnextをクリックします

(4)もろもろの設定します
Installation prefixがインストール先ののディレクトリ
php.exe path, optional (CLI command tools)がPHPのパスとなります
PHPのパスに関しては各サーバーのマニュアル参照のこと
だいたい /usr/local/bin/php になるはずです
あとはとくにデフォルトのままで問題ありません

(5)Installをクリックします
いくつか警告が出ることもあるようですが
Installation Completed !
と出れば問題ありません

(6)index.phpの修正
/home/foo/bar/web/lib/にindex.phpができているので
こちらをDLして下記の修正をします
$pear_dir = '@pear_dir@';
$pear_dir = ' /home/foo/bar/web/lib/PEAR';
※各自の環境にあわせてください

(7)各パッケージのインストール
http://xxxxxx/lib/index.php にアクセス

Quick-install a package
に欲しいパッケージ名を入れてinstallボタンを押すと自動的に
インストールされます。今回は
Net_URL2などをいれてます。

(8)インクルードパスの設定
最後にhtaccessで
php_value include_path ".: /home/foo/bar/web/lib/PEAR/"
を設定してあげると
phpで使う際には
require_once('HTTP/xxx.php');
で呼び出せます。

またPEAR内部ではrequire_once('HTTP/xxx.php');で
呼び出されているのでこれがないと動キません

ただし、ロリポップでは上記の記述が効かなかったので
phpに
ini_set('include_path', " /home/foo/bar/web/lib/PEAR/ ");
と書いて対応しました

※なお、ディレクトリの絶対パスをしらべるPHPを参考として下記に書いておきます
echo getcwd();


2011年11月11日金曜日

nullと比較するif文かくときに、一歩レベルあげる書き方

多くの言語で

if($hoge == null)

といった書き方をしますが、少しの工夫で後の多大な
バグ取りの時間を防げるかもしれません。

その「少しの工夫」の書き方とは下記のとおりです。

if(null == $hoge)

逆にしただけです。なぜこの書き方が良いのか説明します。


まず前提として多くの言語では
$hoge=1;
という代入が成功した場合、"true"を返す仕様になっています
※1 ためしてみたところ、PHPの$hoge=null;でもtrueがかえります。
※2 javaは代入された値そのものがかえるようです。

つまりif($hoge = null) という文が文法エラーとならず成り立ってしまいます。
たった一個=を忘れただけで全く意図しない動きになり、かつあとから修正するときも
非常に気づきにくいバグです。

ですが

if(null == $hoge)

と書くことによってたとえば

if(null = $hoge)

と書いてしまっても、nullに代入ができるわけではないので
コンパイルエラーや実行時エラーになります。よって早い段階でミスに気づけます。


この書き方の大きなメリットは上記の単純ミスに気づくというだけではなく、
いかにしてバグの起こりにくいソースを書くかという意識づけができることです。
PGやSEの大切な仕事として「いかにしてヒューマンエラーを防ぐか」がありますが
こういった些細な書き方一つがその意識向上のきっかけになつていただければ幸いです。

2011年11月4日金曜日

Javaの数値チェックでNumberFormatExceptionを使ってはいけない理由

この前、Javaの半角数値チェックでぐぐっていたらわりと下記みたいな
ソースコードを見つけました

private static boolean isNumeric(String hoge) {
 try {
  Integer.parseInt(hoge);
  return true;
 } catch(NumberFormatException e) {
   return false;
 }
}

これは動きとしては正しい結果をだしますが
好ましくありません。
下記のような書き方のほうが好ましいです


private static boolean isNumeric(String hoge){
 char c = null;
 for (int i = 0 ; i < hoge.length(); i++){
  c = hoge.charAt(i);
  if (c < '0' || c > '9'){
    return false;
  }
 }
 return true;
}


理由1
Javaはガベージコレクションのおかげでスマートなメモリ管理を
可能ですが、例外もあります。それは名の通り"例外"の時です。

Exceptionがthrowされると一時的でもヒープを大幅に使うので
やはりexceptionはなるべく避けるように使うべきです。

これが何十万件のデータを処理するバッチならば当然避けるべきです

理由2
上記とかぶりますがExceptionはその名の通り、「例外」ですので
プログラマの想定しなかったケースのみ発生するようなあり方が
好ましいためです。チェックのために使うというのはプログラム設計
としてよろしくないためです(※理由2は個人的見解です)



余談
たとえばほとんど数値以外の文字が入ってくること無いが
想定される場合はNumberFormatExceptionを使うケースでもよいかもしれません

ただその場合NumberFormatExceptionをthrowする、あるいはラッピングされた
なんからのExceptionをthrowするという設計のほうが正しい気もしますが

2011年9月30日金曜日

FacebookアプリでPHP SDK(v.3.1.1)を使ったバックエンド側処理

FBアプリを作るとき、フロント側とバック側で分けて作るときのサンプルみたいなもの

今回したいのは
フロント側をフラッシュやJSで実装して
通信することでバックエンド側で処理させたい
ということ

使うのはPHP SDK(v.3.1.1)

渡されるのはfacebookのIDのみ
渡される値のnameはidとアプリで個人ごとに発行されるaccess_tokenが必要
ユーザーのセッション内に
fb_(アプリID)_access_token
の名前で入っている
なお認証時に必要なpermissionを取ることを忘れないこと

以下サンプル

require 'facebook.php';//SDK読み込み
//自分のあふりにあわせて変更
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
));

//ユーザーIDなし
if(!$_REQUEST['id']){
//エラー処理
}
//ユーザーID不正
if(!is_numeric($_REQUEST['id'])){
//エラー処理
}
//ユーザー情報取得
try {
$user_profile = $facebook->api('/'.$_REQUEST['userID'],'GET',array('access_token'=>$_REQUEST['accessToken']));
//print_r($user_profile);
} catch (FacebookApiException $e) {
//エラー処理
}
//友達一覧取得
try {
$friends = $facebook->api('/'.$_REQUEST['userID'].'/friends','GET',array('access_token'=>$_REQUEST['accessToken']));
} catch (FacebookApiException $e) {
//エラー処理
}
//写真をアルバムへ
try {
$facebook->api('/'.$_REQUEST['userID'].'/photos','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge','picture' => '@/some/where/hoge.jpg'));
} catch (FacebookApiException $e) {
//エラー処理
}
//ウォール投稿
try {
$facebook->api('/'.$_REQUEST['userID'].'/feed','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge'));
} catch (FacebookApiException $e) {
//エラー処理
}

2011年3月8日火曜日

ファイルだけディレクトリだけ、パーミッションを変更したい場合のコマンド

参考サイト
http://piro791.blog.so-net.ne.jp/2010-07-21-2


ディレクトリだけ

 find /some-directory -type d -exec chmod o-x {} \;

ファイルだけ

 find /some-directory -type f -exec chmod o-x {} \;

2011年2月9日水曜日

[PHP]動的な文字列を縦書で表示するためのサンプルみたいなもの

時々ある、文字を縦書きさせたいという仕様に対して
調べたこと、考えたことをメモとして残します

(1)解決法その1 CSSを使う
参考:http://www.tagindex.com/stylesheet/text_font/writing_mode.html

writing-mode: tb-rl;

で出来ますがIEのみの対応となるので実質意味がありません。
IE限定の環境であればできるかも

(2)画像化する

動的な文字列を画像化することは出来なくはないのですが下記に比べて
難易度が高いので却下です。

(3)文字を配列化して改行で対応
出力例は http://ii-s.heteml.jp/test.php
ソースサンプルは下記の通り。

<?
$name="原克志";
$address="東京都品川区";
$tel="03-1234-5678";//ここらが本来動的

//文字列のながさ取得
$name_len=mb_strlen($name,'utf-8');
$address_len=mb_strlen($address,'utf-8');
$tel_len=mb_strlen($tel,'utf-8');

//ハイフンは|へ
$name=str_replace('-','|',$name);
$address=str_replace('-','|',$address);
$tel=str_replace('-','|',$tel);

//見栄えのため全角化
//参考:http://astrodeo.com/blog/archives/122
$name=mb_convert_kana($name,'ASKV','utf-8');
$address=mb_convert_kana($address,'ASKV','utf-8');
$tel=mb_convert_kana($tel,'ASKV','utf-8');

/*他置換などは仕様に準じること、置換に関しては一つの
関数にまとめることを推奨*/


//配列初期化
$name_arr=array();
$address_arr=array();
$tel_arr=array();

//文字列を配列化
for($i=0;$i<$name_len;$i++){
$name_arr[]=mb_substr($name,$i,1,'utf-8');
}
for($i=0;$i<$address_len;$i++){
$address_arr[]=mb_substr($address,$i,1,'utf-8');
}

for($i=0;$i<$tel_len;$i++){
$tel_arr[]=mb_substr($tel,$i,1,'utf-8');
}
?>
<html>
<head>
<title>縦書きテスト</title>
</head>
<body>
<!--テーブルなとでこのとき気をつけるのは縦書きのため見栄え上と反対の順序で書く必要あり-->
<table border="1">
<tr>
<td valign="top"align="center">電<br />話</td>
<td valign="top"align="center">住<br />所</td>
<td valign="top"align="center">名<br />前</td>
</tr>
<tr>
<td valign="top"align="center"><? foreach($tel_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($address_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($name_arr as $value){ echo $value.'<br />';} ?></td>
</tr>

</table>
</body>
</html>