cakephp on eclipse PDT

あまりIDEを使った開発に慣れていないものですから、cakephp でのサイト製作が3案件めになって、少し余裕が出てきたところでようやくeclipse を使ってみようという気になりました。

そこで、PDTと、xdebug を使ってcakephpをステップ実行するまでの私の手順を書きたいと思います。

1.xamppの設定をいじったり、うにゃうにゃ

xamppのphp.ini を編集すると、xdebug を有効にすることができます。ここは、コメントをはずして、apacheを再起動するだけでカンタンに変更できました。

2. eclipse (PDT)をダウンロードして、デバッグ実行するも失敗

ブレークポイントでとまってくれません。「PDT ブレークポイント とまらない」などで検索するといろいろ記事が出てきて、「ワークスペースがDocumentRootの下に無いと動かない」みたいなことが書いてあるのですが、べつにそれが決定的な理由ではないみたいです(DocumentRootのしたに作っても動かなかったです)。

すんなりとはいかなかったですが、この方法は断念。

3. xampp 付きのPDTをダウンロードしてデバッグ実行

xamppが付いてきて、xdebugの設定なども入っているeclipse を以下のページの手順でダウンロードしたら、あっさりできました。

http://www.s-arcana.co.jp/tech/2011/02/eclipse-pdt-xdebug-php.html

結局、最初うまくいかなかった原因が何かわかりませんでしたが。。。

アナログ的な対応がeclipseには必要みたいです。

「Eclipse 押してだめなら 引いてみろ」

cakephpとruby on rails の違い

長年(もう3年ぐらいですかね)ruby on rails でシステムを作っていますが、最近小規模開発でその経験を生かそうということで、cakephp を始めました。

実際、cakephpがruby on rails を真似して作ったものということもあって、大枠は似通っていて敷居は低いのですが、なかをみてみると、なかなか。。。結構違いますね。

まずは、ボヤキから。

1. なんぼほど「array」「this」を書かなあかんねん~ <?php がめんどくさい~ シンボルってさいこう WEB上の情報少ない~ メソッド呼び出すのが . じゃなくて、 -> なのがめんどくさい~ 一もちと二文字は2倍の差があることを実感する~

2. active record のアソシエイション(hasManyとか)のメリットがよくわからん。rails だったら、 << とか、 - とかで、子供を引っ付けたり取ったり簡単にできて、あとは親を save すればいいんだけど、そんなことは出来ないみたい。配列に展開された子供をたどっていって変更してから、saveall みたいな。めんどくさい。

こどもの全削除は、 user.children = nil みたいに出来ないみたい。

それも、deleteがパラメータに id を指定しないといけないから、展開されたこともをLOOPして、それぞれのIDについて、DELETEを呼び出すみたいな。めんどくさい~。

cakephp は本当に、付け焼刃的にrails のパクリをしているというのがよくわかりました。

とはいえ、現段階では一番使いやすいPHPのフレームワークなんですかね。

jpmobile + SslRequirement

transit_sid :mobile にすると、機種によっては、HTTPのときとHTTPSの時でsession IDが変わってしまって、認証状態を正しく取得できないようです。

仕方ないので、transit_sid :always に変えました。

rails を SSLに対応させると、IEで警告発生

style シートなどを HTTPで取りに行っていると、IEで警告が出力されます。

config.action_controller.asset_host

をちゃんとはずしましょう!!

2010年1月1日 Google Apps で グループにメールが届かない

Google Apps で グループにメールが届かない障害が2010年1月1日から発生しているようです。

弊社が運営している携帯家計簿サイト「たまる家計簿」は ruby on rails で構築されているのですが、日時の稼動情報(ユーザの増加数や明細入力するの統計)や、rails でエラーが起こったときの通知メール(ExceptionNotifier を使用)の宛先に Google Apps のグループアドレスを使用しています。

それが、1月1日からいきなりこなくなりました。稼動情報は少なくとも来るはず。。

1月2日になってもこないので、調べてみると Google Apps の障害の模様。

Google Apps ってあまり信頼できないみたいですね。

ruby on rails で Haru Free PDF Library を使う

まだあまり使っていないのですが、サンプルを見る限りはかなり自由にPDFを出力できるHaru Free PDF Library。

・グラフや線なども自由に出力

・日本語出力も問題なさそう

ということで早速使ってみることに。

1. gem でインストール

web 上では gem でのインストールは出来ない、という情報が多いのですが実はできます。

gem install hpdf

そして、Haru Free PDF Library には、直接 iostream へ出力するメソッドが用意されていませんので、一度サーバ上に出力(save_to_file)してから、send_file でブラウザへ返します。

application.rb

  PDF_PATH = "#{RAILS_ROOT}/pdf" # サーバ上の一時保存パス

  def stream_pdf
    require 'hpdf'
    filename_for_save = "#{action_name}_#{params[:id]}.pdf"
    logger.info "Starting PDF download #{filename_for_save}"
    pdf = HPDFDoc.new
    pdf.use_jp_fonts
    pdf.use_jp_encodings
    encoder = pdf.get_encoder("90ms-RKSJ-H")
    yield pdf
    file = "#{PDF_PATH}/#{filename_for_save}"
    pdf.save_to_file(file)
    send_file file, :filename=>filename_for_save, :type=>'application/pdf',
            :disposition => "attachment"
  end

export_controller.rb

  def export_memo_pdf
    stream_pdf do |pdf|
      font = pdf.get_font("MS-Gothic", "90ms-RKSJ-H")
      page = pdf.add_page
      page.begin_text
      page.move_text_pos(10.0, 300.0)
      page.set_font_and_size(font, 10.0);
      str = "PDFテストですよ".kconv(Kconv::SJIS, Kconv::UTF8)
      page.show_text(str)
      page.end_text
    end
  end

※ 出力はsjis で行っています。utf 8 のまま出力する方法はないのかなぁ。。

RailsによるアジャイルWebアプリケーション開発 Book RailsによるアジャイルWebアプリケーション開発

著者:Sam Ruby,David Heinemeier Hansson,Dave Thomas
販売元:オーム社
Amazon.co.jpで詳細を確認する

※以下のMLを参考にしました。MLは情報の宝庫ですね。

