以å‰ã®è¨˜äº‹ã§ç´¹ä»‹ã—ãŸsocial-cms-backendã«ã¤ã„ã¦ã§ã™ã€‚
念ã®ãŸã‚ã€ãƒªãƒ³ã‚¯ã‚’載ã›ã¦ãŠãã¾ã™ã€‚
ã•ã¦ã€social-cms-backendã¯ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«MongoDBを使ã£ã¦ã„ã¦ã€MongoDBã®APIã‚’ã»ã¼ãã®ã¾ã¾RESTã«ä¹—ã£ã‘ãŸã‚‚ã®ã«ãªã£ã¦ã„ã¾ã™ã€‚よりæ£ç¢ºã«ã¯ã€èªè¨¼ã‚„アクセス制é™ãªã©ã®æ©Ÿæ§‹ãŒå…¥ã£ã¦ã„ã¾ã™ã€‚
ã¨ã“ã‚ã§ã€MongoDBã®APIã§ã¯è¤‡æ•°ã®ã‚¯ã‚¨ãƒªã‚’一回ã®å‘¼ã³å‡ºã—ã§æŠ•ã’ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã‚ŒãŒã©ã†ã„ã†å•é¡Œã‚’引ãèµ·ã“ã—ãŸã‹ã¨ã„ã†ã¨ã€twitter-clone-sampleã§ã¯LikeボタンãŒã‚ã‚Šã¾ã™ãŒã€Likeæ•°ã®å–å¾—ã¯APIã®ä¸€å›žåˆ†ãŒã‹ã‹ã‚‹ã®ã§ã™ã€‚MongoDBã®count関数を使ã£ã¦ã„ã‚‹ã‹ã‚‰ã§ã™ã€‚
social-cms-backendã¯ãªã‚‹ã¹ãå¦ç¿’コストãŒã‹ã‹ã‚‰ãªã„よã†ã«ã€MongoDBã®APIã‚’ã„ã˜ã‚‰ãªã„ã®ãŒåŸºæœ¬æ–¹é‡ãªã®ã§ã™ãŒã€ç¾çŠ¶ã ã¨Like数を表示ã™ã‚‹åˆ†ã ã‘ã€ãƒ–ラウザã‹ã‚‰REST呼ã³å‡ºã—ãŒã‹ã‹ã‚Šã¾ã™ã€‚例ãˆã°ã€25件ã®æŠ•ç¨¿ãŒè¡¨ç¤ºã•ã‚Œãã‚Œãžã‚Œã«Like数を表示ã™ã‚‹ã¨REST呼ã³å‡ºã—ã¯26回ã«ãªã£ã¦ã—ã¾ã„ã¾ã™ã€‚ã„ãらデータ転é€é‡ãŒå°‘ãªãã¦ã‚‚ã€26回ã®XHRã¯ãªã‹ãªã‹ã®æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚
ãã“ã§ã€25件ã®ã‚¯ã‚¨ãƒªã‚’一回ã®XHRã§è¡Œãˆã‚‹ã‚ˆã†ã«æ”¹è‰¯ã—ã¾ã—ãŸã€‚APIã¯ã¨ã¦ã‚‚シンプルã§ã€MongoDBã®ã‚¯ã‚¨ãƒªã‚’é…列ã«ã—ã¦æ¸¡ã™ã ã‘ã§ã™ã€‚当然ã€åŒä¸€ã®REST endpointã«ã—ã‹ä½¿ãˆã¾ã›ã‚“。今回ã®ã‚±ãƒ¼ã‚¹ã§ã¯ã“ã‚Œã§ã‚ˆã—ã§ã™ã€‚
ã¡ãªã¿ã«ã€ã‚µãƒ¼ãƒå´ã®ã‚³ãƒ¼ãƒ‰ã§ã¯async.jsを使ã„ã¾ã—ãŸã€‚é…列ã‹ã©ã†ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦åˆ†å²ã™ã‚‹ã ã‘ãªã®ã§ã€æ•°è¡Œã®è¿½åŠ ã§ã™ã¿ã¾ã—ãŸã€‚コードã®ãƒªãƒ•ã‚¡ã‚¯ã‚¿ãƒªãƒ³ã‚°ã‚’ã—ãŸå¾Œã®ã‚«ã‚¦ãƒ³ãƒˆã§ã™ãŒã€‚
twitter-clone-sampleã®æ–¹ã®ã‚³ãƒ¼ãƒ‰ã¯ã¾ã ã„ã˜ã£ã¦ã¾ã›ã‚“。スクリーンã‚ャストã®ã‚³ãƒ¼ãƒ‰ã‹ã‚‰ã‚ã¾ã‚Šã„ã˜ã‚‰ãªã„ã»ã†ãŒã„ã„ã‹ãªã¨æ€ã„ã¾ã—ã¦ã€‚スクリーンã‚ャストをもã†ä¸€åº¦å–ã‚Šç›´ã™ã®ã¯ã¡ã‚‡ã£ã¨æ‰‹é–“ãŒã‹ã‹ã£ã¦ã—ã¾ã†ã®ã§ã€å½“é¢ä¿ç•™ã§ã™ã€‚
ä¹…ã—ã¶ã‚Šã®è¨˜äº‹ã§ã™ã€‚
social-cms-backendã®ãƒ†ã‚¹ãƒˆã‚³ãƒ¼ãƒ‰ã‚’Mochaã§æ›¸ã„ã¦ã„ã¾ã™ãŒã€Facebookã®ãƒã‚°ã‚¤ãƒ³å‘¨ã‚Šã®ãƒ†ã‚¹ãƒˆã‚’ã™ã‚‹ã®ã«ã€Facebookã®ãƒ†ã‚¹ãƒˆãƒ¦ãƒ¼ã‚¶ã‚’使ã„ã¾ã—ãŸã€‚
Facebookã®ãƒ†ã‚¹ãƒˆãƒ¦ãƒ¼ã‚¶ã«ã¤ã„ã¦ã¯ã€
http://developers.facebook.com/docs/test_users/
ã«ãƒ‰ã‚ュメントãŒã‚ã‚Šã¾ã™ã€‚
æ‰‹é †ã¯æ›¸ã„ã¦ã‚る通りã§ã€ï¼ˆï¼‘)アプリã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’å–å¾—ã€ï¼ˆï¼’)テストユーザを作æˆã€ï¼ˆï¼“)専用ãƒã‚°ã‚¤ãƒ³ï¼µï¼²ï¼¬ã‚’é–‹ã„ã¦ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã€ã ã‘ã§ã™ã€‚
requestを使ã£ã¦ã“れらã®ã‚¹ãƒ†ãƒƒãƒ—を実行ã—ã¦ã„ãŸã®ã§ã™ãŒã€ãŸã£ãŸã“ã‚Œã ã‘ã®ã“ã¨ã‚’ã‚„ã‚‹ã®ã«ä½•æ™‚é–“ã‚‚ã¯ã¾ã‚Šã¾ã—ãŸã€‚
1ã¨ï¼’ã¯ä½•ã®å•é¡Œã‚‚ãªã‹ã£ãŸã®ã§ã™ãŒã€ï¼“ãŒã†ã¾ãè¡Œã‹ãšã€Facebookã®ãƒã‚°ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¦ã—ã¾ã†ã¨ã„ã†å•é¡Œã§ã—ãŸã€‚
解決方法ã¯ã€User-Agentã‚’è¨å®šã™ã‚‹ã€ã§ã™ã€‚
ドã‚ュメントã«ã¯æ›¸ã‹ã‚Œã¦ã„ã¾ã›ã‚“。もã—åŒæ§˜ã®å•é¡Œã‚’抱ãˆã¦ã„る人ã«å‚考ã«ãªã‚Œã°ã¨æ€ã„ã¾ã™ã€‚å‚考ã«ãªã‚‹ã‹åˆ†ã‹ã‚Šã¾ã›ã‚“ãŒã€ãã®æ™‚点ã§ã®ãƒ†ã‚¹ãƒˆã‚³ãƒ¼ãƒ‰ã¯ã€
https://github.com/dai-shi/social-cms-backend/blob/c678043a2ad0ce45bc51b576d77e53c7eac658e5/test/80_facebook_login_test.js
ã§ã™ã€‚
昨日ã€
Nodeã¨Angularを使ã£ã¦Twitterクãƒãƒ¼ãƒ³ã‚’15分ã§ä½œã‚‹ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚ャスト
を書ã„ãŸã®ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリã®ç´¹ä»‹ã‚’ã—æããŸã®ã§ç´¹ä»‹ã—ã¾ã™ã€‚
ãã‚‚ãã‚‚ã®å‹•æ©Ÿã¯ã€Twitterクãƒãƒ¼ãƒ³ã‚’ç°¡å˜ã«ä½œã‚ŠãŸã„ã¨æ€ã£ãŸã“ã¨ãŒç™ºç«¯ã§ã™ã€‚
ãã“ã§ã€ãªã«ã‹ã„ã„ライブラリã¯ãªã„ã‹ã¨è‰²ã€…調ã¹ãŸã‚‰ã€Railsã‚‚ã©ãã®ãƒ•ãƒ«ã‚¹ã‚¿ãƒƒã‚¯ãƒ•ãƒ¬ãƒ¼ãƒ ワークãŒã„ãã¤ã‹è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
ä»–ã«ã‚‚ã„ã£ã±ã„ã‚ã‚‹ã®ã§ã™ãŒã€æ°—ã«ãªã£ãŸã®ãŒã“ã®ã‚ãŸã‚Šã§ã™ã€‚
ã¨ã“ã‚ãŒã€ãªã‚“ã¨è¨€ã†ã‹AngularJSを使ãŠã†ã¨ã™ã‚‹ã¨ã“れらã®ãƒ©ã‚¤ãƒ–ラリã¯ã‚ªãƒ¼ãƒãƒ¼ã‚¹ãƒšãƒƒã‚¯ãªæ„Ÿã˜ãŒã™ã‚‹ã®ã§ã™ã€‚Ruby on Railsã®ã‚ˆã†ã«ãƒ‡ãƒ•ã‚¡ã‚¯ãƒˆãŒä¸€ã¤ã‚る状態ã§ã‚ã‚Œã°ã„ã„ã§ã™ãŒã€ã‚‚ã©ããŒã„ã£ã±ã„ã‚る状態ã§ã¯ã‚³ãƒ³ãƒ™ãƒ³ã‚·ãƒ§ãƒ³ã‚‚統一感ãŒãªã•ãã†ã§ã™ã€‚
Angularã‚’å‰æã¨ã™ã‚‹ã®ã§ã‚ã‚Œã°ã€ãƒ•ãƒ¬ãƒ¼ãƒ ワークã§ã¯ãªãã‚‚ã£ã¨ã‚·ãƒ³ãƒ—ルãªãƒ©ã‚¤ãƒ–ラリãŒã‚ã‚Œã°ã„ã„ã®ã§ã¯ãªã„ã‹ã¨æ€ã„ã¾ã—ãŸã€‚ãã‚Œã§ã‚‚ã£ã¦ã€é¢å€’ãªã“ã¨ã¯ãã®ãƒ©ã‚¤ãƒ–ラリãŒå¼•ãå—ã‘ã¦ãれるよã†ãªã€‚
ãã“ã§ã€Twitterã‚„Facebookã®ã‚ˆã†ãªSNSã®ã‚µã‚¤ãƒˆã‚’作るã“ã¨ã«é™å®šã—ãŸãƒ©ã‚¤ãƒ–ラリを作りã¾ã—ãŸã€‚node.jsã§ã¯express.jsãŒã»ã¼ãƒ‡ãƒ•ã‚¡ã‚¯ãƒˆãªã®ã§expressã®middlewareã¨ã—ã¦ä½œã‚Šã¾ã—ãŸã€‚middlewareã«ã™ã‚‹ã“ã¨ã§ã€å˜ä¸€ã®ãƒ•ãƒ¬ãƒ¼ãƒ ワークã«ä¾å˜ã™ã‚‹ã“ã¨ãªãã€ä»–ã®ã‚¢ãƒ—リã«ã‚¢ãƒ‰ã‚ªãƒ³ã™ã‚‹å½¢ã§å°Žå…¥ã§ãã¾ã™ã€‚
é¢å€’ãªã€èªè¨¼ã‚„権é™ç®¡ç†ã®æ©Ÿèƒ½ã¯ãƒ©ã‚¤ãƒ–ラリãŒé¢å€’ã¿ã¦ãã‚Œã¾ã™ã€‚
ç¾çŠ¶ã§ã¯ã€Facebookèªè¨¼ã¨ã€æ¨™æº–çš„ãªæ¨©é™ç®¡ç†ï¼ˆownership based)ã®æ©Ÿèƒ½ãŒç”¨æ„ã•ã‚Œã¦ã„ã‚‹ã ã‘ã§ã™ãŒã€ãƒ—ラグインã¨ã—ã¦ä»–ã®èªè¨¼ã‚„権é™ç®¡ç†ã®æ©Ÿèƒ½ã‚’è¿½åŠ ã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚
ã¾ãŸã€é€šçŸ¥ï¼ˆãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ©ãƒ¼ãƒˆãªã©ï¼‰ã®æ©Ÿèƒ½ã‚‚ä»Šå¾Œè¿½åŠ ã—ã¦ããŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚
ã“ã®ãƒ©ã‚¤ãƒ–ラリを使ã†ã¨ã€ãƒ•ãƒãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã‚’作るã ã‘ã§ã™ãサービスã§ãã¾ã™ã€‚Railsã®ã‚ˆã†ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãŒãªã„ã®ã§ä½œã‚‰ãªã„ã¨ãªã«ã‚‚ã§ããªã„ã®ã§ã™ãŒã€Angularã«æ…£ã‚Œã¦ã„ã‚Œã°ã‚³ãƒ³ãƒ™ãƒ³ã‚·ãƒ§ãƒ³ã‚’æ„è˜ã—ã¦ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã™ã‚‹ã‚ˆã‚Šã‚‚ãšã£ã¨æ¥½ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ã¾ãšã¯ã€
ã“ã¡ã‚‰
ã‹ã‚‰ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚ャストを見ã¦ã¿ã‚‹ã¨é›°å›²æ°—ãŒåˆ†ã‹ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ã‚‚ã—ã‹ã—ãŸã‚‰ã€åˆ†ã‹ã‚‰ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ソースコードã¯ã€
https://github.com/dai-shi/social-cms-backend
ã«ã‚ã‚Šã¾ã™ã€‚
8/7追記。
最近知ã£ãŸã®ã§ã™ãŒã€http://sproute.io/ã¨ã„ã†ãƒ•ãƒ¬ãƒ¼ãƒ ワークもã‚るよã†ã§ã™ã。
ã“ã¡ã‚‰ã¯æ¯”較的SNSã«ç‰¹åŒ–ã—ãŸã‚ˆã†ãªãƒ•ãƒ¬ãƒ¼ãƒ ワークã§ã‚るよã†ã§ã™ã€‚
ã»ã¨ã‚“ã©ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãªã—ã§Twitterクãƒãƒ¼ãƒ³ãŒä½œã‚Œã‚‹ã‚ˆã†ã§ã™ã€‚
ã§ã‚‚ã€$99ã£ã¦ã€‚
ã¿ãªã•ã‚“ã€AngularJS使ã£ã¦ã¾ã™ã‹ï¼Ÿ
Angularを使ã†ã¨ã€ãŠæ‰‹è»½ã«Webアプリ(ã¨è¨€ã£ã¦ã„ã„ã®ã‹ãª)ãŒä½œã‚Œã¾ã™ã€‚
ãã®ãŠæ‰‹è»½ã•ã‚’ã•ã‚‰ã«åŠ©ã‘ã‚‹ã®ãŒã€Node.jsã¨ãã®ãƒ©ã‚¤ãƒ–ラリé”ã§ã™ã€‚(ã„ã‚„ã€Nodeã«é™ã£ãŸè©±ã§ã‚‚ãªã„ã§ã™ãŒã€‚)
ç´°ã‹ã„説明ã¯ä»–ã«ãŠä»»ã›ã—ã¾ã™ãŒã€Connect/Expressã‚„ãã®æ§˜ã€…ãªmiddlewareを使ã†ã¨æ©Ÿèƒ½ã‚’è‰²ã€…è¿½åŠ ã§ãã¾ã™ã€‚
今回ã€ãã®middlewareã®ä¸€ã¤ã¨ã—ã¦ã€SNSã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ©ã‚¤ãƒ–ラリを作りã¾ã—ãŸã€‚
ã“れを使ã†ã¨ã€ãƒ•ãƒãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã‚’作るã ã‘ã§ç°¡å˜ã«SNSã®ã‚µã‚¤ãƒˆãŒã§ãã‚ãŒã‚Šã¾ã™ã€‚
試ã—ã«ã€Twitterクãƒãƒ¼ãƒ³ã‚’作ã£ã¦ã¿ã¾ã—ãŸã€‚今回ã¯ãƒ•ã‚©ãƒãƒ¼æ©Ÿèƒ½ãªã©ãªã—ã®å˜æ©Ÿèƒ½ç‰ˆã§ã™ã€‚ã¡ãªã¿ã«ã€ãƒ•ã‚©ãƒãƒ¼ã‚„グループã®æ©Ÿèƒ½ã¯ãƒ©ã‚¤ãƒ–ラリã«ã¯å…¥ã£ã¦ã¾ã™ã€‚
Ruby on Railsã®ã¾ãã‚’ã—ã¦15分ã§ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚ャストを作りã¾ã—ãŸã€‚Nodeã‚„Angularã®çŸ¥è˜ã‚’å‰æã¨ã—ã¦ã„ã‚‹ã®ã§ã€è¦‹ã‚‹ã ã‘ãれらãŒç†è§£ã§ãるよã†ã«ãªã‚‹ã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ã©ã†ãžã”覧ãã ã•ã„。音もテãƒãƒƒãƒ—ã‚‚ãªã—ã€ãã‚Œã©ã“ã‚ã‹ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿ã‚‚ãªã—ã§ã™ã€‚シンプルã«ã€‚
スクリーンã‚ャストを別ウインドウã§é–‹ã
コーディングã—ãŸçµæžœã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã“ã¡ã‚‰ã«ç½®ã„ã¦ã‚ã‚Šã¾ã™ã€‚
https://github.com/dai-shi/twitter-clone-sample/tree/20130804_recorded
実ã¯ä¸€æ–‡å—ã ã‘打ã¡é–“é•ã„ãŒã‚ã£ã¦ã‚ã¨ã‹ã‚‰ä¿®æ£ã—ã¾ã—ãŸã€‚
ã›ã£ã‹ããªã®ã§ä½œã£ãŸTwitterクãƒãƒ¼ãƒ³ã‚’å‹•ãよã†ã«ã‚¢ãƒƒãƒ—ã—ã¾ã—ãŸã€‚
http://twitterclonesample-nodeangularapp.rhcloud.com/
ã‚‚ã—よã‚ã—ã‘ã‚Œã°è©¦ã—ã¦ã¿ã¦ãã ã•ã„。