WindowsプログラマのWebアプリへの挑戦日記。あとパンとか。

ソフトウェアを開発するときに仕様書を書くべき3つの理由

7月 5th, 2008 Posted in C++, PHP | No Comments »

Joel on Softwere」で、機能仕様書を書く重要性が延々と述べられているので、ちょっとまとめてみます。いきなりコーディング始めていませんか?

プログラムをデザインする

仕様書の最も重要な役割はプログラムをデザインすることだ。
仕様書を書くという行為自体によって-プログラムがどう機能するか詳細に記述するということによって-プログラムを実際にデザインするように強いられるのだ。

ここでいう仕様書とは機能仕様書のことで、内部仕様書(技術仕様書)のことではないです。機能仕様書とは、ユーザの観点から製品がどのように動くかを記述したドキュメントです。ダイアログとかメニューとかの仕様を書くアレです。

機能仕様書を書くことによって、プログラムがどのように動くかを深く考えることになります。これから作ろうとしているソフトウェアの動きを文章で書き、簡単な絵を添付した場合、上司や顧客からダメだしをされてもすぐに書き換えることができます。一方、2週間掛けて書いたプログラムをダメだしされた場合は・・・!?

アジャイル開発におけるテストファーストも、関数をコーディングする前に関数のテストを書くことによって、その関数の入力と出力の組み合わせを細かく考えます。そうすることで、その関数の仕様を詳細に検討することになります。

作ろうとするものがどう動くかをまず考えることが、デザインにつながります。

コミュニケーションにかかる時間を節約できる

開発のテスト期間中に、どんどん報告されるバグを片っ端からかたづけているとき、スピーディーに改修をこなしているアナタの集中力はMAX!(この状態をフロー状態と言います。)

しかし、突然鳴り出す電話。相手は試験チームのアイツ。いつもくだらない質問で電話してくるアイツです。

試験チームのアイツ:
「音楽CDを再生しながらプロパティダイアログを開くと、CDが停止するんですけど、これ不具合ですか?」

はぁ?不具合なわけないじゃん。つか今頃そんな質問すんなYO!

アナタ:
「それは仕様です。」

試験チームのアイツ:
「では仕様書への記載お願いします。」

げ。書いてなかったっけ?

こんな経験たぶん誰にでもあるんじゃないですか?ボクだけですか?

さて、ここからまた改修作業に戻るわけですが、「ピープルウェア」によるとさっきのフロー状態まで戻るのに15分はかかります。あぁ、なんという無駄。

2分間の仕様書への追記をサボったために、電話対応+フロー状態への復帰で20分の貴重な時間が無駄になります。20分の無駄も問題ですが、仕事が中断したことによるイライラで仕事へのモチベーションが下がってしまうことのほうが大問題です。

仕様書を書いておけば、こんなことにはならないのです。

スケジュールが立てられない

製品を開発するには時間がかかり、そしてお金がかかります。スケジュールを立てられるだけの仕様書がないということは、製品を開発するのにどれくらい時間がかかり、どれくらいのお金がかかるか分からないということです。

あなたは値段を見ずにジーンズを買ったりしないだろう。

まとめ

Joel on Softwere」の仕様書を書く理由を自分なりに解釈してますが、ほかにも仕様書を書かないことによってこんな問題があるよってのがあれば教えて欲しいです。仕様書の書き方については「達人プログラマー」が参考になります。これはまたいつかまとめたいと思います。できれば。

参考資料




こちらもオススメ!

IDEA*IDEAの『データが自動で消えてくれる機能』の名前を考えてみた

7月 3rd, 2008 Posted in AGAG, web | No Comments »

CakePHPでWebアプリを作ろうってときにかなりお世話になったIDEA*IDEAで「『データが自動で消えてくれる機能』に名前をつけたい」というエントリーがあり、個人的にタイムリーなため反応してみます。

キーワードを登録すると、自動で最新のAmazonの商品リンクを表示してくれるAGAGというサービスを公開しています。先日アップデートしたAGAGですが、ユーザ登録しなくても使えるAGAGサーチシンプル版には、「30日間発行したコードからのアクセスがなかった場合、データを削除する」機能があります。

この機能はユーザのためというより、管理者の都合のために実装した機能ですが、IDEA*IDEAで出てくるのはまさにこの機能ですよね。たぶん。

さて、この機能に名前を付けるとしたら・・・・。

イメージ的には不要なメモリを解放するガベージコレクションのDB版かなぁという感じなので、そのまんまで「ガベージコレクション」?

