Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GDK48総選挙の裏側

2,352 views

Published on

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

GDK48総選挙の裏側

  1. 1. GDK48総選挙の裏側2011年11月22日火曜日
  2. 2. 自己紹介 •運営レンジャー イエロー2011年11月22日火曜日
  3. 3. 運営レンジャー2011年11月22日火曜日
  4. 4. GDK48総選挙アプリ2011年11月22日火曜日
  5. 5. 仕様 •#gdk48かつGistのURLがあるTweetを集める •集めたGistを一覧する •Twitter認証したユーザがGistに投票できる2011年11月22日火曜日
  6. 6. Tweetを集める2011年11月22日火曜日
  7. 7. 一覧する2011年11月22日火曜日
  8. 8. 投票する Twitterアカウントで ログイン ログインすると 投票できる2011年11月22日火曜日
  9. 9. アーキテクチャ •Grails 1.3.7 •Amazon EC22011年11月22日火曜日
  10. 10. 使ったプラグイン $ grails list-plugins -installed Plug-ins you currently have installed are listed below: ------------------------------------------------------------- blueprint 1.0.2 -- Blueprint CSS framework hibernate 1.3.7 -- Hibernate for Grails jquery 1.6.1.1 -- JQuery for Grails quartz 0.4.2 -- This plugin adds Quartz job scheduling resources 1.1.1 -- Resources spring-security-core 1.2.4 -- Spring Security Core Plugin spring-security-twitter 0.3.4 -- Twitter authentication for Spring tomcat 1.3.7 -- Apache Tomcat plugin for Grails2011年11月22日火曜日
  11. 11. ボリューム $ grails stats +----------------------+-------+-------+ | Name | Files | LOC | +----------------------+-------+-------+ | Controllers | 5 | 141 | | Domain Classes | 6 | 113 | | Jobs | 1 | 44 | | Unit Tests | 5 | 102 | +----------------------+-------+-------+ | Totals | 17 | 400 | +----------------------+-------+-------+2011年11月22日火曜日
  12. 12. ツイートを取ってくる •Quartzプラグインを使って1分おきに Twitter検索 (q=#gdk48) •検索結果のツイートにGistのURLが含まれ るか? •短縮URLの問題2011年11月22日火曜日
  13. 13. 短縮URLを展開 •java.net.URL使ってヘッダだけ取得 •Locationヘッダの値を見る •GistへのURLか? さらに短縮URLか?2011年11月22日火曜日
  14. 14. /** * URLからGistの番号を取得。 * URLがGistのURLじゃなかったらnullを返す。 */ private Long getGistNo(String url, tryCount = 0) { if (tryCount >= MAX_TRY) { return null } def m = url =~ GIST_URL if (m) { return m[0][1].toLong() } else { def conn = new URL(url).openConnection() conn.followRedirects = false def location = conn.getHeaderField(Location) return location ? getGistNo(location, ++tryCount) : null } }2011年11月22日火曜日
  15. 15. Twitter認証 $ grails install-plugin spring-security-core $ grails s2-quickstart $ grails install-plugin spring-security-twitter $ grails s2-init-twitter コマンド4つでほぼ完了! <twitterAuth:button/>2011年11月22日火曜日
  16. 16. Gist連携 •Gistコード表示 •Description表示2011年11月22日火曜日
  17. 17. Gistコード表示2011年11月22日火曜日
  18. 18. Gistコード表示2011年11月22日火曜日
  19. 19. scriptタグだけ<script src="https://gist.github.com/1197737.js"></script>2011年11月22日火曜日
  20. 20. Description表示 scriptタグ埋め込みでは表示されない!2011年11月22日火曜日
  21. 21. Description表示 scriptタグ埋め込みでは表示されない!2011年11月22日火曜日
  22. 22. Gist API v3 •http://developer.github.com/v3/ •Gistの情報を取得できるAPI $ curl https://api.github.com/gists/1341145 { "description": "クソゲーによる自己紹介(by uehaj)", "created_at": "2011-11-05T05:26:07Z", "forks": [ ], ... }2011年11月22日火曜日
  23. 23. これで勝つる •Gist APIを使ってDescriptionをDBに登録 しておけばいい。2011年11月22日火曜日
  24. 24. https://api.github.com/robots.txt User-agent: Googlebot Disallow: /tarball/ Disallow: /zipball/ ... User-agent: msnbot Disallow: /tarball/ Disallow: /zipball/ ... User-agent: * Disallow: /2011年11月22日火曜日
  25. 25. Robots Exclusion Standard ウェブサイトの所有者がボットに対して指示したい場合、そのウェブサイトの階層のルートに robots.txt というテ キストファイルを置く(例えば、www.example.com/robots.txt)。サイト側の指示に従う選択をしているボットは、 まずこのファイルにアクセスし、その指示を読み込んで、それに従ってそのウェブサイトの他のファイルの読み込 みを行う。このファイルがない場合、ボットはそのサイトの所有者が特に何も指示していないと判断する。 robots.txt はボットに対して特定のファイルやディレク トリを検索しないよう指示する。これは例えば、検索エンジンからプライバシー に関わる情報を守る場合、指定したファイルやディレクトリの内容がサイトの分類をする際に誤解を与える虞があ る場合、特定のアプリケーションのみが読み込むことを意図したデータの場合などがある。 下位ドメインがあるウェブサイトでは、各下位ドメインごとに robots.txt ファイルが必要である。example.com に robots.txt があっても、a.example.com になければ、example.com の robots.txt の内容は a.example.com には適用されな い。 http://ja.wikipedia.org/wiki/Robots_Exclusion_Standard2011年11月22日火曜日
  26. 26. Gist API + JSONP •JSONPでクライアントからゴニョゴニョ すれば合法2011年11月22日火曜日
  27. 27. // HTML <span id="desc-1197737" class="description"></span> // JavaScript $(function() { $(.description).each(function() { var span = $(this) var gistNo = span.attr(id).match(/desc-(d+)/)[1] $.getJSON( https://api.github.com/gists/+gistNo+?callback=?, function(resp) { var description = resp.data.description || <No description> if (resp.data.user) { description += (by +resp.data.user.login+) } span.text(description) } ) }) })2011年11月22日火曜日
  28. 28. 2011年11月22日火曜日
  29. 29. 感想 •CSSに時間がかかった。 •あのデザインでも自分の中では頑張った方 •困ったときのEC2 •PaaSよりIaaSの方が素直 •Grailsプラグインはチート杉2011年11月22日火曜日
  30. 30. 参考情報 •関谷さんの企画書 •http://www.slideshare.net/kazuchika/gdk48 •GDK48 •http://bit.ly/gdk48 •GDK48ソースコード •http://git.io/gdk482011年11月22日火曜日

×