SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
自作node.jsフレームワークと
nginxを使ってラジオサイトを作ってみた
MikeTokyo???
しかもなんか見たことあるアイコンじゃね?
これだ!!!!!!
僕と、〇〇でラジオやります!
もうブース押さえてます!(10/20(土)22:00∼)
ただ、ラジオやるなら、WEBサイトが必要ですよね!
僕はphperなので、apache+mod-phpで
WEBサイト作(ry
いや、ちょっと待て!
今の時代にapache+mod-phpは古くね?
サイトの規模も小さいし、
勉強がてらnode.js+nginxで作ろう!
What is node.js?
Javasctiptでサーバーサイドプログラミングを行うことが出来る環境の総称です。

特徴
・V8 javascript(google chromeのjavascript実行環境)を利用しているため、動作が軽快

・イベントドリブンなプログラミングスタイル

・シングルスレッドのイベントループモデル
(apacheのようにリクエスト毎にスレッドを立てるのではなく、シングルスレッドで処理をキュー
にためて実行する。このため、メモリの使用量がapacheなどのサーバーに比べて少ない)

・ノンブロッキングI/O
(i/oの完了を待たずに次の処理が実行される。ブラウザで動作するjavascriptのように、パラレル
で処理が実行される。
普通のイベントループモデルだと重い処理がブロッキングを行って次の処理が遅延するが、
ノンブロッキングI/Oのおかげでnode.jsではブロッキングが発生しない。)

・以上のことから、大量アクセスのあるリアルタイムWEBを始めとしたネットワークプログラミ
ングが得意
What is nginx?
軽量かつ、WEBサーバー、リバースプロキシー、IMAP/POP3、LBとして使用
可能な高性能WBサーバーのこと

特徴
・node.js同様、非同期のイベント駆動型のリクエスト処理を用いているため負荷に強い

・apacheほど設定も難解ではないので、扱いやすい

・Fast-CGIをデフォルト備えているので、phperである僕らはphp-FPMを容易に扱うことがで
きる

・とりあえずめちゃめちゃ流行っている。Response HeaderのServer項目がnginxというのをマ
ジでよく見かける
node.jsでWEBアプリケーションとなると....

                           cofeescript、jadeのほか、Redis、
                           MongoDBをすぐに扱えるnode.js 
                            史上最強MVCフレームワーク

http://towerjs.org/




  rubyのsinatraライクな軽量フレーム
                ワーク

                                  http://expressjs.com/
ただ、node.jsでのプログラミングのイロハがまだ不確
かなままFWを使うのも嫌なので、自分でFW作って学
      びながらモノ作りしたい!
本題
Architecter
                                  nginx(静的ファイル)
                                   port 80
クライアント

                    request



                              response

                                               proxy

 簡単な仕様                              node.js(動的処理)
・RonRライクなMVCパターンを採用                 port3000
・ORMなし
・scafoldなし                    response

・ Templateエンジンにejsを採用
・jsUnitを採用(予定)
Architecter続き
①リクエスト            ②リクエストハンドラ



                ③コントローラーのインスタンス生成



                   ④アクション実行



                  ⑤レスポンスデータの生成
                   (html、jpg、404等)



                     ⑥レスポンス
MVCFrameWorkに最低限必要なもの

・RequestHandler
・Configuration
・Router
・Model
・View
・Controller
ディレクトリ構成
miketokyo
   |-app
            |-config
                  |-config.js
                  |-router.js
                  |-bootstrap.js
            |-controllers
            |-models
            |views
                   |-layouts
  |-system
         |-server
                |-view.js
                |-router.js
                |-controller.js
                |-share.js
                |-response.js
                |-utility.js
  |-server.js
  |-package.json
  |-.gitignore
リクエストハンドラの実装
   server.js(紙面の都合上章や略しております。)
var	
  http	
  =	
  require("http");
var	
  url	
  =	
  require("url");

(function	
  start()	
  {
	
  	
  function	
  onRequest(request,	
  response)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  //アプリケーション初期化
	
  	
  	
  	
  	
  	
  	
  	
  var	
  router	
  =	
  require("./app/config/router.js");
	
  	
  	
  	
  	
  	
  	
  	
  var	
  pathname	
  =	
  url.parse(request.url).pathname;
	
  	
  	
  	
  	
  	
  	
  	
  var	
  bootstrap	
  =	
  require("./app/config/bootstrap");
	
  	
  	
  	
  	
  	
  	
  	
  bootstrap.init(request,	
  response);
	
  	
  	
  	
  	
  	
  	
  	
  var	
  env	
  =	
  require("./app/config/env/"	
  +	
  bootstrap.env);
	
  	
  	
  	
  	
  	
  	
  	
  var	
  config	
  =	
  require("./app/config/config");
	
  	
  	
  	
  	
  	
  	
  	
  var	
  share	
  =	
  require("./system/server/share");
	
  	
  	
  	
  	
  	
  	
  	
  share.config	
  =	
  config;

	
  	
  	
  	
  	
  	
  	
  	
  var	
  __CONTROLLER__	
  =	
  router.controller;
	
  	
  	
  	
  	
  	
  	
  	
  var	
  __ACTION__	
  =	
  router.action;

	
  	
  	
  	
  	
  	
  	
  	
  if(pathname	
  !=	
  "/"){
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  __CONTROLLER__	
  =	
  pathname.split("/")[1];
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  __ACTION__	
  =	
  (typeof	
  pathname.split("/")[2]	
  ==	
  "string")	
  ?	
  pathname.split("/")[2]	
  :	
  "index";
	
  	
  	
  	
  	
  	
  	
  	
  }

	
  	
  	
  	
  	
  	
  	
  	
  var	
  className	
  =	
  __CONTROLLER__.charAt(0)	
  +	
  __CONTROLLER__.substring(1)	
  +	
  "Controller";	
  //クラス名を動的に形成する
	
  	
  	
  	
  	
  	
  	
  	
  var	
  _controller	
  =	
  require("./app/controllers/"	
  +	
  className);
	
  	
  	
  	
  	
  	
  	
  	
  var	
  controllerInstance	
  =	
  new	
  _controller();

	
  	
  	
  	
  	
  	
  	
  	
  controllerInstance.request	
  =	
  request;
	
  	
  	
  	
  	
  	
  	
  	
  controllerInstance.response	
  =	
  response;
	
  	
  	
  	
  	
  	
  	
  	
  controllerInstance.headers	
  =	
  request.headers;
	
  	
  	
  	
  	
  	
  	
  	
  controllerInstance.headers.userAgent	
  =	
  require('user-­‐agent').parse(request.headers['user-­‐agent']).full;

	
  	
  	
  	
  	
  	
  	
  	
  controllerInstance.init();
	
  	
  	
  	
  	
  	
  	
  	
  var	
  assignVars	
  =	
  eval("controllerInstance."	
  +	
  __ACTION__	
  +	
  "Action()");

	
  	
  	
  	
  	
  	
  	
  	
  var	
  view	
  =	
  require("./system/server/view");
	
  	
  	
  	
  	
  	
  	
  	
  view.render(controllerInstance.layoutPath	
  ,	
  controllerInstance.renderPath	
  ,	
  assignVars,	
  response);
	
  	
  }
	
  	
  http.createServer(onRequest).listen(3000);
})();
環境判別等を行うbootstrapを作成する
app/config/bootstrap.js
var	
  bootstrap	
  =	
  {
	
   env	
  :	
  "localhost"
	
   ,init	
  :	
  function(req,	
  res){	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  //ホストから環境を判別する
                          var	
  this.env	
  =	
  (function(host){
                          	
  	
  	
  	
  var	
  hostSplits	
  =	
  host.split(".");
                          	
  	
  	
  	
  if(hostSplits[0].match(/dev|stg/)){
                                          return	
  hostSplits[0];
                                   }else{
                                          return	
  "production";
                                   })(req.headers.host);
                          }
	
   }
}

