æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.6ï¼»CHAPTER6 ææ ã³ã³ããã¼ã«ã®éè¡å¸«ï¼½â
è¨äºã®æ¦è¦
ãæããããã°ã©ã ãã®ï¼»CHAPTER6 ææ ã³ã³ããã¼ã«ã®éè¡å¸«ï¼½ãåèã«ãææ ã¢ãã«ãæè¼ãããã£ãããããã使ãã¾ãã
ç®æ¬¡
- è¨äºã®æ¦è¦
- ç®æ¬¡
- éçºç°å¢
- ããã£ã®æ©å«ãåã
- åèæ¸ç±
- åèè¨äº
- é¢é£è¨äº
éçºç°å¢
- OSX 10.11.2 El Capitan
- ããã¹ãã¨ãã£ã¿ï¼ MacVim
- ã¿ã¼ããã«ã¨ãã¥ã¬ã¼ã¿ï¼ Macã¿ã¼ããã«
- ã·ã§ã«ï¼ zsh
- ããã±ã¼ã¸ããã¼ã¸ã£ï¼ Homebrew
- ãã©ã¦ã¶ï¼ Firefox - Ruby 2.0.0p645
- ãã¼ã¸ã§ã³ããã¼ã¸ã£ï¼ rbenv
- Webãã¬ã¼ã ã¯ã¼ã¯ï¼ Sinatra
åèè¨äº
Rubyã®éçºç°å¢æ§ç¯ã¯ããã¡ãã®è¨äºãåèã«ããã¦ããã ãã¾ããã
ããã£ã®æ©å«ãåã
ãã£ãããããã«ææ
ã¢ãã«ãå°å
¥ããç¹å®ã®åèªãå«ãä¼è©±ã§å¿çæã®å£èª¿ãå¤åããã¾ãã
ã¾ããå¿çæã«åãã¢ãã¡ã¼ã·ã§ã³ã¨ãé常æã«å¨å²ãè¦åãã¢ãã¡ã¼ã·ã§ã³ã追å ãã¾ãã
ã¢ããªã±ã¼ã·ã§ã³ãã£ã¬ã¯ããªã®æ§æ
~/programinlove
|- proto.rb // CUIãã£ãããããã®ã¡ã¤ã³ãã¡ã¤ã«
|- unmo.rb // ãã£ããããããªãã¸ã§ã¯ãã®ã¢ãã«
|- responder.rb // å¿çãªãã¸ã§ã¯ãã®ã¢ãã«
|- dictionary.rb // è¾æ¸ãèªã¿è¾¼ã¿ç®¡çããã¯ã©ã¹
|- /dics // è¾æ¸ãã¡ã¤ã«ãæ ¼ç´ãããã£ã¬ã¯ããª
| |- random.txt // ã©ã³ãã ãªå¿çãè¿ãããã®è¾æ¸
| |- pattern.txt // ãã¿ã¼ã³ã«åã£ãå¿çãè¿ãããã®è¾æ¸
|- noby.rb // Webã¢ããªã®ã¡ã¤ã³ãã¡ã¤ã«
|- /views // ãã¥ã¼ã®ãã³ãã¬ã¼ããé
ç½®ãããã£ã¬ã¯ããª
| |- index.erb // ãã£ããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã表示ãããã¥ã¼
|- /public // éçãã¡ã¤ã«ãé
ç½®ãããã£ã¬ã¯ããª
|- nobycanvas.js // ãã£ã©ã¯ã¿ã¼ã®ç»åãã¢ãã¡ã¼ã·ã§ã³ãããJavascript
|- styles.css // ãã£ããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¬ã¤ã¢ã¦ãããcss
|- /img // ç»åãã¡ã¤ã«ãæ ¼ç´ãããã£ã¬ã¯ããª
|- /normal // 平常æã®ç»åãæ ¼ç´ãããã£ã¬ã¯ããª
| |-0000.png
|- /blink // ç¬ãã®ç»åãæ ¼ç´ãããã£ã¬ã¯ããª
| |-0000.png
| |-0001.png
|- /lookaround // å¨å²ãè¦åãç»åãæ ¼ç´ãããã£ã¬ã¯ããª
| |-0000.png
| |-0001.png
| |-0002.png
| |-0003.png
| |-0004.png
|- /talk // åãç»åãæ ¼ç´ãããã£ã¬ã¯ããª
|-0000.png
|-0001.png
ã½ã¼ã¹ã³ã¼ã
ãã£ã©ã¯ã¿ã¼ã®ã¢ãã¡ã¼ã·ã§ã³ãå¢ããããJavascriptã®è¨è¿°ãå¢ãã¦ããã®ã§ãJavascriptãindex.erb
ããåé¢ããnobycanvas.js
ã使ãã¾ããã
nobycanvas.js
ã¯ãä¼è©±ãå
¥åãããªããã°ãç¬ããå¨å²ãè¦åãã¢ãã¡ã¼ã·ã§ã³ãé©å½ã«è¡¨ç¤ºãã¦ãã¾ãããä¼è©±ãå
¥åãããã¨ãnoby.rb
ããdata屿§
çµç±ã§å¿çæã§ããã¨ããæ
å ±ãåå¾ããåãã¢ãã¡ã¼ã·ã§ã³ã表示ãã¾ãã
ãã®ä»ã®Rubyãã¡ã¤ã«ã¯ããµã³ãã«ããã°ã©ã ã¨åæ§ã®è¨è¿°ã§ãç¹ã«å¤æ´ã¯ããã¾ããã
views/index.erb
<html> <!-- publicãã©ã«ãã®cssãã¡ã¤ã«ãèªã¿è¾¼ã --> <link href="styles.css" rel="stylesheet"> <body> <!-- ãã£ããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãå²ãæ --> <div id="nobyform"> <!-- ãã£ã©ã¯ã¿ã¼ã®ç»åã表示 --> <div id="nobycanvas" data-nobystate="<%= @noby_state %>"> <img src="img/normal/0000.png"> </div> <!-- ãã£ã©ã¯ã¿ã¼ããã®å¿çã¡ãã»ã¼ã¸ã表示 --> <div id="responsearea"> <p><%= @responder_resp %></p> </div> <!-- ä¼è©±ããªãã·ã§ã³ã®ç¶æ ãPOSTãããã©ã¼ã --> <div> <form action="/" method="post"> <!-- ãã¿ã³ãæ¼ãã¨ä¼è©±ã'/'ã«POSTãã --> <div> <input type="text" name="inputarea" placeholder="ä¼è©±ãå ¥å"> <button type="submit">話ã</button> </div> <!-- ãã°ã«Responderã表示ãããªãã·ã§ã³ --> <div> <label><input type="checkbox" name="respoption" value="show" <%= @check %>>Responderã表示</label> </div> </form> </div> </div> <!-- ä¼è©±ã®ãã°ã表示 --> <div id="logarea"> <%= @talk_log %> </div> <!-- ãã£ã©ã¯ã¿ã¼ã®ç»åãã¢ãã¡ã¼ã·ã§ã³ãããJavaScript --> <script src="nobycanvas.js"></script> </body> </html>
public/nobycanvas.js
document.addEventListener('DOMContentLoaded', function(){ /* é åã®è¦ç´ çªå· */ var index = 0; /* ãã£ã©ã¯ã¿ã¼ã®æ ç·ç¶æ ãç¢ºèª */ var talking = document.getElementById("nobycanvas").dataset.nobystate; /* é常æã®ç»å */ var normalImg = ["img/normal/0000.png"]; /* ç¬ãã®ã¢ãã¡ã¼ã·ã§ã³ç¨ã®ç»å */ var blinkImg = [ "img/normal/0000.png", "img/blink/0000.png", "img/blink/0001.png", "img/normal/0000.png" ]; /* è¦åãã¢ãã¡ã¼ã·ã§ã³ç¨ã®ç»å */ var lookImg = [ "img/normal/0000.png", "img/lookaround/0000.png", "img/lookaround/0001.png", "img/lookaround/0002.png", "img/lookaround/0003.png", "img/lookaround/0004.png", "img/normal/0000.png" ]; /* åãã¢ãã¡ã¼ã·ã§ã³ç¨ã®ç»å */ var talkImg = [ "img/normal/0000.png", "img/talk/0000.png", "img/talk/0001.png", "img/talk/0000.png", "img/talk/0001.png", "img/normal/0000.png" ]; /* 颿°ã®ä¸ã§ç»åãæä½ããããã®é å */ var animePtn = [normalImg, blinkImg, lookImg]; var imgAry = []; /* ï¼ç¨®é¡ã®ã¢ãã¡ã¼ã·ã§ã³ããã©ã³ãã ã«é¸æ */ function selectAnime() { imgAry = animePtn[Math.floor(Math.random() * 3)]; } /* ç»åãé çªã«è¡¨ç¤ºãã¦ã¢ãã¡ã¼ã·ã§ã³ã使 */ function flipAnime(){ timeoutId = setTimeout(flipAnime, 100); document.getElementById("nobycanvas").getElementsByTagName("img")[0].src = imgAry[index]; index++; if (index >= imgAry.length){ index = 0; clearTimeout(timeoutId); } } /* å¿çæã¯åãã¢ãã¡ã¼ã·ã§ã³ã表示 */ if (talking) { imgAry = talkImg; talking = ''; flipAnime(); } /* å¾ æ©æã¯é©å½ãªã¢ãã¡ã¼ã·ã§ã³ãé¸ãã§è¡¨ç¤ºãã */ setInterval(selectAnime, 5000); setInterval(flipAnime, 5000); });
noby.rb
require 'sinatra' require 'sinatra/reloader' require_relative 'unmo' # ä¼è©±ãã°ãæ ¼ç´ããé å log_area = [] # ãã«ãã¼ã¡ã½ãããå®ç¾©ãã # ã«ã¼ãã£ã³ã°ã¡ã½ããã®ä¸ã§ä½¿ã helpers do def noby # ããã£çæ @noby ||= Unmo.new('noby') end def prompt(resp_opt) # å¿çã表示ããéã®ããã³ããã使 resp_opt ? "#{noby.name}ï¼#{noby.responder_name}" : "#{noby.name}" end end # URL'/'ã«ã¢ã¯ã»ã¹ get '/' do # ä¼è©±ãã°ãåæåãã¦nobyfomã表示 log_area = [] erb :index end # URL'/'ã«POSTã¡ã½ããã§ã¢ã¯ã»ã¹ post '/' do # ã¦ã¼ã¶ã®å ¥åãåå¾ talk_text = params['inputarea'] # Responderã表示ãããã§ãã¯ããã¯ã¹ã®ç¶æ ãåå¾ # ãã§ãã¯ããã¦ãå ´åã¯ç¶æ ãç¶æ resp_opt = params['respoption'] @check = "checked" if resp_opt # ã¦ã¼ã¶ã®å ¥åãããã°å¿çãã¦ä¼è©±ãã°ã«è¡¨ç¤º unless talk_text.empty? @noby_state = "talking" @responder_resp = noby.dialogue(talk_text) log_area << "> #{talk_text}<br>" log_area << "#{prompt(resp_opt)}> #{@responder_resp}<br>" end @talk_log = log_area.join erb :index end
ãã®ã³ã¼ãã®ã³ãããã«ã¯ã[chapter6-5]ã®ã¿ã°ãä»ãã¦ã¾ãã
å®è¡çµæ
ã¿ã¼ããã«ã§noby.rb
ãåããããã©ã¦ã¶ã«http://localhost:4567
ãå
¥åãã¾ãã
~/programinlove
$ruby noby.rb
éãè¯ããã°ãä¼è©±ãã¦ããæ°åã«ãªãã¾ãã
åèæ¸ç±
åèè¨äº
Sinatraã«ã¤ãã¦ã¯ããã¡ãã®è¨äºãåèã«ããã¦ããã ãã¾ããã
- Rubyの入門や書き捨てアプリを作る場合は sinatraがオススメ! - むかぁ~ どっと こむ
- SinatraとjQueryでおよそ100行で作るAjax掲示板アプリケーション - gaaamiiのブログ
- Sinatra: README (Japanese)
é¢é£è¨äº
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.0ï¼»ã¯ããã«ï¼½
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.1ï¼»CHAPTER3 ã»ãã¨ã«ç¡è½ï¼½
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.2ï¼»CHAPTER4 ããããã®GUIï¼½â
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.3ï¼»CHAPTER4 ããããã®GUIï¼½â¡
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.4ï¼»CHAPTER4 ããããã®GUIï¼½â¢
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.5ï¼»CHAPTER5 è¾æ¸ãçæã«ï¼½
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.7ï¼»CHAPTER6 ææ
ã³ã³ããã¼ã«ã®éè¡å¸«ï¼½â¡
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.8ï¼»CHAPTER7 å¦ç¿ã®ã¹ã¹ã¡ï¼½â
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.9ï¼»CHAPTER7 å¦ç¿ã®ã¹ã¹ã¡ï¼½â¡
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.10ï¼»CHAPTER7 å¦ç¿ã®ã¹ã¹ã¡ï¼½â¢
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.11ï¼»CHAPTER8 æç« ãä½ãåºãï¼½
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.12ï¼»CHAPTER9 ããã£ããããã¯ã¼ã¯ã«ã¤ãªããï¼½
- æããããã°ã©ã ãSinatraã§Webã¢ããªã«ããPart.13ï¼»ãããã«ï¼½