大量データ作成SQL

1000万レコードをテーブルにinsertする。

create table ITEM_INFO
(NO varchar(10),
YM varchar(6),
ID varchar(8),
PRDCT varchar(30),
PRICE varchar(32),
OTHER1 varchar(30),
OTHER2 varchar(30),
OTHER3 varchar(30),
OTHER4 varchar(30),
OTHER5 varchar(30),
OTHER6 varchar(30),
OTHER7 varchar(30),
OTHER8 varchar(30),
OTHER9 varchar(30),
OTHER10 varchar(30),
OTHER11 varchar(30),
OTHER12 varchar(30),
OTHER13 varchar(30),
OTHER14 varchar(30),
OTHER15 varchar(30),
OTHER16 varchar(30),
OTHER17 varchar(30),
OTHER18 varchar(30),
OTHER19 varchar(30),
OTHER20 varchar(30),
OTHER21 varchar(30),
OTHER22 varchar(30),
OTHER23 varchar(30),
OTHER24 varchar(30),
OTHER25 varchar(30),
OTHER26 varchar(30),
OTHER27 varchar(30),
OTHER28 varchar(30),
OTHER29 varchar(30),
OTHER30 varchar(30),
OTHER31 varchar(30),
OTHER32 varchar(30),
OTHER33 varchar(30),
OTHER34 varchar(30),
OTHER35 varchar(30),
OTHER36 varchar(30),
OTHER37 varchar(30),
OTHER38 varchar(30),
OTHER39 varchar(30),
OTHER40 varchar(30),
OTHER41 varchar(30),
OTHER42 varchar(30),
OTHER43 varchar(30),
OTHER44 varchar(30),
OTHER45 varchar(30),
OTHER46 varchar(30),
OTHER47 varchar(30),
OTHER48 varchar(30),
OTHER49 varchar(30)
);

--実行時間計測
set timing on

--1000万件登録
insert into ITEM_INFO
--最初のselectにはinsertしたい項目を羅列する
select
    --1000万までの連番
    i + j
    
    --ランダム日付
    ,to_char(
        -- 2016/01から2018/09のランダム月を取得(YYYYMM形式)
        TO_DATE('20160101','YYYYMMDD') + MOD(ABS(DBMS_RANDOM.RANDOM()), TO_DATE('20181001', 'YYYYMMDD') - TO_DATE('20160101', 'YYYYMMDD')) , 'YYYYMM')

    --連番を8桁で右X埋め
    ,rpad(to_char(i + j),8,'X')

    --以降は固定値を入れている
    ,'りんご'
    ,'138'
    ,'OTHER1'
    ,'OTHER2'
    ,'OTHER3'
    ,'OTHER4'
    ,'OTHER5'
    ,'OTHER6'
    ,'OTHER7'
    ,'OTHER8'
    ,'OTHER9'
    ,'OTHER10'
    ,'OTHER11'
    ,'OTHER12'
    ,'OTHER13'
    ,'OTHER14'
    ,'OTHER15'
    ,'OTHER16'
    ,'OTHER17'
    ,'OTHER18'
    ,'OTHER19'
    ,'OTHER20'
    ,'OTHER21'
    ,'OTHER22'
    ,'OTHER23'
    ,'OTHER24'
    ,'OTHER25'
    ,'OTHER26'
    ,'OTHER27'
    ,'OTHER28'
    ,'OTHER29'
    ,'OTHER30'
    ,'OTHER31'
    ,'OTHER32'
    ,'OTHER33'
    ,'OTHER34'
    ,'OTHER35'
    ,'OTHER36'
    ,'OTHER37'
    ,'OTHER38'
    ,'OTHER39'
    ,'OTHER40'
    ,'OTHER41'
    ,'OTHER42'
    ,'OTHER43'
    ,'OTHER44'
    ,'OTHER45'
    ,'OTHER46'
    ,'OTHER47'
    ,'OTHER48'
    ,'OTHER49'
from
  (
    with data2(j) as
    (
      select 0 from dual
      union all
      select j+10000 from data2 where j < 9990000
    )
    select j from data2
  ),
  (
    with data1(i) as
    (
      select 1 from dual
      union all
      select i+1 from data1 where i < 10000
    )
    select i from data1
);
commit;

結果

