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

Archive for the ‘プログラミング’ Category

mac os x でcoreserverにSSHで接続する

土曜日, 5月 30th, 2009 Posted in mac, サーバー | No Comments »

macを買ったので、できるだけ作業はmacでやるようにしていますが!

ちょっとしたことをやるのでも、Windowsでは簡単に出来ていた事がmacでやるとなると、いちいちgoogle先生に聞かないとわかりません。

というわけで、今回はmacでcoreserverにSSHで接続する方法を調べたので、メモ。

まず、ブラウザでcoreserverにログインして、管理メニューのホスト情報で[SSH登録]ボタンをクリックします。ホスト情報が登録されるのに5分程度かかるので、その間にmacでFinderのメニュー[移動]-[ユーティリティ]で表示されるウィンドウの中から、「ターミナル.app」を起動。

ターミナルで、次のようにログイン。

  1. $ ssh <ログイン名>@<ホスト名:例xx.coreserver.jp>

するとなんか次のように聞かれたので、適当にyesと答えます。

  1. Are you sure you want to continue connecting (yes/no)? yes

するとパスワードを聞かれるので、coreserverのFTP設定のFTPパスワードと同じパスワードを入力します。これで、うまくいくとログイン完了!

無名のnamespaceの中にstatic?

水曜日, 1月 14th, 2009 Posted in C++ | 2 Comments »

C++の名前空間を定義するnamespaceってあんまり使わない。たぶん有用な使い方があるんだろうと思うけど、所属しているチームではほとんど使われていないので、今まで積極的に使おうとは思っていなかった。

using namespaceはたまに使う。まあアレです。

  1. using namespace std;

です。これを書いておくと

  1. std::vector v;

  1. vector v;

って書くことができる。

無名のnamespace

最近、新しいプロジェクトに関わるようになってきて、初めてのコードをよく読むようになりました。その中で、cppファイルのグローバルな領域に以下のような記述が。

  1. namespace {
  2.     const TCHAR szHoge[] = _T("Hoge\Hoge");
  3. }

ほう、こういう書き方があるるんだねぇと思って調べると、無名の名前空間はグローバルなstatic変数に変わる書き方で、C++ではグローバルなstaticの代わりに無名の名前空間を使うことが推奨されているらしい。

なるほど。無名の名前空間内の変数はグローバルなstatic変数と。よしよし。

と思って他のソースを読んでいると、今度は以下のような記述が!

  1. namespace {
  2.     static const int nHoge = 50;
  3. }

“static const”は定数を定義するときに使うんだけど、無名の名前空間内にstaticを付ける意味ってあるんだろうか。よくわからんのでこのコードを書いた人に聞いてみよう。

追記:書いた本人に聞いてみた

無名の名前空間内のstatic変数ですが、これはもともと

  1. static const int nHoge = 50;

だったコードがあって、チーム内の方針でグローバルな静的変数は無名の名前空間内で定義するように変更しようってことで、staticは付けたまま上記のようになったということです。つまりあんまり深い意味はないそうです。

C++のrand()関数でRAND_MAX以上の乱数を作る方法

火曜日, 1月 13th, 2009 Posted in C++ | 2 Comments »

C++で乱数を発生させるときに使うrand関数ですが、これは乱数の最大値がRAND_MAXまでなんですよね。で、今までは乱数と行っても0から1までとか、0から256までとかの範囲で求めることしかなかったので、あんまり気にしていなかったんですが、このRAND_MAXって0x7FFFって定義されているんです。

このあたりのことで以下のブログが実験してます。この人もrand()の最大値を意識していなかったってことですかね。

rand() の最大値 RAND_MAX (株式会社ディア Dear inc.)

それで、今回0xFFFFまでの乱数を発生させる必要があったんですが、これをどうやればrand()で実現できるか。よくわかりませんでした・・・。

範囲指定の公式があるらしい

乱数によると、rand()関数を使ってある範囲の乱数を作るときの公式は、以下となります。

  1. 最小値 + (int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX) )

rand()を二乗することによって

  1. 0x7FFF × 0x7FFF = 0x3FFF0001

まで乱数を発生させることができます。これを上の式に当てはめると、

  1. 最小値 + (int)( rand() * rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX * RAND_MAX) )

