JavaScript 割り勘電卓

Math.floorは切り捨て、Math.ceilは切り上げ、Math.absは絶対値という仕組みを上手く利用します。正規関数/^[1-9][0-9]*$/も使用します。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>割り勘電卓</title>
    <link rel="stylesheet" href="styles.css">
    <style>
      body {
        font-size:16px;
        text-align: center;
        font-family: Arial, sans-serif;
      }
      h1 {
        font-size: 24px;
      }
      input[type="text"]{
        padding: 7px;
        border: 1px solid #ddd;
        border-radius: 3px;
        width: 100px;
        font-weight: bold;
        font-size: 18px;
        text-align: right;
      }
      #btn {
        margin: 30px auto;
        width: 180px;
        border-radius: 5px;
        box-shadow: 0 4px 0 #e91b0c;
        background: #f44336;
        color: #fff;
        cursor: pointer;
        padding: 7px;
      }
      #btn:hover{
        opacity: 0.8;
      }
    </style>
  </head>
  <body>
      <h1>割り勘電卓</h1>
      <p>金額 <input type="text" id="price" value="0">
      <p>人数 <input type="text" id="num" value="0">
      <div id="btn">計算する</div>
      <p id="result"></p>
      <script>
      (function(){
          'use strict';

          var priceForm = document.getElementById('price');
          var numForm = document.getElementById('num');
          var btn = document.getElementById('btn');
          var result = document.getElementById('result');

          priceForm.addEventListener('click', function(){
              this.select();
          });
          numForm.addEventListener('click', function(){
              this.select();
          });

          btn.addEventListener('click', function(){
              var price = priceForm.value;
              var num = numForm.value;
              var x1, x2, y1, y2;
              var unit = 100;

              if (price.match(/^[1-9][0-9]*$/) && num.match(/^[1-9][0-9]*$/)){
                  if (price % num === 0){
                    result.innerHTML = '一人' +(price / num)+'円丁度です!';
                  } else {
                    x1 = Math.floor(price / num / unit) * unit;
                    y1 = price - (x1 * num);
                    x2 = Math.ceil(price / num / unit) * unit;
                    y2 = Math.abs(price - (x2 * num));
                    result.innerHTML = 
                    '一人' + x1 + '円だと' + y1 + '円足りません。<br>' +
                    '一人' + x2 + '円だと' + y2 + '円余ります。';
                  }
              } else {
                result.innerHTML = '入力された値に誤りがあります。'
              }
          });
      })();
      </script>
  </body>
</html>

%e7%84%a1%e9%a1%8c

Bootstrap クリッカブルタブメニュー

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Bootstrap Practice</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>

    <div class="container" style="padding:20px 0">

      <ul class="nav nav-tabs" style="margin-bottom:15px">
      <li class="active"><a href="#home" data-toggle="tab">Home</a></li>
      <li><a href="#about" data-toggle="tab">About</a></li>
      </ul>

      <div class="tab-content">
        <div class="tab-pane active" id="home">ほーむだよ</div>
        <div class="tab-pane" id="about">aboutだよ</div>
      </div>

    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

%e7%84%a1%e9%a1%8c

Bootstrap modalウィンドウ

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Bootstrap Practice</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>

    <div class="container" style="padding:20px 0">

    <a data-toggle="modal" href="#myModal" class="btn btn-primary">show me</a>

    <div class="modal fade" id="myModal">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">my modal</h4>
        </div>
        <div class="modal-body">
        こんにちは!
        </div>
        <div class="modal-footer">
          <button class="btn btn-primary">OK!</button>
        </div>
      </div>
    </div>

    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

%e7%84%a1%e9%a1%8c

Bootstrap progress-bar

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Bootstrap Practice</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>

    <div class="container" style="padding:20px 0">

    <div class="progress">
        <div class="progress-bar progress-bar-primary" style="width:60%"></div>
    </div>

     <div class="progress progress-striped active">
        <div class="progress-bar progress-bar-info" style="width:60%"></div>
    </div>

    <div class="progress progress-striped active">
        <div class="progress-bar progress-bar-info" style="width:30%"></div>
        <div class="progress-bar progress-bar-primary" style="width:20%"></div>
        <div class="progress-bar progress-bar-warning" style="width:10%"></div>
    </div>

    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

%e7%84%a1%e9%a1%8c