10,000,000 rows inserted.
Elapsed: 00:03:27.323

3分程。

ボットを作る(hubot + slack + heroku)

開発環境

vmware上のubuntu
macからemacsでファイルを編集する。

  • vmwareのubuntuを起動しておく
  • macのコンソールからの接続:
~ $ ssh  ユーザー名@サーバー名
  • macのemacsからの接続:
C-x C-f /ssh:ユーザー名@サーバー名:/home/ubuntu/workspace/

node.jsのインストール

  • まずはnode.jsのバージョン管理ツールnodebrew を導入する

ubuntuに接続しコンソールから

curl -L git.io/nodebrew | perl - setup
  • パスを通す
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.profile
  • .profileを読み込む
source ~/.profile
  • 確認
nodebrew
  • バージョンや使い方が表示されること。
  • nodebrewでnode.jsをインストールする
nodebrew install-binary v6.11.1
nodebrew use v6.11.1
  • コンソールからnpmをアップデート
npm update -g npm

必要なモジュールのグローバルインストールとボットの作成

  • モジュールのインストール
npm install -g yo@1.8.5 --ひな形作成ツール (ジェネレーター) 
npm install -g generator-hubot --Yeoman を利用した Hubot のジェネレーター。Hubotはボットを作成するためのフレームワーク
npm install -g coffee-script@1.12.4 
  • ボットを作成するコマンドを実行する
cd ~/workspace
mkdir myownhubot
cd myownhubot
yo hubot

基本的にYでOK。アダプターだけslackにしてEnter。

? Bot adapter (campfire) slack

ボットでの処理をJavascriptで書くためにコンソールからファイル作成

touch scripts/hello.js
  • hello.jsを書く
'use strict';
//robotという引数を持つ無名関数をモジュールとしている。 
module.exports = (robot) => {
    //HubotのAPIの利用方法が以下。
    ///hello>/iは正規表現。マッチしたら次に渡す無名関数を実行するという形式。
    //msgオブジェクトからユーザーの名前を受け取り、「hello,ユーザー名」と発言する。
    robot.hear(/hello>/i, (msg) => {
    const username = msg.message.user.name;
    msg.send('hello, ' + username);
    });
};
  • 書いたらボットをslackのアダプターなしで動かしてみる

コンソールから

cd ../
chmod a+x bin/hubot
bin/hubot

とりあえず以下のような感じになる。ユーザーがShellになっている。

npm WARN hubot-help@0.2.2 requires a peer of coffee-script@^1.12.6 but none was installed.
npm WARN hubot-slack@4.5.3 requires a peer of hubot@^2.0.0 but none was installed.
body-parser deprecated undefined extended: provide extended option node_modules/hubot/src/robot.js:445:21
No history available
myownhubot> [Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] INFO /home/ubuntu/workspace/myownhubot/scripts/hello.js is using deprecated documentation syntax
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.

