2012-02-01
Sinatra触ってると出てくるRackって何?
Sinatraを触ってると、Rackがいろんなところで出てくるが、いまいちわからないので調べた。
以下のページを参考。
- Ruby Freaks Lounge:第23回 Rackとは何か(1)Rackの生まれた背景|gihyo.jp … 技術評論社
- Ruby Freaks Lounge:第24回 Rackとは何か(2)Rackの使い方|gihyo.jp … 技術評論社
- Ruby Freaks Lounge:第25回 Rackとは何か(3)ミドルウェアのすすめ|gihyo.jp … 技術評論社
Rackとは、
ミドルウェアである。
別なアプリケーションをラップして、リクエストやレスポンスの加工、処理を切り替える。
WSGIに影響された。
WSGIとは,PythonのためのWebサーバとWebアプリケーション/フレームワーク間の標準インターフェースを定める「仕様」です。(中略)
両者間の標準インターフェースが提唱され,WSGIに対応しているフレームワークと,WSGIを介して連携できるWebサーバとをユーザが好みの組み合わせで使えるようになったのです。(中略)
RackはこのWSGIに影響されて開発された,Rubyにおけるサーバとアプリケーション/フレームワーク間のインターフェースの役割を果たすライブラリです。
「インターフェースが統一されていれば,サーバやフレームワークの組み合わせは自由である」
Ruby Freaks Lounge:第23回 Rackとは何か(1)Rackの生まれた背景|gihyo.jp … 技術評論社
rackupによって起動される。
app.rb等、ファイルの末尾に以下のコードを書き加えることで、app.rb単体でアプリケーションを起動できる。
if __FILE__ == $0 require 'rack/handler/webrick' Rack::Handler::WEBrick.run SimpleApp.new, :Port => 9292 end
問題は、サーバ依存のコードが残ってしまうこと。
サーバとアプリケーションの間に、Rackが入ることによって、自由に組み合わせられるのメリットが失われてしまう。
だから、rackupによって、起動させる。
「基本的にはconfig.ruに色々書いて,アプリケーション側にはサーバ依存のコードは書かない」
以下のものが最低限必要。
2012-01-30
Lokkaプラグインlokka-twitter_urlを作ってみた
大したものじゃないけど、Lokkaプラグイン作ってみた。
[twitter:meganii]
って、やると、http://twitter.com/meganiiへのリンクに置換するよ。
以下、参考にさせてもらいましたー!!
URLを自動でリンク先のタイトルで展開するLokkaプラグイン - a newcomer!
lokka-twitter_url.rb
module Lokka module TwitterUrl def self.registered(app) %w(posts posts/* pages pages/*).each do |suburl| app.before("/admin/#{suburl}") do if @request.env['REQUEST_METHOD'] =~ /POST|PUT/ && (body = (params[:post] && params[:post][:body])) body.force_encoding("utf-8").gsub!(/\[twitter:(.*?)\]/u){ TwitterUrl::Util.link($1) } end end end end module Util def self.link(id) "<a href=\"http://twitter.com/#{id}\" target=\"_blank\">@#{id}</a>" end end end end
gsub!
gsub!メソッドは、パターンにマッチした部分をすべて指定の文字列に置換します。レシーバ自身を変更するメソッドです。戻り値は、置換が行われたときはレシーバ自身、変更がなかったときはnilです。
参考
2012-01-29
お名前.comで取得したドメインでHeroku×Lokkaを動かすまで
Lokka | |
最近、Heroku上でLokkaを動かして遊んでいます。せっかく、勢いで独自ドメインを取ったので、独自ドメインで運用してみようと思ったときの備忘録です。
参考にさせてもらったページ
基本的に、ここのページを参考にさせてもらいました。
heroku側で、クレジットカードの番号を有効にして、設定を完了したあと、
Herokuアプリに独自ドメインを割り当てる(ムームードメインの場合) - アインシュタインの電話番号☎
あとは、DNSの反映が完了するのを待つだけ
完全に切り替わるまで、1日以上かかった気がします。
次にやりたいこと
参考
2012-01-28
GoogleAppEngineでRSS配信したい
python, googleappengine | |
twitterのリストから取得した情報をRSSとして配信したい。
参考にしたページ
from django.utils import feedgenerator from google.appengine.ext import webapp from google.appengine.ext.webapp import util from google.appengine.ext import db from google.appengine.ext.webapp import template class Rss(webapp.RequestHandler): def get(self): # フィード作成 feed = feedgenerator.Rss201rev2Feed( title = "extweet", link = "RSSのURL", description = "RSSの説明", language = u"ja") tweets = db.GqlQuery("SELECT * FROM Tweet ORDER BY date DESC") for tweet in tweets: feed.add_item( title = tweet.content, link = tweet.urls[0], description = tweet.content, pubdate = tweet.date) # RSS 文字列にする rss = feed.writeString("utf-8") self.response.headers['Content-Type']='text/xml; charset=utf-8' self.response.out.write(rss) def main(): application = webapp.WSGIApplication([('/rss',Rss)], debug=True) util.run_wsgi_app(application) if __name__ == '__main__': main()
(中略)
if lasttweet != None:
cursor = tweepy.Cursor(api.list_timeline,owner=OWNER,slug=SLUG,since_id=lasttweet.id,include_entities='true').items(100)
else:
cursor = tweepy.Cursor(api.list_timeline,owner=OWNER,slug=SLUG,include_entities='true').items(100)
for tweets in cursor:
tweeturls = []
for e in tweets.entities['urls']:
tweeturls.append(e['expanded_url'])
if len(tweeturls) > 0:
if lasttweet != None:
if tweets.id > lasttweet.id:
tweet = Tweet()
tweet.id = tweets.id
tweet.urls = tweeturls
tweet.title = tweets.text
tweet.content = tweets.text
tweet.save()
self.response.out.write(tweets.text)
なぜかこれだと、Bylineで読み込んだときに、空白のページになってしまった。
RSSの仕様を見ると、エンティティエンコードされたHTMLが使えますとのこと。もしかして、これかと思って、CDATAタグを加えてみると、なんだかうまく行ったみたい。。。
んー、何が原因だったんだろう?
RSS 2.0 Specification 日本語訳 - futomi's CGI Cafe
description がテキスト(エンティティーエンコードされた HTML が使えます。例をご覧下さい。)を含んでいるなら、その item はそれ自身で完結するかもしれません。 ...
Encoding & item-level descriptions (RSS 2.0 at Harvard Law)
CDATAタグを埋め込んだ
tweet = Tweet() tweet.id = tweets.id tweet.urls = tweeturls tweet.title = tweets.text content = "<![CDATA[" + tweets.text + "<a href=\"" + tweeturls[0] + "\">" + tweeturls[0] + "</a>" + "]]>" tweet.content = content tweet.save()
次実装したい機能
短縮URLを展開する
python | |
import sys import urllib2 URL = "http://t.co/lWhYkfyK" url = urllib2.urlopen(URL).geturl() print url
2011-12-28
2011年、印象に残った本ベスト10!!
読書 | |
今年もやってきました。@stiloさんの企画「2011年に読んだ本から10冊選んでブログで発表しよう! #10book2011」。思いついた順に、あげていきます!
その1 モレスキン 「伝説のノート」活用術〜記録・発想・個性を刺激する75の使い方
モレスキンへの誘い。この本を読んで、一層、楽しくモレスキンを使えるようになった。使ってること、書くこと、所有することへの満足感。使ってて楽しいから使ってます。
その2 海馬/脳は疲れない
いつまでも、ワクワク、どきどき、できるオトナになりたい。
その3 文章力の基本
ほぼ、1年前に読んだ本。こういう機会に、もう一度振り返って、ポイントを思い出せるからいいよね。そんな機会を提供してくれる@stiloさんありがとうございます。
その4 自分のアタマで考えよう
最近、読んだ。まだ消化してないけれど、ちゃんと理解したい1冊。知ってる知識からしか、物事を捉えていないだろうか?っていうところが、まさに自分のことだなぁって思った。
その5 プログラマが知るべき97のこと
その6 クラウド時代のハイブリッド手帳術
その7 ネットワークはなぜつながるのか
ネットワークスペシャリストの勉強のときに、参考に読んでいた。来年こそは、ネットワークスペシャリスト受かるぞー!!!
その8 マキコミの技術
巻き込まれるのは、得意だけど、巻き込むのはまだまだ苦手。ちょっとずつマキコミの技術を身につけたい。
その9 たった一度の人生を記録しなさい
ライフログについて、意識的にログを取ってみようと思えた。
その10 仕事は楽しいかね?
ここ2年ぐらい、どこかのタイミングで読み返している。自分は試しているか?いろいろと飛び跳ねなくちゃね。
最近、読んだ本の振り返りができてないから、これを機会に、気づいたことをアウトプットしていこうと思います。












