Hatena::ブログ(Diary)

130単位

2011-07-26

Rails3.1 Sass(SCSS)を使ってみたメモ

SassはCSSを簡潔かつ柔軟に記述するための記法で、SCSSはその派生でCSSとの互換性もある新しめな記法です。ともにセレクタをネストして記述できることがわかりやすい特徴のひとつです。

ソースを追ったわけではないので細かい動作まではわかりませんが、処理の流れや嵌りポイントなどはある程度把握できたのでそのメモです。

環境

RailsでのSassコンパイルの仕組み

  • app/views/layouts/application.html.erb
  <%= stylesheet_link_tag    "application" %>
  • app/assets/stylesheets/application.css の5-6行目
 *= require_self
 *= require_tree .
  • この2行がトリガーとなってstylesheets以下のファイルがコンパイルされる
  • tmp/sass-cache以下にキャッシュされる
  • 最終的に1ファイルに結合して出力される
  • ブラウザから見たhtmlソース
    • development (config.action_controller.perform_caching = false)
<link href="/assets/application.css" media="screen" rel="stylesheet" type="text/css" /> 
    • production (config.action_controller.perform_caching = true)
<link href="/assets/application-ab401019e2cdd82e1a8f873003605a00.css" media="screen" rel="stylesheet" type="text/css" /> 

Sass(SCSS)利用時のポイント

  • rails new した時点で Gemfile に sass-rails が含まれている
  • rails generator では xxx.css.scss というファイル名で生成される
  • app/assets/stylesheets/application.css が肝
    • <%= stylesheet_link_tag "application" %>のままファイル消すと動かない
  • 最小ファイルでSCSS使いたければapplication(.css).scssに変更する
    • コメントにはスタイルのスコープ別にファイルを作成したほうがいいと書かれている
  • application.cssの先頭に @charset "utf-8"; を記述するとコンパイル動作しない
  • コメントのあとに @charset "utf-8"; を記述する
@charset "utf-8";/*
 * This is a manifest file that'll automatically include all the stylesheets available in this directory
 * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
 * the top of the compiled file, but it's generally better to create a new file per style scope.
*/
  • 結合順序はapplication.css、それ以外はファイル名順
    • *= require_ の行を入れ替えれば逆になる
    • リセットCSSを用いる場合は結合順序に注意してファイル名を工夫する
  • require filename として個別に書けばその順に結合される
  • .cssファイルもそのまま結合される
  • *= require_self の記述があるファイルを別につくるとエラーになる

Sprockets::CircularDependencyError in Users#index

Showing /path/to/app/views/layouts/index.html.erb where line #5 raised:

/path/to/app/assets/stylesheets/application.css has already been required

  • スタイルの変更反映はRails再起動必要
    • 開発段階では自動で再コンパイルしてほしい
    • 別のキャッシュのため「config.action_controller.perform_caching = true」してたのが原因
    • (上記の場合は) config.sass.cache の値などいじっても効果なし
    • 特にSCSSなど要コンパイルのAssetsを利用する開発時は perform_cashing = false にしたほうがいい
  • 再起動しまくっていたらPowが応答しなくなった(×2回)

関連リンク

チュートリアル記事へのリンクです。文法も載っています。


4797363827
Rails3レシピブック 190の技

2011-07-22

Mac OS X/Ruby1.9.2 日本語YAML出力

やりたいこと

  • バイナリ文字列化されずに日本語を含むYAMLを出力したい
    • 通常は以下のようになる
puts YAML.dump({'' => ''})

---

"\xE3\x81\x82": "\xE3\x81\x84"

Linux

CentOSでは、上記リンク先の情報でいけました。

  • CentOS 5.6
  • Ruby 1.9.2p290 (RVM 1.6.25)
  • libyaml 0.1.2
  • libyaml-devel 0.1.2

で問題ありませんでした。

Mac

環境

MacPortsではyumのlibyaml-develに相当するパッケージがないのが原因かもしれません。

エラー

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- psych (LoadError)

psychが読み込めないというエラーになってしまいます。

gemインストール
gem linstall psych #記事公開時の最新は1.2.0
YAML出力
# coding: utf-8
require 'psych'
require 'yaml'
puts YAML.dump({'' => ''})

または

# coding: utf-8
require 'yaml'
YAML::ENGINE.yamler = 'psych'
puts YAML.dump({'' => ''})

で日本語で出力されます。

---

あ: い

Macgem不要でいける方法ご存知な方いましたら教えてください!


4274068099
プログラミングRuby 1.9 −言語編−

4274068102
プログラミングRuby 1.9 −ライブラリ編−

2011-07-19

日本Ruby会議2011に参加しました #rubykaigi

愛知に戻るのを決める少し前に既に申し込んでました。

そんなわけで、2日目から参加してきました。

得たことや感じたことは山ほどあるのですが、それぞれの日で最も印象に残ったセッションについて振り返ってみます。

2日目

"Social Coding"はRubyと英語を習得したい自分にとっては、身近にあってかつ最適なアクションなんじゃないかと思いました。具体的な"10 Tips"含め、今の自分に足りないものを得る道筋として、非常にわかりやすく示してくれたような講演でした。

3日目

  • ユニークなMatz
  • 大人げないMatz
  • 100年先の未来を見据えたMatz

Matz氏の講演を初めて聞いたのはまだRubyを触ったことすら無い2年半前のことでした。日本発であることと生産性の高さに興味を落ち、いつかは使ってみたいと思っていました。

やがてRails3をきっかけにRubyを使うようになり、未熟ながらもいち開発者として、最後のRuby会議で生で講演を聞くことができました。質疑応答含め、まさに"たのしいRuby"な空間がそこにはありました。

その他

[twitter:@sugamasao]さんの闇RubyKaigi[twitter:@masarakki]さんの原宿.rb(プログラミング生放送のすすめ)、なんかとてもいい内容でした。サイン会行列で少し話させていただいた[twitter:@sora_h]さんのパッチの書き方のLT、わかりやすく参考になりました。それから前職で関わった方や面識のある方とも再会できて良かったです。

閉幕後は[twitter:@kwappa]さん[twitter:@sugyan]さん[twitter:@akitsukada]さんら十数人で飲み会。Perl界隈から飛び入り参加あり、Matz氏登場サプライズあり、さすがの東京クオリティと思いました。みなさんのプログラミングに触れたきっかけや現在の仕事への思いなど聞けて、とにかく刺激を受けました。またWeb上の自分への反応をリアルな場で聞けたのは一番うれしかったことかもしれません。引き続きがんばろうと思いました。

あらためて、Ruby会議というすばらしい場に参加できて良かったです。ありがとうございました!

関連リンク

2011-07-14

Apache CGIでRVMのRubyを動かす

簡単なRubyスクリプトをWebで表示したいと思い、調べてみました。

環境

Apache設定

LoadModule cgi_module modules/mod_cgi.so
AddHandler cgi-script .cgi
<Directory "/path/to/htdocs">
	Options +ExecCGI
</Directory>
sudo /etc/init.d/httpd reload

RubyCGIスクリプト

/path/to/htdocs/index.cgi

#!/usr/local/rvm/rubies/default/bin/ruby
print "Content-Type: text/html\n\n"

print <<HTML
<html>
<head>
</head>
<body>
Hello Ruby!
</body>
</html>
HTML
  • 1行目にRuby本体のファイルを指定
    • /usr/local/rvm/bin/rubybashスクリプトなので動かない
    • rubies/default のほうにしてバージョン変更に対応しやすく
  • 最初にContent-Typeと改行2つを出力
  • そのあとにHTMLなどのコンテンツを出力
  • 日本語を扱う場合は2行目に「# coding: utf-8
  • Apache実行ユーザーに対して実行権限追加