となるのかな?ここで最小値は0を想定しているので、

  1. rand() * rand() * (最大値 + 1.0) / (1.0 + RAND_MAX * RAND_MAX)

となります。これって結局、

  1. (rand() * rand()) % (最大値 + 1.0)

と同じことですね。

ただrand()を使う方法だと偶数が出現する確率が大きくなるらしいので、精密な乱数が欲しい場合には乱数発生関数を自作するのがよさそうですね。

WordPressをME2.2.3から本家日本語版2.7へ変更した

日曜日, 1月 11th, 2009 Posted in web, サーバー | No Comments »

2008年12月14日にWordPress2.7日本語版がリリースされたってことで、少し調べると管理画面がステキになったらしい。そして最近テンプレートを変えようとしたときに、対応していない関数が使ってあったりで上手く動かなかったので、アップグレードでもしようかと3秒くらい考えて、とりあえずWordPress2.7日本語版をダウンロード。

ボクがいままで使っていたのはWordPress ME 2.2.3で、これをWordPress2.7日本語版にアップグレードするのは、データベースの構造がぜんぜん違うのでムリってなことが書いてあるサイトがあったので、手動でやろうかなーとか思っていたところ以下のブログを発見。

WordPredd 2.6 へ Upgrade 完了!! | ぶっちろぐ

WordPress MEからWordPress2.6でも大丈夫っぽいことが最後の方に書いてあったので、ここは思い切って一気に2.7まで飛ばしてみた。以下やったことをまとめます。あ、ちなみにアップグレードしたのはこのブログではありません・・・。あ、ちなみにアップグレードしたのはこのブログではありません・・・。

WordPress ME 2.2.3をWordPress2.7日本語版へアップグレードしたときのやったことメモ

  • 現行のDBをバックアップ。

    coreserverのphpMyAdminですべてエクスポート。テキトウにファイル名をつけてファイルに落とす。

  • インストールディレクトリ以下をすべてダウンロード。

    バックアップのため。

  • サーバのWordPressインストールディレクトリのwp-content意外をすべて削除。
  • サーバのWordPressインストールディレクトリにWordPress2.7の解凍したファイルをすべてアップロード。
  • ローカルにバックアップしたwp-config.phpをサーバのWordPressインストールディレクトリにアップロード。
  • ローカルにバックアップした.htaccessをサーバのWordPressインストールディレクトリにアップロード。
  • http://blog.its55.com/wp-admin/upgrade.phpにアクセスしてアップグレードを実行。

最初に、上記にアクセスしたときに「アップグレードする必要がありません。」って言われた。アップグレードする前に。一瞬なにが起きたのか理解できなかったけど、よくよく考えたらwp-config.phpをアップロードするのを忘れていた。

アップグレード自体は特に問題なく終了。

WordPress2.7日本語版をちょっと使ってみて

まず管理画面がすごく使いやすい。WordPress ME 2.2.3のときは管理画面に入るのがいやになるくらい管理画面はひどかった。2.7の管理画面は見た目も機能も洗練されていて、ログインするのが楽しい。これは記事を書くモチベーションにも影響すると思う。

実際書くかどうかは別ですが。

FAILEDマクロでS_FALSEはひっかからない

火曜日, 10月 7th, 2008 Posted in C++ | No Comments »

いつもどっちかよくわからなくなるのでメモ的にエントリー。次のコードを実行すると・・・

  1. TRACE( "S_FALSE Test\n" );
  2. HRESULT hr = S_FALSE;
  3. if( FAILED( hr ) ){
  4.     TRACE( "FAILED\n" );
  5. }else{
  6.     TRACE( "Not FAILED\n" );
  7. }
  8.  
  9. TRACE( "E_FAIL Test\n" );
  10. hr = E_FAIL;
  11. if( FAILED( hr ) ){
  12.     TRACE( "FAILED\n" );
  13. }else{
  14.     TRACE( "Not FAILED\n" );
  15. }

次のように出力される。

  1. S_FALSE Test
  2. Not FAILED
  3. E_FAIL Test
  4. FAILED

