2010/11/26

blogger に新しいはてブボタンを導入してみた

使いやすくなりました! はてなブックマークボタン

新しいはてブボタンができたということで早速導入。
  • blog タイトルの隣に blog 全体のブックマークボタン
  • 各エントリの下部にエントリオンリーのブックマークボタン
の二種を配置したかったので、ちょっと作業が必要だった。
まず、上記のリンクから自分のサイト用のスクリプトを作成。
<a
  href="http://b.hatena.ne.jp/entry/http://pinzolog.blogspot.com/"
  class="hatena-bookmark-button"
  data-hatena-bookmark-title="tail -f pinzo.log"
  data-hatena-bookmark-layout="standard"
  title="このエントリをはてなブックマークに追加">
    <img
      src="http://b.st-hatena.com/images/entry-button/button-only.gif"
      alt="このエントリをはてなブックマークに追加"
      width="20"
      height="20"
      style="border: none;" />
</a>
<script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>

  1. blogger のダッシュボードからデザイン→htmlの編集で、編集画面を表示する。
  2. ウィジェットのテンプレートを展開にチェックを入れて、テンプレート内部を編集できるようにする。
  3. //div[@id='header-innder']/div[@class='titlewrapper']/h1[@class='title']/b:include[@name='title']の直後に上記のスクリプトを配置する。(ただ、'このエントリーを'は取り除いた)
  4. //div[@class='post-share-buttons']の直後に下記のスクリプトを配置する
    <a 
      expr:href='&quot;http://b.hatena.ne.jp/entry/&quot; + data:post.url'
      class="hatena-bookmark-button"
      expr:data-hatena-bookmark-title='tail -f pinzo.log : &quot; + data:post.title'
      data-hatena-bookmark-layout="standard"
      title="このエントリーをはてなブックマークに追加">
        <img
          src="http://b.st-hatena.com/images/entry-button/button-only.gif"
          alt="このエントリーをはてなブックマークに追加"
          width="20"
          height="20"
          style="border: none;" />
    </a>
    <script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
    
  5. 作業終了。お疲れ様でした

新しいはてブボタンはなかなか便利ですね。
ただ、alt から'このエントリーを'を取り除いたのがきいてない気がするぞ
※ちなみに、はてブボタンのソースは実際は一行ですが、適宜改行・インデントしてあります

2010/11/25

? にのっていない gmail のキーボードショートカット

d : cc がはじめから入力可能(テキストエリアが表示されている)なメール作成
b : cc と bcc がはじめから入力可能なメール作成
ただし c のように Shift と組み合わせての別窓表示は不可。

Shift + o : 別窓でメールを表示

ほかにもあるかもしれない

2010/11/23

愛用している Google Chrome 拡張機能

以前少し書いたとおり、メインのブラウザは Goocle Chrome です。
職場では Windows7、開発環境は VMWare 上の Ubuntu、移動中にいじるノートPCも Ubuntu と様々な環境をふらふらすると、ブックマークと拡張機能の同期がかかせません。
それでいて、サクサク動いて firefox ほどではないにしても十分な拡張があります。

そんなわけで、せっかくだし自分の愛用している拡張機能を列挙しておこうと思う。
AutoPatchWork
定番の AutoPagerize 系のやつ。画面上であまり主張しないのが好み。

Better Gmail (Unofficial)
色々と GMail を便利にしてくれるらしい。いいなと思うのは添付ファイルのアイコンぐらいでそんなに恩恵を感じない。

Bubble Translate
翻訳用の拡張。
Rails3 とか使ってると英語サイトバリバリ見ないとダメ。これは必要な部分のみその場で翻訳してくれるので非常に重宝する。

Chrome Reader
Google Reader と連携する拡張機能。
気になった blog をその場で登録できる。その場でタグを指定できるのがいい。
アイコンで登録しているかどうかもわかるし、remove もその場でできる。
必要な機能を最低限の労力で利用できる。

Chromed Bird
ほぼ発信専門でそんなに TL を眺めないので、これぐらいで十分。

