0

WP PubSubHubbubインストール

wordpressのPubSubHubbubプラグインをインストールした。
WordPress › WP Pubsubhubbub WordPress Plugins

でもプラグインが動いてないような・・・LDRもGoogleReaderも即更新はされない。よくわからないけどgoogle側が調子悪いのかもしれないししばらく様子見する。

cd wp-content/plugins
wget http://downloads.wordpress.org/plugin/wp-pubsubhubbub.zip
unzip wp-pubsubhubbub.zip
rm wp-pubsubhubbub.zip

管理画面から有効化するだけ。

0

WordPress Related Posts Pluginインストール

このblog(wordpress)で使っているinoveテーマをアップデートしたので、LDRize/AutoPagerizeが動くようにするためにmicroformatsを埋め込んだりやってたらwp23_related_postsというプラグインがあるか判定をしている箇所があった。

調べてみた。発見した。記事のtagで類似度を判定して似た記事のリストを返すプラグインだった。
たぶん本文は解析してない。


インストールしよう

cd wp-content/plugins
wget http://downloads.wordpress.org/plugin/wordpress-23-related-posts-plugin.1.0.zip
unzip wordpress-23-related-posts-plugin.1.0.zip
rm wordpress-23-related-posts-plugin.1.0.zip

wordpressの管理画面からpluginを有効化すると、設定タブの下の方にWordPress Related Postsという設定項目が現れる。
表示する記事数などが設定できる。
inoveテーマではwp23_related_postsがあるか確認して表示しているけど、設定画面から記事の下に自動的に挿入するというオプションもある。

if(function_exists('wp23_related_posts')) {
  wp23_related_posts();
}

1

apache2のサブディレクトリをthinで起動してるsinatraにプロキシする

SinatraやRailsは開発は楽だけどデプロイ方法がいろいろあって悩む。
最近はpassengerを使う方法が流行ってるけど、あいにく学校に置いたサーバーでサブドメインが使えないので同一ホスト名でapacheと共存させるしかない。

passengerでもRailsBaseURIだったか?を設定すればサブディレクトリでRack対応アプリを動かせるが、
今回は1年前からRails+mongrelのデプロイに使っているapache2のサブディレクトリをmongrelで起動してるrailsにプロキシする – 橋本詳解と同じ方法でSinatra+Thinをデプロイした。
Railsではmongrel_clusterで複数起動させたrailsにapache2のmod_proxy_balancerでアクセスを割り振ったが、同じ設定でsinatra+thinにも割り振れる。

結果、橋本商会 Twitterの地名なうbotを全blockするOAuthアプリで作ったアプリのURLをport番号むきだし状態から http://shokai.mag.keio.ac.jp/block_nowbots/ という良いURLに変更できた。ちゃんと他のrailsアプリとも共存できてる
今は10個起動したthinにapacheがアクセスを割り振っている。


■thinでsinatraを動かす
まず単純にthinを1プロセスだけ起動してsinatraが動くかどうかチェックしておく

sudo gem install thin

起動にはアプリ本体と、config.ruが必要

main.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'rack'

get '/' do
end
thinから起動するためにrackをrequireしておく。


config.ru
require 'rubygems'
require 'sinatra'

require 'main.rb'
run Sinatra::Application


logやpid、静的ファイルを置く場所を作る
mkdir log
mkdir public
mkdir tmp
mkdir tmp/pids


まず普通に起動させてみる。とくにpublicやtmpディレクトリの位置を指定する必要ない。ディレクトリがあればそれぞれの機能は有効化されるし無くても特にエラーは出ないみたい
thin start -R config.ru
ctrl+Cで終了。



■apache2のmod_proxy_balancerでアクセスをthinに振り分ける

mod_proxy有効化
sudo a2enmod proxy_balancer 
sudo a2enmod proxy
sudo a2enmod proxy_http


/etc/apache2/mods-available/proxy.conf
<IfModule mod_proxy.c>
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

</IfModule>