なぜなら、FAILEDやSUCCEEDEDは次のように定義してあって、

  1. #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
  2. #define FAILED(Status) ((HRESULT)(Status)<0)

S_OK,S_FALSE,E_FAILは次のように定義してあるから。

  1. #define S_OK        ((HRESULT)0x00000000L)
  2. #define S_FALSE     ((HRESULT)0x00000001L)
  3. #define E_FAIL      _HRESULT_TYPEDEF_(0x80000008L)

AIR Business Community ワークショップに参加してきました

日曜日, 10月 5th, 2008 Posted in AIR, Flash | 4 Comments »

福岡のAIR CommunityのAIR Business Communityのワークショップに参加してきました。

AIR Business Communityは発足したばかりで、ワークショップも今回が一回目ということでした。

ステキな参加者のみなさん

はじめに1時間くらいの時間をとって、自己紹介と名刺交換を行いました。プログラマ、デザイナ、学生などいろんな人種の方々が参加していて、普段接することのないような方々とのコミュニケーションがとれました。

自己紹介の後に、参加者の方が作成したAIRアプリの紹介がありました。

  • soraさん

    Windows/Mac/Linuxそれぞれの言語によるHello, Worldアプリがどんだけめんどくさいかってことを説明したあと、AIRだと簡単にWindows/Mac/Linuxで動くHello, Worldが作れますよっていうプレゼン。AIRというより、今回のためにWindows/Mac/LinuxそれぞれでHello, World作るのがすごい。

  • Shikajiroさん

    Mashup Awardsに応募したというEdBrowserのデモ。なんというかさすがAIRという感じ。ActionScriptの3Dライブラリを使うと簡単に(?)3D表現が実現できるようです。3Dやってみたいね。

  • 最後にKagasawaさん

    RSSリーダーのデモと、実装方法なんかの解説。AIRからデータベースを使っていたり、かなり本格的なアプリに仕上がってました。AIRではポップアップしたモーダルダイアログがアプリの境界内でしか表示できない現象を回避する方法が聞けなかったのが残念。

開発環境の構築について

今回のワークショップの内容はAIRを開発するための開発環境の構築がメインでした。ボクはAIRの開発はFlashDevelopというフリーのツールを使っていますが、ワークショップではeclipse + AIR GEARで進めていました。

普段FlashDevelopを使っているボクがeclipse + AIR GEARをさわってみて感じたことをちょっと書きます。

  • GUIエディターはスゴイ!と思ったけど・・・

    最初はやっぱりGUIでコントロールとか配置できるのは便利だなぁとか思ったけど、FlashDevelopはMXMLもコード補完してくれるからなくても別に困らないと思います。

  • コード補完してくれない!?

    どうやら今のバージョンではAS3やMXMLのコード補完やってくれないみたいです。これは結構痛いかも。

  • FlashDevelopに比べるとインストールが楽

    eclipse + AIR GEARをインストールするには、eclipse / pleiades / GEF / AIR SDK / Flex3 SDK / AIR GEARをインストールする必要があって、ぱっと見はめんどくさそうなんだけど、eclipseは解凍するだけだし、pleiades / GEF / AIR GEARは解凍したファイルをeclipseのフォルダにコピーするだけ。なので意外にさくさく進みます。FlashDevelopは、Java runtime / .NET Framework runtime / FlashDevelop / Flex3 SDKを入れる必要があります。数は少ないですが、一つ一つが入れるのめんどくさいです。

感想

このようなコミュニティに参加したのは初めてで、最初は不安でしたがみなさん良い人ばっかりで、すぐになじめたと思います。たぶん。20数名の参加だったと思いますが、ほとんどの方々と名刺交換をさせていただいて、少しの時間ですがお話しできて刺激になりました。

人が作っているものをみるとやる気になりますね。ワタクシもAIRでなんか作ろうかな。

WindowsアプリケーションのUIとしてFLASHを使う方法

木曜日, 8月 21st, 2008 Posted in C++, Flash | 3 Comments »

最近はAIRなんかが出てきて、デスクトップアプリのUIをFLASHで表現することが簡単になりました。

が、AIRではセキュリティに考慮してか、いろいろと制限があります。例えばレジストリがいじれないとか、デバイスが使えないとか。