http://www.fdiary.net/ml/rails/msg/2786

acts_as_list scope 指定の罠

ruby on rails でリスト構造を簡単に取り扱える便利な指定 acts_as_list

http://macdiggs.com/2007/08/27/customizing-scope-in-acts_as_list/

複雑なscope(といってもそれほど複雑ではないですけど)の指定の時にとんでもない罠が潜んでいました。

あるグループの男性/女性別に、リスト出力したい場合、

group_id と、 sex というカラムごとにリストの順番を指定するとします。

この場合、以下のように書きます。

acts_as_list :scope => 'group_id = #{group_id} and sex = #{sex}'

ここで注意なのが、指定する文字列をくくる括弧は、「シングルクォーテーション」じゃないといけません。

ダブルクォーテーションだと、エラーが出てしまいます。(クラスにメソッドがない、みたいなエラーです)

摩訶不思議な罠です。

image magick rmagick は鬼門

弊社で運用している家計簿 たまる.jp でも、画像変換ライブラリとしてrmagick + image magick を使っていますが、この二つはバージョン関係が時期によって難しく、すんなりうまくインストールが成功することはほとんどない。

そこで、あえて言ってしまいます。

「rails で rmagick で簡単にimage magickが使えるからといって、安易に使うな!!」

画像のフォーマットを変換する必要があるとか、大画像をどうしても取り扱う必要がある場合などを除いて、image magick は使わなくて良いんじゃないかと思います。

また、画像関係でいえば、格納するのは、DBにしましょう。DBとページキャッシュを使うことでパフォーマンスの問題はなくなります。

ファイルに出してしまうと、バックアップだとか、DBとの整合性を確保するために余計な心配をすることが、いつか来ると思います。

システム開発においては、できるだけ危険な道はさけないと、ですよね。

linuxでコマンドをつなぐ方法

.configure

make

make install

は、

.configure && make && make install

決まりきった一連の動作はつないだコマンドで用意しましょう。

cent os で バージョンを表示するコマンド

yumで毎日OSをバージョンアップしていると今のバージョンがどうなっているのかわからなくなってしまうことがあります。

そんなときはこちら。

cat /etc/redhat-release

CentOS release 5.3 (Final)

最新になっているみたいです。

RESTful な rails アプリケーションをつくろうなどとは考えないように

今回ruby on rails で作っている家計簿とは別に新しいアプリケーションを作ろうとしていて、最近はやりの REST で ルートやコントローラーのアクションを構築してみたのですが、has_many -> has_many とかなってくると、URLがめっちゃ長くなるし、それに、URLからコントローラとアクションがすぐに解らない状態になってしましました。

ruby on rails で一番うれしいのは、やっぱりURLから即座にどのコードが動いているかがわかることだと思っています。

プロジェクトが巨大化していっても、このルールに従っていれば、解析は局所的で済むわけですから、下手にキレイなURLがいいといってroute定義などをいじるべきではありません。

restのURLにしてもなれればいいのですが、なれるまでがタイヘンですし、結局更新なんかにしても、acts_as_list の move_higher をするには、それようのメソッドを追加するか、変なパラメータを増やさないといけないわけで、それなら結局同じことです。

複雑なことをやろうとすれば指定は複雑になるのであれば、整理なんかしないで今のままでOK。 :controller / : action / :id でなんら問題ありません。

どんどんアクションを追加して行きましょう。(あとで検索が面倒くさくならない程度にですよ)

最近良く出るclamavのエラー対応(centos5)

最近ずっと、clamavが古い(outdated)と毎日のログに出力されていました。

もう、centos 5 も時代遅れなのかなぁ。。とはいえ、今はOSいじっている時間などないので、とりあえず最新化。

wget http://packages.sw.be/clamav/clamav-db-0.95.2-4.el5.rf.i386.rpm
wget http://packages.sw.be/clamav/clamav-0.95.2-4.el5.rf.i386.rpm
rpm -ivh clamav-db-0.95.2-4.el5.rf.i386.rpm clamav-0.95.2-4.el5.rf.i386.rpm
freshclam

競合エラーがでる場合は、 --force オプションをつけましょう。

ruby on rails (Active Record)複数列をgroup by して countする方法

Active Recordで以下のようにcountを実行しても、複数列の値が取得できません。

Message.count(:group => "rcv_user_id, send_user_id")

=>[[ 3, 2] , [ 4, 2]]

※一番最後に指定した列の値+行数

このような場合には、countを使わず、通常のfindを使用します。

Message.find(:all , :select => "count(*) count, rcv_user_id, send_user_id":group => "rcv_user_id, send_user_id")

結果をオブジェクト(インスタンス)から取得するときにも、countやメソッド名で取得できるので、ソースの可読性が良くなります。

もう、count使わないほうが良いカナと思ってしまいます。

jruby + tomcat でサイトを作ってみました

こんにちは。マイレージテクノの大縄です。

このたび、最近注目されている jruby と、フリーのjava アプリケーションサーバであるtomcatを連携させて、ruby on rails で作ったサイトを動かしてみました。

結果は、一応動かすことは出来たのですが、全く実用に足らないものでした。

やり方がまずかったのかなぁ。。

とりあえず、備忘録(とはいってももう二度とやら無いと思いますけど。。)的に手順などをメモしておきます。

どうしてもやってみたいというかただけやってみてください。

サーバのOSは、CentOS 5.1。Windowsマシンからsshでリモート接続して作業を行います。

【jruby のインストール】

以下のサイトにjrubyの実行モジュールへのリンクがありますので、最新版を確認してください。

http://dist.codehaus.org/jruby/

私のインストール時点では1.1.2が最新版だったので、wgetでダウンロードします。

wget http://dist.codehaus.org/jruby/jruby-bin-1.1.2.tar.gz

アーカイブを解凍します。

tar xzf jruby-bin-1.1.2.tar.gz

それっぽい場所に移動(汗)

mv jruby-1.1.2 /usr/local

【jdk最新版取得】

CentOS 5.1 のjdkでは古い?のか、環境変数が足りないかなので、JDKを最新バージョンにしました。

参考)http://urobonyu.u-andme.net/index.php/2007/06/26/199

以下のURLからJDKの最新バージョンを取得します。(以下、IEで操作)

http://java.sun.com/javase/downloads/index.jsp

「JDK 6 Update ?」と書いてある横の「Download」ボタンをクリックします。
次の画面の選択肢では、「linux」「Multi-language」を選択して、「Continue」をクリックします・

次の画面で「jdk-???-linux-i586-rpm.bin」というリンクが表示されると思いますので、右クリック -> プロパティ、と操作し、アドレス:(URL)から、wget に打ち込むURLを取得します。

ようやく、sshのターミナルからの操作です。

wget で、rpm のもとファイルを取得します。

wget http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u6-linux-i586-rpm.bin?BundledLineItemUUID=ja5IBe.lblwAAAEarZMxk8z4&OrderID=NOJIBe.lkjIAAAEalpMxk8z4&ProductID=VXZIBe.ootIAAAEZTrBAkQve&FileName=/jdk-6u6-linux-i586-rpm.bin -O jdk-6u6-linux-i586-rpm.bin

止まったら、enterを押します。(スマートな手順ではないかもしれません・・)

chmod 777 jdk-6u6-linux-i586-rpm.bin
./jdk-6u6-linux-i586-rpm.bin

使用条件などが表示されますので、spaceを押下して最下行まで。最後に、「yes」+enter で、インストールが始まります。

continue が表示されたら、enter を押下して、JDKのインストールは終了です。

/etc/profile の最下行に以下を追加

# latest jdk
export JAVA_HOME=/usr/java/latest
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

# jruby
export PATH=$PATH:/usr/local/jruby-1.1.2/bin

jruby -v
ruby 1.8.6 (2008-05-28 rev 6586) [i386-jruby1.1.2]

--> 出ればとりあえず成功!!

jruby -S gem install rails --include-dependencies

gem install --no-rdoc --no-ri ActiveRecord-JDBC

【DB設定】

mysql の JDBCアダプターを取得

gem install activerecord-jdbc-adapter

database.yml の設定

【tomcatとの連携】

jruby script/plugin install http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike

jruby -S rake war:standalone:create

?????.war 完成!!

【tomcatインストール】

参照)http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_01/safetomcat_01_1.html

http://tomcat.apache.org/

wget http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz

tar -xzf apache-tomcat-6.0.16.tar.gz

mv apache-tomcat-6.0.16 /opt/tomcat6

useradd -d /opt/tomcat6 -s /sbin/nologin tomcat

mv -f /opt/tomcat6/bin/jsvc.tar.gz /tmp/
cd /tmp
tar -xzf jsvc.tar.gz
cd jsvc-src 
autoconf
sh configure
make
chown tomcat. jsvc
mv -f jsvc /opt/tomcat6/bin
cd ../..
rm -rf /tmp/jsvc-src/ /tmp/jsvc.tar.gz
vi /etc/rc.d/init.d/jsvc

#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc

# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/java/latest
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
    #
    # Start Tomcat
    #

    echo -n "Starting jsvc: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap

    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
    fi
    echo
}

stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down jsvc: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: jsvc {start|stop|restart|status}"
        exit 1
        ;;
esac 

=====

chmod +x /etc/init.d/jsvc

 Apacheの設定ファイル(httpd.confなど)において以下の2つのモジュールを読み込ませることでこの機能を利用できるようになります。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 

 CentOS 5.0では、初期状態でこれらの設定ファイルは読み込まれるようになっているので、特に変更の必要はありません。

vi /etc/httpd/conf.d/proxy_ajp.conf

ProxyPass /tomcat/ ajp://localhost:8009/ <- コメントアウトを外します

solaris 撤退

だめだぁ

ディスクのボリューム?の切り方を間違っていて、companion dvd を入れたら /opt があふれた

仕方がないので、start suite削除してから全部入ったけど、なんかアップデートしても一晩置いておいても進んでない

もうやってられません

centosを入れなおしています

yumって超便利

mod_railsを入れてみる計画です。

solaris + SC440

最近の激安傾向でうちの会社にはDELL SC440がごろごろしています。

空きが4台あるので、一台にsolaris10を入れてみた。

GUIでのインストールはDVD読み込みまでい進んだ後必ず固まる・・・ん~、まあフリーだしそう目くじら立てずにがんばろう。

結局、TEXTモードでインストールまでは成功(ここまで10回ぐらい失敗)

インターネットに接続できない??なんか、ネットワークの設定ってなかったね~、そういえば。いつやるんだろうな~。

ん~までよ。JDEもちゃんと使えてるし、もう設定項目はないのに、なんでネットワーク設定を求められないんだろう。。。

ifconfig / dmesg / svcadmin とかなんとか、しらないコマンドをたたく羽目に。

で、結局なんだったのかといえば、SC440の内臓NICはドライバを入れないと認識しないんだって。

http://plaza.rakuten.co.jp/marsenary/diary/?ctgy=8

く~、かなり痛いロスをしてしまいました。

onloadのスマートな書き方

bodyたぐにonloadを指定して地図を読み込む、というのがgoogle maps apiの標準的な使い方です。

でも、railsではlayoutにbodyタグを書くのが普通だから、ページによって地図を使うのか使わないのかを振り分けるためには、地図を使う場合とそうでない場合でlayoutを変えないといけない。

めんどくさ~ぃかんじです。

そこで良い方法を考えました。この方法はあまり使われて無いみたい。でもそこがちょっとこわいですけど。。。とりあえず、その方法を書いておきます。

1. body タグに以下のように記述

<body onload="<%= remote_function :url => { :action => 'startup' } %>">

2. controller で、インラインrjsを記述します。

  def startup
    render :update do |page|
      page.call :onLoad
    end
  end

まあ、単純にこれだけなんですけど、onloadで複数のjavascriptの関数を実行したい場合に、新たに関数を作る必要が無いってとこも、良いところですね。

この先は、rjsファイルを使って、google maps api 用の javascript をどんどん少なくしていく計画です。

acts_as_paranoid 再び

名前はあんまり好きじゃないんですけど。。act_as_paranoid。。

使ってくれるなってかんじがするので。