ChromeMilk
最近はもっぱら Google Task なので、そろそろ無効にしておこうかとも思ってるけど、RTMの拡張機能。
時間指定してリマインダー飛ばせるのは重宝するのだが、どうしても GMail やカレンダーと連携できる Google Task を使ってしまう。

Create Link
見てるページのアンカータグを作ってくれる。
blog 書くとき用。このエントリでは使いまくり。

CSSViewer
カーソル上のエレメントの css が一望できる。便利。
colorzilla の代わりに入れた。
カーソルで指すことのできない要素(コンテナ系とか)は見れないのが難点。

Gmail Fixed Width Text
メールは当幅じゃなきゃ。
ブラウザで GMail 見るときに当幅フォントで表示してくれる。

Google Mail Checker Plus
Thunderbird を窓から投げ捨てて、GMail 一本に統一したので導入した。
新着がないときにクリックした場合、GMail をひらいてくれる時と、空の吹き出しが表示される時がある。
条件がよく分からん。

Google Quick Scroll
ぐぐったサイトで、さらに目的の場所までナビゲートしてくれるエスコート上手な拡張機能。

IE Tab
ページを IE コンポーネントで表示してくれる拡張。
最近使わないけど、やっぱりあったほうがいいし、いつ使うことになるかわからないからいれてある。

Incredible StartPage - より使いやすいChromeのスタートページ
どっちかっていうといれたままになってるだけの拡張機能。
ブックマークはこちらのほうが見やすい。
でもよく使うサイトは見れない。
素のスタートページとどちらがいいかはお好み次第。

Lite Bookmarks
Google Bookmark 検索用拡張機能。
いろいろ使ってみたけど、これが一番シンプルで使いやすかった。

Neat Bookmarks
Chrome のブックマーク用の拡張機能。
基本的にブラウザのブックマークにはほんとによく使うものしか登録しないので、一覧表示できるやつが欲しかった。
常に別タブで開くことができるオプションがあれば言うことないんだけどな。

SmoothScroll
スクロールをスムーズにしてくれるらしいが、実は実感したことがない。
そっこーいれたため、これが当たり前になってるからだろうか??

Taberareloo
一番使う拡張機能かも。
主にブックマークに使用していて、はてブと Google Bookmark にブックマークして、Evernote にサイトをクリップ、そしてブックマークしたよって twitter へ投稿する。
これを一発でやってくれる。
Evernote の拡張とかあれはダメだ。クリッピングにかかる時間が長すぎる。

はてなブックマーク GoogleChrome 拡張
はてブの拡張。一応ブックマークとして利用もしているけど、サブ程度(メインは Google Bookmark)。
ブックマーク自体も Taberareloo 経由なので、この拡張は 100% 純粋に他ユーザのコメントを見るため用。
Firefox の拡張と違って、タブを使わないので、サイトとコメント同時にみられるのは便利だと思う。

とまあ、タイトルの割には大して利用していない拡張もあったけど、気にしない。

2010/11/11

unite.vim で :UniteWithInput 時に tab で補完がきかなくなった

vim で unite.vim を愛用しているんだけど、最新に更新したら使いにくくなった。
Rails 開発時の使い方はこんな感じ
・vim を立ち上げたら :cd $RAILS_ROOT/app でカレントディレクトリを app ディレクトリへ
・C-f に :UniteWithInput file を登録してあるので、状況に応じて C-f
・cont<tab><enter> で unit.vim のウィンドウに controllers ディレクトリのファイル一覧を表示
・ファイルを絞り込むなり、C-n でカーソル移動なりして開く
だいたいこんな感じで、ファイルのオープンを行ってた。
それが、なぜか tab でディレクトリの補完がきかなくなった(^Iが入力される)
また、ディレクトリ名の入力だけではダメで、最後に / を入れないとディレクトリ内部のファイルを列挙してくれないようだ。
(tabで補完できていた頃は気にしていなかっただけかもしれないが)
ちょっと unite.jax とにらめっこしてこよう。

[追記]
ありがたいことに機能追加していただけました。

2010/11/09

Rails3 で POP before SMTP

Rails3 で POP before SMTP にてメール送信できるまで。

