Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

railsその0003-011 第九章、第十章完了

rails 5のチュートリアルをやってみる日記です。

今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。

昨日と今日で第九章、第十章のコード書き終えました。

永続的ログイン、ユーザー情報の更新、ユーザーの削除などができるようになりました。

第八章あたりからか、ただコピペして、動くかとかテストがGREENになるかだけで精一杯な感じになりつつあるのでいよいよつらい。

一通りやり終えたらコピペしてきたコードを読んで理解しないと意味無いけど、まずは先に進みます。

railsその0003-010 第七章、第八章完了

rails 5のチュートリアルをやってみる日記です。

今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。

第七章、第八章のコード書き終えました。

会員登録、ログイン、ログアウトができるようになりました。

railsその0003-009 第六章完了

今日の日記

rails 5のチュートリアルをやってみる日記です。

今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。

第六章のコード書き終えました。

Userモデルを作成して、name、email、passwordフィールドのバリデーションとそのtestを作成やパスワードのハッシュ化など実装しました。

webpack3.x+vue.js 2.x+vue-loaderでビルド環境を構築する

参考にさせて頂いたページ

Vue.js Vueコンポーネントのユニットテストを書いてみよう - Qiita

過去に書いたhtml-loaderを使う記事

webpackを使ってES2015、Vue.jsのビルド環境を構築する - Motomichi Works Blog

今日の環境

  • Windows10
  • node v8.9.3
  • npm 5.6.0
  • webpack 3.10.0

プロジェクトディレクトリを作成

任意のディレクトリ名で良いのですが、frontendディレクトリを作成することにします。

mkdir frontend

以降のコマンドはfrontendディレクトリで実行していきます。

npm init

まずnpm initして、適当にenterしますが、エントリーポイントだけmain.jsにしました。
以下のような感じにしています。

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes

グローバルにインストール

npm install -g webpack babel

プロジェクトにインストール

npm install --save-dev webpack vue-loader vue-template-compiler babel-core babel-loader babel-preset-es2015
npm install --save vue

今回frontendディレクトリ内に作成するディレクトリ構造とファイル

  • index.html
  • package.json
  • package-lock.json
  • webpack.config.js
  • node-modules/*
  • src/main.js
  • src/App.vue
  • src/components/HelloWorld.vue
  • result/bundle.js

webpack.config.jsの作成とその記述内容

const path = require('path');

module.exports = {
  entry: './src/main.js',
  output: {
    path: `${__dirname}/result`,
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {
        loader: 'babel-loader',
        exclude: /node_modules/,
        test: /\.js[x]?$/,
        query: {
            cacheDirectory: true,
            presets: ['es2015']
        }
      },
      {
        test: /\.vue$/,
        loader: "vue-loader"
      },
    ]
  },
  resolve: {
    modules: [path.join(__dirname, 'src'), 'node_modules'],
    extensions: ['.js', '.vue'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
  },
  plugins: []
}

./src/main.jsの作成とその記述内容

import Vue from 'vue';
import App from './App';

Vue.config.productionTip = false;

/* eslint-disable no-new */
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
});

./src/App.vueの作成とその記述内容

<template>
  <div id="app">
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld'

export default {
  name: 'app',
  components: {
    HelloWorld
  }
}
</script>

./src/components/HelloWorld.vueの作成とその記述内容

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

index.htmlの作成とその記述内容

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<title>vue-tutorial</title>
</head>
<body>
<div id="app">
</div>

<script type="text/javascript" src="result/bundle.js"></script>
</body>
</html>

watchしてコンパイルしてみる

webpack -d --watch

ここまでやってのpackage.jsonの内容

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "vue-loader": "^13.6.1",
    "vue-template-compiler": "^2.5.13",
    "webpack": "^3.10.0"
  },
  "dependencies": {
    "vue": "^2.5.13"
  }
}

ページを見てみる

index.htmlをブラウザで開いて確認します。

Welcome to Your Vue.js Appという文字列が表示されました。

今日はここまで。

railsその0003-008 第五章完了

今日の日記

rails 5のチュートリアルをやってみる日記です。

今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。

平日の電車の中とか寝る前とかにコツコツ読んで、読み終えました。

第五章のコード書き終えました。

routes.rb書いたり、rails test:integrationとかしました。

絵を描くことについて考えてみる その0003 写真や絵を線で分割してから模写する

はじめに

絵心が無いとはよく見聞きしますが、多くの場合は以下の2点が大きな要因であると考えています。

  • 絵を描くための学習、練習に費やした時間が少ない
  • 費やしている時間は多いが効果的な学習方法、練習方法でない

効果的な学習方法、練習方法とはどういうものか自分なりに考えたりして文書化しています。

分割する

今日は写真や絵を分割して、模写しやすい単位に落とし込んでから模写するという事について書きます。

例えばこのような写真があったとします。

f:id:motomichi_works:20171201200504j:plain

これをそのままそっくりに模写するのは大変です。

でも写真に線を引いて、64分割ぐらいしたらどの指がどのあたりにあるか、誰にでもわかりやすくなります。

256分割したらもっとわかりやすくなります。

写真と同じ縦横比の紙に線を引いて、256分割したら手の形状ぐらいならかなり正確に模写ができそうです。

座標を測って線を引いているだけとも言えますが。

写真だとちょっと難しいかもしれませんが、好きな漫画の一コマだと輪郭線がはっきりしていて、16分割とかそのぐらいでも模写しやすそうですね。

JSでテストコードを書く その0002-02 sinon.jsのstubでapiのテストを書いてブラウザでテストを実行する

参考にさせて頂いたページ

以前書いた記事

mochaとchaiを使うことについて以前書いた記事です。
この続きという感じでsinon.jsのstubを使っていきます。

前提としてこちらを読んでおくと解りやすいかもしれません。

jQueryとsinonをインストールする

npm install --save-dev jquery sinon

package.jsonのdevDependenciesは以下の4つになりました。

  "devDependencies": {
    "chai": "^4.0.1",
    "jquery": "^3.2.1",
    "mocha": "^3.4.2",
    "sinon": "^4.1.2"
  }

例えばapplication.jsにmyObjを追記する

application.jsに以下のようなmyObjを書いたことを想定してテストケースも書いていきます。

jQueryの$.ajax()でhttps://example.com/hogeAPIにリクエストを送信するオブジェクトです。

window.myObj = {
  request: function() {
    return $.ajax({
      url: 'https://example.com/hoge',
      type: 'GET',
      dataType : 'text',
    });
  },
  successFn: function(response){
    console.log(response);
  },
};

js_testing/spec/example_com_hoge_api.spec.jsの作成とその記述内容

describe()とit()はmochaの関数で、chai.assert.strictEqual()はchaiのメソッドです。
sinonをインストールしたのでstub()が使用できます。

describe('example.com/hoge apiへのリクエスト', function() {

  it('apiが文字列"hoge"を返す', function() {
    var stub = sinon.stub(window.myObj, 'request');
    stub.returns({
      done: function(callback) {
        callback('hoge');
      }
    });

    window.myObj.request().done(function(data) {
      chai.assert.strictEqual('hoge', data);
      stub.restore();
    });

  });
});

js_testing/js_testing_0001.htmlに追記する

以下の三行を追記しました。

  • <script src="node_modules/jquery/dist/jquery.js"></script>
  • <script src="node_modules/sinon/pkg/sinon.js"></script>
  • <script src="spec/example_com_hoge_api.spec.js"></script>

以下の通りになりました。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="author" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--mochaによるテストの実行結果用cssを読み込み-->
<link rel="stylesheet" href="node_modules/mocha/mocha.css">
<link rel="shortcut icon" href="">
</head>
<body>

<!--mochaによるテストの実行結果が出力されるdiv-->
<div id="mocha">
</div>

<!--jquery, mocha, chai, sinon を読み込み-->
<script src="node_modules/jquery/dist/jquery.js"></script>
<script src="node_modules/chai/chai.js"></script>
<script src="node_modules/mocha/mocha.js"></script>
<script src="node_modules/sinon/pkg/sinon.js"></script>

<script>
//BDDスタイルを使用するので設定
mocha.setup('bdd');
</script>

<!--自分が作っているwebアプリケーションのjsを読み込み-->
<script src="js/application.js"></script>

<!--テストコードを読み込み-->
<script src="spec/add_numbers.spec.js"></script>
<script src="spec/example_com_hoge_api.spec.js"></script>
<script>
// テストを実行
mocha.run();
</script>

</body>
</html>

js_testing/js_testing_0001.htmlをブラウザで開いてテストを実行してみる

js_testing/js_testing_0001.htmlをChromeなどのブラウザで開いてテストを実行してみます。

テストはグリーンでした。

sinon.fakeServer.create()を使う方法も参考にさせて頂いたページに書いてありました。

書いてみたものの

これだと実際に使っているAPIやメソッドに対するテストケースではなくて、sinon.jsで代替APIを作ってテストしているに過ぎないので、非同期処理がからむ一連の挙動についてはspyでsetUpをしたらできるのか、実際のAPIselenium等でリクエストして返却される結果を検証する方が良いのかもうちょっと調査と理解が必要そう。

spyのsetUpとかjQueryajaxメソッドをテストする例については Spies - Sinon.JS を参照するのがよさそうです。

jasmine2とかtestdouble.jsとかではどうなんでしょうね。