module.exports	
  =	
  bootstrap;
設定ファイルを作成する
app/config/config.js

var	
  config	
  =	
  {
	
   applicationName	
  :	
  "MikeTokyo"
}

module.exports	
  =	
  config;
BaseとなるControllerクラスの作成
system/controller.js
function	
  controller(){}
controller.prototype	
  =	
  {
	
   request	
  :	
  null,
	
   response	
  :	
  null,
	
   headers	
  :	
  null,
	
   renderPath	
  :	
  null,
	
   layoutPath	
  :	
  "base",
	
  
	
  	
  	
  init	
  :	
  function(){},
	
  	
  	
  //void	
  redirect
	
   redirect	
  :	
  function(url){
	
   	
   this.response.writeHead(302,	
  {
	
   	
  	
  	
   	
   'Location':	
  url
	
   	
   });
	
   	
   this.response.end();	
  
	
   },
	
  	
  	
  //void	
  render
	
   render	
  :	
  function(path){
	
   	
   this.renderPath	
  =	
  path;
	
   },
	
  	
  	
  //void	
  layout
	
   layout	
  :	
  function(path){
	
   	
   this.layoutPath	
  =	
  path;
	
   }
}

module.exports	
  =	
  controller;
Viewクラスの作成
 system/view.js
var	
  fs	
  =	
  require("fs");
