Archive for category webservice

フォントのためし書きが出来るサイト一覧

Posted by admin on Tuesday, 11 May, 2010

日本語フォントを試し書きできるサイトって意外とあるんですよ!

さわらびフォント
http://sawarabi-fonts.sourceforge.jp/sampler/sawarabi-sampler.html

デコモジ
http://decomoji.jp/

白舟書体。左メニューの[書体見本]->[xxxxシリーズ]->[WebTypeViewer]のバナーをクリックで試し書きが出来ます。
http://www.hakusyu.com/

fonthack.jp
http://fonthack.jp/

秀英体。少し違いますが、フォントの骨格比較が出来ます。
http://www.dnp.co.jp/shueitai/

他にも多数見かけたのですが、探すと見つからない…

日本語フォントをウェブから試す事が出来るサイトを知っている方、ぜひ紹介していただけないでしょうか?

MeCabで日本語を楽しむサイト作ったよー

Posted by admin on Wednesday, 25 November, 2009

MeCabで日本語を楽しむサイト、めかるぶ(Mecab-る)をリリースしました!日本語が分解されるって面白い!

http://mecabru.jp/

日本語をMeCab(和布蕪)る

このサイトでしている事はほんとに単純で、MeCabの解析結果をそのまま画面に表示しているだけです。

この他にリリースしている地域ったーpimotterでもMeCabは使っていて、もうMeCabなしには生きられない体になってしまいました、YahooAPIのあれじゃ満足できないかも。

でもでも右左にMeCabでの解析結果、YahooAPIでの解析結果を見比べれるのは面白そうです。

仕事でもちょっと使っていますが、このライブラリとしての使いやすさは素晴らしいと思います。テキストプロトコルの偉大さを感じます。あと辞書に単語を足すのが凄く簡単です、パフォーマンスの問題はあるのですが、ちょっとした差分を辞書全体の構築からやり直さなくてもできるのでとっても手軽です。

以下今回のサービスのネタバレです。他は画面だけでした。モデルはありません。

require 'MeCab'

class MecabruController < ApplicationController

  def index
    @form = Form.new(params[:form])
    @form.text ||= DEFAULT_TEXTS[rand(2)]
  end

  def parse

    if (params[:form].blank? || (@form = Form.new(params[:form])).valid? == false)
      render :text => "
値を入力して下さい。
" return end m = MeCab::Tagger.new @nodes = @form.text.split(/[\r\n\t\s ]+/).inject([]){|result, text_node| n = m.parseToNode(text_node) while n result << [n.surface, n.feature] n = n.next end result } end class Form < ActiveForm attr_accessor :text validates_presence_of :text, :message => "テキストが入力されていません。" end DEFAULT_TEXTS = ["そんなことねーよ 前に俺がクオーターパウンダー頼んだ時、 玉ねぎがみじん切りの玉ねぎになっててわざわざ店まで戻って 「クオーターパウンダーの玉ねぎ違うだろ!」 ってクレームつけたら「?」みたいな感じで首かしげられて 新しいの渡されたけど開いてみたらまたみじん切りの玉ねぎで 「みじん切りの玉ねぎしかないなら予め伝えるべきだろ!」ってクレームつけたら 「いや、でも玉ねぎは玉ねぎですからねえ」みたいな事言われて 「いや、じゃなくて俺がクオーターパウンダー頼む理由は  玉ねぎがみじん切りじゃなくて千切りって理由で買ってるわけであって  それならビックマックたのんだ方がましじゃねーか!」 ってクオーターパウンダーモドキを投げつけたら 「こーまーりーまーすー」 とかいってきたからついでにポテトもばらまいてコーラも投げつけようとしたら 「こーまーりーまーすこぉーまーりーまーすぅー」 とか言いながら手を押さえ付けられたから 「え、何しちゃってんの?暴力?」 って言ってコーラ自分でかぶって 「店長さんよお、お前が手を叩いたから  俺にコーラ全部かかっちまったじゃねえか、どないしてくれますの」 って言ったら「こーまーりーまーすー」 ってまた言ってきたから示談金として ビックマックとフィレオフィッシュ要求したら、警察に通報されてて捕まった", "俺は昔H宿のマックでダブルチーズバーガーのLセット頼んだんだけど、 ドリンク置かれた場所がトレーの端だったから 地下行く階段の手前でトレーから落としたのね あちゃーって顔してレジ見たら店員のお姉さんが笑顔で 「新しいのご用意しますね」って言いながら、 トレー持って立ち尽くしてる俺に小走りでカウンターの中から出てきたのね 多分落ちたカップを拾ったり掃除しようとしたんだろうけどさ そしたらお姉さんがいきなり 「おきをふんすなっぶ」 とか言いながら落ちてた氷を踏んで豪快に転けたんだよ そして俺に体当たりしてきて俺はトレーに残ってたポテトを 撒き散らしながら階段を転げ落ちた お姉さんは体当たりした瞬間俺のみぞおちに二発位パンチしてて マックの店員ははんぱねぇと思ったわマジで"] end