まあそれはいいとして、WindowsのアプリケーションのUIとしてFLASHを使えれば、裏ではごりごりめんどくさいことやりつつも、UIはFLASHでステキな感じにできたりしますよね。

そんなわけで、WindowsアプリケーションのUIとしてFLASHを使う方法を解説します。

環境

開発環境は、VC6を想定しています。ボクの環境がVC6なので・・・。

Flash Playerは6以上で動くことを確認しています。今のバージョンが9とか10なので、まあ問題ないと思います。ActionScriptは2で確認しています。3もたぶん大丈夫だと思います。

WindowsアプリケーションとFlashの連携イメージ

わかりにくい絵で申し訳ないですが、以下がWindowsアプリケーションとFlashの連携イメージです。

win_flash.png

CWnd派生のCShockwaveFlashというクラスにFlashを貼り付けます。このCShockwaveFlashは、後で説明するFlashのOCXを挿入すると勝手に作られるクラスです。このクラスがFlash(SWF)と通信します。

FlashからWindowsへの通信は、ActionScriptで

  1. fscommand( param1, param2 );

をコールします。するとWindowsアプリケーション側の指定したコールバック関数に飛んできます。このコールバック関数には、command=param1、args=param2という引数がくるので、commandごとに処理を分けることができます。

WindowsからFlashへの通信は、CShockwaveFlashの関数をコールすることによりFlashを制御できます。しかし細かい制御は難しいと思います。FlashとWidnowsアプリケーションで担当する役割をうまいことわけて実装する必要があります。

Windowsアプリケーション側からFlashの文字列を変更するために、

  1. SetVariable("v_text1", "テスト");

が使えます。v_text1というのはActionScriptの変数です。文字列以外のクラスやArray、MovieClipなどを直接制御したり、値を設定したりなどはできないようなので、SetVariableをうまく使って制御することになります。

VC6のプロジェクトにFlashを埋め込む方法

  1. テキトウにVCのプロジェクトを作ります。
  2. メニュー-[プロジェクト]-[プロジェクトへ追加]-[コンポーネントおよびコントロール]より、[コンポーネントおよびコントロール キャラリ]ダイアログが開くので、[Registered ActiveX Controls]を開きます。
  3. [Shockwave Flash Object]を選択して[挿入]ボタンをクリックします。
  4. [このコンポーネントを挿入しますか?]で[OK]をクリックします。
  5. [クラスの確認]ダイアログで、ファイル名など問題なければ[OK]ボタンをクリックします。
  6. [コンポーネントおよびコントロール キャラリ]ダイアログを閉じます。

この段階で、CShockwaveFlashクラスがプロジェクトに追加されています。

Flashを貼り付けるCWnd派生のクラスを作成します。ここでは仮にCFlashWndとしておきます。CFlashWndに次のような関数を作ります。

  1. BOOL CFlashWnd::AddFlashWindow(CString strSwfPath)
  2. {
  3.     //初期化
  4.     ::OleInitialize(NULL);
  5.  
  6.     //---- Flash Ctrlを作成します
  7.     DWORD   dwStyle = WS_CHILD|WS_VISIBLE;
  8.     UINT    nID     = IDC_SAMPLEWND;
  9.     CRect rc;
  10.     rc.SetRect(/*Flashの表示位置・サイズを指定する*/);
  11.     if( m_flashWnd.Create( NULL, NULL, dwStyle, rc, this, nID ) == FALSE ){
  12.         return FALSE;
  13.     }
  14.  
  15.     //FlashCtrlウインドウにSWFを読み込む
  16.     if( !strSwfPath.IsEmpty() ){
  17.         m_flashWnd.SetMovie( strSwfPath );
  18.         m_flashWnd.Play();
  19.         m_flashWnd.SetMenu( false );        //右クリックメニューを抑制
  20.     }
  21.  
  22.     //FlashCtrlウインドウをwindowにFitさせる
  23.     if( IsWindow( m_flashWnd.GetSafeHwnd() ) ){
  24.         CRect   rcClient;
  25.         GetClientRect( rcClient );
  26.         m_flashWnd.MoveWindow( rcClient );
  27.     }
  28.  
  29.     return TRUE;
  30. }

CFlashWnd.hには次のメンバを定義します。

  1. private:
  2.     CShockwaveFlash     m_flashWnd;

これで、CFlashWndを

  1. ShowWindow( SW_SHOW );

してやればFlashが表示されるはずです。

WindowsアプリケーションとFlashの通信

Flashに文字列を渡すときは、次のように書きます。

  1. m_flashNews.SetVariable( "key", "value" );

Flash側で”key”という変数を用意しておくと、keyの値が”value”となります。Flash側のEnterFrameで”key”を監視しておくと、値がセットされたことがすぐにわかります。

Flashからのイベントを受け取るには、コールバック関数を指定します。

  1. BEGIN_EVENTSINK_MAP(CFlashNewsWnd, CWnd)
  2.     //{{AFX_EVENTSINK_MAP(CFlashNewsWnd)
  3.     ON_EVENT(CFlashNewsWnd, IDC_NEWSWND, 150, OnFSCommandShockwaveflash, VTS_BSTR VTS_BSTR)
  4.     //}}AFX_EVENTSINK_MAP
  5. END_EVENTSINK_MAP()

ここでは、OnFSCommandShockwaveflashという関数にコールバックが飛んでくるようにしています。

  1. void CFlashNewsWnd::OnFSCommandShockwaveflash(LPCTSTR command, LPCTSTR args)
  2. {
  3.     CString com = command;
  4.     CString arg = args;
  5.  
  6.     switch( com ){
  7.     case "key1":
  8.         // key1の時の処理
  9.         break;
  10.    
  11.     case "key2":
  12.         // key1の時の処理
  13.         break;
  14.  
  15.     default:
  16.         break;
  17.     }
  18. }

たぶんこれで動くと思いますが、もし動かなければコメントなどください。

coreserverにRuby on Rails 2.1.0をインストールしてみた

火曜日, 8月 5th, 2008 Posted in ruby, Ruby on Rails | 6 Comments »

coreserverにRuby on Rails 2.1.0をインストールしたので、作業の記録を残しておきます。

SSHでcoreserverに接続

railsを入れるには、SSHでサーバーにログインして作業する必要があります。

ボクはwindowsから作業するので、Tera Termを使用しています。このあたりからダウンロードすればいけると思います。

SSHでログインする前にcoreserverにどこから接続するかという情報を登録します。coreserverの管理メニューで、[ホスト情報登録]から[SSH登録]というボタンをクリックします。

そのまま待っとくと5分ほどで反映されてるはずですので、しばらくしてからTera Termをおもむろに起動します。

Tera Termを起動すると、接続の設定をするダイアログが開くので、TCP/IPのラジオボタンにチェックをいれ、ホストに[sxx.coreserver.jp]と入れます。coreserverの管理メニュー[FTP設定]のFPTサーバーを入れてください。サービスはSSHで、ほかはデフォルトでいけたと思います。

Tera Term - Ruby on Rails 2.1.0をインストール

[OK]をクリックすると、SSH認証のダイアログが開きます。ユーザ名とパスフレーズにそれぞれcoreserverの管理メニュー[FTP設定]のFPTアカウント、FPTパスワードを入れます。

Tera Term - Ruby on Rails 2.1.0をインストール

[OK]ボタンをクリックすると、coreserverに接続されます。[OK]ボタンをクリックしてもダイアログが閉じない場合は、coreserver側の準備ができていないので、もうちょっと待ってみてください。

RubyGemsのインストール

coreserverには最初からRubyが入っているので、Rubyはそれを使います。最初の作業は、パッケージ管理のRubyGemsをインストールすることです。まずは、~/.bashrcというファイルを作成して、PATHを通すために次を書きます。ファイルの編集の仕方はテキトウに調べてください。ボクはvimを使っています。

  1. export PATH=$PATH:$HOME/bin:$HOME/lib/ruby/gem/bin
  2. export RUBYLIB=$HOME/lib/:$HOME/lib/ruby
  3. export GEM_HOME=$HOME/lib/ruby/gem

この変更を反映するために、次を実行。

  1. >source ~/.bashrc

