OmniAICreator/Qiita-1.07M huggingface dataset:
独断！参考にならないJavaScriptページの見分け方

世の中には
JavaScriptに目覚めた魔王から世界を救うためにJavaScriptを学ぶ必要が出てきたり、
知らない言語なのにいきなり仕様書を渡されて「JavaScriptでコレ作って」なんて言われる事はよくあると思います。
そんなときの手助けになれば。

「Webに沢山資料あるから大丈夫」
このセリフを聞いたらやばいです。参考書を買ってもらえる望みは薄いでしょう。
JavaScriptに関してはWebに沢山資料があるのは事実ですが、
資料の質は玉石混淆です。
真似をしてもいいコードと悪いコードは初心者に分別するのは不可能だと思います。

で、終わってしまっては世界が滅んでしまうので、
とりあえず参考にならないだろうページを見抜くコツを教えます。
※基本的にES5以降のJavaScriptを習得したいひと向けの記事です

# "JavaScript"が正しく書けていない
コードではなく単純にJavaScriptと書けていないページがWebには転がっています。
正式名称を知らない著者が仕様の詳細を踏まえてコーディングしてるとは思えません。
そっと閉じてあげましょう。

よくあるワード

1. Javascript
"JavaScript"の正式名称では"S"は大文字です。
ただの大文字と小文字の違いですが、
プログラミングにおいて大文字小文字は意味があります。
`:`と`;`の違いで人工衛星が落ちる業界です。
javascript(すべて小文字)のほうがまだマシだと思います。
数カ所の違いであれば、タイプミスかもしれませんが
全部だと流石に怪しいです。
そっと閉じましょう。

1. Javaスクリプト
恐らく相当古い時代の記事です。
JavaとJavaScriptがよく混同されてた時代の遺跡かもしれません。
そっと閉じましょう。

1. JScript
JavaScript互換の言語ですが、JScriptはJavaScriptではありません。
IE8以下のブラウザ対象というような特殊な環境であれば必要ですが...
学びたいのがモダンなJavaScriptであればそっと閉じて他のサイトを選びましょう。

# 仕様のバージョンが書いていない
JavaScriptの仕様にはバージョンがあります。
参考にしようとしているページにECMAScript(ES)という言葉が出てこなかったら気をつけてください。
特殊な環境向けのものでなければES5より大きいものを使えばいいと思います。
IE9以降でだいたい動きます。

詳しいブラウザの対応バージョンはこちらでわかります。
http://caniuse.com/#search=es5

IE切り捨てていいならES6を使いたいところですね。
なかなかできないでしょうが…

# 対応ブラウザが書いていない
JavaScriptの実行環境であるブラウザは結構重要な情報です。
同じソースコードでもブラウザを変えれば動かないなんてザラですし、
ブラウザのバージョンでも動いたり動かなかったりします。
仕様のバージョンが書いてあれば対応ブラウザは自明ですが、
どちらもない場合は気をつけましょう。

# 日付が書いていない
論外です。
時間の分からない情報に意味はありません。
「本能寺が火事」という情報が今なのか、織田信長が生きているときの情報なのかで全く価値が変わるように。
変化の多いWeb界隈の話で、いつの情報なのかわからなければあまり価値はないです。

# 使われているjQueryのバージョンが1系
HTMLのソースにjQueryを読んでるものも多いと思います。
jQuery1.?.?のようなバージョンは古いブラウザ向けのjQueryです。
2系も一緒に読み込んでいるものならばいいですが、単独だと古いブラウザ向けのソースの可能性が高いです。

# scriptの属性の書き方が古い
```html
<script language="JavaScript"></script>
```
この書き方はHTML4.0以前のもののため古い情報でしょう。
HTML4.01以降は

```html
<script type="text/javascript"></script>
```
HTML5であれば省略可能のためそもそもいりません。

```html
<script></script>
```


# 結局一番早いのは書籍
ここまで記事の質の見分け方を散々説明しましたが、
「JavaScript考古学」で悩むより
手っ取り早いのは書籍だと思います。
自分の場合は次の本を読みました。

