あいつの日誌β

働きながら旅しています。

2018年春からフロントエンドを始める為の開発環境構築手順

あらすじ

春ですね。新人研修の準備をしましょう。

動作環境

babel-preset-env はこの記事を作成している時点では version 1 を使っています。しばらくすると version 2になるかもしれません。

% cat package.json                                                                     {
  "name": "practice-frontend",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-env": "^1.6.1",
    "http-server": "^0.11.1",
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.12"
  }
}

準備1: 静的サーバーを用意

mkdir practice-frontend && cd $_ 
mkdir dist
echo 'hello' > dist/index.html
yarn init -y  
yarn add http-server --save-dev 

localhost:8080 で静的サーバーを起動します。

yarn http-server dist

http://localhost:8080 にアクセスして hello が表示される事を確認します。

準備2: babel

mkdir src lib
touch .babelrc
yarn add babel-cli babel-preset-env --save-dev

.babelrc を作成します

{
  "presets": [
    ["env", {
      "targets": {
         "node": "v6.10",
         "ie": 11
      }
    }]
  ]
}

src/Dog.js を作成します。

export default class Dog {

  constructor(voice="bow wow") {
    this.voice = voice;
  }

  say() {
    return this.voice;
  }
}

トランスパイルします。

yarn babel -d lib/ src/

test.js を作成して node test.js を実行して動作を確認します。

var Dog = require('./lib/Dog').default;

var dog1 = new Dog();
var dog2 = new Dog('ruff ruff')

console.log(dog1.say())
console.log(dog2.say())

準備3: webpack 4

webpack は version 4から webpack と webpack-cli が別れたのでそれぞれを install します.

yarn add webpack webpack-cli --save-dev

webpack 4 からはある程度の規約がデフォルトで設定されるので webpack.config.js がなくても動作します。デフォルトではエントリーポイントが src/index.js となっています。先ほどの test.js と少し似ていますが src/index.js を用意します。

import Dog from './Dog';

var dog1 = new Dog();
var dog2 = new Dog('ruff ruff')

console.log(dog1.say())
console.log(dog2.say())

以下を実行すると dist/main.jsコンパイルされたファイルが出力されます。

yarn webpack --mode=development

以下のコマンドが動作することを確認します。

node dist/main.js

準備4: index.html を修正

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>test</title>
</head>
<body>
  hello world
<script type="text/javascript" src="main.js"></script>
</body>
</html>

この状態で yarn http-server dist を実行して http://localhost:8080 にアクセスしてデベロッパーコンソールなどで console.log が犬の鳴き声を出力している事を確認します。

http-server が cache を長くもっている(?)みたいなのでうまく表示されない場合は reload してみたりしてください。

まとめ

駆け足ですが最低限必要な開発環境を構築する手順を紹介しました。

webpack extensions の指定方法

hogehoge.jsrequire(‘hogehoge’) しているなら

resolve: {
  extensions: [".js"]
}

fugafuga.jsxrequire(‘fugafuga’) しているなら

resolve: {
  extensions: [".js", ".jsx"]
}

mogemoge.jsonrequire(‘mogemoge’)しているなら

resolve: {
  extensions: [".js", ".jsx", ".json"]
}

なんですが私は基本的には .js 以外は拡張子をつけて import したほうが良い気がします。つまり以下のようします。

require('hogehoge')
require('mogemoge.json');
require('mogemoge.scss');

webpack 2 以降は以下の記述でOK。

resolve: {
  extensions: [".js"]
}

ちなみに webpack 1 では拡張子無しで import する場合は以下のように空文字を記述していました。

resolve: {
  extensions: ["", ".js"]
}

おしまい

標準偏差の求め方

あらすじ

数学は思ったよりも人生に影響すると思ったので復習しようとおもいました。

標準偏差とは

下記URLをご覧ください。本記事はこちらを参考に Node.js を使って紹介しています。

https://atarimae.biz/archives/5379

標準偏差を求める

