FrontPage http://www.ark-web.jp/sandbox/wiki/16.html
このページは? アークウェブのスタッフが、システム開発についての “個人メモじゃもったいないけどブログ未満”的コンテンツをまとめているWiki。 お役に立てば幸いです。B^)
Ruby on Rails/jpmobileで機種に応じた画像を出力 (6m)
- 前提
- ユーザーのプロフィール画像とか、投稿画像を携帯サイト上でも見せたい
- 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
- vendor/plugins/file_column/lib/magick_file_column.rb の110行目付近
- モデルクラスにてモバイル用画像を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
Ruby on Rails/Rails3を試してみる (10d)
necoったーがAPIの変更についていけなくてサービスが停止してすでに数年たってしまったので、Rails3で作り直したい、と思い立って、やってみた。rails3の勉強がてらで。
以下、その備忘録
Rails3環境を新規に作る †
- 参考: http://edgeguides.rubyonrails.org/getting_started.html
- 参考: http://weblog.rubyonrails.org/2010/2/5/rails-3-0-beta-release/
- gemのバージョンをあげる(元は1.3.5でした)
sudo gem update --system
- 入れてみる
gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n gem install rails --pre
- railsプロジェクトを作る
rails necotter
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
- 生成されるビューのファイルや、テストケースファイルがhamlや、rspecになってた!
- モデルも作ってみる
rails generate model neco
- factory girlのファイルも作られた
create spec/factories/necos.rb
- factory girlのファイルも作られた
- 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でデータを取ってくる †
- 参考: http://edgeguides.rubyonrails.org/active_record_querying.html#retrieving-objects-from-the-database
- 従来の書き方
@necos = Neco.find(:all, :limit => 5, :order => 'friendship DESC', :conditions => 'user_id > 0') - Rails 3流に書き直す
@necos = Neco.limit(5). order('friendship DESC'). where('user_id > 0')
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
MySQL/同一ホストに複数のMySQLを起動する (10d)
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
GoogleAnalytics/イベントトラッキングでアフィリエイト別の約定額を知る方法 (26d)
概要 †
竹村です。
アフィリエイト対応のECサイトなどで約定した時に、ちょっと工夫するとGoogleAnalyticsで追えるようになる、という方法の紹介です。
あと、イベントトラッキングにて、初めて第4引数まで入れた状態で対応してみました。
その際、何度も反映されない現象が起きたのでその共有もします。
やりたかったこと †
- アフィリエイトサイトからECサイトにアクセスされたら、セッションにパラメータを保持しておく。
- ECサイトの注文が完了したページにて、イベントトラッキングをセットしたい。
- コンバージョンをイベントトラッキングで。
- 第3引数のラベルには、アフィリエイト元のパラメータをセットする。
- 第4引数を渡すことで、該当アフィリエイトサイトからいくら約定したかを知りたい。
- なお、このECサイトの決済通貨はドルです。例: $1.25
MapServer/メモ (52d)
はまったことのメモ
- 背景を透明にする
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
OpenLayers/メモ (52d)
はまったことのメモ
- 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});
テスト/Paros (63d)
使ってていろいろ気をつけたいことのメモ
随時更新。
準備編 †
- とりあえず時間がかかるので範囲はできるだけ絞ってこまめ目に実施すべし
- 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を再起動し、新しくセッションを作り直すところからやると、テストしてくれるみたい。意味不明。
- フォームでファイルアップロードやると、遅くなる。上げるなら軽いファイルを上げるようにしたい。
- メールが配信されるような場所をテストする場合、関係者にメールが飛びまくる場合があるので注意
Ruby on Rails/Rails3関連 (143d)
なんか見つけたらわかることだけでもいいからメモっていくことに。
まとめサイト †
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! <sciprt>" %> <%= 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 でインストールされるらしい
Flash/FeliCa ナイトでFlashによるFeliCaとの通信をする勉強会に参加しました (152d)
勉強会 概要 †
- 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」は私のメモです。
Ruby on Rails/RESTfulAuthenticationに権限管理を追加する「role_requirement」プラグイン (152d)
- 認証プラグインとしてデファクトスタンダードな「RESTfulAuthentication」には権限の概念がない
- timcharperさんが作った「role_requirement」プラグインを追加してやれば権限管理ができるようになる!
- 参考: Usage - role_requirement - GitHub http://wiki.github.com/timcharper/role_requirement/usage
インストール †
- 次のコマンドを実行
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]
- このコントローラーのすべてのアクションはadmin権限が必要
- 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
Ruby on Rails/PostgresSQLを使う (156d)
- PostGISを使わないといけない案件があり、PostgreSQLを使うことに
- 参考: http://wiki.rubyonrails.org/database-support/postgres
- 以下インストールの流れ
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
Ruby on Rails/Railsプロジェクトを作るときに最初にやること (156d)
- 最初にセットアップするときに毎度やることをメモ
- 間違ってるところとか、追加することがあるので随時更新します(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などをignoresvn 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
Movable Type/MT4 mysql4とMT5 mysql5を同じサーバーで動かすときのmt-config.cgiの書き方 (160d)
概要 †
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の書き方」 の続きを読む
MovableType(MT)/スカイアークさんの「MovableTypeエンジニアの夕べ」に参加 (182d)
目次 †
スカイアークさんのMovableTypeエンジニアの夕べに参加しました †
- 昨日(12月9日)スカイアークさんの「MovableTypeエンジニアの夕べ」に参加しました
- (たしか)25名以上の方が参加しており、非常にリラックスしたムードの中、楽しい・非常にためになる・刺激的な発表が続きました
- 発表内容は後日スカイアークさんのサイトで公開されると思います。
- 最後には最優秀MovableTypeエンジニアをクイズで決定し、優勝者には、2万円相当の北海道の名産や、旅行券(いずれか1つ)が選べる、という大奮発な企画も!
- 会の終了後、参加者全員に北海道のお土産が多数配られました。
- 僕がもらったのは↓の銘菓「三方六」。とってもおいしかったです!


- スカイアークさんの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"
- <a>タグにクラス指定する形に変更
- 管理画面のデザインが変わったことにでレイアウトが崩れた
- 地道に修正
- ソースコード内の日本語が文字化け
- UTF8フラグ関係で化けてるらしい
- 言語ファイルにちゃんと追い出す
- jsonの文字化け
- MT本体のJSONライブラリのバージョン変更によるもの
- MT4.25のバージョンアップ時にも苦労した
- どうしても化けるので 日本語をURLエンコードしてからJSONにいれて、JSONから復元するときも、URLでコードを
- MT5ではUTF8フラグをつけたままだと文字化け(よくわからないが)
- 次のようにして対処
- UTF8フラグを取る
utf8::encode($str);
- 文字をコードに変換
- JSONからオブジェクトに変換
- コードを文字に変換
- UTF8フラグ付ける
- 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」のご紹介 †
- ダイナミックパブリッシングの場合のみ動作
- インストールしたらプラグインの設定画面で以下を設定
- 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」にて編集可能)
- auth.cgiで無事認証がとおれば、認証前にアクセスしようとしたページへリダイレクトされる
tags: MovableType
git/第一回勉強会 (184d)
僕自身勉強中なんですが。
第一回git勉強会 †
- 2009/09/08 参加者 志田、竹村さん、大辻さん
- ネタ元: gittutorial(7) http://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/gittutorial.html
動画 †
まず概念から †
- 分散レポジトリ管理とは?
MapServer/導入 (203d)
ubuntu 8.04 ltsにて、Rails + PostGIS + MapServer + OpenLayersの環境構築のメモ
PostGISとは †
- PostgreSQLでGISが利用可能にするPostgtreSQLの拡張
- 参考: PostGIS Manual
http://www.ne.jp/asahi/free/hiroro/postgis/manual/ - 空間データをデータベースに保存し、検索したりできる
MapServerとは †
- オープンソースなWebGISサーバー
- http://www.yaskey.cside.tv/mapserver/what.html 参照
- CGIとして動作
- 各プログラミング言語用に、MapScriptという連携用ライブラリがあり、それを通じて連携する -> http://mapserver.org/mapscript/index.html
- GISデータとして参照元として、PostgreSQL + PostGISが利用可能
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://localhost/cgi-bin/mapserv にアクセスすると、
No query information to decode. QUERY_STRING is set, but empty.
と表示される。これ動いてるらしい。 - MapServerのチュートリアル ( http://www.yaskey.cside.tv/mapserver/tutorial/
) を動かしてみる [#w5c05453]
- http://demo.mapserver.org/tutorial/mstutorial_data.zip からデータを取ってくる
cd Webからアクセスできるディレクトリ wget http://demo.mapserver.org/tutorial/mstutorial_data.zip unzip mstutorial_data.zip mv ms4w/apps/tutorial/* .
- 最初のチュートリアルを動かしてみる。
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を重ねて出す †
- OpenLayersを使ってみる - Google Maps とMapServerを重ねる:いいタイトルが浮かびません。:So-net blog
http://shigekun.blog.so-net.ne.jp/2009-04-10-1
Rubyからいじる †
- MapScriptのRubyライブラリのインストール
apt-get install libmapscript-ruby1.8
Ruby on Rails/動的条件でhas_oneしEagerLoad (221d)
拙速メモ
- 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。
HTML5 3Days Tech Talk:HTML5に搭載されるAPIの勉強会 (254d)
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 日本語化のサイトを確認してからいきました
- HTML5.JP
http://www.html5.jp/trans/
下記のように、なにやらソレっぽいAPIが見つかってわくわくです。
- WAHTWG - HTML5 Working Draft 『4.11 クライアント側のデータベースストレージ』
http://www.html5.jp/trans/whatwg_html5_4_11.html
- WAHTWG - HTML5 Working Draft 『4.10 クライアント側のキー/値ペアーのセッションと永続ストレージ』
http://www.html5.jp/trans/whatwg_html5_4_10.html
ネットワーク/EC2/EBSを使用する (254d)
ネットワーク/EC2
EBSの作成とマウントのメモ
参考:
- http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1663&categoryID=100
- http://d.hatena.ne.jp/rx7/20080825/p1
インスタンスの確認 †
とりあえず鍵ファイルを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がロケーションとなる。
JavaScript/IEで「注意識別子、文字列または数がありません。」 (257d)
すごい小さな備忘録
IE8にて
{class: 'big'}
見たいなJSON表記が、IEだと、
識別子、文字列または数がありません。
というエラーが出る。
{'class': 'big'}
とすべき。
同様に
hoge.class = 'big'
みたいのもNG
hoge['class'] = 'big'
ならOK
![[PukiWiki] [PukiWiki]](image/sandbox.gif)





