SlideShare a Scribd company logo
1 of 21
Download to read offline
Introduction to Favmemo
 for Immature Engineers
                 2012/09/23

                  @a_bicky
自己紹介
• Takeshi Arabiki
   ‣   社会人2年目の底辺 Web エンジニア

   ‣ Twitter & はてな: @a_bicky & id:a_bicky

• 興味など
  機械学習、自然言語処理、R

• ブログ
  あらびき日記 http://d.hatena.ne.jp/a_bicky/
Favmemo のこれまで
背景
•   きっかけ(2010年9月末)
    twilog の fav 版が欲しい!存在しないなら自分で作ろう!!

•   モチベーション
    1. Web 開発に必要な知識の習得
    2. 機械学習のサービス適用(全然やれてない)
    3. 社会貢献
    4. お小遣い稼ぎ(あわよくば)
略歴
•   2010年10月31日: リリース(最初は年間100円の Domainking のレンタルサーバ)
    Twitter のお気に入りをタグで管理するサービス Favmemo をリリースしました! - あらびき日記


•   2010年11月2日: @ropross さんにより類似サービス favolog リリース
    “類似” と表現すると失礼?とりあえず存在価値が一気に低下・・・


•   2010年11月9日: MASHUP AWARDS 6 に応募
    Favmemo の機能を追加して MASHUP AWARDS 6 に応募してみた - あらびき日記


•   2011年12月28日: リニューアル(10月の時点でさくら VPS に移行)
    Favmemoリニューアルしました!! - あらびき日記


•   2012年8月末: Twitter で話題になりユーザ数が6倍程度に増加
    cf. http://favstar.fm/users/daaahlia/status/240459122556936192
    リニューアル時にデモページを設けたのが良かったかも。腐女子層が多い?
現状
•   登録ユーザ数約3,250(2012年9月22日現在)




            ※ PV には XMLHttpRequest によるリクエストも含む
         (タグの更新リクエストは含めない方が PV としては良いかも)
Favmemo の特徴
構成
•   LAMP on さくら VPS
    Linux のディストリビューションは Debian
    P は PHP(Dotdeb リポジトリのものをインストール)
    さくら VPS 移行時に nginx を使ってみようとしたけど Evernote との連携部
    分で動かない部分があったので見送り

•   規模の割には比較的 JavaScript 多め(但し発狂しそうな程汚いコード)
    ページ遷移が大嫌いなので・・・
    jQuery を使用
    UI 周りはそのうち Twitter Bootstrap とか使いたい
ページ遷移がない
 一度ログインしてしまえば基本的にページ遷移がない




↑ index.php の内容はこれだけ
1. XHR で /updatedb.php にリクエストを送り、新しいツイートをデータベースに取り込む
※ Chunked transfer encoding によってツイートの取り込み状況を表示
cf. jQueryの$.ajaxで通信途中のresponseTextを取得する - あらびき日記
2. XHR で /get_favs.php からツイートやタグ一覧の情報を取得してページの内容を書き換える
※ 1回目の SELECT 文には何秒もかかっているのでスキーマや設定などを見直す必要あり
ページ遷移がない!
更新部分のみ XHR で取得




    XHR で /get_favs.php の結果を取得し、この部分のみを更新する
    ・AutoPager 機能では下にツイート(li 要素)を追加
    ・検索やタグの選択によって表示項目が変わる場合は innerHTML を書き換える
    (jQuery history プラグインによって履歴を管理しているので「戻る」も可能)
ページ遷移がない!!
「設定」などはポップアップウィンドウを表示




ポップアップウィンドウの内容は pages.min.js で管理(通信が発生しないので高速に開ける)
※ JavaScript に HTML をガンガン記述していて気持ち悪いのでもっと良い方法を考えたい
(せめて MVC な感じに書き換えたい)
ページ遷移がない!!!
タグの編集結果などは「タグ一覧」にリアルタイムに反映




  JavaScript で数を増やしたり順番を変えたり(地味に大変)
  ところで、運営者自身タグ付けしてないのがバレバレ…


  今はタグ名を base64 エンコードなどによって ID として有効な文字に変換したものを ID
  として付与し、変更のあったタグの li 要素を ID で取得して数を書き換えている
  ※ タグ名をキー、ツイートの数を値とした連想配列に情報を保持しておいて、毎回タグ一覧を一新
  する方が楽でいいかもしれない
Evernote 連携
MASHUP AWARDS 6 に応募するためだけに導入
•     Evernote にエクスポートするためだけに Favmemo を利用しているユーザもいるらしい

•     Evernote との OAuth 認証には window.open で新しいウィンドウを表示
      ※ 以前は iframe を使っていたけど Evernote 側がクリックジャッキング対策としてヘッダに
      X-Frame-Options: SAMEORIGIN を付けるようになって使えなくなった
      認証が完了したら以下のような感じの完了ページを出すことで再度 Evernote へのエクスポートを
      試みてウィンドウを閉じる


    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        window.opener.retry();
        window.close();
    </script>
    </head>
    </html>
マルチアカウント対応
要望があったので導入(2012年7月末)

•   ログインしているアカウント情報(Twitter ID と screen_name)を cookie で管理
    別アカウントで OAuth 認証を済ませた後に cookie にアカウント情報を保存することで、
    別タブで開いている Favmemo のアカウント情報も更新される




    アカウント情報を JSON 形式で保存




•   今まで PHP で $_SESSION としていた部分を $SESSION (= $_SESSION[$user_id]) に変える
    程度の改修(リクエストの際 QueryString に screen_name を付与してアカウントを判別)
開発環境とか
開発環境とか
•   Mac の VMware Fusion にサーバとほぼ同じ構成の Debian をインストール
    /etc/hosts に 172.16.199.5	

 favmemo.local みたいに記述して favmemo.local でアクセスでき
    るようにしている。Twitter のコールバック URL も favmemo.local にしてある。


•   JavaScript のデバッグは Firebug + FirePHP
    今は Chrome のディベロッパーツールの方が秀逸な気がするので FirePHP 相当のものを探
    し中(webug は使い物にならなかった)


•   画像の作成は Inkscape
    最初は Ubuntu で作成したので Mac で開くとフォントの違いから表示が乱れる。設定を
    いじるのも面倒なので今も Ubuntu の Inkscape で編集。そろそろ Mac で編集したい。
    Ajax で使う「読み込み中」を意味する画像の作成は次のサイトがオススメ
    Preloaders.net - AJAX loading GIF and APNG spinners, bars and 3D animations generator

•   エディタは Emacs
    WebStorm とか試してみたいかも
動作確認とか
•   Mac の Safari, Firefox, Chrome, Opera で確認
    古いバージョンでは確認しない。IE は VMware Fusion にインストールしてある Windows
    の IE9 で IE7 と IE8 も確認(開発者ツールのドキュメントモードを使用)。IE6 はもう確
    認していないから悲惨なことになっていそう。


•   テストは全然できてない!
    ユニットテストという言葉すら知らない時に開発したので PHP 側のテストはほとんどな
    い(一部 PHPUnit を使用)。
    JavaScript のユニットテストは皆無(Jasmine とか使おうかと…)。
    リニューアル時に結合テストのため Selenium (WebDriver) を使おうとしたけど、エミュ
    レートできない動作があって断念(調査不足?)
Favmemo のこれから
主なTODO
•   フレームワークの使用
    FulePHP か Ruby on Rails を使いたい(メンテナンス性の向上と後学のため)
    同時にデプロイ方法の変更とかテストの導入とか。これが終わったらβ版に昇格?


•   自動ログイン機能の実装

•   モバイル対応
    ブラウザに対応させるか、Titanium を使ってアプリをリリース


•   検索ボックスのクエリ補完・推薦
    Trie の実装とか。自然言語処理の勉強として


•   広告の最適化
    amazon の広告を自然言語処理・機械学習的な要素を取り入れて CTR 向上したらおもし
    ろそう(お金   けが目的じゃないので自前でアルゴリズムを考えたい)
まとめ
まとめになってないけど…

•   Favmemo は自己満的サービスだけど最近ユーザが増えた

•   ページ遷移は嫌い

•   フレームワークを使って大幅にリファクタリングしたい

•   そのうち機械学習のサービス適用とかしてみたい

•   まだいろいろやりたいことはあるのでゆるゆると続けていきたい

More Related Content

What's hot

「Webサービスのつくり方」 のつくり方
「Webサービスのつくり方」 のつくり方「Webサービスのつくり方」 のつくり方
「Webサービスのつくり方」 のつくり方Yusuke Wada
 
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」タカシ キタジマ
 
第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介foom_in
 
WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)Kazue Igarashi
 
VCCW + Wordmove でデプロイが劇的に簡単になった話
VCCW + Wordmove でデプロイが劇的に簡単になった話VCCW + Wordmove でデプロイが劇的に簡単になった話
VCCW + Wordmove でデプロイが劇的に簡単になった話タカシ キタジマ
 
Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Yusuke Wada
 
Vagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようVagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようTakuma Morikawa
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜Yuji Nojima
 
初心者でもすぐできる Wordpress バックアップのススメ
初心者でもすぐできる Wordpress バックアップのススメ初心者でもすぐできる Wordpress バックアップのススメ
初心者でもすぐできる Wordpress バックアップのススメSeiichiro Mishiba
 
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0ノンプログラマーのためのWordPressプラグイン開発超入門v1.0
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0Yuki Okamoto
 
WordPressでウェブサービスを作ろう! #wbNagoya
WordPressでウェブサービスを作ろう! #wbNagoyaWordPressでウェブサービスを作ろう! #wbNagoya
WordPressでウェブサービスを作ろう! #wbNagoyaShinichi Nishikawa
 
WordPressってブログじゃないの?
WordPressってブログじゃないの?WordPressってブログじゃないの?
WordPressってブログじゃないの?tokumotonahoko
 
レスポンシブ・イメージのWordPressへの実装と4.4
レスポンシブ・イメージのWordPressへの実装と4.4レスポンシブ・イメージのWordPressへの実装と4.4
レスポンシブ・イメージのWordPressへの実装と4.4Toru Miki
 
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でー
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でーWP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でー
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でータカシ キタジマ
 
今から始めよう!WordPressで作る女子ウケ★スマホサイト
今から始めよう!WordPressで作る女子ウケ★スマホサイト今から始めよう!WordPressで作る女子ウケ★スマホサイト
今から始めよう!WordPressで作る女子ウケ★スマホサイトrie05
 
Word camposaka imaigo_slideshare
Word camposaka imaigo_slideshareWord camposaka imaigo_slideshare
Word camposaka imaigo_slideshareGo Imai
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームsairoutine
 
WordBench京都版 _sハンズオン
WordBench京都版 _sハンズオンWordBench京都版 _sハンズオン
WordBench京都版 _sハンズオンHidetaka Okamoto
 

What's hot (20)

「Webサービスのつくり方」 のつくり方
「Webサービスのつくり方」 のつくり方「Webサービスのつくり方」 のつくり方
「Webサービスのつくり方」 のつくり方
 
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
Word bench長崎01「オリジナルテーマで学ぶwordpressの基本」
 
第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介
 
Cpi mega mix
Cpi mega mixCpi mega mix
Cpi mega mix
 
WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)
 
VCCW + Wordmove でデプロイが劇的に簡単になった話
VCCW + Wordmove でデプロイが劇的に簡単になった話VCCW + Wordmove でデプロイが劇的に簡単になった話
VCCW + Wordmove でデプロイが劇的に簡単になった話
 
Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門Mojoliciousでつくる! Webアプリ入門
Mojoliciousでつくる! Webアプリ入門
 
Vagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみようVagrantと網元で開発環境を作ってみよう
Vagrantと網元で開発環境を作ってみよう
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
 
初心者でもすぐできる Wordpress バックアップのススメ
初心者でもすぐできる Wordpress バックアップのススメ初心者でもすぐできる Wordpress バックアップのススメ
初心者でもすぐできる Wordpress バックアップのススメ
 
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0ノンプログラマーのためのWordPressプラグイン開発超入門v1.0
ノンプログラマーのためのWordPressプラグイン開発超入門v1.0
 
WordPressでウェブサービスを作ろう! #wbNagoya
WordPressでウェブサービスを作ろう! #wbNagoyaWordPressでウェブサービスを作ろう! #wbNagoya
WordPressでウェブサービスを作ろう! #wbNagoya
 
WordPressってブログじゃないの?
WordPressってブログじゃないの?WordPressってブログじゃないの?
WordPressってブログじゃないの?
 