以上です。それではよろしければMeCabを楽しんで下さい!

日本語フォントのまとめサイト、fonthack.jpをリリースしました!

Posted by admin on Friday, 13 November, 2009

3週間もたってからのブログに告知です。

無料で使える日本語フォントのまとめサイト。fonthack.jpをリリースしました!

site

このサービスを使うと、目的の文章が、日本語フォントでどのように表示されるかを一括で確認できます。同時に16フォントまで選択可能で、CTRL+クリックか、クリックしたままで下に引っ張ると一括選択出来ます。

どのような日本語フォントがあるのかを知りたい、実際の表示を確認してみたい。漢字を使えるのか見たい。ひらがな、カタカナの文字列を画像として欲しい。といった方々に使って頂けたらと思います。

web0_0

AAの表示もできます。AAのチェックボックスを入力し先頭に空白行を1行追加下さい。以下2つのサンプルはモナーフォントシリーズで16pxを指定しています。

やる夫の徳川家康シリーズから抜粋 – 今川義元さんにご挨拶。

hello_yosimoto

やる夫の徳川家康シリーズから抜粋 – 桶狭間、前哨戦。

imagawa25000

フォントのライセンスは作者別で個別に定義されていることが多いですので、利用の際には確認のほどお願いします。CreativeCommonsやGPL、MITといったオープンソースやウェブの世界で標準に使われているライセンスは少数派になります。

またプロが仕事で利用する日本語フォントについては購入するのが一般的のようです。お試しで利用できるフォントであれば検討した後に購入することが可能です。

このサービスはタイポラボ様の商用フォントをお試し利用可能となっています。本来はライセンスに抵触していますが、特別に許可を頂きました。存分にアニト、セプテンバー、ルイカフォントをお試し下さい。

技術的な話

このサービスはrailsの2.3.2作られています。データベースはpostgresql8.3。フォント画像の表示にはRMagick。画像ファイルの保存にはrailsのpluginのattachment-fuを使っています。

技術的には表示ボタンを押したタイミングで、画像ファイルを作って出力しているだけです。前にクレジットカードを作るサービスを開発した際に、簡単にキレイなフォントが表示できるなーと感動したことからサービスを思いつきました。

勉強になった点

このサービスは技術的に勉強になるポイントはあまり無かったのですが、フォントの世界に片足(つま先)を入れる事ができたという点がすごく勉強になりました。

まず写植とDTPの歴史をまったく知らなかったのですが、そこについて少しだけ知ること事が出来たという点。実際にフォントを作っている方々のブログやフォントの説明記事を興味深く見れるようになれたという点。フォントを取りまくライセンスを知ることができた点。

今こうしてキレイな日本語フォントを無料で使えるのは、低価格で購入できるのは、フォントの歴史の積み重ねと情熱をもった方々のおかげだと知ることが出来ました。ぼくはほんと素人で何が出来る分けでもありませんが、ウェブサービスを通じて日本語フォントの世界にちょっとでも貢献して行ければと思います。

それでは日本語フォントのお試しサイト、fonthack.jpをよろしくお願いします!

地域ッターを作ったー

