TwitterBarサービスを作成するためのシナトラとの夜

一般的に、私は私の小さな頭の子について少し紹介して話したいので、夕方のコードについて話したいと思います。 何かを学びたい、特にテクノロジーを理解したいのなら、もちろん読むだけでなく、最も重要なこととして、このテクノロジーを楽しんで、座って、やる必要があると考えて信じています。 プログラミングは創造的な仕事であり、プロジェクト、サービス、スタートアップの頭の中にはそれぞれのアイデアがあります。そうでない場合は、まだいくつかの小さなニーズがあります。 -これは学習の喜びです。 これはもちろん私見です。



しかし、どういうわけか私は1つの欲求、またはむしろ、広い意味でのtwitterの「露出主義」の必要性がありました。 私は定期的にTwitterを投稿しています。そこでは、テクノロジー、プログラミング、時にはいい音楽についてのリンクを定期的に共有し、時にはアジアの生活や旅行について話します。 ですから、時々、これらのツイートをより多くの人に見せるようにしたいと思います。たとえば、Last.fmとの類推により、現在聴いているものを表示することができます(ちなみに、このためにLastFM.barも行いました)。たとえば、私が書いているフォーラムへの訪問者が署名の最後のツイートを見ることができます。 問題は、フォーラムが私のものではないことですが、署名に挿入できるのは、画像のみ、JSなどのダイナミクス、BBCodeのみ、写真のみです。

したがって、3つのことすべてを実行する非常に簡単でシンプルなサービスをまとめることは素晴らしいことだと判断しました。

1.ユーザーの最後のツイートを、たとえばJSON形式で取得します

2.このJSONを逆アセンブルし、背景のテーマ画像を撮影し、フォント、サイズを調整し、テキストにハイフンを配置し、このテキストを画像に描画します

3.キャッシュ用のヘッダーを提供し、画像自体を提供します

それだけです



さて、最近、Ruby、特にRuby on Railsでより多くのプロジェクトをやろうとしてきましたが、この場合、この大きなフレームワークは冗長になると思います。 古き良きシナトラがすぐに思い浮かびました。 彼はWebフレームワークの先駆者と呼ぶことができ、Slim、Fat3、Perlには弟のDancer、さらに多くのMojolicious :: Liteを貯金箱に入れたPHPなどのフォロワーを誕生させることができました。 しかし、これらのフレームワークはすべて単なるシャドウであり、独自の少しlittleいDSLがあり、Rubyの美しさはありません。この美しさを少しお見せしましょう。



プロジェクトはデータベースを使用せず、商用ではないため、デモから始めましょう。そのような場合、特にホスティングがHerokuほど単純ではなかったため、優れたホスティングサービスHeroku.comを使用しました。 そして、デモはこちらです: twitterbar.heroku.com

また、ソースはここからダウンロードできます。それらは非常に少なく、非常にシンプルですgithub.com/mpakus/twitterbar



一般的なシナトラについて少し話をして、アプリケーションの構造とソースを見てみましょう。



シナトラとは何ですか? 実際、これは1行に置くことができる通常のgem(ライブラリ)です

> gem install sinatra



新しいファイルを作成する

> mcedit first_app.rb



書いて

require 'sinatra' get '/' do "Hello World" end
      
      







コンソールでこのファイルを実行します

> ruby​​ first_app.rb

その後、ポート4567のローカルホストにWebサーバーが作成されます。これで、お気に入りのブラウザーを開き、localhost:4567と入力して、Sinatraでの最初のアプリケーションの動作を確認できます。

出来上がり、シンプルで便利!



塩とは何ですか? シンプルに、1つのライブラリをrequire経由で接続し、必要なルートを便利なDSL言語でペイントし、必要に応じて、お気に入りのテンプレートエンジン(組み込みのERBまたはHAML言語など)を使用しました。だれかがSlimに夢中になり、ビューに必要なテンプレートを引き出し、それらを接続しましたパブリックフォルダーの静的ファイルを表示しましたが、通常はテンプレートをメインファイルに直接保存でき、よりシンプルでコンパクトです。 これらはすべて非常に柔軟でカスタマイズ可能なので、ドキュメントwww.sinatrarb.com/documentationからそれがどれほど明るく明確であるかを疑問に思う



今夜の私の簡単なアプリケーションについて。



ルートにはメインのindex.rbアプリケーションファイルがあり、オブジェクトを必要としないためメソッドをシングレットにした2つのヘルパークラスがあります。Rubyにもクラスがあります:)理解するのは難しいですが、そのように思えました基本言語で見られ、コードごとに直接実行されます。 しかし、気が散ったので、クラスフォルダーに書き込んで置いた2つのクラス:twitter.rb-最後のユーザーのツイートをJSON形式で取り出し、通常のルビーハッシュに変換します