あ、でもDBのガベージコレクションは、ディスク上にできた未使用領域を削除する機能だから違いますね。ガベージコレクションとは別物だけど、ちょっとそれっぽい感じで「ガベージフリー」?「ガベージリリース」?

これだとDBのデータを消すってのはわかりにくいですね。っていうかユーザから見た場合、消えるデータがDBのデータかどうかは関係なく、自分のデータが消えてくれるってのが分かるような名前がいいですね。だとすると、「オートクリアー」?

「30日アクセスがない場合に、データを自動で削除する「オートクリアー」機能を搭載しました。」

すでにありそうな名前ですねぇ。

やっぱり「ガベージダンプ」がかっこいいな。メモリっぽいけど。
センスないなぁ。

【関連記事】
AGAG – Amazonアソシエイトサポートツール リリース
AGAG – Amazonアソシエイトサポートツール アップデート

こちらもオススメ!

DropBoxがとんでもなく便利な件

6月 28th, 2008 Posted in web | No Comments »

会社の人にDropBoxの招待状をもらったので使ってみています。

dropbox.jpg

DropBoxというのはアメリカで開発されているオンラインストレージで、現在クローズドベータ版ってことで、招待がないと使えません。

オンラインストレージなんていまさらって感じですが、DropBoxは今までの常識をがっつり裏切られました。

DropBoxのすごいとこ

クライアントアプリをPCにインストールしておけば、「My Dropbox」フォルダ内のファイルが自動的にDropBoxにアップロードされます。そして複数のPCにクライアントアプリをインストールしておくと、1台のPCの「My Dropbox」に保存されたファイルはDropBoxへアップロードされたあと、残りのPCの「My Dropbox」が同期されます。

さらにDropBoxではファイルのバージョン管理もやってくれるので、ファイルを変更した後でも、古いバージョンのファイルにアクセスできます。また、ほかのユーザを指定してフォルダを共有することができます。

バージョン管理機能、共有機能が充実しているので、複数人で進める開発プロジェクトなんかにも使えそうですネ!

DropBoxは普通にエクスプローラでファイル操作を行うとオンラインストレージに反映されるので、操作が簡単ってレベルではありません。これは一回使うとほかのが使えませんよ。

とりあえず現段階では無料で使えてますが、今後正式版になったときに料金体系がどうなるか不安ですね。

こちらもオススメ!
    None Found

AGAG – Amazonアソシエイトサポートツール アップデート

6月 28th, 2008 Posted in AGAG | 2 Comments »

AmazonアソシエイトサポートツールのAGAGをアップデートしました。
AGAG – Amazonアソシエイトサポートツール

今回のアップデート内容は、

「会員登録しなくても使えるAGAGサーチ シンプル版」

の機能追加です。
会員登録なしで使えるなら最初からそうしとけよって話ですが、フル機能はやっぱり会員登録しないと使えないので、今回はシンプル版ということで若干機能を制限しています。

AGAGサーチというのは、キーワードを登録しておくと、そのキーワードで検索した結果を発売日順に表示する機能です。

AGAGサーチ シンプル版で制限される機能

  • シンプル版では、30日以上コードを貼ったWebサイトなどからアクセスがない場合はデータが削除されます。
  • フル機能版では、コード発行後もコードを変更することなくキーワードや表示個数など、内容を変更することができます。
  • シンプル版では、表示するときに1割の割合でAGAG管理者のアソシエイトIDが商品に組み込まれます。

会員登録しなくても利用できるので、ためしに使ってみてください。

こちらもオススメ!

C++でバイト列をBase64や16進数表示へ変換

6月 27th, 2008 Posted in C++ | 2 Comments »

バイト列をBase64や16進数表示へ変換

C++でバイト列をBase64変換するには、暗号化で使用するCrypt APIが使えます。Crypt APIにCryptBinaryToStringという関数があり、これを使うとBase64変換や16進数のASCII表示が簡単にできます。じつは、自前でBase64変換とか実装した後に気がついたんですけどね。

CryptBinaryToStringを使うには、Crypt32.libをリンクしてwincrypt.hをインクルードします。引数は次のとおりです。

第1引数:const BYTE*:変換元データ
第2引数:DWORD:変換元データのサイズ
第3引数:DWORD:変換形式のフラグ
第4引数:LPTSTR:変換後データ
第5引数:DWORD*:変換後データサイズ

