rails4でjquery-ui-railsを使って画像が表示されない場合
これはハマる。
rails4になってasset pipelineの挙動が変更になったようで、今までのようにgemfileにjquery-ui-railsを追加しただけでは、うまく画像のパスを探せずに画像が表示されない。
解決策としては手動でjquery-uiをダウンロードしてcss、js、imagesを追加する。
日本語化する場合はui/i18nの下にある日本語化のjsも忘れずに。
rails4ではapp/assets以下のパスを参照するとエラーになるので、app/assets/stylesheetsに追加したjquery-uiのimagesディレクトリをpublic以下に移し、jquery-ui-1.10.4.cssの画像パスを変更する。
前
url("images/ui-bg_flat_0_aaaaaa_40x100.png")
後
url("/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png")
*この場合、public/images/jquery-ui以下に画像を置いている。
あー、すっきりした。
rails3 on ubuntu wiht Amazon EC2
色々はまったのでメモ。
ubuntu+rvm+zlibは鬼門かも。
- AMIの起動Community AMIs にて "ubuntu-lucid" を検索-AMIの起動
Community AMIs にて "ubuntu-lucid" を検索し、Manifest を降順に整列して最新のものを選択。
ssh -i AWS_KEY.pem ubuntu@ec2-***.amazonaws.com
- rootパスワードの変更
sudo passwd root
- パッケージの更新
sudo aptitude update sudo aptitude safe-upgrade sudo aptitude install unzip emacs
- AMI Toolsのインストール
cd /usr/local/src/ sudo curl -O http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip sudo unzip ec2-ami-tools.zip -d /usr/local
- Amazon EC2 API Toolsのインストール
cd /usr/local/src sudo wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip sudo unzip ec2-api-tools.zip cd ec2-api-tools-1.4.2.2 sudo cp -r bin /mnt sudo cp -r lib /mnt
- jreのインストール
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" sudo apt-get update sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts
export EC2_HOME=/mnt export PATH=$PATH:$EC2_HOME/bin export EC2_PRIVATE_KEY=$EC2_HOME/pk-***.pem export EC2_CERT=$EC2_HOME/cert-***.pem export JAVA_HOME=/usr/lib/jvm/java-6-sun export EC2_AMITOOL_HOME=/usr/local/ec2-ami-tools-1.3-*** export PATH=$PATH:${EC2_AMITOOL_HOME:-EC2_HOME}/bin source ~/.bashrc [return]
確認
source ~/.bash_profile ec2ver which ec2-bundle-vol
- gitのインストール
sudo aptitude install git-core
- rubyのインストール
sudo aptitude install ruby
- gemのインストール
cd /usr/local/src sudo wget http://rubyforge.org/frs/download.php/74234/rubygems-1.5.2.tgz sudo tar xvzf rubygems-1.5.2.tgz cd rubygems-1.5.2/ sudo ruby setup.rb
シンボリックリンクの作成
cd /usr/bin sudo ln -s /usr/bin/gem1.8 gem sudo gem update --system
- rvmのインストール
bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
.rvmrcに以下を追加
export rvm_pretty_print_flag=1
.bashrcに以下を追加
# rvmのインストールで既に.bash_profileに追加済みなら不要 [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
- パスを適用
source ~/.bash_profile
- rvmを最新化
rvm get head rvm reload
- rubyのインストール
# For Ruby (MRI & ree) & ruby-head, you should install the following OS dependencies sudo aptitude install build-essential bison autoconf # If you wish to install rbx and/or Ruby 1.9 head (MRI) (eg. 1.9.2-head), then you must install and use rvm 1.8.7 first. rvm install 1.8.7 rvm package install readline rvm package install zlib rvm package install openssl # then ruby 1.9.2 rvm install 1.9.2 --default -C --with-openssl-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr --with-zlib-dir=$rvm_path/usr
- railsのインストール
gem install rails
- mysqlのインストール
sudo aptitude install mysql-server mysql-client libmysqlclient-dev gem install mysql # /etc/mysql/my.cnfの編集 [client] port = 3306 socket = /var/run/mysqld/mysqld.sock default-character-set=utf8 # 追加
- apacheのインストール
sudo aptitude install apache2 sudo /etc/init.d/apache2 start
- passengerのインストール
gem install passenger sudo aptitude install libcurl4-openssl-dev libssl-dev libopenssl-ruby apache2-prefork-dev libapr1-dev libaprutil1-dev passenger-install-apache2-module
- passenger設定ファイル
# /etc/apache2/mods-available/passenger.load LoadModule passenger_module /home/ubuntu/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.6/ext/apache2/mod_passenger.so # /etc/apache2/mods-available/passenger.conf PassengerRoot /home/ubuntu/.rvm/gems/ruby-1.9.2-p180/gems/passenger-3.0.6 PassengerRuby /home/ubuntu/.rvm/wrappers/ruby-1.9.2-p180/ruby
- apache設定ファイル
cd /etc/apache2/mods-enabled sudo ln -s ../mods-available/passenger.load passenger.load sudo ln -s ../mods-available/passenger.conf passenger.conf # /etc/apache2/sites-availables/*** <VirtualHost *:80> ServerAdmin test@test.com ServerName test.com # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. LogLevel warn SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(ico)|(js)|(css)$" no_log CustomLog /var/log/apache2/test.com/access.log combined env=!no_log ErrorLog /var/log/apache2/test.com/error.log DocumentRoot /home/ubuntu/rails/test.com/public <Directory /home/ubuntu/rails/test.com/public> Allow from all Options FollowSymLinks -MultiViews </Directory> </VirtualHost> <VirtualHost *:80> ServerName www.test.com Redirect permanent / http://test.com/ </VirtualHost>
- siteの有効化
sudo a2ensite ***
- sendmailのインストール
sudo aptitude install sendmail
- ImageMagickのインストール
sudo aptitude install imagemagick
- RMagickのインストール
sudo aptitude install libmagick9-dev gem install rmagick
- AMIの登録
# 証明書の転送 scp -i AWS_KEY.pem cert-***.pem ubuntu@ec2-***.compute-1.amazonaws.com:/home/ubuntu scp -i AWS_KEY.pem pk-***.pem ubuntu@ec2-***.compute-1.amazonaws.com:/home/ubuntu # sshで接続、証明書を/mntディレクトリへ移動 ssh -i ***.pem ubuntu@*** sudo cp cert-***.pem /mnt sudo cp pk-***.pem /mnt cd /mnt/ # ERROR: You need to be root to run /usr/local/ec2-ami-tools-1.3-57676/lib/ec2/amitools/bundlevol.rbと怒られるのでrootに su source /home/ubuntu/.bash_profile # イメージを作成する ec2-bundle-vol -d /mnt --cert cert-***.pem --privatekey pk-***.pem --user *** --fstab /etc/fstab # Please specify a value for arch [i386]:と聞かれたらそのままリターン amitools/crypto.rb:13:in `require': no such file to load -- openssl (LoadError)とエラーになるようなら sudo apt-get install libopenssl-ruby # S3にイメージを送る ec2-upload-bundle --bucket BUCKET_NAME --manifest image.manifest.xml --access-key *** --secret-key *** # イメージを登録する ec2-register BUCKET_NAME/image.manifest.xml -n BUCKET_NAME --cert dert-***.pem --private-key pk-***.pem # 自分で登録したAMIを確認したい時は ec2-describe-images -o self # AMIの削除 ec2-deregister ami-***
EXC_BAD_ACCESSのエラーが出たら。。。
大抵の問題はオブジェクトのretain忘れです。
すでに開放されているオブジェクトにあとからアクセスしようとして、
「そんなオブジェクトはもうないよ」、
と怒られているというのが真相のようです。
なので、autorelease、releaseのタイミングを疑ってみるとよいです。
http://www.iphonedevsdk.com/forum/iphone-sdk-development/925-exc_bad_access.html
CentosのMySQLで文字化けに苦しんだら...
/etc/my.confに
default-character-set = utf8 skip-character-set-client-handshake
も追加した。
mysql> show variables like 'character_set%';
とやっても文字コードはutg8のはず...
むろん、
mysql> status -------------- mysql Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i686) using readline 5.0 Connection id: 2 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.0.45 Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 1 min 38 sec Threads: 1 Questions: 4 Slow queries: 0 Opens: 12 Flush tables: 1 Open tables: 6 Queries per second avg: 0.041 --------------
こうなっている!という方。
ここれが最後の答えかも。
以下の方法でコード上からMySQLの文字コードを取得する。 ========================================= #!/usr/bin/ruby -Ku require 'mysql' my = Mysql.init() my.real_connect("localhost", "user", "password", "DBname") p my.character_set_name() ========================================= 結果:"latin1"らしい。 mysql_options()のパラメータで文字コードを設定できるらしい。 ========================================= #!/usr/bin/ruby -Ku require 'mysql' my = Mysql.init() my.options(Mysql::SET_CHARSET_NAME, "utf8") my.real_connect("localhost", "user", "password", "DBname") p my.character_set_name() =========================================
けいさん、ありがとうございました!
けいの開発記録
追記:
成果物公開しました。
芸能人ブログで紹介されている商品が検索できるサイト | セレブログ
Centosのrailsにmysqlドライバーをインストールしましょう。
wget http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.8.1.tar.gz tar xvf mysql-ruby-2.8.1.tar.gz cd mysql-ruby-2.8.1.tar.gz ruby extconf.rb --with-mysql-config=/usr/bin/mysql/mysql_conf # テストを行う場合 ruby ./test.rb -- hostname user passwd dbname make install
詳細はこちらを参照のこと。
http://www.tmtm.org/ja/mysql/ruby/
rubyのクラスメソッドについて
理解があやふやだったのですが、
この記事を読んでスッキリと霧が晴れました。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/31193
1. Rubyのメソッドは、次の2種類に分けられます。
- インスタンスメソッド
- 特異メソッド
1.1. インスタンスメソッドは、そのクラスのインスタンスはどれでも使えま
す。これに関しては特に理解に問題はないかと思います。
例: class A def a print "a" end end a1 = A.new a2 = A.new a1.a # => "a" a2.a # => "a"
1.2. 特異メソッドは、ある特定のオブジェクトだけが使えるメソッドです。
これを定義するには、通常、"def クラス名.メソッド名" という書式を
使います(*1)。
例: a3 = A.new def a3.aa print "aa" end a3.aa # => "aa" a1.aa # => エラー
この特異メソッドの概念は、C++やJavaにはないものです。
2. Rubyでは、クラスも一つのオブジェクトです。
クラスを定義するということは、クラスオブジェクトを一つ生成するとい
うことでもあります。クラスAを定義すると、Aというクラスオブジェクト
が作られるわけです。
クラスメソッドは、このクラスオブジェクトが持つ特異メソッドです(*2)。
例: (1.2の例と見比べてみてください) def A.aaa print "aaa" end A.aaa # => "aaa"
クラスメソッドを使えるのはクラスオブジェクトAという特定のオブジェク
トだけですから、そのクラスのインスタンスa1、a2、a3では使えません。
例:
a1.aaa # => エラー
2.1. 但し、クラスオブジェクトは、特異メソッドに関して通常のオブジェク
トとは少し異なった特殊な振る舞いをします。
2.1.1. クラスオブジェクトは、上位クラスの特異メソッドを受け継ぎます。
これは「ある特定のインスタンスだけが使える」という特異メソッド
の性質に対する例外です(*3)。
例: class B < A end B.aaa # => "aaa"
2.1.2. (ほかにありましたっけ?)
2.2. いってみれば、Rubyでは、クラスオブジェクトの特異メソッドを、
2.1節のような特殊な取り扱いをすることで、C++やJavaのクラスメソッド
を「模倣」しているのだ、といえます。
ですから、Rubyの世界をストレートに理解するためには、クラスメソッド
という概念をことさらに意識する必要はないと思います。