/etc/apache2/conf.d/your-app-name.conf
ProxyPreserveHost Off
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /appname balancer://appname
ProxyPassReverse /appname balancer://appname

<Proxy balancer://appname>
BalancerMember http://127.0.0.1:4040 loadfactor=10
BalancerMember http://127.0.0.1:4041 loadfactor=10
BalancerMember http://127.0.0.1:4042 loadfactor=10
BalancerMember http://127.0.0.1:4043 loadfactor=10
BalancerMember http://127.0.0.1:4044 loadfactor=10
BalancerMember http://127.0.0.1:4045 loadfactor=10
BalancerMember http://127.0.0.1:4046 loadfactor=10
BalancerMember http://127.0.0.1:4047 loadfactor=10
BalancerMember http://127.0.0.1:4048 loadfactor=10
BalancerMember http://127.0.0.1:4049 loadfactor=10
</Proxy>
こうすると
http://hostname:4040/ から http://hostname:4049/までで動いているsinatraアプリが、
http://hostname/appname/ として外からは見えるようになる。

apache2再起動
sudo /etc/init.d/apache2 restart

今後は新しいアプリを作る毎にこの your-app-name.conf を雛形にして conf.d の中に配置してapache2再起動するだけでいい。




■thinを複数起動させる
thin+sinatraを複数起動させて管理しやすくする設定ファイルを作り、mongrel_clusterみたいにする。
main.rb, config.ruと同じディレクトリにthin.ymlを置く

thin.yml
timeout: 30
log: log/thin.log
environment: production
servers: 10
daemonize: true
rackup: config.ru
port: 4040


起動
thin start -C thin.yml
これでport 4040から10(つまり4049まで)まとめてdaemonとして起動する。

停止、再起動コマンドもある。
thin stop -C thin.yml
thin restart -C thin.yml