1. オブジェクト指向JavaScriptの原則(http://amzn.to/2cLjliF)
2. JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス(http://amzn.to/2dRdoGa)
3. JavaScriptリファレンス 第6版(http://amzn.to/2dz7t4b)

1つ目は「オブジェクト指向JavaScriptの原則」で他言語出身者向けにわかりやすく解説してあります。
まったくオブジェクト指向の言語をやっていなければあんまり近道にはならないかもしれません。
2つ目は定番ですが「JavaScript: The Good Parts」です。
JavaScriptのヤバさが詰まっています。
「`typeof null` をすると`"object"`」だったり 「`NaN != NaN` が`true`になる」とかそういう話が詰まってます。
もうバリバリ書けるってひとも、後半にあるBad Partsだけでも一度目を通すといいと思います。
3つ目はリファレンスです。
とても眠くなるのであまり強くおすすめできませんが、
コアとクライアントサイドをそれぞれA-Zまで読むとJavaScript(ES5)とjQueryについて結構詳しくなれます。
Web(JavaScript)で何ができるのかが分かるのでおすすめです。
UIColorをColor Literalで定義する

#はじめに
Xcode8からColor Literalというのが使えるようになりました。
試しに使ってみたので、投稿します。

#Color Literal使ってみた
UIColorに**Color Literal**があるので選択してみると、
<img width="381" alt="スクリーンショット 2016-10-03 1.16.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/80918bf3-d998-65be-cc87-22ec4cb23e9a.png">

カラーパネル?で色を選択できます!
<img width="489" alt="スクリーンショット 2016-10-03 1.17.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/0830be66-0f7a-e86e-2dd8-841c9f66d196.png">


こんな感じに分かりやすく表現できました。
<img width="335" alt="スクリーンショット 2016-10-03 1.19.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/0e529ea5-fa7c-7081-d51b-e1cf92ea0224.png">

#さいごに
私は直感的で分かりやすいと思いましたが、
なんだか賛否両論ありそうなやつですね。
Devise カラムを追加した時にundefined method `for' for #<Devise::ParameterSanitizerになったときの対処法

 

deviseでUserモデルなどに新しいカラム（今回はusernameを例にとる）を追加し、サインアップで用いるとき
application.controller.rbに以下の記述が必要だった。


 before_action :configure_permitted_parameters, if: :devise_controller?
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end





このやり方だと最新版のdeviseは仕様が変わっており、エラーになってしまうので
application.controller.rbに上記の記述に代わって以下の記述が必要。



  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up){|u|
      u.permit(:username,:email, :password, :password_confirmation)
    }
  end



はまった。
Angular2系向けFluxライブラリのWaltsを使ってみた

# 自己紹介
- twitter: [@_sisisin](https://twitter.com/_sisisin)
- github: [@sisisin](https://github.com/sisisin)
- 普段触ってる技術
    - 仕事では主にAngular1.4系でSPA開発
    - 個人では主にReact,Node.js.最近はちょろっとRuby
    - Angular2系は7月のハンズオンに参加した程度であまり触ってない

---

# アジェンダ

- Waltsとは？
- モチベーション
- デモ
- 所感
- まとめ

---

# Waltsとは

@armorik83 さん作のAngular2系でFluxするライブラリ

詳細は以下の記事にて
[Walts - Angular 2向けFluxライブラリを作った](http://qiita.com/armorik83/items/191d50cbf093778198fe)

---

# Waltsとは
先程の記事に、

> ここはワルツと呼んでもらいたい。View -> Action -> Store、この三角の動きを三拍子に見立てて名付けたものだ。

とあるように、この3つがほぼ全てといっていいライブラリになっている

--- 

# Waltsとは

- Actionでstateを更新する関数を定義
- StoreではViewへstateを渡すためのobservableを定義
- ViewはStoreの定義しているobservableをsubscribeして状態を取得

---

# Waltsとは
ライフサイクルはシンプルにこれだけ！
もともとFlux自体が複雑な概念じゃないので、難しいことはない
React+Fluxを触ったことがある人には馴染みやすい世界になります

---

# Waltsとは

理解の助けになる最小構成のアプリ(@ovrmrw さん作)
https://github.com/ovrmrw/angular-walts-increment

---

# モチベーション

- Angularには状態管理の設計方針がない
- Reactで書くときと比較すると、状態管理に迷わなきゃいけなかったのが大変嫌だった
- そこにあのはちさんがFluxのライブラリを用意したと言うじゃないか

---

# デモ

リポジトリ：https://github.com/sisisin-sandbox/gh-issues-ng2

GitHub Pages: https://sisisin-sandbox.github.io/gh-issues-ng2/

---

# 所感

## ポジ
- `Dispatcher`,`Action`という考え方とDIの相性が良い
- 型定義ファイルであまり消耗せずにすむ
- Reactよりtemplateの自由度が高いなどのAngularの特徴が強い
- Rxについて考える層がバッチリ薄くなりそうで良さみ（多分

---

# 所感

## ネガ
- `Dispatcher`の役割の少なさ
- `this.delayed`が最初ピンとこなかった(`apply`じゃなくて`resolve`の方がわかりやすいかも？）
- 割と書き手の良心に委ねられてるので好き放題出来そう

---

# まとめ

---

# Flux最高〜↑

---

# Happy Hacking!
AzureでWordPressを構築

#WordPressとは
オープンソースのブログソフトウェアである。PHPで開発されており、データベース管理システムとしてMySQLを利用している(wikiより)

#Azure上でWordPressの構築
Azureの管理ポータル上で**新規**を選択
![ポータルサイト.png](https://qiita-image-store.s3.amazonaws.com/0/130097/0fec169c-3aa0-6606-a9ce-34bd6a369fe0.png)

新規の検索タブで**「WordPress」**と検索し、選択する
![wordpress検索.png](https://qiita-image-store.s3.amazonaws.com/0/130097/ad5812eb-1b7d-de21-89ef-872775980183.png)

####WordPressの構築のための設定
WordPressの**作成**を選択のち、
・ アプリ名 => 任意
・ サブスクリプション => 任意
・ リソースグループ => 既存のものがあれば選択なければ作成
・ データベースプロバイダー => ClearDBを選択
![wordpress設定.png](https://qiita-image-store.s3.amazonaws.com/0/130097/25777e26-f720-5777-5d51-f37ec215db5e.png)

####App Serviceの設定
**App Service プラン/場所** を選択後、新規作成を選択
![プランの変更.png](https://qiita-image-store.s3.amazonaws.com/0/130097/4e145694-c27d-5b82-4ff7-a6c0ae7e73c8.png)

新規作成を選択後、App Serviceのプランを確認
・App Service プラン => 任意名前
・場所　=> 任意
・価格レベル　=> 任意
![詳しい変更.png](https://qiita-image-store.s3.amazonaws.com/0/130097/b7840ba5-6c45-3a08-e3d2-69b4f0ec2213.png)

####データベースの設定
・データベース名 => 任意
・場所　=> 任意
・価格レベル => 任意

設定が終わったら、法律条項を許可し作成を選択することで**WordPress**が立ち上がる
![でーたべーす変更.png](https://qiita-image-store.s3.amazonaws.com/0/130097/45d6d561-bdf0-fbfe-0711-1b4bce30bdbc.png)

#管理ポータルからWordPressに接続
構築が完了したら、管理ポータルから**App Service**を選択する
![appserver.png](https://qiita-image-store.s3.amazonaws.com/0/130097/971e8ecc-f473-4bf7-d6a6-8be7924cfd39.png)

**[WordPress]-[概要]-[URL:クリック]**
![IP確認.png](https://qiita-image-store.s3.amazonaws.com/0/130097/6b1ce945-a992-a0d9-9615-f21640119fbd.png)

最後にURLにアクセスするとWordPressの設定ができる
![かんせい.png](https://qiita-image-store.s3.amazonaws.com/0/130097/ca51d82b-575d-a32a-3669-829595b735e8.png)
AWSのSES利用時に知っておくべきSRSの挙動

# この記事の話題
AWS SESでSPFを設定しようと思ったら以下のドキュメントに当たります。

[Amazon SES で MAIL FROM ドメインを設定する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/mail-from-set.html)

この中で、SPFを設定しようと思ったらなぜかMXレコードを設定せよと記載されてます。
そのあたりの設定がなんで必要なのかこの記事にまとめます。

# 前提

## 設定の前提
過去の記事で[AWS SESでのメール送信時にSPFの設定は必要だよ！](http://qiita.com/seiketkm@github/items/a4ddef03b7852353f554)って書いたので、送信元ドメインでSPFレコードを公開するように設定することを前提とします。

# SPFの設定

[Amazon SES で MAIL FROM ドメインを設定する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/mail-from-set.html)

上記のリンク先から大まかな手順を引用すると

1. Amazon SES コンソールまたは API で、指定した MAIL FROM ドメインが使用されるようにアイデンティティを設定します。
2. MAIL FROM ドメインの DNS サーバーに MX レコードを公開します。このレコードは、セットアッププロセスの間に Amazon SES から提供されます。
3. (オプション) E メールが Sender Policy Framework (SPF) チェックに合格するには、カスタム MAIL FROM ドメインの DNS サーバーに SPF レコードを公開する必要があります。

のステップになってます。

# 通常のメール配信

通常のメール配信は以下のイメージです。

![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/19483/b83acbdc-d726-d661-fe7f-021d95a77b47.png)

1. SESでメール配信を依頼
2. SESが**envelope from** を書き換えます
3. 宛先のMTAで書き換えられたenvelope fromに対してSPFの検証が実施されます

カスタム MAIL FROM ドメインをWebコンソール上から設定した送信元のドメイン、設定がない場合amazonses.comに変更されます。
ポイントとしては、設定可能なのは認証済みのドメインそのものではなくサブドメインでないとSESのコンソール上からカスタムMAIL FROMドメインとして設定できません。

# バウンスメール配信

amazonses.comからメールを配信したあとに、バウンスメールが**envelope from**のアドレスに配信されます。
以下のようなイメージです。

![スライド2.png](https://qiita-image-store.s3.amazonaws.com/0/19483/7aa7cc8a-38dd-f8ce-d17f-630201dd0f20.png)


1. 通常のメール配信で書き換えた**envelope from**に対してエラーメールを送ります。この時に**envelope from**を元のenvelope fromに書き戻す必要があるので一度SESに送信
2. **envelope from**を元のenvelope fromに書き戻す
3. 元のenvelope fromアドレスでSESからエラーメールを受信

1のためにカスタムMAIL FROMドメインに利用するドメインに対してMXレコードを定義する必要があります。

この時点で当初疑問に思った、MXレコードの定義が必要な理由が分かりました。

# envelope fromの書き換え

SESが行っているenvelope fromの書き換えは、大きな枠組みでいうと、
[SRS(Sender Rewriting Scheme)](https://ja.wikipedia.org/wiki/センダー・リライティング・スキーム)/Wikipedia(参考)
に属する挙動と言えます。

# SESではなぜSRSを実施する？

私見ですが、メールを送信するだけであれば送信元が最初に付与するenvelope fromを維持しても良いような気はします。しかし、AWSの提供するSESとしては送信したメールのバウンスメールの発生を計測するために、バウンスメールがSESを経由して送付されるように設計されているものかと思います。

あまりにもバウンスメールの多い利用をする場合は不審な利用とみなして利用を停止できるようにしているものと思います。
これによってAWSはSESの送信するメールの健全性を確保しているものかと思います。

# まとめ

SESではバウンスメールの計測を行うため、SPFのためのカスタムMAIL FROMを設定する場合に、MXの指定が必要になるよ。
Git Credential Managerを無理やりMSYSでも使う

# はじめに

https://git-scm.com/docs/gitcredentials

Git Credentialを使用すると, Gitでhttps接続する時のパスワード入力を省略できる.
ただし, 認証情報の保管方法には, 複数のオプションがある.
そのうち, [Git Credential Manager (GCM)](https://github.com/Microsoft/Git-Credential-Manager-for-Windows)では, [GitHub](https://github.com)や[Bitbucket](https://bitbucket.org),
[Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops)の2段階認証に対応している.

GCMは[Git for Windows](https://git-for-windows.github.io/)ではデフォルトで使えるが, [MSYS2](https://www.msys2.org)などのGitでは使えない.
使うには, 単純に以下の方法がある.

1. MSYSから直接Git for Windowsを使う.
2. Git for WindowsのGCMのファイル (exeとdll) をMSYSへコピー.


# まず初期設定を確認してみる

## Git for Windows
Git for Windowsでは, 以下のとおりデフォルトでGCMを使う設定になっている.

```console:コマンドプロンプト
> git config --show-origin credential.helper
file:C:/Program Files/Git/mingw64/etc/gitconfig   manager
```

## MSYS
一方, MSYS2では以下のとおり, `credential-manager` (GCM) は使用できない.

```console:MSYS2
$ git credential-manager version
git: 'credential-manager' is not a git command. See 'git --help'.
```

# 使うための方法

## 方法①

MSYSでGCMを使うには, 以下のように直接Git for Windowsを指定して使う.

```console:MSYS
$ /c/Program\ Files/Git/bin/git credential-manager version
Git Credential Manager for Windows version 1.18.4
```

必要に応じて`alias`を設定.

```bash:.bashrc
alias wgit=/c/Program\ Files/Git/bin/git
```


## 方法②

Git for WindowsにあるGCMのファイルを以下のようにMSYSへコピーする.

```console:MSYS
$ cd /c/Program\ Files/Git/mingw64/libexec/git-core

$ ls -1 git-credential-manager *Authentication* Microsoft.*.dll
AzureDevOps.Authentication.dll
Bitbucket.Authentication.dll
git-credential-manager
GitHub.Authentication.exe
Microsoft.Alm.Authentication.dll
Microsoft.IdentityModel.Clients.ActiveDirectory.dll

$ cp git-credential-manager *Authentication* Microsoft.*.dll /usr/lib/git-core/
```

ここで, MSYSで再度確認すると, 以下のとおり`credential-manager`が使用できるようになっている.

```console:MSYS2
$ git credential-manager version
Git Credential Manager for Windows version 1.18.4
```

実際にMSYSでGCMを使用する設定にするには, 以下のとおり.

```console:MSYS
$ git config --global credential.helper manager
```

# 参考

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98

http://stackoverflow.com/questions/18683935/store-https-passwords-with-cygwins-git

# 確認環境
- Windows 10
- Git for Windows 2.21.0
- MSYS2 (git 2.21.0)
[超簡単]LINE notify を使ってみる

# LINE notify を使ってみる

## 概要
* 簡単にトークルームにメッセージを送信できる
* 特定のトークルームに一方的に通知するだけのシンプルな機能
* 通知してくれるアカウント名などはカスタマイズできず、「LINE notify」で固定
* シンプルで簡単！

## 手順

### Lineのページで notify の登録
   * 以下にLineIDでログイン
   * ログイン後マイページを開く  
     https://notify-bot.line.me/ja/
   
![screenshot 4.png](https://qiita-image-store.s3.amazonaws.com/0/21391/fe676ce9-8195-676f-94b9-3f2268442a36.png)

### 「アクセストークン発行」をクリック
   * トークン名
     * メッセージの先頭に必ずつく文字です。（短い方が良いと思う）
   * 通知を送信するトークルームを選択してください
     * 通知先のルームです。

![screenshot 3.png](https://qiita-image-store.s3.amazonaws.com/0/21391/69fccdd0-58c1-6cfe-194e-8fa53aca8903.png)
![screenshot 2.png](https://qiita-image-store.s3.amazonaws.com/0/21391/cbd483ef-7300-9763-fc40-2dd33e3a3053.png)

### トークンをメモる

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/21391/6e6024af-565f-3a9f-cf9c-4316f463d01d.png)


### [スマフォで作業] 設定したルームに「LINE notify」 を招待する
   * 通知してくれるbotくん（LINE notify）を設定したルームに招待してあげてください

<img width="375" alt="S__3653648.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21391/95155252-dcc0-7b26-555d-c74cec44c41c.jpeg">


1.POST する！

```sh
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" -F "message=ABC" https://notify-api.line.me/api/notify
```

phpで書くとざっくりこんな感じ

```php
<?php
define('LINE_API_URL'  ,'https://notify-api.line.me/api/notify');
define('LINE_API_TOKEN','トークン');

function post_message($message){

    $data = http_build_query( [ 'message' => $message ], '', '&');

    $options = [
        'http'=> [
            'method'=>'POST',
            'header'=>'Authorization: Bearer ' . LINE_API_TOKEN . "\r\n"
                    . "Content-Type: application/x-www-form-urlencoded\r\n"
                    . 'Content-Length: ' . strlen($data)  . "\r\n" ,
            'content' => $data,
            ]
        ];

    $context = stream_context_create($options);
    $resultJson = file_get_contents(LINE_API_URL, false, $context);
    $resultArray = json_decode($resultJson, true);
    if($resultArray['status'] != 200)  {
        return false;
    }
    return true;
}

post_message('テスト投稿');
```



## 後記
超簡単！
デーモンの登録の仕方

debian, ubuntu系の場合。

<pre>
update-rc.d デーモンの名前 start NN runlevel .
update-rc.d デーモンの名前 stop NN runlevel .
update-rc.d デーモンの名前 defaults NN(起動用) NN(停止用)
</pre>

|オプション・引数|説明|
|:-:|:-:|
|remove|起動スクリプトのシンボリックリンクを削除|
|defaults|デフォルト設定でシンボリックリンクを作成|
|start|起動用のシンボリックリンクを作成|
|stop|停止用のシンボリックリンクを作成|
|NN|0～99までの数値(起動or 停止順)|
|-n|表示するだけで何もしない|
|-f|/etc/init.d/以下にスクリプトがあっても|
||強制的にシンボリックリンクを削除|

http://at-j.co.jp/blog/?tag=update-rc-d
`git push azure master`できないとき

## 概要

`git push azure master`したら

```
fatal: 'azure' does not appear to be a git repository
fatal: Could not read from remote repository.
```

と言われてしまったときの対応。

## 背景

[『Azure への PHP Web アプリの作成、構成、デプロイ』](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-web-php-get-started/)に基本そって作業を進めていたのですが、あらかじめブラウザからApp Serviceを作っていたため、`azure site create --git <app_name>`の手順を飛ばしました。
そりゃあ、pushしようとしたときに上記エラーが発生してしまうのは当然ですね。

## 解決方法

ブラウザ側のメニュー「デプロイ オプション」から新たにローカル Git リポジトリを作成します。
すると、そのURLを「プロパティ > GIT URL」から確認することができます。
<img width="562" alt="スクリーンショット 2016-10-05 10.54.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/11338/baa602a4-0567-abb6-953c-901fb54cb079.png">

そうしたらクライアント側に戻り、`git remote add azure [上記で確認したURL]`でazureを追加することができ、はれて`git push azure master`できるようになります！

### 補足

デプロイ資格情報を作成していない場合は、`git push azure master`をする前にブラウザ側にて作成します。

クライアント側には`azure site deployment user set [上記で作成したユーザ名]`で設定できます。
式X+++++Yの読み方

##本記事の前提
本記事中のコード例で使用する式`X`及び`Y`は、以下のAND条件を満たすことを仮定します。

* 単項式であること。
* 式の評価結果は変更可能な左辺値であること。
* 評価結果の値はスカラ型であるか、スカラ型でもポインタ型の場合、オブジェクト型へのポインタ型であること。

また、「変更可能な左辺値」等の用語の定義並びに規定は、C90の規格票（「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」）に準じますが、抽象意味規則を除く記述（式解釈の手順など）など規格の守備範囲を超えるものについては、執筆者独自の「たぶんこうかな~」という思いつきに拠るものです。

##式 X+++++Yの解釈

「C言語プログラミングの落とし穴」（A・コーニグ）にも出てきましたが、以下のいやらしい式の解釈方法について考えてみます。

```c:
X+++++Y;
```

まず、この式を有効前処理字句最長一致ルール[^1]を適用してトークン分割すると、以下のようなトークン分割が得られます（半角スペースは、トークン区切りのプレースホルダーを示す）。

```c:
X ++ ++ + Y;
```

直観的に考えると、二項演算子`+`より前置`++`演算子の方が優先順位が高いのだから、以下のようなトークン分割がされるんじゃないの？と思いますが、字句解析と構文解析は分業で行われるため、トークン分割が有効前処理字句最長一致ルールで行われる以上、以下の区切り方はトークン分割のフェーズにおいては検討にさえ挙がってこないのではと思います（僕はコンパイラの勉強をしたことが無いので推測で言ってますが･･･）。

```c:
X++ + ++Y;
```

ところで、この段階ではトークンを区切っただけであり、以下が未決事項です。

* 2つの演算子`++`は、それぞれ前置の`++`か？後置の`++`か？
* 演算子`+`は、単項`+`演算子か？二項`+`演算子か？

ここで、演算子の優先順位と結合法則を適用します。

上記の式において、前置の`++`と後置の`++`では、後置の`++`の方が優先順位が高いため、演算子`++`は両者とも後置の`++`であると解釈されます。また、式中では演算子`+`は左オペランドと右オペランドが指定されているため、二項演算子の`+`であると特定します。以上より、以下の式と等価になると考えられます。

```c:
((X++)++) + Y;
```

上の完全式を評価してみる前に、ここで演算子の仕様についておさらいしてみます。

0. 式`X++`は右辺値を返す。
0. 後置`++`演算子は、オペランドに変更可能な左辺値を要求する。

式中の左から2つ目の後置`++`の評価時点で、上記2の制約に違反してしまうことから、実際の処理系では構文解析の時点でコンパイルエラーが発生するのではと予測します。実際、`gcc 4.9.2`でコンパイルしてみると、以下のエラーメッセージが発生しました（インデントの関係上、式中のエラー発生箇所を示す記号を`^`から`*`に変更しています）。

```
error: lvalue required as increment operand
  X++*+++Y;
```

以上より、冒頭の式を規格合致処理系でコンパイルした結果はどうなると推論されるか？という問いに対しては、「後置`++`演算子はオペランドに変更可能な左辺値を要求する」という制約に違反するため、コンパイルエラーが発生する、が回答になると思います。

##まとめ

前置`++`と後置`++`のように、種類の異なる演算子に同じ記号が割り当てられていた場合、どの演算子として扱うか？という演算子アイデンティファイの問題と、演算子の種類が決まったとして、オペランドがどの演算子のオペランドに属するか？という演算子の優先順位と結合法則の問題などが同時に絡んでくるという、複雑ですが学ぶところの多い式だと思いました。[^2][^3]

式を読む上でのポイントをまとめると、以下の点が挙げれられると思います。[^4]

0. 有効前処理字句最長一致原則に従ったトークン分割
0. 演算子のアイデンティファイ（トークン分割した結果、異なる種類の演算子に紐づいたトークンが表れた場合、各々が何の演算子を意味するかの特定作業）
0. 演算子の優先順位・結合法則の適用

以上です。

[^1]: 「有効前処理字句最長一致ルール」とは本記事の独自用語ですが、「入力ストリームをある文字まで前処理字句に解析し終わったとき、次の前処理字句は、前処理字句を構成することのできる最も長い文字の並びとする。」のことを指しています。
[^2]: なお、演算子の優先順位・結合法則の話と、オペランドの評価順序の話は別の議論です。前者はオペランドの取り合いの話であり、後者は時系列の話だからです。また後者には関連テーマとして「未規定の動作」「副作用完了点」（式の評価にともない発生した副作用が完了するタイミング）が絡んできます。
[^3]: 「同じ記号で表されるが意味の異なる演算子」を調べたところ、前置/後置増分演算子の`++`、単項/二項演算子の`+`/`-`、間接演算子/二項`*`演算子、アドレス演算子/ビット単位`&`演算子、キャスト演算子/関数呼び出し演算子`()`、がありました。
[^4]: 考慮すべきはもちろんこれだけではなく、8段階で構成される「翻訳フェーズ」も考慮する必要があります。
素人の言語処理100本ノック:17


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###17.１列目の文字列の異なり
>1列目の文字列の種類（異なる文字列の集合）を求めよ．確認にはsort, uniqコマンドを用いよ．


####出来上がったコード：

```python:main.py
# coding: utf-8

fname = 'hightemp.txt'
with open(fname) as data_file:

	set_ken = set()
	for line in data_file:
		cols = line.split('\t')
		set_ken.add(cols[0])

for n in set_ken:
	print(n)
```

####実行結果：

```console:実行結果1
山形県
和歌山県
岐阜県
大阪府
愛媛県
埼玉県
愛知県
高知県
群馬県
千葉県
山梨県
静岡県
```

```console:実行結果2
岐阜県
山形県
静岡県
愛知県
大阪府
高知県
群馬県
千葉県
山梨県
愛媛県
和歌山県
埼玉県
```

2回実行すると並びが変わりました。これは、[コマンドラインの-Rオプション](http://docs.python.jp/3/using/cmdline.html#cmdoption-R)の解説にあるように、ハッシュがランダム化されているためだと思います。

####UNIXコマンド確認用のシェルスクリプト:

```bash:test.sh
#!/bin/sh

# 先頭カラムを切り出し、ソート、重複除去
cut --fields=1 hightemp.txt | sort | uniq > result_test.txt

# Pythonのプログラムで実行、diffで比較するためにソート
python main.py | sort > result.txt

# 結果の確認
diff --report-identical-files result.txt result_test.txt
```

####結果の確認：

```console:端末
segavvy@ubuntu:~/ドキュメント/言語処理100本ノック2015/17$ ./test.sh
ファイル result.txt と result_test.txt は同一です
```
　　
18本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
Let's Encrypt CertBotで無料のSSL証明書を自動で取得

## 環境

```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

## 準備

予めサーバの80番と443番ポートを開けておきます。AWS等なら管理コンソールやCLI等を使います。
※先にやっておかないと取得時に失敗します。

あとは当たり前ですが、SSL化したいドメインを取ってAレコードを差し向けておきます。
今回の例では `www.example.co.jp` を使います。

## CertBotでSSL証明書を取得

```
$ git clone https://github.com/certbot/certbot
$ cd certbot/
$ ./certbot-auto certonly --standalone -d www.example.co.jp
```

すると /etc/letsencrypt 下に色々と配置されます。

/etc/letsencrypt/live に実際の証明書へのシンボリックリンクが貼られており、実際のwebサーバの設定ではこちらを参照することになります。

```
$ sudo ls -la /etc/letsencrypt/live/www.example.co.jp
合計 0
drwxr-xr-x 2 root root 75 10月  2 23:35 .
drwx------ 3 root root 39 10月  2 23:35 ..
lrwxrwxrwx 1 root root 50 10月  2 23:35 cert.pem -> ../../archive//cert1.pem
lrwxrwxrwx 1 root root 51 10月  2 23:35 chain.pem -> ../../archive/www.example.co.jp/chain1.pem
lrwxrwxrwx 1 root root 55 10月  2 23:35 fullchain.pem -> ../../archive/www.example.co.jp/fullchain1.pem
lrwxrwxrwx 1 root root 53 10月  2 23:35 privkey.pem -> ../../archive/www.example.co.jp/privkey1.pem
```

### ローカルの3000番で動いているAppサーバをSSL化

Railsの開発中、ログイン機能を作るために開発用のSSLを用意したかったので、下記設定でnginxからPuma(Webrickでも同様)へとproxyしました。

``` /etc/nginx/conf.d/rails.conf
server {
  listen 443;
  ssl on;
  server_name www.example.co.jp;
  ssl_certificate     /etc/letsencrypt/live/www.example.co.jp/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.example.co.jp/privkey.pem;

  location / {
    proxy_pass http://localhost:3000;
  }
}
```

nginxを起動し、 `https://www.example.co.jp/` でアクセスできたら成功です。

無料で、数分でSSL証明書が取得できました。

良い時代になりました。

## 参考

- [Let's Encrypt の使い方 \- Let's Encrypt 総合ポータル](https://letsencrypt.jp/usage/)
Google Guavaまとめ1（Preconditions）

google guavaに含まれるPreconditionsクラスの説明。
このクラスはJavaに含まれるExceptionを省略したもの。このクラスの目的はコードの可読性を高めること。簡単に言うと文章を短くして見やすくしようとのこと。

### checkNotNullメソッド
NullPointerExceptionを省略したもの

```java:CheckNotNullSample.java
import com.google.common.base.Preconditions;

public class CheckNotNullSample {

	public static void main(String[] args) {
		String string = null;
		
		//if(string == null){
			//throw new NullPointerException();
		//}
		
		Preconditions.checkNotNull(string);
	}
}
```

実行結果は

```
Exception in thread "main" java.lang.NullPointerException
	at CheckNotNullSample.main(CheckNotNullTest.java:26)
```

となり、NullPointerExceptionを投げてくれる。

### checkArgumentメソッド
IllegalArgumentExceptionを省略したもの

```java:CheckArgumentSample.java
import com.google.common.base.Preconditions;

public class CheckArgumentSample {
	public static void main(String[] args) {
		String[] string = {};
		
		//if(string == null){
			//throw new IllegalArgumentException();
		//}
		
		Preconditions.checkArgument(string.length > 0);
	}
}
```

実行結果は

```
Exception in thread "main" java.lang.IllegalArgumentException
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:108)
	at CheckArgumentSample.main(CheckArgumentTest.java:13)
```

となり、IllegalArgumentExceptionを投げる。
Unable to locate package linux-headers-4.6.0-kali1-amd64 の解決法

#Kali linuxにVirtualBox guest additionsを入れる時に出たエラー

Kali linuxをVirtualBoxでインストール完了したらホストOSとファイル共有やクリップボードの共有をするためにVirtualBox guest addtionsを入れるのをよく薦められます（だいたいkali linuxのセットアップのチュートリアルの最後に書いてありました）。そのコマンド

    apt-get install linux-headers-$(uname -r)

を実行すると、以下のようなエラーが出ました。

    Reading package lists... Done
    Building dependency tree 
    Reading state information... Done
    E: Unable to locate package linux-headers-4.6.0-kali1-amd64
    E: Couldn't find any package by glob 'linux-headers-4.6.0-kali1-amd64'
    E: Couldn't find any package by regex 'linux-headers-4.6.0-kali1-amd64'

`Unable to locate package linux-headers-4.6.0-kali1-amd64` でググったら全く同じエラーにハマっている人がいたので、そのサイトにあった以下の解決方法を試したのですが一向に同じエラーが出ます。

    sudo apt-get update
    sudo apt-get -y dist-upgrade  
    reboot # MOST IMPORTANT STEP! make sure you reboot the machine via this cmd OR 
    uname -r # check that the kernel release has updated

VirtualBox guest addtionsでググってみたら、

    apt-get install -y virtualbox-guest-x11

を実行するように、とありました。これであっさり解決。

versionが古いと `apt-get install linux-headers-$(uname -r)` で、新しいものは `apt-get install -y virtualbox-guest-x11` でインストールするみたいですね。
package.jsonの' "start": "node server.js"' は省略できる

`package.json` と同じディレクトリに `server.js` が置いてあれば、

```json
{
  "scripts": {
    "start": "node server.js"
  }
}
```

と**なっていなくても**、`npm start` すれば勝手に`node server.js` が実行される

npmのdocumentに書いてあった

> If no "start" property is specified on the "scripts" object, it will run node server.js.

https://docs.npmjs.com/cli/start
Windowsで使えそうなコマンドプロンプト集（ネットワーク編）

Windowsサーバに触れなくてはならなくなったので、使えそうなコマンドをまとめてみました。今回はネットワーク編。元々Unix系サーバ以外ほとんど触った事がないので、何とかGUIを回避しUnixっぽくコマンドでできないかなーと色々まとめてみました。以外に充実していたネットワーク系コマンド・・・

##インターフェース系
- netsh interface：ipアドレスやdnsサーバ、ipインターフェース一覧表示等。主に使用するIPv4インターフェースのコマンドについて列挙。

設定確認のコマンド

```bat:表示関連
rem ipv4インタフェース一覧表示
C:\Users\test> netsh interface ipv4 show interfaces
Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          50  4294967295  connected     Loopback Pseudo-Interface 1
  5          10        1500  connected     ローカル エリア接続


rem ipv4特定インタフェース詳細表示（Loopbackインターフェース 1を指定）
C:\Users\test> netsh interface ipv4 show interfaces 1
インターフェイス Loopback Pseudo-Interface 1 パラメーター
----------------------------------------------
IfLuid                             : loopback_1
IfIndex                            : 1
状態                               : connected
メトリック                         : 50
リンク MTU                         : 4294967295 バイト
到達可能な時間                     : 21000 ミリ秒
基本の到達可能な時間               : 30000 ミリ秒
再転送間隔                         : 1000 ミリ秒
DAD 転送                           : 0
サイト プレフィックスの長さ        : 64
サイト ID                          : 1
…


rem 設定されているipアドレス一覧表示
C:\Users\test> netsh interface ipv4 show addresses
インターフェイスの構成 "ローカル エリア接続"
    DHCP 有効:                         はい
    IP アドレス:                           192.168.100.100
    サブネット プレフィックス:                        192.168.0.0/24 (マスク 255.255.255.0)
    デフォルト ゲートウェイ:              192.168.100.254
    ゲートウェイ メトリック:              0
    インターフェイス メトリック:                      10


rem ipインタフェース毎のdnsサーバ一覧表示
C:\Users\test> netsh interface ipv4 show dnsservers
インターフェイスの構成 "ローカル エリア接続"
    静的に構成された DNS サーバー:    192.168.100.1
    次のサフィックスで登録します:           プライマリのみ
```

設定回りをコマンドで実施する場合、コマンドプロンプトは「管理者権限」にて実行してください。

```bat:設定関連
rem dnsサーバ設定。dnsserverの後に指定するのは
rem IPv4インターフェースのインデックス（ipv4インタフェース一覧表示参照）。
C:\WINDOWS\system32>netsh interface ipv4 set dnsserver 5 static 192.168.100.1 primary

```

##経路調査
- pathping：
 tracerouteのようなコマンド。インターフェースの指定もできる。tracertよりも高機能かも。ちなみにtracertもpathpingもICMPを使用している。Linuxのtracerouteは指定しなければUDP。

```bat:調査
rem ipv4で実行し、複数NICのうち192.168.100.100から宛先172.31.0.1に向けて実行
C:\Users\test> pathping -4 -i 192.168.100.100 -n -p 10 172.31.0.1
133.56.96.100 へのルートをトレースしています。経由するホップ数は最大 30 です

  0  192.168.100.100
  1  192.168.100.254
  2  172.31.0.254
  3  172.31.0.1
統計を 9 秒間計算しています...
            ソースからここまで   このノード/リンク
ホップ  RTT    損失/送信 = Pct  損失/送信 = Pct  アドレス
  0                                           192.168.100.100
                                0/ 100 =  0%   |
  1    0ms     0/ 100 =  0%     0/ 100 =  0%  192.168.100.254
                                0/ 100 =  0%   |
  2    3ms     0/ 100 =  0%     0/ 100 =  0%  172.31.0.254
                                0/ 100 =  0%   |
  3   12ms     2/ 100 =  2%     0/ 100 =  0%  172.31.0.1

トレースを完了しました。
```
電源制御をコマンドで

電源設定が七めんどくさい貴方へ。

```bat:powerplan.bat
rem ディスプレイの電源を切る
powercfg -x monitor-timeout-ac 15
powercfg -x monitor-timeout-dc 15

rem コンピュータをスリープ状態にする
powercfg -x standby-timeout-ac 30
powercfg -x standby-timeout-dc 30

rem 電源ボタンを押したときの動作(シャットダウン)
powercfg -setacvalueindex scheme_balanced sub_buttons pbuttonaction 3
powercfg -setdcvalueindex scheme_balanced sub_buttons pbuttonaction 3

rem カバーを閉じた時の動作(何もしない)
powercfg -setacvalueindex scheme_balanced sub_buttons lidaction 0
powercfg -setdcvalueindex scheme_balanced sub_buttons lidaction 0

rem 電源プランのエイリアス表示
powercfg /aliases
```
Go言語から共有ライブラリ(so)をロードして使う

# Go言語でプラグインの機構を使いたい
やりたいこととしては、下記の通り。

* LinuxにGoで建てたHTTPサーバをデーモンとして動かしたい
* HTTPサーバはプラグインを読み込んで機能の拡充が行える
* HTTPサーバは設定ファイルにプラグインファイルのパスを追加するだけで機能が拡充出来る
* プラグインを追加する度に本体をリビルドするのは嫌だ

# どう実装するか
最初はHashiCorpが出しているGo言語でプラグインの機構を備えるライブラリを見ていたけども・・・。
https://github.com/hashicorp/go-plugin

このプラグインは、読み込むプラグインの数だけプロセスが立ち上がってしまう。
※何故ならば、このプラグインはRPCを使ってプラグインと疎通する設計のため、プラグイン側もプロセスを立ち上げておかないといけない。

# じゃあどうするか
稼働させる場所は、Linuxサーバと決まっているため、もう共有ライブラリで良いんじゃね！？と思った次第。
共有ライブラリもビルド出来るしcgoを使えば何とかなりそう。

# 検証コード
## 共有ライブラリ(.so)側
hello関数を呼び出すと標準出力にhelloを表示するだけのどシンプルなものでございます。

```go:hello.go
package main

import "C"
import "fmt"

//export hello
func hello() {
	fmt.Println("hello")
}

func main() {
}
```

## 共有ライブラリをロードして使う側
```go:main.go
package main
/*
#cgo LDFLAGS: -ldl
#include <dlfcn.h>

void call_func(void* p) {
	void (*func)() = p;
	func();
}
*/
import "C"

func main() {
	handle := C.dlopen(C.CString("./shared/hello.so"), C.RTLD_LAZY)
	if handle == nil {
		panic("Failed to open shared object.")
	}
	defer C.dlclose(handle)

	hello := C.dlsym(handle, C.CString("hello"))
	if hello == nil {
		panic("Could not found function pointer.")
	}
	C.call_func(hello)
}
```

# 検証してみる
## 共有ライブラリのビルド
```shell-session
$ mkdir shared
$ cd shared
$ go build -buildmode=c-shared -o hello.so hello.go
```
## 呼び出し側の確認
```shell-session
$ go run main.go
$ hello
```

ちゃんとhelloが標準出力に表示されていることを確認出来た。
一応Goでプラグインコードの実装が出来るからこれでも良いよね・・・。
ある特定の構造のstructを色々な形状でjson出力したい時のこと

## はじめに

apiのresponse用のpresentation modelと内部のmodelがあったとして、その間のデータの変換がだるい。
用途によってpresentataion modelの数は増える。

```
presentation model <-> model (infra)
```

converterの自動生成と言う方向で考えていたけれど。
もう少しスマートUI的なものに捉えてある構造(ここではmodelを指す)を色々な形状に変換して出力する問題と考えることもできるみたいな話しを聞いてなるほどと思ったのでまとめてみる。

## primitiveな表現

例えば単純なデータとしてPersonというstructがあるとする。以下の様な形式のデータ。
これがそのまま永続化されるイメージ。

```go
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
```

これがjson responseとして出力される場合は以下の様になる。

```go
b, err := json.Marshal(person)
if err != nil {
	log.Fatal(err)
}
fmt.Println(string(b))
```

json

```
{"name":"foo","age":20}
```

## infoの付加

出力の形式としては代わりはしないのだけれど、内部的な情報を持ちたいということがあったとする。
例えばinfoというフィールドを新たに追加するが、apiのresponseには含めたくない。

このような場合は"-"をつければ良い。

```
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Info string `json:"-"`
}
```

json

```
{"name":"foo","age":20}
```

ここまではおさらい。

## 色々な形状に変換して出力

その後、色々紆余曲折があって、先のInfoにあたる情報のstructが分かれ別の物になったとする。

```go
type Person struct {
	ID   string `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`

	// 内部のデータ処理の際にはこの値を保持していることを前提にしている
	Info *PersonInfo `json:"-"`
}

type PersonInfo struct {
	PersonID string `json:"personID"`
	Content  string `json:"content"`
}
```

内部の操作ではPersonはサブ的な情報のInfoにアクセスできることを前提として扱う。これはデータを取得するタイミングで内部のInfoも含めて取得する。(構造としてはこのような形ではなく、逆にPersonがIfoIDのような形でPersonInfoのforeign key的な情報を持つことのほうが多いかもしれない。)

これをそのまま出力すると以下の様になる。

```
{"id":"1","name":"foo","age":20}
```

ところで、今度はInfoも含めたresponseも作る必要がでてきた。この時には色々埋め込んだ型を経由して出力すると便利というのが今回話したい事。

### 子としてInfoを持つ

子としてinfoの情報を持ちたい場合には以下の様にする。もちろんネストした形式になる。

```go
// with info
type M struct {
	*Person
	Info *PersonInfo
}
json.Marshal(&M{Person: person, Info: person.Info})
```

出力は以下の様になる。

```
// {"id":"1","name":"foo","age":20,"Info":{"personID":"1","content":"yay"}}
```

### Infoの情報をフラットにする

ネストした表現にしたくはない場合には両方埋め込みにすれば良い。

```go
// with info, inline
type M struct {
	*Person
	*PersonInfo
}
json.Marshal(&M{Person: person, PersonInfo: person.Info})
```

出力は以下の様になる。

```
{"id":"1","name":"foo","age":20,"personID":"1","content":"yay"}
```

### 特定のフィールドの情報を消す

ところで、先程の２つの出力結果を見ると、personIDというフィールドが出力に増えてしまっている。
同一のデータの出力表現(Personに対する表現)ということで隠したい場合もあるかもしれない。以下のような形で打ち消せる。


```go
// with info, inline, no personID
type _N struct {
	*PersonInfo
	PersonID string `json:"personID,omitempty"`
}
type M struct {
	*Person
	*_N
}
json.Marshal(&M{Person: person, _N: &_N{PersonInfo: person.Info}})
```

出力結果は以下の様になる

```
{"id":"1","name":"foo","age":20,"content":"yay"}
```

もちろん、このMのPersonIDはnilで内部のpersonのpersonIDは"1"なので、この種の操作はコードの終端で行うべき事柄のものではありそう。
t検定

####t検定(分散が等しい場合)
分散の推定量$U_{e}$

```math
U_{e}=\frac{(m-1)U_{x}+(n-1)U_{y}}{m+n-2}
```

t検定量の算出

```math
t = \frac{|\bar{X}-\bar{Y}|}{\sqrt{U_{e}(\frac{1}{m}+\frac{1}{n})}}
```

```r
t_test <- function(x,y){
  n.x <- length(x)
  n.y <- length(y)
  m.x <- mean(x)
  m.y <- mean(y)
  s <- ((n.x-1)*sum((x-m.x)^2)/(n.x-1) + (n.y-1)*sum((y-m.y)^2)/(n.y-1))/(n.x+n.y-2)
  t <- abs(m.x-m.y)/sqrt(s*(1/n.x + 1/n.y))
  return(t)
}
```

####t検定(分散が等しくない場合)
不偏分散

```math
U_{x} =\frac{1}{m-1}\sum_{n=1}^{m}(x_{i}-\bar{x})^2
```

t検定量の算出

```math
t = \frac{|\bar{X}-\bar{Y}|}{(\frac{U_{x}}{m}+\frac{U_{y}}{n})}
```

```r
t_test_welch <- function(x,y){
  m.x <- mean(x)
  m.y <- mean(y)
  n.x <- length(x)
  n.y <- length(y)
  s.x <- sum((x-m.x)^2)/(n.x-1)
  s.y <- sum((y-m.y)^2)/(n.y-1)
  t <- abs(m.x - m.y) / sqrt(s.x/n.x + s.y/n.y)
  df <- (s.x/n.x+s.y/n.y)^2 / (s.x^2/(n.x^2*(n.x-1)) + s.y^2/(n.y^2*(n.y-1)))
  return(c(t, df))
}
```

自由度vの確率密度関数

```math
f(t|v)= \frac{\Gamma(\frac{v+1}{2})}{\sqrt{v\pi}\Gamma(\frac{v}{2})}(1+\frac{t^2}{v})^{-\frac{v+1}{2}}
```

```r
dt <- function(t,v){
  gamma((v+1)/2)/(sqrt(v*pi)*gamma(v/2))*(1+t^2/v)^(-(v+1)/2)
}
```

自由度vの累積確率関数

```math
F(t|v)= \int_{-\infty}^{t}\frac{\Gamma(\frac{v+1}{2})}{\Gamma(\frac{v}{2})}\frac{1}{\sqrt{v\pi}}\frac{1}{(1+\frac{t^2}{v})^{\frac{v+1}{2}}}dt
```

```r
cdf_t <- function(t, v){
  tmp <- function(x){
    gamma((v+1)/2) / gamma(v/2) / sqrt(v*pi) * (1+x^2/v)^(-(v+1)/2)
  }
  return(integrate(tmp, lower=Inf, upper=t)[[1]])
}
```
GitHub のプロフィール画像をデフォルトに戻す

GitHub は新規アカウントを作ると、デフォルトで、ユーザー名からプロフィール画像を生成してくれます。
一般的には [Identicon](https://en.wikipedia.org/wiki/Identicon) と言うらしいですが、Github の Identicon は特にカッコイイ。こんな感じのなんかインベーダーゲームの敵みたいなやつら。

![identicons.jpg](https://qiita-image-store.s3.amazonaws.com/0/43781/656c16ec-b23e-7e85-c5df-3b4e80e48bee.jpeg)

でもこのステキな Identicon なんですが、 GitHub の設定画面からプロフィール画像をアップロードしてしまうと、なんと、元に戻せません！！
これで自分の Identicon を失ってしまった方、結構いませんか？
私もやっちまった１人です。

でもご安心ください、実はこの Identicon、次のURLからいつでも見ることが出来るんです。

```
https://identicons.github.com/<自分のユーザー名>.png
```

これで Identicon をいつでも取り戻せますね！

参考: [GitHub のブログ記事](https://github.com/blog/1586-identicons)
プロセスが終わったことを標準出力に出力するツールを作った


Go で Windows API をいじってみたかったのと、実用上のために、Go でコマンドラインツールを作ってみました。

[![shu-go/obit](https://img.shields.io/badge/GitHub-shu--go%2Fobit-brightgreen?logo=github)](https://github.com/shu-go/obit)

# 概要

obit というコマンドラインツールを作りました。
現在のところ、個人的な環境の関係上、Windows オンリーです。

既に起動中のウィンドウタイトルもしくはプロセス名を渡すことで、そのプログラムが終了するまで待機するツールです。

```bash:実行例
> obit メモ帳 秘密のテキスト
```

obit は、引数に渡された名前（スペース区切り可）をすべて含むようなウィンドウもしくはプロセスを検索し、そのプロセスの終了まで待機します。

対象のプロセスが終了した際、obit は標準出力にそのプロセスに関する情報を出力します。
待機対象が複数の場合は、プロセスが終了する毎に出力されます。

```bash:上記の結果
秘密のテキスト.txt - メモ帳(notepad.exe)
```

ちなみに、obit の名前は「obituary (死亡記事)」からとっています。

# 開発

基本的には、DLLの呼び出しは syscall.NewLazyDLL と NewProc を使っています。
この場合、Windows API との呼び出しや戻り値の取得は uintptr を使ってすることになります。この変換が地味に面倒です。

その点、golang.org/x/sys/windows 便利ですね。
相当数の API の呼び出しがラッピングされています。自然な型を使って Windows API が呼び出せるのでコーディングがしやすいです。
ただ、カバーされていない API もあり、その場合は仕方なく上に挙げた方法で呼び出しをしています。
間髪入れずにすぐ別Sceneへ移動したい場合

今日ゲームを作ってる時につまづいたことをメモがてら公開。

つくってるゲームが最初に表示するSceneは、「NowLoading」とか出てるシーンにしようとしたんですが、AppDelegateに`LoadingScene.hpp`とか`LoadingScene::create()`と書くのが「なんか気持ち悪い」ので、かっこよく（？）`StartingScene`てのにしようと思ったのがはじまりです。

「無駄なSceneひとつかませるのって無駄じゃね？」とは思いましたが「後々何かに使うかも」とエターナりそうな理由でさあ開始。

<h1>最初はこんな形だった</h1>

```cpp:StartingScene.cpp
cocos2d::Scene *StartingScene::createScene() {
    //〜〜〜いろいろ書いてるけど最低限しか書いてないので省略〜〜〜
}
bool StartingScene::init() {
    if (!Scene::init()) {
        return false;
    }
    TransitionFade* fade = TransitionFade::create(1.0f, LoadingScene::create(), Color3B::BLACK);
    Director::getInstance()->replaceScene(fade);
}
```

これでいけるよなーって思ったんですよ。遷移もしっかりしてるし、LoadingSceneのinitも呼び出せてるし。
でも、呼び出し先で貼ってるラベルやら画像やらが出てこない。Why???

<h1>試行錯誤した結果</h1>

```cpp:StartingScene.cpp
cocos2d::Scene *StartingScene::createScene() {
    //〜〜〜いろいろ書いてるけど最低限しか書いてないので省略〜〜〜
}
bool StartingScene::init() {
    if (!Scene::init()) {
        return false;
    }
    scheduleOnce(schedule_selector(StartingScene::sceneChange), 0);
}
void StartingScene::sceneChange(float d) {
    TransitionFade* fade = TransitionFade::create(1.0f, LoadingScene::create(), Color3B::BLACK);
    Director::getInstance()->replaceScene(fade);
}
```

これで解決しました。
たぶんinit内じゃ遷移を受け付けないのかな・・・？
でも以前マルチスレッド立ててその中で遷移させたときは、遷移先のSceneに登録してた画像も出てたんだよなー・・・。

ちょっともやもや感が残ってますが、何かしらティンときたら追記します。
【大枠】paramsでハッシュの中のハッシュから値を取得するお話

#こんなことありませんか？
フォームから送られてきたパラメーターをparamsメソッドを使って取得し値をデータベースに保存しようとしたが一部ハッシュが二重構造になっている・・・・・・。

【パラメーター】
`=> {"utf8"=>"✓", "name"=>"takeshi", "age"=>"22", "IT"=>{"Engineer"=>"front"}}`

このような場合は、
`params.permit(:name, :age).merge(job: params[:IT][:Engineer])`と書くことで解決。
**paramsメソッドはキーを続けて記述することでハッシュの中にハッシュがある場合でも値を取り出すことができる。**
[Unity] ローカルデータでのAssetBundleとResourcesでローカライズ処理の比較 Part2

#内容
ローカルデータ(StreamingAssets)に置かれたAssetBundleを使用して
ローカライズ処理を実装したときの検証。

[前回](http://qiita.com/akerusoft/items/141b73c9ead016675ba4)は
実際のアプリで利用したデータを使ったガチな動作検証しました。
そのためプロジェクトが公開できないため「お前の実装が悪いからだろ」と思われても仕方なかったので、今回はコードを公開できるようにしました。

https://github.com/akerusoft/UnityTestAssetBundle

#環境
Unity 5.4.0p4
Windows10
実行環境
Android 4.0.4
ビルドはMonoでデバッグ情報は付加しないリリースビルドで。
(IL2CPPはAssetBundleのストリップ問題がおきると面倒だったので)

#結果
Unload処理を実装したことでメモリ使用量を減らすことができた。

|  | Original[ms] | AssetBundle[ms] | Original(Memory) | AssetBundle(Memory) |
|--:|--:|--:|--:|--:|
| 1 | 1,384 | 4,959 | 3,486,585 | 4,017,983 |
| 2 | 635 | 643 | 3,492,287 | 4,024,412 |
| 3 | 685 | 546 | 3,495,289 | 4,031,521 |
| 4 | 580 | 728 | 3,498,089 | 4,035,604 |
| 5 | 575 | 799 | 3,501,059 | 4,039,223 |
| 6 | 569 | 783 | 3,503,439 | 4,042,826 |
| 7 | 567 | 728 | 3,506,779 | 4,045,949 |
| 8 | 574 | 759 | 3,509,639 | 4,050,032 |
| 9 | 572 | 750 | 3,512,499 | 4,053,427 |
| 10 | 557 | 768 | 3,515,359 | 4,057,270 |
| Average | 670 | 1,146 | 3,502,102 | 4,039,825 |
| Max | 1,384 | 4,959 | 3,515,359 | 4,057,270 |
| Min | 557 | 546 | 3,486,585 | 4,017,983 |
|  |  |  |  |  |
| Originalとの比較 |  |  |  |  |
| Average |  | 1.71 |  | 1.15 |
| Max |  | 3.58 |  | 1.15 |
| Min |  | 0.98 |  | 1.15 |

特出しているのは初回で、ロードとアンロードが実行されるので
シーンの読み込みに5秒近くかかってるということ。


#前回との差異
今回はAssetBundleの読み込み処理をUnity社が作ったAssetManagerを使用しています。

https://www.assetstore.unity3d.com/jp/#!/content/45836
(メンテナンスされていないので警告が結構でますが、、、)

画像はUnity社が提供しているUnityちゃんのもので
実装についてもUnity社公式のものだけで実装しました。

#解決したい点
AssetBundleを利用するときメモリ使用量が多くなってしまうのは仕方ないことですかね！？
メモリ使用量を抑えつつ、読み込みも早くなる手段を知りたいです。


#感想
やっぱUnityリソース読むの遅い。
うーん、困った。
LINE Bug Bounty Programに報告して認定された脆弱性

[LINE Security Bug Bounty Program](https://bugbounty.linecorp.com/ja/)

今は無期限で実施されているが、2015年に期間限定で行われていたときに報告して報奨金をもらった脆弱性。類似の問題が無いか調査中であることと、旧バージョンのクライアントの利用者がいるから、公表を控えるようにと言われていた。規約の機密保持の期限の1年が過ぎたから訊いてみたところ、公表して問題無いとのことだったので、公開する。

関連：

- [LINE Bug Bounty Programに報告して認定されなかった脆弱性（1） \- Qiita](http://qiita.com/kusano_k/items/d8a5b40317c35c7719fa)
- [LINE Bug Bounty Programに報告して認定されなかった脆弱性（2）／先を越されていた脆弱性 \- Qiita](http://qiita.com/kusano_k/items/41034e010adbc801da0d)

# iOS版のLINEアプリのディレクトリトラバーサル

LINEにはファイルを送信する機能がある。このファイル名にディレクトリトラバーサルの脆弱性があった。このファイル名を `/../../../../../Documents/test.txt` のように `../` を含んだものにすると、相手がファイルをタップしたときに、ファイルを保存するディレクトリ外にファイルが保存される。iOS版だけで、Android版にはこの脆弱性は無かった。500ドル。

確認するのが面倒だった。Androidならばルートを取れば良いけど、私の持っているiPhoneは当時の最新版にしていたので脱獄できなかったし、Appleの開発者登録もしていなかった。PCにバックアップを取り、[このツール](https://www.ibrowseapp.com/)でバックアップの中を確認した。

この脆弱性がどう悪用できるか。ファイルが書き込めるのだから、適当なファイルに書き込めば任意コード実行（報奨金1万ドル）くらいできるのではないかと思ったが、iOSにはchrootのようなサンドボックスがあって、他のアプリやOSのファイルは触ることができない。頑張って悪用できるようなLINEアプリのファイルを探せば、報奨金がもっといっぱいもらえたかもしれない。

# 日程調整の短縮URLがHTTPであること

<a href="https://qiita-image-store.s3.amazonaws.com/0/25276/0faa8a9b-71ea-b52b-0b64-30edd169341e.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/0faa8a9b-71ea-b52b-0b64-30edd169341e.png" width="320"></a>

このURLがHTTPであることを指摘したら、500ドルもらえた。LINE太っ腹。

個人的には、HTTPと書かれたURLにアクセスして平文で通信が行われるのは、脆弱性ではなく利用者が気をつけるべき事だと思っている。が、もらえるものはもらっておこう。

それよりも、このURLが短縮URLになっていることが問題だと思っている。日程調整のページはユーザーの認証などは行われておらず、[URLを秘密にすることで第三者が日程を閲覧したり編集したりできないようになっている](http://qiita.com/kusano_k/items/d8a5b40317c35c7719fa#%E6%97%A5%E7%A8%8B%E8%AA%BF%E6%95%B4)。そのために、日程調整のURLは26文字の英小文字と数字のランダム文字列になっている。取り得るパターンは、36<sup>26</sup>≒3*10<sup>40</sup> 通り。これが7文字の英数字になることで、62<sup>7</sup>≒4*10<sup>12</sup> 通りと、パターン数が大きく減っている。さすがに連番でこのURLが決まっているわけではないものの、ひたすらURLを叩き続ければどこかの誰かの日程調整を引き当てる可能性もあるくらいの数。HTTPの件と合わせて報告したけれど、特に修正はなされていないので、これは仕様らしい。
調剤薬局のためのデータベース講座 #5 医薬品テーブルの作成

元動画はこちら　[https://youtu.be/IfY8BZ0rXUY](https://youtu.be/IfY8BZ0rXUY)

```sql:テーブルyの作成
CREATE TABLE `y` (
  `c1` decimal(1,0) unsigned NOT NULL,
  `c2` char(1) NOT NULL,
  `c3` decimal(9,0) unsigned zerofill NOT NULL,
  `c4` decimal(2,0) unsigned NOT NULL,
  `c5` varchar(96) NOT NULL,
  `c6` decimal(2,0) unsigned NOT NULL,
  `c7` varchar(60) NOT NULL,
  `c8` decimal(3,0) unsigned NOT NULL,
  `c9` decimal(1,0) unsigned NOT NULL,
  `c10` varchar(18) NOT NULL,
  `c11` decimal(1,0) unsigned NOT NULL,
  `c12` float unsigned NOT NULL,
  `c13` decimal(1,0) unsigned NOT NULL,
  `c14` decimal(1,0) unsigned NOT NULL,
  `c15` decimal(1,0) unsigned NOT NULL,
  `c16` decimal(1,0) unsigned NOT NULL,
  `c17` decimal(1,0) unsigned NOT NULL,
  `c18` decimal(1,0) unsigned NOT NULL,
  `c19` decimal(1,0) unsigned NOT NULL,
  `c20` decimal(1,0) unsigned NOT NULL,
  `c21` decimal(5,0) unsigned NOT NULL,
  `c22` decimal(1,0) unsigned NOT NULL,
  `c23` decimal(9,0) unsigned NOT NULL,
  `c24` decimal(1,0) unsigned NOT NULL,
  `c25` float unsigned NOT NULL,
  `c26` decimal(1,0) unsigned NOT NULL,
  `c27` decimal(1,0) unsigned NOT NULL,
  `c28` decimal(1,0) unsigned NOT NULL,
  `c29` CHAR(1) DEFAULT NULL,
  `c30` char(8) NOT NULL,
  `c31` char(8) NOT NULL,
  `c32` char(12) NOT NULL,
  `c33` decimal(9,0) unsigned NOT NULL,
  `c34` char(8) NOT NULL,
  `c35` varchar(300) NOT NULL,
  PRIMARY KEY (`c3`)
) ;
```

```sql:y.csvの読み込み
set character_set_database = sjis;

load data 
  local infile 'C:/Users/{ユーザー名}/Desktop/y.csv'
  replace into table y
  fields terminated by ',' enclosed by '"'
  lines terminated by '\r\n';
     
set character_set_database = utf8;
```

```sql:テーブルmedisの作成
CREATE TABLE `medis` (
  `c1` char(13) NOT NULL,
  `c2` char(7) DEFAULT NULL,
  `c3` decimal(2,0) unsigned DEFAULT NULL,
  `c4` decimal(2,0) unsigned DEFAULT NULL,
  `c5` decimal(2,0) unsigned DEFAULT NULL,
  `c6` char(13) DEFAULT NULL,
  `c7` char(12) DEFAULT NULL,
  `c8` char(12) DEFAULT NULL,
  `c9` decimal(9,0) unsigned DEFAULT NULL,
  `c10` char(9) DEFAULT NULL,
  `c11` varchar(180) DEFAULT NULL,
  `c12` varchar(180) DEFAULT NULL,
  `c13` varchar(135) DEFAULT NULL,
  `c14` varchar(120) DEFAULT NULL,
  `c15` varchar(24) DEFAULT NULL,
  `c16` float unsigned DEFAULT NULL,
  `c17` varchar(24) DEFAULT NULL,
  `c18` float unsigned DEFAULT NULL,
  `c19` varchar(24) DEFAULT NULL,
  `c20` varchar(3) DEFAULT NULL,
  `c21` varchar(30) DEFAULT NULL,
  `c22` varchar(30) DEFAULT NULL,
  `c23` decimal(1,0) unsigned DEFAULT NULL,
  `c24` char(8) DEFAULT NULL,
  PRIMARY KEY (`c1`)
) ;
```
```sql:MEDISXXXXXXXX.TXTの読み込み
set character_set_database = sjis;

load data 
  local infile 'C:/Users/{ユーザー名}/Desktop/MEDISXXXXXXXX.TXT'
  replace into table medis
  fields terminated by ',' enclosed by '"'
  lines terminated by '\r\n'
  ignore 1 lines;
     
set character_set_database = utf8;

```
機械学習レシピ#4 Let’s Write a Pipeline

https://www.youtube.com/watch?v=84gqSbLcBFE&list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal&index=4

- 教室付き学習の為の基本的なパイプラインコード化
- 複数の分類器が同じ問題を解く様子を見る
- アルゴリズムがデータからものを学ぶとはどういうことか

## SPAM分類器をつくる
受信メールにSPAMかSPAMでないかとラベル付けする関数

データを集めて、モデルを学習させる準備ができたとする。
しかし実際に運用を始める前に答える必要がある質問がある。
学習データにないEメールを分類するのに精度はどれくらいになるのか。
モデルを導入する前にうまく機能するのかできるだけ検証したい。

#### 方法1) データセットを２つ（学習（モデルの学習用）とテスト（新データに対する精度検証））に分割

```math
\begin{align}
f(x) &= y
\end{align}
```
xは入力(features)。yは出力（ラベル）

```
# import a dataset
from sklearn import datasets
iris = datasets.load_iris()

# 分類器を関数と考える１つの方法のため。特徴量x、ラベルyを呼び出す。
x = iris.data
y = iris.target

# x_trainとy_trainは学習セットの特徴量とラベル
# x_testとy_testはテストセットの特徴量とラベル
# test_size = .5はデータの半分をテストに使うことを意味
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = .5)

# 分類器をつくる。今回は決定木を利用。
from sklearn import tree
my_classifier = tree.DecisionTreeClassifier()

# 上の２行を下の２行に置き換えればK近傍を使用した分類器を使うことができる。
# from sklearn.neighbors import KNeighborsClassifier
# my_classifier = KNeighborsClassifier()

# 学習データを使って分類器を学習させる
my_classifier.fit(x_train,y_train)

# 予測メソッドを呼び出しテストデータを分類。（分類器がテストデータの各行に対して予測）
predictions = my_classifier.predict(x_test)

# 予測した結果のラベルを出力
print predictions

# テストセットに対する分類器の精度(スコア)を確認
from sklearn.metrics import accuracy_score
print accuracy_score(y_test,predictions)
```

多種の分類器があるいっぽう、高レベルではそれらのインタフェースは似ている。

## データから学ぶとは
ラベルと特徴は関数の関係に似ている。
xは入力(features)。yは出力（ラベル）

```math
\begin{align}
f(x) &= y
\end{align}
```

```
def classify(features):
 # do some logic
 return label
```

教師付き学習で既にしってるように、この関数を自分たちでは書かず、学習データからそれを学ぶアルゴリズムが欲しい。

関数を学ぶとはどういう意味なのか？
関数は入力値から出力値への対応付けにすぎない。

例えばy=mx +b は直線の関数で、パラメータは２つ（傾きを表すmとy切片を表すb）。
これらのパラメータがあればxの異なる値に対する関数を図示できる。
classify関数にもいくつかパラメータがあるが、入力xは分類したい例の特徴量で、出力yはラベル。
この線をどうやって学ぶのか。
学習データを使ってモデルのパラメータを調整。
　　　⇒どうやってパラメータを覚えるのか
　　　　　　⇒学習データを使って繰り返し調整する。
　　　　　　　　適当に線を引いて、答えがあってたら線は変更せず、間違ってたらモデルのパラメータを調整してもっと正確になるようにする。


関数の本体はどのように見えるのか？
⇒アルゴリズム的に書きたい、学びたい部分。
<Font color="red">我々一から始めているのではなく、どこからともなく関数の本体を引っ張ってきている。我々はモデルから始めている。モデルを試作品とか関数の本体を定義する規則と考えて良い。</Font>
RasPiでMySQL-データ保存先をNASに指定する-

# はじめに
/etc/mysql/my.cnf の datadirを変更するだけで良いと思ったが、なかなかうまく行かずハマったので記録に残す。

# 使用した機器
- Raspberry Pi3 ModelB（以後RasPiと表記）  
- LinkStation LS-Y1.0TL（以後NASと表記） 

# 手順  
## 0. RasPiにLAMP環境を導入する  
下記情報を参考にさせていただきました。
[Raspberry Pi 2 (Raspbian) で LAMP 環境を構築する](http://qiita.com/bird_nitryn/items/e373fe077139b39ef609)  

## 1. RasPiにNASをマウントする。  
```sh:
$ sudo su  
$ mkdir /mnt/nas  
$ mount -t cifs //(NASのIPアドレス)/share /mnt/nas -o uid=mysql,gid=mysql  
```
## 2. マウント先でMySQL用のディレクトリを作成する。  
```sh:  
$ mkdir /mnt/nas/mysql_data  
```

## 3. MySQLがデフォルトで参照するディレクトリの名前を変更し、中身をマウント先に作成したディレクトリにコピーする。
```sh:  
$ mv /var/lib/mysql /var/lib/_mysql 
$ cp -pR /var/lib/_mysql /mnt/nas/mysql_data
```

## 4. マウント先に作成したディレクトリのシンボリックリンクをデフォルトの参照先に作成する。
```sh:  
$ ln -s /mnt/nas/mysql_data/ /var/lib/mysql 
```

## 5. MySQLを再起動する
```sh:  
$ /etc/init.d/mysql restart 
```
Vue.js 2.0 の始め方 


Vue.js が2.0になってから始め方がちょっと変わったのでメモ

## CDN を使用する

Vue.js のCDN は`unpkg.com`に移行した模様。

この形式だと、今まで通りのやり方で導入できる。

````
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Vue</title>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
  <div id="app">
  	...
  </div>
  <script>
    new Vue({
      el: '#app',
      data: {
      },
    })
  </script>
</body>
</html>
````

ちなみに VueRouterの CDNは `https://unpkg.com/vue-router` になります。

vue-cli で `simple` テンプレートを使用するとこちらの形式が利用されるようです。

## Webpack を使用する

Webpack を使用して記述する際には少し工夫が必要です。

Webpack を利用したmodule system では、以下の様な形で`vue`を読み込もうとすると思う。

````
// ES6 Style
import Vue from 'vue'

// Common.js Style
const Vue = require("vue")
````

不幸にもこの形式では、 Node 版の Vue.js が落ちてくるのでブラウザでそのまま利用する事は出来ない。

この記述を使いつつブラウザで有効な Vue.js アプリケーションを作成するには Webpack 側で以下の様な設定が必要になる。

````
  resolve: {
    alias: {
      'vue': 'vue/dist/vue',
    }
  },
````

`resolve.alias` で node_modules 内のブラウザ用distコードを読み込むことで、ブラウザで利用可能な Vue が取得可能になります。

vue-cli で `webpack` 関連のテンプレートを使用するとこちらの形式が利用されるようです。