次にRubyGemsをダウンロードして解凍します。

  1. >mkdir ~/temp
  2. >cd ~/temp
  3. >wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
  4. >tar xvzf rubygems-1.2.0.tgz
  5. >cd rubygems-1.2.0
  6. >ruby setup.rb config --prefix=$HOME

途中でkillされることがあるので、その場合はもう一度

  1. >ruby setup.rb --prefix=$HOME

を実行します。終わったみたいに感じたら、バージョンを確認してみます。

  1. >gem -v
  2. >1.2.0

どうやら無事にRubyGemsが入ったみたいです。

railsのインストール

次にrailsを入れます。

  1. >gem install rails --include-dependencies

これだけでrailsがインストールされます。インストールが完了したらrailsのバージョンをチェックします。

  1. >rails -v
  2. >Rails 2.1.0

やったー!なんとかインストール成功!

サンプルアプリで動作確認

次はサンプルアプリを作り、ブラウザから動きを見てみます。

  1. >mkdir ~/ror_app
  2. >cd ~/ror_app
  3. >rails -d mysql adbook

いろいろなファイルが作成されます。~/ror_app/adbook/config/database.xmlをエディタで開き、developmentの以外の項目を削除して、developmentの必要な項目を記入します。

  1. development:
  2.   adapter: mysql
  3.   encoding: utf8
  4.   database: xxxx_adbook
  5.   username: xxxx_adbook
  6.   password: password
  7.   socket: /tmp/mysql.sock
  8.   host: localhost

databaseとusernameはcoreserverの場合、同じです。passwordはMySQLのパスワードを設定します。

このdatabase.xmlの設定をもとにrakeでDataBaseを作ります。

  1. >rake db:create:all

なぜか失敗します。database.xmlの書き方が悪いのかもしれないけど、よくわからんのでcoreserverのphpMyAdminでdatabaseを作成します。作成したdatabaseは、database.xmlで設定した内容と同じです。

scaffoldで一気にやっちゃいます。

  1. >ruby script/genarate scaffold adbook name:string phone;string address:string memo:text

最後にrakeでDBをmigrateします。

  1. >rake db:migrate

これでサンプルアプリの準備は完了ですが、ちょっと設定が必要です。~/ror_app/adbook/config/environment.rbの先頭に、次を追加します。

  1. $LOAD_PATH.push("/virtual/xxxx/lib/ruby")
  2. ENV['GEM_HOME'] ||= '/virtual/xxxx/lib/ruby/gem'

次に、~/ror_app/adbook/public/.htaccessを作成して、次のように記述します。

  1. AddHandler fastcgi-script .fcgi
  2. AddHandler cgi-script .cgi
  3. #AddHandler cgi-script-debug .cgi
  4. Options +FollowSymLinks +ExecCGI
  5.  
  6. RewriteEngine On
  7. RewriteBase /adbook/
  8.  
  9. RewriteRule ^$ index.html [QSA]
  10. RewriteRule ^([^.]+)$ $1.html [QSA]
  11. RewriteCond %{REQUEST_FILENAME} !-f
  12. RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
  13.  
  14. ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"

このサンプルアプリは~/ror_app/adbook/public/を公開しないとブラウザからは見れないので、ブラウザから見えるところからシンボリックリンクを張ります。

  1. >cd ~/public_html/www.xxxx.com
  2. >ln -s ~/ror_app/adbook/public/ adbook

これで、ブラウザからhttp://www.xxxx.com/adbook/にアクセスすればrailsの画面が出てきます。[About your application’s environment]と書いてあるところをクリックして、次のように表示されればOKです。

Ruby on Rails サンプルアプリ 成功

もし次のように表示された場合は、

Ruby on Rails サンプルアプリ 失敗

~/ror_app/adbook/public/.htaccessを次のように変更します。

  1. AddHandler cgi-script .cgi
  2. #AddHandler cgi-script .cgi
  1. #AddHandler cgi-script-debug .cgi
  2. AddHandler cgi-script-debug .cgi

これでもう一度http://www.xxxx.com/adbook/にアクセスして表示されるメッセージをたよりに原因を追究してみてください。原因がわかったら~/ror_app/adbook/public/.htaccessを元に戻さないと正常に表示されません。

正常に動作すると、http://www.xxxx.com/adbook/adbooksにアクセスするとアドレス帳が表示されます。[New adbook]からアドレスを追加してください。