レスポンシブ・イメージのWordPressへの実装と4.4
レスポンシブ・イメージのWordPressへの実装と4.4レスポンシブ・イメージのWordPressへの実装と4.4
レスポンシブ・イメージのWordPressへの実装と4.4
 
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でー
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でーWP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でー
WP-CLIとWordPress公式ディレクトリを活用した爆速サイト構築術 ーインストールからデザイン、ページ作成までを10分でー
 
今から始めよう!WordPressで作る女子ウケ★スマホサイト
今から始めよう!WordPressで作る女子ウケ★スマホサイト今から始めよう!WordPressで作る女子ウケ★スマホサイト
今から始めよう!WordPressで作る女子ウケ★スマホサイト
 
Webteko 20090925
Webteko 20090925Webteko 20090925
Webteko 20090925
 
Word camposaka imaigo_slideshare
Word camposaka imaigo_slideshareWord camposaka imaigo_slideshare
Word camposaka imaigo_slideshare
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
 
WordBench京都版 _sハンズオン
WordBench京都版 _sハンズオンWordBench京都版 _sハンズオン
WordBench京都版 _sハンズオン
 

Similar to Introduction to Favmemo for Immature Engineers

あにみた!(PHPカンファレンス用資料)
あにみた!(PHPカンファレンス用資料)あにみた!(PHPカンファレンス用資料)
あにみた!(PHPカンファレンス用資料)Hiroyuki Ishiyama
 
Practical migration from JSP to Thymeleaf
Practical migration from JSP to Thymeleaf Practical migration from JSP to Thymeleaf
Practical migration from JSP to Thymeleaf Toshiki Iga
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1Nishida Kansuke
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminarManabu Shimobe
 
20090704rubyist九州
20090704rubyist九州20090704rubyist九州
20090704rubyist九州koki_h
 
自分用プラグインのススメ
自分用プラグインのススメ自分用プラグインのススメ
自分用プラグインのススメHidetaka Okamoto
 
リモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみたリモートデバッグツール Weinerをつかってみた
リモートデバッグツール WeinerをつかってみたMasakazu Muraoka
 
2014.07.09 WordBench Tokyo LT
2014.07.09 WordBench Tokyo LT2014.07.09 WordBench Tokyo LT
2014.07.09 WordBench Tokyo LTYutaro Miyazaki
 
続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5jToshiaki Maki
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflowYasuhiro Onishi
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはChrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはYosuke HASEGAWA
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
NodeにしましょうYuzo Hebishima
 
Prejob wordpress v2_1121
Prejob wordpress v2_1121Prejob wordpress v2_1121
Prejob wordpress v2_1121Shohei Aoyama
 
Prejob wordpress v2_1121
Prejob wordpress v2_1121Prejob wordpress v2_1121
Prejob wordpress v2_1121Shohei Aoyama
 
Browser oh browser browser
Browser oh browser browserBrowser oh browser browser
Browser oh browser browserTeppei Sato
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 schoowebcampus
 
Firefox mobile for android internals
Firefox mobile for android internalsFirefox mobile for android internals
Firefox mobile for android internalsMakoto Kato
 

Similar to Introduction to Favmemo for Immature Engineers (20)

あにみた!(PHPカンファレンス用資料)
あにみた!(PHPカンファレンス用資料)あにみた!(PHPカンファレンス用資料)
あにみた!(PHPカンファレンス用資料)
 
Practical migration from JSP to Thymeleaf
Practical migration from JSP to Thymeleaf Practical migration from JSP to Thymeleaf
Practical migration from JSP to Thymeleaf
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
 
20090704rubyist九州
20090704rubyist九州20090704rubyist九州
20090704rubyist九州
 
自分用プラグインのススメ
自分用プラグインのススメ自分用プラグインのススメ
自分用プラグインのススメ
 
リモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみたリモートデバッグツール Weinerをつかってみた
リモートデバッグツール Weinerをつかってみた
 
2014.07.09 WordBench Tokyo LT
2014.07.09 WordBench Tokyo LT2014.07.09 WordBench Tokyo LT
2014.07.09 WordBench Tokyo LT
 
続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるにはChrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるには
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
Electron early 2019
Electron early 2019Electron early 2019
Electron early 2019
 
20090828 Webconlocal
20090828 Webconlocal20090828 Webconlocal
20090828 Webconlocal
 
