OmniAICreator/Qiita-1.07M huggingface dataset:
Spring MVC：`@RequestParam`の省略したときの動き



# 環境

* Spring Boot 1.5.9
    - Spring MVC

[@RequestParamの説明](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html) には、以下のように記載されています。

>If the method parameter is Map<String, String> or MultiValueMap<String, String> and a parameter name is not specified, then the map parameter is populated with all request parameter names and values.

これが正しいことを、実際に動かして確認しました。

```java:SampleController

@Controller
public class SampleController {
//ここにメソッドを追加
	
}
```

## メソッド引数の型がString, intなど基本的な型

### `@RequestParam`を付与して`name`属性を指定

```java:SampleController.java
	@GetMapping("/search1")
	@ResponseBody
	String search1(@RequestParam(name="name") String bar,
                   @RequestParam(name="id") int hoge ) {
		String result = "name="+ bar + ",id=" + hoge;
		return result;
	}
```    


`/search1?name=test&id=2`にアクセスすると、`name=test,id=2`が表示されました。


### `@RequestParam`を指定しない

```java
	@GetMapping("/search2")
	@ResponseBody
	String search2(String name, int id ) {
		String result = "name="+name + ",id=" + id;
		return result;
	}
```

`/search1?name=test&id=2`にアクセスすると、`name=test,id=2`が表示されました。


## メソッド引数の型が`Map<String, String>`

### `@RequestParam`を付与する


```java
	@GetMapping("/search6")
	@ResponseBody
	String search6(@RequestParam Map<String, String> params) {
		String result = params.toString();
		return result;
	}
```

`/search6?name=test&id=2`にアクセスすると、`{name=test, id=2}`が表示されました。


### `@RequestParam`を付与しない


```java
	@GetMapping("/search5")
	@ResponseBody
	String search5(Map<String, String> params) {
		String result = params.toString();
		return result;
	}
```

`/search5?name=test&id=2`にアクセスすると、`{}`が表示されました。


### `@RequestParam`を付与した引数が2個

```java
	@GetMapping("/search9")
	@ResponseBody
	String search6(@RequestParam Map<String, String> params, @RequestParam Map<String, String> params2) {
		String result = params.toString() + "," + params2.toString();
		return result;
	}
```

`/search9?name=test&id=2`にアクセスすると、`{name=test, id=2},{name=test, id=2}`が表示されました。



## メソッド引数の型が`MultiValueMap<String, String>`

### `@RequestParam`を付与する

```java
	@GetMapping("/search8")
	@ResponseBody
	String search8(@RequestParam MultiValueMap<String, String> params) {
		String result = params.toString();
		return result;
	}
```

`/search8?name=test&id=2&name=sample`にアクセスすると、`{name=[test, sample], id=[2]}`が表示されました。


## メソッド引数の型が`Map<String, Object>`

### `@RequestParam`を付与する

```java
	@GetMapping("/search4")
	@ResponseBody
	String search4(@RequestParam Map<String, Object> params) {
		String result = params.toString();
		return result;
	}
```

`/search4?name=test&id=2`にアクセスすると、`{name=test, id=2}`が表示されました。

## メソッド引数の型が自作のBeanクラス

### `@RequestParam`を付与しない

```java
	@GetMapping("/search3")
	@ResponseBody
	String search3(SampleBean params) {
		String result = "name="+params.getName() + ",id=" + params.getId();
		return result;
	}
    
	@Data //lombok annotation
	public static class SampleBean {
		String name;
		int id;
	}    
```


# 参考サイト



http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/RequestParam.html
CFEclipseでColdFusionの開発環境を作る。

# はじめに
この記事では、ColdFusionの開発環境を作ります。
開発環境の構成は、（Eclipse + CFEclipse）です。
当記事の内容は、CFEclipseの公式サイトにあるインストール手順[Installing CFEclipse](https://github.com/cfeclipse/cfeclipse/wiki/Installing-CFEclipse)とおおよそ同じです。

# 開発環境の構成
■ 統合開発環境
Eclipse
■ Eclipseプラグイン
CFEclipse, MXUnit

# 作成手順
## 1. ColdFusionのインストール
ColdFusionのインストールは以下の記事を参照してください。
[Cold Fusion 2016をインストールする。](https://qiita.com/nogitsune413/items/e6722fedb8430640aed8)

## 2. Eclipseのインストール
[Pleiades All in One Eclipse](http://mergedoc.osdn.jp/)を使います。
ColdFusionはJavaベースなので、以下の構成でインストールします。

- Pleiades All in One Java
- Windows 64bit
- Full Edition

## 3. CFEclipseのインストール
### 3-1. MXUnitのインストール
1. Eclilpseを起動し、メニューから、「ヘルプ(H)」>「新規ソフトウェアのインストール...」を選択します。
1. 「作業対象(W)」に以下を指定し、「追加(A)...」ボタンを押します。<br/>
http://cfeclipse.org/mxunit/update-dev
1. 「MXUnit」を選択します。
1. 「次へ(N)」ボタンを押します。
![2-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10723/2dac7c51-291b-09c5-b41b-8036d8331a44.jpeg)
1. 「インストール詳細」を確認して、「次へ(N)」ボタンを押します。
1. 「ライセンスのレビュー」を確認して使用条件に同意し、「完了(F)」ボタンを押します。

### 3-2 CFEclipseのインストール
1. Eclilpseのメニューから、「ヘルプ(H)」>「新規ソフトウェアのインストール...」を選択します。
1. 「作業対象(W)」に以下を指定し、「追加(A)...」ボタンを押します。<br/>
http://www.cfeclipse.org/update
1. 「CFEclipse (including CFUnit and Frameworks)」を選択します。
1. 「CFEclipse DocShare」が<b>選択されていない</b>事を確認します。
1. 「次へ(N)」ボタンを押します。
![2-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10723/6b7cb813-53d6-c273-262f-a11df8be9e46.jpeg)
1. 「インストール詳細」を確認して、「次へ(N)」ボタンを押します。
1. 「ライセンスのレビュー」を確認して使用条件に同意し、「完了(F)」ボタンを押します。

# 確認環境
- Windows10 Home
- Eclipse Java EE IDE for Web Developers. / Version: Oxygen.3 Release (4.7.3)
- CFEclipse (including MXUnit and Frameworks)	1.5.2.201612262348
Haskellの行列計算 - 保存と読み出し、複素行列について

# hmatrix について(前書き)
高速な行列計算ライブラリーです。基本的な使い方はほかの方のqiita記事にも詳しく書いてありますので省略しますが、私が躓いたところに関して、身の丈に合った解説をします。

一言だけ初歩的解説しますと、import Numeric.LinearAlgebraで呼び出します。

大きく2点躓きました。1つは複素行列の定義、2つは外部ファイルからの行列読み込みです。そしてそれらの合成にも躓きました。

# 複素行列
## 複素行列の定義
hmatrixは複素行列の計算にも対応しいる。（というより、していないと閉じない計算が多い）
定義する場合は、後で複素行列であることを明示すればよい。

```hs
let a = (2><2)[1,2,3,4] :: Matrix (Complex Double)
let b = (2><2)[1:+2,2,3,4:+(-4)] :: Matrix (Complex Double)
```

よくある間違いとして（私がよくやる間違い）

```hs
let a = (2><2)[1..4] :: Matrix (Complex Double)
--複素数なので".."表現が使えない。
let b = (2><2)[1:+2,2,3,4:+(-4)]
--Matrix Double として扱おうとしてエラーになる。ちょま、
```

## 実行列と複素行列の混ざった計算
haskellはコンパイラが型推論してくれるが、Matrixに関しては自分で変換する必要がある。
実行列 a と複素行列 b の積は

```hs
let a = (2><2)[1,0,0,1]::Matrix Double
let b = (2><2)[-1,0,0,1]::Matrix (Complex Double)

let c = (complex a) <> b
```
とする。ちなみに、Complex Doubleに complex b などと書いても大丈夫なので、場合によっては複素行列になるといった場合にも対応できる(可読性は下がる)。

# 行列の保存
## saveMatrix
```hs
saveMatrix "FilePath" "%lf" a
```
列は半角スペース区切り行は改行区切りで"FilePath"に出力される。カンマでも区切りたいなら、

```hs
saveMatrix "FilePath" "%lf," a
```
のようにする。こうすると半角スペース、改行に加えカンマが毎回挿入される。同様に任意の区切りが可能。

# 行列の読み出し
ファイルから行列をロードする方法

```hs
let a = loadMatrix "FilePath"
```
でとることができる。しかし、a の型は IO (Matrix Double) のようなIO型になるため、

```hs
svd a
a + a
```
のようなことはできない。そこでIO型からMatrix Doubleを取り出すため、"<-"を用います。
(System.IO.UnsafeのunsafePerformIOという関数を用いる方法もあります。)

```hs
a <- loadMatrix "FilePath"
svd a
```
これにより、ファイルから読み込んだ行列用いて計算し行くことができる。
大きさは自動で判別されるが、列は半角スペース、行は改行で区切られている必要がある。(カンマ区切りはダメ)

## 複素行列の保存と読み出し
saveMatrix, LoadMatrixは実行列Matrix Doubleにしか対応していない。複素行列を保存する場合、自前で作るか、実部、虚部を分けるかする必要がある。ここでは後者を紹介する。

toComplex, fromComplexを用いると比較的簡単に書くことができる。
### save

```hs
let a = (2><2)[1:+2,2,3,4]::Matrix(Complex Double)
let (a_r,a_c) = fromComplex a
saveMatrix "real.txt" "%lf" a_r
saveMatrix "complex.txt" "%lf" a_c
```
2行で書くと

```hs
let a = (2><2)[1:+2,2,3,4]::Matrix(Complex Double)
saveMatrix "real.txt" "%lf" (fst$fromComplex a)
saveMatrix "complex.txt" "%lf" (snd$fromComplex a)
```
プチ解説するとfst, sndは2要素のタプルに対して、第1成分と第2成分を取るものです。

### load

```hs
a_r <-loadMatrix "real.txt"
a_c <-loadMatrix "complex.txt"
let a = toComplex (a_r,a_c)
```

# あとがき

今後も、このテーマに関して新たな見地を得たら加筆修正しようと思います。忌憚なきご意見を頂ければ幸いです。(近いうちに複素行列を使う例を挙げようと思います。)

#### 修正歴
大きな修正は記録しておきます。(加筆はここには書きません)

* IO モナドから中身を取り出すなら、unsafePerformIO でもいいですが単純に"<-"で良いのでそこを修正しました。
Perlで一時ファイル、File::Tempの使い方


この前
[pythonで一時ファイル、一時ディレクトリ(tempfile)](https://qiita.com/ymko/items/eb3478967c456b392825)
を書いたのでPerl版のも書いてみる

# 何はなくともmanページ

perldoc.jpのドキュメントなら日本語なので安心。

[File::Temp \- テンポラリファイルの名前とハンドルを安全に返す \- perldoc\.jp](http://perldoc.jp/docs/modules/File-Temp-0.12/Temp.pod)

# 使い方

ポイントは２つ。

- `use File::Temp`の後に続けて` qw/ tempfile /`を書くこと
- tempfileの引数に`( UNLINK => 1 )`を指定すること

※`UNLINK => 1`を指定しないと/tmpにファイルが残ったままになるので忘れないように。

```perl:main.pl
#!/usr/bin/perl
use v5.10; # say関数を使えるようにする
use warnings;

use File::Temp qw/ tempfile /;

my ($fh, $filename) = tempfile( UNLINK => 1 );
print $fh "Created by File::Temp\n";
close $fh; # 閉じておいた方がよかった気がする※要出典

say "filename=$filename";

system("cat $filename"); # この時点では存在する。プロセス終了時に削除される。
```

# 実行結果

```
$ perl main.pl
filename=/tmp/MfjliwahDk
Created by File::Temp
$ ls /tmp/MfjliwahDk
ls: cannot access /tmp/MfjliwahDk: No such file or directory
```

# 同じくtempdir

- tempdirの引数に( CLEANUP => 1 )を指定すること

```perl:main.pl
#!/usr/bin/perl
use v5.10;
use warnings;

use File::Temp qw/ tempfile tempdir /;

my ($tmpdir) = tempdir(CLEANUP => 1);
if(-d $tmpdir) {
  say "tmpdir=$tmpdir"; # この時点では存在する。プロセス終了時に削除される。
}
```

# 実行結果

```
$ perl main.pl
tmpdir=/tmp/9iHtvMPpvq
$ ls /tmp/9iHtvMPpvq
ls: cannot access /tmp/9iHtvMPpvq: No such file or directory
```
Waveshareの2.13inch電子ペーパーHAT　デモ動作方法

概要は下記参照ください。
https://physical-computing-lab.net/raspberry-pi/waveshare-2-13inch-e-paper-hat.html

RPiでの操作手順はwaveshareの下記サイトにまとまっています。
https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT#Working_with_Raspberry_Pi

RPi Zeroで実際にinstallしましたが、下記のライブラリinstall手順を参考にました。
https://www.waveshare.com/wiki/Pioneer600#Libraries_Installation_for_RPi

上記の手順に従って、installするだけですが、RPi.GPIOとspidevのinstallは下記コマンドで対応しました。
```
$ pip install RPi.GPIO
$ pip install spidev
```

以上
mysql 設定

mysql の設定を行う。

### 初期設定を行う
```
mysql_secure_installation
```

下記の設定が行える。
**rootパスワードの設定**
**anonymousユーザの削除**
**rootでリモート接続設定**
**testDBの削除**

### 文字コードなどの設定を行う。
下記のファイルを修正する。

```
vim /etc/my.cnf
```

文字コードの設定とデフォルトテーブルの種別設定を行う。

```
[mysqld]
character-set-server=utf8
default-storage-engine=InnoDB
innodb_file_per_table 
```

### 接続確認
```
mysql -u root -p
```
`Access denied for user 'root'@'localhost' (using password: YES)`のようなエラーとなる場合は、パスワードが間違っている可能性が高い。

### データベース作成

```
CREATE DATABASE sample;
use sample;
```
作成した後、作成したデータベースに移動する。
これをしないと権限設定時などで`No database selected`とエラーになる。

### ユーザ追加
```
CREATE USER 'ユーザ名'@'localhost' IDENTIFIED BY 'パスワード';
```
外からもアクセス可能にするにはlocalhostを接続先のドメインにする。
どこからでも接続可能にする場合は**%**とする。`CREATE USER 'ユーザ名'@'%' IDENTIFIED BY 'パスワード';`

### 権限追加
全ての権限をつける。

```
GRANT all ON [db or dable] TO 'ユーザ名'@'localhost';
```

全権限つける場合は[db or dable]に **「\*.*」**を指定する。

ユーザ名を間違っていると下記のエラーが表示される。
パスワードが要件を満たしているか以外にもユーザ名の指定が正しいかの確認が必要。
```
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```
ユーザ名がuser1の場合、**TO 'user1'@'localhost'** となる。
**権限をつけたユーザが既にDBに接続している場合、権限を反映させるには再接続が必要。**

下記のSQLで権限情報が確認できる。

```
SHOW GRANTS FOR 'ユーザ名'@'localhost';
```
*%*で権限をつけたい場合は、`SHOW GRANTS for 'ユーザ名'@'%'`;

権限の削除は`REVOKE ALL PRIVILEGES ON [db or dable] FROM 'ユーザ名'@'localhost';`

下記のSQLでユーザ情報が確認ができる。

```
select user,host from mysql.user
```
UIAlertController を楽に書く為の最高のライブラリを作りました (◍•ᴗ•◍)

## 概要

iOS アプリにおいて `UIAlertController` はユーザーに確認を取ったり、選択をしたりするときによく使う UI です. 

しかしながら使うために書くコードの量が多く、しかも単調で辛いです.

そこでいい感じにかけるライブラリを作りました. ->
 https://github.com/mironal/ShortHandAlert

## 問題提起

繰り返しになりますが `UIAlertController` を使うためのコードは長いです. こんな感じです.

```swift

let alert = UIAlertController(title: "title", message: nil, preferredStyle: .actionSheet)


 alert.addAction(UIAlertAction(title: "Some", style: .default, handler: { _ in
     print("do something...")
 }))

 alert.addAction(UIAlertAction(title: "Another", style: .default, handler: { _ in
     print("do something...")
 }))

 alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))

 present(alert, animated: true)
```

上の例は3つのアクションを持つアクションシートです. 縦にも横にも長いですね.

僕は特に `addAction(UIAlertAction(ほんにゃらかんにゃら))` って書くところがごちゃごちゃするのでとても辛くて心を無にしてタイピングしています.

## ライブラリ

そこでいい感じのは無いかな〜〜と思い github を探したのですが、どれも冗長だったので気持ちよく書けるやつを自作しました.

↓ これです.
https://github.com/mironal/ShortHandAlert

先に述べた大変つらいコードと同等のことをするコードは以下のとおりです.

```swift
UIAlertController(title: "Title", message: nil, preferredStyle: .actionSheet)
    .default("Some") {
        print("do something...")
    }
    .destructive("Another") {
        print("do something...")
    }
    .cancel()
    .present(in: self)
```

とてもスッキリと書けます. 特に横幅が短くて済むので好きです.

`UIAlertController` の extension として作ってあるので新たに覚えることは殆ど無く簡単に使い始めることができます.


また、 `AlertBuilder` というよく使う Alert を簡単に作るための Builder クラスも作ってあります.

こんな感じに使えます.

```swift 
AlertBuilder()
    .confirm(title: nil, message: "Some message")
    .approve()
    .present(in: self)
```

エラーを表示するだけならこんな感じ.

```swift 
AlertBuilder()
    .confirm(error: error)
    .approve() { _ in /* OK 押した後に何かしたいならここに書く. */ }
    .present(in: self)
```

これは戻り値をいい感じに設計してあるので補完候補がいい感じに出るようになっています. `UIAlertController` の extension として書いた部分が補完を汚すのでそれを解決するためにこいつを作りました.


![](https://raw.githubusercontent.com/mironal/ShortHandAlert/master/doc_resources/AlertBuilder.gif)


簡単な Alert を作るときは `AlertBuilder` を使ってそれ以外は `UIAlertController` の extension を使うのがおすすめです.

より詳しくは [README](https://github.com/mironal/ShortHandAlert) や [API ドキュメント](https://mironal.github.io/ShortHandAlert/)をご確認ください.


### インストール

インストールは Carthage を使うのをおすすめしています. コードが2つしか無いので自分のプロジェクトにそのままコピーしてもいいと思います.

使いたくなったらぜひともスターをお願いします. https://github.com/mironal/ShortHandAlert
MacのBootCampをブートローダを使って起動時に簡単に切り替えられるようにする

# 環境や前提条件
* Mac macOS High Sierra
* iMac (27-inch, Late 2009)

自分のMacは、BootCampを使ってWindowsとmacOSのデュアルブート環境を作ってあるんですが、HighSierra にして、これが動作してないことに気づきました。
macOSをアップグレードした後は、再度、インストールし直す必要があるみたいで、今後の為に手順をメモとして残すことにしました。

# ブートローダrEFInd
BootCampを使ってインストールしたWindowsは、BootCampコントロールパネルか、起動時にoptionキーを押しながら電源を入れないとOSを切り替える必要があります。
rEFIndをインストールすれば、optionキーを押しながら電源を入れなくても、OS選択画面が出てくるようになります。
さらに、数秒間、未選択で放置した場合も、前回起動したOSがそのまま立ち上がるので、マルチブートの環境を作っているひとは、とても便利になります。

# 導入手順
## 1. rEFIndをダウンロードする
以下のサイトから「rEFInd」をダウンロードしてください。
http://www.rodsbooks.com/refind/getting.html
zipファイルでダウンロードしたら、解凍して「refind-install」という実行ファイルがあるかを確認してください。
それを実行してrEFIndをインストールします。

## 2. macをリカバリーモードで起動する
macをキーボードのcommand+Rを押しながら、電源ボタンを押して起動してください。
リカバリモードで起動されます。
リカバリーモードで起動後、上のプルダウンメニューから、ユーティリティを選択し，ターミナルを起動してください。

## 3. rEFIndをインストールする
起動したターミナルで、以下のコマンドを入力してください。

```sh
$ cd [rEFIndをダウンロードしたフォルダ]
$ sudo ./refind-install
```
以下のようなメッセージが表示されれば、正常にインストールされています。

```sh
Password:
ShimSource is none
Installing rEFInd on OS X....
Installing rEFInd to the partition mounted at /Volumes/ESP
Found rEFInd installation in /Volumes/ESP/EFI/refind; upgrading it.
Copied rEFInd binary files

Notice: Backed up existing icons directory as icons-backup.
Existing refind.conf file found; copying sample file as refind.conf-sample
to avoid overwriting your customizations.


Installation has completed successfully.

Unmounting install dir
Volume EFI on disk0s1 unmounted

~/Downloads/BootLoader/refind-bin-0.10.8 12s
```
上記の手順後、OSを再起動してください。
OSを選択する画面が表示されて、Macで起動するか、Windowsで起動するかを選択できるようになります。
選択せずに、放置していると、前回起動したOSで起動します。


# HighSierraにして起動しなくなったrEFIndの復活方法
macOSをアップグレードすると、rEFIndが消えてしまうようです。
再度、インストールし直せば、使えるようになります。

# 画面イメージ
![refind.png](https://qiita-image-store.s3.amazonaws.com/0/35613/904d5b22-786a-92c3-c440-d6675d3a1969.png)
引用 http://www.rodsbooks.com/refind/index.html
YAMAHA RTX810 で L2TP/IPsec サーバを構築

初 Qiita 投稿です。
よろしくお願いいたします。

やろうやろうと思っていましたが、やってみました。
CUI派なのですが、今回は GUI で挑戦。

本家サイト [L2TP/IPsecを使用したリモートアクセス : RTX810 Web GUI設定](https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/vpn-smartphone-setup_rtx810_gui) とほぼ同じなのですが、自分の設定も少し入れています。

# ネットボランチ DNS の設定
VPN でルータに接続するためには、クライアント側からグローバル IP アドレスを指定する必要がありますが、今回は自宅のルータで実験するので、接続先のグローバル IP アドレスは動的です。

そのため、YAMAHA で公開されている DDNS、ネットボランチ DNS を利用して、動的 IP アドレスに名前を付けることで、一意の接続先指定で利用することができるようになります。

1. RTX810 にログインする。
***

2. 「詳細設定と情報」をクリック。
<img width="534" alt="rtx810top.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/fb790e66-bcfc-5c8b-875d-a595e882b6ce.png">
***

3. 「ネットボランチDNSホストアドレスサービスの設定」の「設定」ボタンをクリック。 
<img width="454" alt="netvolante1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/b227ab49-e5b5-433b-9a65-8c7cb6e11c18.png">
***

4. 「ホスト名」に自分の好きな文字列を入力する。
<img width="483" alt="netvolante2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/ea6eaff5-7708-723c-291c-50320a9e64d6.png">
***

5. 利用企画については「同意する」をクリック。
<img width="200" alt="netvolante3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/3216c750-e366-a7a0-f221-2a9f4b2d9490.png">
***

6. ホストアドレスに作成された FQDN が表示されるので、控えておく。
<img width="461" alt="netvolante4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/046839ac-c38b-8d15-511b-e45e4f1f44fe.png">
***

これで、登録が終了したので、nslookup などで、IP アドレスが登録されているかを確認することができます。

# L2TP/IPsec の設定
次に RTX810 をサーバとして機能させるための設定を行います。

1. 「VPN接続の設定」の「設定」ボタンをクリック。
<img width="457" alt="vpns1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/4a0f20d5-6eac-0ae7-a1ff-eb27f9282be9.png">
***

2. 「PP[xx]またはTUNNEL[xx]」の「追加」をクリック。
<img width="457" alt="vpns2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/f23cfd4a-665d-1bb4-5864-61a841360d72.png">
***

3. 「L2TP/IPsecを使用したリモートアクセス VPN サーバー(Anonymous)」を選択。
<img width="470" alt="vpns3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/a18c198f-bea2-ba0f-b3ee-5e512d85c3f6.png">
***

4. VPN接続設定の登録
・設定名：任意
・事前共有鍵：任意
・認証アルゴリズム：HMAC-SHA256
・暗号アルゴリズム：AES-CBC
・キーアライブ：使用する
・NATトラバーサル：使用する
・PPP認証方式：CHAP-PAP
<img width="454" alt="vpns4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/f0b4e363-b011-86ce-b202-2d9653b5cf81.png">
***

5. 接続ユーザーID、接続パスワードを設定します。
<img width="454" alt="vpns5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/cc45ac0a-3f96-e726-d869-e1f4b7e6e5be.png">
***

6. 登録できたと出たら終了です。
<img width="465" alt="vpns6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/245497/91f92a82-bb1e-4a6f-aba3-b6218561a59f.png">
***

いつも CUI で操作していたのですが、GUI も楽ですね。
次は、Android で VPN 接続してみようと思います。
【初学者向け】Python 基礎4  Yahooから全てのリンクを一覧化(BeautifulSoup)

#これまで

[・【初学者向け】Python 基礎1 関数定義と呼び出し](https://qiita.com/ryo_xsjsj/items/c0b64f3679da9d168aaa)
[・【初学者向け】Python 基礎2  ブロックとfor文if文](https://qiita.com/ryo_xsjsj/items/a9eda646bd5e2379d41f)
[・【初学者向け】Python 基礎3  pipによるサードパーティーモジュールのインストール方法](https://qiita.com/ryo_xsjsj/items/1ca29dd5afd2db9fe9cc)

間違いやもっと良い方法などありましたらご指摘頂けると嬉しいです。

▽環境
Python 3.6.4

#内容
##BeautifulSoupのインストール
HTMLやXMLなどが解析できるBeautifulSoupを使います。(ビューティフルスープ。という読み方でいいのか）
```
pip install beautifulsoup4
```

##withについて
withを使うとファイル読み込み時の可読性が向上する。
今回はURLからHTMLファイルを読み込む際に使用。
[withについてはここが詳しい](https://qiita.com/howmuch515/items/95efab2e61f735a150e3)

##さあ実行

```python:getlink.py
from bs4 import BeautifulSoup
# ファイル読み込みの為、urllibを使用
import urllib.request as req

url = "https://www.yahoo.co.jp/"

# urlopen(url)が成功したらread以降を実行
with req.urlopen(url) as f:
    # あくまでwww.yahoo.co.jpはURLなのでurlopenからのreadでhtmlを読み込む
    res = f.read()
    # HTML形式として解析
    soup = BeautifulSoup(res, 'html.parser')
    # <a>を全て取得
    links = soup.find_all("a")
    # 取得した情報分繰り返す
    for a  in links:
        # attrsに保持しているhref情報を取得
        href = a.attrs['href']
        # <a>のtitleを取得
        text = a.string
        # 出力
        print(text,">>",href)
```

```:結果
ヘルプ >> https://www.yahoo-help.jp/
ニュース >> https://news.yahoo.co.jp/
天気 >> https://weather.yahoo.co.jp/weather/
スポーツナビ >> https://sports.yahoo.co.jp/
ファイナンス >> https://finance.yahoo.co.jp/
テレビ >> https://tv.yahoo.co.jp/
GYAO! >> https://gyao.yahoo.co.jp/
ゲーム >> https://games.yahoo.co.jp/
Yahoo!モバゲー >> http://yahoo-mbga.jp/?_ref=aff%3Dysm001
地図 >> https://map.yahoo.co.jp/
路線 >> https://transit.yahoo.co.jp/
   ～
会社概要 >> https://about.yahoo.co.jp/
投資家情報 >> https://about.yahoo.co.jp/ir/
社会的責任 >> https://about.yahoo.co.jp/csr/
企業行動憲章 >> https://about.yahoo.co.jp/info/charter/
広告掲載について >> https://marketing.yahoo.co.jp/
採用情報 >> https://about.yahoo.co.jp/hr/
利用規約 >> https://about.yahoo.co.jp/docs/info/terms/
免責事項 >> https://about.yahoo.co.jp/docs/pr/disclaimer.html
メディアステートメント >> https://about.yahoo.co.jp/info/mediastatement/
プライバシーポリシー >> https://about.yahoo.co.jp/docs/info/terms/chapter1.html#cf2nd
```
Vagrantでの仮想マシン作成方法まとめ

ドットインスールで学んだVagrantでの仮想マシン作成手順をさくっとまとめ。
## Vagrantについて
Vagrantは、仮想マシンをコマンドで簡単に管理できるツール。
ところどころ情報が古いため本記事では最新情報で記録。
[ドットインストール](https://dotinstall.com/lessons/basic_vagrant)

## VagrantとVirtualBoxのインストール
それぞれ公式サイトから環境に合わせてダウロードする。
[Download Vagrant](https://www.vagrantup.com/downloads.html)
[VirtualBox](https://www.virtualbox.org/)

## VagrantのBOXのダウンロード
有志の方が作成したBOX(仮想マシンのテンプレート)を下記からダウロードする。今回はcentos7.3。
https://app.vagrantup.com/boxes/search

```bash
$ vagrant box add bento/centos-7.3 https://app.vagrantup.com/bento/boxes/centos-7.3
```

仮想化ソフトウェアを選択する。今回はVirtualBoxなので2を選択。時間がかかる。

```bash
1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
```


## ダウンロードしたBoxの表示

```
$ vagrant box list
bento/centos-7.3 (virtualbox, 201708.22.0)
```


## 仮想マシンの作成

```
$ mkdir centos73  // 任意のディレクトリ作成
$ cd centos73  // 移動
$ vagrant init bento/centos-7.3  // vagrantfileが作成される
$ vagrant up  // 仮想マシンが作成され起動する
```


## 仮想マシンの起動・シャットダウン

```
$ vagrant status  // 状態を見る
$ vagrant suspend  // スリープ
$ vagrant resume  // スリープから復帰
$ vagrant halt // シャットダウン
$ vagrant up  // 起動
$ vagrant reload  // 再起動
```


## 仮想マシンにsshで接続

```
$ vagrant ssh
$ pwd
home/vagrant  // カレントディレクトリ
$ exit  // 仮想マシンから抜ける
```
<br>
あとはUNIXコマンドでWebサーバ起動などいろいろできる。
[Ruby]to_iメソッドとto_sメソッドについて

#to_i と to_s が覚えられない
と言うか覚える気が無いようなのでメモっとく

* to_iメソッドが文字→数値
* to_sメソッドが数値→文字

to_iの例

```
number = "10"
puts number + 90　      #エラーになる
puts number.to_i + 90　 #OK
```

to_sの例

```
number = 10
puts number + "個のりんご"　     #エラーになる
puts number.to_s + "個のりんご"　#OK
```

##参考文献
[ruby 数値と文字列を連結させる方法「to_s」「to_i」メソッド](http://pg-ruby.hatenablog.com/entry/2016/12/25/164750)
[Ruby]自己代入演算子

#勉強中に出てきた
自己代入演算子がややこしいのでメモっとく

```
hoge += 1 (hoge = hoge + 1の意味)
hoge -= 1 (hoge = hoge - 1の意味)
hoge *= 2 (hoge = hoge * 2の意味)
hoge /= 3 (hoge = hoge / 3の意味)
```

他にもあるらしいが、また勉強中に出てきたら書きたそう。
aws-cli で CloudFront の設定を変更する。

# はじめに
CloudFrontは設定変更を誤った場合の影響が大きいです。そのためより安全に正確に変更作業を行うのにaws-cliを使うのが良いと思いました。


# 設定の確認
まず今回は通信用にサポートされる _SSL/TLS_ プロトコルの変更を行うことにします。

ディストリビューションで現在設定されている内容を確認するには _cloudfront_ の _get-distribution-config_ コマンドで確認できます。
ただ、そのまま出力されると内容が多くて分かりにくいので、TLSの部分だけ抜き出します。

```bash:TLS確認
$ aws cloudfront get-distribution-config --id "xxxxxxxxxxxxx" | jq '.["DistributionConfig"]["ViewerCertificate"]["MinimumProtocolVersion"]'
"TLSv1"
```

現在の設定は _TLSv1_ が設定されています。


# 設定変更
それでは設定変更を行います。
まずは現在の設定状況を管理コンソールからも確認して見ます。

![スクリーンショット 2018-03-25 15.35.58.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1df97fd7-c5e8-d1b3-a92c-708e1ca5a242.png)

今回は赤枠の _TLSv1_ を _TLSv1.1_2016_ へ切り替えたいと思います。
まず、先ほどの _get-distribution-config_ で表示される _DistributionConfig_ の部分をテキストへ出力します。

```bash:dist.conf
$ aws cloudfront get-distribution-config --id "xxxxxxxxxxxxx" | jq '.DistributionConfig' > dist.conf
```

出力したらそのファイルを開き _TLSv1_ の部分を _TLSv1.1_2016_ へ変更します。
サポートされる _SSL/TLS_ プロトコル は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/secure-connections-supported-viewer-protocols-ciphers.html)で確認してください。

```bash:変更確認
$ cat dist.conf | jq '.["ViewerCertificate"]["MinimumProtocolVersion"]'
"TLSv1"
```

次に _ETag_ を取得します。このETagの取得が今回のポイントです。

```bash:ETag
$ aws cloudfront get-distribution-config --id "xxxxxxxxxxxxx" --profile proudit | jq '.ETag'
"EZLFL1SIXPXTL"
```

この _ETag_ がマッチしないと設定の変更ができません。
それでは設定を更新します。

```bash:update-distribution
$ aws cloudfront update-distribution --id "xxxxxxxxxxxxx" --distribution-config file://dist.conf --if-match EZLFL1SIXPXTL
```

それでは _Security Policy_ をもう一度確認して見ます。

```bash:確認
$ aws cloudfront get-distribution-config --id "xxxxxxxxxxxxx" | jq '.["DistributionConfig"]["ViewerCertificate"]["MinimumProtocolVersion"]'
"TLSv1.1_2016"
```

管理コンソールからも変更されていることが確認ができました。

![スクリーンショット 2018-03-25 15.41.16.png](https://qiita-image-store.s3.amazonaws.com/0/82090/754f824e-6499-1970-2e9a-43a3a3f5fffb.png)


# おわりに
管理コンソールでの設定変更は誤操作を誘発しやすくなります。コマンドの場合、作業ログの保存はもちろん、設定情報の変更前と変更後の差分をdiffなどで確認した上で更新できるのオススメです。
.Net Native コンパイルエラー ILT0005 に対処する


## 原因１：日本語などの文字列を使って変数宣言している等

### エラー内容




> 1>C:\Users\{UserName}\.nuget\packages\microsoft.net.native.compiler\1.7.3\tools\Microsoft.NetNative.targets(697,5): **error : ILT0005**: 'C:\Users\{UserName}\.nuget\packages\microsoft.net.native.compiler\1.7.3\tools\x86\ilc\Tools\\**nutc_driver.exe** @"C:\Users\{UserName}\Documents\Repo\{ApplicationName}\{ApplicationName}\obj\x86\Release\ilc\intermediate\MDIL\{ApplicationName}.rsp"' returned exit code -1073741819


### 対処方法

単に日本語の変数名を使うだけであればコンパイルは通るようですが、**シリアライズ対象（DataMemberアトリビュート）となる変数名に日本語等が使用されている**と、コンパイルエラー ILT0005 が発生する模様。



### 参考

https://ufcpp.wordpress.com/2014/04/03/net-native/

[コンパイル時ILT0005が発生する +2016/03/06追記 - UWPで備忘録](http://uwpmemo.blogspot.jp/2015/12/ilt0005.html)


## 原因２：System.Reactive 4.1.0以上を使用している

### エラー内容

```
error : RHBIND : error RHB0002
error : ILT0005 returned exit code 2
```


### 対処方法

System.Reactive 4.0.0以下に依存するようにする。

ReactivePropertyを使用している場合は 5.3.0 以下にダウングレードする。

### 原因２の詳細

ReactiveProperty の6.1.xを使用していたため、System.Reactive 4.3.0に依存が発生しており、これが原因でコンパイルエラーとなっていた模様。

私の環境の場合は

* System.Reactive
* System.Reactive.Core
* System.Reactive.Interfaces
* System.Reactive.Linq
* System.Reactive.PlatformServices

の５つ全てをNugetパッケージマネージャから 4.0.0 に統一することで問題を解消できた。


### 参考

https://github.com/dotnet/corert/issues/7687#issuecomment-520948887

> danwalmsley commented on 14 Aug
Ok for anyone else out there, the only way to get this to actually work was (and this is a workaround not a solution)

> 1. dont need to use ShortcutGenericAnalysis
> 2. downgrade System.Reactive to v4.0.0.0
> 3. downgrade ReactiveUI to at least 9.13.1 (if you use that package)

> Then it will work again.

> There must be some compatibility issue with System.Reactive 4.1 and above that makes it unusable in UWP apps.
【vimめも】 10. マッピング

mapとは
自分で好きなキーに対して、
特定のキーやキーの組み合わせ、関数などを割り当てたりすることが出来る機能です

## 基本的な説明

### マッピングを設定

基本は、
`map` + 割り当てたいキー + 割り当てたい内容
で行います

### マッピングを解除

mappingをやっぱり取り消したい場合は
`unmap` + 割り当ててるキー

### マッピングを確認

`map` + 確認したいキー
で行います。

## 再帰マップと非再帰マップ

```vim
map j gj
```
こうしたときに
jがgjになるけど、gjのjの部分がgjにならない・・・？？
と無限ループになってしまいます

再帰的にマッピングされないようにするためには
mapではなくnoremapを使います

`map`　：　再帰的マップ
`noremap` ：　非再帰的マップ

## モード別の設定

vimではモードにより、同じキーでも様々な動作になるため
モード別にマッピングを行うことができます
確認や解除なども同じで要領です

:map   :noremap  :unmap     ノーマル、ビジュアル、選択、オペレータ待機
:nmap  :nnoremap :nunmap    ノーマル
:vmap  :vnoremap :vunmap    ビジュアル、選択
:smap  :snoremap :sunmap    選択
:xmap  :xnoremap :xunmap    ビジュアル
:omap  :onoremap :ounmap    オペレータ待機
:map!  :noremap! :unmap!    挿入、コマンドライン
:imap  :inoremap :iunmap    挿入
:lmap  :lnoremap :lunmap    挿入、コマンドライン、Lang-Arg
:cmap  :cnoremap :cunmap    コマンドライン

## キーの説明

マッピング時の特殊なキーの表記です

|キー|意味|
|:-:|:-:|
|`<BS>`|バックスペース|
|`<Tab>`|タブ|
|`<Enter>`|エンター|
|`<CR>`|キャリッジリターン。エンター押下時の改行と同じ|
|`<Esc>`|エスケープ|
|`<Space>`|スペース|
|`<Bar>`|垂直バー（パイプ）|
|`<Up>`|上カーソル|
|`<Down>`|下カーソル|
|`<Left>`|左カーソル|
|`<Right>`|右カーソル|
|`<S-何か>`|Shift押しながら|
|`<C-何か>`|Ctrl押しながら|
|`<S-C-何か>`|ShiftとCtrl押しながら|
|`<F1>` - `<F12>`|F1〜F12|

AltキーやMacのCommandなどにもマッピングはできますが、少しややこしい？ので割愛
詳細を知りたい人は`help :map-alt-keys`を確認ください


また、動作をさせない用途で
空のマップを作るには 割当キーに "<Nop>" を指定する方法があります。

例)F8を何も動作させないようにする
`map  <F8>  <Nop>`

## 空いたキーの確認

helpを引くと下記の記載があります
ぜひお試しを

```
標準のキー操作を損なうことなくマップできるキーや、使われていないキーを探すには
|index.txt| を参照してください。":help {key}^D" を使用してそのキーが使われてい
るかどうかを調べることもできます ({key}は調べたいキー、^DはCTRL-Dの入力)。
```

## Leader機能

Leaderとは・・・(helpを引用すると下記)

```
マップコマンドで特別な文字列 "<Leader>" を使用すると、その部分が変数
"mapleader" に設定された文字列で置き換わります。"mapleader" が空文字列のときや
設定されていない場合にはバックスラッシュが使用されます。例: >
```

mapは1つのキーに対して割り当てないといけないわけではなく、
キーの組み合わせで動作をそれぞれ設定できます

説明に書いてある通り、mapleaderに設定してあるものが`<Leader>`に置き換わるため
`let mapleader = "\<Space>"`このような形で設定しておくと
`<Space>` + なにかのキー　の形で1つのキーからの組み合わせでさまざまな機能をマッピングさせることができます。


そして、これはShougoさんの設定を参考にさせていただき知った方法なのですが
ブラケットにて囲ったものを名前？付けとしておくことができます

```vim
nmap <Leader>w [window]
nnoremap [window]h <C-w>h
nnoremap [window]j <C-w>j
nnoremap [window]k <C-w>k
nnoremap [window]l <C-w>l
```

この場合
`<Space>wh`とすればウィンドウを左に移動
`<Space>wj`とすればウィンドウを下に移動 等となります

これをリーダーから操作の種類ごとに分類分けを行うことができます

```vim
nmap <Leader>t [tab]
nmap <Leader>w [window]
nmap <Leader>f [filer]
nmap <Leader>r [rails]
```

前回:[【vimめも】 9. 設定(set)系](https://qiita.com/r12tkmt/items/f5a99573c80d558aaa43)
次回:[【vimめも】 11. バッファとウィンドウ](https://qiita.com/r12tkmt/items/1f396ddb4c701b59e1e8)
Web Components 入門として Hello World タグを作る

# Web Components とは何か


簡単に言ってしまえば、オリジナルタグを作れるHTMLの仕様です。
このあたりの記事が詳しいです。
https://html5experts.jp/shumpei-shiraishi/24239/

良い感じに小さくまとまっている実装が無かったので自作してみました。

# Hello, Worldタグを作る
こんな感じになります。
https://iwtn.github.io/hello_world_tag/
後述しますが、ブラウザのサポート状況は微妙でChromeでしか表示できないと思います。

ソースコードはこちら
https://github.com/iwtn/hello_world_tag

Developer Tools で見ると、オリジナルのタグで出来ていることがわかりやすいと思います。
![スクリーンショット 2018-03-25 14.54.59.png](https://qiita-image-store.s3.amazonaws.com/0/16864/c8ad975b-0589-3db4-d637-bfc32992148a.png)

# 3つの基本要素（本当は4つ）と基本的な作り方

1. template タグを使って構造を定義する
2. HTMLElement を継承したクラスとして CustomElements を定義する
3. 1で作った　template　を　Shadow　DOM　として、2で作った　CustomElements　に組み込む
4. （番外）HTML imports で他のページに読み込む（今回はやっていない）

## （番外）HTML imports
せっかく作ったオリジナルタグなので、再利用のために他のページでも使いたいところです。
そのための仕様として HTML imports があります。
しかし、仕様が微妙なようで実装が進んでいないそうです。
代替案としては、最初に上げたURLの記事にある通り ES modules を使って再利用できます。

## templateタグ

```html
<template id="hello">
  <style>
    .colored {
      color: red;
    }
  </style>

  <div class="colored">
    Hello, <span><content></content></span>!
  </div>
</template>
```
このタグを書いただけではレンダリングされず、body, head, frameset のどこでも書けます。
HTMLのタグやCSSのスタイルを自由に記述できます。
`<content></content>` の部分に作成したタグでくくった内容が入ります。


## Custom Elements

```javascript
class HelloDiv extends HTMLElement {
  constructor() {
    super();
    // ShadowDOMを使った実装が入る
  }
}
customElements.define('hello-tag', HelloDiv);
```
[HTMLElement](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement) を継承して新しいタグを表すクラスを定義しています。
HTMLElementには、タグとしての基本的な属性を設定できたり、イベントを登録したりできるので、これを継承することで、様々な機能を持ったタグを作成できます。


## Shadow DOM

```javascript
    const template = document.querySelector('#hello');
    const node = document.importNode(template.content, true);

    this.createShadowRoot();
    this.shadowRoot.appendChild(node);
```
1. template タグをDOM全体から取得し、そのコピーを作成しています。
2. HTMLElement を継承したオリジナルタグに Shadow Root を用意して、そこに template で定義したDOMを入れます。

サンプルコードの中により上部で全体のスタイルを定義した style タグ（背景色と文字色をCSSで設定している）がありますが、オリジナルのタグはその影響も受けません。
これは Shadow DOM でカプセル化されているためです。


# まとめと感想
これでオリジナルのタグを作るための土台はできたと思います。
この仕様が実際に使われるかはわかりませんが、フロントエンドがコンポーネント指向に向かっている現状では、押さえておいて悪くはないと思っています。

## サポート状況
Chromeなら見れますが、実装が進んでいるとはとても言えない状況です。
* https://caniuse.com/#feat=template
* https://caniuse.com/#feat=shadowdomv1
* https://caniuse.com/#feat=custom-elementsv1
* https://caniuse.com/#feat=imports

## 参考URL

* template タグ
 * https://www.html5rocks.com/ja/tutorials/webcomponents/template/
* Custom Elements
 * https://www.html5rocks.com/ja/tutorials/webcomponents/customelements/
* Shadow DOM
 * https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom/
 * https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-201/
 * https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-301/
* HTML imports
 * https://www.html5rocks.com/ja/tutorials/webcomponents/imports/
n親等までqueryを表示する。

### 複雑なdomだとqueryがわからない時がある。
自身を含めてdomを遡りqueryを取得する。

```js
let fn={};
fn.sq=(d,opt=2)=>{
 let f=(d)=>{return (d)?[
   d.tagName.toLowerCase()
   ,(d.classList.length!=0)?'.'+[].slice.call(d.classList).join('.'):''
   ,(d.id&&d.id!='')?('#'+d.id):''
   ,(d.name)?`[name="${d.name}"]`:''
  ].join(''):null;
 }
 ,now=d
 ;return Array.from({length:opt})
  .map((d,i)=>{now= (now)?(i===0)?now:now.parentElement:null;return now})
  .map(d=>f(d)).filter(d=>d).reverse().join('>')
 ;
}
;
//fn.sq(element,3); //parent from me to 3. //div.temp>div.f>div.ed.of-editer
```

### querySelectorでそのまま使える。
```js
document.querySelector('div.temp>div.f>div.ed.of-editer')
//<div class="ed of-editer" contenteditable="plaintext-only">ee</div>
```

### 全部
```js
let fn={};
fn.sq=(d,opt=2)=>{
 let f=(d)=>{return (d)?[
   d.tagName.toLowerCase()
   ,(d.classList.length!=0)?'.'+[].slice.call(d.classList).join('.'):''
   ,(d.id&&d.id!='')?('#'+d.id):''
   ,(d.name)?`[name="${d.name}"]`:''
  ].join(''):null;
 }
 ,now=d
 ;return Array.from({length:opt})
  .map((d,i)=>{now= (now)?(i===0)?now:now.parentElement:null;return now})
  .map(d=>f(d)).filter(d=>d).reverse().join('>')
 ;
}
;
let el=document.createElement('input')
,caller=function(ev){ if(ev.target!=el)el.value=fn.sq(ev.target,3)}
el.style.cssText='position:fixed;top:0;right:2rem;width:22rem;'
document.body.appendChild(el);
document.body.addEventListener('click',caller,false);
;
```
```html
<!------test dom------>
<section id="app">
<div class="left of-side">
<div class="has-top">top</div>
<div class="has-bottom">bottom</div> 
</div>
<div class="center"></div>
<div class="right of-side">
<div class="has-top">top</div>
<div class="has-bottom">bottom</div> 
</div>
<!------------------>
<div class="temp">
 <div class="f"><div class="ed of-editer" contenteditable="plaintext-only">ee</div><div class="info">a</div></div> 
</div> 
</section>

```

### 注意
全く同一構成の要素はわからない。例えば、liの何番目か等。
あくまで、どのフレームに対して処理を行えばいいか知るのが目的。
`SAXReader`：デフォルト名前空間が設定されたxmlファイルを、XPath形式で取得する



# 環境

* [org.dom4j.io.SAXReader](https://dom4j.github.io/javadoc/1.6.1/org/dom4j/io/SAXReader.html)

```xml:pom.xml
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.1</version>
</dependency>
```


# やりたいこと


以下のような、デフォルト名前空間が設定されたXMLを、XPath形式でで取得したいです。

```xml:web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
  <context-param>
    <param-name>version</param-name>
    <param-value>1.2.3</param-value>
  </context-param>
 </web-apps>
 ```
 
 
 今、 `<param-name>`要素内の`version`というキーに対応する、`<param-value>`要素内の`1.2.3`という値を取得したいです。


# 試したこと
 

 以下のコードでは、空文字が返ってきて`1.2.3`という値は取得できませんでした。
 
  ```java:Bad.java
 BaseXPath xpath = new Dom4jXPath("//context-param/param-name[text()='version']/following-sibling::param-value");
String version = xpath.stringValueOf(doc); //⇒空文字
 ```
 

# 実現できた方法
 

 デフォルト名前空間を、自分で設定する必要があります。
 
 ```java:Good.java
 //デフォルト名前空間を"p"という接頭辞にする。
BaseXPath xpath = new Dom4jXPath(//p:context-param/p:param-name[text()='version']/following-sibling::p:param-value");
xpath.addNamespace("p", "http://java.sun.com/xml/ns/j2ee");
String version = xpath.stringValueOf(doc); //⇒1.2.3
 ```
 
 
# 参考サイト
 http://waman.hatenablog.com/entry/20091030/1256858160
 http://www.edankert.com/defaultnamespaces.html#What_s_the_Problem_
シングルクオートとダブルクオートの違い

# シングルクオートとダブルクオートの違い とは？
## ずばり、ない。

使いわけとしては、
```「parameterなどでダブルクオーテーションが使われていれば、
それらはシングルクオーテーションでくくってやろう。」```
こんな感じ。

```js
var hoge = '{"name":"ken","id":12345}';
```
扱う文字列(ここでは　{"name":"ken","id":12345}　)に
ダブルクオーテーションが含まれるため、もしくはダブルクオーテーションを使いたいとき、
シングルクオーテーションを使う。

逆もしかり。
gatsbyでbloomerを使う


[Bulma](https://bulma.io/)のReact Componentライブラリ[Bloomer](https://bloomer.js.org/#/)を[Gatsby](https://www.gatsbyjs.org/)で使う方法です。

## 前提

```
$ node -v && npm -v
v9.2.0
5.5.1
```
```
bloomer: 0.6.3
bulma: 0.6.2
gatsby: 1.9.238
```


## Gatsbyプラグインのインストール

まずは、Gatsbyのプラグイン[gatsby-plugin-sass](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-sass)をインストール。

```
$ npm install gatsby-plugin-sass
```

※この時インストールされたバージョン: 1.0.24

## Bloomerのインストール

あとは、Bloomerのドキュメント通りにインストールを進めます。

```
$ npm install bloomer
$ npm install bulma
```

`layouts/index.js`にbulmaをインポートします。

```js:index.js
import 'bulma';
```

## 動作確認

適当にBloomerのComponentの配置してみます。

```js:index.js
import React from 'react'
import PropTypes from 'prop-types'
import 'bulma';
import { Columns, Column, Button } from 'bloomer';

import Header from '../components/Header'
import './index.css'

const TemplateWrapper = ({ children }) => (
  <div>
    <Header />
      <Columns isCentered>
        <Column>
          <Button isColor='info'>bulma button</Button>
        </Column>
        <Column>
          <Button isColor='success'>bulma button</Button>
        </Column>
        <Column>
          <Button isColor='danger'>bulma button</Button>
        </Column>
      </Columns>
  </div>
)

TemplateWrapper.propTypes = {
  children: PropTypes.func,
}

export default TemplateWrapper
```

次のように、Bulmaスタイルのボタンが使えることが確認できました。

<img width="911" alt="スクリーンショット 2018-03-25 15.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/30b9679e-a23f-145b-f92b-faa5c5991f61.png">

以上です。
Djangoのインストールで躓いたのでメモ

環境
virtualbox
Vagrant
（両方とも2018.3.25の時点で最新）

使用しているアプリ
mobaxterm

https://qiita.com/244mix/items/6fd9991c6fcba00c4c71　「5分でできるVagrantでDjangoの環境構築」（@244mixさん）
↑この記事を参考にして進めていました。

まず、vagrant sshまではコマンドプロンプトで進めます。
次に、mobaxtermに入り、
$sudo apt-get install python-pip
$ sudo pip install Django
$ sudo django-admin.py startproject spam
$ cd spam/
$ sudo python manage.py migrate
$ sudo python manage.py runserver 0.0.0.0:8000
を進めていきました。
しかし、
$sudo pip install Djangoで次のようなエラーが
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235742/1aa428ce-63d2-b806-2f17-e95eb33fadf9.png)

エラーに書かれているように
$ pyhthon -m pip install --upgrade pip setuptools

permission deniedされました。

なので、sudoをつけて実行
$sudo python -m pip install 

通りました。

その後も無事に動く。

しかし、localhostにアクセスできません。
  config.vm.network "forwarded_port", guest: 8000, host: 12345
をvagrantfileに書いてあるので、
 runserver 0.0.0.0:8000
したのですが、アクセスを拒否されました。
とりあえず、Djangoが動いているかどうか見たかったので、
 runserver 0.0.0.0:3000をして、
http://127.0.0.1:3000/にアクセスしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235742/a25a7c13-2130-d729-9162-cb1e2c99b7f1.png)

画面は見る事が出来ました。
でも8000でゲスト画面で見たいんですけどね、、、解決したらまた追記したいです。今のところ3000で進めていきます。

(2018.03.26)
3000で進めたら案の定、Djangoでのウェブアプリケーション作成時に躓きました。

原因を探ってみると、virtual Boxのポートが解放されていなかったのが原因だったようです。
設定＞ネットワーク＞高度＞ポートフォワーディング
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235742/5982057d-9e29-eca1-7945-e6748df96951.png)
この記述を足したら無事に動きました。やったね
現調時、プリンタ追加をスクリプトで追加してて困った事

# 現調時、プリンタ追加をスクリプトで追加してて困った事
## 環境
OS:Windows2012R2 Datacenter
役割：APサーバー
　　　サーバー名:IPAddress　RDS01:192.168.1.1
　　　サーバー名:IPAddress　RDS02:192.168.1.2
設定したいプリンタ
　　　プリンタ名：PRN01
　　　機種：FX DocuPrint 3100
　　　IPAddress：192.168.1.250
### 内容
事前にプリンタドライバ(FX DocuPrint 3100)をRDS01、RDS02へインストーラ(GUI)を用いてインストール済みの状態でRDS02へ以下のコマンドを使いプリンタを追加しRDS01へ同じコマンドを使い追加したらエラーがでた

### 使ったコマンド
IP設定
cscript.exe /nologo %WINDIR%\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs -a -r IP_192.168.1.250 -h 192.168.1.250 -o raw -n 9100

プリンタ追加
cscript.exe /nologo %WINDIR%\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs -a -p "追加テスト1" -m "FX DocuPrint 3100" -r IP_192.168.1.250


### エラー内容
プリンタを追加できません　追加テスト1　エラー0x80041001

操作PutInstance
プロバイダWin32プロバイダ
説明プリンタドライバが不明です。
 Win32エラーコード1797

### やった事
ググってみると対処方法は見つからなかった。ドライバが不明ならドライバを指定してやろうという発想でドライバをCUIにてインストールする方法を探し、以下を試したらプリンタ追加ができた。
やったｗ

cscript.exe /nologo %WINDIR%\System32\Printing_Admin_Scripts\ja-JP\prndrvr.vbs -a -m "FX DocuPrint 3100" -v 3 -i "<ドライバのパス>\FXLBNJL.inf"

cscript.exe /nologo %WINDIR%\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs -a -p "追加テスト1" -m "FX DocuPrint 3100" -r IP_192.168.1.250
追加されたプリンター 追加テスト1
CentOS 7 cmake 3.10.3のソースファイルからのインストール

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# ダウンロード・展開
最新バージョンの確認
[Download | CMake](https://cmake.org/download/)

`/usr/local/src`ディレクトリに移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://cmake.org/files/v3.10/cmake-3.10.3.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar zxvf cmake-3.10.3.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd cmake-3.10.3
````

コンパイル・インストール

````
./bootstrap --prefix=/opt/cmake --no-system-libs
make
make install
````

# エラー対策
`./bootstrap`で`lib64`関連のエラーが発生するため、共有ライブラリへの対策。
エラー内容。

````
/usr/local/src/cmake-3.10.3/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/src/cmake-3.10.3/Bootstrap.cmk/cmake)
/usr/local/src/cmake-3.10.3/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/src/cmake-3.10.3/Bootstrap.cmk/cmake)
````

`/etc/ld.so.conf`の編集

````
vi /etc/ld.so.conf
````
`/usr/local/lib64/`を追加し、更新コマンド`ldconfig`を実行する。

````
/usr/local/lib64/
````

この時点で`ldconfig`するとエラーが表示される。

````
ldconfig: /usr/local/lib64/libstdc++.so.6.0.24-gdb.py は ELF ファイルではありま せん - 先頭に誤ったマジックバイトを持っています。
````

対策を行う。（参照しないようにする）

````
mv /usr/local/lib64/libstdc++.so.6.0.24-gdb.py /usr/local/lib64/back.libstdc++.so.6.0.24-gdb.py
````

以上で`./bootstrap`が実行できる。

# 環境変数 PATH の設定
インストールしただけではcmakeが実行できないので、`/etc/bashrc`環境変数を設定する。

````
vi /etc/bashrc
````

`PATH=$PATH:/opt/cmake/bin`を追加し、コマンドを実行する。

````
PATH=$PATH:/opt/cmake/bin
source /etc/bashrc
````
# バージョン確認

````
cmake -version
````
以下のような内容が、表示される。

````
cmake version 3.10.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).
````
# 参考
[MySQLのビルドに欠かせないCMakeを準備する：仕事で使える魔法のLAMP（45） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1203/02/news117.html)
[CMakeインストールメモ(Hishidama's CMake install Memo)](http://www.ne.jp/asahi/hishidama/home/tech/cmake/install.html)
(

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
日本のオンライン勉強会のまとめ

# 日本のオンライン勉強会

自分を含めた初学者の方の助けになるよう、日本のオンライン勉強会とユーザーグループのSlackをまとめました。
他にもたくさんのコミュニティ・勉強会があると思いますので、コメント・編集リクエストをお待ちしています。

## 言語 
### Haskell
- [Haskell-jp](https://join-haskell-jp-slack.herokuapp.com/)

### Java
- [jjug-members](https://docs.google.com/forms/d/e/1FAIpQLSfDyxD_kZbU2bLNgTuP5SJtMzq6aEIX9BBP3rZtv5Ga9ApcHg/viewform?fbzx=4585598784431731000)

### JavaScript
- [Gotanda.js](https://gotandajs.slack.com/)
- [node/iojs-jp](https://iojs-jp-slack.herokuapp.com)

### Perl
- [Gotanda.pm](http://gotanda.pm.org/about.html)

### PHP 
- [PHP](https://slackin-phpusers-ja.herokuapp.com/)

### Python
- [Python.jp](https://www.python.jp/pages/pythonjp_discord.html)
- [pyhack](http://pyhack.herokuapp.com/)

### R
- [Tokyo.R](https://r-wakalang.herokuapp.com/)

### Ruby
 - [ruby-jp.slack.com](https://ruby-jp.github.io)

### Rust
- [rust-jp](https://rust-jp.herokuapp.com/)	

### Scala
- [scala-jp](http://scala-jp-slackin.herokuapp.com)

### Swift
- [swift-developers-japan](https://medium.com/swift-column/discord-ios-20d586e373c0)  
↓から多くの人が↑に移住したので、現在は↑の方が活発です。
- [SwiftJP](https://swiftjp.herokuapp.com/)

## サーバーサイド
- [electron-jp](https://electron-jp-slackin.herokuapp.com/)
- [Node-RED](https://nodered.org/slack/)  
グローバルのSlackだが、日本語チャンネル(#japan)あり
- [Node-RED User Group Japan](https://nodered-slack.herokuapp.com/invite)
- [WordPress](http://wpdocs.osdn.jp/WordSlack%E3%81%B8%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95)

## フロントエンド
- [ng-japan](http://slack-invite.ngjapan.org/)
- [React Japan](https://react-japan-invite.herokuapp.com/)
- [Riot Japan](https://riot-jp-slackin.herokuapp.com/)
- [vuejs-jp](https://vuejs-jp-slackin.herokuapp.com/)
- [web3d-japan](https://web3d-japan-slack.herokuapp.com/)
- [WebRTC-JP](http://webrtc-jp-slackin.herokuapp.com/)

## モバイル
- [android-jp](https://android-jp.herokuapp.com/)
- [React Native Japan](https://slackin-guqupvlbzk.now.sh/)


## インフラ・DB
- [インフラ勉強会](https://wiki.infra-workshop.tech/lets-begin)
- [Kubernetes](http://slack.k8s.io/)  
グローバルのSlackだが、日本語チャンネルあり
- [JAWS-UG](https://make-jawsug.slack.com/)
- [GCPUG](http://gcpug.jp/)
- [MySQL Casual](https://mysql-casual-slackin.herokuapp.com/)
- [postgresql-jp](https://postgresql-hackers-jp.herokuapp.com/)

## デザイン
- [A11YJ](https://a11yj.herokuapp.com/)  
アクセシビリティに関する勉強会


## ツール・開発環境
- [vim-jp](http://vim-jp.org/docs/chat.html)
- [emacs-jp](https://slack-emacs-jp.herokuapp.com)
- [Unityユーザーグループ](https://unityuserj-slack-invite.herokuapp.com/)
- [日本Seleniumユーザーコミュニティ](https://seleniumjp.herokuapp.com/)
- [日本StackStormユーザー会](https://stackstorm.jp/)

## 開発手法
- [ddd-jp](https://ddd-jp-invitation.herokuapp.com/)
- [DDD Study Group](https://twitter.com/little_hand_s/status/982979772157313025)
- [hcd-jp](https://hcd-jp.herokuapp.com/)


## それ以外
- [Kaggler-ja](https://kaggler-ja.slack.com/)  
kaggleに挑戦する人のための勉強会
- [securitytesting](http://slackin.csrf.jp:3000/)  
セキュリティテストの技術共有を目的としたコミュニティ
- [MDR_QC](https://mdrft.com/)  
量子コンピューターの勉強会
- [aozorahack](https://aozoraslackin.herokuapp.com/)  
青空文庫に関する勉強会
- [ROS勉強会](https://rosjp.slack.com/shared_invite/MTY0MTc3NTgxNDczLTE0OTEzOTkxMDQtMjllZjRmMDliNg)  
ロボットのオペレーティングシステムの勉強会
国内のAWS関連の最新情報から

AWSジャパンは3月15日に、報道関係者向けにAWSのクラウドインフラストラクチャに関する説明会を行いました。2017年11月に米ラスベガスで開催された年次カンファレンス「AWS re:Invent 2017」で発表された内容を中心に、2017年第4四半期以降のインフラ関連アップデートの詳細を解説。2月13日に開設した「AWS大阪ローカルリージョン」に注目が集まったようです。また、最近、さまざまなイベントなどでもAWS導入の成果に関する事例発表が増えてきましたがその中から二例ほどオンラインメディアでの記事からピックアップして紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[AWSが主要サービスのSLA稼働率を引き上げた背景] (https://japan.zdnet.com/article/35116559/) 

ZDnet Japanの連載「松岡功の『今週の明言』」の記事です。
AWSのクラウドインフラを中心としたサービスの強化についてAWSジャパンが3月15日に行なった記者説明会をレポートしています。AWSの主要サービスである「Amazon EC2」において、顧客とのSLA（サービスレベル契約）として提示する可用性の稼働率を99.95％から99.99％に引き上げたことを説明したとのこと。

今回の会見では、AWSがここ数カ月で実施したサービスの強化について説明。具体的には、2月13日から利用可能になった「大阪ローカルリージョン」や、東京リージョンで新たに追加された4番目のアベイラビリティゾーン（AZ）、EC2基盤、およびネットワーク機能の強化など。

会見では大阪ローカルリージョンの位置付けや機能をめぐる質疑応答が活発に行われたようです。AWSのクラウドインフラは、グローバルで18カ所のリージョンと1つのローカルリージョンを展開していますが、その唯一のローカルリージョンが、2月に開設された大阪の新拠点。

AWSのサービスはここにきて、金融機関を含めて企業の基幹業務システムを移行するケースがますます増加。今回、大阪ローカルリージョンを設けたり、SLAの稼働率を引き上げたのも、そうした動きが背景にあるからのようです。


#[進化を続けるAWSクラウドインフラストラクチャを解説する] (https://cloud.watch.impress.co.jp/docs/special/1112502-3.html)

クラウドwatchのAWS説明会のレポート記事です。
日本の顧客数は10万を超えたとのことで、顧客がAWSクラウドを使い続けることで得られるメリットとして以下の3点を挙げたとのこと。
・インフラ管理からの解放による他社との差別化領域へのフォーカス
・ビジネスアジリティの向上によるイノベーションの加速
・AWSによる継続的なセキュリティ投資がもたらすセキュリティ強化

AWS初のローカルリージョン「大阪ローカルリージョン」への質問が集中したことをやはりとりあげています。大阪ローカルリージョンは、基本的に、すでに東京リージョンでサービスを契約しており、かつAWSによる審査を通ったユーザーのみが利用することができるとのこと。つまり、大阪ローカルリージョンの現在の位置づけは、あくまで東京リージョンを補完する存在。

東京～大阪間の距離は約500kmで、AWSのリージョン間でこれほど近い距離はほかに存在しない。またAWSのリージョンは耐障害性を高めるため、いずれのリージョンも複数のAZで構成されており、東京リージョンの場合は4つのAZで構成されているが、大阪ローカルリージョンは現在、シングルAZの構成を取っている。この点から見ても、大阪がほかの18のリージョンとは異なる位置づけであることがわかる。

なぜ大阪ローカルリージョンはどういったニーズのもとで開設されたのか。「金融、通信、そして医療など、コンプライアンス順守の観点から海外のリージョンにデータを移しにくい、または移すことができない顧客からの強いニーズに応えた」とのこと。日本の機密文書の定義（極秘/秘/社外秘の3区分）が世界的に見ても極めて特殊であることから、データを国外リージョンに移しにくい企業が多く、そうした規制に悩む企業を大阪ローカルリージョンでサポートすることが主な目的のようです。


#[AWSを5年活用しつづけて見えてきた、クラウドの“真の”実力] (http://tech.nikkeibp.co.jp/it/atclact/active/17/022500241/022600004/)

日経XTECHの「ITインフラSummit 2018 レビュー」の中の、ミサワホームの宮本氏の特別講演のレポート記事です。
同社がグループ全体のIT基盤としてAmazon Web Services（以下、AWS）を導入するに至った経緯、そして5年にわたる活用で見えてきたメリットと課題を解説してくれたようです。

AWSを約5年間使ってきたことで、TCOは30％は削減できたとのこと。ただし、同社にとってのクラウドの”本当の”価値は、「ビジネス部門のスピードについていけること」「施策の試行錯誤につきあえること」「スモールスタートの数をこなせること」であると強調していたようです。

一方で、AWSの課題として「つねに新しいサービスが登場するため、料金体系が複雑化・多様化していること」「”落ちる”ことを前提としたに運用設計が必要なこと」「OSを常に最新バージョンに保つ必要があること」などを挙げ、対応策として、有料サポートの利用と、AWSの導入実績があるシステムインテグレータとの協業が不可欠であるとのことです。


#[マルチテナンシーの難しい課題をAWSで解決したSmart HR] (http://ascii.jp/elem/000/001/641/1641421/
)

JAWSG-UG on ASCII.jpに掲載された
2018年1月25日、さまざまな業界に広がるAWSの活用事例を語りあうX-Tech JAWSの
第2回目となる勉強会「9割のX-Techと1割の優しさで切り拓く未来」のレポート記事です。

「急成長するマルチテナントSaaSの技術戦略を支えるAWS」というタイトルで登壇したSmartHR（スマートエイチアール）のぷりんたいさんの講演では、SmartHRで提供しているような1つのシステムで複数のテナントをホストする形態「マルチテナンシー」における難しさとその難しい課題をAWSでどのように解決したかを説明してくれています。

AWSの幅広いサービス提供、サードパーティを提供するプロバイダーも最初にAWSを選択すること、などがAWSが便利で役に立つ側面とのことです。
Python インタラクティブシェルでのpythonの実行 

Python初心者です。全く右も左もわからなく、pythonで記述したファイル（=pythonファイル）の実行で困ったことを記録します。
**1.結論**
 　①pythonファイルの実行は、コマンドプロンプトで実行する。 
　②インタラクティブシェルでは実行できない。
**2.pythonファイルの実行**
 pythonファイルの実行例
　1)　pythonファイルの例
　エディターなどで記述し、ファイルの拡張子を".py"で保存する。

```python:test1.py
  print ("Hello World")
```

　2) pythonファイルの実行
　コマンドプロンプトを開き、実行したいpythonファイル（test1.py）が存在するディレクトリーまで移動し実行する。
  
```
c:\python>python test1.py
Hello World
```

 3) Python インタラクティブシェルでの実行とその結果
  ①Python インタラクティブシェルの実行
  
```
c:\python>python
>>>
```

 ②Python インタラクティブシェルでの実行結果
実行したいpythonファイル（test1.py）が存在するディレクトリーまで移動し実行する。
　ディレクトリーの移動方法について；
　[Pythonでディレクトリを確認し移動する](https://qiita.com/Oz-Spade/items/7fa479fae7a0ea6fcddf)　    

```
>>>python test1.py
SyntaxError: invalid syntax
```
【Flutter】開発中のSlow Modeバナーを非表示にする

Flutterアプリで開発中にアプリの右上に表示されている"Slow Mode"バナーを非表示にする方法です。

これ
<img width="545" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/123122/1d7f8443-73dd-d096-fb08-22617606c914.png">


## 結論
`MaterialApp` の中で `debugShowCheckedModeBanner` を `false` にする。

## 環境
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0

## サンプルコード

```dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      debugShowCheckedModeBanner: false, // <---- HERE
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}
```

## リンク
How to remove slow mode banner in flutter on android emulator? - Stack Overflow
https://stackoverflow.com/questions/48893935/how-to-remove-slow-mode-banner-in-flutter-on-android-emulator