2008年10月31日金曜日

[iGoogle] iTunesの新作・人気曲・人気アルバムを閲覧できるガジェット

appleのiTunesで配信されている各種フィード(iTunes Music Store RSS Generator)をまとめたガジェットです。
時間帯によっては読み込めない(エラーが出る)場合があるかもしれません。
しばらく時間をおくと復活すると思うのでご了承ください。

(iGoogleに追加する場合)「設定を編集」に「ジャンル」という項目があります。
ここで指定されたジャンルが、ページ読み込み時に最初に表示されます。


上のサンプルは日本のiTunes Storeだけに対応したタイプですが、インターナショナル版も同時に作成しました。
世界の音楽に興味のある方はそちらをおすすめします。

iGoogleに追加する場合はこちらからどうぞ(日本版) Add to Google
インターナショナル版はこちらから Add to Google

自分のブログやWebページに埋め込む場合はこちらからどうぞ 日本版 | インターナショナル版

関連ガジェット
[iGoogle] CD新発売情報取得ガジェット

2008年10月29日水曜日

[iGoogle] ソーシャルブックマークの人気ページをまとめてチェックできるガジェット

色々なソーシャルブックマークで「ホット」「人気」「話題」のページをまとめて閲覧できるガジェットです。
それぞれのフィードをRSSリーダーに登録して購読するより、話題になっているページを簡単に俯瞰できると思います。



対応しているソーシャルブックマークサービス

Yahooブックマーク
はてなブックマーク
livedoor クリップ
Buzzurl
@nifty クリップ

iGoogleに追加する場合はこちらからどうぞ Add to Google
自分のブログやWebページに埋め込む場合はこちらからどうぞ

関連ガジェット
[iGoogle] "ブログで話題のキーワード” をコンパクトにまとめたガジェット

2008年10月22日水曜日

[Ruby on Rails] will_paginateの便利なViewヘルパー

will_paginateのエントリー([Ruby on Rails] ActiveRecord以外でwill_paginateを使う方法)を書くためにwill_paginateのソースを読んでみたら、使えそうなViewヘルパーがあったのでメモ。

will_paginate(collection = nil, options = {})

よく使うやつですね。
詳細ははぶきます。

参考リンク:
will_paginateに移行 - ひげろぐ


paginated_section(*args, &block)

will_paginateメソッドの親戚。パラメーターは共通です。

<% paginated_section @posts do %>
<ol id="posts">
<% for post in @posts %>
<li> ... </li>
<% end %>
</ol>
<% end %>

このように書くと...
<div class="pagination"> ... </div>
<ol id="posts">
...
</ol>
<div class="pagination"> ... </div>




page_entries_info(collection)
ページの情報を人間が見やすい形で整形してくれる。(残念ながら英語にしか対応していませんが)
<%= page_entries_info @posts %>
# #-> Displaying entries 6 - 10 of 26 in total

日本語にするならこんな感じでヘルパーを書く
application_helper.rb
def my_page_entries_info(collection)
if collection.total_pages < 2
case collection.size
when 0; 'エントリーは見つかりません'
when 1; '<b>1</b> 件のエントリーを表示しています'
else; "<b>#{collection.size}</b> 件のエントリーを表示しています"
end
else
%{<b>b</b>%d  〜  %d<b>/b</b> 件目 / <b>%d</b>件} % [
collection.offset + 1,
collection.offset + collection.length,
collection.total_entries
]
end
end

2008年10月21日火曜日

[Ruby on Rails] ActiveRecord以外でwill_paginateを使う方法

will_paginateはページングを行うための便利なライブラリです。
普通ActiveRecordと連携して使用することが多いと思うのですが、ActiveRecordと無関係に、普通の配列にも使えるようです。

APIを通じてデータを取得する場合などに使えそうです。