Prejob wordpress v2_1121
Prejob wordpress v2_1121Prejob wordpress v2_1121
Prejob wordpress v2_1121
 
Prejob wordpress v2_1121
Prejob wordpress v2_1121Prejob wordpress v2_1121
Prejob wordpress v2_1121
 
Browser oh browser browser
Browser oh browser browserBrowser oh browser browser
Browser oh browser browser
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発
 
Firefox mobile for android internals
Firefox mobile for android internalsFirefox mobile for android internals
Firefox mobile for android internals
 

More from Takeshi Arabiki

クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜Takeshi Arabiki
 
Introduction to Japanese Morphological Analysis
Introduction to Japanese Morphological AnalysisIntroduction to Japanese Morphological Analysis
Introduction to Japanese Morphological AnalysisTakeshi Arabiki
 
R による文書分類入門
R による文書分類入門R による文書分類入門
R による文書分類入門Takeshi Arabiki
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
HTML5 Canvas で学ぶアフィン変換
HTML5 Canvas で学ぶアフィン変換HTML5 Canvas で学ぶアフィン変換
HTML5 Canvas で学ぶアフィン変換Takeshi Arabiki
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境とTakeshi Arabiki
 
twitteRで快適Rライフ!
twitteRで快適Rライフ!twitteRで快適Rライフ!
twitteRで快適Rライフ!Takeshi Arabiki
 
RではじめるTwitter解析
RではじめるTwitter解析RではじめるTwitter解析
RではじめるTwitter解析Takeshi Arabiki
 
R版Getopt::Longを作ってみた
R版Getopt::Longを作ってみたR版Getopt::Longを作ってみた
R版Getopt::Longを作ってみたTakeshi Arabiki
 
Rデータフレーム自由自在
Rデータフレーム自由自在Rデータフレーム自由自在
Rデータフレーム自由自在Takeshi Arabiki
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜Takeshi Arabiki
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
RデバッグあれこれTakeshi Arabiki
 
はじめてのまっぷりでゅ〜す
はじめてのまっぷりでゅ〜すはじめてのまっぷりでゅ〜す
はじめてのまっぷりでゅ〜すTakeshi Arabiki
 
TwitterのデータをRであれこれ
TwitterのデータをRであれこれTwitterのデータをRであれこれ
TwitterのデータをRであれこれTakeshi Arabiki
 
Twitterのデータを取得する準備
Twitterのデータを取得する準備Twitterのデータを取得する準備
Twitterのデータを取得する準備Takeshi Arabiki
 

More from Takeshi Arabiki (17)

開発の心得
開発の心得開発の心得
開発の心得
 
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
クックパッド特売情報 における自然言語処理 〜固有表現抽出を利用した検索システム〜
 
Introduction to Japanese Morphological Analysis
Introduction to Japanese Morphological AnalysisIntroduction to Japanese Morphological Analysis
Introduction to Japanese Morphological Analysis
 
R による文書分類入門
R による文書分類入門R による文書分類入門
R による文書分類入門
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
HTML5 Canvas で学ぶアフィン変換
HTML5 Canvas で学ぶアフィン変換HTML5 Canvas で学ぶアフィン変換
HTML5 Canvas で学ぶアフィン変換
 
Rのスコープとフレームと環境と
Rのスコープとフレームと環境とRのスコープとフレームと環境と
Rのスコープとフレームと環境と
 
twitteRで快適Rライフ!
twitteRで快適Rライフ!twitteRで快適Rライフ!
twitteRで快適Rライフ!
 
RではじめるTwitter解析
RではじめるTwitter解析RではじめるTwitter解析
RではじめるTwitter解析
 
R版Getopt::Longを作ってみた
R版Getopt::Longを作ってみたR版Getopt::Longを作ってみた
R版Getopt::Longを作ってみた
 
Rデータフレーム自由自在
Rデータフレーム自由自在Rデータフレーム自由自在
Rデータフレーム自由自在
 
HMM, MEMM, CRF メモ
HMM, MEMM, CRF メモHMM, MEMM, CRF メモ
HMM, MEMM, CRF メモ
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
 
Rデバッグあれこれ
RデバッグあれこれRデバッグあれこれ
Rデバッグあれこれ
 
はじめてのまっぷりでゅ〜す
はじめてのまっぷりでゅ〜すはじめてのまっぷりでゅ〜す
はじめてのまっぷりでゅ〜す
 
TwitterのデータをRであれこれ
TwitterのデータをRであれこれTwitterのデータをRであれこれ
TwitterのデータをRであれこれ
 
Twitterのデータを取得する準備
Twitterのデータを取得する準備Twitterのデータを取得する準備
Twitterのデータを取得する準備
 

Introduction to Favmemo for Immature Engineers

  • 1. Introduction to Favmemo for Immature Engineers 2012/09/23 @a_bicky
  • 2. 自己紹介 • Takeshi Arabiki ‣ 社会人2年目の底辺 Web エンジニア ‣ Twitter & はてな: @a_bicky & id:a_bicky • 興味など 機械学習、自然言語処理、R • ブログ あらびき日記 http://d.hatena.ne.jp/a_bicky/
  • 4. 背景 • きっかけ(2010年9月末) twilog の fav 版が欲しい!存在しないなら自分で作ろう!! • モチベーション 1. Web 開発に必要な知識の習得 2. 機械学習のサービス適用(全然やれてない) 3. 社会貢献 4. お小遣い稼ぎ(あわよくば)
  • 5. 略歴 • 2010年10月31日: リリース(最初は年間100円の Domainking のレンタルサーバ) Twitter のお気に入りをタグで管理するサービス Favmemo をリリースしました! - あらびき日記 • 2010年11月2日: @ropross さんにより類似サービス favolog リリース “類似” と表現すると失礼?とりあえず存在価値が一気に低下・・・ • 2010年11月9日: MASHUP AWARDS 6 に応募 Favmemo の機能を追加して MASHUP AWARDS 6 に応募してみた - あらびき日記 • 2011年12月28日: リニューアル(10月の時点でさくら VPS に移行) Favmemoリニューアルしました!! - あらびき日記 • 2012年8月末: Twitter で話題になりユーザ数が6倍程度に増加 cf. http://favstar.fm/users/daaahlia/status/240459122556936192 リニューアル時にデモページを設けたのが良かったかも。腐女子層が多い?
  • 6. 現状 • 登録ユーザ数約3,250(2012年9月22日現在) ※ PV には XMLHttpRequest によるリクエストも含む (タグの更新リクエストは含めない方が PV としては良いかも)
  • 8. 構成 • LAMP on さくら VPS Linux のディストリビューションは Debian P は PHP(Dotdeb リポジトリのものをインストール) さくら VPS 移行時に nginx を使ってみようとしたけど Evernote との連携部 分で動かない部分があったので見送り • 規模の割には比較的 JavaScript 多め(但し発狂しそうな程汚いコード) ページ遷移が大嫌いなので・・・ jQuery を使用 UI 周りはそのうち Twitter Bootstrap とか使いたい
  • 9. ページ遷移がない 一度ログインしてしまえば基本的にページ遷移がない ↑ index.php の内容はこれだけ 1. XHR で /updatedb.php にリクエストを送り、新しいツイートをデータベースに取り込む ※ Chunked transfer encoding によってツイートの取り込み状況を表示 cf. jQueryの$.ajaxで通信途中のresponseTextを取得する - あらびき日記 2. XHR で /get_favs.php からツイートやタグ一覧の情報を取得してページの内容を書き換える ※ 1回目の SELECT 文には何秒もかかっているのでスキーマや設定などを見直す必要あり
  • 10. ページ遷移がない! 更新部分のみ XHR で取得 XHR で /get_favs.php の結果を取得し、この部分のみを更新する ・AutoPager 機能では下にツイート(li 要素)を追加 ・検索やタグの選択によって表示項目が変わる場合は innerHTML を書き換える (jQuery history プラグインによって履歴を管理しているので「戻る」も可能)
  • 11. ページ遷移がない!! 「設定」などはポップアップウィンドウを表示 ポップアップウィンドウの内容は pages.min.js で管理(通信が発生しないので高速に開ける) ※ JavaScript に HTML をガンガン記述していて気持ち悪いのでもっと良い方法を考えたい (せめて MVC な感じに書き換えたい)
  • 12. ページ遷移がない!!! タグの編集結果などは「タグ一覧」にリアルタイムに反映 JavaScript で数を増やしたり順番を変えたり(地味に大変) ところで、運営者自身タグ付けしてないのがバレバレ… 今はタグ名を base64 エンコードなどによって ID として有効な文字に変換したものを ID として付与し、変更のあったタグの li 要素を ID で取得して数を書き換えている ※ タグ名をキー、ツイートの数を値とした連想配列に情報を保持しておいて、毎回タグ一覧を一新 する方が楽でいいかもしれない
  • 13. Evernote 連携 MASHUP AWARDS 6 に応募するためだけに導入 • Evernote にエクスポートするためだけに Favmemo を利用しているユーザもいるらしい • Evernote との OAuth 認証には window.open で新しいウィンドウを表示 ※ 以前は iframe を使っていたけど Evernote 側がクリックジャッキング対策としてヘッダに X-Frame-Options: SAMEORIGIN を付けるようになって使えなくなった 認証が完了したら以下のような感じの完了ページを出すことで再度 Evernote へのエクスポートを 試みてウィンドウを閉じる <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript"> window.opener.retry(); window.close(); </script> </head> </html>
  • 14. マルチアカウント対応 要望があったので導入(2012年7月末) • ログインしているアカウント情報(Twitter ID と screen_name)を cookie で管理 別アカウントで OAuth 認証を済ませた後に cookie にアカウント情報を保存することで、 別タブで開いている Favmemo のアカウント情報も更新される アカウント情報を JSON 形式で保存 • 今まで PHP で $_SESSION としていた部分を $SESSION (= $_SESSION[$user_id]) に変える 程度の改修(リクエストの際 QueryString に screen_name を付与してアカウントを判別)
  • 16. 開発環境とか • Mac の VMware Fusion にサーバとほぼ同じ構成の Debian をインストール /etc/hosts に 172.16.199.5 favmemo.local みたいに記述して favmemo.local でアクセスでき るようにしている。Twitter のコールバック URL も favmemo.local にしてある。 • JavaScript のデバッグは Firebug + FirePHP 今は Chrome のディベロッパーツールの方が秀逸な気がするので FirePHP 相当のものを探 し中(webug は使い物にならなかった) • 画像の作成は Inkscape 最初は Ubuntu で作成したので Mac で開くとフォントの違いから表示が乱れる。設定を いじるのも面倒なので今も Ubuntu の Inkscape で編集。そろそろ Mac で編集したい。 Ajax で使う「読み込み中」を意味する画像の作成は次のサイトがオススメ Preloaders.net - AJAX loading GIF and APNG spinners, bars and 3D animations generator • エディタは Emacs WebStorm とか試してみたいかも
  • 17. 動作確認とか • Mac の Safari, Firefox, Chrome, Opera で確認 古いバージョンでは確認しない。IE は VMware Fusion にインストールしてある Windows の IE9 で IE7 と IE8 も確認(開発者ツールのドキュメントモードを使用)。IE6 はもう確 認していないから悲惨なことになっていそう。 • テストは全然できてない! ユニットテストという言葉すら知らない時に開発したので PHP 側のテストはほとんどな い(一部 PHPUnit を使用)。 JavaScript のユニットテストは皆無(Jasmine とか使おうかと…)。 リニューアル時に結合テストのため Selenium (WebDriver) を使おうとしたけど、エミュ レートできない動作があって断念(調査不足?)
  • 19. 主なTODO • フレームワークの使用 FulePHP か Ruby on Rails を使いたい(メンテナンス性の向上と後学のため) 同時にデプロイ方法の変更とかテストの導入とか。これが終わったらβ版に昇格? • 自動ログイン機能の実装 • モバイル対応 ブラウザに対応させるか、Titanium を使ってアプリをリリース • 検索ボックスのクエリ補完・推薦 Trie の実装とか。自然言語処理の勉強として • 広告の最適化 amazon の広告を自然言語処理・機械学習的な要素を取り入れて CTR 向上したらおもし ろそう(お金 けが目的じゃないので自前でアルゴリズムを考えたい)
  • 21. まとめになってないけど… • Favmemo は自己満的サービスだけど最近ユーザが増えた • ページ遷移は嫌い • フレームワークを使って大幅にリファクタリングしたい • そのうち機械学習のサービス適用とかしてみたい • まだいろいろやりたいことはあるのでゆるゆると続けていきたい