Your hubot-scripts.json is empty, so you just need to remove it.
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] ERROR hubot-heroku-keepalive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web.url | cut -d= -f2)`
[Mon Aug 06 2018 13:31:24 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
hello>
myownhubot> hello, Shell
  • 次にslack でhubotを動かす
  • slackで開発用のworkspaceを作成する
  • https://slack.com/からメールアドレスを入力しGetStarted、新しいworkspaceを作成する
  • 諸々入力する
  • メールが来たらslackにログインする
  • チャンネルの横のマーククリックしてチャンネルを作成する

slackの設定を行う

https://slack.com/services/new
  • 上記から検索欄にhubotと入力する。出てきたhubotをクリックすると設定ページが表示されるのでinstallをクリックする。
  • ユーザー名を適当に入力。
  • APIトークンを控えておく(パスワードみたいなものなので公開しないように注意)
HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • インテグレーションの保存をクリックする。
  • 次にこのボットを反応させたいチャンネルに参加させる。
  • 先程のチャンネルに参加させる。作成したslackのチャンネルに入る。歯車ボタンから「新しいユーザーを招待する。」を選択。

先ほど作成したボットの名前を入力しinvite.設定は以上。

ボットを起動する

コンソールから

env HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bin/hubot --adapter slack

これで起動した状態になる。
slackのbotチャンネルでhello>と入力して動作確認。

ボットを常時起動させておくことができるようにHerokuを使う

https://www.heroku.com/
  • アカウントを作成する。
  • コンソールからHeroku CLIをインストールする(herokuコマンドが使えるようになる)
wget -O- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  • 確認
heroku --version
heroku-cli/6.15.13-3dce47c (linux-x64) node-v9.3.0
  • Heroku CLI から Heroku にログインする。
  • コンソールから
heroku login
  • 下記のように表示されればログイン完了
Logged in as メールアドレス

githubに新しくリポジトリを作成する。

https://github.com/new

必要な項目を入力して「Create repository」ボタンをクリック
…or create a new repository on the command lineをコンソールにコピペして実行

  • 他のファイルもpushする
  • herokuで動かすための設定ファイルProcfileを作成する。
  • Procfile
web: bin/hubot --adapter slack
  • ProcfileはHeroku がアプリケーションを動作させる際に「どのようなコマンドを実行するか」を認識するための設定ファイル。
  • サーバーの用意をする。これをやるのは一回だけ。
$ heroku create

デプロイ

git push heroku master
  • トークンはherokuのコマンドで登録する。ダブルクォートで囲う。
heroku config:set HUBOT_SLACK_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  • 確認
heroku config:get HUBOT_SLACK_TOKEN

動作確認

slackのチャンネルからhello>と発言してみる

  • なにか変更したらgit push heroku masterする
  • herokuの再起動はコンソールからheroku restart アプリ名

SeleniumとPhantomJSの環境構築

Docker上にUbuntuの構築

$ docker pull ubuntu:16.04
$ docker run -it ubuntu:16.04

Python3とSeleniumのインストール

 apt-get update
 apt-get install -y python3 python3-pip
 pip3 install selenium
 pip3 install beautifulsoup4

PhantomJSのインストール

apt-get install -y wget libfontconfig
mkdir -p /home/root/src && cd $_
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin/

日本語フォントが表示されるようにする

apt-get install -y fonts-migmix
cat <<EOF > /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
	<match target="pattern">
		<test qual="any" name="family">
			<string>serif</string>
		</test>
		<edit name="family" mode="assign" binding="strong">
			<string>MigMix 2P</string>
		</edit>
	</match>
</fontconfig>
EOF

Dockerをコミットしておく

exit
docker ps -a
docker commit (コンテナID) ubuntu-phantomjs

コンテナ起動

$ docker run -it -v $HOME(ホストのパス):$HOME(コンテナのパス) \
> -e LANG=ja_JP.UTF-8 \
> -e PYTHONIOENCODING=utf_8 \
> ubuntu-phantomjs /bin/bash

動作確認

seleniumu-capture.py

from selenium import webdriver

url = "http://www.aozora.gr.jp/cards/000081/files/46268_23911.html"

#PhantomJSのドライバを得る
browser = webdriver.PhantomJS()
#暗黙的な待機を最大3秒行う
browser.implicitly_wait(3)
#URLを読み込む
browser.get(url)
#画面をキャプチャしてファイルに保存
browser.save_screenshot("Website.png")
#ブラウザを終了
browser.quit()
cd $HOME(コンテナのパス)
python3 selenium-capture.py 

実行結果

Website.pngが出来上がる

pythonとかdocker

作業の覚書

python

  • emacsでpythonが自動補完できるように設定
$ sudo easy_install pip
$ sudo pip install virtualenv
    • init.el追記
(require 'python-mode)
(setq auto-mode-alist (cons '("\\.py\\'" . python-mode) auto-mode-alist))

(require 'jedi)
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
  • macにdockerをインストール
  • dockerにPython3とanacondaの環境を整備
$ docker pull continuumio/miniconda3
$ docker run -i -t continuumio/miniconda3 /bin/bash
$ docker ps -a
$ docker commit ef08836ef1b2 mlearn:init
$ docker images
$ docker run -i -t mlearn:init /bin/bash
$ docker run -i -t -v {ホストOSのカレントディレクトリ}:/home mlearn:init /bin/bash

サーバーサイド(node.js)

  • Expressのhelmetモジュールの動作確認

Expressのセキュリティ設定

helmetモジュールでHTTPに於ける脆弱性となるヘッダを取り除く

対応前の確認

  • プロジェクトの生成とExpressに必要なnpmパッケージのインストール
$ express express-helmet
$ cd express-helmet/
$ npm install
  • サーバーの起動
$ DEBUG=express-hlmet:* PORT=8000 npm start

デベロッパーツール→Network→再読込み→localhost選択→Headersタブを見ると、
X-Powered-By:Expressと書かれており、このWebサービスがExpressで開発されていることが分かってしまう。
もしExpressに脆弱性があるとわかったときに攻撃対象にされる危険性がある。
このためX-Powered-Byというヘッダは送信しないほうが安全。

helmetのインストール

$ npm install helmet --save

app.jsの修正

  • モジュールの読み込みとappオブジェクトのuse関数でhelmetを使うようにする
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
+var helmet = require('helmet');

var index = require('./routes/index');
+var users = require('./routes/users');

対応後の確認

  • サーバー起動
$ DEBUG=express-hlmet:* PORT=8000 npm start

デベロッパーツール→Network→再読込み→localhost選択→Headersタブ
X-Powered-By:Expressが消える

まとめ

フレームワークによって自分で実装しなくて済む

node.jsのフレームワークを導入する

ジェネレーターのインストール&必要なファイルの作成

$ npm install -g express-generator
/home/ubuntu/.nodebrew/node/v4.7.0/bin/express -> /home/ubuntu/.nodebrew/node/v4.7.0/lib/node_modules/express-generator/bin/express-cli.js
+ express-generator@4.15.5
added 6 packages in 0.99s
$ cd workspace/$ express express-study

  warning: the default view engine will not be jade in future releases
  warning: use `--view=jade' or `--help' for additional options


   create : express-study
   create : express-study/package.json
   create : express-study/app.js
   create : express-study/public
   create : express-study/routes
   create : express-study/routes/index.js
   create : express-study/routes/users.js
   create : express-study/views
   create : express-study/views/index.jade
   create : express-study/views/layout.jade
   create : express-study/views/error.jade
   create : express-study/bin
   create : express-study/bin/www
   create : express-study/public/javascripts
   create : express-study/public/images
   create : express-study/public/stylesheets
   create : express-study/public/stylesheets/style.css

   install dependencies:
     $ cd express-study && npm install

   run the app:
     $ DEBUG=express-study:* npm start