最終的なファイルの配置こうなる。 *.logと*.pidはthinが自動生成したもの。jsや画像はpublicの下に置く。
|-- config.ru
|-- log
| |-- thin.4040.log
| |-- thin.4041.log
| |-- thin.4042.log
| |-- thin.4043.log
| |-- thin.4044.log
| |-- thin.4045.log
| |-- thin.4046.log
| |-- thin.4047.log
| |-- thin.4048.log
| `-- thin.4049.log
|-- main.rb
|-- public
| `-- shokai.jpg
|-- thin.yml
`-- tmp
`-- pids
|-- thin.4040.pid
|-- thin.4041.pid
|-- thin.4042.pid
|-- thin.4043.pid
|-- thin.4044.pid
|-- thin.4045.pid
|-- thin.4046.pid
|-- thin.4047.pid
|-- thin.4048.pid
`-- thin.4049.pid

0

Twitterの地名なうbotを全blockするOAuthアプリ

http://shokai.mag.keio.ac.jp/block_nowbots/から使える。
(8月15日:URL変更しました

とりあえずSinatraとOAuthの組み合わせを試してみたかったので、DBは使わないものを作りたかった。取得したOAuthのtokenなどはその場で捨てている。blockコマンドを送る権限だけを一時的に委譲してもらう。


以下技術的なことのメモ。
■OAuthアプリの登録
まずhttp://twitter.com/oauth_clientsでアプリを登録し、consumer keyとconsumer secretを取得する。
で、下のコード中のCONSUMER_KEY, CONSUMER_SECRETを書き換える。


■必要なライブラリ
必要なgemをインストールする。最新版にした。

sudo gem install oauth twitter sinatra
それぞれ0.3.5, 0.6.13, 0.9.4がインストールされた。
twitterは内部でoauthに依存していて、oauthはバージョン毎に関数がけっこう変わっている。このバージョンの組み合わせなら動く。


■動かす
そして起動。
ruby block-nowbots.rb -p 2692 -s mongrel
thinだと複数クライアントから同時にアクセスした時1クライアントずつしか対応してくれなかったんだけど、mongrelは全クライアントに同時に応答してくれた。mongrelにいつのまにかそういう機能がついたのか、sinatraのバグでthinがthread処理されないのかはよくわからない。
sinatraもrailsと同じくデプロイまわりを工夫した方がよさそう。passenger使うのがいいのかな?


参考:


block-nowbots.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'oauth'
require 'twitter'

HOST_AND_PORT = "localhost:2692"

CONSUMER_KEY = "your-consumer-key"
CONSUMER_SECRET = "your-consumer-secret"

BOTS = 'nishinipporinow,nippori_now,kanda_now,tabata_now,sugamo_now,komagome_now,shinokubo_now,mejiro_now,takadanobabanow,okachimachi_now,uguisudani_now,ikebukuro_now,otsuka_now,akiba_now,tokyo_now,harajuku_now,shibuya_now,shibuya_now,yoyogi_now,shinjuku_now,ebisu_now'

set :sessions, true
def consumer
  OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET,
                      :site => "http://twitter.com")
end

template :layout do
  '<html>
     <body>
       <h1>地名なうbotを全blockするOAuthアプリ</h1>
       <%= yield %>
       <hr style="margin-top: 100px" />
       <a href="http://shokai.org">http://shokai.org</a><br /><a href="http://shokai.org/blog/archives/4698">解説</a>
     </body>
   </html>'
end

get '/' do
  @request_token = consumer.get_request_token(:oauth_callback => "http://#{HOST_AND_PORT}/auth")
  session[:request_token] = @request_token.token
  session[:request_token_secret] = @request_token.secret
  erb %{
    <p><%= BOTS %><br />をblock設定します</p>
    <p>OAuth認証してください</p>
    <a href="<%= @request_token.authorize_url %>">認証する!</a>
  }
end

get '/auth' do

  @request_token = OAuth::RequestToken.new(consumer,
                                          session[:request_token],
                                          session[:request_token_secret])
  @access_token = @request_token.get_access_token({},
                                                  :oauth_token => params[:oauth_token],
                                                  :oauth_verifier => params[:oauth_verifier])
  session[:access_token] = @access_token.token
  session[:access_token_secret] = @access_token.secret

  erb %{
    <p>認証成功</p>
    <p><a href="/block_now_bots">地名なうbotをblockする</a>(全部で<%= BOTS.split(",").size*3 %>秒くらいかかる)</p>
    <a href='/'>戻る</a>
  }
end

get '/block_now_bots' do
  oauth = Twitter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
  oauth.authorize_from_access(session[:access_token], session[:access_token_secret])
  twit = Twitter::Base.new(oauth)
  BOTS.split(",").each{|bot|
    twit.block(bot)
    puts "block #{bot}"
    sleep 3
  }
  erb %{
    <p>たぶんblockしました</p>
    <p><a href="http://twitter.com/yamanote_now/following">確認</a></p>
  }
end

0

cocoa emacsをインストールした

carbon emacsを使ってたけど、cocoa emacsに乗り換えた。
動作中にメニューの[Windows]→[Font Panel]でフォントサイズをかんたんに切り替えられるのがうれしい。


macportsでインストールした

sudo port install emacs-app-devel

先に持ってたホームディレクトリの.emacs.elや.emacs.d/以下は削除した。

/Applications/MacPorts/Emacs.app から起動。

Command + , で設定画面がでて、フォントなどの設定ができる。
バックスラッシュを打てるようにAlt/Optionキーの割り当てを無くして、かわりにFnキーにMetaを割り当てる
これでalt+¥で\が打てるようになった。
cocoa emacs setting


背景黒で文字を白にしたいので
esc-xして
set-background-color black
set-forground-color white
を指定。
Save Optionsで保存し、一旦終了する。次回起動時に背景黒文字白になってればok
cocoa emacs setting


Firefox拡張のIt’s All Textから指定するエディタへのパスは
/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
になる。これでtextareaをcocoa emacsで編集できる。
it's all text config