ジェネレータで mailer を作成する。
rails g mailer TestMailer

config/application.rb にメール設定を追加
module Sample
  class Application < Rails::Application
    # ---- なんかいろいろ ----

    # mail setting
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {
      :enable_starttls_auto => false,
      :address => 'smtp.example.com',
      :port => 587,
      :domain => 'localhost',
      :user_name => 'user',
      :password => 'password'
    }
  end
end

メール本文を erb で。
<%= @text %>

配信メソッドを mailers/test_mailer.rb に追加。
# -*- coding: utf-8 -*-
require 'net/pop'
class TestMailer < ActionMailer::Base

  # テストメールを配信する
  def test
    @text = 'this is test mail' # インスタンス変数で view にデータを渡せる
    mail(
      :subject => 'Test mail',
      :from => 'from@example.com',
      :to => 'to@example.com'
    )
    authenticate
  end

  private
  # 認証メソッド
  def authenticate
    Net::POP3.auth_only(self.smtp_settings[:address], 110, self.smtp_settings[:user_name], self.smtp_settings[:password])
  end
end

実行
rails runner "TestMailer.test.deliver"

これで、deliver メソッドでの配信前に POP3 の認証が終わっているのでメールの送信ができる。
mailer をたくさん作るなら、ActionMailer::Base を拡張するようにしたほうがいいかな。

参考にしたサイト:てらじろぐ | ActionMailer設定色々

Rails3 のメール送信で "hostname was not match with the server certificate" というエラーが出た場合には