主に以下の手順で求めることができます。

  • 平均値を求める
  • 平均値から偏差を求める
  • 偏差から分散を求める

平均値を求める

以下のようなテスト情報があります。

const childMathTests = [
  {name: "A", value: 35},
  {name: "B", value: 55},
  {name: "C", value: 70},
  {name: "D", value: 80}
];

この生徒たちの平均値は以下の通り

(35 + 55 + 70 + 80) / 4 // 60

平均値から偏差を求める

各データの値から平均値を引いた値を求めます。これを偏差と呼びます。

35 - 60 === -25 // A
55 - 60 === -5  // B
70 - 60 === 10  // C
80 - 60 === 20  // D

求めた偏差を2乗します。

(35 - 60) ** 2 === 625
(55 - 60) ** 2 === 25
(70 - 60) ** 2 === 100
(80 - 60) ** 2 === 400

分散を求める

求めた偏差の2乗を合計して 4 で割ります。

(625 + 25 + 100 + 400) / 4 === 287.5

標準偏差を求める

分散の正の平方根を求めます。これがこの4人の数学の標準偏差です。

Math.sqrt((625 + 25 + 100 + 400) / 4) === 16.95582495781317

実装

Node.js では以下のように書けます

const childMathTests = [ 
  {name: "A", value: 35},
  {name: "B", value: 55},
  {name: "C", value: 70},
  {name: "D", value: 80} 
];

const values = childMathTests.map(x => x.value);

function sum(accumulator, currentValue) {
  return accumulator + currentValue;
}

function getStandardDeviation(values) {
  const average = values.reduce(sum) / values.length;
  const deviations = values.map(x => x - average);
  const dispersion = deviations.map(x => x ** 2).reduce(sum) / values.length;
  return Math.sqrt(dispersion);
}

console.log(getStandardDeviation(values));

実践

というわけでテスト結果からばらつきが多いテストかばらつきが少ないテストかを判断できるようになりました。

const childMathTestValues0316 = [0, 5, 10, 70, 80, 80, 82, 85, 93, 95];
const childMathTestValues0318 = [50, 52, 54, 60, 60, 60, 61, 61, 70, 72];

console.log(getStandardDeviation(childMathTestValues0316)); // 36.67151483099655
console.log(getStandardDeviation(childMathTestValues0318)); // 6.6783231428256

0316 はほとんどのが80点以上とっているもしくは一部の生徒が平均点を下げています。つまり平均点付近にあまりマッチする生徒がいない。 0318 はほとんどの人が平均点付近である点数にマッチしています。

両日のテストはどちらも平均点が60点です。どちらのテストも「平均点が60点のテストで70点もとった」という言い方ができます。

なんですがばらつきの多い 0316 ではほとんどの生徒が 80点を超えているので実はそんなにすごくないです。 0318 だと70点を超えている生徒が 2人しかいないのですごいと言えると思います。

まとめ

というわけで標準偏差は学校で習ったようですが(記憶にない)社会に出てから使う機会はないと思っていました。 なんですが使う機会がなかったわけではなく、応用が効く場面に遭遇してもそれを使えてなかった気がします。

そんなわけで久しぶりに数学を勉強してみました。こちらからは以上です。

補足: 平均偏差と標準偏差

偏差を2乗する理由は平均偏差ではばらつきを正しく把握できないケースがあるので、「離れれば離れるほど、ポイントを高くする」という手法が編み出されました。これが標準偏差。2乗して計算したものを平方根で元に戻しています。

MySQL が動かない The server quit without updating PID file

あらすじ

古い MacBook をテスト用のサーバーにしようと思い、OSを更新した後 MySQL を起動しようとしたら MySQL が立ち上がらなくなった。

.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/okamura-MacBook-Pro.local.pid).

というわけで brew uninstall mysqlbrew install mysql を実行。なんだけどうまくいかない。

ログを見る

どうやら initialize のときにすでにファイルがあって処理が中断されたっぽい

/usr/local/Cellar/mysql/5.7.21/bin/mysqld
--initialize-insecure
--user=okamuuu
--basedir=/usr/local/Cellar/mysql/5.7.21
--datadir=/usr/local/var/mysql
--tmpdir=/tmp

2018-03-11T11:29:18.826836Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --exp
licit_defaults_for_timestamp server option (see documentation for more details).
2018-03-11T11:29:18.830393Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting
.
2018-03-11T11:29:18.830489Z 0 [ERROR] Aborting

たぶん data directory を削除しておけばよかったらしい。削除した後は以下のコマンドでリトライできるっぽい。

Warning: The post-install step did not complete successfully
You can try again using `brew postinstall mysql`

そんなわけで

無事動きました。おしまい。

% sudo rm -fr /usr/local/var/mysql
% brew postinstall mysql
% mysql.server start
Starting MySQL                                                                                               . SUCCESS! 

ES6 の module exports の機能に関するクイズ

突然ですがクイズです。ES6 の module exports の機能として正しいものを選びなさい

問題1

関数毎に export されている場合

export const One = () => (
  <div>one</div>
)

export const Two = () => (
  <div>two</div>
)

以下の記述で呼び出しができる。マルかバツか?

import { One, Two } from '../components/Export'

問題2

export default でオブジェクトに包んで返している

const Three = () => (
  <div>Three</div>
)

const Four = () => (
  <div>Four</div>
)

export default { Three, Four }

以下の記述で呼び出しができる。マルかバツか?

import Default from '../components/ExportDefault'

Default.Three
Default.Four

問題3

export default で関数を返している

const Five = () => (
  <div>Five</div>
)

export default Five

以下の記述で呼び出しができる。マルかバツか?

import Default2 from '../components/ExportDefault2'

Default.Five

答え

以下で調べてみてください

create-react-app practice-es2015-exports && cd $_
getstorybook
mkdir src/components

Export.js

cat << EOS > src/components/Export.js
import React from 'react'
export const One = () => (
  <div>one</div>
)

export const Two = () => (
  <div>two</div>
)
EOS

ExportDefault.js

cat << EOS > src/components/ExportDefault.js
import React from 'react'
const Three = () => (
  <div>Three</div>
)

const Four = () => (
  <div>Four</div>
)

export default { Three, Four }
EOS

ExportDefault2.js

cat << EOS > src/components/ExportDefault2.js
import React from 'react'
const Five = () => (
  <div>Five</div>
)

export default Five
EOS

stories

cat << EOS > src/stories/index.js
import React from 'react';
import { storiesOf, action, linkTo } from '@kadira/storybook';
import { One, Two } from '../components/Export'
import Default from '../components/ExportDefault'
import Default2 from '../components/ExportDefault2'

storiesOf('Answer', module)
  .add('=>', () => (
    <div>
      <One />
      <Two />
      <Default.Three />
      <Default.Four />
      <Default2 />
    </div>
  )); 
EOS

たぶん module exports の挙動で最初は混乱する人が多いと思うのでそんな場合はこれを試してもらうとよいのではないでしょうか。

札幌へ3泊4日で働きながら旅をしてきた(後編)

札幌で出会った素敵なお店を紹介します

5坪

f:id:okamuuu:20171218143536j:plain

札幌で北海道に3店舗、六本木に1店舗展開するオイスターバー、札幌で最初に訪れた飲み屋さんです。名前の通り店内は狭いので座れる場所が限られていますが立ち食いも可能です。ただし店内での飲食は一杯ドリンクを頼む必要があります。ちなみに私は店内を利用したかったので開店と同時に入店しました。

利用した金額は、生ビール1杯(500円)と蒸し牡蠣3個(380円)の合計880円です。

私は他の店へも飲み歩きしたかったのでこれだけしか頼まなかったのですが、思ったより蒸し牡蠣が大きかったのと、なぜかサービスで蒸し牡蠣がもう1個サービスされたので思ったよりお腹いっぱいになってしまいました。おそらくですが最初の注文で蒸し牡蠣3個のセットを頼むともう一つおまけがつくのではないかと。

もっきりや

市内にはまだ雪が溶け切れずに残っていたのですが、市内を歩き回って雰囲気の良さそうな店を見つけて入店しました。

f:id:okamuuu:20171218145835j:plain

利用した金額は、生ビール、真だちのポン酢、ほっけめしの合計2080円です。ちなみにほっけめしには味噌汁がついていたので大分お得でした。なかなか美味しいうえにボリュームがありました。なおかつ低料金なのでなかなか使い勝手の良いお店だと思います。

二条市場: どんぶり茶屋

f:id:okamuuu:20171218152036j:plain

二条市場の近辺に宿泊していましたので、朝ごはんとしてサーモンづくし丼1,500円を食べました。おいしかったのですが、なんというか「築地でご飯を食べている感覚」に近かったです。値段が観光客向けだと思いますので二条市場でご飯食べる方はご留意下さい。

ちなみに二条市場の近辺に良さげな店がいっぱいあったのでお立ち寄りの際は近辺も散策してみることをお勧めします。

寿珈琲

二条市場の近くで今回の旅の宿泊先の近所でした。店内静かでくつろげます。二条市場の近くで軽食がとれて美味しいコーヒーが飲めるので重宝しました。夜遅くも営業しています。今回の旅で重宝したお店です。

回転寿しトリトン 豊平店

f:id:okamuuu:20171218154115j:plain

f:id:okamuuu:20171218154211j:plain

f:id:okamuuu:20171218154248j:plain

かんぶり、あじ、さんま、たち助けの味噌汁を頼んで合計1,314円でした。札幌で人気のある回転寿司は観光客が殺到するので市内から少し離れた豊平店へ行きました。コストパフォーマンスがとても良かったです。

ソリュ

f:id:okamuuu:20171218154737j:plain

外観が気になったので入ってみました。ちょっとお値段のするお店なのですが雰囲気がいい感じでした。生ビールと生牡蠣で1800円ぐらい。ローストビーフを頼みたかったのですが30分かかるとの事なので断念して次の店へ移動しました。

sakanova

f:id:okamuuu:20171218154913j:plain

立ち飲みBAR今回の旅行でご飯とお酒と店の雰囲気が良かったお店の一つ。カクテルがやたら度数が強くて「度数やたら強いけどこれは札幌の標準なのか?」と聞いた所オーナーが度数が強くなければ酒ではないという主義らしく、こちらのお店では通常 30ml のところを 40ml にしているとのこと。こちらの店は酒少し強いのでもし訪問される場合はお気をつけください。

生ビール、ジントニック、ラムコーク、タコとセロリの和え物、ジンギスカンで3000円ぐらい

ビアセラーサッポロ

f:id:okamuuu:20171218155031j:plain

ビール(500円)、ソーセージ(880円)、フルーツビール試飲(無料)で1,380円

ビールの立ち飲みの店。訪問時間が早くてお客さんほとんどいなかったのですがおしゃれなお店でした。フルーツビールの試飲を勧められたので頂きました。とても美味しかったです。ビール専門店なのですがフルーツビールなどは女性が好きそうな予感がします。ちょっと街の中心部から離れています。

鮨 裏・たかの

f:id:okamuuu:20171218155151j:plain

入り口が美容室にしか見えない場所にある飲み屋さん。こちらは日本酒のお店です。こちらのブログを見て訪問。まず千円でチケットを10毎購入します。そのうち3毎がお通し代となるので最初は7毎のチケットがもらえます。欲しい食べ物があれば都度チケットを購入するシステムです。系列店でも使えるそうです。

お通し代(300円)、日本酒(600円)、ウニとかにのとびっこ鮨(800円)、あぶらそば(300円)、合計で2,000円

f:id:okamuuu:20171218155427j:plain

あぶらそばはそば粉の麺を使用。その発想はなかったが意外と美味しい。今度家で作ってみよう。

f:id:okamuuu:20171218155549j:plain

ちなみにこのお店には元サッカー選手の中田氏が取材でいらっしゃったそうです。彼は日本酒にすごく関心があるらしく、国内の蔵元を訪ね歩いているとかいないとか。

まとめ

札幌は思ったより暖かいです。地下通路が発達していたり、建物の構造が二重ドアになっていたり、街全体で防寒対策がしっかりされていました。市内から小一時間程度でスキー場に行けたり、美味しいお店がお手頃な価格帯で存在していて羨ましい限りです。

移住先として札幌という選択肢はありだなあと思いました。おしまい。

札幌へ3泊4日で働きながら旅をしてきた(前編)

あらすじ

スノボーがしたいので冬の札幌へ行ってきました。

f:id:okamuuu:20171216192144j:plain

飛行機代 + 宿泊代 + スノボ代

大体主な費用はこのような感じです。

項目 金額
jetstar(往復) 12,740円
Airbnb(3泊+清掃料金+手数料) 13,038円
スノボー(リフト代+レンタル代) 12,800円
合計 38,578円

ちなみに宿泊施設は Airbnb を使用しました。この時期は比較的料金は高くないのですが、1月から2月に関しては観光シーズンなので少し料金がかわると思います。特にさっぽろ雪まつりが2月にあるので上記金額は参考までに。

www.airbnb.jp

東京駅から成田ターミナル3までバスで移動するまでの時間

11時出発予定の飛行機だったのですが、東京駅から9時00分発車予定の成田行きのバスに乗りました。9時05分にバス出発、到着予定時間が以下の通りだったので LCC だとターミナル3に到着するまで時間かかるので、この時間だと荷物を預ける場合はたぶん間に合わないでしょう。次回自分が旅するときの為に記録しておきます。

項目 金額
9:00 東京出発予定
9:05 東京出発
10:05 ターミナル2北
10:07 ターミナル2南
10:13 ターミナル1
10:15 ターミナル3
10:21 保安所到着
10:28 保安所突破
10:35 搭乗開始時刻
10:45 搭乗締め切り

気温と服装

私が滞在している期間は割と札幌は暖かい日だったらしく、なおかつほとんど無風で寒いと感じることがあんまりありませんでした。また札幌市内は雪の関係で地下鉄が発達していてほとんどの人が地下を移動していました。地元の人は12月はそんなに厚着をしないようです。

あと他の都市と比べて印象に残ったのがスーツ着ている人が長靴を履いているので雪国なんだなあと思いました。私は今回の旅の目的がスノボで雪の中を歩く予定だったのでノースフェイスで靴を買って行きました。

店員さんに裏側がスパイク状になっている靴を選んだほうが滑らない、というわけで購入したのは以下の靴。おかげで足元が冷たいと感じることもなく快適に過ごせました。まあ何度かズルズルと滑ってましたが(転んではいない)。

スノボー

www.sapporo-teine.com

サッポロテイネに行きました。かかった金額は以下の通り。

項目 金額
スノーボードセット4時間 5000円
ウェア4時間 3,800円
リフト4時間 4,000円

平日なのであんまり人がいないと思ったのですが、修学旅行生がたくさん来ていて大盛況でした。バスは手稲駅からバスがあったので 9:00 出発 15:00 に戻るバスを利用しました。ちなみに土日と平日はバスの運行状況が違うのでご注意ください。ちょっと帰るまで時間あったのでタクシーを呼び出ししようとしたら30分から40分ぐらいかかりますと言われてしまったのでおとなしくバスを待ちました。

なお、手稲駅から新千歳空港までJR線で移動できるのでサッポロテイネからそのまま空港まで移動する日程を組むことも可能だと思います。

まとめ

今回の旅の主目的がスノボーをすることだったのですが、無事達成できました。今年は雪が積もりはじめるのが早かったのですが、地元の人によるとサッポロテイネが札幌近辺で最も早くオープンするそうです。もし北海道に旅行行かれる方でスキーかスノボも楽しみたい方は一度サッポロテイネを検討されると良いと思います。