Your SlideShare is downloading. ×
Nodefest2013 my npm modules
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Nodefest2013 my npm modules

5,924

Published on

https://github.com/mash/node-imagemagick-native …

https://github.com/mash/node-imagemagick-native
ImageMagick's Magick++ bindings for NodeJS

https://github.com/mash/node-angel
angel.js is a simple library to gracefully restart multi process net.Servers on node >= 0.6

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
5,924
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 実践で使える拙作npmモジュール twitter.com/maaash github.com/mash
  • 2. 無職 なのに実践って??
  • 3. 1. imagemagick-native https://github.com/mash/node-imagemagick-native Imagemagick's Magick++ binding for Node. % brew install imagemagick % npm install imagemagick-native
  • 4. 1. imagemagick-native サムネイルの動的生成 いろいろなサイズの画像へのリクエストがある、 UI改善するために異なるサイズを試したい × 画像アップロード直後にサムネイルを生成 ○ サムネイルへのリクエストが来てから画像を生成
  • 5. 1. imagemagick-native サムネイルの動的生成 1. HTTPリクエストを受ける 2. 画像ストレージ(S3など)から元画像を取得 3. サムネイルを生成 4. 保存(memcachedなど) 5. レスポンスを返す
  • 6. 1. imagemagick-native サムネイルの動的生成 1. HTTPリクエストを受ける 2. 画像ストレージ(S3など)から元画像を取得 (IO) 3. サムネイルを生成 (CPU) 4. 保存(memcachedなど) (IO) 5. レスポンスを返す IOで詰まったら同期IOなworkerは詰まっちゃうんじゃ? → node.jsでやったらどうか
  • 7. 1. imagemagick-native % npm install imagemagick 実体は require(“child_process”).spawn(“convert”, args); % npm install imagemagick-native ImageMagickのC++ Bindingを使う imagemagick: 8.07ms per iteration imagemagick-native: 0.87ms per iteration
  • 8. app.get( "/*", function (req, res) { async.waterfall([ function (options, callback) { var requestOptions = parse( req.url ); // download from s3 request.get( requestOptions, function(err,res,body) { callback( null, body, resizeOptions ); }); }, function (body, resizeOptions, callback) { var buf; try { buf = imagemagick.convert( resizeOptions ); } catch (e) { // handle error }; callback( null, buf ); }, function (buf) { // store cache.set(key, buf); }, function (buf) { // respond res.end(buf); callback( null ); } ], errorHandler ); });
  • 9. 1. imagemagick-native API群 * convert * identify * quantizeColors * composite サイズ、形式の変換 サイズや形式を識別 量子化 合成
  • 10. 1. imagemagick-native API群 * convert * identify * quantizeColors * composite 自分がつくったのはこれだけ pullreq pullreq pullreq
  • 11. 1. imagemagick-native うれしい
  • 12. 2. angel https://github.com/mash/node-angel gracefully restart multi process net.Servers % npm install angel
  • 13. 2. angel 昨日 npm publish しました
  • 14. 2. angel じわじわ系メモリリーク 数10MB/月
  • 15. 2. angel おれのせいじゃないよ〜>< って言いたい
  • 16. 2. angel 定期的にcronで殺したりして(しないか)
  • 17. 2. angel max_requests_per_child 一定のリクエスト数をこなした workerはいったん殺してforkしなおす これができるのが見当たらなかったので 作ってみたのが angel
  • 18. 2. angel net.Serverのインスタンスとportを渡すと CPU数分、プロセス起動してlistenしてくれる * workerが突然死したら生き返らせてくれる * HUPシグナルをmasterに送るとworkerを生き返らせ てくれる * その時モジュールを読み込みなおせる =無停止デプロイ
  • 19. CC BY-NC pedra_uding http://www.flickr.com/photos/petra_uding/6166961931/
  • 20. 2. angel 名前がかっこいいですね
  • 21. 2. angel var angel = require("angel"); var server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!"); }); angel( app, { port: refresh_modules_regexp: max_requests_per_child: workers: }); 3000, "(config|lib)/", 10000, 4
  • 22. 2. angel % angel --port 3000 --workers 4 --max-requests-per-child 10000 --refresh-modules-regexp “lib/” app.js % cat app.js var server = require("http").createServer( function(req, res) { res.writeHead(200); res.end("Hello, World!"); }); module.exports = server;
  • 23. 2. angel % node eg/server.js master[70402] created pid_file: angel.pid master[70402] master will fork 4 workers master[70402] forked worker[70403] master[70402] forked worker[70404] master[70402] forked worker[70405] master[70402] forked worker[70406] worker[70404] launched worker[70404] listening on 3000 worker[70406] launched worker[70406] listening on 3000 worker[70403] launched worker[70405] launched worker[70403] listening on 3000 worker[70405] listening on 3000
  • 24. 2. angel % pstree -p 70402 | | -+= 55828 mash /bin/zsh | | -+= 70402 mash node eg/server.js | | |--- 70403 mash snip/proj/node-angel/eg/server.js | | |--- 70404 mash snip/proj/node-angel/eg/server.js | | |--- 70405 mash snip/proj/node-angel/eg/server.js | | --- 70406 mash snip/proj/node-angel/eg/server.js
  • 25. 2. angel master[70402] master[70402] master[70402] master[70402] master[70402] master[70402] worker[70560] worker[70560] worker[70561] worker[70561] worker[70559] worker[70559] worker[70562] worker[70562] worker[70403] master[70402] worker[70404] worker[70405] master[70402] master[70402] worker[70406] master[70402] SIGHUP reloaded snip/proj/node-angel/eg/app.js forked worker[70559] forked worker[70560] forked worker[70561] forked worker[70562] launched listening on 3000 launched listening on 3000 launched listening on 3000 launched listening on 3000 closes worker[70403] died closes closes worker[70405] died worker[70404] died closes worker[70406] died
  • 26. 2. angel 名前がかっこいいですね
  • 27. 2. angel pullreq お待ちしております
  • 28. Thank you twitter.com/maaash github.com/mash

×