CryptBinaryToStringの第3引数にフラグで変換形式を指定します。フラグは次のとおり。

  1. CRYPT_STRING_BASE64HEADER
  2. CRYPT_STRING_BASE64
  3. CRYPT_STRING_BINARY
  4. CRYPT_STRING_BASE64REQUESTHEADER
  5. CRYPT_STRING_HEX
  6. CRYPT_STRING_HEXASCII
  7. CRYPT_STRING_BASE64X509CRLHEADER
  8. CRYPT_STRING_HEXADDR
  9. CRYPT_STRING_HEXASCIIADDR

Base64文字列のみが欲しい場合は「CRYPT_STRING_BASE64」を指定します。「CRYPT_STRING_BASE64HEADER」や「CRYPT_STRING_BASE64REQUESTHEADER」を指定すると、前後に文字列が付いてきます。16進数で表示する場合は、「CRYPT_STRING_HEX」を指定します。16進数とASCII文字を表示する場合は、「CRYPT_STRING_HEXASCII」。16進数とASCII文字とアドレスを表示する場合は、「CRYPT_STRING_HEXASCIIADDR」。実際に試してみるとわかるのでフラグを変えていろいろやってみてください。

第4引数にNULLを指定すると第5引数に変換後のデータサイズが返ってくるので、メモリを確保してもう一度この関数を呼びます。

表示例

CRYPT_STRING_HEXASCIIADDRを指定するとバイト列は次のような文字列へ変換されます。

  1. 0000    81 29 fd 28 07 38 c6 a1  c8 fe a6 fd ce 5a 79 eb   .).(.8.......Zy.
  2. 0010    bb 8c 3c 75 be 6c 8b 72  d1 14 d3 5e 4d 70 73 2b   ..<u.l.r...^Mps+
  3. 0020    25 5b f0 87 88 bd ec 1e  3b 06 e0 88 6d 23 60 bf   %[......;...m#`.
  4. 0030    a4 9f af 57 aa b9 ca 06                            ...W....

CRYPT_STRING_BASE64を指定するとバイト列は次のような文字列へ変換されます。

  1. gSn9KAc4xqHI/qb9zlp567uMPHW+bIty0RTTXk1wcyslW/CHiL3sHjsG4IhtI2C/pJ+vV6q5ygY=

Base64文字列や16進数表示をバイト列に変換

Base64文字列や16進数表示からバイト列に変換する場合は、CryptStringToBinaryを使います。第5引数まではCryptBinaryToStringと同じです。第3引数にはCryptBinaryToStringのフラグに加えて、次のフラグが指定できます。

  1. CRYPT_STRING_BASE64_ANY
  2. CRYPT_STRING_ANY
  3. CRYPT_STRING_HEX_ANY

第6引数:DWORD*:文字列で実際にBase64文字列や16進数文字列が始まるまでの文字数を返します。NULLも指定できます。
第7引数:DWORD*:実際に変換に使われた形式のフラグが返ります。NULLも指定できます。

第7引数の使い道としては、変換しようとしている文字列が、次のうちどれで変換されたものかわからない場合に、

  1. CRYPT_STRING_HEXADDR
  2. CRYPT_STRING_HEXASCIIADDR
  3. CRYPT_STRING_HEX
  4. CRYPT_STRING_HEXRAW
  5. CRYPT_STRING_HEXASCII

第3引数にCRYPT_STRING_HEX_ANYをしていすると、正しい変換形式が自動で選択されて、第7引数に選択された変換形式が返ってくるという仕組みです。

詳しくは、CryptStringToBinary Function (Windows)を熟読してください。

実装例

では、例として次の4つの変換についてC++のコードを載せておきます。

  • バイト列を16進数のASCII表示に変換する
    1. DWORD dwDst = 0;
    2. LPTSTR pstrDst = NULL;
    3. if( CryptBinaryToString( bSrc, nLen, CRYPT_STRING_HEXASCIIADDR, NULL, &dwDst ) ){
    4.        pstrDst = new TCHAR[ dwDst + 1 ];
    5.        if( CryptBinaryToString( bSrc, nLen, CRYPT_STRING_HEXASCIIADDR, pstrDst, &dwDst ) ){
    6.                //pstrDst:バイト列の16進数表示文字列
    7.        }
    8. }
    9. delete pstrDst;
  • 16進数のASCII表示をバイト列に変換する

    1. DWORD dwDst = 0;
    2. BYTE* pbDist = NULL;
    3. if( CryptStringToBinary( bSrc, nLen, CRYPT_STRING_HEXASCIIADDR, NULL, &dwDst, NULL, NULL ) ){
    4.        pbDist = new BYTE[ dwDst ];
    5.        if( CryptStringToBinary( bSrc, nLen, CRYPT_STRING_HEXASCIIADDR, pbDist, &dwDst, NULL, NULL ) ){
    6.                //pbDist:バイト列
    7.        }
    8. }
    9. delete pbDist;
  • バイト列をBase64文字列に変換する
    1. DWORD dwDst = 0;
    2. LPTSTR pstrDst = NULL;
    3. if( CryptBinaryToString( bSrc, nLen, CRYPT_STRING_BASE64, NULL, &dwDst ) ){
    4.        pstrDst = new TCHAR[ dwDst + 1 ];
    5.        if( CryptBinaryToString( bSrc, nLen, CRYPT_STRING_BASE64, pstrDst, &dwDst ) ){
    6.                //pstrDst:Base64文字列
    7.        }
    8. }
    9. delete pstrDst;
  • Base64文字列をバイト列に変換する
    1. DWORD dwDst = 0;
    2. BYTE* pbDist = NULL;
    3. if( CryptStringToBinary( bSrc, nLen, CRYPT_STRING_BASE64, NULL, &dwDst, NULL, NULL ) ){
    4.        pbDist = new BYTE[ dwDst ];
    5.        if( CryptStringToBinary( bSrc, nLen, CRYPT_STRING_BASE64, pbDist, &dwDst, NULL, NULL ) ){
    6.                //pbDist:バイト列
    7.        }
    8. }
    9. delete pbDist;
こちらもオススメ!

C++でUTF-8をShift-JISに変換する

6月 25th, 2008 Posted in C++ | 1 Comment »

前回、Shift-JISをUTF-8に変換する方法を書きました。今回は逆のUTF-8をShift-JISに変換する方法です。

この変換も、

UTF-8→UTF-16→Shift-JIS

の順番で変換する必要があります。

以下が変換のコードです。エラー処理は省略しています。

  1. BOOL ConvUtf8toSJis( BYTE* pSource, BYTE* pDist, int* pSize )
  2. {
  3.    *pSize = 0;
  4.  
  5.    //UTF-8からUTF-16へ変換
  6.    const int nSize = ::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, NULL, 0 );
  7.  
  8.    BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ];
  9.    ::MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pSource, -1, (LPWSTR)buffUtf16, nSize );
  10.  
  11.    //UTF-16からShift-JISへ変換
  12.    const int nSizeSJis = ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, NULL, 0, NULL, NULL );
  13.    if( !pDist ){
  14.        *pSize = nSizeSJis;
  15.        delete buffUtf16;
  16.        return TRUE;
  17.    }
  18.  
  19.    BYTE* buffSJis = new BYTE[ nSizeSJis * 2 ];
  20.    ZeroMemory( buffSJis, nSizeSJis * 2 );
  21.    ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)buffUtf16, -1, (LPSTR)buffSJis, nSizeSJis, NULL, NULL );
  22.  
  23.    *pSize = lstrlen( (char*)buffSJis );
  24.    memcpy( pDist, buffSJis, *pSize );
  25.  
  26.    delete buffUtf16;
  27.    delete buffSJis;
  28.  
  29.    return TRUE;
  30. }

この関数の使用方法は、まずはじめにpDistにNULLを渡して変換後のサイズを取得します。変換後のサイズでpDistのメモリを確保したあと、もう一度この関数を呼びます。

次のような感じ。

  1. int nSize = 0;
  2. ConvSJisToUtf8( pSource, NULL, &nSize );
  3. BYTE* pDist = new BYTE[ nSize + 1 ];
  4. ZeroMemory( pDist, nSize + 1 );
  5. ConvSJisToUtf8( pSource, pDist, &nSize );

次回はBase64変換について書きます。

こちらもオススメ!

C++でShift-JISをUTF-8に変換する

6月 11th, 2008 Posted in C++ | 1 Comment »

Windowsアプリケーションでもネットワークにつながって、サーバアプリケーションと連携することが多くなってきてますねぇ。ネットワークといえば文字コードはUTF-8なイメージがあるワタクシですが、C++ではShift-JISなアプリばっかり作ってきたので、UTF-8に変換するにはどうしたらいいの?ってことでまとめます。

C++でShift-JISをUTF-8に変換するには、

Shift-JIS→UTF-16→UTF-8