Posted by admin on Thursday, 24 September, 2009

地域で何が起こったのかが分かるサービス、地域ったーをリリースしました!

地域ったー

地域ッター東日本地域ッター西日本がフォローしているフォロワーの発言を読み取り、そこから地域情報(都道府県名、駅名、地名、市町村名前)を集計して表示しています。

自然と地元の発言が多くなると思いますので、地域ッター東日本地域ッター西日本のいずれかに所属して地元の発言を増やして行きましょう!

開発の動機は「福岡ァ!」に「北海道ァ!」が共鳴しているのを見て思いついたぐらいの軽い感じだったのですが、サービスを公開した後に様々な展開をできる事に気が付きました。

地域別発言のグラフ化や、トレース。ホットな地域の可視化。地域別フォロワーの分布、などなど面白そうな展開がたくさん出来そうです。

開発後記

rails 2.3.2, postgresql 8.3, memcached, ruby-twitter-API, MeCabを組み合わせて開発しました。

cronで1分おきにtimelineを取得し、それをMeCabを使い地域情報を抽出しています。ここで更新した内容をmemcachedでキャッシュさせ、トップページでは常にキャッシュを表示するようにしています。

twitter系のサービスを開発してみた思ったのは、本当に簡単に作れるということです。既にあるコンテンツを収集とかアーカイブするだけでサービスが作れてしまうので、ちょっと拍子抜けです。

APIも充実していますし、情報も溢れていますし困るような所がありませんでした。ここまで簡単に作れるのは本当にいいですね。本当に注力したい箇所に労力を集中できる気がします。

それではみさなま地域ったーをよろしくお願い致します。

ピモッターをリリースしたよ!

Posted by admin on Sunday, 13 September, 2009

こんな会話があったのが、12日の夜。

[2009/09/12 22:58:25] えがちゃんの発言: ひまだなーw
[2009/09/12 22:58:27] えがちゃんの発言: なにします?w
[2009/09/12 22:58:29] えがちゃんの発言: なんかサービスつくりたいw
[2009/09/12 23:03:57] tkosugaの発言: なんのサービス?
[2009/09/12 23:04:07] tkosugaの発言: この話に食いつく
[2009/09/12 23:04:25] えがちゃんの発言: pimoteのAPIをつかったサービスですねー

そこからbuzzterみたいなのを作りたいと言う話になりましたので、

颯爽とpimotterをリリースしました!この公開が13日19時30分ですので、話しが始まってからリリースまで21時間という速さです。

精度はまだまだ低いのですが、雰囲気は十分に感じ取ってもられるのではないかなと思います。

pimoteで流行しているキーワードを自動的に抽出し、それをピックアップして見ることができます。これでどんな事が流行しているのか一目で分かりますね!

このウェブサービスはrails 2.3.2 を使って作られています。pimoteサーバーには5分間隔で最新のタイムラインを取得しに行っています。画面に表示されるタイムライン解析結果はmemcachedを使って3分間キャッシュしてます。タイムラインの解析にはMeCabを使いました。

pimoteといいますか、twitterで流れる文章はほとんど口語で流れてるプラス、名詞だけ抜きだせば良いというものではないという事が分かってきました。

アスキーアートも抜き出せると良いのですが、パターンで一致させるぐらいしか方法が思いつきませんでした(ここは未実装です)

