gdk48総選挙の裏側

30
GDK48総選挙の裏側 20111122日火曜日

Upload: kiyotaka-oku

Post on 15-Jan-2015

1.705 views

Category:

Technology


13 download

DESCRIPTION

 

TRANSCRIPT

Page 1: GDK48総選挙の裏側

GDK48総選挙の裏側

2011年11月22日火曜日

Page 2: GDK48総選挙の裏側

自己紹介

•運営レンジャー イエロー

2011年11月22日火曜日

Page 3: GDK48総選挙の裏側

運営レンジャー

2011年11月22日火曜日

Page 4: GDK48総選挙の裏側

GDK48総選挙アプリ

2011年11月22日火曜日

Page 5: GDK48総選挙の裏側

仕様

•#gdk48かつGistのURLがあるTweetを集める

•集めたGistを一覧する

•Twitter認証したユーザがGistに投票できる

2011年11月22日火曜日

Page 6: GDK48総選挙の裏側

Tweetを集める

2011年11月22日火曜日

Page 7: GDK48総選挙の裏側

一覧する

2011年11月22日火曜日

Page 8: GDK48総選挙の裏側

投票する

Twitterアカウントでログイン

ログインすると投票できる

2011年11月22日火曜日

Page 9: GDK48総選挙の裏側

アーキテクチャ

•Grails 1.3.7•Amazon EC2

2011年11月22日火曜日

Page 10: GDK48総選挙の裏側

使ったプラグイン

$ grails list-plugins -installed

Plug-ins you currently have installed are listed below:-------------------------------------------------------------

blueprint 1.0.2 -- Blueprint CSS frameworkhibernate 1.3.7 -- Hibernate for Grailsjquery 1.6.1.1 -- JQuery for Grailsquartz 0.4.2 -- This plugin adds Quartz job schedulingresources 1.1.1 -- Resourcesspring-security-core 1.2.4 -- Spring Security Core Pluginspring-security-twitter 0.3.4 -- Twitter authentication for Springtomcat 1.3.7 -- Apache Tomcat plugin for Grails

2011年11月22日火曜日

Page 11: GDK48総選挙の裏側

ボリューム$ 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日火曜日

Page 12: GDK48総選挙の裏側

ツイートを取ってくる

•Quartzプラグインを使って1分おきにTwitter検索 (q=#gdk48)

•検索結果のツイートにGistのURLが含まれるか?

•短縮URLの問題

2011年11月22日火曜日

Page 13: GDK48総選挙の裏側

短縮URLを展開

•java.net.URL使ってヘッダだけ取得

•Locationヘッダの値を見る

•GistへのURLか? さらに短縮URLか?

2011年11月22日火曜日

Page 14: GDK48総選挙の裏側

/** * 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日火曜日

Page 15: GDK48総選挙の裏側

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日火曜日

Page 16: GDK48総選挙の裏側

Gist連携

•Gistコード表示

•Description表示

2011年11月22日火曜日

Page 17: GDK48総選挙の裏側

Gistコード表示

2011年11月22日火曜日

Page 18: GDK48総選挙の裏側

Gistコード表示

2011年11月22日火曜日

Page 19: GDK48総選挙の裏側

scriptタグだけ

<script src="https://gist.github.com/1197737.js"></script>

2011年11月22日火曜日

Page 20: GDK48総選挙の裏側

Description表示

scriptタグ埋め込みでは表示されない!

2011年11月22日火曜日

Page 21: GDK48総選挙の裏側

Description表示

scriptタグ埋め込みでは表示されない!

2011年11月22日火曜日

Page 22: GDK48総選挙の裏側

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日火曜日

Page 23: GDK48総選挙の裏側

これで勝つる

•Gist APIを使ってDescriptionをDBに登録しておけばいい。

2011年11月22日火曜日

Page 24: GDK48総選挙の裏側

https://api.github.com/robots.txt

User-agent: GooglebotDisallow: /tarball/Disallow: /zipball/...User-agent: msnbotDisallow: /tarball/Disallow: /zipball/...User-agent: *Disallow: /

2011年11月22日火曜日

Page 25: GDK48総選挙の裏側

ウェブサイトの所有者がボットに対して指示したい場合、そのウェブサイトの階層のルートに 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 には適用されない。

Robots Exclusion Standard

http://ja.wikipedia.org/wiki/Robots_Exclusion_Standard

2011年11月22日火曜日

Page 26: GDK48総選挙の裏側

Gist API + JSONP

•JSONPでクライアントからゴニョゴニョすれば合法

2011年11月22日火曜日

Page 27: GDK48総選挙の裏側

// 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日火曜日

Page 28: GDK48総選挙の裏側

2011年11月22日火曜日

Page 29: GDK48総選挙の裏側

感想

•CSSに時間がかかった。

•あのデザインでも自分の中では頑張った方

•困ったときのEC2

•PaaSよりIaaSの方が素直

•Grailsプラグインはチート杉

2011年11月22日火曜日

Page 30: GDK48総選挙の裏側

参考情報•関谷さんの企画書

•http://www.slideshare.net/kazuchika/gdk48•GDK48•http://bit.ly/gdk48•GDK48ソースコード

•http://git.io/gdk482011年11月22日火曜日