でも、とりあえず当面は論理削除にしておく必要があって、いちいちメソッドを書き換えるのは面倒なので、以前一回失敗したのに懲りず、またやってみました。

http://i-am.web777.net/2007/01/activerecord.html

インストールでいきなりつまずく。

ruby script/plugin install acts_as_paranoid

できません。なにも返ってきません。

っていうか、ruby script/plugin list で出てくるプラグイン少ない~もともとこんなもんだったか??

http://ar-paranoid.rubyforge.org/

によると、gem install acts_as_paranoid だとか。

インストールしてもなにもかわりませ~ん。ただmodelに書いた「acts_as_paranoid」がないって怒られるだけ。

で、やっとのことで成功しました。

ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_paranoid --force

う~ん。。WEBを探してもなにも出てないってことはみんな簡単にやっちゃってるんだろうなぁ。。。

道はまだ遠いです。

actionmailerでつまづく

会員さんの情報を追加・変更した際にメールを送信する、という非常にWEB機能にとっては基本的な機能を実装する作業をやっていたのですが。

いくらやってもうまく動かない。

redmineをプロジェクト管理に入れていて、問題が追加変更されるとメンバーにちゃんとメールが届いているのに。

はて?

「RailsによるアジャイルWebアプリケーション開発」をみて普通にやっているだけなのに。。。ほんまに簡単にできるふうなことが書いてあるよなぁ

といいながら二・三時間いじってみてだめなのでちょっとあきらめ気味でしたが

今日、ようやくできたみたいです

原因は、サーバー(webrick)の再起動が必要だったみたい。

メール配信の設定を書く場所が、controller/apprication.rbかconfig/environment.rbの二箇所あって、僕はredmineにならってconfig/environment.rbの方に書いていたんです。

この場合は、サーバを再起動しないといけなかったみたいでした。

ん~こんな基本的なところでつまって時間を浪費してはいけません。

反省しました。

linuxで自作のアプリを始めて稼動させてみたが。。。

ようやっとのことで大まかにできた自作のアプリをlinuxで動かしてみたのですが。