さっくりと作る分には誰が作っても同じような実装になると思うので、ここにこのサービスの中核となるMeCabで構文解析された単語の取り捨てをするコードを貼り付けます。

  #
  # もっとちゃんと作らないと。後で時間かけてかなー。
  #
  def self.necessary?(surface, feature, prev_feature)

    #p surface + ", feature:" + feature + ", prev_feature: " + prev_feature.to_s

    return false if surface.blank?
    return false if surface.split(//u).collect{|c| MARKS.include?(c)}.all?
    return false if /[[:cntrl:]|[:blank:]|[:punct:]]+/ =~ surface

    return true if (/^名詞,(一般|固有名詞|サ変接続|形容動詞語幹|ナイ形容詞語幹)/ =~ feature)
    return true if (/^形容詞,(自立)/ =~ feature)
    return true if (/^接頭詞,名詞接続/ =~ feature)
    return true if (/^感動詞/ =~ feature)

    return false if prev_feature.blank?

    #
    # この2つ次は絶対に拾う
    #
    if (/^接頭詞,名詞接続/ =~ prev_feature)
      return true
    end

    if (/^名詞/ =~ prev_feature)
      return true if (/^助詞,(.*,連語|終助詞|係助詞)/ =~ feature)
      return true if (/^動詞,(非自立)/ =~ feature)
    end

    if (/^助詞,格助詞,連語/ =~ prev_feature)
      return true if (/^助動詞/ =~ feature)
    end

    if (/^助詞,係助詞/ =~ prev_feature)
      return true if (/^助詞,終助詞/ =~ feature)
    end

    if (/^動詞,非自立/ =~ prev_feature)
      return true if (/^動詞,非自立/ =~ feature)
    end

    false
  end

  ASCII_ART_MARKS = %w{゚ ノ Д 冫}
  ASCII_MARKS   = %w{… ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ ^ _ ` { | } ~ > <}
  ZENKAKU_MARKS = %w{  、 。 , . ・ : ; ? ! ゛ ゜ ´ ` ¨ ^  ̄ _ ヽ ヾ ゝ ゞ 〃 仝 々 〆 〇 ー ― ‐ / \ ~ ∥ | … ‥ ‘ ’ “ ” ( ) 〔 〕 [ ] { } 〈 〉 《 》 「 」 『 』 【 】 + - ± × ÷ = ≠ < > ≦ ≧ ∞ ∴ ♂ ♀ ° ′ ″ ℃ ¥ $ ¢ £ % # & * @ § ☆ ★ ○ ● ◎ ◇ ◆ □ ■ △ ▲ ▽ ▼ ※ 〒 → ← ↑ ↓ 〓 ∈ ∋ ⊆ ⊇ ⊂ ⊃ ∪ ∩ ∧ ∨ ¬ ⇒ ⇔ ∀ ∃ ∠ ⊥ ⌒ ∂ ∇ ≡ ≒ ≪ ≫ √ ∽ ∝ ∵ ∫ ∬ Å ‰ # ♭ ♪ † ‡ ¶ ◯ ─ │ ┌ ┐ ┘ └ ├ ┬ ┤ ┴ ┼ ━ ┃ ┏ ┓ ┛ ┗ ┣ ┳ ┫ ┻ ╋ ┠ ┯ ┨ ┷ ┿ ┝ ┰ ┥ ┸ ╂ ∮ ∑ ∟ ⊿ ¦ ' " }
  MARKS = ASCII_MARKS + ZENKAKU_MARKS + ASCII_ART_MARKS

よそで書かれたテキストを自分のサーバーにもってきて加工するだけのサービスって楽ですね。負荷の問題もありませんし。接続先は1つですし。次からのサービスを作るときに、このあまりの楽々さに溺れてしまわないよう気をつけたいと思います。

railsでSEOするには?sitemap.xmlの生成とウェブマスタツールへの登録。

Posted by admin on Sunday, 6 September, 2009

railsに限らずですが、ウェブアプリケーションフレームワークでSEOについて言及されているのをあまり見ない気がします。

CMSの世界ではSEOが活発に行なわれており、1つ記事を書くだけでGoogle、Yahooが認識しやすくなるよう勝手にmetaタグ内の最適化やsitemap.xmlの更新を行なってくれるプラグインもあります。

先日公開した、クレジットカード・メーカーもSEOを意識して作ってあります。このアプリケーションはRubu on railsを使っていますので、実際に行なったSEOの内容を紹介して行きます。

Yahooサイトエクスプローラーに登録

Yahooサイトエクスプローラーに登録します。これに登録することで、Yahooでどのページがインデックスとして認識されているか、sitemapやrobots.txtの内容に誤りが無いかを知ることができます。

管理するサイトを登録すると、承認のためmetaタグを埋め込むかファイルを置くように言われますので、ここではmetaタグを埋め込みました。

<META name="y_key" content="xxxxxxxx" />

Googleウェブマスターツールに登録

GoogleもYahooサイトエクスプローラーのようなウェブマスタを支援するツールのGoogleウェブマスターツールを提供しています。

同じように、管理するサイトを登録すると、承認のためmetaタグを埋め込むかファイルを置くように言われますので、ここではmetaタグを埋め込みました。

<meta name="verify-v1" content="xxxxxxxx" />

bing Webmaster Centerに登録

上2つと同じようにBingにも同様のツールが公開されています。同じように登録して同じようにmetaタグを埋め込みます。

<meta name="msvalidate.01" content="xxxxxxxx" />

これで各検索エンジンでどのようにサイトを認識しているのかを知ることが出来ます。どのツールも登録から解析結果がでるまで最低で1週間はかかります。それまでは気長に待ちましょう。

サイトマップの生成

上記3つともにサイトマップを登録してあげます。サイトマップを作るツールとしてはxml-sitemapsが有名です。このツールで生成されるのは静的なサイトマップですので、動的なコンテンツが含まれている場合にはサイトマップも動的に生成しなければなりません。

まずサイトマップを返すコントローラーを作成します。

class SitemapController < ApplicationController
  def sitemap
    headers["Content-Type"] = "text/xml"
    headers["Last-Modified"] = Date.today.utc
    render :layout => false
  end
end

ビューはこのようにします。

xml.instruct!
xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do

  if (request.port == 80)
    base_location = request.protocol + request.host
  else
    base_location = request.protocol + request.host + ":" + request.port.to_s
  end

  xml.url do
    xml.loc base_location + "/"
    xml.lastmod Image.find(:first, : order => "id desc").created_at.utc.xmlschema
  end

  xml.url do
    xml.loc base_location + "/new"
    xml.lastmod File.mtime(File.dirname(__FILE__) + '/../new/index.html.erb').utc.xmlschema
  end

  xml.url do
    xml.loc base_location + "/about"
    xml.lastmod File.mtime(File.dirname(__FILE__) + '/../about/index.html.erb').utc.xmlschema
  end

  Image.find(:all).each{|image|

    if (image.parent_id.blank?)
      xml.url do
        xml.loc base_location + "/card/#{image.id}"
        xml.lastmod image.created_at.utc.xmlschema
      end
    end
  }

end

動的ではない静的なページもあると思います。静的なページについては以下のようにそのファイルの更新日時を指定してあげるとよいでしょう。

xml.lastmod File.mtime(File.dirname(__FILE__) + '/../about/index.html.erb').utc.xmlschema

xml.lastmodに指定しているtimestamp.utc.xmlschemaの動作は以下のようになります。

>> Time.now
=> Sun Sep 06 19:59:10 +0900 2009
>> Time.now.utc
=> Sun Sep 06 10:59:13 UTC 2009
>> Time.now.utc.xmlschema
=> "2009-09-06T10:59:17Z"

サイトマップは一般的にはルート直下にsitemap.xmlという形で設置します。これを実現するためにroute.rbに以下を書き足します。

map.connect 'sitemap.xml', :controller => "sitemap", :action => "sitemap"

ここで作られたsitemap.xmlをそれぞれの検索エンジンのウェブマスターツールに登録します。

静的なコンテンツ中心のサイトではサイトマップ作っても意味はないのでしょうが、動的なコンテンツの場合は、このサイトマップとURLの正規化を合せて行なう事で検索エンジンがサイトのコンテンツを正しく認識してくれることに役に立たちます。

railsでのURLの正規化については以下サイトで説明がされています。合せて参照下さい。

http://www.seoonrails.com/

二次生成サービスにおける生成されたコンテンツのライセンスをどう取り扱えば良いのか

Posted by admin on Sunday, 6 September, 2009

クレジットカード・メーカーでは生成された画像についての著作権をサービス側では全て放棄し、利用者の判断に任せているのですが、開発当初はCreative Commonsに所属させようかなとも思っていました。

flickerでのCreative Commons

クレジットカード・メーカーでflickerの画像を使うのであれば、[NoDerivs]の除いた以下の物が利用可能対象になります。

Attribution License
Attribution-NonCommercial License
Attribution-NonCommercial-ShareAlike License
Attribution-ShareAlike License

以下のURLから、これらライセンスで利用可能な画像を探せます。

http://www.flickr.com/creativecommons/

でも作られた画像に対してライセンスを持つとなると、こういった管理を同様にしなければいけなくなるということになります。帰属の明記をどうすれば良いのかの判断が付きませんでした。

よって生成された画像についての著作権を全て放棄することにしました。上記理由以上に、二次生成された物でコピーライトを主張されるのは気色悪いですよね。

さらにコンテンツを管理するライセンスを調べてみたのですが、[ニコニ・コモンズ]は面白いと思います。

ニコニ・コモンズ

登録制。親子関係が分かり、親が消えれば子も消える仕組み。非常に明確なライセンスであるけど、作品の登録が必須で影響範囲がニコニコ動画に限定されている。

もしこのライセンスが普及した場合には、DNSでドメイン管理するような感覚でコンテンツ管理するようになるのでしょうか?

http://help.nicovideo.jp/niconicommons/about/

pixivのライセンス

pixivのライセンスも気になったのですが、公式にpixivコモンズについて説明するサイトが見つかりませんでした。ヘルプにも書かれていません。存在しないはずはないのでしょうが、どうなっているんでしょうね?

slicehostのcentos(5.2)にImageMagick(6.5.3-10)とRMagick(2.11.0)をインストール

Posted by admin on Sunday, 6 September, 2009

1つ前の記事と同じように、クレジットカード・メーカーが実稼動するcentos5.2でrmagickが動くようにします。

まず依存するライブラリをインストールします。

sudo yum install bzip2-devel freetype-devel libpng-devel libtiff-devel freetype-devel libjpeg-devel

ソースコードもってきてconfigureしてmakeしてinstall

wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.5.3-10.tar.gz
tar xvfz ImageMagick-6.5.3-10.tar.gz
cd ImageMagick-6.5.3-10

./configure --disable-static --with-modules --without-perl \
     --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp

make
sudo make install

共有ライブラリを認識させます。

ldconfig

あとは以下を~/.bashrcに追記します。

export LD_LIBRARY_PATH=/usr/local/lib

gemでRMagickをインストール。

gem install rmagick -v 2.11.0

以上です。centosに入れるのは特に問題なくできました。

UbuntuにImageMagick(6.5.3-10)とRMagick(2.11.0)をインストールする

Posted by admin on Sunday, 6 September, 2009

クレジットカード・メーカーの開発はUbuntuで行ないました。そこでRMagickをインストールできるまですんなりとは行かなかったので備忘録としてブログ記事にします。

まず依存するライブラリをインストール。

sudo apt-get install libfreetype6
sudo apt-get install libfreetype6-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libpng12-dev
sudo apt-get install libwmf-dev
sudo apt-get install libperl-dev
sudo apt-get install libbz2-dev
sudo apt-get install libz-dev
sudo apt-get install libx11-dev
sudo apt-get install libxt-dev
sudo apt-get install libxext-dev
sudo apt-get install libxml2-dev
sudo apt-get install liblcms1-dev
sudo apt-get install libexif-dev
sudo apt-get install libjasper-dev
sudo apt-get install libltdl3-dev
sudo apt-get install graphviz
sudo apt-get install gs-gpl
sudo apt-get install pkg-config

wgetでソースコードを取得します。

wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.5.3-10.tar.gz
tar xvfz ImageMagick-6.5.3-10.tar.gz
cd ImageMagick-6.5.3-10

configure するときに –disable-openmpを足しました。

./configure --disable-static --with-modules --without-perl \
     --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp

makeしてインストールします。

make
sudo make install

シンボリックリンクを更新します。

ldconfig

これをやらないとibMagickCore.so.2が見つからないとエラーがでます。

$ convert --version
convert: error while loading shared libraries: libMagickCore.so.2: cannot open shared object file: No such file or directory

正常にインストールできたことを確認。

$ convert --version
Version: ImageMagick 6.5.3-10 2009-08-04 Q8 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC

次にgemでRMagickをインストールします。

sudo gem install rmagick -v 2.11.0

irbから動作確認してみましょう。

require 'rubygems'
require 'RMagick'
require 'pp'

include Magick
pp colors

ずらーっと色情報が出力されれば完了です。

rails + passenger でファイルをアップロードするときに注意すること

Posted by admin on Sunday, 6 September, 2009

今回、クレジットカード・メーカーを作るにあたって、アップロードされたファイルの取り扱いに意外と気を使う必要がありました。上限を超えたばかでかいファイルが送られてくるケースや、ファイルの拡張子はpngでも内容はexeファイルであったりなどです。

ここではそれらに対して行なった設定と実装を説明します。

Apacheにアップロードするファイルサイズの上限を指定

クレジットカード・メーカーではアップロードできるファイルサイズの上限を1Mまでとしています。
このファイルサイズ以上をアップロードされても捨てるしかありませんので、リソースの無駄使いになってしまいます。

これを防ぐためにはApacheのLimitRequestBodyディレクティブを使います。

以下、上記ページからの抜粋です。

このディレクティブは、 管理者にクライアントからの異常なリクエストを制御できるようにし、 何らかの形のサービス拒否攻撃 (訳注:DoS) を避けるのに有効です。

ある場所へのファイルアップロードを許可する場合に、 アップロードできるファイルのサイズを 100K に制限したければ、 以下のように指定します:

LimitRequestBody 102400

アップロードされたファイルの種類を指定

アップロードされてきたファイルのMIMEタイプを判別し、それが背景画像として使えるかを判定しなければいけません。

MIMEタイプを判定するライブラリにはshared-mime-infoを使いました。

yumを使ってインストールするには以下のコマンドを実行します。

yum install shared-mime-info

rubyからshared-mime-infoを使えるように以下のコマンドを実行します。

gem install shared-mime-info

これでMIMEパッケージが使えるようになりますので、以下のコードでファイルの種類を知ることができます。

require 'rubygems'
require 'shared-mime-info'

MIME.check_magics('images/sample.jpg').type
=> "image/jpeg"

shared-mime-infoの仕様に、推奨するMIMEタイプのチェックする順番について書かれています。

簡単に書きますと、次の3ステップになります。

1. MIMEタイプを見る
2. glob(ファイルの拡張子)を見る
3. magic(ヘッダ部分のバイナリ)を見る

attachment-fuの使い方

クレジットカード・メーカーはカード画像の生成にImageMagickを使っています。railsプラグインのattachment-fuではサムネイルの生成にImageMagickを使っているためとても相性がよかったです。

以下のようにthumbnailsにファイルのサイズを書くだけでサムネイルを勝手に生成してくれます。

class PublishedImageFile < ActiveRecord::Base
  has_attachment(:content_type => :image,
                 :max_size => 1024.kilobytes,
                 :thumbnails => { :middle => '387x249', :small => '258x166'}
  )
end

このモデルのスキーマは以下のようになっています。

  create_table "published_image_files", :force => true do |t|
    t.integer  "parent_id"
    t.string   "content_type"
    t.string   "filename"
    t.string   "thumbnail"
    t.integer  "size"
    t.integer  "width"
    t.integer  "height"
    t.string   "name",                         :default => "オリジナルの"
    t.string   "comment",      :limit => 1024, :default => "自分だけのクレカ出来た!"
    t.boolean  "fixed"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "published_image_files", ["content_type"], :name => "index_published_image_files_on_content_type"
  add_index "published_image_files", ["created_at"], :name => "index_published_image_files_on_created_at"
  add_index "published_image_files", ["parent_id"], :name => "index_published_image_files_on_parent_id"

テーブル作って、モデル作って、has_attachmentと書くだけでアタッチメントの管理できるattachment-fuは素晴らしいです。モデルを削除すると保存先のストレージからも消してくれます。

以上です、railsでファイルをアップロードするサービスを作る方の参考になれば幸いです。