How to use will_paginate with non-ActiveRecord collection/array
(http://www.sharingb.com)


1. コレクションを取得する

ActiveRecordの場合

@posts = Post.paginate(:page => params[:page], :per_page => 10)

(@postsはWillPaginate::Collectionクラスのインスタンスになります)

非ActiveRecordの場合
@posts = Post.perform_search_and_obtain_collection(params[:criteria])

(@postsはデータの中味とデータの総数を参照できるオブジェクトを想定)


2. WillPaginate::Collection クラスのインスタンスを作成する

ここがポイントです。
非ActiveRecordの場合、WillPaginate::Collectionクラスのインスタンスを作成する必要があります。
@page_results = WillPaginate::Collection.create(params[:page], 10, @posts.total_results) do |pager|
pager.replace(@posts.items.to_array)
end

引数には現在のページ、ページごとのデータ数、データの総数を渡します。

データ(@posts.items)が配列の場合はこのように書くこともできます。
@page_results = @posts.items.paginate({
:page => params[:page],
:per_page => 10,
:total_entries => @posts.total_results
})


3: View

WillPaginate::Collectionクラスのインスタンスを作成したら、あとはActiveRecordと連携した場合と一緒です。
<ol>
<% for post in @page_results -%>
<li>Render `results` in some nice way.</li>
<% end -%>
</ol>

<p>Now let's render us some pagination!</p>
<%= will_paginate @page_results %>

2008年10月20日月曜日

[Ruby on Rails] テキストフォーマット関連の便利なViewヘルパー

Module: ActionView::Helpers::TextHelper
(http://api.rubyonrails.com)

auto_link(text, link = :all, href_options = {}, &block)

テキストに含まれるURLとメールアドレスをAタグで囲えるメソッド。

パラメーター


text:
置き換えたいURLやメールアドレスが含まれるテクスト

link:
:all(default), :email_addresses, :urlsの3つから選べる。:allはURLとメールアドレスをすべて変換。

href_options:
属性をハッシュで指定できる。{:target => '_blank'}など。

&block:
置き換えの対象のURLやメールアドレスをブロックで処理できる。

auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
# say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :urls)
# => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
# or e-mail david@loudthinking.com"

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :email_addresses)
# => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

post_body = "Welcome to my new blog at http://www.myblog.com/. Please e-mail me at me@email.com."
auto_link(post_body, :all, :target => '_blank') do |text|
truncate(text, 15)
end
# => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.
Please e-mail me at <a href=\"mailto:me@email.com\">me@email.com</a>."


simple_format(text)

シンプルなルールで改行をフォーマットできるメソッド
2つ以上の連続する改行コード(\n\n) => pタグ
ひとつの改行コード(\n) => brタグ
my_text = """Here is some basic text...
...with a line break."""

simple_format(my_text)
# => "<p>Here is some basic text...<br />...with a line break.</p>"

more_text = """We want to put a paragraph...

...right there."""

simple_format(more_text)
# => "<p>We want to put a paragraph...</p><p>...right there.</p>"


Pタグがうるさく感じるようなら独自ヘルパーで対応。改行コードをbrタグに置き換え。
application_helper.rb
module ApplicationHelper
def linebreaksbr(text)
return text.gsub(/\r\n|\r|\n/, "<br />")
end
end



textilize(text)

Textile
記法をHTMLに変換できるメソッド。
Textileのシンタックスについて詳しくはこちら
このメソッドを使用するにはRedClothモジュールが必要なので注意。
textilize("*This is Textile!*  Rejoice!")
# => "<p><strong>This is Textile!</strong> Rejoice!</p>"

textilize("I _love_ ROR(Ruby on Rails)!")
# => "<p>I <em>love</em> <acronym title="Ruby on Rails">ROR</acronym>!</p>"

textilize("h2. Textile makes markup -easy- simple!")
# => "<h2>Textile makes markup <del>easy</del> simple!</h2>"

textilize("Visit the Rails website "here":http://www.rubyonrails.org/.)
# => "<p>Visit the Rails website <a href="http://www.rubyonrails.org/">here</a>.</p>"


textilize_without_paragraph(text)

textilizeとほとんど同じだけど、こちらはPタグを付加しない。


truncate(text, length = 30, truncate_string = "...")

テキストをX文字以内に切り詰めるメソッド。
truncate("Once upon a time in a world far far away", 14)
# => Once upon a...

truncate("Once upon a time in a world far far away")
# => Once upon a time in a world f...

truncate("And they found that many people were sleeping better.", 25, "(clipped)")
# => And they found that many (clipped)

truncate("And they found that many people were sleeping better.", 15, "... (continued)")
# => And they found... (continued)

[iGoogle] "ブログで話題のキーワード” をコンパクトにまとめたガジェット

Yahooブログ検索kizashi.jpテクノラティジャパンが提供しているフィードを利用して、ブログで話題になっているキーワードを手軽にチェックできるガジェットを作りました。



「検索」
気になるキーワードをみつけたらワンクリックで検索できます

G => Googleウェブ検索
Y => Yahoo!ウェブ検索
N => Googleニュース検索

iGoogleに追加する場合はこちらからどうぞ Add to Google
ブログやWebページに埋め込む場合はこちらからどうぞ

関連ガジェット
[iGoogle] ソーシャルブックマークの人気ページをまとめてチェックできるガジェット

2008年10月19日日曜日

[iGoogle] "amazon.co.jpベストセラーズ" ガジェト

アマゾンで売れてる商品をチェックできるガジェットです。
Googleガジェットを利用しています。

本、音楽、DVDなどの主要カテゴリーと、それぞれの子カテゴリー(本 => 文学,ノンフィクション,コンピュータなど)までを細かく表示できるのが特徴です。

詳細リンクにカーソルをのせると詳しい情報を見ることができます。
表示する商品数は1〜10件まで設定することができます。



iGoogleに追加する場合はこちらからどうぞ Add to Google

自分のブログやWebページに掲載する場合はこちらからどうぞ。

関連ガジェット
[iGoogle] 新刊本情報取得ガジェット
[iGoogle] CD新発売情報取得ガジェット
[iGoogle] DVD新発売情報取得ガジェット

2008年10月17日金曜日

Rubyのhpricotを使ってページのタイトルと説明を取得してみる

Rubyのhpricotを使ってページのtitleとmetaのdescriptionをスクレイピングするメモ。

require 'hpricot'
require 'open-uri'
require 'kconv'
require "resolv-replace"
require 'timeout'

begin
doc = timeout(10){ Hpricot( open(url).read ) }
rescue URI::InvalidURIError
rescue OpenURI::HTTPError
rescue SocketError
rescue Errno::ENOENT
rescue RuntimeError
rescue TimeoutError
#各種エラー
end

title = doc.search('title').first.innerText.strip.toutf8
desc_elm = doc.search('meta[@name=description]').first
desc = desc_elm ? desc_elm.get_attribute('content').strip.toutf8 : ""

open-uriはタイムアウトの時間を設定するすることができないので別途処理。


参考サイト:
RubyのHpricotも便利さでは負けていないの巻 (CodeZine)
RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanize
open-uriにtimeoutを設定する方法

2008年10月14日火曜日

Javascriptで小数点以下X桁を四捨五入する

例えば

3.14159265

という数字があって、これを小数点以下3桁を四捨五入して

3.14

にしたい場合。

Javascriptの Math.round をそのまま使っても上手くいかないし、小数点以下うんぬんという引数も指定できない。

Math.round(3.14159265); // => 3


ちょこっと小細工(?)する必要があるようです。

3.14159265 を100倍して
var i = 3.14159265 * 100; // => 314.159265

小数点以下を四捨五入する。
i = Math.round(i); // => 314

それを100で割ると
i / 100; // => 3.14

期待どおりの値が求められました。

四捨五入以外はこっち
Math.floor(n) 小数点以下 切り捨て Math.floor(1234.56); // => 1234
Math.ceil(n) 小数点以下 切り上げ Math.ceil(1234.56) // => 1235

2008年10月12日日曜日

LibroSpot: オンラインで本を管理するサイト

新しくWebサービスを作ったのでご紹介。



LibroSpot
(http://jp.librospot.com)

本のソーシャルブックマークのような感じで使ってもらうのを想定して作りました。

オンライン本棚
読書記録
これから読む本のリスト

として利用できると思います。


特徴
本ごとにコメント、タグを付けられます。
「未読」「既読」「読書中」のステータス管理ができます。


必要なもの
Googleのアカウント

もちろん無料でご利用いただけます。


このサイトを作るのに利用したもの

Google App Engine
インフラ

Amazon Associates Web Service
本のデータはアマゾンのWebサービスを利用して取得しています。
Python用のライブラリが見つからなかったので自分で書きました。とても公開できるレベルじゃありませんが。。。

Google Book Search API
Embedded Viewer APIを使って本の内容をプレビューすることができるのですが、日本語の書籍はまだまだ対応している数が少ないようで。ほとんどプレビューすることができません。

Django
Google App Engine Django Helperもあわせて利用しています。

jQuery
Javascript関係

2008年10月7日火曜日

[iGoogle] 「2ちゃんねるまとめのまとめ」ガジェット

Webサイト版「2ちゃんねるまとめのまとめ」リリースしました。
http://2chfeed.appspot.com/

各まとめブログさんの過去記事をたどれるようになっているので(少しですが)
お暇な時に一気読みでもどうぞ

--------

戯れにGoogleガジェットでこんなものを作ってしまいました。



下のまとめブログさんをまとめています。

痛いニュース(ノ∀`)
【2ch】ニュー速クオリティ
ハムスター速報 2ろぐ
日刊スレッドガイド
ベア速
カナ速
ワラノート

編集できる設定
最大何件表示するか
サマリーを表示するかどうか
投稿日時を表示するかどうか

iGoogleに追加するには上のGoogleのロゴからどうぞ。
自分のブログやWebサイトに張りたい方はこちらからどうぞ。

Google App EngineのDjangoヘルパーでユーザーのプロフィールを利用しやすくしてみる

この前の記事(Google App EngineのDjangoヘルパーで認証してみる)からDjangoヘルパーを利用したApp Engine用のアプリをしこしこと作ってるのですが、もともとDjangoにうといもので、ソースコードを汗書いて読んだりしながら格闘している感じです。

そんな中で、Userモデルの get_profile というメソッドの使いどころがちょっと分からなかったので、調べたところをメモ。

django_appengine.auth.models

def get_profile(self):
"""
Returns site-specific profile for this user. Raises
SiteProfileNotAvailable if this site does not allow profiles.

When using the App Engine authentication framework, users are created
automatically.
"""
from django.contrib.auth.models import SiteProfileNotAvailable
if not hasattr(self, '_profile_cache'):
from django.conf import settings
if not hasattr(settings, "AUTH_PROFILE_MODULE"):
raise SiteProfileNotAvailable
try:
app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
model = models.get_model(app_label, model_name)
self._profile_cache = model.all().filter("user =", self).get()
if not self._profile_cache:
raise model.DoesNotExist
except (ImportError, ImproperlyConfigured):
raise SiteProfileNotAvailable
return self._profile_cache

get_profileは名前のとおりユーザーと関連づけられたプロフィールを取得するためのメソッドです。

Djangoヘルパーを利用すると、初回ログイン時にUserモデルにユーザーのデータが自動で保存されますが、プロフィールを格納するモデルは用意されていません。
なので、プロフィール用のモデルを各自定義する必要があります。
from appengine_django.auth.models import User

class Profile(BaseModel):
user = db.ReferenceProperty(User) #Userモデルを参照
address = db.StringProperty() #住所
bio = db.TextProperty() #自己紹介

def __str__(self):
return self.user.username

こんな感じで住所と自己紹介を保存するモデルを定義しました。

さらに、setting.py に下のように記述
AUTH_PROFILE_MODULE = ‘app.Profile’ #app名.モデル名

これでget_profileを使う準備ができました。

view.py
def index(request):
if request.user.is_authenticated():
try:
address = request.user.get_profile().address
bio = request.user.get_profile().bio
except DoesNotExist:
#ログインしていても
#プロフィールが登録されていないとDoesNotExistが飛んでくる

プロフィールの作成や削除については特別なことはなにもないので割愛。

2008年10月5日日曜日

[Zend Framework] Zend_Db_Profiler_Firebugでデータベースをプロファイリングしてみる


Zend Framework1.6には Zend_Db_Profiler_Firebug というちょっと興味深いコンポネントが追加されたようです。

Firebug によるプロファイリング
(http://framework.zend.com/manual/ja)

これは Zend_Db_Profiler を拡張したクラスなのですが、
そもそも Zend_Db_Profiler というのは...

Zend_Db_Profiler を使用すると、クエリの情報を取得することができます。 アダプタが実際に実行したクエリの内容や実行所要時間などが取得でき、 余計なデバッグコードをクラスに追加しなくてもクエリを調べられるようになります。 さらに、条件を指定して特定のクエリだけの情報を取得することもできます。

Zend_Db_Profiler_Firebugは、プロファイルした情報をログに保存したり、echoやprintで出力する代わりに、Firebugのコンソールで監視することができます。

Zend_Db_Profiler_Firebugに必要な環境:
Firefox
Firebug (https://addons.mozilla.org/en-US/firefox/addon/1843)
FirePHP (https://addons.mozilla.org/en-US/firefox/addon/6149)


使用法は非常にシンプルで起動ファイルに次のように書くだけです。
// 起動ファイル

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);

// プロファイラを db アダプタにアタッチします
$db->setProfiler($profiler)

// フロントコントローラをディスパッチします

// モデル、ビューそしてコントローラファイル内で発行されたすべての
// DB クエリのプロファイル結果が Firebug に送信されます

これだけで、全クエリをFirebugで監視することができるようになります。

SELECTクエリだけ調べたいとかDELETE/UPDATEだけ調べたい、という使い方もできます。詳しくはZend_Db_Profilerのマニュアルをご覧ください。