2008年4月30日水曜日

【PHP】プログラムでPath(パス)をセットする

PEAR(ペア)などの外部ライブラリを使うときは、そのディレクトリにパスを設定しときたいことが多々あります。php.iniに設定できれば問題ないですが、レンタルサーバの場合はプログラム上で一時的に設定するやり方があります。

PHP 4.3 以上では
set_include_path

バージョンを気にしたくない場合は
ini_set

を使います。例↓

set_include_path(get_include_path() . PATH_SEPARATOR . '/usr');

ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '/usr');

PATH_SERPARATORを使うのはwindowsとlinuxで区切り文字が違うから。ちなみに.htaccessに設定するやり方もあります。

php_value include_path ".:/usr"

2008年4月29日火曜日

【ADO.NET】DB接続後closeをしないと駄目なのか

この続きで、64bitのWindows Server上のIISで動かすと「アプリケーションプールの制限値を越えました」と怒られる現象ですが、原因はSQL Serverに接続後、ちゃんとcloseしていなかった(箇所がある)ため接続プールがクリアされなかったのが原因でした。

私の認識ではたとえcloseを実行しなくても.NETが自動的に切断(プールを解放)してくれるものだと思ってました。もちろんできるだけcloseするようプログラミングしますが。

ここにSQL Serverの接続プールに関しての説明があります。これにはcloseとdisposeを使って接続を終了することを強く勧めていますが、接続が長時間アイドル状態のときは.NETが自動的に接続を切断するという記述もあります。

64bitのバグ?実際32bitだといくらやってもエラーとなりませんでした。でも、必ずcloseするよう癖をつけといた方がよいみたいです。

ここに実際にオブジェクト破棄を保証するコードのサンプルがあるので参考に。

さらに.NETの自動メモリ管理(ガベージコレクション)について知りたい時はここ

2008年4月28日月曜日

【ASP.NET】IISの動作モードを32bitと64bitで切り替える

64bitのWindows Serverをインストールして32bitで動いていたASP.NETのアプリケーションを64bitのIISで動かすとうまく動いてくれないことがあるようです。

そんなときは32bitで動作させたくなります。ここにそのやり方が。

困っていたのは、64bitのIISで動作させるとアプリケーションプールがうまくリサイクルされずに、複数端末で接続すると「アプリケーションプールサイズの制限値を越えました」というようなサーバエラーが返される現象です。

この現象はリンクにあるやり方で32bitモードで動かしても直らなかったのですが、32bitのWindows Serverでは起きませんでした。

つづく・・・

2008年4月26日土曜日

社内パッケージ「somfa」を使ったLDAPサーバ接続

ここで、PHPを使ったLDAPサーバに接続する方法を書きましたが、社内のPHPで書かれたDB接続パッケージ「somfa」を使ってLDAPサーバに接続する方法をアニキが教えてくれました。ここ

社内で使う分には使い慣れたインターフェイスでプログラミングできるので、こっちの方が便利かも。検索スピードが変わらないようなら、somfaを使うのもありかも。

社外の人にとっては全く縁のない話ですね。

2008年4月25日金曜日

【.NET】AUの携帯にメール送信すると件名が文字化けする

.NETにあるSystem.Net.Mailでメール送信をしていますが、これが結構くせものだということが分かりました。

分かったのはAUの携帯にメール送信すると件名が文字化けする現象に遭遇したからです。しかも件名によっては文字化けしたりしなかったり。

ここでSystem.Net.Mailが駄目な理由を解説してくれてます。

この場合メールの件名には「?iso-2022-jp?Q?xxxxxxx」と表示されます。

これはQuoted-Printableという形式でエンコードされているようです。こちら

緊急回避策として、auの携帯だけShift-JISでエンコードして送信するようにしました。ただし、Thunderbirdでそのメールを受信しても文字化けします。Outlookでは大丈夫なようです。

あとでQuoted-Printableもちゃんとデコードできるように対応しましたが、メールの送受信って結構大変ですね。市販のツールを使った方が便利なような気がします。BASP21とか(これはフリー)。

2008年4月24日木曜日

PHPのコーディング規約

PEAR(PHP Extension and Application Repository)「ペア」のドキュメントを読んでいたら、PEARのコーディング規約をみつけました。あとでいろいろ参考になりそうなのでメモ。

PEARとは?

PEARの標準コーディング規約

長い間プログラミングしていると独自のコーディング規約が既に確立してしまいますが、開発メンバー全員が規約に従わないと意味がないので、自分流となっていた部分は少しづつ直していこうと思います。

ifの次は半角スペースをいれるとか・・・。

2008年4月23日水曜日

POP3とSMTPのコマンド一覧

メールの送受信テストをするときやプログラムを開発する際に直接メールサーバにアクセスしてメールを送信したり確認したりします。

アクセスはtelnetをつかってWindowsならコマンドプロンプトから
# telnet <server_name> 110
↑POP3
# telnet <server_name> 25
↑SMTP

POP3のコマンドはここをみれば分かりやすい。

SMTPのコマンドはここ

2008年4月22日火曜日

Google Spreadsheetsを簡易SQL DBに

前から試してみたかったんだけど、時間がなくて先送りになってるのがこれ。Goolge Spreadsheetsを簡易的なSQL DBとすることができるらしい。

記事1 記事2 記事3

このブログで紹介されているのはJavaScriptでGoogle DocsのAPIにアクセスする方法ですが、PHPでアクセスする方法もあるはず(たぶん)。

これができれば、SQL DBなしでシステムを構築することができるんじゃないか?

簡単なWikiとかなら、いちいちDB用意しなくていいから便利かも。

そのうち作ってみよう。

2008年4月21日月曜日

【SQL Server】変数を利用したTOPで動的に絞り込む

ストアドプロシージャを書いていると、変数を使って動的にSELECTする値を絞り込むようなことをしたくなります。

そんなとき検索してみつけたのはここにあるサンプルコードライブラリ。

SQL CLRをやり始めるときやT-SQLのTipsなど結構参考になりました。

変数を使う方法は括弧を使うとすんなりできます。

declare @countnumber int set @countnumber = 10

select top (@countnumber) * from person.contact

2008年4月18日金曜日

GmailのAPIを使ってPHPで操作する。

Google Appsのメール設定をプログラムから「POP受信を許可」に変更したくて、実現可能かどうかを調査。

Gmail(***@gmail.com)では、APIが公開されていて、これを使えばできるみたい。libgmailerリファレンス

libgmailerを使うためにはCurlをインストールしないといけない。
$ apt-get install curl

あと/etc/php5/php.iniの
allow_call_time_pass_reference = On
を設定する。

でも独自ドメインの場合のGmail用APIは見つからず。このソースを元に変更すれば可能は可能そうだけど、・・・誰か作って

2008年4月17日木曜日

PHPでLDAPサーバに接続して検索

まずは必要なモジュールをインストール(相変わらずvineなのでapt)
# apt-get install php5
# apt-get install php5-ldap

適当なユーザをLdap adminで登録しといて下記サンプルコードを実行すれば、結果が出力される。
# php5 ./sample.php

↓Ldap Adminの画面

image

↓サンプルコード。ここを参考にちょっと書き直した。

<?php
// LDAP の基本シーケンスは、接続、バインド、検索、検索結果の解釈、
// 接続のクローズです。

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$objConnect = ldap_connect("localhost");  // 有効な LDAP サーバーに違いない!
echo "connect result is " . $objConnect . "<br />";

if( $objConnect ){

    //バインド
    echo "Binding ...";
    $bBind=ldap_bind( $objConnect );     // これは "匿名" バインドで、通常は読みこみのみのアクセスとなります。
    echo "Bind result is " . $bBind . "<br />";

    // エントリを検索
    $sPerson = "";
    echo "Searching ...";
    $sDN = "ou=Users, o=exbridge, c=JP";
    $sFilter = "(|(sn=$sPerson*)(givenname=$sPerson*))";
    $iSerchID = ldap_search($objConnect, $sDN, $sFilter); 
    echo "Search result is " . $iSerchID . "<br />";
    echo "Number of entires returned is " . ldap_count_entries($objConnect, $iSerchID) . "<br />";

    //検索結果表示
    echo "Getting entries ...<p>";
    $aList = ldap_get_entries($objConnect, $iSerchID);
    echo "Data for " . $aList["count"] . " items returned:<p>";
    for( $i=0; $i<$aList["count"]; $i++ ){
        echo "dn is: " . $aList[$i]["dn"] . "<br />";
        echo "first cn entry is: " . $aList[$i]["cn"][0] . "<br />";
        echo "first email entry is: " . $aList[$i]["mail"][0] . "<br />";
        echo "password is: " . $aList[$i]["userpassword"][0] . "<br /><hr />";
        //var_dump($aList[$i]);
    }

    // クローズ
    echo "Closing connection";
    ldap_close($objConnect);

} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
?>

2008年4月16日水曜日

【ASP.NET】携帯かPCからのアクセスかを判別する

ユーザーエージェントを参照して判断できる。

簡単に書くとこんな感じ

Imports System.Text.RegularExpressions

''' <summary>
''' 携帯電話でアクセスしているかどうか
''' </summary>
''' <returns>携帯電話:<c>True</c>。それ以外:<c>False</c></returns>
''' <remarks>
''' http://www.futomi.com/lecture/env_var/http_user_agent.html
''' http://noongoro.main.jp/note/note0035.html
''' </remarks>
Public Function isMobile() As Boolean
    Dim sAgent As String = HttpContext.Current.Request.ServerVariables("HTTP_USER_AGENT")
    'Dim sRemoteHost As String = HttpContext.Current.Request.ServerVariables("REMOTE_HOST")
    Dim bReturn As Boolean = False
    'HttpContext.Current.Response.Write(sAgent)
    'Docomo
    If Regex.IsMatch(sAgent, "DoCoMo") Then
        bReturn = True
    End If
    'AU
    If Regex.IsMatch(sAgent, "UP\.Browser") Then
        bReturn = True
    End If
    'SoftBank
    If Regex.IsMatch(sAgent, "J-PHONE|Vodafone|SoftBank|MOT") Then
        bReturn = True
    End If
    'エミュレータ
    If Regex.IsMatch(sAgent, "J-EMULATOR") Then
        bReturn = True
    End If

    Return bReturn
End Function

参考になるサイトはこことかこことかここ

2008年4月15日火曜日

【.NET】CLR(Common Language Runtime)のバージョンを調査

SQL Server 2005のSQL CLRの開発で壁にぶち当たって、そのとき調査したメモ。

SQL CLRで開発したモジュールは結局.Net FrameworkのCLR(Common Lanuage Runtime)で動く(と思う)ので、そのバージョンの取得方法。

//【C#】
string clrVersionBuildtime = System.Reflection.Assembly. GetExecutingAssembly().ImageRuntimeVersion;

'【VB.NET】
Dim clrVersionBuildtime As String = System.Reflection.Assembly. GetExecutingAssembly().ImageRuntimeVersion

ちなみに現時点では「v2.0.50727」だった。
問題解決にはならなかったけど、CLRの問題ではなさそうなのは分かった。

2008年4月14日月曜日

【SQL CLR】DBから外部リソースにアクセスするための設定

【SQL Server 2005】

SQL CLRを利用してストアドプロシージャからPOPサーバにアクセスするプログラムを書いたときのメモ。POPアクセスのコードはここを参考に。

ストアドプロシージャでSQL CLRを利用する場合、.NETで実現できることは基本できるようですが、外部のPOPサーバにアクセスしないといけないので、気にしないといけないのがセキュリティ権限。SQL CLRの作り方はここを参考に。

データベースから外部へのアクセス権限に関して参考になるのが、ここここ

最初はコンパイル時に下のようなエラーが出てきたけど、よく分からず。

アセンブリ 'SqlServer_dbPOP' の CREATE ASSEMBLY が失敗しました。 PERMISSION_SET が EXTERNAL_ACCESS の場合、アセンブリ 'SqlServer_dbPOP' は許可されません。

アセンブリが許可されるのは、データベース所有者 (DBO) に EXTERNAL ACCESS ASSEMBLY 権限があり、 データベースの TRUSTWORTHY データベース プロパティが有効になっている場合、 または、アセンブリが証明書または非対称キーで署名されており、 それに対応するログインに EXTERNAL ACCESS ASSEMBLY 権限がある場合です。

このデータベースを復元またはアタッチした場合は、 データベース所有者がこのサーバー上の正しいログインにマップされていることを確認してください。 マップされていない場合は、sp_changedbowner を使用して問題を解決してください。