Rails3.0.1 にてメール送信のテストをしているとこんなエラーがでた。
/usr/lib/ruby/gems/1.8/gems/railties-3.0.1/lib/rails/commands/runner.rb:50: /usr/lib/ruby/1.8/openssl/ssl.rb:123:in `post_connection_check': hostname was not match with the server certificate (OpenSSL::SSL::SSLError)
        from /usr/lib/ruby/1.8/net/smtp.rb:582:in `tlsconnect'
        from /usr/lib/ruby/1.8/net/smtp.rb:562:in `do_start'
        from /usr/lib/ruby/1.8/net/smtp.rb:525:in `start'
        from /usr/lib/ruby/gems/1.8/gems/mail-2.2.9/lib/mail/network/delivery_methods/smtp.rb:115:in `deliver!'
        from /usr/lib/ruby/gems/1.8/gems/mail-2.2.9/lib/mail/message.rb:1928:in `do_delivery'
        from /usr/lib/ruby/gems/1.8/gems/mail-2.2.9/lib/mail/message.rb:228:in `deliver'
        from /usr/lib/ruby/gems/1.8/gems/actionmailer-3.0.1/lib/action_mailer/base.rb:401:in `deliver_mail'
        from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.1/lib/active_support/notifications.rb:52:in `instrument'
        from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
        from /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.1/lib/active_support/notifications.rb:52:in `instrument'
        from /usr/lib/ruby/gems/1.8/gems/actionmailer-3.0.1/lib/action_mailer/base.rb:399:in `deliver_mail'
        from /usr/lib/ruby/gems/1.8/gems/mail-2.2.9/lib/mail/message.rb:228:in `deliver'
        from (eval):1
        from /usr/lib/ruby/gems/1.8/gems/railties-3.0.1/lib/rails/commands.rb:39:in `eval'
        from /usr/lib/ruby/gems/1.8/gems/railties-3.0.1/lib/rails/commands/runner.rb:50
        from /usr/lib/ruby/gems/1.8/gems/railties-3.0.1/lib/rails/commands.rb:39:in `require'
        from /usr/lib/ruby/gems/1.8/gems/railties-3.0.1/lib/rails/commands.rb:39
        from script/rails:6:in `require'
        from script/rails:6
TLS接続を使用としてエラーになっているみたいなので、TLS接続をしないようにすればいいらしい。(今の環境はPOP before SMTPなのでTLSは必要ない)
config/application.rb にて smtp_settings に設定を追加すればメール送信できた。
config.action_mailer.smtp_settings = {
  :enable_starttls_auto => false, # ←これ
  :address => 'example.com',
  :port => 587,
  :domain => 'localhost',
  :user_name => 'user',
  :password => 'password'
}

2010/11/06

Rails3 で RJS の page オブジェクトを拡張する

例えば、facebox や fancybox のような Lightbox 系のスクリプトを使う場合、毎度毎度スクリプトを出力するコードはかかないですよね。
で、一度サーバ側で処理が必要な場合が多いので、Rails ではたいてい RJS などを使って AJAX 処理をすると思います。
その場合、helper に処理を書いてしまうのが楽なのですが、引数に page オブジェクトを渡す必要があります。
def popup(page, partial_name, locals)
  # popup 内の html を定義してある div を非同期更新
  page[:popup].replace_html :partial => partial_name, :locals => locals
  # facebox はたしかこんな感じで出せたと思う。うろ覚え
  page << '$.facebox($("#popup").html());'
end
でも、page.popup(partial_name, locals) とかけたほうがスマートな気がする。 page オブジェクトは ActionView::Helpers::PrototypeHelper::JavaScriptGenerator のインスタンスなのでこれを拡張してみる。
class ActionView::Helpers::PrototypeHelper::JavaScriptGenerator
  def popup(partial_name, locals)
    self[:popup].replace_html :partial => partial_name, :locals => locals
    self << '$.facebox($("#popup").html());'
  end
end
単純に page を self に書き換えただけ。ところがこれだとエラーがでる。 self に [] が定義されていないらしい。 というのも、page オブジェクトの各種メソッドが定義されているのは、さらに内部のモジュールである GeneratorMethods だからみたい。 というわけで、
module ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods
  def popup(partial_name, locals)
    self[:popup].replace_html :partial => partial_name, :locals => locals
    self << '$.facebox($("#popup").html());'
  end
end
これで OK

2010/11/05

既存のアプリを Rails 3.0.0 から Rails 3.0.1 へアップデートする

いつの間にか Rails 3.0.1 が出ていたのでアップデートしてみた。
まず、Gemfile にて gem 'rails', '3.0.0' となっているところを gem 'rails', '3.0.1' にする。
これで、rails s とやってみると、
You have requested:
  rails = 3.0.1

the bundle currently has rails locked at 3.0.0.
Try running `bundle update rails`
Try running `bundle insatall`
とエラーメッセージが表示される。
ローカルにはインストールされているけどロックされているから利用しないのね。
Gemfile.lock を直接いじっても対応できるような気もするが、素直に bundle update rails をする。
これだけでアップデートできた。
Rails 2.x.x のころはもう少し面倒だった気もするが、簡単だ。
API の変更部分にさえ気を遣えば意外と簡単にアップデートできるな。

gem install pg がエラーではまった

先ほどのエントリにて Thinkpad の環境構築時に唯一はまった点。
gem 以外の環境構築ができたので、rails アプリを svn で持ってきて bundle install した。
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

/home/pinzolo/.rvm/rubies/ruby-1.8.7-p302/bin/ruby extconf.rb
checking for pg_config... yes 
checking for libpq-fe.h... yes 
checking for libpq/libpq-fs.h... yes 
checking for PQconnectdb() in -lpq... no 
checking for PQconnectdb() in -llibpq... no 
checking for PQconnectdb() in -lms/libpq... no 
Can't find the PostgreSQL client library (libpq) 
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of 
necessary libraries and/or headers.  Check the mkmf.log file for more 
details.  You may need configuration options. 

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/home/pinzolo/.rvm/rubies/ruby-1.8.7-p302/bin/ruby
        --with-pg
        --without-pg
        --with-pg-config
        --without-pg-config
        --with-pg-dir
        --without-pg-dir
        --with-pg-include
        --without-pg-include=${pg-dir}/include
        --with-pg-lib
        --without-pg-lib=${pg-dir}/lib
        --enable-static-build
        --disable-static-build

Gem files will remain installed in /home/pinzolo/.rvm/rubies/ruby-1.8.7-p302/gems/pg-0.9.0 for inspection.
Results logged to /home/pinzolo/.rvm/rubies/ruby-1.8.7-p302/gems/pg-0.9.0/ext/gem_make.out
いくつか調べたが、ずばりな解は見つからなかった。
要するにライブラリが見つからないんだろうと言うことで、
gem install pg -- --with-pq-config=/usr/lib/postgresql/8.4/bin --with-pg-lib=/usr/lib
てやったらインストールできた。めでたしめでたし。
ここまでが昨日。

でもよく考えたら pg_config って /usr/lib/postgresql/8.4/bin にはない。
てことは --with-pg-config=/usr/lib/postgresql/8.4/bin はおかしいんじゃないのか?
というわけで、いったん pg をアンインストールして、今度は下記を実行。
gem install pg -- --with-pg-lib=/usr/lib
おお、インストールできた。というわけで gem install pg -- --with-pg-lib=/usr/lib が正解です。
/usr/lib なんて参照のためにあるような場所なのに見てくれてないのか・・・

Thinkpad X60に ubuntu をセットアップ

持ち運べて開発できるノートPCが欲しかった。
先日、Vista のノートが壊れてしまい、家には Centrino 時代の Vaio (OSはXP)だけになっていた。
起動させてメール見るのにも5分~10分もかかるという今となっては残念なシロモノ。
メモリ2Gのおかげで立ち上がればそれなりに使えるが、開発に使おうと思える物ではない。
で、開発用ノートなんだけど、今なら MacBook Air 11'inch か Thinkpad X201s に Ubuntu だよなぁと。
欲を言えばどっちも欲しい。誰か下さい
いや、まあどっちかを買う余裕も厳しいわけですがね、ハハハ

そんなわけで、先日池袋のソフマップ中古ショップをふらっと除いてみたら、Thinkpad X60 が 20,000 であった。
英語キーボードでメモリは既に 2G。ついでに OS も英語版 XP だったが。
どうも液晶に一部色落ちのような物があるらしいから、中古値段のさらに半額だったらしい。(英語OSだからってのもあるかもしれないが)
念のため、電源入れてもらって液晶を確認したが気になる程度じゃない。
これに40GBの Intel SSD 乗っけて、Ubuntu 入れりゃそこそこ使える開発マシンになるんじゃないか?と思い、購入した。
帰りにヨドバシで Intel SSD 40GB を購入して自宅で換装。
なんというか、ノートPCのくせに換装の楽なこと。Thinkpad のいいところだねぇ。
環境構築も一カ所以外はほとんど苦労せず完了。DropBox と Chrome のおかげで以前よりだいぶ短縮できた。

一昔前の型だからパフォーマンスはそんなに期待していなかったけど、SSDの恩恵だろうけどかなり満足行くレベル。
さすがにメインマシン(Core i7、メモリ8G)上の VMWare よりは劣るが。
ただ、バッテリーがガタがきているのかしらないが、全然もたない。
というか、ログインしたら「壊れてるかも」って警告される。
つうわけでここで代替品を購入。
純正品より遙かに安いし、評判もいいみたいだし。

2010/11/04

vim で :w は使わず :up を使うようにする

という決意表明。

:w としようとして :wq とやってしまって、せっかくのバッファが全て吹っ飛ぶ。
一日に二、三回やってしまう。

あとこんなのもあるみたい。
vimでファイルの保存に:w使うやつなんなの - <s>gnarl,</s>技術メモ”’<marquee><textarea>¥

2010/11/02

%s がシンボルの配列ならよかったのに

Ruby の %記法便利ですよね。
よく使うのは %w と % そのものでしょうか?
%s というのもあってこれはシンボルの %記法ですね。
でも別に : で十分ですよね。空白やその他の記号を含むシンボルなんて使った覚えあります?
個人的には %s が %w のシンボル版だったらいいのになぁと思います。
こんな感じに
>> %s(foo bar baz)
=> [:foo, :bar, :baz]
コード量たいしてかわんねーやん。なんて思うかもしれませんが、generator を作るときとかメタプログラミング的に便利だと思うです。
引数を values としたとき、[:<%= values.join(', :') %>] と書くよりも、%s(<%= values.join(' ') %>) とした方が見やすいでしょ。