npmモジュールのインストール

cd express-study
npm install

起動

$ DEBUG=express-study:* PORT=8000 npm start

> express-study@0.0.0 start /home/ubuntu/workspace/express-study
> node ./bin/www

  express-study:server Listening on port 8000 +0ms
  • 「npm スクリプト名」 というコマンドでpackage.jsonで設定されたコマンドが実行される。package.jsonにはこんな箇所がある。
"scripts": {
    "start": "node ./bin/www"
  },

アクセスしてみると雛形ページが表示される

http://localhost:8000/

f:id:sattamassagana:20180204201655p:plain

試しにExpressのdebugモジュールの機能を使ってみる

  • app.jsの先頭に追加する
'use strict';

const debug = require('debug');//debugモジュールを読み込む
const debugInfo = debug('app:info');//module:infoという設定のロガーdebugInfoを用意
setInterval(() => {//1000msごとに関数を実行する
    debugInfo('some information');
}, 1000);

const debugError = debug('app:error');//別の設定のロガーdebugErrorを用意
setInterval(() => {
    debugError('error!');
}, 2000);
  • 実行(複数ログ出力するにはカンマで繋げてコマンドを実行する)
$ DEBUG=express-study:*,app:* PORT=8000 npm start

> express-study@0.0.0 start /home/ubuntu/workspace/express-study
> node ./bin/www

  express-study:server Listening on port 8000 +0ms
  app:info some information +907ms
  app:error error! +997ms
  app:info some information +9ms
  app:info some information +1s
  app:error error! +990ms
  app:info some information +13ms
  app:info some information +1s
  app:error error! +987ms
  app:info some information +14ms
  app:info some information +1s
  app:error error! +985ms
  app:info some information +17ms
  app:info some information +1s
  app:error error! +982ms
  app:info some information +23ms
  app:info some information +1s
  app:error error! +978ms
  app:info some information +25ms

Emacsでタグジャンプできるようにする

インストールなど

  • GLOBALというのが必要
  • GLOBALの対応言語を増やすのにPygmentsというのが必要
  • macなら以下で済む