調べた結果、まずデータベース側の設定はManagement Studioでデータベースを右クリック→プロパティで「信頼可能」が「True」になっている必要がある。

image

GUIで変更できなかったので、下記SQLを実行してTrueにする。データベースから外部にアクセスするときにはこの設定が必要。

ALTER DATABASE (データベース名) SET TRUSTWORTHY ON

次はVisual Studio側でSQL CLRプロジェクトのプロジェクト→プロパティでアクセスの許可レベルを外部に設定。

image

これでデータベースから外に出れるようになるはず。

さらに登録したストアドプロシージャを他のデータベースにコピーする場合はManagement Studioでデータベースを右クリック タスク→スクリプトの生成 を選んで、スクリプト生成ウィザードを起動。

オプションは「If NOT EXISTSを含める」と「スクリプトの削除」をTrueにしとくと、もし既に登録していた場合、削除してから登録してくれるので便利。

image

もちろんアセンブリとストアドプロシージャを選んでスクリプトを生成。

このままのスクリプトを実行してもVisual Studioで設定した「アクセス許可のレベル」は設定してくれないので、アセンブリを登録するSql文に下記を追記

CREATE ASSEMBLY [sp_mail_netpop] FROM 0x4D5A WITH PERMISSION_SET = EXTERNAL_ACCESS

詳しくはここ

アセンブリのセキュリティを設定しないと

Request for the permission of type 'System.Net.DnsPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=

と怒られ続ける・・・。これでちょっとはまった。

2008年4月12日土曜日

Visual Studio 2005のキーバインドを変更

今までの開発でXyzzyを使っていると、Visual Studio 2005のキーバンドが苦痛。Xyzzyでコードを書くこともできるけど、やっぱりIntelliSenceは便利なので使いたい・・・ということで、Visual Studio 2005のキーバインドを変更することにしました。

Visual Studioではかなり柔軟にキーバインドを変更することが可能です。
ツール→オプション→環境→キーボードでいろいろ設定。

デフォルトでEmacsのキーバインドに変更できるスキームが用意されているけど、これを適用するとクリップボードにコピーしたときの挙動がおかしいし、使いにくいので既定の設定から自分用のキーバインドを追加することをおすすめします。

キーボードでのカーソル移動とCtrl-Gを選択範囲のキャンセルに割り当てれば、まずまず使いやすくなります。あとは適宜必要になったときに追加。

ある程度設定したら、
ツール→設定のインポートとエクスポート
でオプション.環境.キーボードを選択して設定の保存をしとくと安心。

2008年4月11日金曜日

Sunbirdに日本の祝日と天気予報を表示

Sunbirdのバージョン0.8日本語版がリリースされました。速度面やバグなども修正されているため、過去のバージョンを使っている人はアップグレードをおすすめします。予定検索を非表示にすると立ち上がりが早い。なぜかSunbirdの更新確認では新しいバージョンを見つけてくれませんでした。

ここからダウンロード。旧バージョンを削除しなくてもインストーラ実行で大丈夫です。

<日本の祝日を追加>
Googleが公開してくれているICALを利用します。プレビュー
ICALアドレス
http://www.google.com/calendar/ical/japanese__ja%40holiday.calendar.google.com/public/basic.ics

<天気予報を表示>
livedoorが公開してくれているICALを利用します。ここから。
私の場合はGoogleカレンダー経由で参照してます。

2008年4月10日木曜日

【VMware】CentOSを仮想SCSIディスクにインストールする方法

VMware ServerにCentOSをインストールしようとしましたが、SCSIハードディスクでゲストOSを構成するとハードディスクが認識しない・・・。

検索してみると仮想ハードディスクをIDEとすればできるみたいだけど、ここを参照するとIDEだと遅くなるみたいなので嫌。なんとかしてSCSIにインストールできないもんかなーと思っていじってみたら、すんなりできました。

やり方はゲストマシンを作成するときにTypicalではなく、Customを選択。もろもろ入力したあとSCSI Adapterを選択するダイアログでLSI Logicを選択するとCentOSのインストール時でもハードディスクを認識してくれるようになりました。

image

2008年4月9日水曜日

BigTableにアクセスできる「App Engine」のプレビュー版公開

昨日BigTableに関して書きましたが、なんとGoogleからApp Engineというサービスのプレビュー版が公開されました。記事

これは、Googleのリソースを使ってwebアプリケーション(サービス)を開発、公開することができます。今はプレビュー版なのでGoogleのサーバでサービスを公開できるのは先着1万名までらしいです。

記事を読んで早速登録しましたが、どうやら1万名の中に入れなかったみたいです。ただ登録だけしとけば、利用できるようになった時点でGoogleからメールが送られてくるようです。

App Engineについてはここを読めばなんとなく理解できそう。

特徴は

  • ストレージの上限500M
  • CPUは一日あたり2億MHz
  • 転送量は一日(双方向で)10GB
  • 制限を超えなければ無料で利用可能
  • 今のところ開発言語はPythonのみ(今後増える予定)
  • Googleのサーバに配置できないけど、SDKを利用すればローカルで開発と動作検証はできる

実際に作られたアプリケーションを触ってみましたが、Googleアカウントで必ずログインしないと駄目みたい(?)。誰でもアクセスできるようにはできないのかな?

まだ謎がいっぱいですが、暇があったら試してみよう。

PHPに早く対応してほしい・・・

2008年4月8日火曜日

GoogleのBigtableでデータベースもオンライン化

ここの記事でGoogleが「Bigtable」という名のデータストレージサービスを公開するかもというのを知りました。

Googleさんのことだから数GBまでは無料で提供されるんではないでしょうか?普通のユーザは使い道がないので、おそらくGoogle Appsのサービスの一つとして提供されそうな予感。

すでに超強力なGmailを提供しているGoogle。今後社内のメールとファイルとデータは全てオンラインでGoogleにお任せという企業も出てきそうな感じです。
・・・それはないか・・・

しばらくしたらBigtableを使ったシステムを提案してるかも。

非常におもしろそうな技術なので今後も注目です。

2008年4月5日土曜日

【ASP.NET】auの携帯だと文字化けするのを回避する方法

ASP.NETで携帯サイトを開発していて、auだけ文字化けするのに気がつきました。回避する方法はweb.configのsystem.web内に下記コードを追記するだけ。

<!-- AUの携帯の場合は下記指定がないと文字化けする -->
<globalization requestEncoding="shift-jis" responseEncoding="shift-jis" enableBestFitResponseEncoding="true"/>

ここを参考に。←携帯向けサイトの開発について有用なコメントがあります。

開発環境
Visual Studio 2005
ASP.NETのVB.NET
.Net Framework 2.0 SP1

2008年4月4日金曜日

.NET Framework 2.0 用 SP1

Microsoftのサイトで.NET Framework 2.0 用 Service Pack 1が公開されてます。

主に

  • セキュリティの強化
  • .NET Framework 3.5 のサポート

が変更されてます。

日本語で使用する場合は日本語Language Packも追加でインストールが必要。

以前のService Pack1がインストールされている場合は削除してからインストールしないと駄目らしい。Windows Updateで更新すればこの辺自動でやってくれるのかな?怖いから試してないけど。

2008年4月3日木曜日

【Visual Studio 2005】ASP.NETの規定ブラウザを変更

Visual Studio 2005でASP.NETプロジェクトを開発し始めたときは、規定のブラウザがFirefoxだったので、デバッグ実行するときはFirefoxが起動していた。

だけど、
Firefoxは調査(検索)用
IEは開発用
としたいので、規定のブラウザをIEに変えてみたけどVS2005で立ち上がるブラウザは変わらない・・・。

なんで?

と思って検索してみたら、ここの人が教えてくれました。

使うブラウザはプロジェクトごとに覚えているみたいなので、

ファイル→ブラウザの選択

で変更できるらしい。

2008年4月2日水曜日

Ldapから検索する上限値を設定

Ldapに大量にデータを追加して検索していますが、Ldapから検索するとデフォルトで上限500までしか取得できない。

これを解除するには/etc/openldap/slapd.confに

sizelimit -1

を追記する。-1は無制限。
その他の設定はここを参考に。

2008年4月1日火曜日

今日は創立記念日

4月1日は会社の創立記念日で、みんなでバーベキュー。 飲み過ぎて頭が痛い。 でも楽しかったです。 また明日から頑張りますか。
Related Posts Plugin for WordPress, Blogger...

Blog Archives