ちなみにボクが今回作業したのは、http://www.its55.com/adbook/adbooksで確認できます。

Ruby on Rails 2.1.0 インストールしてみた

日曜日, 7月 20th, 2008 Posted in ruby, Ruby on Rails | 3 Comments »

いつかはやらんといかんなぁと思っていたRuby on Railsですが、AGAGローンチ後やる気がなくなっていたワタクシの頭に気合を入れる意味で、ローカルマシンに環境を作ってみましたよ。

今回は全面的に不真面目SEの生活さんを参考にさせていただきました。

Windows VistaにRubyのインストール

すでにローカルマシンにはXAMPPが入っているので、apacheとかMySQLとかのインストールは必要なくて、とりあえずRubyを入れてみました。

Rubyを入れるにはいろいろな方法があるみたいですが、ここはカンタンにOne-Click Ruby Installerを入れました。インストールは普通にカンタン。Rubyと関連モジュールなんか入れてくれるみたい。

ここでRubyのインストールができたか確認。コマンドプロンプトでRubyのバージョンを確認。

  1. >ruby -v
  2. ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

ちゃんと入ってるっぽい。

Ruby on Railsのインストール

One-Click Ruby InstallerでRubyGemsも入るので、次はRuby on Railsを入れる。

コマンドプロンプトで次を実行。

  1. >gem install rails --include-dependencies

[--include-dependencies]というオプションは依存パッケージを含めてインストールする指定みたいです。

しばらく待ってるとなにやら聞かれましたが、すべて[Y]で答えました。なにを聞かれたのかはよく覚えてません・・・。すみません。

終了してRailsのインストールができたか確認。

  1. >rails -v
  2. 'rails' は、内部コマンドまたは外部コマンド、
  3. 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

あれ?失敗してます。

原因がわからずもう一度RubyGemsからRailsをインストール。

  1. >gem install rails --include-dependencies

今回はさっきみたいに何か聞かれることはありませんでした。終了してRailsの確認。

  1. >rails -v
  2. Rails 2.1.0

おー、なんかよくわからんけど入りました。version2.1.0ですね。

サンプルを作ってみたっ

不真面目SEの生活さんのWindowsでRuby on Rails その2 Ruby・Ruby on RailsのインストールのWebrickを使って動かすサンプルを作ってみると、ちゃんと動きました。

次に、同じく不真面目SEの生活さんのWindowsでRuby on Rails その3 Ruby on RailsをCGIで動かすのapacheでcgiで動かしてみました。んが、Railsアプリフォルダ以下のpublicに.htaccessがない!とりあえず.htaccessを作成して、

  1. RewriteBase /adbook/

とだけ書いて保存。

  1. http://localhost/adbook/adbooks

にアクセスしてみたらエラー。

.htaccessを自分で作ったのが原因かと思って調べると、Rails2.1.0からpublic/.htaccessがなくなったらしい。その代わり.htaccessの書き方のサンプルが、Railsアプリフォルダ以下のREADMEに書いてありましたヨ!!わかんないって。.htaccessの内容は次のようにしました。コメントは削除してます。

  1. #AddHandler fastcgi-script .fcgi
  2. #AddHandler cgi-script .cgi
  3. #Options +FollowSymLinks +ExecCGI
  4.  
  5. RewriteEngine On
  6. RewriteBase /adbook/
  7. RewriteRule ^$ index.html [QSA]
  8. RewriteRule ^([^.]+)$ $1.html [QSA]
  9. RewriteCond %{REQUEST_FILENAME} !-f
  10. RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
  11.  
  12. ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
  1. http://localhost/adbook/adbooks

にアクセスするとちゃんと動いてる!

でもやっぱりRuby on Railsをcgiで動かすと遅いです。それはもうびっくりするくらい遅いです。

ソフトウェアを開発するときに仕様書を書くべき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」の仕様書を書く理由を自分なりに解釈してますが、ほかにも仕様書を書かないことによってこんな問題があるよってのがあれば教えて欲しいです。仕様書の書き方については「達人プログラマー」が参考になります。これはまたいつかまとめたいと思います。できれば。

参考資料