jQueryで append すると、追加したDOM中のscript タグが実行されます。
js>>
$('#target').append(what);
<<--
script タグを実行せずに append したい場合、あらかじめscript タグを取り除いておけば ok
js>>
what.find('script').remove();
$('#target').append(what);
<<--
jQueryで append すると、追加したDOM中のscript タグが実行されます。
js>>
$('#target').append(what);
<<--
script タグを実行せずに append したい場合、あらかじめscript タグを取り除いておけば ok
js>>
what.find('script').remove();
$('#target').append(what);
<<--
/etc/sysctl.d/以下の設定を反映させるには、
pre>>
<<--
で良いみたいですが、ubuntu (13.04) 環境ではうまく反映されなかったので、
pre>>
<<--
のように直接 path を指定する必用があるようです。
仮説:
記銘の衝撃が感動として知覚される
そもそも感動したことって記憶に残りやすいよね、というところに着想を得て、いやそもそも因果関係が逆で、脳に記憶される事そのものが感動の源泉なのではないかと考えてみたのですが、なんだかそんな気がしてます。
カスタムViewGroupを作成した場合に、onDrawで独自の描画処理を行いたい場合、
以下のフラグを立てる必要があります。
java>>
setWillNotDraw(false);
<<--
UI特許取得を避けるために書いておきます。
クリック/タップでボタンを外した場合に、もう一挑戦してまた外れた場合、タップ地点の近くにあるボタンなどのUI要素をクリック/タップしたことにすると便利だと思います。
3回失敗、4回失敗するごとに、徐々に探索半径を広げていっても良いかもしれません。
deprecatedになっているNSString.stringWithCString:length:を使っている古いコードがあり、新しい記述に書き換えようとしたのですが、documentによると length 指定ができない NSString.stringWithCString:encoding:
を使えという指示しかないようです。
等価なコードで置き換えるとしたらこんな感じかな?
objective-c>>
//[NSString stringWithCString:bytes length:length];
[[[NSString alloc] initWithData:
[NSData dataWithBytes:bytes length:length]
encoding:NSUTF8StringEncoding] autorelease];
<<--
ARC使用でしたら autorelease は不要ですね。
production環境などでログ自体を無効化するにはconfig/environments/production.rb あたりで
ruby>>
RAILS_DEFAULT_LOGGER = Logger.new("/dev/null")
<<--
すればok.
SCSSよりSASSが好きです。
時々SCSSのことをSASSと呼んでるものがあって紛らわしいですね。
Rails 3.1では config/application.rb に
ruby>>
config.sass.preferred_syntax = :sass
<<--
と記述すれば SASS をデフォルトで使ってくれるようです。
Let's prefer the SASS :)
IKImageBrowserViewは画像のリストを表示する場合に非常に重宝します。
現時点ではIBから背景色を設定することができないのですが、以下のようにすると背景色を設定できます。
objective-c>>
[imageBrowserView
setValue:[NSColor clearColor]
forKey:IKImageBrowserBackgroundColorKey];
<<--
brew upgrade groonga しようとしたら、以下のようなエラーが出てきました。
pre>>
Error: undefined method `include?' for nil:NilClass
<<--
これはbrewのバージョンが古いのが原因らしい。
pre>>
cd brew --prefix/Library/Contributions/examples
git clean -n
rm brew-upgrade.rb
<<--
して再挑戦したら上手く動きました。
新しい環境に移行すべく、ruby-1.9.3, rails-3.1.3 で作ったwebアプリをherokuにデプロイしてみたりしています。
いくつか注意点があったのでメモ。
application.css isn't precompiled
手元の環境で動いていても、いざデプロイすると以下のようなエラーが出ることがあります。
pre>>
ActionView::Template::Error (application.css isn't precompiled):
<<--
事前に bundle exec rake assets:precompile してから生成物をgitに含めてデプロイすればいいのですが、自動的に生成して欲しい場合には、config/environments/production.rb で
ruby>>
config.assets.compile = true
<<--
を指定します。これで勝手に生成してくれます。
Could not find a JavaScript runtime
これもassetsの生成に関する問題なのですが、jsファイルを生成するにあたって、jsのランタイム環境が必要になります。
これもherokuの環境でやるためには、Gemfile に以下を追加します。
ruby>>
group :production do
gem 'therubyracer-heroku'
end
<<--
これでok
rvmを使ってcapistranoでアプリケーションごとに異なるrubyのバージョンを利用するには、Capfileの先頭に以下のような記述をすればok
ruby>>
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.3'
set :rvm_type, :user
<<--
ついでに ROOT に .rvmrc を追加して中身に
pre>>
rvm 1.9.3
<<--
のようにしておけば cd したときにrubyのバージョンが切り替わって便利です。
結構需要がありそうな割に、決定版的なツールがなんなのかわからなかったのですが、とりあえずこれを使えば目的を果たせます。
使い方:
pre>>
% gem install magic-commenter
% cd /path/to/root/of/ruby/files
% magic-commenter
<<--
あとは自動的にmultibyteキャラクタを含んでいる rbファイルを見つけて
マジックコメントを挿入してくれます。
NetGenesis SuperOPT-GFiveを使っているのですが、特定のPCを接続するとIPマスカレードのセッションテーブルがいっぱいになるという問題が発生しており、原因を調べておりました。
という記事があり、webalizerが原因か、と疑ってみましたが、そのPCにはwebalizerは入ってません。
topでプロセスの動きを眺めていると、haproxyが変な動きをしていたのでこれをpurgeしてみると、どうやらビンゴのようでした。
ということで、特に使ってなかったのでhaproxy を削除してsession table full問題は解決。
バックグラウンドジョブの一覧は
pre>>
% jobs
<<--
で得ることができますが、そのままではPIDがわかりません。
pre>>
% jobs -p
<<--
とやると PID を含めた結果が得られます。
前回(uninitialized constant MysqlCompat::MysqlResの対処法参照)はSnow Leopard でしたが、
今回はLionです。
OSのバージョンが変わるたびに問題が起こる気がします。
今回は、以下で回避できるようです。
pre>>
% install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /path/to/rubygems/gems/mysql-2.8.1/lib/mysql_api.bundle
<<--
See Also
ブラウザのタブを閉じるときは基本的に中ボタンクリックなので、閉じるボタンの存在は無駄なだけでなく、うっかり押してしまって必要なタブを閉じてしまうこともあって邪魔でした。
そんな場合には、about:config で以下のように値を設定すると、閉じるボタンを非表示にすることができます。
pre>>
browser.tabs.closeButtons = 2
<<--
普段はPostgresqlのサイトで配布されているMac用のインストーラを使っているのですが、どうやらLionはまだサポートされていないようです。
ということで、homebrewを使ってインストールすることにしました。
Homebrewをインストール
以下を実行すればok
pre>>
/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
<<--
あとは
pre>>
brew install postgresql
<<--
でインストールし、以下でdbを初期化します。
pre>>
initdb /usr/local/var/postgres
<<--
最後に、自動起動の設定を行います。
pre>>
cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist
<<--
brewでインストールした場合、postgresユーザは作成されないようです。
$USERがスーパユーザとして作成されます。
開発環境でしか使っていないので我慢してきたのですが、
どうも MacOS 10.6.8 における Socket.getaddrinfo の挙動が不安定なようです。
以下のように、タイミングによって動作したりしなかったりします。
pre>>
ruby-1.8.7-p302 :012 > Socket.getaddrinfo("localhost", nil)
SocketError: getaddrinfo: nodename nor servname provided, or not known
from (irb):12:in `getaddrinfo'
from (irb):12
ruby-1.8.7-p302 :013 > Socket.getaddrinfo("localhost", nil)
=> [["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 2, 17], ["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 1, 6], ["AF_INET6", 0, "localhost", "::1", 30, 2, 17], ["AF_INET6", 0, "localhost", "::1", 30, 1, 6]]
<<--
MacOS環境でのSocket.getaddrinfoは鬼門なようで、
これまでにも様々な問題が報告されているようですね。
今回は全く同じ条件下で挙動が変わるというものなので、なかなか手ごわい感じです。
Rubyを使い初めてから結構たちますが、まだ新しい発見というのはあるものですね。
class_evalでブロックを渡す時に、引数も渡したいと思っていたのですが、
class_execはちょうどその目的に使えるようです。
ruby>>
FOO = lambda{|bar| puts bar}
class Foo
class_exec("Foo", &FOO)
end #=> Foo
<<--
いくつか前のOSアップデートのころから
pre>>
% ping localhost
ping: cannot resolve localhost: Unknown host
<<--
という状態になっていたて原因が分からず放置していましたが、
/etc/hosts の中に IPv6用の設定があるのが原因のようです。
pre>>
::1 localhost
<<--
これをコメントアウトすると正常な動作に戻りました。
Rubyのリファレンスを参照するときは、いつもGoogleで検索していたのですが、なぜか検索結果からのリンクがリンク切れに。
昔のリファレンスは
にあったのですが、以下のように新しいURLに移動したようです。
旧版は以下に移動した模様。
検索インデックスが新しくなるようにGoogle botに頑張って欲しいです。
See Also
bundlerを使ってnative extensionを含むGemをインストールする場合に、
オプションの指定が必要な場合は ~/.bundle/config などを使いますが、
例えば Mac 環境で do_postgres をbundle installするには、以下のように
設定します。
pre>>
BUNDLE_BUILD__DO_POSTGRES:
--with-opt-dir=/Library/PostgreSQL/9.0
--with-opt-include=/Library/PostgreSQL/9.0/include/postgresql/server
<<--
古いバージョン(1.2.6)ではこの問題は起こらなかったのですが、
ubuntu-11.04の1.4.5では、しばらく使っていると/tmp/tmp.XXXXX
というディレクトリが大量に残るという問題があるようです。
調べてみたのですが、あまり似たような報告がなかったので、
特定の条件が揃った場合だけ発生する問題なのかもしれません。
とりあえず、以下のような力技で対処。
cleanup_munin_tmp
ruby>>
#!/usr/bin/env ruby
require "etc"
Dir['/tmp/tmp.*'].each do |path|
uid = Etc.getpwuid(File.stat(path).uid).name
gid = Etc.getgrgid(File.stat(path).gid).name
next if uid != 'nobody'
next if gid != 'munin'
system "rmdir --ignore-fail-on-non-empty #{path}"
end
<<--
これをcronで@hourlyに実行してます。
追記
シェルスクリプト版も用意してみました。
sh>>
#!/bin/sh
for d in /tmp/tmp.*
do
if [ stat -c %U $d = "nobody" ]
then
if [ stat -c %G $d = "munin" ]
then
rmdir --ignore-fail-on-non-empty $d
fi
fi
done
<<--
ActiveRecordを読み込んだ状態でirbを使っているときに、TAB補完をしようとすると落ちることが結構な頻度でありました。
原因を調べてみると、補完候補のArrayをsort使用としているところで、Symbolに対して <=> 演算子を呼びだそうとしてエラーが発生しているようです。
補完候補は Object#instance_methods から得ているようなので、なぜSymbolが要素として混入するのかが謎だったのですが、どうやら
Arel::Attribute::Predications クラスが犯人のようです。
ruby>>
PREDICATES = [
:eq, :eq_any, :eq_all, :not_eq, :not_eq_any, :not_eq_all, :lt, :lt_any,
:lt_all, :lteq, :lteq_any, :lteq_all, :gt, :gt_any, :gt_all, :gteq,
:gteq_any, :gteq_all, :matches, :matches_any, :matches_all, :not_matches,
:not_matches_any, :not_matches_all, :in, :in_any, :in_all, :not_in,
:not_in_any, :not_in_all
]
Predications = Class.new do
def self.instance_methods *args
warn "this module is deprecated, please use the PREDICATES constant"
PREDICATES
end
end
<<--
このコードを書いた人は instance_methodsはStringの配列を返すという事を失念していたようですね。
irb/completeはObjectSpaceから補完候補を拾ってくるので、上述のコードがあるせいでSymbolが補完候補配列に混入してしまいます。
回避策としては、irb起動時に以下のようなコードを読み込むなどがあります。
ruby>>
module Arel
class Attribute
class Predications
def self.instance_methods
require 'arel/algebra/attributes/attribute'
Arel::Attribute::PREDICATES.map(&:to_s)
end
end
end
end
<<--
追記
この問題は 1.8.x系のRubyでのみ発生するようです。
thanks
@a_matsuda!
isoファイルを直接mountするには、以下のようなコマンドを実行すれば良いようです。
pre>>
mkdir -p /media/cdrom
mount -t iso9660 -o loop /path/to/file.iso /media/cdrom
<<--
Sinatra 1.2からサポートされたSlimについての調査メモ。
.slima href=foo のようにquoteされてない場合は右辺値がrubyコードとして評価されるのがcool。= はデフォルトでHTML escapeされる。escapeしない場合は ==#{{hoge}} でエスケープしない。#my_id.my_class はhamlと一緒。tag省略はdivも一緒。\\ や行頭|で複数行など、複数行のサポートが充実coffee: のように:を後置。hamlとは逆iotopというコマンドを使うと、プロセスごとのIO使用状況が top コマンドのような感じに把握でき、システムのボトルネックの分析に使えます。
ubuntuの場合は
pre>>
apt-get install iotop
<<--
で導入できます。
iftop とあわせて Have a nice admin life!
普段サーバの監視にmonitを使っていますが、ubuntu nattyの環境に入れようとしたところ、monitが起動しないという問題に遭遇しました。
理由を調べてもなかなか分からなかったのですが、どうやらパッケージインストール時に最初にある設定ファイルのままhttpdの設定を行うと起動しないようです。
sh>>
set httpd port 2812
use address localhost # <- これがあると起動しない
allow localhost
<<--
ubuntuでパッケージのインストールを行ったとたん、
掲題のエラーメッセージが出るようになりました。
なかなか原因が分からなかったのですが、一つの原因として、
ようです。存在するディレクトリにcdしてからもう一度確認すると、何事もなかったように元の状態に戻りました。
レアな問題のようですね。
ActiveRecordを使っている場合、
YamlDb
を使うと比較的簡単にデータの移行ができるようです。
script/consoleあたりから、
ruby>>
YamlDb.dump "/path/to/data.yml" # dump
YamlDb.load "/path/to/data.yml" # load
<<--
という感じに使えます。structureは作ってくれないので、migrationなどであらかじめ用意しておきます。
route53 は、名前のとおり
AmazonのRoute 53 を使うためのCLIユーティリティです。
これを使えば面倒な設定が簡単になります。
例) CNAMEレコードの中身を変更する
sh>>
route53 --zone xxx.xxx. -g --name "*.xxx.xxx." --type CNAME --values xxx-xxx.ap-xxx-1.elb.amazonaws.com.
<<--
今までスルーしてましたが、Route53を使えば
ELBでZone Apexが使えるようになったので非常に面白いです。
buildが必用なgemをbundlerで管理するときに、
buildオプションを指定したい場合があります。
そのような場合には、
pre>>
bundle config build.pg --with-pg-dir=/Library/PostgreSQL/9.0
<<--
のようにgemごとにbuildオプションを設定することが出来ます。
この設定は ~/.bundle/config に以下のように保存されます。
BUNDLE_BUILD__PG: --with-opt-dir=/Library/PostgreSQL/9.0
<<--
my.cnfの中で、clientとserver両方共 max_allowed_packet を適当に大きな数値に指定する。
pre>>
max_allowed_packet = 16M
<<--
config/database.yml でコネクション切断時に再接続する設定をする。
yaml>>
production:
reconnect: true
<<--
これで多分大丈夫。
Rails-2.3.11用のExceptionNotificationプラグインは以下にあるようです (via
@a_matsuda
基本的にはこれを script/plugin install -r 2-3-stable
すれば良いのですが、ConsiderLocalの実装にバグがあるので
直す必要があります。
具体的には、以下のファイルの self.included の場所をConsiderLocalモジュールの直下に移動します。
あとはREADME通りに設定して、ConsiderLocalをApplicationControllerからincludeすればok
GitリポジトリのRailsプラグインをインストールするときに、
標準では master ブランチがインストールされますが、
特定のブランチの内容をインストールしたい場合には、以下のように -r オプションを使用します。
sh>>
script/plugin install --force https://github.com/rails/exception_notification.git -r 2-3-stable
<<--
上記の例では 2-3-stable ブランチをインストールします。
ちょっと調べ物。オープンソースのアドサーバー
OpenX Ad Server
ASB MyAds
結構長いことredmineを使ってるのですが、wikiのサイドバーを作れることに最近気が付きました。
作り方は単純で Sidebar という名前のページを作ればok.
サイドバーに入れる場合、見出しは h3 が良さそうです。
spec_helper.rbの中でRSpec.configure を呼び出している場合、
以下のような警告が出てくることがあります。
pre>>
DEPRECATION WARNING: you are using deprecated
behaviour that will be removed from RSpec 3.
You have set some configuration options after an
example group has already been defined. In RSpec 3,
this will not be allowed. All configuration should
happen before the first example group is defined.
The configuration is happening at:
/path/to/app/spec/spec_helper.rb:50
<<--
これは spec_helper.rb が何度も呼び出されてしまうことで、
configureブロックが2回以上呼び出されてしまうために起こる問題です。
そもそも Ruby の require は一度しかファイルを読み込まないように
なっていますが、読み込んだかどうか判定する基準となるのが
読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。
そこで、以下のように spec_helper.rb の先頭に記述することで、
二度読みを回避して警告されないようにすることができます。
ruby>>
$LOADED_FEATURES.push File.expand_path(FILE)
def require(path)
path = File.expand_path(path) if path =~ %r{^[./]}
super path
end
<<--
require を上書きして引数が "." か "/" で始まっている場合に expand_path を呼び出して正規化しています。
自分自身が呼び出される時のrequireは上書きできないので、
$LOADED_FEATURESに自分自身の絶対パスを追加しておきます。
require は $LOADED_FEATURESにpathが存在するする場合はスクリプトを読み込まなくなります。
rake gems:unpack GEM=foo などでvender/gems 以下にunpackしたgemとbundlerを併用したい場合があります。
最近では、locale_rails-2.0.5にパッチをあてたものを利用したい局面でそうなりました。
こんな場合には、Gemfile にて
ruby>>
gem 'locale_rails', '=2.0.5', :path => 'vendor/gems/locale_rails-2.0.5'
<<--
というように記述しておけば、unpack したgemを使ってくれます。
第二引数のversionは必須っぽいのでご注意。
request.host などがちゃんとリモートホストのドメイン名を指すように、
以下のように設定します。
pre>>
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
<<--
ちょっと設定を忘れていてRSS中のGUIDがlocalhsotを指すという問題が発生しておりました。現在は復旧しております。
ご不便をおかけいたしましたことをお詫びいたします。
rackupしようとすると、1.3.0と1.1.0でコンフリクトして無理、というお馴染みのメッセージが出ていて困ったのですが、bundlerを使っている場合、
pre>>
% bundle exec rackup
<<--
すればOKなようだ。
古いRailsアプリをBundler仕様にする場合、
ruby>>
config.gem "foo",
:version => "0.0.1",
:lib => "bar",
:source => "http://gems.github.com"
<<--
と等価なGemfileの記述方法は
ruby>>
source "http://gems.github.com"
gem "foo", "0.0.1", :require => "bar"
<<--
で良いようです。バージョン指定をしない場合は第二引数を省略可。
CDH3に同梱されているgen-rbファイル群は若干古いらしく、上手く動かないのでif/hadoopfs.thrift を使って手動で生成します。
pre>>
% thrift --gen rb /path/to/if/hadoopfs.thrift
<<--
これで gen-rb/ ディレクトリの中にRuby用インターフェイスが生成されます。
最初にhadoopを入れておく。
続いてhbase-0.90.2をダウンロード。
/usr/local/hbase あたりに展開し、/usr/local/hbase/bin にPATHを通す。
rootディレクトリの設定
conf/hbase-site.xmlを開いて <configuration>の中に以下を記述。
xml>>
<<--
後は
sh>>
% start-hbase.sh
<<--
すると起動する。jps コマンドを実行すると以下のような感じになる。
sh>>
% jps
21245 DataNode
15141 JobTracker
21615 HRegionServer
21330 SecondaryNameNode
22236 Jps
21152 NameNode
15224 TaskTracker
22068 HQuorumPeer
<<--
まずはhadoop-0.21.0をダウンロード
/usr/local/hadoop あたりに展開。hadoop-envの設定
$HADOOP_HOME/conf/hadoop-env.sh を開いて JAVA_HOMEを/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Homeあたりに設定。
$HADOOP_HOME/binにPATHを通して
pre>>
% start-dfs.sh
% start-mapred.sh
<<--
でHadoopを起動。0.21.0ではstart-all.shはdeprecatedらしい。
停止は
pre>>
% stop-mapred.sh
% stop-dfs.sh
<<--
注意点として、ssh で localhost にログインできるようにしておく。
"システム環境設定" -> "共有" から、"リモートログイン"にチェックでok
初期化・設定
$HADOOP_HOME/conf/hdfs-site.xmlに以下のような感じで記入
xml>>
<<--
hdfsを初期化。
pre>>
hdfs namenode -format
<<--
mapredの設定
$HADOOP_HOME/conf/mapred-site.xmlの<configuration>の中に以下を記入。
xml>>
<<--
あとは起動して http://localhost:50070 あたりを見ると状態を確認できます。
Mac OS環境ではRiakをbrew install riak でインストール出来ますが、
Xcode4が入っている環境ではコンパイルエラーが発生して上手くいかないようです。どうやらllvm-gccが使われてるのが原因らしい。
以下のように--use-gccで強制的にgccを使うようにすれば良さそうです。
pre>>
<<--
ubuntuのバージョンを調べるには
pre>>
% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Release: 10.10
Codename: maverick
<<--
とやれば良いらしい。
以下を参照
しつつ、
pre>>
<<--
SassをSinatraで使うときに、グローバルオプションとして
テンプレートファイルの場所を指定する場合、
ruby>>
set :sass, :load_paths => '/path/to/templates'
<<--
という感じに指定すると思っていたのですが、いつの間にか
ruby>>
set :sass, :views => '/path/to/templates'
<<--
と指定しないと認識しないようになっていた。
SinatraがテンプレートエンジンとしてTileを採用あたりから変わったのかもしれない。