Bootstrap label, badge, alert, pannel

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Bootstrap Practice</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>

    <div class="container" style="padding:20px 0">

    <p>product a <span class="label label-primary">NEW!</span></p>

    <p>Inbox <span class="badge">5</span></p>
    <p>Inbox <span class="badge"></span></p>

    <div class="alert alert-info">
      <button class="close" data-dismiss="alert">&times;</button>
    おしらせ
    </div>

    <div class="panel panel-primary">
      <div class="panel-heading">
      お知らせ
      </div>
      <div class="panel-body">
      こんにちは!
      </div>
    </div>

    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

%e7%84%a1%e9%a1%8c

GNU Emacsを触ってみよう

mac os10では標準でunixコマンドラインにインストールされているので確認してみましょう。

mac-no-MacBook-Air:~ mac$ emacs --version
GNU Emacs 22.1.1
Copyright (C) 2007 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

emacsの起動は、emacs、終了はcommand+cです。
画面:
-window:画面
-buffer:タブ
-mode line:今開いているbufferの情報
-mini buffer:コマンドの情報
a

ファイルは、コマンドキーで、ctr-x, ctr-fで、ディレクトリが表示されるので、編集したいファイルを開きます。

b

移動は以下のコマンドでも動けます。
c-f
c-b
c-p
c-n
c-a
c-e

angular.js

angular.module('myapp', [])
    .controller('MainController', ['$scope', function($scope) {
        $scope.users = [
            {"name":"taguchi", "score":52.22},
            {"name":"tanaka", "score":38.22},
            {"name":"yamada", "score":11.11},
            {"name":"hayashi", "score":5.25},
            {"name":"tanahashi", "score":82.4},
            {"name":"yasuda", "score":55.21},
            {"name":"minami", "score":32.8},
            {"name":"yanagi", "score":72.2}
        ];
    }])
    .controller('UserItemController', ['$scope', function($scope) {
        $scope.increment = function() {
            $scope.user.score++;
        };
    }]);
<!DOCTYPE html>
<html lang="ja" ng-app="myapp">
<head>
    <meta charset="UTF-8">
    <title>Angularの練習</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    <script src="myscript.js"></script>
</head>
<body>
    <h1>AngularJSの練習</h1>
    <div ng-controller="MainController">
        <ul>
            <li ng-repeat="user in users" ng-controller="UserItemController">
                {{user.name}} {{user.score}}
                <button ng-click="increment()">+1</button>
            </li>
        </ul>    
    </div>
</body>
</html>

Rails textのインクルード

PHPのように、テキストをインクルードできます。
コントローラのアクションに記述した変数がビューに反映されて、ブラウザ上に変数値が表示されます。

/app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  	@message = "Hello, rails"
  	@txtmessage = "what's up?"
  end
end

続いてです。
/app/viws/top/index.html.erb

<h1><%= @message %></h1>
<p><%= @txtmessage %></p>

ブラウザを更新し、リクエストを送ります。
%e7%84%a1%e9%a1%8c

サーバーのWEBrickは起動したままにしましょう。

railsの起動

Railsのインストールが済んだら、コマンドプロンプトからアプリケーションを作成します。

C:\Users\hoge>cd \
C:\>mkdir rails
C:\>cd rails
C:\rails>rails new sakura
C:\rails>cd sakura
C:\rails\sakura>rails server

=> Booting WEBrick
=> Rails 4.2.7.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-10-25 04:13:56] INFO WEBrick 1.3.1
[2016-10-25 04:13:56] INFO ruby 2.3.1 (2016-04-26) [x64-mingw32]
[2016-10-25 04:13:56] INFO WEBrick::HTTPServer#start: pid=7256 port=3000

http://localhost:300 もしくは http://127.0.0.1:3000/ で、下記のようにrailsの初期画面が表示されたらインストール成功です。

ruby

画面上の「About your application’s environment」をクリックすると、状態が表示されます。

WEBrickは、Rubyで書かれたウェブサーバーで、Rubyをインストールすると一緒にインストールされます。ソースコードをウェブサーバーにアップロードすることなく、1台のパソコンでRailsアプリケーションの開発と動作確認ができます。

いったん Ctl + C でWEBrickを終了したら、作成したフォルダを見てみましょう。

字句解析

トークンごとに、その属性を表示します。文字種表も使います。識別子には英数字、下線を利用、先頭は英字が下線です。エスケープ文字や漢字、コメント機能もないものとします。

/*--------------------*/
/* 字句解析 token_p.cpp */
/*--------------------*/
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cctype>
using namespace std;

enum TknKind {
    Lparen=1, Rparen, Plus, Minus, Multi, Divi,
    Assign, Comma, DblQ,
    Equal, NotEq, Less, LessEq, Great, GreatEq,
    If, Else, End, Print, Ident, IntNum,
    String, Letter, Digit, EofTkn, Others, END_list
};

struct Token {
    TknKind kind;
    string text;
    int intVal;
    Token() { kind = Others; text = ""; intVal = 0; }
    Token(TknKind k, const string& s, int d=0){
        kind = k; text = s; intVal = d;
    }
};

void initChTyp();
Token nextTkn();
int nextCh();
bool is_ope2(int c1, int c2);
TknKind get_kind(const string& s);

TknKind ctyp[256];
Token token;
ifstream fin;

struct KeyWord {
    const char *keyName;
    TknKind keyKind;
};

KeyWord KeyWdTbl[] = {
    {"if", If }, {"else", Else },
    {"end", End},{"print", Print },
    {"(", Lparen}, {")", Rparen},
    {"+", Plus }, {"-", Minus },
    {"*", Multi },{"/", Divi },
    {"=", Assign}, {",", Comma },
    {"==", Equal }, {"!=", NotEq },
    {"<", Less }, {"<=", LessEq },
    {"", END_list},
};

int main(int argc, char *argv&#91;&#93;)
{
    if (argc == 1) exit(1);
    fin.open(argv&#91;1&#93;); if (!fin) exit(1);
    
    cout << "text kind intVal\n";
    initChTyp();
    for (token = nextTkn(); token.kind != EofTkn; token = nextTkn()){
        cout << left << setw(10) << token.text
        << right << setw(3) << token.kind
        << " " << token.intVal << endl;
    }
    return 0;
}

void initChTyp()
{
    int i;
    
    for(i=0; i<256; i++) { ctyp&#91;i&#93; = Others; }
    for(i='0'; i<='9'; i++){ ctyp&#91;i&#93; = Digit; }
    for(i='A'; i<='Z'; i++){ ctyp&#91;i&#93;=Letter; }
    for(i='a'; i<='z'; i++){ ctyp&#91;i&#93;=Letter; }
    ctyp&#91;'('&#93;= Lparen; ctyp&#91;')'&#93; = Rparen;
    ctyp&#91;'<'&#93;=Less; ctyp&#91;'>'] = Great;
    ctyp['+']= Plus; ctyp['-'] = Minus;
    ctyp['*']= Multi; ctyp['/'] = Divi;
    ctyp['_']= Letter; ctyp['=']= Assign;
    ctyp[',']= Comma; ctyp['"']= DblQ;
}

Token nextTkn()
{
    TknKind kd;
    int ch0, num = 0;
    static int ch = ' ';
    string txt = "";
    
    while (isspace(ch)){ ch = nextCh();}
    if (ch == EOF) return Token(EofTkn, txt);
    
    switch (ctyp[ch]){
        case Letter:
            for ( ; ctyp[ch]==Letter || ctyp[ch]==Digit; ch=nextCh()){
                txt += ch;
            }
    break;
    case Digit:
    for (num=0; ctyp[ch]==Digit; ch=nextCh()){
        num = num*10 +(ch-'0');
    }
    return Token(IntNum, txt, num);
    case DblQ:
    for (ch=nextCh(); ch!=EOF && ch!='\n' && ch!='"'; ch=nextCh()){
        txt += ch;
    }
    if (ch != '"'){ cout << "文字列リテラルが閉じていない\n"; exit(1);}
    ch = nextCh();
    return Token(String, txt);
default:
    txt += ch; ch0 = ch; ch = nextCh();
    if (is_ope2(ch0, ch)){ txt += ch; ch = nextCh();}
}
kd = get_kind(txt);
if (kd == Others){
    cout << "不正なトークンです:" << txt << endl; exit(1);
}
    return Token(kd, txt);
    }
    
    int nextCh()
    {
        static int c = 0;
        if (c == EOF) return c;
        if ((c = fin.get())== EOF) fin.close();
        return c;
    }
    
    bool is_ope2(int c1, int c2)
    {
        char s&#91;&#93; = "     ";
        if (c1=='\0' || c2 == '\0') return false;
        s&#91;1&#93; = c1; s&#91;2&#93;= c2;
        return strstr(" <= >= == != ", s) != NULL;
    }
    
    TknKind get_kind(const string& s)
    {
        for (int i =0; KeyWdTbl[i].keyKind != END_list; i++){
            if (s == KeyWdTbl[i].keyName) return KeyWdTbl[i].keyKind;
        }
        if (ctyp[s[0]] == Letter ) return Ident;
        if (ctyp[s[0]] == Digit) return IntNum;
        return Others;
    }