$ brew install global --with-exuberant-ctags --with-pygments
$ export GTAGSLABEL=pygments

任意の場所でgtag実行

/usr/local/var/www/htdocs $ gtags

確認

  • 例えばcreateDatの定義箇所
/usr/local/var/www/htdocs $ global -ax -t createDat
createDat	/usr/local/var/www/htdocs/typing.js	43
  • 例えばcreateDatを使っている箇所
/usr/local/var/www/htdocs $ global -ax -r createDat
createDat         104 /usr/local/var/www/htdocs/typing.js     createDat();

できてるようだ

Emacs側

  • helm-gtagsパッケージ のインストール
  • init.elに追記
;;Emacsからgtagsを使えるようにする
;; customize
(custom-set-variables
 '(helm-gtags-path-style 'relative)
 '(helm-gtags-ignore-case t)
 '(helm-gtags-auto-update t))
;; key bindings
(eval-after-load "helm-gtags"
  '(progn
     (define-key helm-gtags-mode-map (kbd "M-t") 'helm-gtags-find-tag)
     (define-key helm-gtags-mode-map (kbd "M-r") 'helm-gtags-find-rtag)
     (define-key helm-gtags-mode-map (kbd "M-s") 'helm-gtags-find-symbol)
     (define-key helm-gtags-mode-map (kbd "C-c <") 'helm-gtags-previous-history)
     (define-key helm-gtags-mode-map (kbd "C-c >") 'helm-gtags-next-history)
     (define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)))

使う時

  • ファイルを開く
  • M-x helm-gtags-modeする
  • 関数などにカーソルを合わせる
  • M-tやM-rで
Find Reference: (default "なんとかかんとか")

と聞かれるのでEnterするとジャンプする

iTuenes 12.7にアップグレードしたら起動しなくなったのでiTunes12.6にダウングレードして起動できるようにする

環境

  • MacBook Pro(13-inch, 2017)
  • iTunesライブラリはNAS(I-O DATA HDL2-AAシリーズ)で管理

現象

アップデートの表示が出ていたのでアップデートしたところ、iTunesがフリーズして一向に起動しない。
iTunes再起動やOS再起動しても解決しないのでiTunes12.6にダウングレードする。

iTunes12.6にダウングレードする方法

現在のiTunes(12.7)を一旦削除してiTunes12.6をインストールしたいところだが、iTunesはゴミ箱に入れようとしても「“iTunes.app”はmacOSで必要なため、変更または削除できません。」とメッセージが表示される。
f:id:sattamassagana:20170923113100p:plain
このため、ターミナルからiTunesを削除する必要がある。

  • ターミナルを起動する。
  • Aplicationsフォルダに移動するため、ターミナルに次のように入力し、return
cd /Applications/
  • 次のコマンドを入力し、iTunesを削除する。
sudo rm -rf iTunes.app/


残りはFinderからの作業になる。

  • Finderから ~/Music/iTunes/ フォルダに移動し、“iTunes Library.itl”というファイルをデスクトップか、わかり易い場所にコピーしておく(バックアップのため)。
  • “Previous iTunes Libraries”フォルダの中から最も最近の日付が書かれたiTunesライブラリファイルを見つける。iTunesを12.7にアップグレードする前なので例えば“iTunes Library 2017-09-12.itl”などという名前になっているはず。
  • 見つけた“iTunes Library 2017-09-12.itl”を~/Music/iTunes/ フォルダにコピーする。
  • 次に“iTunes Library 2017-09-12.itl”を“iTunes Library.itl”に「名前を変更」する。
  • アップルサポートにアクセスし、“iTunes 12.6.2”をダウンロード、インストールする。

アップル - サポート - ダウンロード

  • これでiTunes12.6にダウングレードし起動できるようになった。

JUnitチュートリアル

アジャイルソフトウェア開発の奥義 第2版

アジャイルソフトウェア開発の奥義 第2版

  • 作者: ロバート・C・マーチン,Robert C. Martin,瀬谷啓介
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2008/07/01
  • メディア: 単行本
  • 購入: 18人 クリック: 586回
  • この商品を含むブログ (71件) を見る

内容

JUnitとは何なのか、JUnitでユニットテストの実行をしてみる。

環境

JDK8
Eclipse(Neon)
macOS

プロジェクトの準備

ファイル
→新規
→Javaプロジェクト
→junit-tutorialを作成

通常はテストコードとプロダクションコードは別のソースフォルダに配置する。
このため、テストコードを作成するためのソースフォルダ「test」を作成する。

f:id:sattamassagana:20170225221829p:plain

プロジェクトのコンテキストメニューから
→ビルドパス
→新規ソースフォルダを選択
→フォルダ名を「test」にする

テスト対象クラスの作成

■テストクラス
テストプログラムを記述するクラス
■テスト対象クラス
テストされるクラス
下記のようなクラスを作成する。これがテスト対象クラス。
Calculator.java

package junit.tutorial;

public class Calculator {
public int multiply(int x, int y){
	return x * y;
}
public int divide(int x, int y){
	return x / y;
			}
}

テストクラスの作成

パッケージエクスプローラーで右クリック
→新規
→JUit
→JUnit Test Case
ソースフォルダをjunit-tutorial/testにする
テスト元クラスをjunit.tutorial.Calculatorにする

下記のようなクラスが作成される。これがテストクラス。
CalculatorTest.java

package junit.tutorial;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {

	@Test
	public void test() {
		fail("Not yet implemented");
	}

}

テストの実行

この段階ではまだテストが実装されていないが、一旦実行してみる。
CalculatorTestのコンテキストメニューから実行-JUnitテストを選択する。
f:id:sattamassagana:20170226205003p:plain
1件のテストを実行し、1件が失敗したことを確認できる。

乗算メソッドのテストコードを書く

テストメソッドを作成するときは、はじめにそのテストで何を検証したいのかを検証する。
ここでは「テスト対象クラスのmultiplyメソッドで乗算結果が取得できる」ことを検証する。

  • JUnitのルールに注意する
    • テストクラスはpublicクラスとする
    • テストメソッドはorg.junit.Testアノテーションを付与したpublicメソッドとする
    • テストメソッドは戻り値がvoidであり、引数を持たない
    • テストメソッドのthrows句は自由に定義できる
    • テストクラスにはいくつでもテストメソッドを定義できる
    • テストメソッド名は、そのテストの概要がわかる名前にする

まずは「3と4を引数としてmultiplyメソッドを実行し、取得された値が12である」ことを検証する。

CalculatorTest.java

package junit.tutorial;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {

//	@Test
//	public void test() {
//		fail("Not yet implemented");
//	}

	// テストコードの追加
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		//JUnitではorg.junit.AssertクラスのassertThatメソッドを使って
		//「あるテスト対象クラスのメソッドを実行したときに、戻り値などで取得した
		//実際の値と、期待される値が一致する/しないはずである」という宣言で構成される(アサーション)
               //assertThatはAssertクラスに定義sれたstaticメソッド。1つめの引数が実測値、2つめの引数が期待値。
		assertThat(actual, is(expected));
	}

}

実行する
f:id:sattamassagana:20170226212110p:plain
実行1、エラー0、失敗0となった。
また、グリーンバーになっている。
これで「3と4を引数としてmultiplyメソッドを実行し、取得された値が12である」ことが確認できた。

2つめのテストを追加する

テストが失敗した場合の動作を確認してみる。
CalculatorTest.java

package junit.tutorial;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}
  //テストコード追加その2
	@Test
	public void multiplyTest5x7equals35() {
		Calculator calc = new Calculator();
		int expected = 12;//35が正しい期待値
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}

}

これを実行するとテストが失敗する。
AssertionErrorに「期待値が<12>なのに<35>でした。」とのメッセージ。
f:id:sattamassagana:20170304174806p:plain
Failure Traceにはテスト失敗時のスタックトレースが表示されており、行を
ダブルクリックすることでそのクラスのソース箇所に移動できる。
今回はテストコードの方に不具合があるため、これを修正して再度実行する。
CalculatorTest.java

package junit.tutorial;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}

	@Test
	public void multiplyTest5x7equals35() {
		Calculator calc = new Calculator();
		int expected = 35;//テストコードを修正
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}

}

f:id:sattamassagana:20170304173950p:plain
2つともグリーン。

windows10 + emacs + oracleでの文字化け

環境

emacsインストール済み
windows10インストール済み
oracle12cインストール済み

問題

emacsからM-x sql-oracleしてsql-plusをバッファに表示させると文字化けしている

対策

oracleのキャラクタセットを確認
sql-plusから
select * from NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET を確認するとJA16SJISTILDEとなっていた。これはoracleのインストール時に決めるもので後から変えられないらしい。
この場合は環境変数NLS_LANGにJAPANESE_JAPAN.JA16SJISTILDEを設定する必要がある。
システム環境変数の編集→詳細設定タブ→環境変数→システム環境変数で新規→変数名にNLS_LANG、変数値にJAPANESE_JAPAN.JA16SJISTILDE
を設定しOK→OK→OK→windows再起動

結果

emacsからM-x sql-oracle、文字化けしていない。しかし、今度はコマンドプロンプトの方が文字化けしている。

断念

・コマンドプロンプトからsqlplus使わない

JVMのソースコードを読むための準備

JDK/JRE/JVM

JVMとは

Javaバイトコードとして定義された命令セットを実行するスタック型の仮想マシン(Java Virtual Machine) 。JRE(Java Runtime Environment)に入っている。

JREとは

Java実行環境。JVMやAPIが入っている。

JDKとは

Java開発キット(Java Development Kit)。JREが入っている。

具体的に何が入っているのか確かめる

ソースコードを取得する

OpenJDKはMercurialというソースコード管理システムで管理されている。Mercurialをインストールする(ubuntu)

パッケージのダウンロード

sudo apt-get install mercurial

ソースコードを取得するにはターミナルから下記を実行(jdk8)

hg clone http://hg.openjdk.java.net/jdk8/jdk8

するとjdk8というフォルダがhome以下にできる

この時点でフォルダの中を見てみると、makefileや.cファイルの存在を確認できる。まだ.javaファイルはない。
ターミナルからjdk8の中に入り、get_source.shを実行するとソースコードを全て取得できる。

JavaScript スタイルシートを操作する②

<link rel="stylesheet" type="text/css" href="style.css"/>
<script type="text/javascript">
 //className.html
 //外部スタイルシートで定義されたスタイル(スタイルクラス)にアクセスするには
 //classNameプロバティを使用する。
 function changeStyle(elem, clazz){
     //指定要素に対して、スタイルクラスclazzを適用する
     elem.className = clazz;
 }
</script>

<div onmouseover="changeStyle(this, 'highlight')"
     onmouseout="changeStyle(this, 'normal')">
    マウスを乗せると色が変わります。</div>
/*style.css*/
.Highlight{
    Background-color: Pink;
}
.normal{
    Background-color: White;
}

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

JavaScript スタイルシートの操作①

<script type="text/javascript">
 //JavaScriptからスタイルシートを操作①
 
 //インラインスタイルにアクセスする。<div>タグにマウスポインタを載せたタイミングで背景色をピンクに、外したタイミングで下の白色に切り替える。
 function changeStyle(elem, color){
     elem.style.backgroundColor = color;
 }
</script>

<div onmouseover="changeStyle(this, 'Pink')"
     onmouseout="changeStyle(this, 'White')">
    マウスを乗せると色が変わります。</div>

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

JavaScript 新規にノードを追加する

<script type="text/javascript">
 //新規にノードを追加する
 
 //フォームに入力した内容を下にページ下部に対応するリンクを追加する
 //追加ボタンをクリックしたタイミングで実行されるadd関数
 function add(f){
     //<a>タグを生成
     var anchor = document.createElement('a');
     //<a>タグのhref属性を設定
     anchor.href = f.url.value;
     //テキストノードを生成し、<a>タグの直下に追加
     var name = document.createTextNode(f.name.value);
     anchor.appendChild(name);
     //<br>タグを生成
     var br = document.createElement('br');
     //<div id="list">を取得
     var list = document.getElementById('list');
     //<div>タグ直下に<a>,<br>タグの順番で追加
     list.appendChild(anchor);
     list.appendChild(br);
 }
</script>

<form>
    <label>サイト名:<br />
        <input type="text" name="name" size="30"/></label><br />
        <label>URL:<br />
            <input type="text" name="url" size="50"/></label><br />
            <input type="button" value="追加" onclick="add(this.form)"/>
</form>
<div id="list"></div>

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで