OmniAICreator/Qiita-1.07M huggingface dataset:
OS XにLaravel Homesteadをインストールする時に勘違いしていたこと

こんにちは、佐藤裕介です。

今日から本格的にPHPフレームワークのLaravelの学習を始めようと思ったところ、速攻はまったので、同じような勘違いをする方を減らすために記事を書いておきます。

ソフトウェア開発で何氣なく最初に引っかかり安いのが環境構築ではないかと思います。

今回は、Laravel開発チームが開発環境の仮想イメージを用意してくれるとのことでそれを利用することにしました。

VirtualBoxとVagrantがあれば簡単に環境用意ができると。

早速、両者のインストールを実施するも、そもそもVagrantの使い方を忘れていることに氣がついたわけです。

どこの文献や情報にもひとまず以下のコマンドを実施せよと書いてあります。

```
$ vagrant box add laravel/homestead
```

ここで「どのターミナルからやるねん！」と関西弁混じりのツッコミを心の中でしており、まずは、VirtualBoxの環境を最初に作ったわけです。

その後、Vagrantをインストール。

・・・

ここで思考停止。

VagrantとVirtualBoxってどうやって関連付けるのだっけ？

と、思いながら、閃きました。

「あ、そっか、OS Xのターミナルね！」

```
$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'laravel/homestead' (v3.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/versions/3.0.0/providers/virtualbox.box
    box: Progress: 19% (Rate: 191k/s, Estimated time remaining: 0:41:16)
```

おお！　ここでVMを選ぶのだね。

とういう氣付きがありました。

ネット上では、この辺りはごく当たり前の話なので説明は当然ありません。

なので、こういうしょうもないことではまる方が減って本来やりたいPHPフレームワークのLaravelでのアプリケーション開発を進められる方が増えますように・・・
MacにNode.jsをインストールした時の話


Node.jsをやる事になったので事始め的な感じで自分のMacにNode.jsをインストールしてみた。
基本的には[Macにnode.jsをインストールする手順。](http://qiita.com/akakuro43/items/600e7e4695588ab2958d)に沿ってインストールを始めた。

## nodebrewのインストールでコケた
最新版を下記のコマンドで取得してみた。

```terminal上でのコマンド
$ nodebrew install-binary latest
```

ところがどっこい。何やらエラーが吐かれ、インストールに失敗。

```出力ログ
download failed: https://nodejs.org/dist/v8.4.0/node-v8.4.0-darwin-x64.tar.gz
```

## 解決方法
調べてみると何やら専用のディレクトリが存在しないせいで発生したエラーだった模様。
下記のコマンドでディレクトリを作成。

```terminal上でのコマンド
$ mkdir -p ~/.nodebrew/src
```

再度コマンド実行してみると

```出力ログ
Installed successfully
```


その後は記事に乗っている手順通りトントン拍子でNode.jsのインストールに成功。
Servlet3.1のFilterの順番を指定する方法


ちょっとハマったのでまとめます。

## 事前準備

以下のServletを実行して、Filterの順番を確認します。

```java:HelloWorld.java
@WebServlet(urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    PrintWriter out = response.getWriter();
	    out.println("Hello World: ");
	}
}
```


# 1. web.xmlを使わない方法
Filterの順番は定義しません。


```java:SampleFilter1.java
@WebFilter(filterName="SampleFilter1", urlPatterns="/*")
public class SampleFilter1 implements Filter {
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	System.out.println("SampleFilter1");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {}
	public void destroy() {}
}
```

```java:SampleFilter2.java
@WebFilter(filterName="SampleFilter2", urlPatterns="/*")
public class SampleFilter2 implements Filter {
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	System.out.println("SampleFilter1");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {}
	public void destroy() {}
}
```

`/HelloWorld`にアクセスすると、コンソールに以下の行が表示されます。

```txt:console
SampleFilter1
SampleFilter2
```




# web.xmlを使う方法(`<url-pattern>`を指定しない）

Filterは、上記のFilterと同じです。

```xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

   <filter-mapping>
		<filter-name>SampleFilter2</filter-name>
		<url-pattern />
	</filter-mapping>
	<filter-mapping>
		<filter-name>SampleFilter1</filter-name>
		<url-pattern />
	</filter-mapping>

</web-app>
```

```txt:console
SampleFilter1
SampleFilter2
```

SampleFilter2, SampleFilter1の順番でweb.xmlに定義しましたが、この順番でFilterは実行されませんでした。

# web.xmlを使う方法(`<url-pattern>`を指定する）

Filterは変更なし。

```xml:web.xml
<filter-mapping>
    <filter-name>SampleFilter2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
	<filter-name>SampleFilter1</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
```

web.xmlに定義した順番で、Filterが処理されました。

```txt:console
SampleFilter2
SampleFilter1
```

# まとめ
web.xmlに定義した`<url-pattern>`が優先されるているような感じ？
react-router v4でのJavaScriptでのリンクの作り方

[React-Router](https://github.com/ReactTraining/react-router) v4ではリンクの作成は、次のように行います。

```js
<Link to='/my/link'>Link</Link>
```

これで、aタグが生成されます。ただし、実際の処理はhrefの値が使われているのではなく、onClickでhistoryにpushしてますね。あとは、React-Routerで画面遷移する方法としてはRedirectがあります。これも次のような感じでJSXで記述します。

```js
<Redirect to='/my/link' />
```

## リダイレクト
さて、ボタンで処理す場合など、JavaScriptの中から画面遷移したいケースがあります。この場合は、もっとも簡単なのがstateを使って遷移先を指定して、renderの中でリダイレクトさせるやり方です。

```js
class MyComponent extends Component {
    state = { redirectUrl: null }

    redirectTo(target) {
        this.setState({ redirectUrl: target })
    }

    render() {
        if (this.state.redirectUrl) {
            return <Redirect to={this.state.redirectUrl} />
        }

        return <button onClick={() => {this.redirectTo('/my/link')}}>Link</button>
    }
}
```

## ヒストリ

リダイレクトもいいですが、v4以前のようにhistoryにpushできます。  react-routerの[Issue](https://github.com/ReactTraining/react-router/issues/1077) を見ていると、

```
Feel free to look at Links implementation and create your own with an async api.
```

とあります。Linkの実装を見ていると、次のように書けばとりあえずは動きます。


```js
class MyComponent extends Component {
    static contextTypes = {
        router: PropTypes.shape({
            history: PropTypes.shape({
                push: PropTypes.func.isRequired,
                replace: PropTypes.func.isRequired,
                createHref: PropTypes.func.isRequired
            }).isRequired
        }).isRequired
    }

    render() {
        return <button onClick={() => {this.context.router.history.push('/my/link')}>Link</button>
    }
}
```

## おわり

結局、どう書くのがセオリーなんでしょうね。history.pushのほうが自然な気がしますが、毎回contextTypesを書くのは不毛に見えます。


でわでわ
roslibjsでブラウザにROS Topicの時系列グラフを描く

##目的
　robotwebtoolsのroslibjsを使って、RosのTopicをWEBブラウザからグラフで表示する。
　スマホなどでも、ROSのTopicの時系列データを見ることができる。
　rviz/rqtが使えない環境でのデバックなどの活用が期待できる。
　
　グラフ作成には、[smoothiecharts.js](http://smoothiecharts.org/examples/example1.html)を使う。
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/8fe667a3-6c25-5974-8a40-1afb29791baa.jpeg)

smoothiecharts.js：   http://smoothiecharts.org/
Github:   https://github.com/joewalnes/smoothie/

##Install 
まず、ROSの動作するPCに、
rosbridge-server、robot-pose-publisher をインストールする。

ROS Indigoの場合

```
$ sudo apt-get install ros-indigo-rosbridge-server
$ sudo apt-get install ros-indigo-robot-pose-publisher 
```

ROS Kineticの場合

```
$ sudo apt-get install ros-kinetic-rosbridge-server
$ sudo apt-get install ros-kinetic-robot-pose-publisher 
```

##apache2のインストール
Apache2(webサーバ)をインストールする。

```
sudo apt-get install apache2
```



##launchファイルからのノード起動
rosbridge-server・robot-pose-publisher を起動する。
これと別にTopicを発行させておく。

```
<launch>
 <node pkg="robot_pose_publisher" type="robot_pose_publisher" name="robot_pose_publisher">
 </node>
 <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" > 
   <arg name="port" value="9090"/>
 </include>
</launch>
```

RoslibjsからTopicをsubscribeし、smoothiecharts.jsに渡すHTMLを作成し、/var/www以下に配置する。

```html
<html>
  <head>
   <script src="https://raw.githubusercontent.com/joewalnes/smoothie/master/smoothie.js"></script>
   <script src="http://cdn.robotwebtools.org/EaselJS/current/easeljs.min.js"></script>
   <script src="http://cdn.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script>
   <script src="http://cdn.robotwebtools.org/roslibjs/current/roslib.js"></script>
   <script src="http://cdn.robotwebtools.org/ros2djs/current/ros2d.js"></script>

    <script type="text/javascript">
	var TimeLine1 = new TimeSeries();
	var value1 = '0.0';
	var ros = new ROSLIB.Ros({
	url : 'ws://127.0.0.1:9090'
	});

	var listener = new ROSLIB.Topic({
	ros : ros,
	name : '/teat_data',
	messageType : 'std_msgs/Float32'
	});
	
	listener.subscribe(function(message) {
	console.log('Received message on ' + listener.name + ': ' + message.data);
	value1=message.data;
	});
			
 	setInterval(function() {
 	      TimeLine1.append(new Date().getTime(), value1);
       	}, 50);
      
	function createTimeline() {
	 var chart = new SmoothieChart();
	 chart.addTimeSeries(TimeLine1, { strokeStyle: 'rgba(0, 255, 0, 1)', fillStyle: 'rgba(0, 255, 0, 0.2)', lineWidth: 4 });
         chart.streamTo(document.getElementById("chart"), 500);
	}
    </script>

  </head>
  <body onload="createTimeline()" >
    <canvas id="chart" width="640" height="160"></canvas>
  </body>
</html>
```

参考

[ROSのWebインタフェースを作る](http://qiita.com/yoneken/items/7e45ad3fcf8010ed98ed)
[move_baseをWEBブラウザから操作する。](http://qiita.com/nnn112358/items/98d95f2cc2cf76d8e2b1)

http://robotwebtools.org/
https://github.com/RobotWebTools
gitコマンドメモ

使うけど忘れやすいgitコマンドの自分用メモです。
## ブランチの一覧を表示(aはリモートブランチも表示する)
``` git branch -a ```

## ブランチの作成
``` git branch new_branch ```

## チェックアウト
``` git checkout new_branch ```

## ブランチの作成とチェックアウトを同時に行う
``` git checkout -b new_branch ```

## ステージングに追加
``` git add * ```
## コミット
``` git commit -m "comment." ```

## リモートブランチへプッシュする
``` git push origin hoge_branch ```

## 変更したファイルを変更前に戻す
``` git checkout HEAD file_name ```

## 打ち消しのコミットを作成する
``` git revert commit ```

## リベース
### リベース開始
``` git rebase hoge_branch ```

### コンフリクトを解消してリベースを継続する
``` git rebase --continue ```

### リベースを終了する(リベース前の状態に戻す)
``` git rebase --abort ```

## stash
### 現在の変更を保存する
``` git stash save ```
``` git stash save "comment." ```

### 保存している変更のリストを表示
``` git stash list ```

### 現在のブランチに変更を適用する
``` git stash pop stash@{N} ```

# bashのエイリアスについて
~/.bash_profileに以下を追加して ``` source ~/.bash_profile ``` を実行する。
```
alias gs='date && git status'
alias gp='date && git pull'
```
[axios] axios で UnitTest 時に adapter を利用する

axios を利用したコードで UnitTest を書く際に、axios を介して通信する箇所をモック化した際のメモを残す。

## ケース
前述した部分と重複するが、axios を利用した非同期通信においてモックを使用して UnitTest を書きたい。
(実際に通信は発生させず、擬似的にテストを行いたい)

## 対応
adapter を利用する。

## adapter 利用時の手順
1. モックのための function を用意する
ここで resolve した結果が テストターゲットの then に返ってくる。

    ```javascript:モックのためのfunction
    const mockAdapter = function mockAdapter() {
      return new Promise(function(resolve) {
        const res = {
          'data': 'HOGE',
          'status': 200
        }
        resolve(res);
      });
    };
    ```

1. axios の第2引数(GET時)に指定するオプションを用意する

    ```javascript:モックを利用するためのオプション
    const adapterOption = {
      // 用意したモックのための function をセット
      'adapter': mockAdapter
    };
    ```

1. 用意したオプションを axios を利用しているコードにセットする

    ```javascript:axios利用しているコードにオプションをセット
    axios.get(url, adapterOption)
    .then(function(res) {
      // モックのための function(mockAdapter) で resolve した結果がここに来る
      console.log(res);
    })
    .catch(function(err) {
      console.log(err);
    });
    ```

* 上記は axios を GET で利用しているケース
* PUT, POST で axios を利用している場合は、第3引数にオプション(ここでは adapterOption )をセットする
* このとき、もし実際に使用している axios を利用している部分のコードがオプションを用意していなかったら、axios 利用部分の実装そのものをモック化してやれば良い

## 参考
* [本家の Request Config 内 adapter の記述](https://github.com/mzabriskie/axios#request-config)

    ```javascript:抜粋
    // `adapter` allows custom handling of requests which makes testing easier.
    // Return a promise and supply a valid response (see lib/adapters/README.md).
    adapter: function (config) {
      /* ... */
    },
    ```
EXCELファイルをzipにすると・・・

#１．EXCELファイルについて

職場のある先輩に、EXCELファイルは拡張子をzipにするとおもしろいことがわかると聞き、早速試してみました。

#２．手順
１）EXCELファイルを適当に作成する
２）１)で作成したファイルの拡張子を「zip」に変更する。
３）実際解凍してみる。

#３．実際にやってみた
##１）EXCELファイルを適当に作成する
　以下のようなファイルを作成します。
![qiita_20170903_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/f5d6ab4a-48fd-60fb-bc4a-1aaa2760acac.jpeg)

![qiita_20170903_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/b7da6f0b-d9c4-e5eb-0107-9bd9f2ed11cb.jpeg)

##２）１)で作成したファイルの拡張子を「zip」に変更する。
　拡張子を「zip」に変更してみました。
![qiita_20170903_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/c6737cfa-7e09-3ccf-492c-92b4cd9f7c45.jpeg)

　容量を確認しましたが変わらないです。
![qiita_20170903_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/2e9dec33-49cf-8e62-2e1b-9db2c4229670.jpeg)

##３）実際解凍してみる。
　解凍すると、以下の構造のファイルが出てきました。
![qiita_20170903_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/49e3982d-7de5-3c4c-6990-29d3f38ea311.jpeg)

　フォルダ構成は以下の通りです。(tree /Fの実行結果です)
![qiita_20170903_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/87ffdba9-3ee1-bceb-8b90-1e587c4a99ac.jpeg)

　実際にセル値が入っているのは、[/xl/sharedStrings.xml]のようです。だた、計算式（サンプルではＥ列）で出力した値が入っているのは、[xl/worksheets/sheet1.xml]で、別出しになっているのようです。

　※[/xl/sharedStrings.xml]の中身
![qiita_20170903_09.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/c7e726e8-bdda-529c-812a-1b57e83c2c71.jpeg)

　※[xl/worksheets/sheet1.xml]の中身（一部）
![qiita_20170903_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/199152/82b3ea41-10d2-7012-bdd7-c3895703eb56.jpeg)


#４．まとめ
EXCELファイルがxmlで構成しているという話は聞いていましたが、このような構成になっているとは知らなく、とても勉強になりました。
※EXCELファイルが壊れたときとかに取り出しで役立ちそうですが、別の機会に探ってみたいと思います。
package.jsonのdevDependenciesから.babelrcを自動生成する


インストールしたbabel-pluinやbabel-presetを`.babelrc`に反映させるのはちょっと面倒ですよね。

そんなときは`create-babelrc`を使うとpackage.jsonの情報を使って.babelrcが生成できて便利です。

[**akameco/create-babelrc**<br/> *create .babelrc using package.json*](https://github.com/akameco/create-babelrc)

## インストール

```sh
$ npm install --global create-babelrc
```

## Usage

![DIvvxaZVwAAG_By.jpg (577×355)](https://pbs.twimg.com/media/DIvvxaZVwAAG_By.jpg)

以下のような.babelrcが生成されます。

```json
{
  "presets": [
    "env",
    "flow"
  ],
  "plugins": [
    "transform-class-properties"
  ]
}
```

なお順番は考慮しなので、必要に応じて修正する必要はあります。

また、--overwriteもしくは-oで既存の.babelrcを上書きします。デフォルトでは、すでに.babelrcがある場合は何もせずに終了します。

```
$ create-babelrc --help

  create .babelrc using package.json

  Usage
    $ create-babelrc

  Options
    --overwrite, -o    Overwrite .babelrc

  Examples
    $ create-babelrc
```

気に入っていただけたらスターしてくれるとうれしいです。

[**akameco/create-babelrc**<br/> *create .babelrc using package.json*](https://github.com/akameco/create-babelrc)

何かあればコメント欄、Twitterで議論しましょう。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">package.jsonのdevDependencies読んで.babelrc自動生成するやつ書いた。雑にbabelプロジェクトを始めるときに便利 <a href="https://t.co/8o4eePtzkC">https://t.co/8o4eePtzkC</a> <a href="https://t.co/jShZsUE6Ni">pic.twitter.com/jShZsUE6Ni</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/904080083802923008">2017年9月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Deep Security as a service Relayサーバの無効化

今日は一旦Relayサーバに登録したを無効化する方法を記載します。

## Relayサーバとは
セキュリティパッチなどをダウロードし、
Agentに配布するサーバになります。
DSaasを扱う上では1台は必要なサーバです。

RelayサーバをまとめたものをRelayグループとなります。

ここで私はハマったんですが、
Relayサーバが居ない空のRelayグループを作ってしまうと割り当てられたインスタンスがRelayサーバとして挙動します。

RelayサーバはパブリックIPを持っているサーバであり、疎通要件を満たしていないとなることができない。

例えば、私の場合は、NATgateway越しにEC2インスタンスを立てていたため、
セキュリティパッチのアップデートに失敗しましたとエラーが表示されてしまう。

## Relayサーバの無効化
Relayサーバを無効化する手順で行わないといけないことは2つある。

１つがAgentのアンインストール。
もう一つがManager側に登録してあるデータの削除。

DSaasではAgentをアンインストールしただけでは、
Relayサーバの無効化が完了しません。

そのため、以下コマンドでAgentをアンインストールしたあと、

```
rpm -e ds_agent
```

自分のPCからトレンドマイクロ社が出しているツールを使って、
Manager側に登録してあるデータの削除を行います。
https://s3.amazonaws.com/customerscripts/Deep-Security-Disable-Relays.exe

ツールを起動させるとログイン画面がでるので、
自分の使っているアカウント情報を記載し、
Relayツールの画面に行きます。
### ログイン画面

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/106369/64c5427b-010a-15ed-067a-f9237725a67b.jpeg)


### 削除リスト画面
![InkedWS000002_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/106369/d19e8ab6-6808-87bc-0c52-0c1ded7dbbdd.jpeg)

対象のサーバにチェックを付け、
「Disable Relay On Selected Hosts」を押せば、
Relayサーバの無効化は完了です。
Node.js + ExpressをHerokuに公開

簡単に公開できると思ったら、想像以上にハマったので自分用にメモ。今思えば、ググって見つるかる情報と、自分が使うバージョンが違ったからなのが原因だったのかも。

## 開発環境
ubuntu v16.04.3
node v6.11.1
npm v5.3.0
express-generator v4.13.0

## 公開までの手順
これをやれば公開できたという道筋を書いていく。ハマったところはメモを残す。

### app.jsonの作成
```
{
  "name": "XXXXXXXXXX",
  "description": "XXXXXXXXXX",
  "logo": "",
  "keywords": ["node"],
  "image": "heroku/nodejs"
}
```
XXXのところは適宜変更。

### package.jsonの編集
```
  "engines": {
    "node": "6.11.1",
    "npm": "5.3.0"
  }
```
これを追記。バージョンは適宜変更。

### Procfileを作成
```
web: node ./bin/www
```
ここで注意したいのは、"./bin/www"の部分は、package.jsonの "scripts": { "start": "XXX" } の内容を書く必要があるということ。ググって出てきた、app.jsとか、index.jsとかを真似してHerokuに怒られた。


### app.jsを編集
```
// Heroku
app.set('port', (process.env.PORT || 8000));
```
Herokuで使用されるPORTの環境変数を追記する。また、ローカルで動かせるように自分で使っているポート番号をORで残しておく。

### .gitignoreを編集
これは人によってだと思うが、アプリの起動に必要なファイルがgitignoreに登録されていたら外しておく。ローカルで動いて、Herokuで動かないというバグが起こる。

### gitにコミット

```
git add .
git commit -m "Herokuに対応"
```
ここまで出来たらコミット。

### Herokuへ公開
```
heroku login
heroku create XXX
heroku git:remote -a XXX
git push heroku master
```
これで完了。Herokuのアカウントをまだ持ってない人は先に作って、CLIで動かせるようにすること。

### もしハマったら...
```
heroku logs
```
エラーが見れるので頑張る。また、Herokuの"View logs"からもエラーは見れるので、やっぱり頑張る。

## 終わり
これで全て網羅できているはず。思い出しながら書いているので漏れがあったらごめんなさい。あくまで自分用のメモということで。
Angular Firebase の Auth 機能 ログイン実装

## 概要
- Angular CLI で Firebase メール&パスワードログインを実装する

## Firebaseプロジェクトを作成する
- [Firebase](https://firebase.google.com/?hl=ja) コンソールからプロジェクトを作成する
- 作成したプロジェクトのAuthenticationからログイン方法のメール/パスワードを有効にする

## Angularのロジック
- package.jsonにangularfire2とfirebaseを追加する

```json:package.json
{
    ...
    "angularfire2": "^4.0.0-rc.1",
    "firebase": "^4.3.0",
    ...
}
```

- ログイン処理の一部

```js
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';

@Injectable()
export class AuthenticationService {

  private user: Observable<firebase.User>;
  
  constructor(private afAuth: AngularFireAuth) {
    this.user = afAuth.authState;
  }

  login(user: User) {
    return this.afAuth.auth.signInWithEmailAndPassword(user.email, user.password);
  }

  logout() {
    return this.afAuth.auth.signOut();
  }

}
```

- app.module.ts AngularFire系をimportsに追加する

```js
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { FormsModule } from '@angular/forms';
import { environment } from '../environments/environment';

import { AngularFireModule } from 'angularfire2';
import { AngularFireDatabaseModule } from 'angularfire2/database';
import { AngularFireAuthModule } from 'angularfire2/auth';

import { AppComponent } from './app.component';

import { AuthenticationService } from './services/authentication.service';

import { appRoutes } from '../routes';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    RouterModule.forRoot(appRoutes),
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireDatabaseModule,
    AngularFireAuthModule
  ],
  providers: [
    AuthenticationService
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

```

- environment に Firebaseの設定を追加する
- 設定内容はFirebaseコンソール->"ウェブアプリに Firebase を追加"のconfig部分をコピーする

```js
export const environment = {
  production: false,
  firebase: {
    apiKey: '',
    authDomain: '',
    databaseURL: '',
    projectId: '',
    storageBucket: '',
    messagingSenderId: ""    
  }
};
```

## Google APIで403が出る場合
- 実行して403エラーが出る場合はGoogle APIのIdentity Toolkit API を有効にする

```
#こんなエラーが出たらGoogle APIのIdentity Toolkit API を有効にする
https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=hogehoge 403 ()
```

ログイン機能はこれで出来る。Firebaseは簡単で便利

[今回のコード GitHub](https://github.com/DotaKobayashi/ng-firebase)
[ng new してからのログイン機能実装差分](https://github.com/DotaKobayashi/ng-firebase/commit/0149ad15b4f6cc0ca58032fc865c64f43600566b)
初心者のKmeans


今更ながら，Kmeansを簡単に試してみます．
# ライブラリ
importしたのはこれ

```py3
from random import randint

from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import numpy as np

import matplotlib.pyplot as plt
```
データセットの生成に乱数が欲しかったので，randint
データをプロットするのに，3次元特徴を2次元にしたかったのでPCAを使ってます．


# データの用意
今回はデータセットとして，RGB値を乱数で生成するようにした．

```py3
def create_data(num):
    data = np.empty((0,3), int)
    for i in range(num):
        red = randint(0,256)
        blue = randint(0,256)
        green = randint(0,256)

        data = np.append(data, np.array([[red,blue,green]]), axis=0)

    return data

data = create_data(100)
```

create_data(<生成するデータ数>)で任意のサイズのデータセットを作成する関数を用いている．このコードではデータセットとして3次元の特徴が100個できる．

# クラスタリング
生成したデータをKmeansモデルで分類する．

```py3
# kmeans clustering
CLUSTERS = 3
N_JOBS = 2

model = KMeans(n_clusters=CLUSTERS, n_jobs=N_JOBS).fit(data)

print(model.labels_)
```

今回は，クラスタ数3でクラスタリングする．`N_JOBS`は用いるCPUのコア数を示している．`model.labels_`で各データのクラスタ番号をリストにしている．

# 結果出力
今回2次元画像として出力したいので，主成分分析によって3次元特徴を2次元に削減する
ことができる．

## 次元削減

```py3
# ３次元特徴を2次元にする
pca = PCA(n_components=2)
pca.fit(data)
pca_data = pca.fit_transform(data)
```
`n_components`で何次元に削減するかを指定することができる．削減後のデータは`pca_data`に格納されている．

## 実際にプロット
```py3
color = ["red", "blue", "green"]

# クラスタリング結果のプロット
plt.figure()
for i in range(pca_data.shape[0]):
    plt.scatter(pca_data[i,0], pca_data[i,1], c=color[int(model.labels_[i])])

# 生データのプロット
plt.figure()
for j in range(pca_data.shape[0]):
    color = tuple((round(data[j][0]/256, 3), round(data[j][1]/256, 3), round(data[j][2]/256, 3)))

    plt.scatter(pca_data[j,0], pca_data[j,1], c=color)

plt.show()
```
最初にクラスタリング結果をプロットしている．次元削減後のデータの1次元目をxに2次元目のデータをyにして，model.label_には0~2のクラスになっているのでリストcolorがクラス番号に対応している．
2個目のplt.figure()では，生データをそのままの色でプロットしている．ただ問題は，pltのプロットでは，RGB値が0~1である必要があるため，元のRGB値を256で割っている．後は，小数第3位で丸め込んでいる．

実際にプロットした結果が
生データ
![Figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/152224/009143cf-72c1-a072-a634-2e96c02d09c8.png "Figure_2.png")

クラスタリング結果
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/152224/2888ac5a-ec95-204b-c884-2bf540d807d8.png "Figure_1.png")

今回は，比較的綺麗にクラスタリングすることができた．

# まとめ
今回は，分かりやすいように色を用いてKmeansを試してみた．
単純なデータだったので，綺麗にクラスタリングできた．

# Source Code
https://github.com/sasayabaku/Machine-Learning/blob/master/Kmeans/color_kmeans.ipynb
現在日時を表示するには　（何をしているのかの解説を含めて）

時計を作ってみたかったが、現在時刻を入手する方法が入門書になかなか書いていいない。
ネットで調べると、どう書いたらいいか出てくるが、何をしているかがわからない。



どうやらDate()を使うみたい。

Date()でインスタンスを作るみたいだ。

音を鳴らす時も
var guitarPlayer = AVAudioPlayer()
として、プレイヤーインスタンスというものをつくったし


何か関数を３秒ごとに繰り返したい場合は、
Timerというインスタンスを作った


試しにplaygroundで表示してみた

import UIKit
var now = Date()
print(now)


と実行してみた。

すると実行結果は
2017-09-03  04:29:51と出た。(実行した時は2017年13時29分だった)

9時間前の時刻がprintされた。
日本で9時間前なので標準時が表示された？

https://www.beginning-swift.com/basic-of-date-operation
で、


DateインスタンスはDate型のデータになるので、これをそのまま表示するのは不都合があります。実際にはprint()関数で表示できちゃうけど。ただし生のまま表示するとUTCになってしまうので見た目9時間前の情報になってしまいます。DataFomatterインスタンスはこのようなタイムゾーンについてもいい塩梅で処理をしてくれます。

と書いてあった。
標準時に9時間足せば日本の日時が表示できそう？
Data型がまだイマイチわからない
ひさしぶりに nysol

[経済連携協定別時系列表](http://www.customs.go.jp/toukei/epa/epa_happyou2.htm)を扱いやすい形式に、nysol で変換しました。pandas でやるのは面倒だったので、。。。

データは上記からのダウンロード(2012 から、2016まで)して、下記の nysol のスクリプトにかけてひとつにします。

#注意　最後に、^M を取り除きます。取り除く方法は、[vi はこれ](http://www.itmedia.co.jp/help/tips/linux/l0149.html)



この種の作業は、圧倒的に、nysol が楽だと思います。

```
for Y in 2012 2013 2014 2015 2016
do
for M in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do 
mcut f=Year,Region-Country,Region,Country,HS,EPA-Code,Unit1,Unit2,Quantity1-Year,Quantity2-Year,Value-Year,Value-${M}:Value,Quantity1-${M}:Quantity1,Quantity2-${M}:Quantity2 i=${Y}_EPA.csv o=${Y}_EPA_${M}.csv
done

mv ${Y}_EPA_Jan.csv ${Y}_EPA_01.csv 
mv ${Y}_EPA_Feb.csv ${Y}_EPA_02.csv 
mv ${Y}_EPA_Mar.csv ${Y}_EPA_03.csv 
mv ${Y}_EPA_Apr.csv ${Y}_EPA_04.csv 
mv ${Y}_EPA_May.csv ${Y}_EPA_05.csv 
mv ${Y}_EPA_Jun.csv ${Y}_EPA_06.csv
mv ${Y}_EPA_Jul.csv ${Y}_EPA_07.csv 
mv ${Y}_EPA_Aug.csv ${Y}_EPA_08.csv 
mv ${Y}_EPA_Sep.csv ${Y}_EPA_09.csv 
mv ${Y}_EPA_Oct.csv ${Y}_EPA_10.csv 
mv ${Y}_EPA_Nov.csv ${Y}_EPA_11.csv 
mv ${Y}_EPA_Dec.csv ${Y}_EPA_12.csv

for M in 01 02 03 04 05 06 07 08 09 10 11 12
do
msetstr a=month v=${M} i=${Y}_EPA_${M}.csv o=temp.csv 
mv temp.csv ${Y}_EPA_${M}.csv
done
mcat i=${Y}_EPA_*.csv o=all_${Y}_EPA.csv

done

mcat i=all_*_EPA.csv o=temp.csv
mcal c='mid($s{HS},1,9)' a=hs9 i=temp.csv |
mcut -r f=HS o=EPA.csv

```
Xserverでlibssl.so.6: cannot open shared object file: No such file or directoryがでる問題

自作のXserver向けツール（になる予定のリポジトリ）をクローンしようとしたところ、以下のエラーが発生。

```bash
$ git clone https://github.com/musaprg/xsvr-tools.git
Cloning into 'xsvr-tools'...
git-remote-https: error while loading shared libraries: libssl.so.6: cannot open shared object file: No such file or directory
```

phpを呼ぼうとしても同様のエラーが出ました。修正に苦労したのでメモ。

## 対処法

Xserverのディストリは非公開ということになってますが、実はCentOSです。

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

ただ、root権限が許可されていない（クソ）ので、パッケージマネージャー等を使うことはできません。

エラーを見ると、`libssl.so.6`という共有ライブラリのリンクに失敗してるみたいです。

もしやと思って調べてみると

```bash
$ ls /lib64 | grep -E "libssl\.so\.([0-9].)$"
libssl.so.10
```

どうやらopensslの更新の影響っぽいですね。

root権限が許可されていない（クソ）ので、無理矢理シンボリックリンクを作成して対象します。

LD_LIBRARY_PATHが通っているディレクトリに移動して、以下のコマンドを実行します。

```bash
$ ls /lib64 | grep -E "lib(.*)\.so\.10$"
libcrypto.so.10
libgmp.so.10
libssl.so.10
libxtables.so.10
```

上記の4ファイルに対してシンボリックリンクを作成します。

起動できるかと思いきや

```bash
$ php
/usr/bin/php7.0: error while loading shared libraries: libldap-2.3.so.0: cannot open shared object file: No such file or directory
```

はい。もう一つやります。

```bash
$ ln -s /lib64/libldap-2.4.so.2 libldap-2.3.so.0
$ php -v
PHP 7.0.18 (cli) (built: Apr 18 2017 01:56:54) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
```

これにて終了です

## 参考

https://www.centos.org/forums/viewtopic.php?t=22243
【GAS@SpreadSheet】スプレッドシートにある対応完了の記録を自動的に他のシートへ保存

シートAにTo Do Listの記録があります。F欄は対応状態とします。
あるTo Doを対応完了にすると、当該の記録は自動的にシートBにコピーし保存します。
その機能は、下記のコードを考えました。
トリガーの設定は以下にご参照ください。
　1. 編集＞現在のプロジェクトのトリガー＞新しいトリガーを追加＞
　2. [実行]に当該の関数名を選択
　3. [イベント]に [スプレッドシートから]を選択
　4. [値の変更]を選択＞保存

---
```main.gs
function main() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_s = ss.getSheetByName("source");
  var sheet_d = ss.getSheetByName("destination");
  
  var cell_s = sheet_s.getActiveCell();
  var cRow = cell_s.getRow();
  var cCol = cell_s.getColumn();
  var lastCol = sheet_s.getLastColumn();
  var range_s;
  
  if (cCol == 6) {
    // F欄はコラム値６に対応する
    if (cell_s.getValue() == "対応完了") {
      range_s = sheet_s.getRange(cRow, 1, 1, lastCol);
      // 参考：sheet.getRange(row, column, numRows)
      range_s.copyValuesToRange(sheet_d, 1, lastCol, sheet_d.getLastRow()+1, sheet_d.getLastRow()+1);
      // 参考：range.copyValuesToRange(sheet, column, columnEnd, row, rowEnd)
      // sheet_d.getLastRow()+1 は、シートの尾部に対応する
      sheet_s.deleteRow(cRow);
      //もとの記録を削除する
    }
  }
}
```
### 参考
[GAS>Spreadsheet>Sheet - getRange(row, column, numRows)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#getRange(Integer,Integer,Integer))
[GAS>Spreadsheet>Range - copyValuesToRange(sheet, column, columnEnd, row, rowEnd)](https://developers.google.com/apps-script/reference/spreadsheet/range#copyValuesToRange(Sheet,Integer,Integer,Integer,Integer))
esa.io > GitHub Webhook (β)試用

情報共有サービスesa.ioにて記事を公開する方法としてGitHub Webhookというものがあることを知った。
現在、βバージョンである。

https://docs.esa.io/posts/176

試してみた。

### セットアップ

- Label: blog
- esa root category: 技術英語
- repo: yasokada/TechEnglish_170903
- branch: master
- output directory: data

上記とGitHub API Access Tokenを設定した。

### 試用

カテゴリ「技術英語」にて記事を投稿した。

https://github.com/yasokada/TechEnglish_170903/tree/master/data
に「4578.html.md」というファイルが生成された。

コミットメッセージは「[esa] Update post.」や「[esa] Create post.」など。

[4578.html.md](https://github.com/yasokada/TechEnglish_170903/blob/master/data/4578.html.md)には以下の項目が表として付加される。

- title
    - If this occurs, the System [cannot be relied on to] stop dangerous machine motion when a person or object enters the defined area. (記事のタイトル)
- category
    - 空白 (漢字「技術英語」が本来は入る?)
- tags
    - TechEnglish (付けたタグ)
- created_at
    - 記事作成日時
- updated_at
    - 記事更新日時
- published
    - true
- number
    - esa.ioの記事の番号

### 所感

- 良い点
    - カテゴリに記事追加で自動的にGitHubにアップロードされるのは便利
    - 検索UIが充実しているesa.io自体で記事を管理できる点が良い
- 気づき点
    - 漢字のCategoryはうまく表記されない?
    - 記事内の改行がところどころ消えている
    - ファイル名(4578.html.md)からは内容が分からない
        - GitHub上での閲覧という観点でユーザがどのように使うか
    - 記事番号が4桁より少ない場合、順番がおかしくなる
        - [8.html.mdは4616.html.mdの下方向に来る (昇順の場合)](https://github.com/yasokada/TechEnglish_170903/tree/master/data)
        - 8に対して`0008.html.md`の名前付けだと並びが良くなる
            - 一方で、ユーザがどの桁必要なのかは記事数によって変わる (008.html.mdがいいか、0008.html.mdがいいか)


### リンク
(追記 2017/09/25)

esaからblog?更新している例。

[モノグサ万歳！Webデザイナーがesa→GitHub→Travis CI→Hexoで、ポートフォリオのビルドを自動化した話](https://www.slideshare.net/AiMinatogawa/webesagithubtravis-cihexo-ltlovers)
クラス内のForceUnwrapしたBoolプロパティに三項演算を利用するとコンパイル時にSegmentationFaultする

この現象はSwift3系のみで発生します。
Swift2、Swift4では正しくコンパイル出来ることを確認しました。

## 問題の発生するコード

```swift
class Foo {

    private var bool: Bool!

    func setup(_ bool: Bool) {
        self.bool = bool
    }

    func test() {
        let result = bool ? "OK" : "NG" // このコードでSegmentationFaultが発生します。
        print(result)
    }

}
```

## 対処

イニシャライザで初期化出来ないけど、そのプロパティが初期化されているという前提がある場合、初期値を予め代入するようにしてForceUnwrapで型を定義するのをやめる。

```diff
  class Foo {

-     private var bool: Bool!
+     private var bool: Bool = false

      func setup(_ bool: Bool) {
          self.bool = bool
      }

      func test() {
          let result = bool ? "OK" : "NG"
          print(result)
      }

  }
```

---

UIViewやUViewControllerなどはInterfaceBuilderを利用する前提だとイニシャライザでプロパティの初期化をすることが出来ないため、苦肉の策としてプロパティをForceUnwrapするということは割りとみんなやっているんじゃないかと思うのですが、
Bool型については2値しかとらないので、デフォルト値を決めて定義してあげたほうがコンパイラに優しいんだなというお気持ちになりました。
(初心者向け)TensorFlowを動かしてみる

Macbookで[TensorFlow](https://www.tensorflow.org/)でAIを使ってみよう、という企画です
Macbookなど稼働環境の能力に余裕が無い場合には、他のアプリケーションを停止してから実行します

#1. TensorFlowのGettingStartedを読む
- [Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)を読んで基本を理解します


#2. Jupyter Notebookを使ってTensorFlowのサンプルを動かしてみる
-Jupyter Notebookを使ってTensorFlowのサンプルを動かします。

###2.1 Jupyter Notebookを使ってPythonの基本を確認する
-[githubのtensorflow getting startedサンプル](https://github.com/eggplnt/tensorflow_getting_started)を開き、画面右上の緑の「Download ZIP」ボタンを押してzipファイルをダウンロードします

<img width="1014" alt="スクリーンショット 2017-09-03 13.21.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/12b1f8d9-a5e2-28a8-c37a-b925bce56aa6.png">


- [(初心者向け)TensorFlowをインストールする](http://qiita.com/egplnt/items/c5055f821a4770edbf8a)で作成したTensorFlowのための仮想環境が稼働するディレクトリで上記zipファイルを解凍します

<img width="413" alt="スクリーンショット 2017-09-03 13.21.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/b189f46e-ab33-c879-be06-757a1cf2600d.png">



- TensorFlow仮想環境をactivateしていない（`(tf)`プロンプトが表示されていない）場合、`source tf/bin/activate`でTensorFlow用の仮想環境をactivateします。プロンプトに`(tf)`が表示されます

```:TensorFlow用仮想環境をactivateする
MacBook-Pro:tftest tohru$ source tf/bin/activate
(tf) MacBook-Pro:tftest tohru$ 

```

- `jupyter notebook`と入力し、jupyter notebookを起動させます。
- jupyterを未インストールの場合、Python2.x 環境であれば`pip install jupyter`で、Python3.x環境であれば`pip3 install jupyter`ででインストールします

```
(tf) MacBook-Pro:python_exercise-master tohru$ pwd
/Users/tohru/Desktop/tftest/tensorflow_getting_started-master
(tf) MacBook-Pro:python_exercise-master tohru$ ls
1. Python_Exercise.ipynb		3. tensorflow_getting_started.ipynb
2. Matplotlib_Exercise.ipynb
(tf) MacBook-Pro:python_exercise-master tohru$ jupyter notebook

```

- Jupyter notebookのメニューが表示されるので、「1. Python_Exercise.ipynb」を選択して実行します。
<img width="1163" alt="スクリーンショット 2017-09-03 13.25.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/b1054db5-3720-57b3-d1a9-b9ea4ec6c976.png">


###2.2 Jupyter notebookを使ってMatplotlibの基本的な使い方を確認する
- 前項と同様にjupyter notebookを実行し、「2. Matplotlib_Exercise.ipynb」を選択して実行します。

###2.3 Jupyter notebookを使ってTensorFlow Getting Startedのサンプルを動かしてみる
- 前項と同様にjupyter notebookを実行し、「3. tensorflow_getting_started.ipynb」を選択して実行します。
cloud9で、Apartment（マルチテナント）の動作確認をするには

## やりたいこと

* Railsで[apartment](https://github.com/influitive/apartment)を使ってマルチテナントなサービスを作る。
* Cloud9環境でやりたい

## Cloud9はサブドメインが使えない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74571/7cffd998-06ee-352d-837e-154b2d694186.png)

https://community.c9.io/t/can-i-use-a-custom-domain-or-cname-to-access-my-workspace/1178

でも、マルチテナントなサービスをCloud9で動作確認したいんだ！　というときには・・・

## Ngrok使えばいける

永続的に使うには課金が必要ですが、一時的に動作確認ができればいいや！というのであれば、
[ngrok](https://ngrok.com/)を使うことで、サブドメインで住み分けするマルチテナントの動作確認ができます！

```bash:
$ ngrok https 8080
```

で

```
ngrok by @inconshreveable                                                                                                                           (Ctrl+C to quit)
                                                                                                                                                                    
Session Status                online                                                                                                                                
Account                       xxxx xxxx  (Plan: Free)                                                                                                             
Version                       2.2.8                                                                                                                                 
Region                        United States (us)                                                                                                                    
Web Interface                 http://127.0.0.1:4040                                                                                                                 
Forwarding                    http://xxxxxx.ngrok.io -> localhost:8080                                                                                            
Forwarding                    https://xxxxxx.ngrok.io -> localhost:8080                                                                                           
                                                                                                                                                                    
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                           
                              7       0       0.00    0.00    21.72   221.30 
```

みたいなのが出たら、あとは https://xxxxxx.ngrok.io にアクセスするだけで、
xxxxxxのテナントを呼び出す環境がサクッと出来上がります！

```ruby:Railsコンソールで
Apartment::Tenant.create("xxxxxx")
```

Railsコンソールで↑のように新たにテナントを作って、
簡単にマルチテナントを試験する環境ができました！
Visual Studio Community 2017でEmacs Keybind

# Visual Studio Community 2017でEmacs Keybind

MicrosoftがEmacs Keybindのアドオンを公開しています。
https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Emacsemulation

が、2017は対応しておらずインストールできません。
が、自分で対応バージョンを書き換えるとインストールできます。
以下やりかた。

上記URLからEmacsEmulations.vsixをダウンロード。
拡張子を.zipに変えて解凍し、extension.vsixmanifestというファイルを開き、
`<VisualStudio Version="10.0">`を`<VisualStudio Version="15.0">`にする。
再度zipに圧縮して拡張子を.vsixにし、実行するとインストールが始まります。

VisualStdioを起動し適当なプロジェクトを開き
ツール->オプション->環境->キーボード からEmacsキーバインドが選べるようになります。
一度管理者権限を要求されます。
Emacsキーバインドを選んだ後は一度VisualStudioを再起動すると次回より効きます。

以上です。

デフォルトではC-hに編集.置換が割り当てられているので
編集.後退削除を割り当てればbackspaceになります。
C-[をウィンドウ.前のタブ、C-]をウィンドウ.次のタブに設定して使っています。
編集.左右スペースの削除、など色々な項目があるので見てみるのも面白いかと思います。
おすすめのバインドがあれば教えてください。
Angularのパイプをモデル内で使う

Angularでは日時のフォーマット操作を行う方法としてpepeが提供されています。 
このパイプは、 Viewにバインドされたオブジェクトや変数に対して、`|` で、パイプして使います。 
今回は、DatePipeに用意されているtransformというメソッドを使って、 `|`でパイプせずに、モデル(serviceやcomponent)内で使う方法を紹介します。

## 通常の使い方

その前に通常の使い方をおさらい

```html:datepipe-test.component.html(view側)
<p>{{date}}</p>
<p>{{date | date: 'y/MM/dd (EE) HH:mm'}}</p>
```

```typescript:datepipe-test.component.ts(model側)
import { Component, OnInit } from '@angular/core';
import { DatePipe } from '@angular/common';

@Component({
  selector: 'app-datepipe-test',
  templateUrl: './datepipe-test.component.html',
  styleUrls: ['./datepipe-test.component.css']
})
export class DatepipeTestComponent implements OnInit {
  private date: Date;

  constructor() { }

  ngOnInit() {
    this.date = new Date;
  }
}
```

次のように、dateの表示結果がフォーマットされる  

<img width="463" alt="スクリーンショット 2017-09-03 11.00.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/42fd17a1-16e0-ef48-069d-17735cd35ee5.png">


## モデル内で使う方法

事前に、`app.module.ts`内で`DatePipe`を`providers`に登録する

```typescript:app.module.ts
import { DatePipe } from '@angular/common';
...
providers: [DatePipe,...] 
```

```html:datepipe-test.component.html(view側)
<p>{{date}}</p>
<p>{{formattedDate}}</p>
```

```typescript:datepipe-test.component.ts(model側)
import { Component, OnInit } from '@angular/core';
import { DatePipe } from '@angular/common';

@Component({
  selector: 'app-datepipe-test',
  templateUrl: './datepipe-test.component.html',
  styleUrls: ['./datepipe-test.component.css']
})
export class DatepipeTestComponent implements OnInit {
  private date: Date;
  private formattedDate: string;

  // DatePipeをインジェクトする
  constructor(private datePipe: DatePipe) { }

  ngOnInit() {
    this.date = new Date;
    this.formattedDate = this.datePipe.transform(this.date, 'y/MM/dd (EE) HH:mm');
  }
}
```

通常の使い方と同様に、dateの表示結果がフォーマットされる
ReactOSを使ってみた (0.4.6)

* OSインストールするには ReactOS-0.4.6.iso をダウンロードすること。
Liveの方ではインストール機能はついていない。

## 良かった点

* Firefox45 が動いた。
* TightVNC が動いた。(UltraVNCはインストール失敗)

![v.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d6766e6-cfa9-c1f5-557e-a763938ffae5.png)

----

## 発見した不具合

* OSインストール時、NICを`ブリッジアダプター`にしておくとOS起動止まる。NATのまま変更しないこと。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/65fa7d04-ec88-304b-2c71-23aed0a6fc54.png)

* 何も変更せずにEnter押すだけにすること。そうしないと不具合に遭遇する。

いつでも戻れるように`スナップショット`を取っておくこと。

### キー配列を変更したらOS起動せず止まる

![9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b051b6ca-177f-6225-38c9-03890cbfb6d7.png)

![10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/18914d8d-c6d3-a070-d349-2f0c0db8a7f1.png)


### 日本語でインストールすると、なぜかログインできない

![user1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/10101b2a-5239-f7cc-cc04-e646e8bc9c05.png)

Englishのままインストールすること。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/14074f1c-f646-f0cd-61ab-95a5ae213c25.png)


### tahoma をインストールするとOS起動止まる

![tahoma.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c983543f-1a25-c355-390f-41af706d6288.png)

### インストール時にキー配列をJapaneseにしてもUSのまま。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e59cc0c5-b8f6-ad2d-129d-442d027c6daf.png)


### キー配列をJapaneseに変更してもOS再起動するとUS配列

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4ebebbec-e3c0-0df1-c83d-4da28b8ca227.png)

タスクトレイには`JA`と表示されているのですがUS配列でした。


### timezoneを jst9, 自動サマータイムをoffにすると止まる

* デスクトップが表示されない
* 強制OFF/ON後、OS起動止まる

![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bd83b2bf-4d2f-def4-f0fc-6a99f6141d49.png)

![7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/139e24c2-04a8-eb0d-8a9f-a975b0b4971c.png)

### 解像度を1154x864にしてOS再起動するとマウスが動かなくなる

![スクリーンショット_2017-09-03_12-25-38.png](https://qiita-image-store.s3.amazonaws.com/0/25728/04d2e56f-7053-2cab-085b-461d9c8b413d.png)

1024x768だと動きました。


## フォント変更

* [ReactOSにバージョン0.4.0が出ていたので試してみました。日本語化の手順も紹介 - あれこれ備忘録@はてなブログ](http://arekorebibouroku.hateblo.jp/entry/2016/03/08/224609)

```
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
"MS UI Gothic,128"="MeiryoKe_UIGothic,128"
```

## NICはPCnet-PCI II を選択すること。

* それ以外は認識しなかった。

![スクリーンショット_2017-09-03_12-22-47.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c68e7772-32a2-4534-baf6-370171b3d941.png)
Ruby on Railsにおけるdatabase.ymlの設定方法


## サンプルコード

```yaml:app/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

development:
  <<: *default
  database: rails-devise-ja-development
test:
  <<: *default
  database: rails-devise-ja-test
production:
  <<: *default
  database: rails-devise-ja
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>
```

**※サンプルコードのように設定を引き継がせることも可能**

## 設定項目

>
adapter:   使用するデータベース種類
encoding:  文字コード
reconnect: 再接続するかどうか
database:  データベース名
pool:      コネクションプーリングで使用するコネクションの上限
username:  ユーザー名
password:  パスワード
host:      MySQLが動作しているホスト名
>
vboxが起動しない windows10

2017/09/03
ひさしぶりにoracle VirtualBoxを起動しようとしたら、起動しない。
windows10 home x64 バージョン1703 OSビルド15063.540
ネットワークアダプタを確認すると、以前はあったはずの VirtualBox Host-Only Network が消えている。
VirtualBox 5.1.6 2016/9/19に取得したもの
念のためvboxの最新版を再インストール
VirtualBox 5.1.26
やはり起動しない。

ググってみる。キーワードは「vbox 起動しない windows10」
古い話が多い。windows7の話とか。vagrant絡みも関係なし。
windows updateがきっかけなのか。

次のキーワードでググる「vbox windows10 host-only」

次の記事を読んでみる。2015年7月から始まる話。
Cannot create host-only adapter with VBox 5 on Windows 10 (using administrative shell) #1521 
https://github.com/docker/machine/issues/1521

2017年8月にも5.1.26でも問題が起きているとの報告もある。

記事にあった下記コマンドを確認する。失敗。管理者権限のコマンドプロンプトでも同様。

```
>cd C:\Program Files\Oracle\VirtualBox
>VBoxManage.exe hostonlyif create
0%...
Progress state: E_FAIL
VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Querying NetCfgInstanceId failed (0x00000002)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp
```

次のファイルを右クリックからインストール。ダメ。host-only adapter作られず。
C:\Program Files\Oracle\VirtualBox\drivers\network\netlwf\VBoxNetLwf.inf

次のチケットは２年前にclosedとなっている。そもそもvbox5.0.0向け。
Windows host-only adapter creation fails due to slow background processing
https://www.virtualbox.org/ticket/14040

上記記事で配布されている下記を実行してみる。管理者権限。
https://www.virtualbox.org/attachment/ticket/14040/VBox-Win10-fix-14040.exe

次のメッセージが表示されるだけでadapterは作られない。

```
VirtualBox Windows 10 fix - ACTIVE
This fixeds the incompatibility of VirtualBox with Windows 10 which
prevents one from setting up virtaul host-only network interfaces.
Leave this application running in the background during the setup of
your VM, then it should be closed to avoid the overhead for 
Created by Jiri Hruska <jirka@fud.cz> (2015-08-01)
More information: VirtualBox ticket #14040
```

よくよく上記メッセージを見ると上記プログラムを起動しっぱなしままで
ネットワークのセットアップをしろということだった。
では再度[VBoxManage.exe hostonlyif create]を実行。結果変わらず host-only アダプタは作られない。

virtualboxを起動してみる。おお、起動した！！

VBox-Win10-fix-14040.exeを止めて、再度virtualboxを起動してみる。起動しない。
めっちゃ不便なんですけど。。。

とりあえずVBox-Win10-fix-14040.exeを起動した状態で次に進む。
VirtualBoxマネージャーのファイルメニューからネットワーク操作マネージャーを開いてみる。次のポップアップメッセージが表示されるのみ。
「アクティブなネットワーク操作がありません。」
以前作成していたubuntu15.10 64bitを起動してみる。

```
VirtualBox - エラー
仮想マシン ～ のセッションを開けませんでした。
詳細
Interface ('VirtualBox Host-Only Ethernet Adapter #2') 
is not a Host-Only Adapter interface
(VERR_INTERNAL_ERROR)
終了コード: E_FAIL(0x80004005)
コンポーネント: ConsoleWrap
インターフェース: IConsole
{872da645-4a9b-1727-bee2-5585105b9eed}
```

やっぱりそうか。
マネージャーでVMを選択し[設定]をクリック。設定画面が開く。
[ネットワーク]を選択。[アダプター2]を確認すると、
[割り当て:ホストオンリーアダプター]の[名前]が[未選択]になって、選択肢には他に何も表示されない。詰んだか。
いったん割り当てを[未割り当て]としてみる。
そしてVM起動。起動した。でもネットワーク無しじゃなあ。。

会社の同僚のwindow10ではvbox動いてたけどなぁ。

さてさてVMでMeteorしたかったのだが、java spring eclipse環境だった。ん～記憶にないなり。ひさしぶりすぎてうましらたろう状態。

その後、VirtualBox 5.1.26のRepairインストールを行いOS再起動をおこなったところ、普通にvboxマネージャが起動できるようになった。環境設定のネットワークからホストオンリーネットワークを追加したところ普通に追加された。
VirtualBox Host-Only Ethernet Adapter #3
なぜ#3なのか。。それはいまだ不明。。
Pythonで常微分方程式を解く

# はじめに
Pythonを使って常微分方程式を解く方法を説明します。

# OS / Python module version
使用したOSはWindows 10 です。
Python module versionは次の通りです。

```bash:console
> python --version
Python 3.4.3
> pip freeze
matplotlib==1.4.3
numpy==1.13.1+mkl
pandas==0.16.2
pyparsing==2.0.3
python-dateutil==2.4.2
pytz==2015.4
scipy==0.19.1
six==1.9.0
```

# sample code
次の微分方程式を解きます。

```math
y'' = -y \\
```

変数zを導入します。
変数を増やすことで1つの2階微分方程式を2つの1階微分方程式の連立方程式と考えます。

```math
y' = z \\
z' = -y \\
```

初期条件を $t=0, y_0 = 1, z_0 = 0$とします。
解は$cos(t)$となります。正しい解が容易に求められますので誤差の評価ができます。

微分方程式を解くPythonプログラムを次に示します。
scipy.integrate.odeを使って解きます。

```py3:test.py
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import ode

def f(t, v): # t, y:v[0], y'=z:v[1]
    return [v[1], -v[0]] # y':return[0] y''=z':return[1]
v0 = [1.0, 0.0] # y0, y'0=z0

solver = ode(f)
solver.set_integrator(name="dop853")
solver.set_initial_value(v0)
tw = 10.0*2.0*np.pi
dt = tw / 1000;
t = 0.0
ts = []
ys = []
while solver.t < tw:
    solver.integrate(solver.t+dt)
    ts += [solver.t]
    ys += [solver.y[0]]
plt.figure(0)
plt.plot(ts, ys)
plt.figure(1)
plt.plot(ts, np.cos(ts)-ys)
plt.show()
print(np.max(np.cos(ts)-ys))
```

実行します。

```bash:console
> python .\test.py
```

実行するとグラフが表示されます。

次のグラフは微分方程式の解です。cos(t)のグラフが10周期分表示されています。
![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/3c7836a5-c041-cf8c-97b4-0d8b3d01ddfa.png)

次のグラフは誤差をプロットしています。tが増えるにつれて誤差も増えています。
誤差は$10^{-15}$のスケールになります。
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/84205/bfd12712-3a80-3845-e9cc-c04c8850e672.png)
Virtualboxの共有フォルダ設定

# 環境
- VirtualBox 5.1.26
- Host OS: Windows10
- Guest OS: Ubuntu 16.04LTS

## Host OS側の準備
1. 任意の場所に、共有したいフォルダを作成。
1. VirtualBox マネージャーから共有フォルダを作成したいguest OSを選択し、「設定」を選択。
1. 「共有フォルダー」を選択。「フォルダーリスト」横のプラスマークのついたボタンを押す。
1. さきほど作成したフォルダを選択。~~永続マウントにチェックをつける。~~自動マウントにチェックをつける。

これで、Host OS側の設定は終わり。

## Guest OS
1. ツールバーの「デバイス」からGuest Addtions CDイメージ挿入を選択
2. 起動を促されるので起動。パスワードも必要。
3. 一度再起動。
4. 共有用のディレクトリを作成。 
5. 起動後、上でコマンド入力。

```
$ sudo mount -t vboxsf <Host OS file name> <Guest OS file name>
```

上記のコマンドを入力。<>の部分にそれぞれ作成したフォルダ、ディレクトリ名を入力すれば完了。

### 気になったこと
~~Host OS側で「永続マウント」にチェックをつけたけど、起動するたびにmountコマンドを打たなくてはいけない。~~シャットダウンしないで仮想マシンの保存を選択するべきなのかはよくわからない。とりあえず、現状は起動ごとにmountコマンドを打つ。

### 追記 2017.9.3

自動的にマウントできなかった問題を解決できたので、追記しておきます。

どうやら原因は、共有フォルダ設定の自動マウントにチェックが入っていたことらしい。VirtualBoxのマニュアルを読んでいたらこんなことがかいてあった。

> To mount a shared folder during boot, add the following entry to /etc/fstab:
>
> sharename   mountpoint   vboxsf   defaults  0   0

起動中に共有フォルダをマウントしたければ、/etc/fstabに以下の記述をしろってことらしい。ってことで、以下のように書いてみました。

```
share_host /home/user/share_guest vboxsf defaults 0 0
```

これで再起動をかけてみたら自動同期されるようになっていた。自動マウントのチェックが悪さをしていることに気づけてよかった。

# 参考
- VirtualBox help Manual
Neural Networksで使われる記法

**[ ] 四角かっこ**: レイヤーの位置を示す
**( ) 丸かっこ**: training exampleの位置を示す
**添字**: レイヤー内のユニットの位置を示す

入力層・隠れ層・出力層の３層からなるNNを仮定する。

# 例１
レイヤー1(隠れ層)の1番目の活性化関数を示す。

```math
a^{[1](1)}
```

# 例２
レイヤー0(入力層)の1番目のユニット(=1番目の特徴)を示す。

```math
a^{[0]}_1
```
Phoenix で haml テンプレートを利用する


# 概要

- Phoenix は eex というテンプレートエンジンを使っていますが、正直使い勝手があまりよくないです。
- Haml を使って開発することで、テンプレート側の開発速度が上がります。
- 今回は Haml テンプレートエンジンへの切り替え方を紹介します。

# phoenix_haml のインストール

[phoenix_haml | Github](https://github.com/chrismccord/phoenix_haml) を使います。

```diff:mix.exs

  defp deps do
    [
      {:phoenix, "~> 1.3.0-rc"},
      {:phoenix_pubsub, "~> 1.0"},
      {:phoenix_ecto, "~> 3.2"},
      {:postgrex, ">= 0.0.0"},
      {:phoenix_html, "~> 2.10"},
      {:phoenix_live_reload, "~> 1.0", only: :dev},
      {:gettext, "~> 0.11"},
      {:cowboy, "~> 1.0"},
+     {:phoenix_haml, "~> 0.2"}
    ]
  end
```

```
$ mix deps.get
```

# テンプレートエンジンの変更

```diff:config/config.exs

+ config :phoenix, :template_engines, haml: PhoenixHaml.Engine

```

live reload　させるために、 `config/dev.exs` を編集します。

```diff:config/dev.exs

config :haml, Haml.Endpoint,
  live_reload: [
    patterns: [
      ~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$},
      ~r{priv/gettext/.*(po)$},
      ~r{web/views/.*(ex)$},
-     ~r{web/templates/.*(eex)$}
+     ~r{web/templates/.*(eex|haml)$}
    ]
  ]

```

以上を設定すれば動きます。

# サンプル

```diff:web/controllers/page_controller.ex

defmodule Haml.PageController do
  use Haml.Web, :controller

  def index(conn, _params) do
-  render conn, "index.html"
+  render conn, "index.html", name: "テスト"
  end
end
```

```haml:web/templates/page/index.html.haml

%h1
  = @name

```

以下のように表示されていれば成功です。

<img width="704" alt="スクリーンショット 2017-09-03 9.53.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/100997/2a9bd2df-21ac-e314-0f9e-d1a13dee169b.png">