sudo chmod g+x index.cgi #groupがapacheの場合

ブラウザからindex.cgiにアクセスして表示されればokです。

Appendix

拡張子.rb で動かしたい場合
AddHandler cgi-script .cgi .rb
拡張子なしで動かしたい場合
<Files "filename">
	SetHandler cgi-script
</Files>
実行権限がないエラーログ

(13)Permission denied: exec of '/path/to/htdocs/index.cgi' failed

Rubyの指定がおかしいエラーログ

(8)Exec format error: exec of '/path/to/htdocs/index.cgi' failed

参考リンク

4873113814
Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

4873113946
プログラミング言語 Ruby

関連記事

*1:関連記事参照

2011-07-12

SlideShareのTwitterBotつくりました

f:id:deeeki:20110712145801p:image

環境

やったこと

おもったこと

  • 何かのAPIを操作するgemライブラリググると出てくる
  • ActiveSupport便利
  • Bundler便利
    • bundle install --path=vendor/bundle でプロジェクト内にまとまってソースも読みやすい
  • Rubyなれてきた&おもしろくなってきた
    • 手続き型でなく最初からクラス設計してつくれるようになれたらいい

やりたいこと

  • 過去の人気スライドの掘り起こし
  • SlideShare APIgem作成
    • 既にあったけどできること少なくメンテもされてないっぽいので*1

ソースコード

関連リンク


4797357401
たのしいRuby 第3版

477414732X
Twitter API ポケットリファレンス

関連記事

2011-07-11

foursquare APIを使って自動フレンド承認

foursquare APIラッパーgemライブラリを使います。

環境

OAuthアクセストークン取得

CLIENT ID, CLIENT SECRET取得

f:id:deeeki:20110711070102p:image

アクセストークン取得
require 'foursquare'
CLIENT_ID = 'XXX'
CLIENT_SECRET = 'XXX'

oauth = Foursquare::OAuth.new(CLIENT_ID, CLIENT_SECRET)

request_token = oauth.request_token.token
request_secret = oauth.request_token.secret

print "access following url.\n"
print oauth.request_token.authorize_url
print "\nand input access code. >> \n"
VERIFIER = STDIN.gets.gsub!(/\n/,'')

access_token, access_secret = oauth.authorize_from_request(request_token, request_secret, VERIFIER)

print "success! paste following code to config file.\n"
print "ACCESS_TOKEN = '" + access_token + "'\n"
print "ACCESS_SECRET = '" + access_secret + "'\n"
  • authorize_urlにアクセスして表示されたコードを入力して認証

f:id:deeeki:20110711070103p:image

フレンド承認

require 'foursquare'
CLIENT_ID = 'XXX'
CLIENT_SECRET = 'XXX'
ACCESS_TOKEN = 'XXX'
ACCESS_SECRET = 'XXX'

oauth = Foursquare::OAuth.new(CLIENT_ID, CLIENT_SECRET)
oauth.authorize_from_access(ACCESS_TOKEN, ACCESS_SECRET)
foursquare = Foursquare::Base.new(oauth)

foursquare.friend_requests.each do |u|
	p u.firstname
	if u.photo =~ /foursquare.com\/img\/blank/
		foursquare.friend_deny :uid => u.id
	else
		foursquare.friend_approve :uid => u.id
	end
end
  • friend_requestsでフレンド申請中ユーザーのリスト取得
  • friend_approveでフレンド承認
  • friend_denyでフレンド拒否
  • これをcronに登録するなどして自動化

サンプル

一連の手順のサンプルコードです。

関連リンク

おまけ

デフォルトの設定だと、フレンドであるユーザーにはメールアドレスが公開状態になっているみたいです。気になる方は確認してチェックを外しておくといいと思います。

f:id:deeeki:20110711070104p:image

4873113946
プログラミング言語 Ruby

0071773177
The Power of foursquare: 7 Innovative Ways to Get Customers to Check In Wherever They Are


関連記事