var	
  ejs	
  =	
  require("ejs");
var	
  share	
  =	
  require("./share");

var	
  view	
  =	
  {
	
              templateVars	
  :	
  {}
	
              ,viewExt	
  	
  	
  	
  	
  	
  :	
  ".ejs"
	
              ,layoutPath	
  	
  	
  :	
  null
	
              ,templatePath	
  :	
  null
	
  	
  	
  	
  //htmlをクライアントに返す
	
               render	
  :	
  function(layoutPath,	
  templatePath,	
  templateVars,	
  response){
                                   var	
  templatePath	
  	
  =	
  share.APP_PATH	
  +	
  "views/layout/"	
  +	
  templatePath	
  +	
  this.viewExt;
	
               	
                fs.readFile(templatePath,"utf8",	
  function(err,data){
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //renderで指定されたtemplateをhtmlに置換して取得する
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  actionData	
  =	
  ejs.render(data,vars);
	
  	
  	
  	
  	
   	
   	
  
                 	
  	
  	
                         fs.readFile((function(path){
	
               	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  templatePath	
  =	
  share.APP_PATH	
  +	
  "views/";
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
              	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(path	
  !==	
  undefined	
  &&	
  path	
  !==	
  null){
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
          	
  return	
  templatePath	
  +=	
  path	
  +	
  this.viewExt;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
   }else{
	
  	
  	
  	
  	
  	
             	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  templatePath	
  +=	
  share.__ACTION__	
  +	
  this.viewExt;
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  })(layoutPath),"utf8",	
  function(err,data2){
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //layoutで指定されたtemplateに、actionDataを埋め込みHTMLとしてクライアントに返す
	
               	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  finalOutput	
  =	
  ejs.render(data2,{content	
  :	
  actionData,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  applicationName	
  :	
  share.config.applicationName});
	
               	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  response.writeHead(200,	
  {	
  'Content-­‐Type':	
  'text/html;	
  charset=utf-­‐8'	
  });
	
               	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  response.end(finalOutput);
	
               	
  	
  	
  	
  	
  	
  	
  	
  });	
  

	
   	
  	
  	
  	
  });
	
   },
}
module.exports	
  =	
  view;
routerクラスの作成
system/server/router.js


var	
  url	
  =	
  require("url");

var	
  router	
  =	
  {
	
  	
  req:null
	
  ,controller:	
  "app"
	
  ,action	
  :	
  "index"
	
  ,connect	
  :	
  function(pattern,	
  routeUrl){
	
  	
  	
  	
  var	
  patt	
  =	
  pattern.replace('/',	
  "/");
	
  	
  	
  	
  var	
  pathname	
  =	
  url.parse(this.req.url).pathname;
	
  	
  	
  	
  if(pathname.match(patt)){
	
  	
  	
  	
  	
  	
  this.controller	
  =	
  routeUrl.split("/")[0];
	
  	
  	
  	
  	
  	
  this.action	
  =	
  routeUrl.split("/")[1];
	
  	
  	
  	
  }
	
  	
  }
}

module.exports	
  =	
  router;
Frame Workの基幹が出来たので、実際に使ってみるお!
appControllerの作成
app/controllers/appController.js
//ライブラリインポート
var	
  share	
  =	
  require("../../system/server/share");
var	
  utility	
  =	
  require("../../system/server/utility");

function	
  appController(){}
//継承
var	
  appController	
  =	
  	
  utility.extend(appController,	
  require("../../system/
server/controller"));

appController.prototype.init	
  =	
  function(){
	
   this.layout("base");
}

appController.prototype.indexAction	
  =	
  function(){
	
   return	
  {applicationName:"MikeTokyo"	
  };
}

appController.prototype.testAction	
  =	
  function(){
	
  	
  	
  	
  this.render("test");
}

module.exports	
  =	
  appController;
各種viewの作成
app/views/layout/base.ejs
<!doctype	
  html>
<html>
	
   <head>
	
   <meta	
  charset="UTF-­‐8">
	
   <title><%=applicationName	
  %></title>
	
   </head>
	
   <body>
	
   	
   <%-­‐content	
  %>
	
   </body>
</html>


app/views/index.ejs

<h1><%=applicationName	
  %>:Index</h1>
<img	
  src="/img/common/logo.jpg">
<a	
  href="/app/test"	
  >testへ</a>
routerの設定

app/config/router.js

var	
  router	
  =	
  require("../../system/server/router");
router.connect("/",	
  "app/index");

module.exports	
  =	
  router;
nginxの設定
/etc/nginxd/nginx.conf
server {
           listen   80;
           server_name miketokyo.com;
           root /var/www/nginx-default;
           access_log /var/log/nginx/localhost.access.log;

           #指定した拡張子のファイルはnginxでさばく
           location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
                   root /var/www/miketokyo/app/webroot/
                   expires 15d;
           }

           #プロキシの設定
           location / {
                   proxy_pass       http://127.0.0.1:3000;
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_set_header Host $http_host;
                   proxy_set_header X-Nginx-Proxy true;
                   proxy_redirect off;
           }
}
実際にアクセスしてみるお!
http://miketokyo.com/
無理やりですが、
とても簡単にWEBアプリが作れてしましますね!!
node.js開発時のティップス
・クラスの名前は、「camelCase」のようなキャメルケースとなる

・自分でhttpサーバーを作るということを意識する。html以外にも、jpgやcssなどもcontent-typeを指定
してクライアントに返す必要がある。もちろん、404や500も。

・シングルスレッドで動作するため、例えば、「this.propety++」として初期化しないで放置すると、
次のリクエストでは、前のリクエストでインクリメントされた値をさらにインクリメントして処理さ
れるため、phpやjavaのノリで「this.propety++」や「this.propety += hoge」を書くと大変!!

・例外が発生するとnode.jsのプロセス自体が落ちてアボーんする(適切に全ての例外をcatchして500
などを返すか、foreverというnode.jsをデーモン化するモジュールを導入することで対応可能)

・複雑な処理を書くとコールバックの嵐となるため、Defferdとかを使ったほうがよさそう。


・JQueryもつかえるよ!

・CofeeScriptでも書けるよ!
まとめ
・node.jsはsocket.ioだけじゃなく、WEBアプリだって作れる!
 しかも簡単に!

・Smartyやjspと同等レベルで扱えるtemplateエンジンがある!
(その他hamlを扱えるjade等も存在する)

・各クラスやライブラリをモジュール化することで、OOPプロ
グラミングができる

・同じくイベントループモデルのWEBサーバーであるnginxと相
性がいい

・今回は登場していませんが、mysqlやmongodbなどのDBドライ
バ、RedisやmemcacheなどのKVS向けドライバも用意されている
ので、phpやjavaと同等のWEB開発ができる

・依存関係を最小限にクラス設計をするのに時間がかかりそ
う。。
今回紹介したmiketokyoフレームワークは、
github上で開発されています笑

みんなコミッターになってね♥
https://github.com/noppoMan/mike_tokyo
ご静聴ありがとうございました

Mais conteúdo relacionado

Mais procurados

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 

Mais procurados (20)

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
Apache Module
Apache ModuleApache Module
Apache Module
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
FuelPHPをさわってみて
FuelPHPをさわってみてFuelPHPをさわってみて
FuelPHPをさわってみて
 
Fuel php osc tokyo2012
Fuel php osc tokyo2012Fuel php osc tokyo2012
Fuel php osc tokyo2012
 
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
 
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみた
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
20061125
2006112520061125
20061125
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
 
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 

Destaque

Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.x
Tatsuya Maki
 
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
infoScoop
 

Destaque (20)

nginxの紹介
nginxの紹介nginxの紹介
nginxの紹介
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口
 
Node js 入門
Node js 入門Node js 入門
Node js 入門
 
Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.x
 
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
 
Devsumi2014 13 e-7-03
Devsumi2014 13 e-7-03Devsumi2014 13 e-7-03
Devsumi2014 13 e-7-03
 
今日から始めるRxSwift
今日から始めるRxSwift今日から始めるRxSwift
今日から始めるRxSwift
 
Swiftビギナーズ 2016/01/09
Swiftビギナーズ 2016/01/09Swiftビギナーズ 2016/01/09
Swiftビギナーズ 2016/01/09
 
インフラの話
インフラの話インフラの話
インフラの話
 
Server-side Swift
Server-side SwiftServer-side Swift
Server-side Swift
 
Codevs5.0勉強会
Codevs5.0勉強会Codevs5.0勉強会
Codevs5.0勉強会
 
ROMA のアーキテクチャと社内事例
ROMA のアーキテクチャと社内事例ROMA のアーキテクチャと社内事例
ROMA のアーキテクチャと社内事例
 
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみようGoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
 
ポコロンダンジョンズとリアルタイム通信 -クライアント編-
ポコロンダンジョンズとリアルタイム通信 -クライアント編-ポコロンダンジョンズとリアルタイム通信 -クライアント編-
ポコロンダンジョンズとリアルタイム通信 -クライアント編-
 
イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱
 
PyconJP: Building a data preparation pipeline with Pandas and AWS Lambda
PyconJP: Building a data preparation pipeline with Pandas and AWS LambdaPyconJP: Building a data preparation pipeline with Pandas and AWS Lambda
PyconJP: Building a data preparation pipeline with Pandas and AWS Lambda
 
年の瀬!リアルタイム通信ゲームサーバ勉強会
年の瀬!リアルタイム通信ゲームサーバ勉強会年の瀬!リアルタイム通信ゲームサーバ勉強会
年の瀬!リアルタイム通信ゲームサーバ勉強会
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないとき
 
Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014
 

Semelhante a 自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた

Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
Yusuke Ando
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
 
Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11
Hideki Hashizume
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 

Semelhante a 自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた (20)

densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
Koa.js_エンジニア勉強会20140328
Koa.js_エンジニア勉強会20140328 Koa.js_エンジニア勉強会20140328
Koa.js_エンジニア勉強会20140328
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Ext.direct
Ext.directExt.direct
Ext.direct
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
ASP.NET MVC 1.0
ASP.NET MVC 1.0ASP.NET MVC 1.0
ASP.NET MVC 1.0
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 

Último

Último (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた