SlideShare a Scribd company logo
node.jsによる
お手軽画像uploader実装

    id:hakobe932


         1
id:hakobe932
id:hakobe932
❖ 普段やってること
• エンジニア @はてな
 ‣ はてなブックマーク
 ‣ 関西最速アニメ調査
❖ 好きなプログラミング言語
•Perl/Ruby/Scala

•JavaScript ← new!!!
              3
tray
tray
❖ 画像アップローダ
•お手軽D&Dアップロード

•アップロード数の制限

•
❖
 リアルタイム
 少し遊んでみましょう!!

•http://tray.douzemille.net:8080

               5
簡単インストール

$	 brew	 install	 node
$	 brew	 install	 redis

$	 git	 clone	 https://github.com/
hakobe/tray.git
$	 cd	 tray
$	 npm	 install
$	 node	 app.js


                   6
実装
trayの実装

         Client

アップロード   画像リスト    更新通知


                         Server
   express   socket.io

          Node           Redis

                  8
API(app.js)
❖ express でディスパッチ
 1 app.get( // トップページ
 2 '/', routes.index.index);
 3 app.get( // パネル一覧
 4 '/api/panels.json', routes.api.panels);
 5 app.post( // パネル画像アップロード
 6 '/api/upload.json', routes.api.upload);


                    9
routes/api.js
//	 画像一覧
exports.panels	 =	 function(req,	 res)	 {
	 	 	 	 var	 from	 =	 req.query.from;
	 	 	 	 panelManager.retrievePanels(from,	 function(	 panels	 )	 {
	 	 	 	 	 	 	 	 res.json(200,	 panels);
	 	 	 	 });                             redisから
};
                                        画像リスト取得
//	 画像アップロード
exports.upload	 =	 function(req,	 res)	 {
	 	 	 	 var	 file	 =	 req.files;
	 	 	 	 if	 (file	 &&	 file.imageFile)	 {
	 	 	 	 	 	 	 	 //	 ...	 省略中	 ...
	 	 	 	 }                               次のスライドで説明
}



                                  10
画像の登録
                                          アップロードされた
panelManager.createId(function(id)	 {                ファイルを移動
	 	 	 	 fs.rename(	 req.files.imageFile.path,	 path,	 function(err)	 {
	 	 	 	 	 	 	 	 var	 panel	 =	 {
	 	 	 	 	 	 	 	 	 	 	 	 id	 	 	 	 	 	 	 	 :	 id,
	 	 	 	 	 	 	 	 	 	 	 	 imageName	 :	 path.basename(path),
	 	 	 	 	 	 	 	 };
	 	 	 	 	 	 	 	 panelManager.addPanel(	 panel	 );
	 	 	 	 	 	 	 	 res.redirect('/');                   panelManagerが登録
	 	 	 	 });
});


•  expressがアップロードをハンドル
  ‣ bodyParserのuploadDirを指定しとく
•   追加はPanelManagerが担当
                                11
PanelManager
•    Redisに画像の情報を追加

PanelManager.prototype.addPanel	 =	 function(panel)	 {
	 	 	 	 redisClient.zadd(
	 	 	 	 	 	 	 	 redisKey('panels'),
	 	 	 	 	 	 	 	 panel.id,              Sorted Setにデータ追加
	 	 	 	 	 	 	 	 JSON.stringify(panel),
	 	 	 	 	 	 	 	 redis.print
	 	 	 	 );
	 	 	 	 this.emit('add',	 panel);

	 	 	 	 return	 panel;   add イベントをemit
},



                          12
EventEmitter
•  オブジェクトがイベントを発行可能に

function	 PanelManager()	 {
	 	 	 	 events.EventEmitter.call(this);
}
util.inherits(PanelManager,	 events.EventEmitter);

PanelManager.prototype.addPanel	 =	 function(panel)	 {

	 	 	 	 //	 ...	 いろんなメソッドの実装	 ...




                          13
PanelManager.prototype.addPanel	 =	 function(panel)	 {
	 	 	 	 redisClient.zadd(
	 	 	 	 	 	 	 	 redisKey('panels'),
	 	 	 	 	 	 	 	 panel.id,
	 	 	 	 	 	 	 	 JSON.stringify(panel),
	 	 	 	 	 	 	 	 redis.print
	 	 	 	 );
	 	 	 	 this.emit('add',	 panel);

	 	 	 	 return	 panel;
},                       別のコンテキストで登録された
                         処理を実行
var	 panelManager	 =	 new	 PanelManager();
panelManager.on('add',	 function()	 {
	 	 	 	 //	 panelManager.emit('add')	 されたときの処理
});


                              14
socket.io (app.js)
❖ パネル追加時クライアント全体に通知

var	 io	 =	 require('socket.io').listen(server);

var	 panelManager	 =	 new	 PanelManager();
panelManager.on('add',	 function(panel)	 {
	 	 	 	 io.sockets.emit('paneladd');
})
                       クライアント全体に paneladd
                       イベントを通知

      PanelManagerとsocket.ioの
         振舞いを分離しておける
                 15
socket.io(クライアント)
❖ 通知が来たら再読み込み

var socket = io.connect(location.href);
socket.on('paneladd', function () {
   showPanels();
});




                        16
その他

•クライアントサイド
‣ Drag and Drop API
‣ FromData
‣ Zepto



              17
まとめ
❖ tray
 • お手軽画像アップローダ

 • node.jsっぽい技術つまみぐい

 • 12枚のパネルをきれいにそろえよう

   Fork me on GitHub
https://github.com/hakobe/tray
              18

More Related Content

PDF
New Generation Build System "Fly"
PDF
PDF
Webサーバ勉強会_#1_108-114:ログとか
PDF
Test::WWW::Stub
PDF
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
コマンド実行結果のログ取得について
PDF
New Generation Build System "Fly"
Webサーバ勉強会_#1_108-114:ログとか
Test::WWW::Stub
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
コマンド実行結果のログ取得について

What's hot (20)

PDF
Slub data structure
PDF
Siv3Dで楽しむゲームとメディアアート開発
ODP
0x300
PDF
CHP survey
PDF
AVAの話 #mentaicojs
PPTX
Functions
PDF
Local php-100828 2
PDF
VarnishではじめるESI
PDF
omoon.org の裏側 〜FuelPHP の task 活用例〜
PPTX
Javascript basic code
PDF
Spectacular Future with clojure.spec
PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
PDF
オンプレでPrivate Registry使ったDockerイメージの運用について
KEY
Development app-with-elixir
PDF
PDF
静岡のHaskellerはEmacsを使う
PDF
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
PDF
Cross Platform Make
PDF
自作saoriの紹介
PDF
Slub alloc and free
Slub data structure
Siv3Dで楽しむゲームとメディアアート開発
0x300
CHP survey
AVAの話 #mentaicojs
Functions
Local php-100828 2
VarnishではじめるESI
omoon.org の裏側 〜FuelPHP の task 活用例〜
Javascript basic code
Spectacular Future with clojure.spec
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
オンプレでPrivate Registry使ったDockerイメージの運用について
Development app-with-elixir
静岡のHaskellerはEmacsを使う
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
Cross Platform Make
自作saoriの紹介
Slub alloc and free
Ad

Similar to node.jsによる お手軽画像uploader実装 (20)

PDF
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
PDF
関西FirefoxOS勉強会6thGiG「アプリ間通信」
PPTX
HTML5&API総まくり
PPTX
Develop Web Application with Node.js + Express
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
KEY
JavaScript on GitHub (#kyotojs)
PDF
PDF
Node.jsでブラウザメッセンジャー
PDF
Node.jsアプリの開発をモダン化するために取り組んできたこと
PPTX
オタク×Node.js勉強会
PPTX
React+redux+saga 03
PDF
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
PDF
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
PDF
20130412 titanium meetupvol7
PDF
Backbone.js入門
PDF
Componentization for Reality
PDF
Sencha Touch working with AWS
PDF
SocketStream入門
PDF
実践 NestJS
PDF
RESTful Web アプリの設計レビューの話
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
関西FirefoxOS勉強会6thGiG「アプリ間通信」
HTML5&API総まくり
Develop Web Application with Node.js + Express
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
JavaScript on GitHub (#kyotojs)
Node.jsでブラウザメッセンジャー
Node.jsアプリの開発をモダン化するために取り組んできたこと
オタク×Node.js勉強会
React+redux+saga 03
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
20130412 titanium meetupvol7
Backbone.js入門
Componentization for Reality
Sencha Touch working with AWS
SocketStream入門
実践 NestJS
RESTful Web アプリの設計レビューの話
Ad

More from Yohei Fushii (6)

PDF
ホームディレクトリに埋もれた便利なコードをさがせ!
PDF
Enhance Anime Watching with Programming
PDF
Unite with script
PDF
ページャ実装マニアックス
PDF
Perlで学ぶコルーチン
PDF
初めてのMoose
ホームディレクトリに埋もれた便利なコードをさがせ!
Enhance Anime Watching with Programming
Unite with script
ページャ実装マニアックス
Perlで学ぶコルーチン
初めてのMoose

node.jsによる お手軽画像uploader実装