imagebar.rbはテキストの絵を描くためのシンプルなクラスでもあり、rmagickライブラリを使用します。これはImageMagickユーティリティへのアダプタです



そして、アプリケーションを見てみましょう。PerlのようにRubyのコメントが#で始まるように、各行にコメントをペイントしようとします。たとえば、長年のPerl開発の後、一般に快適で便利でした。



そして、index.rbを1行ずつ、何を、何を、どのように使用しているかを理解します。



 require 'rubygems' #  1.9 Ruby   ,    require 'sinatra' #    require 'sinatra/reloader' #          require Dir.pwd + '/classes/twitter.rb' #        require Dir.pwd + '/classes/imagebar.rb' #        require 'ostruct' #    yaml    ruby require 'yaml' #   yaml  set :env, :production #    configure do #  ,     set :root, File.dirname(__FILE__) enable :static #        publc enable :logging #  enable :dump_errors #    disable :sessions #       end get '/' do #       response['Cache-Control'] = "public, max-age=#{5*60*10}" #     erb :index #      views/index.html.erb   layout end #        get '/twit/:theme/:user.gif' do #  ,     theme_dir = Dir.pwd + '/themes/' #      user_name = params[:user] #       theme = params[:theme] #         #    ,      -  halt [ 404, "Page not found" ] unless user_name halt [ 500, "Sorry wrong theme" ] unless theme halt [ 404, "Can't find themes file" ] unless FileTest.exists? theme_dir + theme + '.yml' halt [ 404, "Can not found background" ] unless FileTest.exists? theme_dir + theme + '.gif' #  yaml       ruby  conf = OpenStruct.new( YAML.load_file theme_dir + theme + '.yml' ) #      twit = Twitter.get_last_post user_name #     ,   2  response['Cache-Control'] = "public, max-age=#{60*2}" content_type 'image/gif' #  mime  ,    ImageBar.draw theme_dir, theme, twit, conf #         end
      
      







ただ? そして、あなたの心に、それは通常の英語のように、ほとんど本能的なレベルのコードで読みます。



続けましょうか? 2つのクラスのうち、最初のクラスはTwitterです。

 class Twitter #    require 'open-uri' #     , - CURL  require 'json' #     JSON  class << self #           last_post = nil #         def get_last_post user_name #      download user_name #     get_data user_name #        end protected #    ,    def download user_name #     json   @last_post = open("http://api.twitter.com/1/statuses/user_timeline/#{user_name}.json").read end def get_data user_name JSON.parse @last_post #   JSON     end end end
      
      





あなたはただ同意しますか?



さて、写真にツイートをレンダリングするための2番目のImageBarクラス:

 class ImageBar #    require 'RMagick' #       class << self #     def draw theme_dir, theme, twit, conf #        #       img = Magick::ImageList.new theme_dir + theme + '.gif' text = Magick::Draw.new #      text.font = conf.font #     text.pointsize = conf.font_size.to_i #   text.gravity = Magick::NorthWestGravity #      text.fill = conf.color #   text.kerning = conf.kerning #   text.interline_spacing = conf.interline_spacing #   #   ,      wrap_text    text.annotate img, conf.width, conf.height, conf.left, conf.top, wrap_text( twit[0]['text'], conf.chars_in_row ) img.to_blob #      end def wrap_text(txt, col = 30) #       txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/, "\\1\\3\n") end end end
      
      





それはすべて、これ以上の魔法ではなく、すべてがレンガのように単純であり、それは同じくらい確実にそして簡単に動作します。



たとえば、RMagickのすべての種類のマナの研究全体を考慮すると、シナトラは夕方に多くの喜びと知識を受け取りました。そして、脳がこのPHPの単調性にnotれず、良好な状態に保たれることが非常に重要です。



今、Sinatra Up and RunningというSinatraの本を読んでうれしいです-簡単に学べる文学で、このシンプルな詳細をすべて説明していますが、同時に非常に強力で簡潔なRubyフレームワークです。Rubyの世界は生きているので、本とフレームワークの両方をお勧めしますRuby on Railsフレームワークだけでなく、非常に便利な馬も使用できます。これは、あらゆる種類のAPIの作成、迅速な統計収集、ある種の静的レンダリングなど、大規模なRailsインフラストラクチャで不要な場合のタスクでの使用にさらに適している場合がありますカード NOK(カウンター、評価、投票である)、一般的には、シンプルさ、スピード、およびミニマリズムコードロード可能とオーバーヘッドを必要とするすべて。



それだけです、ありがとう。 質問、提案、コメントがありましたら、お読みになり、議論してください。



All Articles