FrontPage http://www.ark-web.jp/sandbox/wiki/16.html

このページは?

アークウェブのスタッフが、システム開発についての
“個人メモじゃもったいないけどブログ未満”的コンテンツをまとめているWiki。
お役に立てば幸いです。B^)

Ruby on Rails/jpmobileで機種に応じた画像を出力 (6m)

更新日 2010-06-16
  • 前提
    • ユーザーのプロフィール画像とか、投稿画像を携帯サイト上でも見せたい
    • file_columnでアップロードさせた画像を管理
    • 携帯サイトはjpmobileを使用
  • 解決したい問題
    • 機種に応じて最適な横幅の画像を用意してそれを使うようにしたいが、jpmobileではそのような機能はないらしい
    • ユーザーが投稿する画像はgif, jpg, pngなどさまざまだが、3キャリアで使えるJPGに変換したい
    • exifやprofileなどの情報があると容量が増えるので、除去したい
  • http://underscore.jp/diary/20071207.html こちらにあるフォーマット変換ができるようにするpatchを当てる(ありがとうございます! m(_ _)m )
  • file_columnの画像変換部分をちょっと修正して、exifなどを除去
    • vendor/plugins/file_column/lib/magick_file_column.rb の110行目付近
             img.profile!("*", nil)  # この行を追加
           ensure
             img.write(dest_path) do
  • モデルクラスにてモバイル用画像をversionsに指定
     file_column {:image, 
       :permissions => 0666, 
       :magick => {:geometry => "800x800>", 
       :versions => {:pc_thumb => {:crop => "1:1", :size => "200x200!"},
                     :mobile_thumb => {:crop => "1:1", :size => "80x80!", :format => "JPG"},
                     :mobile_middle => {:crop => "1:1", :size => "150x150!", :format => "JPG"}, 
                     :mobile_large => {:crop => "1:1", :size => "320x320!", :format => "JPG"}}}
  • サムネイルが80px、拡大画像は、機種の横幅が240未満なら150px、240以上なら320pxを使用することに
  • 拡大画像を表示する画面のアクションメソッド(コントローラー内)にて、機種ごとにタイプを動的に判定
    @image_version = request.mobile.display.width.to_i > 240 ? :mobile_large : :mobile_middle
  • ビューにて、次のように使用
    = image_tag(url_for_image_column(user, "image", @image_version)
  • ファイルがアップロードされた後からversionsを追加しても(たとえばPC版を先にリリースしてて、モバイル版を後からリリースした場合とか)、url_for_image_columnは、画像がないなら作ってくれるので非常に楽!
  • ライブラリの作者の皆様、ありがとうございます。m(_ _)m

投稿者志田 | パーマリンク

| append.gif

Ruby on Rails/Rails3を試してみる (10d)

更新日 2010-06-06

necoったーがAPIの変更についていけなくてサービスが停止してすでに数年たってしまったので、Rails3で作り直したい、と思い立って、やってみた。rails3の勉強がてらで。
以下、その備忘録

Rails3環境を新規に作る

Gemfileでgemを入れる

  • Gemfileを編集する。以下を追加。
    gem "haml"
    group :test do
      gem 'rspec-rails', ">= 2.0.0.beta.7"
      gem "factory_girl"
    end
    gem 'mysql'
  • gemをインストールする(参考: http://d.hatena.ne.jp/willnet/20100324/1269407621)
    bundle install vendor

DBの設定

  • config/database.yml を編集 これまでどおり)
  • DBを作る
    rake db:create
  • これでdevelopmentとtestの両方のDBができる

generatorを入れる

  • http://edgeguides.rubyonrails.org/generators.html
  • rails3-generatorを入れる
    git clone git://github.com/pjb3/rails3-generators.git lib/generators lib/generators/haml
  • rspecのgeneratorは、rspecのgemの方を使わないとエラーになるっぽいので、消す
    rm -r  lib/generators/rspec*
  • hamlは、haml_scaffold_generatorの方が充実しているっぽいので消して、そっちをいれる
    rm -r  lib/generators/haml*
    git clone git://github.com/psynix/rails3_haml_scaffold_generator.git lib/generators/haml
  • generatorが増えてることを確認
    rails generate
    ... いろいろ ...
    haml:controller
    haml:mailer
    haml:scaffold

トップページなどを作ってみる

  • 参考: http://edgeguides.rubyonrails.org/getting_started.html, http://edgeguides.rubyonrails.org/generators.html
  • config/application.rbに追記。これで、テンプレートエンジンはhaml、テストフレームワークはrspec、fixtureは、factory_girlになるらしい。
       config.generators do |g|
         g.template_engine :haml
         g.test_framework :rspec, :fixture => true, :views => false
         g.fixture_replacement :factory_girl, :dir => "spec/factories"
       end
  • generator で、トップページを作ってみる
    rails generate controller necos index
    • 生成されるビューのファイルや、テストケースファイルがhamlや、rspecになってた!
      create    app/views/necos/index.html.haml
      create    spec/controllers/necos_controller_spec.rb
  • モデルも作ってみる
    rails generate model neco
    • factory girlのファイルも作られた
      create        spec/factories/necos.rb
  • routesにも追記されてた
    get "necos/index"
  • 既存のページをhamlにして、トップページのビューと置き換えてみる
    mkdir public/stylesheets/sass/
    chmod ugo+w public/stylesheets/ public/stylesheets/sass
    bundle exec vendor/bin/html2haml top.html app/views/necos/index.haml
    bundle exec vendor/bin/css2sass scaffold.css public/sytlesheets/sass/scaffold.sass
  • うーん、html2hamlとかcss2sassはうまく変換できなかった。。。ここは部分的にerbにする
  • デフォルトのindex.htmlは削除
    rm public/index.html
  • 「/」のページとしてNecosController#indexを出してみる。config/routes.rbを編集
    root :to => "necos#index"

mod_passengerで見てみる

  • passengerでは、RailsEnvではなく、RackEnvになるらしい
    RackEnv development

トップページ以外も作ってみる

  • 参考: http://edgeguides.rubyonrails.org/routing.html
  • やはり、基本RESTfulURLの形式に沿って作りたい
  • routesに次のように記述
     resources :necos do  # CRUD系のURLが作成
       collection do      # それ以外のURL /necos/xxx のタイプ
         get :choice
         get :ranking
         get :help
       end
       member do          # それ以外のURL /necos/xxx/#id のタイプ
         get :image
       end
     end
  • 後は従来どおり、コントローラーに記述追加してビューファイルを用意すれば見られる

ActiveRecordでデータを取ってくる

named_scopeで書き換え

  • 参考: http://m.onkey.org/2010/1/22/active-record-query-interface
  • rails3では「scope」に
  • ハッシュではなく、メソッドチェーンで
  • app/model/neco.rb
     scope :ranking, lambda { |per_page, page|
       per_page = 50 unless per_page.present? && per_page > 0
       page     = 1  unless page.present?     && page > 0
    
       limit  = per_page   
       offset = (page - 1) * per_page
    
       where('user_id > ?', 0).
       order('friendship DESC').
       limit(limit).
       offset(offset)
     }
  • app/controllers/necos_controller.rb
     def index
       @necos = Neco.ranking(5, 1)
     end

tags: Ruby on Rails

投稿者志田 | パーマリンク

| append.gif

MySQL/同一ホストに複数のMySQLを起動する (10d)

更新日 2010-06-05

1台のubuntu上で3306,3307と2つのMySQLインスタンスを起動する

  • /etc/init.d/mysql-3307 というのを用意してこれで、起動、停止させたい
  • /etc/mysql/my-3307.cnf というのを用意してこっちに3307の設定を書きたい
  • 3307ポート用datadirは、/var/lib/mysql-3307 としたい
  • mysqlを落とす
  • 3307用datadirを3306用からコピーして用意する
    sudo cp -a /var/lib/mysql /var/lib/mysql-3307
    /etc/init.d/mysql stop
  • /etc/init.d/mysql をコピーして /etc/init.d/mysql-3307を用意
  • 次の箇所を修正
    $ diff /etc/init.d/mysql /etc/init.d/mysql-3307
    25,26c25,26
    < CONF=/etc/mysql/my.cnf
    < MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
    ---
    > CONF=/etc/mysql/my-3307.cnf
    > MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian-3307.cnf"
    29c29
    < ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"
    ---
    > ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql-3307 -i"
    54,56c54,56
    <   if [ ! -r /etc/mysql/my.cnf ]; then
    <     log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
    <     echo                "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
    ---
    >   if [ ! -r /etc/mysql/my-3307.cnf ]; then
    >     log_warning_msg "$0: WARNING: /etc/mysql/my-3307.cnf cannot be read. See README.Debian.gz"
    >     echo                "WARNING: /etc/mysql/my-3307.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
    60c60
    <   datadir=`mysqld_get_param datadir`
    ---
    >   datadir=/var/lib/mysql-3307
    78c78
    <     pidfile=`mysqld_get_param pid-file`
    ---
    >     pidfile=/var/run/mysqld/mysqld-3307.pid
    105c105
    <          /usr/bin/mysqld_safe > /dev/null 2>&1 &
    ---
    >          /usr/bin/mysqld_safe --defaults-file=${CONF} > /dev/null 2>&1 &
    115c115
    <              output=$(/etc/mysql/debian-start)
    ---
    >              output=$(/etc/mysql/debian-start-3307)
  • /etc/mysql/my.cnfをコピーして/etc/mysql/my-3307.cnfを作成
  • 次のように修正
    20,21c20,21
    < port         = 3306
    < socket               = /var/run/mysqld/mysqld.sock
    ---
    > port         = 3307
    > socket               = /var/run/mysqld/mysqld-3307.sock
    28c28,30
    < socket               = /var/run/mysqld/mysqld.sock
    ---
    > port         = 3307
    > socket               = /var/run/mysqld/mysqld-3307.sock
    > datadir              = /var/lib/mysql-3307
    43,45c45,47
    < pid-file     = /var/run/mysqld/mysqld.pid
    < socket               = /var/run/mysqld/mysqld.sock
    < port         = 3306
    ---
    > pid-file     = /var/run/mysqld/mysqld-3307.pid
    > socket               = /var/run/mysqld/mysqld-3307.sock
    > port         = 3307
    47c49
    < datadir              = /var/lib/mysql
    ---
    > datadir              = /var/lib/mysql-3307
  • /etc/mysql/debian.cnfをコピーして/etc/mysql/debian-3307.cnfを作成。次の箇所を修正
    6c6,7
    < socket   = /var/run/mysqld/mysqld.sock
    ---
    > port         = 3307
    > socket               = /var/run/mysqld/mysqld-3307.sock
    10c11,12
    < socket   = /var/run/mysqld/mysqld.sock
    ---
    > port         = 3307
    > socket               = /var/run/mysqld/mysqld-3307.sock
    11a14
    > datadir              = /var/lib/mysql-3307
  • /etc/mysql/debian-startをコピーして/etc/mysql/debian-start-3307 を作成。次の箇所を修正
    10,13c10,13
    < MYSQL="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf"
    < MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
    < MYUPGRADE="/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf"
    < MYCHECK="/usr/bin/mysqlcheck --defaults-file=/etc/mysql/debian.cnf"
    ---
    > MYSQL="/usr/bin/mysql --defaults-file=/etc/mysql/debian-3307.cnf"
    > MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian-3307.cnf"
    > MYUPGRADE="/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian-3307.cnf"
    > MYCHECK="/usr/bin/mysqlcheck --defaults-file=/etc/mysql/debian-3307.cnf"
  • 3307を起動、停止してみる
    /etc/init.d/mysql-3307 start
    /etc/init.d/mysql-3307 stop
  • 3306も起動、停止してみる
    /etc/init.d/mysql start
    /etc/init.d/mysql stop

投稿者志田 | パーマリンク

| append.gif

GoogleAnalytics/イベントトラッキングでアフィリエイト別の約定額を知る方法 (26d)

更新日 2010-05-20

概要

竹村です。

アフィリエイト対応のECサイトなどで約定した時に、ちょっと工夫するとGoogleAnalyticsで追えるようになる、という方法の紹介です。

あと、イベントトラッキングにて、初めて第4引数まで入れた状態で対応してみました。
その際、何度も反映されない現象が起きたのでその共有もします。

やりたかったこと

  • アフィリエイトサイトからECサイトにアクセスされたら、セッションにパラメータを保持しておく。
  • ECサイトの注文が完了したページにて、イベントトラッキングをセットしたい。
  • コンバージョンをイベントトラッキングで。
  • 第3引数のラベルには、アフィリエイト元のパラメータをセットする。
  • 第4引数を渡すことで、該当アフィリエイトサイトからいくら約定したかを知りたい。
    • なお、このECサイトの決済通貨はドルです。例: $1.25

「GoogleAnalytics/イベントトラッキングでアフィリエイト別の約定額を知る方法」 の続きを読む

投稿者竹村 | パーマリンク

| append.gif

MapServer/メモ (52d)

更新日 2010-04-25

はまったことのメモ

  • 背景を透明にする
     IMAGETYPE      PNG24
     TRANSPARENT    ON
     OUTPUTFORMAT
       NAME png24
       DRIVER "GD/PNG"
       MIMETYPE "image/png"
       IMAGEMODE RGBA
       EXTENSION "png"
     END
  • google mapsと重ねる
     WEB
       METADATA
         WMS_SRS "EPSG:900913"
       END
     END
     PROJECTION
       "init=epsg:900913"
     END
  • projのepsgの末尾に追加する必要あり
    sudo echo '<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs <>' >> /usr/local/share/proj/epsg

投稿者志田 | パーマリンク

| append.gif

OpenLayers/メモ (52d)

更新日 2010-04-25

はまったことのメモ

  • Googleと自前WMSを重ねる
    var options = {
           projection: new OpenLayers.Projection("EPSG:900913"),
           units: "m",
           maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34)
    };
    map = new OpenLayers.Map('map', options );
    var google = new OpenLayers.Layer.Google(
           "Google",
            {type: G_NORMAL_MAP,
            sphericalMercator: true});
    map.addLayer(google);
    
    var mywms = new OpenLayers.Layer.WMS(
               "mywms",
               "<%= wms_path %>",
               {layers: 'mywms',
                format: 'image/png'},
               {isBaseLayer: false, visibility: true, opacity: 0.5});
    map.addLayer(mywms);
  • Map#zoomToExtent: 指定したBoundsがちょうどよく表示される位置、及びzoomlevelで表示する
  • Google地図と重ねる場合、Proj4js.transformで変換する必要あり
    var source = new Proj4js.Proj('EPSG:4326');
    var dest = new Proj4js.Proj('EPSG:900913');
    var p1 = new Proj4js.Point(<%= @lon1 %>, <%= @lat1 %>);
    var p2 = new Proj4js.Point(<%= @lon2 %>, <%= @lat2 %>);
    Proj4js.transform(source, dest, p1);
    Proj4js.transform(source, dest, p2);
    map.zoomToExtent(new OpenLayers.Bounds(p1.x, p1.y, p2.x, p2.y), false);
  • WMSで現在表示している箇所以外の部分までタイルをとりに行っておそい。bufferに0を指定
    var mywms = new OpenLayers.Layer.WMS(
           "gis_test",
           "<%= wms_path %>",
           {layers: 'gis_test',
            format: 'image/png'},
           {isBaseLayer: false, visibility: true, opacity: 0.5, buffer: 0});

投稿者志田 | パーマリンク

| append.gif

テスト/Paros (63d)

更新日 2010-04-13

使ってていろいろ気をつけたいことのメモ
随時更新。

準備編

  • とりあえず時間がかかるので範囲はできるだけ絞ってこまめ目に実施すべし
  • SpiderはJSが解釈できないので当てにならない
  • 手動で全パラメータがサーバーに飛ぶようなケースを教えてあげる必要あり(自分でHTMLをパースしてパラメータを類推したりすることはないっぽい)
  • Analyze -> Scan Policy で、今回はSQL Injectionのみ、のようにチェックする内容を制限することで範囲を絞るべし
  • 今回はトップの検索だけ、とかのようにテスト対象のコンテンツも絞るべし
  • JavaScriptとか、画像とかCSSとかに対してもSQL Injectionなどをテストしてしまう。無駄なので、これらも「Purge(from DB)」で削除しておくべし
  • /?xxx=bbb のようなページはなぜかscan対象にしてくれない。なぜだろう。 /xxx?yyy=zzz のように一時的にでもURLを変更すべし
  • バグ修正、未開発などもなくしておく
  • パフォーマンスチューニングした後にやった方がいい

テスト中注意すること

  • 回線が切断されたりしないこと。切断されると、すべて完了しました、みたいに出て終了してしまう
  • 開発をとめておくこと。開発の影響でエラーがでるとscanの結果がおかしくなる
  • 同様にDBデータの再構築などもできない。
  • 一回テスト完了後、Scan Policyを変えたり、ファイルをOpenで読み直したり、別ファイルに保存しなおしたりして、再度テストを実施しても、何も起きない。Parosを再起動し、新しくセッションを作り直すところからやると、テストしてくれるみたい。意味不明。
  • フォームでファイルアップロードやると、遅くなる。上げるなら軽いファイルを上げるようにしたい。
  • メールが配信されるような場所をテストする場合、関係者にメールが飛びまくる場合があるので注意

投稿者志田 | パーマリンク

| append.gif

Ruby on Rails/Rails3関連 (143d)

更新日 2010-01-24

なんか見つけたらわかることだけでもいいからメモっていくことに。

まとめサイト

Rails 3 and the Real Secret to High Productivity より。

  • いきなり分からんが ^^;
    In Rails 3, ActionController::Base is built on top of ActionController::Metal ...
    うーん、
    • ActionController::Metalというのが用意される
    • それには、callbacks, rendering, layouts, helpersがないがその分高速
    • ActionController::BaseはActionController::Metalを継承している?
    • ActionController::Baseが、必要に応じて内部的にincludeしてくれるんで、callbacksなどを使わなければActionController::Baseがめちゃ早いってこと? わからん。。
  • URL /loginを GETメソッドなら、SessionsController#loginに
  • POSTメソッドなら、SessionsController#createに
  • そんな感じでルーティングする、ってことかな。URLにこだわりたい人向け?
    contrller :sessions do
      match 'login', do
        get :new, :as => :login
        post :create
      end
    end
  • routesで、resourcesの入れ子のとき、こんな風に記述できるらしい。
    resources :projects, :controller => :project do
      resources :attachments
      resources :participants do
        :put => :update_all, :on => :collection
      end
      resources :companies do
        resources :people
        resource :avator
      end
    end
  • XSS対策、デフォルトでサニタイズされるらしい。rawでサニタイズさせないらしい。
    <%# => "I'm hacked you good! &lt;sciprt&gt;" %>
    <%= comment.body %>
    <%# => "I'm hacked you bad! <script>" %>
    <%= raw comment.body %>
  • link_to_remote -> link_to :remote => true みたいになって、生成されるHTMLにJavaScriptが含まれなくなり、unobtrusive javascript になるらしい
    <%= link_to "Delete", @comment, :remote => true, :method => :delete %>
    <a href="/comments/1" data-remote="true" data-method="delete">Destroy</a>
  • このdata-xxx っていうのは、HTML5のdata-xxx アトリビュートらしい(参考: http://zaa.ch/past/2009/5/23/unobtrusive_javascript_in_rails_3/)

My Five Favorite Things About Rails 3 | Engine Yard Blog

  • respond_toが宣言的に記述できるらしい
    respond_to :html, :xml # class level
    
    def create
      @user = User.new(params[:user])
      flash[:notice] = 'User was successfully created.' if @user.save
      respond_with(@user)
    end
  • ActiveModelというのができて、ActiveRecordを継承しなくてもバリデーションできるらしい。
    class Person
      include ActiveModel::Validations
    
      validates_presence_of :name
      attr_accessor :name
      def initialize(name)
        @name = name
      end
    end
    
    Person.new.valid?         #=> false
    Person.new.errors         #=> {:name => ["cannot be blank"]} # localizable of  course
    Person.new("matz").valid? #=> true

Customizing your scaffold template become easier in Rails3

  • scaffoldのテンプレートのカスタマイズが楽になるらしい
  • RAILS_ROOT/lib/templates/rails/scaffold_controller/controller.rb に
    置いておけばそれをテンプレートにしてくれるらしい。
  • scaffoldに限らずgeneratorは全部?

Rails 3 の Gem 管理ツール Bundler を使う - ursmの日記

  • rake gem ではなく、Bundlerという仕組みを使うらしい
  • config/environment.rbではなく、Gemfileに読み込みたいgemを書くらしい
  • gem bundle でインストールされるらしい

投稿者志田 | パーマリンク

| append.gif

Flash/FeliCa ナイトでFlashによるFeliCaとの通信をする勉強会に参加しました (152d)

更新日 2010-01-14

勉強会 概要

  • SDK for FeliCa & Adobe AIR / Adobe Flash勉強会開催のお知らせ(募集終了)
    http://blog.felicalauncher.com/sdk_for_air/?p=623
    > 日時:2010年1月12日(火)18:00開場、18:30スタート、20:30終了予定
    > 場所:アドビ システムズ 株式会社 会議室

当日、参加した人数は 7人x6列 = 40人強 くらい。

私は途中から参加です(;;

当日参加できなかった方も、下記に USTREAM があるのですが、最初は音声が入っていなかったようでちょっと分かりづらいかも^^;
http://www.ustream.tv/channel/felica-night

以下、勉強会のメモと、勉強会後にSONYの方に話が聞けたので書いていきます。

  • いつものように「タケ:hogehoge」は私のメモです。

「Flash/FeliCa ナイトでFlashによるFeliCaとの通信をする勉強会に参加しました」 の続きを読む

投稿者竹村 | パーマリンク

| append.gif

Ruby on Rails/RESTfulAuthenticationに権限管理を追加する「role_requirement」プラグイン (152d)

更新日 2010-01-14
  • 認証プラグインとしてデファクトスタンダードな「RESTfulAuthentication」には権限の概念がない
  • timcharperさんが作った「role_requirement」プラグインを追加してやれば権限管理ができるようになる!

インストール

  • 次のコマンドを実行
    script/plugin install git://github.com/technoweenie/restful-authentication.git
    script/plugin install git://github.com/timcharper/role_requirement.git 

セットアップ

  • 次のコマンドを実行
    ./script/generate authenticated user sessions
    ./script/generate roles Role User 
  • Userは、authenticatedに指定したモデルクラス名
  • Roleは、権限をあらわすモデル名
  • 次のファイルが作らる
    test/fixtures/users.yml
    test/fixtures/roles.yml
    app/models/role.rb
    lib/role_requirement_system.rb
    lib/role_requirement_test_helper.rb
    lib/hijacker.rb
    db/migrate/20100111002832_create_roles.rb
  • テーブルを作る
    rake db:migrate
  • 次のテーブルができた
    • roles
    • roles_users

使い方

  • rolesとusersはhabtmの関係
  • rolesには「name」というカラムがあるだけ
  • rolesに「admin」「user」などの値を持つレコードをいれておく
  • コントローラー内に宣言的に記述
    • このコントローラーのすべてのアクションはadmin権限が必要
      require_role "admin"
    • このコントローラーのindexアクション以外はadmin権限が必要
      require_role "admin", :for_all_except => :index
    • このコントローラーのindexアクションはadmin権限が必要
      require_role "admin", :for => :index
    • このコントローラーのすべてのアクションは「admin」と「executive」権限が必要
       require_role "admin"
       require_role "executive"
    • このコントローラーのすべてのアクションは「admin」と「executive」権限が必要。ただし、「index」アクションのみ「admin」権限のみでOK
       require_role "admin"
       require_role "executive", :except => [:index]
    • このコントローラーのすべてのアクションは「admin」権限が必要。さらに「create」「update」「edit」「destroy」は「executive」権限も必要
       require_role "admin"
       require_role "executive", :only => [:create, :update, :edit, :destroy]
    • このコントローラーのすべてのアクションは「admin」権限、または「executive」権限が必要
       require_role ["admin", "executive"]
    • このコントローラーの「list」アクションと「show」アクション以外はadmin権限が必要
       require_role "admin", :except => [:list, :show]
    • このコントローラーの「delete」アクションと「edit」アクションのみadmin権限が必要
       require_role "admin", :only => [:delete, :edit]
  • current_userに指定されたroleが紐づいていれば、要求されたアクションが実行される
  • 紐づいていなければ AuthenticatedSystemのaccess_denied が呼ばれる

常に「admin」というroleの人はなんでも許可されるようにしたい

  • デフォルトでそうなっている
  • app/model/user.rbに次のメソッドが追加されるているため
    	def has_role?(role_in_question)
    		@_list ||= self.roles.collect(&:name)
    		# return true if @_list.include?("admin") #This is the culprit.
    		(@_list.include?(role_in_question.to_s) )
    	end

tag: Ruby on Rails

投稿者志田 | パーマリンク

| append.gif

Ruby on Rails/PostgresSQLを使う (156d)

更新日 2010-01-10
  • 以下インストールの流れ
    vi config/environment.rb //config.gem "pg" を追加
    rake gems:unpack:dependencies
    rake gems:build
    vi config/database.yml
  • database.ymlの中身はこんな感じ
    development:
      adapter: postgresql
      database: xxx_development
      username: xxx
      password: xxx
      host: localhost
      encoding: utf8
      template: template0

tag: Ruby on Rails

投稿者志田 | パーマリンク

| append.gif

Ruby on Rails/Railsプロジェクトを作るときに最初にやること (156d)

更新日 2010-01-10
  • 最初にセットアップするときに毎度やることをメモ
  • 間違ってるところとか、追加することがあるので随時更新します(wikiなので)
  • まずrailsコマンドでrailsの開発ディレクトリを作る
    rails myproject
    cd myproject
  • 現バージョンでfreeze
    rake rails:freeze:gems
  • database.ymlをrename
    mv config/database.yml config/database.yml.default
  • rspecを追加 (参考: http://wiki.github.com/dchelimsky/rspec/rails)
    ruby script/plugin install git://github.com/dchelimsky/rspec.git -r 'refs/tags/X.X.X'
    ruby script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 'refs/tags/X.X.X'
    ruby script/generate rspec
  • haml,sassを追加
    ruby script/plugin install git://github.com/nex3/haml.git
    ruby script/plugin install git://github.com/dfischer/rspec-haml-scaffold-generator.git
  • 国際化
    ruby script/plugin install git://github.com/amatsuda/i18n_generators.git
    ruby script/generate i18n ja
  • jqueryを追加
    ruby script/plugin install git://github.com/aaronchi/jrails.git
  • rcovを追加
    vi config/environment.rb # config.gem "rcov" を追加
    rake gems:unpack:dependencies
    ruby script/plugin install git://github.com/commondream/rcov_plugin.git
  • 一旦commit
    svn import -m 'プロジェクトの初期設定' SVNレポジトリ/trunk/rails
  • それをcheckout
    svn checkout SVNレポジトリ/trunk/rails
    logなどをignore
    svn remove log/*.log
    svn propset svn:ignore "*.log" log
    svn propset svn:ignore "*" tmp/cache/
    svn propset svn:ignore "*" tmp/sessions/
    svn propset svn:ignore "*" tmp/sockets/
    svn propset svn:ignore "*" tmp/pids/
    svn propset svn:ignore "database.yml" config/
  • gemをbuild
    rake gems:build

tag: Ruby on Rails

投稿者志田 | パーマリンク

| append.gif

Movable Type/MT4 mysql4とMT5 mysql5を同じサーバーで動かすときのmt-config.cgiの書き方 (160d)

更新日 2010-01-06

概要

MT5からMySQL5が対象となったので、開発環境は MT4 MySQL4 と、MT5 MySQL5 の2つのDBを1つのサーバー上で運用するようにしました。

MT4 は既存の通りだったので、インストールする時のDBの指定方法は、

  • DB名
  • DBホスト (localhost)
  • DBユーザー
  • パスワード
    を入力します。

MT5 の場合は、同じ条件だとMySQL4を使うので変更する必要があります。
その変更方法と、調べ方をまとめました。

MT5 のインストール時に MySQL5 を指定する方法

MT5のドキュメントより、

対話式インストールウィザードの実行
http://www.movabletype.jp/documentation/mt5/installation/mt-wizard.html#database

データベースソケット というのを指定するようです。

うんちゃら.sockファイルがどこにあるかを調べる必要があります。

「Movable Type/MT4 mysql4とMT5 mysql5を同じサーバーで動かすときのmt-config.cgiの書き方」 の続きを読む

投稿者竹村 | パーマリンク

| append.gif

MovableType(MT)/スカイアークさんの「MovableTypeエンジニアの夕べ」に参加 (182d)

更新日 2009-12-15

目次

スカイアークさんのMovableTypeエンジニアの夕べに参加しました

  • 昨日(12月9日)スカイアークさんの「MovableTypeエンジニアの夕べ」に参加しました
  • (たしか)25名以上の方が参加しており、非常にリラックスしたムードの中、楽しい・非常にためになる・刺激的な発表が続きました
    • 発表内容は後日スカイアークさんのサイトで公開されると思います。
  • 最後には最優秀MovableTypeエンジニアをクイズで決定し、優勝者には、2万円相当の北海道の名産や、旅行券(いずれか1つ)が選べる、という大奮発な企画も!
  • 会の終了後、参加者全員に北海道のお土産が多数配られました。
  • 僕がもらったのは↓の銘菓「三方六」。とってもおいしかったです! :D
  • Item3_20080403203335_2L.jpg
  • スカイアークさんのMTに対する情熱と、ユーモアと、参加者へのおもてなし、and 北海道への愛を感じたとても楽しい会でした。
  • 僕も会が始まる1時間前に↓発表内容をまとめて無理やりしゃべりました ^^;
  • 第二回もあるとうれしいな!

A-Formご紹介

A-FormのMT4からMT5への対応で必要だった作業

  • MT5にA-Formをいれてみて動かないところを直す
  • で、いれてみたら、全然動かないので、MT4とMT5同時サポートは諦める方針とした

  • 以下直したところ↓
  • MT5はjQueryが同梱されることになった
    • A-FormもjQueryを同梱してるので、MT5側jQueryが呼ばれたりしてうまく動作しない問題が発生
    • MT側のjQueryを使うと毎度バージョンがかわって大変なのでAForm内のjQueryを使うことにした
    • 「$」 -> 「aform$」 jQuery ->「aform_jQuery」として修正して利用
    • AFormが依存している他のJSライブラリも要修正
  • openDialog() が使えなくなった
    • <a>タグにクラス指定する形に変更
      <a class="mt-open-dialog" 
  • 管理画面のデザインが変わったことにでレイアウトが崩れた
    • 地道に修正
  • ソースコード内の日本語が文字化け
    • UTF8フラグ関係で化けてるらしい
    • 言語ファイルにちゃんと追い出す
  • jsonの文字化け
    • MT本体のJSONライブラリのバージョン変更によるもの
    • MT4.25のバージョンアップ時にも苦労した
    • どうしても化けるので 日本語をURLエンコードしてからJSONにいれて、JSONから復元するときも、URLでコードを
    • MT5ではUTF8フラグをつけたままだと文字化け(よくわからないが)
    • 次のようにして対処
      • UTF8フラグを取る
        utf8::encode($str); 
      • 文字をコードに変換
      • JSONからオブジェクトに変換
      • コードを文字に変換
      • UTF8フラグ付ける
  • メールで文字化け
    • mt-config.cgiに DefaultLanguage ja を書いたら解消
  • 「ウェブサイト」画面でメニューにAFormのメニューがでない
    • 以前の書式
      menus => {
        'aform:list' => {
                    label => 'List',
                    mode => 'list_aform',
                    condition  => sub { AForm::CMS::aform_user_permission() },
        },
      }
    • 下記の記述ならでる
      menus => {
        'aform:list' => {
                  label => 'List',
                  mode => 'list_aform',
                  condition  => sub { AForm::CMS::aform_user_permission() },
                  view => [ "blog", 'website', 'system' ],
        },
      }
    • view に "user" を追加するとダッシュボードにも出すことができる
  • CSVエクスポートでSJISに変換されない
    • 下記記述だった
      print MT::I18N::encode_text($buf, '', 'sjis');
    • 次のように修正
      print MT::I18N::encode_text($buf, '', 'shift_jis');

会員限定ページ用プラグイン「DynamicAuthentication」のご紹介

  • ダイナミックパブリッシングの場合のみ動作
  • インストールしたらプラグインの設定画面で以下を設定

skyarc_meeting-20091209-1.png

  • auth.cgiのパス
    • auth.cgiとはログイン画面を表示するCGIです。DyamicAuthentication内に同梱されており、設置場所も変更可能です。設置した場所に応じてこちらのURLの設定も変更します。
  • 認証対象のブログID
    • ここで、指定されたブログのページを表示する際、認証チェックが行われるようになります。
    • ここで指定したIDのブログはダイナミックパブリッシングである必要があります。
  • ユーザー情報が格納されているブログのID
    • 認証対象となるアカウント情報は、ここで指定したブログにエントリーとしてあらかじめ追加しておきます。DyamicAuthenticationプラグインは、現状は、ユーザー自身によるユーザー登録には対応しておりません。
  • ユーザーIDが格納されているフィールド名
    • 上記「ユーザー情報が格納されているブログのID」で指定したブログにここで指定したフィード名のカスタムフィールドを追加し、そこに、認証対象となるユーザーのログインIDを指定します。
  • パスワードが格納されているフィールド名
    • 上記「ユーザー情報が格納されているブログのID」で指定したブログにここで指定したフィード名のカスタムフィールドを追加し、そこに、認証対象となるユーザーのパスワードを指定します。
  • 上記「認証対象のブログID」がパブリッシュするページにアクセスすると、クッキーで認証されたかどうかを判定
  • クッキーがなければ、「auth.cgiのパス」で指定されたURLにリダイレクト。下記のようなログイン画面が表示される。(ログイン画面はMTテンプレート「plugins/DynamicAuthentication/tmpl/login.tmpl」にて編集可能)

skyarc_meeting-20091209-2.png

  • auth.cgiで無事認証がとおれば、認証前にアクセスしようとしたページへリダイレクトされる

tags: MovableType

投稿者志田 | パーマリンク

| append.gif

git/第一回勉強会 (184d)

更新日 2009-12-13

僕自身勉強中なんですが。

第一回git勉強会

動画

まず概念から

  • 分散レポジトリ管理とは?

「git/第一回勉強会」 の続きを読む

投稿者志田 | パーマリンク

| append.gif

MapServer/導入 (203d)

更新日 2009-11-24

ubuntu 8.04 ltsにて、Rails + PostGIS + MapServer + OpenLayersの環境構築のメモ

PostGISとは

MapServerとは

OpenLayersとは

  • MapServerのようなWebGISサーバーと連携可能なJS用ライブラリらしい
  • Google MapsのようなAPIが提供されるらしい
  • Google Mapsとも連携可能

Rails + PostGIS + MapServer + OpenLayersとはどんなアーキテクチャか?

ユーザー       OpenLayers   Apache + mod_rails  Rails          MapServer      PostGIS
   |            |               |               |               |              |
   +----------> |               |               |               |              |
                +--------------->
                                +-------------->|               |              |
                                                +-- mapscript ->|              |
                                                                +-------------->
                                                                 <--空間データ--+
                                                |<--- 画像 -----+
                                |<--------------|
                 |<-------------+
   |<------------

MapServerのインストール

apt-get  install cgi-mapserver
  • 最初のチュートリアルを動かしてみる。
    http://www.mapserver.org/tutorial/example1-1.html
  • mapfiles/example1-1.map 内の
     SHAPEPATH      "/ms4w/apps/tutorial/data"
    を、解凍して移動してできたdataのパスに変更
  • mapservに直接アクセスする
    http://ホスト/cgi-bin/mapserv?map=/回答したディレクトリ/mapfiles/example1-1.map&layer=states&mode=map
  • これで変な地図が出てきたらOK

PostGISのインストール

  • PostgreSQL と PostGISのインストール
    apt-get install postgresql-8.3-postgis
  • おれ最前線ねっと - [Ubuntu]Ubuntu8.10でPostGISを使えるようにする。[PostGIS]
    http://ore.saizensen.net/archives/160

MapServer + PostGISを試してみる

  • ここが参考になる

[ThinkIT] 第2回:MapServerで地図を表示してみよう (1/3)
http://www.thinkit.co.jp/free/article/0701/9/2/

MapServerのWMS化を試す

  • ここが参考になる

WMS Server ― MapServer 5.4.2 documentation
http://mapserver.org/ogc/wms_server.html

  • ENDの数があってなくてこういうエラーがでて嵌った orz
<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://schemas.opengis.net/wms/1.1.1/exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1">
<ServiceException code="LayerNotDefined">
msWMSLoadGetMapParams(): WMS server error. Invalid layer(s) given in the LAYERS parameter.
</ServiceException>
</ServiceExceptionReport>

MapServerのWMSとGoogle Mapsを重ねて出す

Rubyからいじる

  • MapScriptのRubyライブラリのインストール
    apt-get install  libmapscript-ruby1.8

投稿者志田 | パーマリンク

| append.gif

Ruby on Rails/動的条件でhas_oneしEagerLoad (221d)

更新日 2009-11-06

拙速メモ

  • dogxiの犬のランキングの部分ではまったのでメモ
  • 犬は 直近10日間のランキング、直近30日間のランキングなど、複数のランキングを持つ
     has_many :user_rankings, :dependent => :destroy
  • 直近30日のランキングを表示するときは、直近10日間のランキングのインスタンスを生成せずに、直近30日間のrankingだけeager loadしたい
  • has_oneのconditionを動的に設定できないか、検討したがうまくいかない

    参考: dynamic condition for has_one and eager loading issue - Ruby Forum
    http://www.ruby-forum.com/topic/170709

  • 解決方法 => has_oneではconditionを指定せず、find時に指定する
    has_many :user_rankings, :dependent => :destroy
    has_one :current_user_ranking, :class_name => 'UserRanking', :foreign_key => :user_id
  • 検索時にconditionで絞ってやる
    dogs = Dog.find(:include    => :current_user_ranking,
                    :conditions => ['user_rankings.ranking_id=?', ranking_id])
  • これで dogs[0].current_user_ranking で取れる。

ついでに

  • will_paginate で includeがうまく動作しない、とどこかのブログにあったけど、僕が試したところはうまくいった。バージョンは2.3.6。

投稿者志田 | パーマリンク

| append.gif

HTML5 3Days Tech Talk:HTML5に搭載されるAPIの勉強会 (254d)

更新日 2009-10-05

HTML5 3Days Tech Talk

HTML5 3Days Tech Talk の勉強会にいってきました。

2009年10月1日 19:00〜、2009年10月2日 19:00〜 で、私は2日目に行きました。
渋谷のGoogle 東京オフィスです。

目次

  • HTML5 3Days Tech Talk
  • 始まる前に
  • では、はじまりはじまり〜
  • オフラインWebアプリ
    • HTML5について、オフラインアプリに関して。
    • アプリケーションキャッシュ
    • Web Database
    • Web Strage
    • Web Workers (ワーカ)
    • HTML5時代のwebアプリ
    • まとめ
  • Canvasチュートリアル
    • Canvasとは
    • canvasの使い方
    • 描画とちらつき
    • つかいどこ
    • まとめ

始まる前に

実は HTML5 の仕様はぜんぜんノーチェックのまま行きました^^;
「オフラインアプリケーション」の文字があったので、その辺をチェックしたい感じです。

行く直前に HTML5 日本語化のサイトを確認してからいきました

下記のように、なにやらソレっぽいAPIが見つかってわくわくです。

「HTML5 3Days Tech Talk:HTML5に搭載されるAPIの勉強会」 の続きを読む

投稿者竹村 | パーマリンク

| append.gif

ネットワーク/EC2/EBSを使用する (254d)

更新日 2009-10-04

ネットワーク/EC2
EBSの作成とマウントのメモ

参考:

インスタンスの確認

とりあえず鍵ファイルをEXPORTしておく。

# export EC2_CERT=*****************************.pem
# export EC2_PRIVATE_KEY=********************************.pem

ec2-describe-instancesを使ってインスタンスのIDやロケーションを確認する。

#ec2-describe-instances
RESERVATION     r-********      ************    webserver
INSTANCE        i-********      ami-********    *****************.compute-1.amazonaws.com      domU-****************.compute-1.internal       running ******  0 m1.small 2009-07-22T07:34:49+0000        us-east-1d      aki-********    ari-********            monitoring-enabled
RESERVATION     r-********      ************    dbserver
INSTANCE        i-********      ami-********    ******************.compute-1.amazonaws.com      domU-***************.compute-1.internal       running ******  0 m1.small 2009-07-27T07:59:57+0000        us-east-1d      aki-********    ari-********            monitoring-disabled

上記 i-******** がインスタンスのID、us-east-1dがロケーションとなる。

「ネットワーク/EC2/EBSを使用する」 の続きを読む

投稿者斉藤 | パーマリンク

| append.gif

JavaScript/IEで「注意識別子、文字列または数がありません。」 (257d)

更新日 2009-10-01

すごい小さな備忘録

IE8にて

{class: 'big'}

見たいなJSON表記が、IEだと、

識別子、文字列または数がありません。

というエラーが出る。

{'class': 'big'}

とすべき。

同様に

hoge.class = 'big'

みたいのもNG

hoge['class'] = 'big'

ならOK

投稿者志田 | パーマリンク

| append.gif

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-01-30 (水) 18:01:55 (946d)

アークウェブのサービスやソリューションはこちら