compassをこっそりと自社サービスで使ってみる

昨日のエントリの続きになります。
やっぱりcompassも使いたいということで、こっそりと入れてみました。
compassはsassのfunctionやmixinなどが便利につまったフレームワークですね。

rails3.0.5のプロジェクトで使用します。
#{RAILS _ROOT}はrailsのアプリケーションルートに適宜読み替えてください。

まずは #{RAILS _ROOT}/app/assets/stylesheets下に環境を作ってみたいと思います。

まずはGemfileにgem ‘compass'を追記して bundle install
compassはsassに依存しているので、昨日のGemfileに記述したsassの行を削除してもいいかもしれません。

compassの環境を作ります。

1
2
cd #{RAILS_ROOT}/app/assets/stylesheets
compass create

コンソールに色々ファイルが出来たと思います。
デフォルトのファイル達は使わないので消しちゃいます。

1
2
rm -r sass
rm -r stylesheets

config.rbを開いて修正します。

1
2
3
4
5
6
7
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "../../../public/stylesheets"
sass_dir = "."
images_dir = "../images"
generated_images_dir = "../../../public/images"
javascripts_dir = "../../../public/javascripts"

sass dirがコンパイル対象のscssが置かれているパス。
css
dirがコンパイル後のcssの出力先ですね。

変更を監視して自動で変換してくれるようにコンソール上でwatchスタートします。

1
2
cd #{RAILS_ROOT}/app/assets/stylesheets
compass watch

#{RAILS _ROOT}/app/assets/stylesheets/test.scssを作成してみます。

1
2
3
4
5
@import "compass/css3";

.sample {
  @include border-radius(25px);
}

#{RAILS _ROOT}/public/stylesheets/test.cssを開いてみます。

1
2
3
4
5
6
7
8
/* line 3, ../../app/assets/stylesheets/test.scss */
.sample {
  -webkit-border-radius: 25px;
  -moz-border-radius: 25px;
  -ms-border-radius: 25px;
  -o-border-radius: 25px;
  border-radius: 25px;
}

できてます。
これでこっそりcompassが使えますね!

compassのリファレンスは公式を参照です。
http://compass-style.org/

※2013年1月23日追記
css spriteの機能が使えない指定だったので、config.rb以下二つを直しました。

1
2
images_dir = "../images"
generated_images_dir = "../../../public/images"

css spriteを使う場合には。
images dirはどこにimagesがあるかを相対パスで指定し、generated images _dirはどこに結合した画像を吐き出すかの指定です。


こっそりと自社サービスでsassを使ってみる

hamlをGemfileに追加しました!と宣言し、実際にhamlを使ったら他のエンジニアに読めないヽ(゚´Д`)ノ゚と言われて数ヶ月がたちました。

今日はRails3.0.5にこっそりとsassを導入しました。

まずはGemfileに gem 'sass' を追記して bundle install
scssファイルの置き場所は将来のバージョンアップを見越して、 app/assets/stylesheets/ に作りました。
お気に入りのディレクトリに変えてもいいですね。

変更を監視して自動で変換してくれるようにコンソール上で sass --style --watch app/assets/stylesheets/:public/stylesheets を実行。
これで自動的にapp/assetstylesheets以下のscssファイルがcssにコンパイルされてpublic/stylesheetsの下に作成されます。

app/assets/stylesheets/test.scss を作成。

1
2
3
4
5
$defaultFontSize: 10px;

.test{
  font-size: $defaultFontSize;
}

watchしているコンソールを見てみると動いたっぽいメッセージが表示されていると思います。

public/stylesheets/test.cssの中身を見てみると。

1
2
3
.test {
  font-size: 10px;
}

と出来てます。
これでこっそりとsass書けますね!

ここまできたら、compassも導入したいなぁ。



文字列に二つ以上の同一指定文字が使われているかどうか?

1
2
3
4
5
6
str = "@123@56"

str.index("@") #=> 0
str.rindex("@") #=>4

str.index("@") != str.rindex("@")

左からと右からの指定文字の位置を調べて違ってたら、同じ文字が二回使われているねというだけのロジック。

僕は文系ロジックと勝手に命名しているロジックがあります。
どういったのが文系ロジック?と聞かれると困りますが。なんかにおいです。
上記は文系ロジックっぽいかなと思うのですが。どうでしょうか?


リクエストメソッドを取得

コントローラでget post put deleteを識別する方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# getかどうか
request.get?

# postかどうか
request.post?

# putかどうか
request.put?

# deleteかどうか
request.delete?

# 文字列で判定
request.request_method == "get"

#シンボルで
request.request_method_symbol == :get


dump format error

自社サービスで二つのスマフォ用webアプリでsession共有して行き来している時にdump format errorとなって落ちることがあった。
一度発生すると、F5押してもずっとdump format error。

原因はsessionにあることまでは色々なサイトを見ているうちにわかったんだけど、どこもブラウザのクッキー削除とかの解決方法しかなかった。

原因を追っていたら、うちの場合はmemcache-clientでデータをマーシャルロードしている時に落ちていることがわかった。
んで、ロードする前のデータ見てたらflashの文字が見えたので、flashを使わなくしたらなんか解決したっぽい。

なんか煮えきらない日記ですが、誰か困ってたらやってみるといいかもしれないです。


someone call me

rubyで自分がどう呼び出されているかを調べる

printstacktraceのようなもの。
callerと書けば、どこから呼ばれたのかがわかる。

本番環境でなんか2件データが出来る時があって、どうしても原因がわからないのでどこから呼ばれてるのか仕込んでみた。

1
2
3
4
5
6
7
require 'logger'
logger = Logger.new('log/debug.log', 'daily')
logger.level = Logger::DEBUG
logger.info( "#####" + DateTime.now.strftime("%Y年%m月%d日 %H時%M分%S秒") + "#####")
logger.info(self.inspect)
logger.info(caller.join("  n"))
logger.info( "############")

ログは一日置きにローテートさせてみた。
もう一週間ぐらいたつけど、罠しかけた途端現象が起きなくなるという。


if文でメソッド定義したりしなかったり

表題の通り

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def hoge
  p "hoge"
end if true

hoge # => "hoge"

def bar
  p "bar"
end if false

bar # => NameError: undefined local variable or method `bar' for main:Object

def hogefuga
 puts hoge + "fuga"
end if respond_to?(hoge)

hogefuga # => # hogefuga