サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
パリ五輪
tkrd.hatenadiary.org
MySQL (InnoDB) のトランザクション分離レベルは、デフォルトで REPEATABLE READ です。この設定では、トランザクションの最初のクエリでデータベースのスナップショットを取ってしまうので、他のトランザクションがコミットした変更が見えません。Web アプリケーション開発では結構使いづらい分離レベルです。特に理由がないかぎり READ COMMITTED を採用したいところです。 Rails 3.x 時代までは、 ActiveRecord::Base.connection. execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED') ActiveRecord::Base.transaction do # ... end のように書かなければなりませんでしたが、Rails 4 でトランザクションごとに分離レベルを指定で
% wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12-debian6.0-x86_64.deb % sudo dpkg -i mysql-5.6.12-debian6.0-x86_64.deb % sudo apt-get install libaio1 perl-modules % sudo useradd -s /bin/false mysql % sudo /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql --datadir=/var/lib/mysql mysql などのクライアントプログラムは /opt/mysql/server-5.6/bin にインストールされます。 /etc/init.d/mysql を開き、datadir= の行を次のよ
Ubuntu Server 12.04 で次のような警告が出てパッケージのインストールがうまく行かない場合があります。 perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US:en", LC_ALL = (unset), LC_CTYPE = "ja_JP.UTF-8", LC_COLLATE = "ja_JP.UTF-8", LC_MESSAGES = "ja_JP.UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
以下のようなシナリオを想定してください。 A氏が最初のコミットをして、中央リポジトリにpush: % echo 'ABC' > test.txt % git add test.txt % git commit -m '1st commit' % git push B氏が2番目のコミットをして、中央リポジトリにpush: % git fetch % git merge % echo 'CBA' > test.txt % git add test.txt % git commit -m '2nd commit' % git log --oneline 035b3d2 2nd commit 496cc84 1st commit その間にA氏が同じファイルを編集。B氏の編集をマージせずに、自分の編集内容をstash: % echo 'ACB' > test.txt % git fetch % gi
double あるメソッドを持ったオブジェクトを作る。doubleは「代役」の意。 user = double("user", name: "Taro") user.name #=> "Taro" 第1引数の "user" はRSpecが失敗を報告するのに使うラベルに過ぎない(省略可)。 mock および stub というエイリアスがある。 stub あるオブジェクトの特定のメソッドが特定の値を返すように、オブジェクトを作り替える。 User.stub(:find) { double("user", name: "Taro") } u = User.find(1) u.name #=> "Taro" stub_chain メソッドチェーン対応版のstub。 User.stub_chain(:where, :find) { double("user", name: "Taro") } u =
example.com でアクセスされた場合と m.example.com でアクセスされた場合で、異なるルーティングを適用したい場合、 scope constraints: { subdomain: '' } do resource :session end scope constraints: { subdomain: 'm' }, module: 'mobile' do resource :session do get :logoff end end みたいに書きます。 こうすると http://m.example.com/session/new にアクセスした時に Mobile::SessionsController コントローラの new アクションが呼ばれるわけです。 しかし、この書き方には名前空間を分けられないという問題があります。 example.com 向けのHTMLテン
2011年8月(!)にもなってIE7のz-indexに関するバグに初めて遭遇していました。 当然、Googleで検索すれば大量のブログ記事が出てきます。 jQueryですべてのdiv要素にz-indexを設定するという力業が検索上位に出てくるけれど、これはちょっと、という感じもします。 そこでもう少し頑張って探すと、z-indexを指定したいエレメントの親エレメントにもっと大きなz-index値を指定すれば問題は解決するというエントリを発見。 やった!
今日、Capistrano で Rails 3.1 ベースの Web アプリをリモートにデプロイする準備をしていた時のこと。 deploy:restart の後に delayed_job のプロセスを再起動したかったので、 require "delayed/recipes" ... after "deploy:restart", "delayed_job:restart" というコードを config/deploy.rb に加えたのですが、うまく動きません。 エラーメッセージは次の通り: Could not find rake-0.9.2 in any of the sources (Bundler::GemNotFound) 実は、リモートホストには bundler が2つインストールされていて、私としては /opt/ruby/bin/bundle を実行したかったのですが、PATHの通
一般的な用法では、他動詞 bump は「ドンとぶつける」という意味でして、 She bumped her head on the low beams. みたいに使います。 インターネットの世界では、日本での「アゲる」に相当する言葉で、古いスレッドに何か書き込むことで「板」の中での順位を上げることを意味するそうです*1。 さて、(他の言語の場合は知りませんが)Ruby プログラマーの間では、「(バージョン番号)を上げる」という意味で使われる場合があります。 例えば、コミットメッセージに bump version to 2.0.0.rc と書いてあれば、バージョン番号を 2.0.0.rc に上げた、という意味になります。 *1:http://en.wikipedia.org/wiki/Bump_%28Internet%29
Ubuntu Server 10.04 LTS に apt-get で MySQL 5.1 をインストールし、mysqld_multi で複数のインスタンスを動かそうとしました。 第2の mysqld は 3307 番ポートを使用し、データディレクトリは /opt/var/lib/mysql とします。 最初に行うことはシステムデータの初期化です。普通は次のコマンドで動きます: mysql_install_db --no-defaults --user=mysql --datadir=/opt/var/lib/mysql しかし、次のようなエラーメッセージを吐いて止まってしましました。 Installing MySQL system tables... 110618 17:46:23 [Warning] Can't create test file /opt/var/lib/mysql/x
新しいPCに移って、sshでの接続にやたら時間がかかる(10秒とか)ので、ーvオプションを付けて実行すると、 debug1: Authentications that can continue: publickey,gssapi-with-mic debug1: Next authentication method: gssapi-with-mic debug1: Unspecified GSS failure. Minor code may provide more information No credentials cache foundのようなメッセージが出ている。publickeyでの認証より前にgssapi-with-micという方式(初耳)による認証をトライし、それで時間がかかっている。 調査の結果、.ssh/config に次のような記述を追加すればよいことが判明。 Hos
MySQL サーバ(Ver. 5.1)を再起動したら、InnoDB のテーブルにアクセスできなくなりました。 show variables like 'have_innodb'; で調べると InnoDB エンジンが有効になっていません。設定を変更した覚えはないのに。 エラーログを見ると次のようなエラーが記録されていました。 ./ib_logfile0 is of different size 0 134217728 bytes than specified in the .cnf file 0 67108864 bytes! ネットには ib_logfile0 を消すという対処法も書いてありましたが、運用中のサーバであり怖かったので、my.cnf を現実に合わせることにしました。 #innodb_log_file_size = 64M innodb_log_file_size = 128
2011年5月2日のコミットで、auto_linkメソッドがRailsから除かれました。Rails 3.1から標準では使えなくなります。 引き続き使いたい人は、rails_autolink gemを使ってください。 廃止の理由は「May not be safe!」だそうです。
お客様の Mac に Rails の開発環境をセットアップすることになりました。 普段は Ubuntu しか使っていないので、四苦八苦。いろいろと調べて分かったのは、MacPorts の整備がかなり進んでいて、これを通じてほとんど何でも入手できるということ。全部コンパイルしているみたいで非常に時間がかかるのが難点ですが、依存関係で止まってしまうこともなく、とても良い印象を受けました。 さて、今回の開発案件では mecab を使うのですが、Ubuntu 環境では動くコードが Mac 環境では Segmentation Fault を起こすという問題に直面しました。 Google で調べると、いろんな人がいろんなことを書いていますが、2011年1月時点での状況では、MacPorts で mecab 等をインストールするのが最善。 $ sudo port install mecab $ sudo
廃止予定となっていますが、現実にはもう使えません。 回避策は以下の通り: :popup => true を 'data-popup' => true に書き換える。 public/javascripts/application.js に次のコードを追加する。 (prototypeの場合) document.on("click", "a[data-popup='true']", function(event, element) { if (event.stopped) return; window.open($(element).href); event.stop(); }); (jQueryの場合) $('a[data-popup='true']').live('click', function(e) { window.open($(this).href); e.preventDefaul
Railsアプリケーションに日本語による全文検索機能を付け加えるため、私は2つの選択肢を検討しました: 全文検索エンジンSennaを組み込んだMySQL(Tritonn)を採用。 MeCab で事前に形態素分析して、FULLTEXTインデックスを設定した別カラムに格納する。 結論としては、後者を採用しました。 Tritonnを採用すれば、アプリケーション側の負担は非常に少なくなります。しかし、MySQL 5.0 ベースで Tritonn をビルドしなければなりません。ビルド作業自体はそんなに面倒ではないのですが、私が使用する予定のサーバマシンでは既に MySQL 5.1 が動いていたので、もうひとつ MySQL インスタンスを動かすことになります。メモリリソースのことが心配になりました。 他方、後者の方法では、既存の MySQL 5.1 をそのまま使用できます。Rails 側で MeCab
自分用のメモです。 kuroda/test からフォークした example/test レポジトリが存在すると仮定します。 今、example/test から kuroda/test に対してプルリクエストが届きました(ブランチは両方ともmaster)。 私(kuroda/testにpush権限を持つ)が example/test の変更を kuroda/test に取り込む手順は以下の通り。 1. まず clone。 $ git clone git://github.com/kuroda/test.git 2. 変更を取り込む。 $ git checkout -b example-master master $ git pull git://github.com/example/test.git master $ git checkout master $ git merge examp
production 環境では、もちろん ActiveRecord のログ(SQLクエリの内容やかかった時間など)は表示されない。 見たい場合は、config/environments/production.rb の末尾に、 ActiveRecord::Base.logger = Logger.new("log/debug.log") ActiveRecord::Base.logger.level = 0と追加して、サーバを再起動する。 後は、tail コマンドでログを眺める。 tail -f log/debug.log
mongoid で MongoDB を利用した Rails アプリケーションを作っているのだが、RSpec のバージョンを 2.0.0.beta.19 に上げたら、specs 実行時に次のようなエラーが出て止まる現象に遭遇。 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.0.rc /lib/active_support/whiny_nil.rb:48:in `method_missing': undefined method `set_exception' for nil:NilClass (NoMethodError) 調べると、Rspec.configure を使って定義した before(:each) エグザンプル等の中で例外が発生すると、うまく補足できなくて、こんなエラーになるようだ。 そこで、即席の例外処理を書いて何が起きているかを調
きっかけは、Ubuntu 14.04 上で運用中の MySQL 5.6 をアップグレードしたこと。 apt-get install がうまく行かないので、悪戦苦闘した後に、/var/lib/mysql のバックアップを取ってから apt-get purge してから最新の MySQL 5.6 をインストールして、/var/lib/mysql を戻すという方針に転換しました。 いちおううまく動いたのですが、なぜか外部からの接続を受け付けなくなってしまいました。lsof で調べると確かに localhost をリスンしている。 $ lsof -i :3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 28953 mysql 13u IPv4 466855 0t0 TCP localhost:3306 (LISTEN) /
現在、Capistrano で Rails アプリケーション foo を、リモートサーバの /var/rails/foo に配置していると仮定します。 ただし、これまでは Bundler を使っていないとします。 RubyGems のアップデート作業を自動化するため、Bundler 1.0 を導入してみましょう。 ※ この記事は Bundler 1.0.0.rc.1 に基づいています。 まず、deploy.rb に deploy:bundle タスクを追加します。 namespace :deploy do (省略) desc "Run bundle install" task :bundle do run "cd #{release_path} && bundle install #{shared_path}/lib" end end #{release_path} は /var/rail
RubyGems のバージョンを 1.3.6 に上げたら、Rails アプリケーションの起動時に次のような警告メッセージが出るようになった。 Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010. Use #requirement 次のコードを config/environment.rb に挿入するとこの警告を消せる。 if Gem::VERSION >= "1.3.6" module Rails class GemDependency def requirement r = super (r == Gem::Requirement.default) ? nil : r end end end end 挿入する位置は、require File.join(F
CentOS 5.3 での話。yum で入る Ruby は 1.8.5 なので、1.8.6 か 1.8.7 をソースから make するよね。でも、その前に、zlib-devel パッケージを入れておかないと、make は通るけれど、後で困る。なぜなら、gem が動かないから。 こういうエラーが出るんだ。 no such file to load -- zlib (LoadError) 後から zlib-devel を入れた場合は、 $ cd ~/src/ruby-1.8.7-p160/ext/zlib $ ruby extconf.rb $ make $ sudo make installでOKだけど、あらかじめ zlib-devel を入れておけば、この手順がいらない。 参考資料: http://d.hatena.ne.jp/double_m/20090224/1235451299 h
ubuntu 8.04 (Hardy) では問題なかったが、8.10 (Intrepid) にした途端、pptp 接続ができなくなった。Google すると、数多くの人が困っているようだ。 私も大変困った。 最終的に見つけた解決法は以下の通り: Synapitic パッケージ・マネージャを開き、[設定][リポジトリ][サードパーティのソフトウェア]から、以下のリポジトリを追加する。 deb http://ppa.launchpad.net/network-manager/ubuntu intrepid main [再読込]してシステムを更新する。 OSを再起動。 pptp接続の編集画面で[Advanced]ボタンを押し、[Use Point-to-Point encryption (MPPE)]にチェックを入れる。 コマンドラインでgconf-editorコマンドを実行(sudoなしで)。
日曜日。数日前に購入したPCにUbuntu 9.04 (Jaunty) 64bit版にインストールし、環境整備を進める。 メインのPCとしてメールや原稿も書くので付属の日本語入力システム(Anthy)では厳しい。ATOK X3 for Linux を入れる。 CD-ROM に付属のインストーラでは、64bit 版 Ubuntu に入らないので、山下氏のATOK X3 を Ubuntu Hardy(x86_64)にインストールを読みながら、手順通りに進めるとほぼ滞りなく進んだ。8.04 (Hardy) の時の記述だが、9.04 にも有効。ただし、アップデートモジュールの適用の箇所では、モジュールが新しくなっていてファイル名の一部が js2 から js3 に変わっているので注意が必要だ。 なお、前のマシーンでは、(たぶん) ATOK のせいで Firefox が Adobe Flash 付きの
Phusion Passenger 環境下でサービスを一時停止してメンテナンス画面をユーザーに見せたいとき、どうするか。 答えは、次のブログ(英語)に http://blog.nodeta.fi/2009/03/11/stopping-your-rails-application-with-phusion-passenger/ 簡単に要約すると レスポンス503のための静的HTMLファイルを RAILS_ROOT/public/503.html に用意する。 RAILS_ROOT/tmp/stop.txt が存在したら、すべてのリクエストをレスポンス503で返す(503.htmlが表示される)。 ただし、ファイルシステムに存在するファイルへのリクエストはそのまま返す。 httpd.confおよびCapistranoレシピの書き方について簡潔かつ明瞭に説明してある。特に、httpd.conf
このページを最初にブックマークしてみませんか?
『tkrdの日記 (rails や ubuntu のことなど)』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く