なんと!!まったく動かない(笑

いろいろといじってみた挙句解ったことは、windowsの場合とlinuxの場合でコントローラーのルーティングが違っちゃうみたいなんですね。

user というコントローラーをひとつ作って、それに関連するコントローラーを userフォルダの中に作成する方法(generate controller user::message みたいな感じで作るやつです)でやっていて、windowsの場合はなんら問題なかったのです。

linuxでやってみると、最後にIDがつかないURLの場合、おかしくなる。

controller => user, action => message, id => new みたいになっちゃって(笑

idがnewって、おいっ!!

バージョンがあがればこんなおかしなこともなくなるのかもしれませんけど。。。

とりあえず、controllerをフォルダで階層分けするのはやめて、全部controllerフォルダ直下に置くように変更しました。

これで、とりあえずは動くようになりました。

ruby on railsで作られたプロジェクト管理システム redmineを入れてみた

tracというバグトラッキングシステムが話題を集めていますが、redmineというプログラムもまた同じような、というか、ちょっと機能追加されたプロジェクト管理システムになっておりまして、今回うちの会社でもこれを導入してみました。

ソフトのご紹介+簡単な設定

http://gihyo.jp/dev/serial/01/redmine/0001

apacheとの連携方法

http://webos-goodies.jp/archives/50818102.html

http://syo.cocolog-nifty.com/freely/2007/05/redmineapachepr_c829.html

今回もfast cgiでrailsを動かそうしてみたけど断念。結局、mod_proxyでurlを書き換えて対応しました。

でも、結構レスポンスはいい感じです。

うちの会社のプロジェクトで今までtracを使っていたので、チケットを問題に移して、ガントチャートを見てみるとなんと!美しいことか。。

これで、予実績まで管理できると最高なんだけどなぁ。。。

ほかにもいろいろプロジェクトを作ってこれからやっていこうかなぁという感じです。

tracとの一番の違いが、プロジェクト・リポジトリを複数管理できる、というところ。

これは、集中管理ができるといういい面もあるんですが、問題を挙げるときに、たとえば会社全体にも関係あるし、特定のプロジェクトにも関係あるときに、どっちにあげようか迷ってしまったりするのが少々困りものです。

でも、うちの会社ではとにかくruby on railsで突き進むということは決まっているので、このシステムを使い倒してみたいと思います。

サーバーがきました

自宅でサーバーを立ち上げているのですが、最近すぐに落ちてしまうのです。

原因を調査する気力はなかったので、とりあえず新しいの買っちゃいました。

[ SPEC ]

DELL PowerEdge SC440
CPU デュアルコア インテル® Xeon® プロセッサー 3040 (1.86GHz, 2MB L2 Cache,1066MHz FSB)
メモリ 512MB
HD SATA 80G

ちょっとメモリがたりないかな〜というところですが、最近のメモリ安ですので、増設したけりゃあ大した出費じゃないし、とりあえずこのスペックで我慢しました。これでなんと!!送料・税込みで2万6千円ぐらい!!安すぎます。
あ、もちろん、モニタ・入力デバイス・CD/DVDなんかはついていないまっさらなパッケージですけど。

昨日届いたのですが、やっぱりサーバー用途ということだけあって、なかみをみるのがなんと簡単なことか・・・。故障したときとか、1分1秒をあらそう時にいちいちネジなんかはずしてられないですもんね。

早速いまのサーバーのDVDーROMを取り付けて、OSをインストールしています。

いまのサーバはFedoraCore6で運用しているのですが、今回はSolarisを入れようかどうか悩み中です。

会社としては、設定方法のノウハウとかもあるし。いままでどおりの方がいいんでしょうが。。。ん〜。Solarisは捨てがたい。。。

インストールがうまくいったら、すこしいじってみようと思います。

試しにsolaris 入れてみた

会社のパソコンに余ってるハードディスクがあったので試しにsolaris入れてみた

インストールは順調に進んだがいざ起動と言う段階になって、一向に先に進まず落ちてしまう

今日はとりあえず時間もないのでここまでで断念です

なんでsolarisか?

だって商用だしredhatは高いしね

でも簡単にはruby on railsの環境は作れないみたい

まぁ 何事も経験です

プロキシサーバがある場合の ruby on rails インストール

set http_proxy=http://XXX.XXX.XXX.XXX:YYY

gem install rails -r -y

ruby on rails で history back

ある画面に行こうとしたときに、コントローラーでデータが取得できない場合、元の画面に戻りたい。タダ、history.backしたいだけなのに~

「ruby on rails history back」でグーグル先生に聞いても、日本語で答えてくれない。

う~ん 行き詰ったか。

重い腰を上げて、RDocをあげてみた。

あった。

redirect_to :back

なんじゃい。簡単じゃん。

google maps api と ruby on rails の連携

以前google maps apiをちょっとやってたことがあって

これをねたに日記をかけないかと昨日から苦戦してましたが今日ようやく完成

1. rails スタート!!

: rails gmap

2. spotモデル作成

: cd gmap
: ruby script/generate model spot

3. DB/テーブル作成

(SQL発行)
: create database gmap_development;
: create database gmap_test;
: create database gmap_production;

(gmap/db/migrate/001_create_spots.rb に以下の内容を記述)

class CreateSpots < ActiveRecord::Migration
   def self.up
     create_table :spots do |t|
       t.column :name , :text
       t.column :lat , :string
       t.column :lng , :string
     end
   end

   def self.down
     drop_table :spots
   end
end

(rake を 実行してテーブルを作成します)

: rake db:migrate

4. scaffold で地点情報を登録して行きましょう。

  例)大阪城       34.68848 135.52974
      心斎橋そごう 34.67364 135.50075

: ruby script/generate scaffold Spot Gmap
: ruby script/server

  http://localhost:3000/gmap/new

5. 登録した spots の情報を google maps api で表示してみましょう。
   まず、helperメソッドを記述します。

以下、http://blog.maxdunn.com/articles/2006/06/30/google-map-mashup-in-rails
より大部分を転載しています。google maps api バージョンが古かったので、最新でも
動くように変更しました。

app/helpers/application_helper.rb に以下の記述を追加します。

( map というヘルパーメソッドを追加しています)

def map(options = {})
  gmap_defaults = {
    :width => "525",
    :height => "500",
    :center => "35.64836, 139.77905",
    :zoom => "10",
    :key => MY_CONFIG[:google_key]
  }
  @gmap = gmap_defaults.merge(options)
  @gmap[:marker] = @gmap[:center] if @gmap[:marker].nil?

  # Convert from single marker syntax to multiple markers syntax
  marker_hash = {}
  marker_hash[:point] = @gmap[:marker] if @gmap[:marker]
  marker_hash[:text] = @gmap[:text] if @gmap[:text]
  marker_hash[:url] = @gmap[:url] if @gmap[:url]
  markers = {:markers => [marker_hash]}
  @gmap = markers.merge(@gmap)

  render(:partial => "layouts/google_map", :no_layout => true)
end

6. 次に、gmap/app/views/layouts/_google_map.rhtml というファイルを作成し、以下のように記述します。

<% @body_tag = 'onload="initMap()"' %>

<div id="map" style="width: <%= @gmap[:width] %>px; height: <%= @gmap[:height] %>px"></div>
<% if @gmap[:locator] %>
  <hr>
  <div id="message"></div>
<% end %>

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=<%= @gmap[:key] %>" type="text/javascript"></script>

<script type="text/javascript">
//<![CDATA[
var map;
function initMap() {

  // Create a base icon for all of our markers that specifies the
  // shadow, icon dimensions, etc.
  var baseIcon = new GIcon();
  baseIcon.shadow = "
http://www.google.com/mapfiles/shadow50.png";
  baseIcon.iconSize = new GSize(20, 34);
  baseIcon.shadowSize = new GSize(37, 34);
  baseIcon.iconAnchor = new GPoint(9, 34);
  baseIcon.infoWindowAnchor = new GPoint(9, 2);
  baseIcon.infoShadowAnchor = new GPoint(18, 25);

  // Center the map on Cupertino
  map = new GMap2(document.getElementById("map"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.setCenter(new GLatLng(<%= @gmap[:center] %>), <%= @gmap[:zoom] %>);

  // Creates a marker whose info window displays the given number
  function createMarker(point, icon_image, text, url) {
    var icon = new GIcon(baseIcon);
    if (icon_image && icon_image.length > 0) {
      icon.image = icon_image;
    } else {
      icon.image = "
http://www.google.com/mapfiles/marker.png";
    }

    var marker = new GMarker(point,icon);

    // Show this marker's index in the info window when it is clicked
    if (text.length > 0) {
      if (url.length > 0) {
        var html = "<a href='" + url + "'>" + text + "</a>";
      } else {
        var html = text;
      }
      html = '<div style="white-space:nowrap;">' + html + '</div>';

      GEvent.addListener(map, "click", function(marker) {
        marker.openInfoWindowHtml(html);
      });
    }
    return marker;
  }

  <%-
  n = 1
  for marker in @gmap[:markers]
      icon_image = image_path("marker#{n}")
  -%>
    var point<%= n %> = new GLatLng(<%=marker[:point]%>);
    var marker<%= n %> = createMarker(point<%= n %>, "<%= icon_image %>", "<%= marker[:text] %>", "<%= marker[:url] %>");
    map.addOverlay(marker<%= n %>);
  <%-
    n += 1
  end
  -%>
 
}

function newPoint(lat, lng){
  map.setCenter(new GLatLng(lat, lng))
}
//]]>
</script>

7. さらに、gmap/app/views/layouts/gmap.rhtml の「<body>」の記述を以下のように変更します。

<% if @body_tag -%>
  <body <%= @body_tag %>>
<% else -%>
  <body>
<% end -%>

8. マーカー用の画像を取得します。以下のURLより取得してください。

http://blog.maxdunn.com/articles/2006/06/30/google-map-mashup-in-rails

9. google maps api のAPI Key を取得します。

   http://www.google.com/apis/maps/

  「My web site URL: 」には、「http://localhost」を入力します。
 
10. gmap//config/environment.rb の最後に、以下の記述を追加します。

MY_CONFIG = {
  :google_key => "(9. で取得したAPI Key)"  # カッコは不要です。
}

11. gmap/app/views/gmap/list.rhtml の最後に以下の記述を追加します。

   <%= map :center => "139.77905, 35.64836" %>

  これで、とりあえず地図は表示されるようになりました。

12. spot 情報の取得

  次に、「show」リンクに移動したときに、地図の中央にその場所がきて、マーカーも表示されるようにしてみましょう。
 
  gmap/app/views/gmap/show.rhtml の最終行に以下を追加
 
<%= map :center => @spot.lat << ',' << @spot.lng ,
        :text => @spot.name.gsub(/\r\n/,"") ,
        :zoom => "15" %>
 
  (改行が入るとうまく表示されないので姑息な手で改行を削除しました)
 
  でましたか??

13. 一覧表示

  最後に仕上げとして、「list」に表示される地図に、リスト上に表示されているマーカーをすべて配置して、さらに一覧に「move」リンクを追加し、マーカーを中央に移動させる処理を実装しましょう。
 
(1) Destroy のリンクの下に、一行追加します。

    <td><input type="button" value="Move"  onclick="newPoint(<%= spot.lat << ',' << spot.lng %>)" /></td>

(2) ページの最後に以下の記述を追加しましょう。

<% @markers = Array.new %>
<% n = 1 %>
<% for spot in @spots %>
  <% @center = spot.lat << ',' << spot.lng if n == 1 %>
  <% @markers << {:point => spot.lat << ',' << spot.lng ,
                  :text  => spot.name.gsub(/\r\n/,'<br />') } %>
  <% n = n + 1 %>
<% end %>

<%= map :width => "500", :height => "400",
  :center => @center ,
  :markers => @markers %>

以上、うまくできましたか??

 

多対多のsave エラー

saveメソッドがないと言われた

会員とグループがあって会員が複数のグループに所属する場合だが

エラーになるのに会員はDBに登録されてる

???

良いサンプルもなく少し諦めてましたが今日出来ました

初めにグループのIDを指定して会員を引っ張ってるから、会員をプッシュしたあとはグループでsaveしないとダメなんですね

多対多だからどっちでも行けると思ったら大間違いでした

開発は順調?

順調てはありません

コントローラーってどんな名前をつけたら良いんだろう

作っているのはSNSみたいなシステムなんだけど

モデルはほとんどDBそのままなので迷わないんですが・・・

でもこんななやみはrails以前の問題ですね

かっちりMVCのソース見たことないからな〜

今は多対多のリレーションでリンクテーブルがうまく登録できないでなやみちゅう

あと 論理削除の acts_as_paranoid というプラグインを入れたら変なエラーがでるようになった

gemでrailsを再インストールしたらなおった

今日は四時間ぐらい作業してこんなもんです

あ でも事務所にパソコン机がきたし 新しいノートパソコンもなかなかいいかんじで総じて良い1日でした

あとは本業の方のoracle負荷テストが今晩何事もなく終わってるのを祈るのみです

rails データベース環境

単なる要望になるんですが。。

1.データベースのユーザ・DBを作るのって自動化できないの??

 rake db:migrete って打っても、エラーになるとショックでかいよね。

 新しい開発環境を作ったとき。

 そんなことならSQLでいいじゃんって、思ったりもします。

2.yml ファイルを自動生成して欲しい。

 テスト用のデータが手書きなのはなのはちょっといただけない。

 って思うのは私だけでしょうか??

動画・FAX・音声

先日の社内の打合せで、ruby on rails で「動画」「音声」「FAX」を取り扱う必要がある、という話になった。

登録は別にrailsである必要は無いのだが、閲覧はrailsで作りこむ必要あり。

調べないといけないことは、たくさんあります。

active record

MVCモデルのM

ORマッピング

データに適用されるビジネスロジックを強制する門番の役割とデータストアの役割を担う

なんのこっちゃ

テスト駆動開発

ruby on railsでは普通?なんですかねぇ

本には書いてあるんですが

先にテストを書いてそのあとプログラムを実装する

一般的なプログラムを書いてきた我々にはどうも違和感がある手法です

rakeと打つだけでテストを実行できるみたいです

rubo on rails の深い世界

まず手始めは、Helperをいろいろ調べて試してみるのと ActiveRecordのメソッドを一通りおさえることからはじめましょうか。

[ ActiveRecord メソッド一覧 ]

==
===
=~
[]
[]=
__id__
__send__
`
after_create
after_destroy
after_save
after_update
after_validation
after_validation_on_create
after_validation_on_update
allow_concurrency
attribute_names
attribute_present?
attributes
attributes=
attributes_before_type_cast
attributes_from_column_definition
attributes_from_column_definition_with_lock
b64encode
before_create
before_destroy
before_save
before_update
before_validation
before_validation_on_create
before_validation_on_update
blank?
body
body?
class
clear_aggregation_cache
clear_association_cache
clone
colorize_logging
column_for_attribute
configurations
connection
copy_instance_variables_from
create
create_or_update
create_or_update_with_callbacks
create_with_callbacks
create_with_timestamps
create_without_timestamps
created_at
created_at?
daemonize
dclone
decode64
decode_b
decrement
decrement!
default_timezone
destroy
destroy_with_callbacks
destroy_with_transactions
destroy_without_callbacks
destroy_without_transactions
display
dup
email
email?
enable_warnings
encode64
eql?
equal?
errors
extend
extend_with_included_modules_from
extended_by
freeze
frozen?
gem
generate_read_methods
has_attribute?
hash
homepage
homepage?
id
id=
id?
id_before_type_cast
increment
increment!
initialize
initialize_with_callbacks
inspect
instance_eval
instance_exec
instance_of?
instance_values
instance_variable_defined?
instance_variable_get
instance_variable_set
instance_variables
is_a?
kind_of?
load
lock!
lock_optimistically
locking_enabled?
logger
method
methods
name
name?
new_record?
nil?
object_id
pluralize_table_names
primary_key_prefix_type
private_methods
protected_methods
public_methods
quote
quote_with_deprecation
quoted_id
readonly!
readonly?
record_timestamps
reload
remove_subclasses_of
require
require_gem
require_library_or_gem
respond_to?
respond_to_without_attributes?
returning
save
save!
save_with_transactions
save_with_transactions!
save_with_validation
save_with_validation!
save_without_transactions
save_without_transactions!
save_without_validation
save_without_validation!
schema_format
send
silence_stderr
silence_stream
silence_warnings
singleton_methods
subclasses_of
suppress
table_name_prefix
table_name_suffix
taguri
taguri=
taint
tainted?
title
title?
to_a
to_json
to_param
to_s
to_xml
to_yaml
to_yaml_properties
to_yaml_style
toggle
toggle!
transaction
type
unloadable
untaint
update
update_attribute
update_attribute_with_validation_skipping
update_attribute_without_validation_skipping
update_attributes
update_attributes!
update_with_callbacks
update_with_lock
update_with_timestamps
update_without_callbacks
update_without_timestamps
valid?
valid_with_callbacks?
valid_without_callbacks?
validate
validate_on_create
validate_on_update
verification_timeout
with_options

出し方:

ruby script/console

c = new.[モデルクラス]

c.methods.sort.each do |t|

  puts t

end

[ Helper 一覧 ]

>> y ActionView::Helpers.constants
---
- JavaScriptElementCollectionProxy
- AssetTagHelper
- PaginationHelper
- TextHelper
- JavaScriptHelper
- TagHelper
- InstanceTag
- FormBuilder
- JavaScriptElementProxy
- CaptureHelper
- JavaScriptMacrosHelper
- UrlHelper
- DebugHelper
- DateHelper
- FormHelper
- JavascriptHelper
- FormOptionsHelper
- FormTagHelper
- JavaScriptVariableProxy
- CacheHelper
- ScriptaculousHelper
- PrototypeHelper
- JavaScriptCollectionProxy
- ActiveRecordHelper
- JavaScriptProxy
- BenchmarkHelper
- NumberHelper

>> y ActionView::Helpers::JavaScriptHelper.instance_methods
---
- evaluate_remote_response
- update_element_function_with_deprecation
- escape_javascript
- options_for_javascript
- define_javascript_functions
- remote_function
- observe_field
- method_option_to_s
- submit_to_remote
- update_page_tag
- javascript_cdata_section
- form_remote_tag
- observe_form
- button_to_function
- link_to_remote
- options_for_ajax
- form_remote_for
- update_page
- javascript_tag
- build_observer
- build_callbacks
- update_element_function_without_deprecation
- array_or_string_for_javascript
- remote_form_for
- update_element_function
- periodically_call_remote
- link_to_function

>> y ActionView::Helpers::TagHelper.instance_methods
---
- tag
- content_tag
- escape_once
- cdata_section

>> y ActionView::Helpers::InstanceTag.instance_methods
---
- country_options_for_select
- select_hour
- to_date_select_tag_without_error_wrapping
- content_tag
- methods
- taguri
- to_text_area_tag
- time_select
- silence_stream
- taint
- instance_variable_defined?
- taguri=
- distance_of_time_in_words
- select_minute
- method_name
- to_datetime_select_tag_without_error_wrapping
- to_yaml
- __id__
- silence_warnings
- singleton_methods
- option_groups_from_collection_for_select
- to_date_select_tag
- datetime_select
- to_date_tag
- load
- respond_to?
- to_country_select_tag
- nil?
- extend_with_included_modules_from
- to_time_select_tag_without_error_wrapping
- select_second
- to_param
- __send__
- protected_methods
- tainted?
- to_datetime_select_tag
- select_datetime
- require
- untaint
- time_zone_select
- instance_of?
- suppress
- select_day
- method
- equal?
- instance_values
- time_zone_options_for_select
- to_select_tag
- value
- private_methods
- hash
- decode64
- `
- encode64
- send
- to_time_select_tag
- to_tag
- remove_subclasses_of
- kind_of?
- freeze
- unloadable
- eql?
- instance_exec
- object_id
- id
- object
- error_message
- collection_select
- public_methods
- instance_eval
- to_boolean_select_tag
- require_gem
- decode_b
- is_a?
- require_library_or_gem
- select_month
- to_time_zone_select_tag
- value_before_type_cast
- returning
- type
- daemonize
- tag
- select_year
- instance_variables
- dclone
- tag_without_error_wrapping
- frozen?
- select_date
- cdata_section
- to_a
- to_check_box_tag
- options_for_select
- subclasses_of
- column_type
- gem
- time_ago_in_words
- with_options
- blank?
- class
- instance_variable_get
- extended_by
- select
- error_wrapping
- ==
- select_time
- ===
- escape_once
- to_s
- extend
- distance_of_time_in_words_to_now
- to_yaml_style
- to_collection_select_tag
- enable_warnings
- clone
- object_name
- =~
- instance_variable_set
- copy_instance_variables_from
- b64encode
- content_tag_without_error_wrapping
- to_content_tag
- to_radio_button_tag
- options_from_collection_for_select
- inspect
- date_select
- to_yaml_properties
- to_input_field_tag
- to_json
- display
- country_select
- silence_stderr
- dup

>> y ActionView::Helpers::FormBuilder.instance_methods
---
- fields_for
- select
- inspect
- returning
- decode_b
- password_field
- blank?
- time_select
- clone
- silence_warnings
- collection_select
- public_methods
- display
- daemonize
- instance_variable_defined?
- to_param
- equal?
- freeze
- subclasses_of
- methods
- with_options
- respond_to?
- hidden_field
- datetime_select
- dup
- instance_variables
- to_yaml_style
- __id__
- method
- eql?
- extend_with_included_modules_from
- require_gem
- object_name
- object
- to_yaml
- id
- suppress
- send
- singleton_methods
- text_area
- field_helpers
- object_name=
- load
- object=
- taint
- extended_by
- instance_variable_get
- frozen?
- field_helpers=
- text_field
- instance_of?
- __send__
- enable_warnings
- to_yaml_properties
- to_a
- encode64
- instance_values
- time_zone_select
- `
- type
- file_field
- object_id
- instance_eval
- protected_methods
- to_json
- b64encode
- radio_button
- unloadable
- check_box
- ==
- require
- ===
- copy_instance_variables_from
- instance_variable_set
- options
- extend
- kind_of?
- silence_stderr
- remove_subclasses_of
- taguri
- to_s
- instance_exec
- decode64
- date_select
- options=
- gem
- class
- hash
- require_library_or_gem
- taguri=
- private_methods
- =~
- tainted?
- untaint
- nil?
- dclone
- country_select
- is_a?
- silence_stream

>> y ActionView::Helpers::JavaScriptElementProxy.instance_methods
---
- "[]="
- decode_b
- __id__
- replace_html
- reload
- __send__
- encode64
- instance_eval
- b64encode
- decode64
- replace
- "[]"

名前から、なんとなく想像できるものと、まったくできないものがありますね。

ちなみに、動作の確認は、console の self インスタンスから、helper メソッドを使えば呼び出すことができます。

>> helper.tag :a
=> "<a />"

こんな感じです。

scriptのヘルプ

ruby script/server -help

scaffold の生成

scaffold = 足場 という意味らしい。簡単にCRUDなWEBシステムを構築できる。

ruby script/generate [モデル名] [コントローラ名]

ActiveRecord

[ オブジェクトメソッド ] ??

save  データの登録・更新

[ クラスメソッド ]

find  データの検索

例) User.find :all(ユーザー全件を取得)

rubo on rails 最新化

ruby コンソールから。。。

gem rails update

rubyメモ

自宅のパソコンのデスクトップにrubyのメモがあったので投稿しておきます。

length 長さを返す(sizeも同じ)

abs 絶対値を返す

index("c") cが格納されている添え字を返す

コメントは#

メソッドはdef - end

puts - 改行付の出力

変数を""の中で使う→#{変数}

メソッドは最後に評価された式の値を返す

変数の先頭は_or小文字

定数/クラス名の先頭は大文字

無し ローカル変数

$ グローバル変数

@ インスタンス変数

@@ クラス変数

rubyではnilもオブジェクト

配列は[] ハッシュ(連想配列)は{}

ruby on rails 本を読みながら

昨日の夕方から本を読みながら事務所に泊まって作業しました

タイトルは忘れましたが青い電車男みたいな本です

ハンズオンセミナーでもらったCDを使えばインターネットに接続できなくても大丈夫!という楽観的見通しで開発を始めましたが、案の定、カレンダーを使うためのモジュールはgemでインストールしろと、言われてしまいました

仕方がないのでアジャイル本見たり、雑誌を見たり、ハンズオンセミナーの復習をしたりしていました

奥が深いですね〜rubyの世界は

でも基本はきっちり解ってきたので、まずは順調といったところでしょうか

railsではそこまで複雑な文法使わないですもんね

コレクシュン 配列とハッシュ

対話式でrailsの動きを確認 rcript/console

アクセサの実装 attr_accessor

イテレータ コレクションに対して順に操作するブロック

ブロックつきメソッド呼び出し

yield ブロックの呼び出し

Procオブジェクト ブロックをオブジェクトでラッピングしたもの

eval 文字列をプログラムとして実行

require rbファイルの読み込み

assert 評価

system システムコマンド

pagenate ページ遷移の処理を便利に行う方法

each コレクション(配列 or ハッシュ)を順番に処理するメソッド

開発開始です

まずは本に従って・・・

railsコマンド プロジェクトを作成します

generateコマンド modelやscaffoldを生成します

rakeコマンド 処理の自動化。railsではデータベースの生成とテストで使用します

serverコマンド Webrickの起動。ポートは3000。

基本はこんな感じです。

テストがうまく動かないという問題点がありましたが、おそらくrubyかrailsの問題なので最新版を入れ直せば問題なしです

rubyという言語

まつもとひろゆきさんが開発した日本製の言語

完全なオブジェクト指向となるように設計されている

すべてがオブジェクトなのである

オブジェクト指向も絶対的に優れたものではなく、好みの部分もある

でも変化の激しい現状のwebアプリケーションの要求に対し柔軟に対応するにはオブジェクト指向の理解は避けて通れない

そういったいみでrubyをオブジェクト指向の教育に使うというのもいいかも知れない

日経ソフトウェア

rubyの記事が出てました

大きい会社でもrailsで仕事してるところがかなりあるんですね

railsは人数の少ないプロジェクトでそこそこの規模のシステムを開発するときに開発効率がjavaの5〜7倍

うちの会社ではベストチョイスです

ハンズオンセミナーの付録

そのままだと作業を記録できない

ハードディスクをマウントして書き込み可能にしてからrailsコマンドを打つこと

ウィンドウズに戻ってファイルがあれば成功です

KNOPPIX?

先日のOSC関西のハンズオンセミナーで、お土産にCDROMをもらったんですが、それがなんとCDから立ち上げるlinuxで、rubyもrailsも入ってる!

これを使えばネット接続環境がなくても開発がすすめられる

こんな便利なものを鞄の中に眠らせたままでした

公告出すぎ

ココログ公告出すぎです

嫌になってきた

rubyインストール

これも基本的にオンラインじゃないとだめか

結局ネットにつながるのを待つ方が早いみたいです

オフラインでのrails インストール

マイレージテクノでは大阪の玉造というところに事務所を構えたんですけど(小さなワンルームマンションです)ネッと接続環境がまだ整備されてないんです

開発だけだしまぁいいかと思っていたんですが

railsってgemでインストールするってことはネットにつながってないとだめじゃん

パソコン持っていくまえにインストールしとけば良かった〜

でもrailsのページを見るとなんかダウをロードしたものを使ってインストールもできるみたい

tarとgzとgemがあるけど最新版はgemだけみたいだ

たぶんgemでこのファイルを指定すれば行けるのかな
もう少し調べてみよう

OSC関西に行ってきました

こんにちは

railsのことをほとんど知らないのにこんなブログを立ち上げてしまった大縄です

先日、7月21日に社長とOSC関西なるイベントに行きました

場所は京都駅前の京都コンピュータ学院

朝からOpenPNEの手嶋さんのセッションを聞いたりしました

午後からruby on railsのハンズオンセミナーというのに参加しました

主催はruby関西で実際にパソコンをさわってrailsを使った開発をしていくという内容です

少し開発の雰囲気を味わうことができました

今週末から会社でも本格的な開発が始まります

テスト投稿