SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
自作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
ご静聴ありがとうございました

Más contenido relacionado

La actualidad más candente

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
FuelPHPをさわってみて
FuelPHPをさわってみてFuelPHPをさわってみて
FuelPHPをさわってみてSotaro Omura
 
Fuel php osc tokyo2012
Fuel php osc tokyo2012Fuel php osc tokyo2012
Fuel php osc tokyo2012Fumito Mizuno
 
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 CloudFormationKazuyuki Honda
 
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サービスを作るKiyoshi Sawada
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたKatsuhiro Miura
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with BrowserifyMuyuu Fujita
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
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サービスにアクセスするKiyoshi Sawada
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1Fumito Mizuno
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライMasanobu Sato
 
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サービスを作るKiyoshi Sawada
 

La actualidad más candente (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サービスを作る
 

Destacado

TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口Sunao Tomita
 
Automated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xAutomated%20testing%20with%20Espresso2.x
Automated%20testing%20with%20Espresso2.xTatsuya Maki
 
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介
第5回iocj情報交換会 info scoopとzabbixによる運用ポータルの事例紹介infoScoop
 
今日から始めるRxSwift
今日から始めるRxSwift今日から始めるRxSwift
今日から始めるRxSwiftKaoru Hotate
 
Swiftビギナーズ 2016/01/09
Swiftビギナーズ 2016/01/09Swiftビギナーズ 2016/01/09
Swiftビギナーズ 2016/01/09Yutaka Tajika
 
ROMA のアーキテクチャと社内事例
ROMA のアーキテクチャと社内事例ROMA のアーキテクチャと社内事例
ROMA のアーキテクチャと社内事例Rakuten Group, Inc.
 
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみようGoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみようHidemasa Togashi
 
ポコロンダンジョンズとリアルタイム通信 -クライアント編-
ポコロンダンジョンズとリアルタイム通信 -クライアント編-ポコロンダンジョンズとリアルタイム通信 -クライアント編-
ポコロンダンジョンズとリアルタイム通信 -クライアント編-Suguru Shirai
 
イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱イマドキのフロントエンドエンジニアの道具箱
イマドキのフロントエンドエンジニアの道具箱Fumio SAGAWA
 
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 LambdaFabian Dubois
 
年の瀬!リアルタイム通信ゲームサーバ勉強会
年の瀬!リアルタイム通信ゲームサーバ勉強会年の瀬!リアルタイム通信ゲームサーバ勉強会
年の瀬!リアルタイム通信ゲームサーバ勉強会monobit
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルSatoshi Yamada
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときRyunosuke SATO
 
Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Python/Bottle for Kubo Semi 2014
Python/Bottle for Kubo Semi 2014Toshiki NOGUCHI
 

Destacado (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
 

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

Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application FrameworkLearningTech
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみたTakahiro Hidaka
 
「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日)Fujio Kojima
 
Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11Pro aspnetmvc3framework chap11
Pro aspnetmvc3framework chap11Hideki Hashizume
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験Toshio Ehara
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 

Similar 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

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Último (9)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

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