の順番で変換する必要があります。

そもそも、UTF-16とUTF-8はどう違うのか。UTF-16は文字に割り当てられる番号(コードポイント)が2バイトで格納されます。一方UTF-8は、0~127のコードポイントは1バイトで格納され、128から上のコードポイントは、2~6バイトで格納されます。0~127のコードポイントでは、ASCIIと同じ文字が定義されているので、英語のテキストを扱うときには、ASCIIとUTF-8でまったく同じになります。

このあたりのことは、「Joel on Software」にわかりやすく解説してあります。

「Joel on Software」には、Unicodeに関する項目を「すべてのソフトウェア
開発者が絶対確実に知っていなければならないUnicodeとキャラクタセットに
関する最低限のこと(言い訳なし!)」として解説してあり、この項目を読むだけでもこの本を買う価値はあると思います。もちろん他の項目もすごくためになります。なかりおすすめ。

実際の変換はコードを見ればわかると思います。エラー処理は省略しています。

  1. BOOL ConvSJistoUtf8( BYTE* pSource, BYTE* pDist, int* pSize )
  2. {
  3.    *pSize = 0;
  4.  
  5.    //ShiftJISからUTF-16へ変換
  6.    const int nSize = ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)
  7. pSource, -1, NULL, 0 );
  8.  
  9.    BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ];
  10.    ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, (LPWSTR)
  11. buffUtf16, nSize );
  12.  
  13.    //UTF-16からShift-JISへ変換
  14.    const int nSizeUtf8 = ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)
  15. buffUtf16, -1, NULL, 0, NULL, NULL );
  16.    if( !pDist ){
  17.        *pSize = nSizeUtf8;
  18.        delete buffUtf16;
  19.        return TRUE;
  20.    }
  21.  
  22.    BYTE* buffUtf8 = new BYTE[ nSizeUtf8 * 2 ];
  23.    ZeroMemory( buffUtf8, nSizeUtf8 * 2 );
  24.    ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)buffUtf16, -1, (LPSTR)
  25. buffUtf8, nSizeUtf8, NULL, NULL );
  26.  
  27.    *pSize = lstrlen( (char*)buffUtf8 );
  28.    memcpy( pDist, buffUtf8, *pSize );
  29.  
  30.    delete buffUtf16;
  31.    delete buffUtf8;
  32.  
  33.    return TRUE;
  34. }

この関数の使用方法は、まずはじめにpDistにNULLを渡して変換後のサイズを
取得します。変換後のサイズでpDistのメモリを確保したあと、もう一度この関数を呼びます。

次のような感じ。

  1. int nSize = 0;
  2. ConvSJisToUtf8( pSource, NULL, &nSize );
  3. BYTE* pDist = new BYTE[ nSize + 1 ];
  4. ZeroMemory( pDist, nSize + 1 );
  5. ConvSJisToUtf8( pSource, pDist, &nSize );

次回はUFT-8をShift-JISに変換する方法です。
今回の逆なだけです。

こちらもオススメ!

AGAG – Amazonアソシエイトサポートツール リリース

6月 8th, 2008 Posted in AGAG, cakePHP, PHP | No Comments »

Amazonアソシエイト・プログラム(アフィリエイト)の利用をサポートするAGAGというサービスを開始しました。

AGAG – Amazonアソシエイトサポートツール
http://www.agag.its55.com/

AGAG

Amazonアソシエイト・プログラムを使用して雑誌などを紹介しようとすると、雑誌が発売されるたびにリンクを変更しなくてはいけなくて、とても面倒でした。そこで、キーワードを登録しておくと自動で最新の商品を表示するサービスを作ってみました。

商品を検索するキーワードを登録しておくと、AGAGの自動サーチ機能が毎日自動でAmazonに検索をかけて、その検索結果を新しい商品から指定個数分表示します。AGAGが発行するコードをブログなどに貼っておくと、勝手にブログに表示される商品が新しいものに変わります。

このサービスを利用するには、ユーザ登録が必要です。

このサービスはCakePHPを使って作りました。初めてCakePHPで作ったサービスで、CakePHPってどんな感じかなというのを探るために作りました。

作ってみた感想ですが、CakePHPいい!

それほど難しいことはしてなくて、CakePHPができる範囲内で作ればかなり楽です。まあセッション周りとかちょこちょこ思い通りにならないこともあったけど、それを妥協しても作りやすさを選んだほうがプライベートで作るにはいいのかなと思ってます。

AGAGに関しての質問や要望などありましたら、このブログにてご連絡ください。

AGAGは今後機能追加などしていく予定です。

こちらもオススメ!

coreserverにgo-pearをインストールする

5月 26th, 2008 Posted in PHP, サーバー | 2 Comments »

coreserverにPEARの管理ツールgo-pearをインストールしてみました。手順は次のとおり。

/public_html以下のブラウザからアクセスできるところにgo-pearのファイルをコピーするディレクトリを作成します。テキトウに。PEARをインストールするディレクトリはブラウザからアクセスできないところにしたほうがいいでしょう。今回は、次のディレクトリにインストールしました。

  1. /virtual/xxx/lib/go_pear/

パーミッションは777としときます。

go-pearはhttp://pear.php.net/go-pearをすべてコピー&ペーストで「go-pear.php」というファイル名でローカルに保存した後サーバへアップロードしました。

ブラウザからgo-pear.phpにアクセスします。「Welcome to go-pear 1.1.1!」のページでは、Next>>をクリックします。

Configurationの「1. Installation prefix ($prefix)」にインストール先のディレクトリを指定します。

  1. /virtual/xxx/lib/go_pear/

「10. Filename of WebFrontend」にブラウザからアクセスできるディレクトリを指定します。Installボタンをクリックするとインストールが開始し、しばらくたつとインストール完了の画面に移行します。

coreserverではPHPはデフォルトでSAFEMODEで動いています。PEARの管理画面はSAFEMODEだと使えないみたいなので、CGIで動かすように設定する必要があります。CGIで動かすには、PHPをCGIとして動かす方法について – CORESERVER.JP:コアサーバーに書いてあるように以下の内容を.htaccessとしてファイルに保存しサーバの「10. Filename of WebFrontend」で指定したディレクトリへアップロードします。

  1. AddHandler application/x-httpd-phpcgi .php

PEARの管理画面には認証をかけたほうがいいので、Basic認証の設定をしときます。「10. Filename of WebFrontend」で指定したディレクトリの.htaccessに以下を付け加えます。

  1. AuthType Basic
  2. AuthName "Input your ID and Password."
  3. AuthUserFile /virtual/xxx/.htpassword
  4. require valid-user

coreserverの管理画面で「ツール」から.htpasswordに記述する文字列を生成し、その文字列を.htpasswordにコピー&ペーストし、AuthUserFileで指定したディレクトリに保存します。

PEARを使う場合は、PHPのインクルードパスにPEARのパスを追加します。たとえばPHPのコードでインクルードパスを追加する場合は次のように実装します。

  1. $path = "/virtual/xxx/lib/go_pear/PEAR/";
  2. $inc_path = get_include_path();
  3. set_include_path(get_include_path() . PATH_SEPARATOR . $path);
こちらもオススメ!

Windows Vistaを工場出荷の状態に戻したときのメモ

5月 7th, 2008 Posted in ローカル環境 | No Comments »

自宅のPCの調子が悪くなってきたのでOSを工場出荷時の状態に戻したので、そのメモ。

PCはDELLのinspiron1520。起動するときにF8を押すと「詳細設定ブートオプション」画面に移行するので、そこで「コンピュータの修復」を選択する。

基本的に、画面の指示に従うだけだけど途中でユーザ名とパスワードを聞かれる。設定した覚えはないけど適当に入れてたら認証された。

システム回復オプションダイアログで「デル出荷時のイメージの復元」を選択。

データ削除の確認画面で、「はい、ハードディスクを再フォーマットして、システムソフトウェアを出荷時の状態に復元します。」にチェックを入れる。

復元後はできる限りもとの環境に戻るようにがんばるのみ。

めんどくさかったアプリ

Adobe Lightroom

写真データがCドライブに入っていたので、全部リムーバブルドライブに移動。Lightroomのカタログ関連一式(プレビューとか)をバックアップしておく。OS復元後は、写真データを復元前と同じパスに配置する。バックアップしたカタログファイルをLightroomで読み込めば、現像や管理データがすべて元通り。

XAMPP

インストールはzipを回答してsetup_xampp.batを叩くだけ。xampp-control.exeからApacheを起動しようとしても起動できない現象が発生。原因はskypeがポート80を使っているから。skypeのメニュー[ツール]-[設定]より設定ダイアログを起動し、[詳細]-[接続]の「上記のポートに代わり、ポート80を使用」のチェックをはずすとOK。

こちらもオススメ!