プログラムの最近のブログ記事

自分用メモ。

しばらく前にとある勉強会で「継続」なるものを知った。これを使うと便利な場面もあるらしく、コード例を交えつつ説明してくれた。

しかし、元々知識のない自分にはイマイチピンと来なかった。そんな時に誰かがこのサイトを教えてくれた。分かりやすい。ただし、概念が何となく分かったからって、継続を使ったコードが書ける気はしない。

なんでも継続

■現象

タイトル通りRuby on Railsで"You are being redirected"という画面が表示されるけど、実際には待ってもリダイレクトされないで、そのページのリンクをクリックしないと次のページに遷移しない。

You are being redirectedで検索するとRoRの特定のバージョンでそういうバグがあったらしいけど、自分の場合は違う。

■そもそも何の画面?

あまり詳しくは調べてないけど、redirect_toを使うと、HTTPレスポンスのヘッダで301だか302が返されると共に、ボディに前述の内容が含まれてクライアントに返されるらしい。

何らかの理由で、上手くリダイレクトがされない場合に、上の内容が表示される。

RubyのTwitter関連ライブラリには色々あるみたいだけど、Twitter4Rを使った。

■バージョン

先ほどのページを見ると0.3.0が最新のように見えるが、良く読むと「最新版はダウンロードサイトをチェックしてくれ」みたいに書いてある。ちなみに、ダウンロードサイトをみると 0.5.3 が最新版のようにも見えるが、gem installしてみたら0.6.0がインストールされた。

■前提知識

Twitter API、OAuthについての基礎知識はあるものとする。特にClientとBrowserの違いが分かってないと混乱するかも。

今回はClient形式のアプリを作るものとする。まぁボットみたいなものを想像してもらえばいいかと。

ちなみに、"Twitter4R"で検索して出てくるページは結構パスワード認証を使ってるけど、今はパスワード認証は廃止になっていて、APIにアクセスするのにはOAuthを使う必要があるので注意。

相変わらずボチボチLiftを触ってる。Lift 2.2 M1から入った便利な機能として、CSS Selectorがある。詳しくはWikiの該当のエントリを見てもらうとして、それとAjaxを組み合わせる方法。

■環境

Lift 2.2

■やりたい事

<form>タグを使った例はSimply Liftの4.8に載っているんだけど、普通のボタン(ajaxButton)を使いたかった。

DBのテーブルよりデータを取得して、HTMLの表にして出力。各行についているボタンをクリックすると、その行のデータに対する何らかの処理が行われるようにしたい。

結論から言うと簡単。

■MappedEnum

LiftにはMappedEnumという型がある。型引数の1つでEnumerationの子クラスを取る。モデルクラスのフィールドにそれを指定すると、フォームではEnumerationの各要素がプルダウンで選択できるようになる。

MappedEnumのシグニチャは以下の通り。

abstract class MappedEnum[T<:Mapper[T], ENUM <: Enumeration] (val fieldOwner: T, val enum: ENUM)
extends MappedField[ENUM#Value, T] 

タイトル通りだけど、<img src="foo.jpg" />とかそう言う話ではなく、DB内やファイルシステムにある画像ファイルを読み込んで、それをブラウザに出力する方法。以前、アップロードされた画像をDBに格納する方法についてエントリを書いたので、それと併せて読むといいかも。

■環境

  • Lift 2.2 (古いバージョンでも基本は一緒のはず)
  • Scala 2.8

 

Rubyでscraping

| コメント(0) | トラックバック(0)

■Rubyでスクレイピングするためのツール

"ruby scraping"で検索するとこのページが引っかかる。いくつかのツールの紹介と簡単な比較をしてるんだけど、本当にさわりだけなのでやっぱり自分である程度試してみる必要がある。あと、若干情報が古い。

自分は結論から言うとMechanizeを使う事にした。理由は以下の通り。

  • ページのこのリンクをクリックして次のページでフォームにこれを入れて…みたいな感じの操作を、比較的直感的にプログラムで記述できる。
  • 依存パッケージが少ないので(nokogiriだけ)インストールが楽
  • 割とメンテナンスがされている

タイトル通り。検索するとLiftを使ってる人にはお馴染みの武田ソフトさんのページが出てくる。基本はそれでOKなんだけど、バージョンが違うとちょっと違うので一応メモ。

■環境

  • Scala 2.8.1
  • Lift 2.2

以前ブログエントリに書いたCRUDifyは、ちょっとしたデータを作る時とかに便利。ただ、日付あるいは時刻型(MappedDate, MappedDateTime)のフィールドにうまく値が設定できなかった。MM/dd/YYYYで入力したんだけど…

で、解決方法は、文字列を日付にパースするメソッド及び日付を文字列にするメソッドをそれぞれおオーバーライドする。

  object dateField extends MappedDate(this) {
    import java.text.{SimpleDateFormat, ParseException}
    import java.util.Date
    val dateFormat = new SimpleDateFormat("yyyy/MM/dd")
    override def format(d: Date): String = dateFormat.format(is)
    override def parse(s: String): Box[Date] = {
      try {
        Full(dateFormat.parse(s))
      } catch {
        case e: ParseException => Empty 
      }
    }
  } 

 参考にしたのはMLのやりとり(1, 2, 3

自分用メモ。lift-mapper関連

行数を調べる(select count(*) from )。scaladoc

SomeModel.count

フィールドがNULLかどうかを調べる。

someModel.field.is == null

 フィールドにNULLをセットする。Stack Overflowでの似たような質問

someModel.field(Empty)

このブログの作者

名前:kazu
仕事:IT関係の何でも屋
メール:kazu 後幕 kazu どと tv
詳しくはこの辺

このアーカイブについて

このページには、過去に書かれたブログ記事のうちプログラムカテゴリに属しているものが含まれています。

前のカテゴリはニュースです。

次のカテゴリは個人で仕事です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