OmniAICreator/Qiita-1.07M huggingface dataset:
【ngrok】ローカル環境をリモートにアップせずに外部に公開

##ngrokとは
ローカルのプログラムを他の人に確認してもらったり、利用しているデバイス以外から動作確認したいなー というときに、いちいちリモートサーバーにファイルをアップロードして・・・ などといった手順を踏まずにコマンド一発で外部からアクセスできるurlを発行してくれる。
更にSSL通信も。

公式サイト
[ngrok](https://ngrok.com/)

##環境
 - CentOS

##導入手順

![97.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/3b4b2f9d-82c2-0510-a5ef-17030f4e1b52.png)

導入するOSに対応したものをダウンロード。

`$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip`

解凍。
`$ unzip ngrok-stable-linux-amd64.zip`

どこからでも使えるようにしておく。
`$ mv ngrok /usr/bin/ngrok`


##使い方

`$ ngrok http [ポート番号]`
で起動

![98.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/d994bb38-9a07-c410-9a63-5a3dfa52a000.png)

上記のようにURLが発行され、ローカルのドキュメントルート上ファイルに外部からアクセスが可能になる。

CTRL + C で停止。

URLは毎回ランダムな文字列が発行される。

ngrokに会員登録したり云々すると、URLを指定したりもできるようになるが、こちらでは割愛。
Windows 10 > Windows Updateが進まない (2017/4/28) / TOSHIBA Display Utility / 0x8024401c / KB2565063 / KB4013418 / KB4015217

```txt:動作環境
Windows 10 Pro (64bit) Creators Update適用前
TOSHIBA社製ノートPC
```

新しいWindows 10のPCにてWindows Updateが失敗している。

Windows Updateの履歴を見ると「KB2565063」のインストールに失敗している、とあった。

[Windows Update Catalog](https://www.catalog.update.microsoft.com/Home.aspx)にて該当のKBを手動インストールしてみた。

同じエラーでひっかかるとのこと。

http://bunbougu.hatenablog.com/entry/2017/04/12/083009
> 一部東芝製のPCでインストールできない問題がありますのでこちらの記事をご参照ください

### TOSHIBA Display Utilityのアンインストール
(追記 2017/05/08)

http://bunbougu.hatenablog.com/entry/Windows10_Creator_update_20170410
> 東芝製の「TOSHIBA Display Utility 」がインストールされていると
Creators Updateの実行時にインストールエラーが発生します。
アンインストールしてから行いましょう。

上記の通りにアンインストールしたが、状況は改善せず。

### 続けての対策
(追記 2017/05/08)

以下を実施した。

- 0x8024401c対策
  - トラブルシューティング > Windows Updateで問題を解決する > Windows Updateデータベースの破損を修復
- [調子が悪くなった Windows Update を コマンドプロンプト で修正する方法 @ ぼくんちのTV別館](http://freesoft.tvbok.com/tips/windows_update/repair_with_cmd.html)
   - 記載のコマンドを実行しました
- セーフブート
- 無線LANから有線LANに変更
   - [Windows 10でWindows Updateに失敗 @ だらりぃ～](http://dalary.exblog.jp/23623586/)
   - > タイミング的にはルーター交換、つまりネットワーク環境の変化のように思えます。
- Windows Update Catalogよりファイルを取得し、手動インストール
   - KB2565063, KB4013418
   - KB4013418インストールで固まった。キャンセルでさらに固まった。
   
「更新プログラムのチェック」を実行すると、それまで見えていなかった更新プログラムを取りに行くようになった。
処理としては進んだようだ。

しかしながら、KB4015217のダウンロードで進まない。


### KB4015217の手動適用

Windows Update CatalogからKB4015217用ファイルを取得。
PCを再起動し、無線、有線ともにネット接続を切断状態にした。
(自動更新との処理の衝突を避けるため)。

KB4015217を手動適用。17分で進捗バーの表示が100%になった。
再起動をすると「更新プログラムを適用しています」になり、24分目にその処理が100%になった。

KB4018483の方は未適用だったが、通常のWindows Update処理で適用がされた。

Windows Updateで更新プログラムを確認すると、「最新の状態」となった。
RDSのIAM認証 (aws−cli編) 【cloudpack大阪ブログ】


cloudpack大阪の佐々木です。

RDSの認証をIAMでできるという話です。
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

基本的な設定はこちらを参照
http://qiita.com/Pampus/items/18b45330b990927652fd

認証に必要なTokenをaws-cliで取得できるようになってました。


aws-cliをアップデートします。

```bash:
$ sudo pip install -U awscli
$ aws --version
aws-cli/1.11.81 Python/2.7.12 Linux/4.9.17-8.31.amzn1.x86_64 botocore/1.5.44
```

`aws rds generate-db-auth-token` コマンドが使えるようになっています。

```
NAME
       generate-db-auth-token -

DESCRIPTION
       Generates an auth token used to connect to a db with IAM credentials.

SYNOPSIS
            generate-db-auth-token
          --hostname <value>
          --port <value>
          --username <value>

OPTIONS
       --hostname (string) The hostname of the database to connect to.

       --port (integer) The port number the database is listening on.

       --username (string) The username to log in as.

```

実行するとトークンが発行されます。

```bash:
$ aws rds generate-db-auth-token --hostname test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1
test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306/?Action=connect&DBUser=testuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Date=20170427T134947Z&X-Amz-SignedHeaders=host&X-Amz-Security-Token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&X-Amz-Credential=xxxxxxxxxxxxxxxxxxxxxx2Faws4_request&X-Amz-Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

これをパスワードにして接続します。

```bash:
$ mysql -u testuser -h test.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p`aws rds generate-db-auth-token --hostname test.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1` --ssl-ca=rds-combined-ca-bundle.pem
```
```
ERROR 2059 (HY000): Authentication plugin 'mysql_clear_password' cannot be loaded: plugin not enabled
```
んん？

`--enable-cleartext-plugin` ってのがいるらしいです。
https://dev.mysql.com/doc/refman/5.6/ja/cleartext-authentication-plugin.html

```bash:
$ mysql -u testuser -h test.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p`aws rds generate-db-auth-token --hostname test.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username testuser --region ap-northeast-1` --ssl-ca=rds-combined-ca-bundle.pem --enable-cleartext-plugin
```
```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 711
Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
Visual Studio / WPF > IDE > IntelliSense > Task.Run()の候補表示 > 関数にasyncを追加

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.5290 / 9985

```csharp
            try
            {
                await Task.Run(() => d.DoSomething());
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Line45");
                Debug.WriteLine(ex);
                Debug.WriteLine("Line47");
            }
```

上記のようなコードを入力中に`Task.Run()`の入力候補がインテリセンスで表示されなかった。

Task.Run()の名前空間は System.Threading.Tasksであり、すでにusing文を記載済み。

関数定義に`async`をつけないといけないようだ。


候補表示なし
```
        private void Button2_Click(object sender, RoutedEventArgs e)
```

候補表示あり
```
        private async void Button2_Click(object sender, RoutedEventArgs e)
```

async(非同期)については、今は追わない。
Node-REDに追加できるノード

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
kuraokaさんの[node-red-dashboardでチャート表示IoTアプリ作成](node-red-dashboardでチャート表示IoTアプリ作成)でNode-REDにnodeを追加してダッシュボードを作成する手順がご紹介されました。
このNode-REDに追加可能なノードやフローについての情報をご紹介します。

# 1. Node-REDに追加可能なノードやフローの情報
- 上記のkuraokaさんの手順で追加可能なNode-REDのノードやフローの情報は下記に一覧があります。
- [Node-RED Library](https://flows.nodered.org/)
- この中で役に立ちそうな・面白そうなものを見つけしだい、このページでご紹介していきますね。

# 2. node-red-dashboard
- 手軽にダッシュボードを作成できます。kuraokaさんの記事でご紹介されていたものです。
- [node-red-dashboard](https://flows.nodered.org/node/node-red-dashboard)

# 3. node-red-nodes-cf-sqldb-dashdb
- BluemixのdashDBを使用可能にします
- [node-red-nodes-cf-sqldb-dashdb](https://flows.nodered.org/node/node-red-nodes-cf-sqldb-dashdb)
Visual Studio / WPF > IDE > Dispatcher > System.Windows.Threadingに定義 / VerifyAccess()のIntelliSense入力候補は表示されない > "advanced scenarios"

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### DispatcherObject

DispatcherObjectを使おうとした。
`using System.Windows.Threading;`
が必要のようだ。

https://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcherobject(v=vs.110).aspx

using文を付けるとIntelliSenseでDispatcherObjectの入力候補が表示されるようになった。

### VerifyAccess()

一方で、`this.VerifyAccess();`の方はIntelliSenseで入力候補として表示されない。入力後にビルドは成功する。


https://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcher.verifyaccess(v=vs.110).aspx
> 名前空間:   System.Windows.Threading

理由は以下に記載されている。"advanced scenarios"とのこと。
[Why are DispatcherObject.CheckAccess() and VerifyAccess() hidden from Intellisense?](http://stackoverflow.com/questions/17500/why-are-dispatcherobject-checkaccess-and-verifyaccess-hidden-from-intellisen)
> A Microsoft employee recently stated CheckAccess is used only for "advanced scenarios", so they hid it from Intellisense.
Visual Studio / WPF > メソッド > 呼び出し > 3種類 > UIスレッド

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.5244 / 9985

メソッドの呼び出し?について以下の種類があることを紹介されている。

- UIスレッドからの直接呼び出し
- UIスレッド外からの呼び出し
- UIスレッド以外からのDispatcher経由での呼び出し

具体的なコードも紹介されている。

VerifyAccessメソッドを使って、InvalidOperationExceptionが発生するかを補足している例が紹介されている。
Visual Studio / WPF > Dispatcher > UI操作に使う | 関連情報

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.5213 / 9985
> UIを操作するには専用のスレッドから操作をする必要があります。WPFでは、この操作を簡単にするためにDispacherという仕組みを提供しています。

関連して以下を見つけた。
[WPF の Dispatcher について勉強してみた @ 周回遅れのブルース by hilaponさん](http://d.hatena.ne.jp/hilapon/20130225/1361779314)

> WPF アプリケーションは、レンダリング（描画）用とユーザーインターフェイス用の2つのスレッドを用いて動作します。

その他、気になった部分

- スレッドセーフに設計されていない
- シングルスレッドモデル
- Dispatcher.BeginInvoke
- UIスレッドのキュー > 優先順位
- DispatchPriority 
- `Thread.Sleep(3000);`
- `Application.Current.Dispatcher`
- コマンドの CanExecute メソッド
Visual Studio / WPF > コントロール > TextBox > 改行許可 | タブ許可 | スクロールバーの表示

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.5061 / 9985
> 4.10.1.1 改行やタブを受け入れるTextBoxコントロール

AcceptsReturnと AcceptsTabが紹介されている。
また、TextBoxにてスクロールバーを表示・非表示にするプロパティも紹介されている。
C++ BuilderのTMemoのスクロールバー付きに近いものができそうだ。

HorizontalScrollBarVisibilityとVerticalScrollBarVisibilityには以下の選択肢があるようだ。

- Auto
- Disabled
- Visible
- Hidden

Autoが気になったので使ってみた。

```xml:XAML
<Window x:Class="_170428_t0640_scroll.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170428_t0640_scroll"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="250"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="0" 
                AcceptsReturn="True" AcceptsTab="True"
                 HorizontalScrollBarVisibility="Visible"
                 VerticalScrollBarVisibility="Visible"
                 Height="200" Width="200"/>
        <TextBox Grid.Column="1" 
                AcceptsReturn="True" AcceptsTab="True"
                 HorizontalScrollBarVisibility="Visible"
                 VerticalScrollBarVisibility="Auto"
                 Height="200" Width="200"/>
    </Grid>
</Window>
```

行が少ないとき
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a7295433-df4f-e082-69fe-c2cf5fe6aad3.png)

行が多いとき
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a50907c7-f77d-9e29-0da6-8454823bd064.png)

右側のTextBoxにスクロールバーが付いた。
技術英語 > They executed [in a timely manner] / Seize the fortune by the forelock

@ http://thecodist.com/article/the-six-goals-of-every-programming-project
>They executed **in a timely manner**,

...

> and the folks I worked for couldn’t build even the simplest thing they needed.

Competitorとの競争において、Competitorは良いタイミングで製品を作成し、一方で自陣の方では一番シンプルなものすら作れなかったという話。

<hr>
関連したもの

http://qiita.com/7of9/items/03aa8bc4296b76a9c055
> When the time is right,

<hr>
関連して思い出したもの

[Seize the fortune by the forelock](http://www.geocities.jp/sonny_l_lab/english/proverbs/s/seize_the_fortune.html).
/etc をバージョン管理する etckeeper

## etckeeper
http://etckeeper.branchable.com/
/etc 配下のファイルのバージョン管理を簡易、自動化する。

http://source.etckeeper.branchable.com/?p=source.git;a=summary
意外に継続的に開発が行われている模様。

## インストール
```bash
yum -y install epel-release git && yum -y install etckeeper
```

## 初期化
```bash
etckeeper init
```
`Initialized empty Git repository in /etc/.git/` と返ってきて空のリポジトリが作成される。

## 設定
```bash
sed -i -e '/PUSH_REMOTE/ s/""/"origin"/' /etc/etckeeper/etckeeper.conf
cd /etc && git remote add origin gitのURL
```

## コミット
```bash
etckeeper commit ":tada: Initail commit"
```

## Cron
```bash
etckeeper commit "daily autocommit" >/dev/null
```
/etc/cron.daily/etckeeper から /etc/etckeeper/daily が呼び出され、上記コマンドが実行される。

## systemd timer
```bash
sed -i '/AVOID_DAILY_AUTOCOMMITS/ s/^#//' /etc/etckeeper/etckeeper.conf
systemctl enable etckeeper.timer && \
systemctl start etckeeper.timer && \
systemctl list-timers
```

## ログ
```bash
etckeeper vcs log
```
```bash
etckeeper vcs reflog
```

## 差分
```bash
etckeeper vcs diff HEAD
```

## リストア
```bash
etckeeper vcs checkout コミット名 リストアするファイル
```
専用コマンドがないと方々で大不評。
オープンソース Wiki「Crowi」を CentOS 7 にインストールする

## Crowi
http://site.crowi.wiki/

## システム要件
https://github.com/crowi/crowi

### 必須

* Node.js (6.x)
* MongoDB

### オプション

* Elasticsearch
* Redis
* Amazon S3
* Google Project
* Slack App

## システム構成例
* CentOS 7.3.1611 (minimal)
    * Node.js 6.10.2 (nodesource)
    * MongoDB 3.4.4 (mongodb-org-3.4)

## インストール
### アップデート
```bash
yum clean all && yum -y update && reboot
```

### Node.js
```bash
curl -sL https://rpm.nodesource.com/setup_6.x | bash - && yum -y install nodejs
```

### MongoDB
```bash
cat << "_EOF_" > /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
_EOF_
yum -y install mongodb-org && systemctl start mongod && systemctl enable $_
```

### Redis
```bash
yum -y install epel-release && yum -y install redis && systemctl start $_ && systemctl enable $_
```

### Elasticsearch
```bash
cat << "_EOF_" > /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
_EOF_
yum -y install elasticsearch && systemctl start $_ && systemctl enable $_
```

### Crowi
```bash
yum -y install git gcc-c++ krb5-devel
useradd crowi && su - crowi
git clone https://github.com/crowi/crowi.git && cd crowi
git checkout $(git tag | tail -n 1)
npm install
exit
```

krb5-devel がないと `致命的エラー: gssapi/gssapi.h: そのようなファイルやディレクトリはありません` というエラーが出る。

```bash
echo 'use crowi' | mongo
mongo crowi --eval 'db.createUser({user: "crowi", pwd: "P@ssw0rd", roles: [{role: "readWrite", db: "crowi"}]})'
mongo admin --eval "db.system.users.find()"
```

```bash
cat << "_EOF_" > /etc/systemd/system/crowi.service
[Unit]
Description=Crowi
After=network.target mongod.service

[Service]
WorkingDirectory=/home/crowi/crowi
EnvironmentFile=/etc/sysconfig/crowi
ExecStart=/usr/bin/node app.js

[Install]
WantedBy=multi-user.target
_EOF_
```
```ini
cat << _EOF_ > /etc/sysconfig/crowi
PORT=3000
NODE_ENV=production
MONGO_URI="mongodb://crowi:P%40ssw0rd@localhost/crowi"
REDIS_URL="redis://localhost:6379"
ELASTICSEARCH_URI="http://localhost:9200"
#SECRET_TOKEN=
PASSWORD_SEED="`openssl rand -base64 128 | head -1`"
FILE_UPLOAD=local
_EOF_
```
パスワードに `@` が含まれる場合は `%40` に置き換えてやる必要がある。

```bash
systemctl daemon-reload && systemctl start crowi && systemctl enable $_
firewall-cmd --add-port=3000/tcp
setenforce 0
```
正八角形の分割


(コードを見て突っ込みを入れるのはやめましょう)

```rb:henaf04.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/ordf04octsp/
#http://qiita.com/Nabetani/items/8ead5622e192d9655cf5
STDOUT.sync
while gets
	n=$_.to_i
	a=8.times.select{|i|n[i]==1}
	puts a.size.times.map{|i|
		b=(a[(i+1)%a.size]-a[i])%8
		r=(b==4 ? 2 : 3)
		#b+=1 if a[i]%2==1
		r+(b-1) #/2
	}.sort*''
end
```
六角形のテトロミノ


総当り。しかもYの判定だけ気持ち悪い。
なお、実装は30分ですが構想に数週間かかっています。会場参加だったら大泣きでしたorz

```rb:henae13.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde13hextet/
#http://qiita.com/Nabetani/items/50cd05989b6e2812f879
require 'set'

M=[
[0,0],[0,1],[0,2],[0,3],[0,4],
[1,0],[1,1],[1,2],[1,3],
[2,-1],[2,0],[2,1],[2,2],[2,3],
[3,-1],[3,0],[3,1],[3,2],
[4,-2],[4,-1],[4,0],[4,1],[4,2],
]

#CCW
T=[
	[0,1],[1,0],[1,-1],[0,-1],[-1,0],[-1,1]
]
Z={
	'B'=>'004','D'=>'040','I'=>'500','J'=>'550',
	'L'=>'005','N'=>'411','O'=>'421','S'=>'051',
	'Y'=>'0131','Z'=>'415',
}

while gets
	q=$_.chomp.bytes.map{|b|b-97}
	s=q.map{|e|M[e]}
	h=Set.new()
	s.each{|e|h.add(e)}
	s.all?{|e|
		Z.each{|k,v|
			if 6.times.any?{|d|
				y,x=e
				v.chars.all?{|dd|
					d=(d+dd.to_i)%6
					y+=T[d][0]
					x+=T[d][1]
					h.include?([y,x])
				}
			}
				puts k
				break
			end
		}
	} and puts :-
	STDOUT.flush
end
```
Raspberry Pi をディスプレイ/キーボードなしで初期設定する

タイトルは少し誤解を招く表現かもしれませんので、まずはかんたんに補足します。ここでのディスプレイとキーボードはRaspberry Pi 用のHDMIディスプレイとUSBキーボードのことを指しています。

# 背景と概要
Raspberry Pi（以下RPi） をセットアップするとき、SDカードにイメージを焼き込んだあと、HDMIディスプレイとUSBキーボードを RPi に直接接続して色々と設定します。

SSHの接続設定とIPを固定しさえすれば、ネットワーク経由でSSH接続できるので、そのためだけにディスプレイとキーボードはもったいない！！どうにかできないか！！

この記事では**専用のディスプレイとキーボードを使わず**に、

- SSHの設定
- IPアドレスを知らなくても接続できる方法

を紹介します。


# 環境
Windows 7
Raspberry Pi 3
Raspbian Jessie Lite (Version: April 2017)

# Raspbian のイメージSD作成
まずは、micro SD カードに Raspbian のイメージを書き込みます。今回は Raspbian Jessie Lite と言うGUIの無いOSイメージを使いました。GUIが含まれる Raspbian Jessie with PIXEL でも手順は変わらないと思います。

イメージのダウンロードはこちらから。
[Download Raspbian for Raspberry Pi](https://www.raspberrypi.org/downloads/raspbian/)

イメージSDの作成は公式の手順に則って行います。
[Installing operating system images - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

手順を簡単に書くと、

1. イメージのダウンロード・展開
2. [Etcher](https://etcher.io/) のダウンロードとインストール
3. SDカードをPCに挿入
4. Etcher を起動し、書き込むイメージファイル（.img）を選択
5. 書き込むSDカードを選択
6. 'Flash!' ボタンをクリック

しばらく待ったら、完了です。私の環境ではSDカードは終了後SDカードは自動でアンマウントされました。

今回は Windows でEtcher と言うソフトを使って書き込みをしましたが、もちろん Linux で dd コマンドなどでの書き込みも可能です。
[Installing operating system images on Linux - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/installation/installing-images/linux.md)

# SSH の自動起動設定
さて、一つ目の本題、SSH の自動起動設定です。デフォルトでは sshd は自動起動しないようなので、設定が必要です。

方法は簡単。

1. SDカードを PC に挿入
2. トップディレクトリに "ssh" という名前の空ファイルを作成
3. SDカードを PC から取り出して、RPi 挿入。EtherケーブルでPCとネットワーク接続。電源ON。

以下のページを参考にしました。
[SSH (Secure Shell) - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/remote-access/ssh/README.md)

> 3. Enable SSH on a headless Raspberry Pi
>  
> For headless setup, SSH can be enabled by placing a file named ssh, without any extension, onto the boot partition of the SD card. When the Pi boots, it looks for the ssh file. If it is found, SSH is enabled, and the file is deleted. The content of the file does not matter: it could contain text, or nothing at all.


# 固定IP設定せずにSSH接続を行う
先程の操作で、SSHを自動起動させることはできました。しかし、IPアドレスが分からないためSSH接続ができません。そこで、以下の方法を取ります。

1. [Bonjour Print Services for Windows](https://support.apple.com/kb/DL999) もしくは [iTunes](https://www.apple.com/lae/itunes/) をダウンロード・インストール
2. SSHクライアント（[Tera Term](https://ttssh2.osdn.jp/index.html.ja) など） を使ってSSH接続


|  接続情報             |値                  |
|:-----------------:|:------------------:|
| ホスト名（IPアドレスの代わり）             | raspberrypi.local |
| ユーザー名           |pi |                  
|パスワード            |raspberry |

Linux の場合は avahi をインストールしてください。MacOSの場合は特に何も入れなくても大丈夫です。

Raspbian のデフォルトユーザー名とパスワードは以下に記載あり。
[Linux users - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/linux/usage/users.md)

> User management in Raspbian is done on the command line. The default user is pi, and the password is raspberry. You can add users and change each user's password.


## なぜIPアドレス無しでアクセスできるのか
後日まとめる予定。すみません。

Zero Config とか、Avahi, Bonjour のこととか。


# まとめ

Rpi の設定にはディスプレイとキーボードが必須だと思っていたのですが、思いの外簡単に設定できました。

Avahi や Bonjour についてはまだまだ知識不足なので、引き続き調査を続けていきたいと思います。
Docker Meetup #11参加メモ


(2017/5/1 AkihiroSudaさんに指摘いただき一部修正しました。)


完全に殴り書きのメモです。

# 概要
[Docker Meetup #11](https://www.meetup.com/ja-JP/Docker-Tokyo/events/239175330/)
に参加してきました。

ざっくり気になった内容を書きます。
内容の正誤は保証できません。

遅刻したので内容は途中からです。

# Moby Project

DockerのコアメンテなのAkihiro Sudaさんのセッション。
DockerConで発表になったmobyについての解説。

以下、Moby projectについて雑感。

## mobyとdockerの関係について

ネーミングが混乱しているので要注意。
(mobyが色々な事柄を表すのに使われています)

普通にdockerを使うぶんにはmobyは気にしなくて良さそう。
mobyの中の成果物の一つとしてdockerが存在するというイメージ。
(発表の中ではRHELがdocker、Fedoraがmobyと言われていましたが。)


~~REST API部分まではOSSとして提供されるらしい。~~ (2017/5/1 修正)

**今後もオープンソースとしてソースコードの全面公開は続けられます。
ただし[dockerのCLI部分](https://github.com/docker/cli)のみはDocker社 社員のみがリポジトリへの
コミット権を持つことになります。**

CLI部分はDockerが作成するとのことなので今後もコマンド系列の
整理は継続して進められるかと。

## mobyについて

聞いた限りだと様々な構成要素を組み合わせるためのビルダらしいです。
Dockerもmobyの中の様々なコンポーネントを組み合わせて実現される。
さらに、docker daemon自体もマイクロサービス的にどんどん
コンポーネントが分割されていくようになるらしいです。


特に目を引いた部分は、仮想マシンイメージまで作れること。
(デモだとqemuのイメージを作っていました)

これによってDockerConでデモにあったRedisOSなどのように
特定のミドルウェア専用ディストリを作れるようになります。
(ApacheOSとかNode.jsOSなどなど)

ここまでやるかは別として、構成要素を極限まで削減して
単純化しようとしているのかなと感じました。

# Containerd - the universal container runtime.


**ここは私の不勉強もあって理解がかなり曖昧です。**

containerdの構成要素についての説明があり、
GRPCで構成要素間を呼び出しあっているとのことでした。

残念ながら私の不勉強もあり内容は深くは理解できていないです。

## containerd,dockerとk8s

どうもKubenetes(or google)としてはdockerよりも
その構成要素であるcontainerdとくっついて行くような印象を受けました。

ひょっとして1.13以降のdockerへの対応が
なかなか進められていないように見えるのもこのあたりが
影響しているのかなとも感じました。

GKEなら大丈夫ですが、docker + k8s使っている場合は
今後少し注意が必要かもしれないです。杞憂に終わるといいのですが。

他にもCNIや(現在プロポーザル中の)永続化ボリュームについての話もありました。

あとはcontainerdのターゲットとしてはコンテナのビルドに
ついてはスコープ外だからやることはありませんよとの
エクスキューズがありました。(そりゃそうだ)

containerdの構成要素についてはかなり丁寧に説明が
なされていたので改めてGW中に調べておきたいですね。
Node.jsでShift_JISのCSVを読み書きする

# はじめに
以前 Vue.jsとVue RouterとVuexとVuexFireとElectronとFirebaseとFoundation Sitesでアプリを作った時に、CSVの読み書きをする機能を実装しました。Shift_JISで出力するのに苦労したのは、今となっては良い思い出です。

# 必要なパッケージ

* node-csv
* iconv-lite

前者はCSVをパースしたり生成したりするのに使います。`csv-parse` や `csv-stringify` などの複数のパッケージに分かれていて、今回はそれらパッケージを個別に呼び出しました。

後者は文字コードのエンコード・デコードをするのに使います。iconvというパッケージもありますが、ネイティヴモジュールを内部で使用しているパッケージで、Electronでアプリのパッケージする時に面倒だなあと思って使いませんでした。

# Shift_JISのCSVを読み込む

例えばこんな感じのCSVデータがあるとします。

|名前|年齢|身長|体重|
|---|---|---|----|
|山田太郎|25|170|60|
|山田二郎|24|171|55|
|山田三郎|22|172|60|
|山田四郎|21|168|58|

これを以下のようなJavaScriptのオブジェクトに変換します。
数字が文字列になっているところは、必要に応じて変換してください。

```js
const data = [
  { fullname: '山田太郎', age: '25', height: '170', weight: '60' },
  { fullname: '山田二郎', age: '24', height: '171', weight: '55' },
  { fullname: '山田三郎', age: '22', height: '172', weight: '60' },
  { fullname: '山田四郎', age: '21', height: '168', weight: '58' }
]
```

このように変換するコードは以下の通りです。
ストリームAPIを使って比較的きれいに記述できていると思います。
rxjsとか使うともっと良く書けるのかなと思います。

```ts
import parse = require('csv-parse')
import fs = require('fs')
import iconv = require('iconv-lite')

const headers = {
  '名前': 'fullname',
  '年齢': 'age',
  '身長': 'height',
  '体重': 'weight'
}

type Dictionary<T> = { [key: string]: T }

function parseColumns(line: Dictionary<keyof typeof headers>): string[] {
  const table: string[] = []

  for (let key in line) {
    table.push(columnTable[line[key]])
  }

  return table
}

interface Person {
  fullname: string
  age: string
  height: string
  weight: string
}

/**
 * @param path CSVファイルが保存されているパス
 */
function parseCSV(path: string): Promise<Person[]> {
  return new Promise(resolve => {
    const parser = parse({ columns: parseColumns as any })

    const rs: fs.ReadStream = fs.createReadStream(path)
    rs.pipe(iconv.decodeStream('SJIS'))
      .pipe(iconv.encodeStream('UTF-8'))
      .pipe(parser)

    const people: Person[] = []

    parser.on('readable', () => {
      let data: any
      while (data = parser.read()) {
        people.push(data)
      }
    })

    parser.on('end', () => {
      resolve(people)
    })
  })
}
```

# Shift_JISのCSVを出力する

今度は、読み込みの逆をやりたいと思います。
あんまり綺麗に書けてないですけど十分間に合ってるコードだと思います。
CSV読み込みの時のように、headerの対応表を辞書型で定義して、
`WriteStream` を使うコードを書きたかったなあと思いました。

```ts
import stringify = require('csv-stringify')
import fs = require('fs')
import iconv = require('iconv-lite')

interface Person {
  fullname: string
  age: string
  height: string
  weight: string
}

function saveCSV(path: string, people: Person[]) {
  const header: string[] = ['名前', '年齢', '身長', '体重']

  const rows: string[][] = people.map(person => {
    return [
      person.fullname,
      person.age,
      person.height,
      person.weight
    ]
  })

  stringily([header, ...rows], (_err, output) => {
    fs.writeFile(path, iconv.encode(output, 'shift_jis'))
  })
}
```

# 参考にしたサイト
https://solutionware.jp/blog/2016/09/29/node-jsでcsvファイル操作/
このサイトを参考にさせていただきました。
JavaとKotlin の Immutable / Mutable / Const / Variable の分類、考え方について。

# 背景

https://blog.jetbrains.com/kotlin/2017/04/kotlin-1-1-2-is-out/
っていうニュースを見て、以前参画していた現場のリードエンジニアに教えてもらったKotlinのvalは、Javaでいうところの Immutable object だよっていう話を思い出しました。
その際に、JavaとKotlinの`Immutable / Mutable / Const / Variable` それぞれの分類について教えていただいたのですが、~~ニュース見るまで忘れちゃっていたっていましたw~~

そこで、思い出したことが、ホットなうちに記憶ではなく、記録にしておかないと、また、ゴールデンウィークで完全に忘れてしまいそうなので、JavaとKotlinの`Immutable / Mutable / Const / Variable` それぞれの分類いついて、書き留めておきます。

だいぶ前の記憶なので、間違っているところがあるかもしれないので、気がついたら指摘もらえると幸いです。


# Kotlin の Immutable / Mutable / Const / Variable の 分類

```
- Const ........... companiaon object { const val }
- Variable
  - Immutable ..... val
  - Mutable ....... var
```

となります。


ただし、Kotlin の言語仕様としては、

```
- Variable
  - Immutable ..... val
    - Const ....... companiaon object { const val }
  - Mutable ....... var
```

が、正しいものとなります。

ちなみに、Kotlin の　定数の表現方法

```
companion object {
    const val HOGE = "hoge"
}
```

というふうに書きます。


# Java の Immutable / Mutable / Const / Variable の 分類

言語使用としての分類は

```
- Variable
  - Immutable ..... final
    - Const ....... static final
  - Mutable ....... 普通の変数
```

となります。

ただ、考え方としては、Kotlinと同様で、

```
- Const
- Variable
  - Immutable
  - Mutable
```

の分類のが正しいので、こちらを意識していったほうが良いかと思います。

# この分類を日本語にすると

```
- 定数 ........... 常に同じ値が入る（≒ リテラルに名前つけたようなもの）
- 変数
  - 不変 ......... 最初に入ったものから変化しない。最初になにが入るかは変わります。
  - 可変 ......... 最初に入ったものから変化する。いつ、何回、変わるかは実装次第となります。
```

となります。
かなりこの分類は、わかりやすいし、覚えやすいと個人的に思っています。

# おわりに

正直、これを教わるまで、`Immutable`については、用語は聞いたことあるけど使わないでしょ。っていう感じで、`Const / Variable`の２種類しか意識していませんでした。
こういった分類って参考書とかにも乗っていない（乗っていたらすいません。)ことなので、非常に為になりました。
正しい言語使用を教えてもらったのに、忘れていたってことは、まだまだ身についていない証拠ですねw
気をつけます^ ^
eccube3でハマった些細なこと

eccube3でコントローラ周りの処理をいじってた時に、エラーが頻発して画面表示ができなくなった。なぜか server error 500 がでた。

var_dump()が原因だったよう。具体的に何が悪かったのかは未だに不明。定数ならちゃんと出る。オブジェクトだとエラーになった。けど中身が短い変数なら大丈夫だった。(サイズが大きすぎた？)

ちょうどDoctorineを手探りでいじっていたため、そっちがいけないと思っていろいろ試していたが、まさかこれが原因だと思わず2日も引きずってしまったのでメモ。
OWASP Dependency-check-mavenを使ってmavenで管理している依存ライブラリの脆弱性をスキャン

OWASP Dependency-Checkを使って依存ライブラリの脆弱性をスキャン
http://qiita.com/0x003f/items/c594c912cb7dc15b7284
にて書いたdependency-checkのmaven plugin版の使い方になります。

そもそもOWASP Dependency-Checkって何よ？という方はまず前述の記事をご覧になっていただければと思います。

+ github.io: https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html

maven版は「高い脆弱性が報告されている場合はビルド時にエラーを起こす」などのオプションを有効活用できます。

## Dependency-Check Mavenの利用方法

以下のように、mavenでビルドの設定を書き込む `pom.xml` のpluginのところに `dependency-check-maven` を書き込みます。

```xml

<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
              <groupId>org.owasp</groupId>
              <artifactId>dependency-check-maven</artifactId>
              <version>1.4.5</version>
              <executions>
                  <execution>
                      <goals>
                          <goal>check</goal>
                      </goals>
                  </execution>
              </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>
```

`<goal> </goal>` 部分は、

+ check: dependency-checkを実行して指定された形式のレポートを出力する(デフォルトHTML)
+ aggregate: `pom.xml` が子ディレクトリで存在しているようなプロジェクトのとき、結果をまとめてくれます
+ update-only: NVDのアップデートのみを行います
+ purge: localに保存しているNVDのデータを削除します

の4つが記述可能です。

まずは示したとおりに記述したら

```bash
% mvn dependency-check:check
```
と、mvnコマンドを実行すると、`check`が走り、CLI版と同様の動作をしてくれます。

## オプション等について

基本的には先程のwikiに例が載っているのでそちらを参照するのが正確ですが、いくつかオプションを紹介しておきます。

[configurations] https://jeremylong.github.io/DependencyCheck/dependency-check-maven/configuration.html

### XMLフォーマットで出力したい

`<configuration> </configuration>` の間に `<format> XML </format>` を記述します。
同様に `HTML` , `VULN` も指定できます。

```xml

<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
              <groupId>org.owasp</groupId>
              <artifactId>dependency-check-maven</artifactId>
              <version>1.4.5</version>
              <configuration>
                  <format> XML </format>
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <goal>check</goal>
                      </goals>
                  </execution>
              </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>
```

### CVSS 8.0以上の脆弱性がある場合ビルドを失敗させたい

```xml

<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
              <groupId>org.owasp</groupId>
              <artifactId>dependency-check-maven</artifactId>
              <version>1.4.5</version>
              <configuration>
                  <failBuildOnCVSS>8</failBuildOnCVSS>
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <goal>check</goal>
                      </goals>
                  </execution>
              </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>
```
ContactForm7の改修「URLの引数によりinputの必須を制御する方法」

# ContactForm7の改修「URLの引数によりinputの必須を制御する方法」
## はじめに
色々なところで使われるContactForm7。
私も使っています (๑•̀_•́๑)‎و
そんなContactForm7をテーマのfunction.phpで必須の制御ができることが分かったので、残します。

## やって見たこと
遷移元の選択した内容によりとある項目を必須にする
例として、以下のような引数を持ったURLでの制御
http://*.com/formtest/?content-name=contentA

## 実装
function.phpでショートコードの記述内容をプラグインがレンダリングするタイミングで制御します。
なので、タグの配列の内容を書き換えます。

```php:function.php

/*************************************
  Contact Form 7 URLパラメーター取得　関数
**************************************/

function my_form_tag_filter($tag){

  if ( ! is_array( $tag ) )
    return $tag; 

  if(isset($_GET['content-name'])) {
    //商品のinputタグのname属性を取得変数を用意
    $name = $tag['name'];

    /*
    商品Aの時、name="content-check"のチェックを必須にする
    必須の指定は$tagの[type][---]に入っている
    必須かどうかはtypeの後ろに*をつける。
        $tag['type'] = 'checkbox*'; //ファイルアップロード必須
        $tag['type'] = 'checkbox'; //ファイルアップロード任意
    */
    if($_GET['content-name'] == '商品A') {
      //name="content-check"のinputタグを取得
      if($name == 'content-check'){
        $tag['type'] = 'checkbox*';
        }
      }
    }
  return $tag;

}
```
ショートコードでしているタグ情報の格納方法を見ると$tag['type']を確認できます。
print_r($tag);

```
Array
(
    [type] =&gt; checkbox
    [basetype] =&gt; checkbox
    [name] =&gt; content-check
    [options] =&gt; Array
        (
        )

    [raw_values] =&gt; Array
        (
        )

    [values] =&gt; Array
        (
        )

    [pipes] =&gt; WPCF7_Pipes Object
        (
            [pipes:WPCF7_Pipes:private] =&gt; Array
                (
                )

        )

    [labels] =&gt; Array
        (
        )

    [attr] =&gt; 
    [content] =&gt; 
)

```
## まとめ
$tagの内容とページがレンダリングされるまでの流れを確認すればもう少し他のこともできそうな予感だけがあります。
フォームをいくつも作るのは大変なので、遷移元で指定できるURL引数である程度フォーム内容を操作できると更新せいもアップして良いです。
みんな大好きContactForm7ですので、もっともっと使い倒したいです(๑•̀_•́๑)
"negative dimension size caused by subtracting 5 from 1" の対応策(keras)

## 概要
tensorflow バックエンドでt ensorflow で書かれたコードを keras で走らせたところ
`negative dimension size caused by subtracting 5 from 1`
というエラーが出た。解決策を探していたところ色々なサイトが出てきて混乱したので個人的まとめ
(subtractiong 5 from 1 の部分は n from 1 で置き換えても大丈夫です)

## 環境

* keras 2.0.3
* tensorflow 1.0.1
* Anaconda 4.3.1
* python 3.5.2
* Windows 10

## 解決策
keras.json を開く。ファイルの場所は、 Anaconda の仮想環境を立ち上げて、 python で keras.json の場所を調べることができる。

```py3:python
import os
print (os.path.expanduser('~'))
```

調べた場所にある keras.json を、以下のように編集する。
"image_data_format" を "channels_last" から "channels_first" に書き直す。

```diff:keras.json
{
    "epsilon": 1e-07,
-   "image_data_format": "channels_last",
+   "image_data_format": "channels_first"
    "floatx": "float32",
    "backend": "tensorflow"
}
```

保存して、元のコードを実行したところエラーが出なくなった。

## 参考

* [Tensorflowの上位ラッパーライブラリ Kerasを試してみる（デジタル・デザイン・ラボラトリーな日々）](http://yaju3d.hatenablog.jp/entry/2016/12/16/025150)
* [keras公式ドキュメントの keras.json details の項目](https://keras.io/backend/#kerasjson-details)
Windows10 でクィックアクセスではない最近使ったファイルを出す方法

##フォルダ名と確認方法
設定でない場合もあるので、まずフォルダがあるかどうか。
[Shell コマンドで開く特殊フォルダー一覧](http://pasofaq.jp/windows/mycomputer/shellfolder7.htm)
フォルダ名はここにある一覧の通り。

##簡易入力Shell:Recent
次にこれを入力するには
Shellスキームを使用する
[Windowsで特定のフォルダを開くコマンドやスキーム](http://qiita.com/xtetsuji/items/770875c04566489678a6)
WIN+Rでファイ名を入力して実行で
Shell:Recent
と入力してEnter

##VBSCript
ExpandEnvironmentStringsでユーザー名などを取得して後ろに続く。

```vbnet:OpenRecentWint10.vbs
'http://www.whitire.com/vbs/tips0126.html
'http://pasofaq.jp/windows/mycomputer/shellfolder7.htm
Option Explicit
Dim strFolderPath   ' フォルダ名
Dim objShell : Set objShell = WScript.CreateObject("Shell.Application")         ' Shell オブジェクト

With Createobject("WScript.Shell")
StrFolderPath = .ExpandEnvironmentStrings("%APPDATA%") & "\MicroSoft\Windows\Recent" : 'Wscript.Echo StrFolderPath
objShell.Explore strFolderPath
End With
Set objShell= Nothing
```

##欠点
このように簡易に存在を確認することができて、存在sていればVBSで開ける。タスクバーに登録するとなおよい。
しかしRecentは開くと重い。そういう意味ではクィックアクセスは確かにクィックだ。なのでクィックアクセスで出てこない場合にこちらを開くという使い方をしている。
macOS Sierra に コンパクトなtex環境を作る

# はじめに

Sierra にBasicTexのミニマルな環境を構築したので備忘録的メモ

# 環境

- macOS Sierra 
- Homebrew, Caskの導入済み

# 手順

## 1. GhostScriptのインストール

```
$ brew install ghostscript
```

## 2. basicTexのインストール

今回はCaskを使って導入しましたが、pkgからインストールしても大丈夫だと思います。

```
$ brew cask install basictex
```

## 3. TexLiveのアップデート

```
$ sudo tlmgr update --self —all
```

## 4. 日本語関連のパッケージのインストール(platexなど)

```
$ sudo tlmgr install collection-langjapanese
```

## 5. 日本語のフォントを設定

```
$ cd /usr/local/texlive/2016basic/texmf-dist/scripts/cjk-gs-integrate/
$ sudo perl cjk-gs-integrate.pl --link-texmf --force
$ sudo mktexlsr
$ sudo updmap-sys --setoption kanjiEmbed hiragino-elcapitan-pron
```

これで終わりです。


GUIアプリケーション使わないのであれば、MacTexはいらないと思います(Latexitなどよく使うツールは個別にdmgからインストール)
BasicTexだとアップデートの時間を含めて、20分もかからないうちに全部終わるのでサクッと終わるのでいいですね。
GNS3にルータをエミュレートして使う

# はじめに

別の記事(http://qiita.com/nl0_blu/items/fbe7195036252f70ae25)
でGNS3の基本的な環境構築を行ったので、今回はその環境にルータをエミュレートしていく。

## 開発環境
* GNS3 1.5.4
* OS X EL Capitan
* virtualbox(5.1.0)
* GNS3 VM
* Ciscoルータ  
(IOSは実機もしくはインターネット上から入手してください。この記事で共有することはしません。)


##1.ルータのエミュレート

GNS3を起動して、Preferencesを開き
Dynamics/IOS routersの画面から下部の「New」ボタンを押す。
すると以下の画面が開く。

<img width="580" alt="スクリーンショット 2017-04-27 23.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/ec698f41-b9f0-c647-5a79-c622753971ef.png">

GNS3 VMで環境構築を行ったことから、これを選択する。

次にIOSのイメージファイルを自分のディレクトリから選択する。

<img width="581" alt="スクリーンショット 2017-04-27 23.24.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/d925ff59-b632-3304-7cc6-8c72c8de71ce.png">

ルータの名前等々を入力する。Name:は型番とかで良さそう。

<img width="584" alt="スクリーンショット 2017-04-27 23.29.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/230dc409-e5cf-b5e8-f931-d5a842949abf.png">

メモリーの設定をする。とりあえず、デフォルトのまま。

<img width="582" alt="スクリーンショット 2017-04-27 23.32.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/4998d435-aa89-9c81-a6d0-bc9c173dc5e2.png">

ルータに装着するアダプタの選択をする。
この設定で、イーサネットやシリアルケーブルの差込口をエミュレートできる。とりあえず、イーサネットアダプタ4つの「NM-4E」にする。

<img width="583" alt="スクリーンショット 2017-04-27 23.32.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/8e6cf2c4-0a4e-19d9-2b4f-34f6edb0d0d7.png">

Idle-PCの設定。ネットワークをエミュレートする時にCPU使用を抑える設定がIdle-PCみたいなので、`Idle-PC finder`をクリックして、Idle-PCが計算されるまで待つ。

<img width="584" alt="スクリーンショット 2017-04-27 23.33.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/bde7ed33-2765-f6ce-1ca9-c427b0388c03.png">

入力後「finish」を押すと、ルータのエミュレート完了！

別のバージョンのIOSを入れたい場合も同様の操作だと思う。

ちなみに、、、頑張ればJuniperのルータをエミュレートすることもできるらしい。(おそらく、こんなに簡単ではないと思う)

# 2.簡単に遊んでみる

ホームに戻り、プロジェクトの作成を行う。
簡単な操作方法は以下

* サイドバーを色々触ると、エミュレートしたルータやデフォルト？で入っているスイッチがあり、ドラック&ドロップで利用できる。
* ケーブルはサイドバーの一番下にあるマークを押して、機器から機器に引っ張ると使える。
* 機器を右クリックすると、ルータの「起動」「コンソール画面」「停止」など色々できる
* ケーブルを右クリックすると、「WireShark」が開く。（インストールしている人のみ？）

スイッチを右クリックでVLANを設定することもできた。
適当にネットワーク作ってみた。。

<img width="982" alt="スクリーンショット 2017-04-27 23.42.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/84e88fe7-e4eb-74f5-04e7-aafa6a6b8de7.png">

GNS3すごすぎ。

# 3.最初のトラブルシューティング

ルータを起動すると、なぜかCPU100%まで上がり、Macから恐ろしいファンの音が鳴るトラブル発生。。

原因：Idle-PCの初期設定ミス（おそらく）

対処：ルータ起動後、「右クリック/Auto Idle-PC」実行。

治った。

# 4. 最後に

環境構築に当たって、このサイトがすごく便利になりました。心から感謝します。
http://changineer.info/network/ccie_network_emulator/gns3.html#_or

準備は出来たので、ネットワーク構築の勉強頑張ります。

余裕があれば、操作ガイドやjuniperルータのエミュレートに関する記事を書きたいと思います。
データの前処理① Imputerとdropnaで欠損値の処理

#Sklearnでのデータ前処理① 欠損値の処理

##データの前処理とは

実際の業務などで使うデータで完璧に整備されているものはとても少なく、空欄があったり（欠損値）、異常値があったりと分析をする際に障害となってしまうものが含まれているのがほとんどです。よって、データ分析をする上でデータの前処理はとても大切な役割を果たします。むしろ、前処理がないと機械学習モデルに当てはめることができないのでなにも始まりません。また、この前処理のできの良し悪しによって、結果も違ってくるという意味でも重要な要素と言えます。

こちらがpreprocessingのライブラリがリストにされてる[公式ドキュメント](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing)です。

##Preprocessingの種類
- Data cleaning
- Data integration
- Data transformation
- Data reduction

今回やるのは、このData cleaningの部分です。Data cleaningでは、欠損値を埋めたり、外れ値を認識し除外したりします。

##Imputerでのpreprocessing

Preprocessing においてのImputerは欠損値を mean（平均）, median（中央値）, mode（最頻値）のどれかに置き換えることができます。

ちなみに、データ内にNULL値があるかどうかを特定するのは下記のコードでできます。

```python:
#データの中に欠損値があるかどうかを見ます axisが0なのは列を検索するからです。
dataset.isnull().any(axis=0)

>>>
Name False 
Age True
Job True
#これはAgeとJobに欠損値が含まれていることを示します

```

そして、欠損値がそれぞれの値にどれくらい含まれているのかを探すコードは下記になります。もし、欠損値があまりにも多かったらその列を考慮しないでデータを使ったほうが良いのかもしれませんし、もし逆に欠損値が少ないものであれば、なんらかの値で埋めるという選択肢も取れます。

```python:
dataset.isnull().sum()

>>>
Name 0
Age 76
Job 2

```
この場合、Nameは何も問題ありませんが、Age, Jobには欠損値があり、なんらかの値でその欠損値を埋める必要があります。

Finally! Imputerで欠損値を埋めていきます。

```python:

from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=0, verbose=0, copy=True)
imp.fit(df[df.columns["Embarked"]])
df["Embarked"]=imp.transform(df[df.columns["Embarked"]]).ravel()

#使い方はこんな感じで、変数に代入して、それをfitさせ、実際データをTransformさせるみたいな感じです。
```
下記がImputerの中身の詳細です。

- missing_values
これで欠損値であるものを指定します。 defaultは'NaN'です。

- strategy
ここで、mean, median, mode のどれかを指定します。

- axis
行か列かの指定です。

- verbose
理論値。

- copy
コピーするか、元のデータ自体に変更を加えるかの指定です。


こちらが[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html)です。


##ちなみに文字列のImputer は複雑だったので、 .fillna()で欠損値を埋めてみました。
![Screen Shot 2017-05-01 at 03.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/161691/82f3e62d-6a2a-c198-1497-2fc96ae680fd.png)
![Screen Shot 2017-05-01 at 03.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/161691/e63f662f-f690-2f1d-bff8-167e394188e9.png)

fillna()はdictionaryを入れることで、列ごとに、その代替値を指定することもできます。上記では、Embarkedという列のnanをSで埋めています。埋める値が少ない時、かつ埋める値が同じ時はこれでも対応できそうです。

##.dropna()での行ごと、または、列ごと消去

例えばある行の90%が欠損値であれば、分析の際に考慮せず、行ごと消去してしまったほうが良い場合もあります。そんな時に使えるのが列ごと、行ごと消去できる pandasライブラリの一つである、'.dropna() 'です。default code はこんな感じです。

```python:

dataframe_name.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

```

.dropna()の中身はこんな感じです。
 
- axis
行を消去するのか、列を消去するのかを決めます。 行の場合は、0か'index'で、列の場合は、1か'columns'で指定します。その他にも、tuplesやlistsも可能のようです。

- how
一つでもNaNが含まれていたら消去の場合は'any'で、全てがNaNの場合は消去と指定したい場合は'all'と書きます。

- thresh
これは、数字を指定し、ちゃんと使える値がat least（最低）この数あります。そしてその数に満たない行は消去します、という意味が含まれています。
- subset
subsetは列を指定して、その列にNaNがある行自体を消去します。例えば、列Aと指定し、行6にNaNがあった場合、行6自体を消去します。axisを変えることで、行でNaNを検索し、NaNがある列を消すことも可能です。
- inplace
これをTrueにすると、修正したコピーを作るのではなく、元のデータセット自体に変更を加えます。

こちら[公式ドキュメント](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html)です。
Ubuntuでファイルサーバを立ててみた

# Samba セットアップ

環境: ubuntu 16.04.2 

## インストール
    % sudo apt-get install Samba

## ディレクトリ作成
    % sudo mkdir /var/samba
    % sudo chown nobody:nogroup /var/Samba
    % sudo chmod 777 /var/Samba

## samba設定ファイル追記
    % vi /etc/samba/smb.conf
    [global]
      dos charset = CP932
      unix charset = UTF-8
      display charset = UTF-8
![undefined]()

    [share]
      path = /var/samba
      writeable = true
      force create mode = 0666
      force directory mode = 0777
      guest ok = yes
      guest only = yes

## 起動時の立ち上げ
    % sudo  update-rc.d samba defaults

## ユーザ追加
上記でゲストとして、sambaにアクセス可能だが、ユーザでパスワード認証させることも可能。

    % sudo smbpasswd -a username
*ユーザがすでに作成済みの場合

## 動作確認
MacのFinderからCmd-kして、smb:://192.168.##.##

![out.png](https://qiita-image-store.s3.amazonaws.com/0/41505/a9f90533-e2af-9029-c0d7-db4e71142cd5.png)

## 参考URL
+ http://qiita.com/8mamo10/items/6d43dbb32563f0242990
+ http://d.hatena.ne.jp/ohzeki/20130426/1366936294
+ https://ubuntuforums.org/showthread.php?t=1290204
ゆたぽんフォントにPowerlineパッチをあてる

最近[こちらの記事](http://dev.classmethod.jp/etc/fish-shell-life/)を見て、fishのテーマを [bobthefish](https://github.com/oh-my-fish/theme-bobthefish)に設定しました。

こちらのテーマはPowerlineを使っているの対応するフォントが必要なので、
愛用している[ゆたぽんフォント](http://net2.system.to/pc/font.html)に
PowerlineのパッチをあててPowerline対応にしてみました。

|Before|After|
|:-----|:----|
|<img width="607" alt="スクリーンショット 2017-04-27 23.09.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/649e6607-14c5-41ec-abea-a7f47ec4ab06.png">|<img width="684" alt="スクリーンショット 2017-04-27 23.07.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/4182bac5-1ecf-45e2-be3e-33527beacb4f.png">|


# 1. フォントのダウンロード

ゆたぽんフォント様公式サイトからフォントをダウンロードしてきます

http://net2.system.to/pc/font.html

`フォント（ゆたぽん（コーディング）バックスラッシュ` をダウンロードして
zipファイルを解凍します

中身の `yutapon_coding_sl_80.ttc` が目的のファイルとなります。

# 2. FontForge のインストール

FontForge というフォントを色々加工できるツールをインストールします
Homebrew で入れることができます

```
$ brew install fontforge
```

# 3. ttcファイルをttfファイルに分解する

ttcファイルはいくつかのttfファイルを内蔵したものとなります。
Powerlineパッチをあてる際にttfになっていたほうが都合がいいため分解します

分解するためのツールなどもありますが(FontForgeでもできるみたいです)、
今回は以下のスクリプトを使用させていただきました。

https://gist.github.com/lilydjwg/8877450

```
$curl -O https://gist.githubusercontent.com/lilydjwg/8877450/raw/e834ec4e08b1ce195fd38b157fcf62e565370a68/ttc2ttf
$python ttc2ttf yutapon_coding_sl_80.ttc
```

実行すると以下のファイルが出力されると思います

```
Yutapon coding RegularBackslash.ttf
Yutapon coding Demi Bold Sl.ttf
Yutapon coding Heavy Sl.ttf
```

# 4. Powerlineパッチをあてる

ttfファイルができたのでfontforgeを使ってpowerlineパッチをあてます

```
$ git clone https://github.com/Lokaltog/powerline-fontpatcher
$ fontforge -lang=py -script ./powerline-fontpatcher/scripts/powerline-fontpatcher Yutapon\ coding\ Heavy\ Sl.ttf
```

成功すると以下のファイルが出力されると思います

```
Yutapon coding Heavy Sl for Powerline.ttf
```

生成されたフォントをインストールしましょう

```
$ open Yutapon\ coding\ Heavy\ Sl\ for\ Powerline.ttf
```

開いたダイアログで `フォントをインストール`をクリック

# 5. iTermでフォントを設定

`⌘,` で設定画面を開き、 Profiles > Textタブ > Font から設定できます。
ここで先程インストールしたゆたぽんフォントが選択肢に表示されているので選択します。
先程文字化けしていた箇所が正常に表示されるはずです。
表皮深さ

表皮深さ

以下のマクスウェル方程式

```math
\nabla\cdot\mathbf{D}\left(t,x\right)	=	\rho\left(t,\mathbf{x}\right)
\nabla\times\mathbf{E}\left(t,x\right)+\frac{\mathrm{\partial\mathbf{B}\left(t,x\right)}}{\partial t}	=	0\\
\nabla\times\mathbf{H}\left(t,\mathbf{x}\right)-\frac{\mathrm{\partial\mathbf{D}\left(t,x\right)}}{\partial t}	=	\mathbf{j}\left(t,\mathbf{x}\right)
```

導体中に電荷が存在せず、電場は存在するが電束が存在しないと仮定すると

```math
\nabla\cdot\mathbf{D}	=	0\\
\mathbf{D}=\varepsilon\mathbf{E}	=	0\\
 \mathbf{E\neq}0
```

 より$\varepsilon=0$
 となる。式(2)の回転を取ると

```math
\nabla\times\nabla\times\mathbf{E}	=	-\mu_{0}\frac{\partial}{\partial t}\left(\nabla\times\mathbf{H}\right)\\
	=	-\mu_{0}\frac{\partial}{\partial t}\mathbf{j}\\
	=	-\mu_{0}\frac{\partial}{\partial t}\left(\sigma\mathbf{\mathbf{E}}\right)\\
	=	-\mu_{0}\sigma\frac{\partial}{\partial t}\mathbf{\mathbf{E}}
```
 ここで、定理

```math
\left(\nabla\times\nabla\times\mathbf{A}\right)=\nabla\left(\nabla\cdot\mathbf{A}\right)-\Delta\mathbf{A}
```

を用いると

```math
\nabla\left(\nabla\cdot\mathbf{E}\right)-\Delta\mathbf{E}	=	-\mu_{0}\sigma\frac{\partial}{\partial t}\mathbf{\mathbf{E}}
-\Delta\mathbf{E}+\mu_{0}\sigma\frac{\partial}{\partial t}\mathbf{\mathbf{E}}	=	0
```
 ここで、導体中(z方向)に向かって進む波を考え

```math
\mathbf{E}	=	E_{0}\exp\left(i\left(\omega t-kz\right)\right)
```

 と置くと、

```math
-k^{2}E+i\omega\mu_{0}\sigma E	=	0
k	=	\sqrt{i\omega\mu_{0}\sigma}
```

 ここで定理

```math
\sqrt{i}=\pm\frac{1+i}{\sqrt{2}}
```

 より

```math
k	=	\pm\frac{\sqrt{\omega\mu_{0}\sigma}+\sqrt{\omega\mu_{0}\sigma}i}{\sqrt{2}}\\
	=	\pm\left(\sqrt{\frac{\omega\mu_{0}\sigma}\\{2}}+\sqrt{\frac{\omega\mu_{0}\sigma}{2}}i\right)
```

 上式を()式に代入すると

```math
\mathbf{E}	=	E_{0}\exp\left(i\left(\omega t-kz\right)\right)\\
	=	E_{0}\exp\left(i\left(\omega t\mp\left(\sqrt{\frac{\omega\mu_{0}\sigma}\\{2}}+\sqrt{\frac{\omega\mu_{0}\sigma}{2}}i\right)z\right)\right)\\
	=	E_{0}\exp\left(i\omega t\right)\exp\left(\mp\sqrt{\frac{\omega\mu_{0}\sigma}{2}}z\right)\exp\left(\pm i\sqrt{\frac{\omega\mu_{0}\sigma}{2}}z\right)\\
 z=\pm z
```

 を仮定すると

```math
 \mathbf{E}	=	E_{0}\exp\left(i\omega t\right)\exp\left(-\sqrt{\frac{\omega\mu_{0}\sigma}{2}}z\right)\exp\left(i\sqrt{\frac{\omega\mu_{0}\sigma}{2}}z\right)\\
```
 

上式は、距離$z$に依存して電場が減衰することを示している。

```math 
\mathbf{E}=\frac{E_{0}}{\exp\left(1\right)}
```

 を満たす$z$を表皮深さ$\delta$と定義すると、

```math
\delta	\equiv	\sqrt{\frac{2}{\omega\mu_{0}\sigma}}
```

 となる。
VSCodeをローカライズ

## 2018/12/21追記
[VS Codeのローカライズ環境がMicrosoft Localization Community Platform (MLCP)に移行します](https://qiita.com/YuichiNukiyama/items/aba5f9f3dbc5c82cba7f#_reference-9c719ff9495b19d5d5de)。この記事には、ローカライズの参考になりません。

## 2017/4/29追記
[MSDN](https://msdn.microsoft.com/ja-jp/communitydocs/community/translate-with-transifex-guide)にもローカライズ情報が上がっていました。こちらも要チェックです。

## Visual Studio Codeのローカライズ
VS Code 1.11から、VS Codeのローカライズがコミュニティーベースに変更されました([リリースノート](https://code.visualstudio.com/updates/v1_11#_coming-soon-support-for-community-localization))。以前までは翻訳ミスがあった場合、GithubのIssueに登録しなければなりませんでしたが、今後は、[Transifex](https://www.transifex.com/)上で変更の提案ができます。まだまだコントリビューターが少ないので、簡単にではありますが翻訳方法を紹介します。

## ローカライズの流れ
VS Codeは日々進化しているので、新しい文字列も日々増えています。現在のところ、週1回、新しい文字列がTransifexに移されているようです（[公式サイト](https://github.com/Microsoft/Localization/wiki/Visual-Studio-Code-Community-Localization-Project)によると、いづれは毎日更新できるようにするとのことです）。また、Transifex上でローカライズされた文字列は週2回、Githubに反映されます。

Transifex上でのローカライズは、自由に行えますが、1票以上の投票がないと承認されません。そのため、もう少し人数が増えないと翻訳が進まなそうです。英語が得意な方はもちろんのこと、得意でない方も翻訳案に投票するだけで貢献になるので、アカウントを作ってみてください。

## Transifexの登録
Transifexは無償で登録できます。Try For Freeのリンクからサイトに入ってアカウントを作成しましょう。もちろん、OAuthに対応しているので、GithubやGoogleアカウントを使用できます。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/67429/9418d3ec-9105-888e-b5a6-a0b948a68e26.jpeg)

![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/67429/4b81ed47-a722-92d3-7fff-619c5c056bb2.jpeg)

アカウント登録が完了したら、[VS Codeのページ](https://www.transifex.com/microsoft-oss/vscode-editor/dashboard/)にアクセスしてメンバー登録を行います。メンバー登録は言語ごとになります。承認制のため、申請を行ったら少々待ってください。タイミングにもよると思いますが、私のときは数時間で承認されました。

なお、VS Codeの文字列は[vscode-editor](https://www.transifex.com/microsoft-oss/vscode-editor/dashboard/)と[vscode-extension](https://www.transifex.com/microsoft-oss/vscode-extensions/dashboard/)、[vscode-workbench](https://www.transifex.com/microsoft-oss/vscode-workbench/dashboard/)の3つに分かれていますが、申請先はどれでも構いません（[vscode-setup](https://www.transifex.com/microsoft-oss/vscode-setup/dashboard/)もありますが、日本語は含まれていません）。

## 翻訳開始
承認されたらいよいよ翻訳開始です。まずは、翻訳ボタンをクリックします。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/67429/4cef088a-3820-e59a-8da6-7e7c3fcf67a7.png)

どこから翻訳を開始しても良いですが、効率的に未翻訳部分を探すなら、ページ下部の「全リソース」をクリックしてから、「未翻訳」に絞り込むと良いです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/67429/2fca40c4-49aa-8274-f55c-47a2783467de.png)

未翻訳に絞り込んだ後、左側の画面で翻訳する文字列を選択します。右側の画面（提案タブ）には翻訳候補が表示されます。既出の翻訳で問題なければ投票ボタンをクリックするだけです。提案がない、または提案が不適切な場合は、提案を追加ボタンをクリックすると新しい翻訳を提案できます。また、右側の画面には類似度が高い既存翻訳も表示されるので、流用して翻訳を開始することもできます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/67429/3048d7fc-ddc6-e0f6-07e5-2b6af30816a0.png)

## 最後に
slackに[vscode-ja](https://vscode-ja.slack.com/shared_invite/MTczMzQzODQ1NzkyLTE0OTMxMDY0OTUtZmYzMDU4MDQ1MA)チームがあります。提案やお困りごとがあればこちらに投げるのもありです :smiley: