OmniAICreator/Qiita-1.07M huggingface dataset:
CORSエラー対策

##概要
ローカルだけで手っ取り早くcanvas系のjsを練習したかっただけなのにcross-orignエラーが出たのでついでに調べた

エラー例

```
Access to Image at 'file:///Users/~~~.png' from origin 'null' has been blocked by CORS policy: Invalid response. Origin 'null' is therefore not allowed access.
```

##CORSについて
外部からの静的ファイルなどを読み込む制限、Chromeだとローカルからでもcanvasからファイルの読み込みができなくなってた

概要はこちらに詳しくまとめられてました
[HTML5 における CORS について](http://qiita.com/nanocloudx/items/f49600b705be9d53a9b5)

##ローカル環境（html+js）内でできる対応策のみ調べた

###jsを使う場合

例

```
  var url = '使いたい外部URL';
  var img = new Image();
  img.crossOrigin = 'anonymous';
  img.src = url;
  img.onload = function() {
    imgを引数にしてイメージの読み込み
  };
```
[参考:MDN](https://developer.mozilla.org/ja/docs/Web/HTML/CORS_enabled_image)


※pixijsのfromImageにはcrossorignオプションがあった
[pixijs公式github](https://github.com/pixijs/pixi.js/blob/dev/src/core/textures/BaseTexture.js#L672-L689)
使い方例

```
  texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin));
  PIXI.TextureCache[imageUrl] = texture;
```


###ブラウザ

コードを書く時に気を使わなくていい
1.chrome mac
chromeを全て閉じて、ターミナルから

```
open /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir
```

2.chrome Win
chromeの起動オプションに下記を追加

```
--disable-web-security --user-data-dir
```

毎回ターミナル叩くのが面倒な場合
[【小ネタ】Chromeのローカルセキュリティポリシーの回避](http://dev.classmethod.jp/etc/chrome-localfile-security/)


3.safari
safariを立ち上げて
[開発]　-> [クロスオリジンの制限を無効にする]


###やっぱりサーバー立てる

syncさせれるし結局これに落ち着いた。
Browsersync入れてみたら便利だった
[Bash] シェルスクリプトで Nginx に設定されているサーバ証明書の情報を取得する 

こんなかんじ

```bash:chk-certificates.sh
#!/bin/bash
LF=$(printf '\\\012_')
LF=${LF%_}
TAB=$'\t'

_ssl_keys=$(find /etc/nginx/conf.d/ -type f -name '*.conf' | xargs grep ssl_certificate | grep -v ssl_certificate_key | sed 's/[#:;]//g' | sort | uniq | awk '{print $1,$3}')
IFS=$LF
for _ssl_key in ${_ssl_keys}; do
  _conf_file=$(echo ${_ssl_key} | awk '{print $1}')
  _cert_key=$(echo ${_ssl_key} | awk '{print $2}')
  if [ -f ${_cert_key} ]; then
    echo "Conf : ${TAB}${_conf_file}"
    echo "Key : ${TAB}${_cert_key}"
    cat ${_cert_key} | openssl x509 -text | grep 'Subject:' | sed "s/^[${TAB} ][${TAB} ]*//g" | awk -F: '{print $1" : ",$2}'
    cat ${_cert_key} | openssl x509 -text | grep 'DNS' | sed 's/,/'"$LF"'/g' | sed "s/^[${TAB} ][${TAB} ]*//g" | awk -F: '{print $1" : ",$2}'
    cat ${_cert_key} | openssl x509 -text | grep 'Not \(Before\|After\)' | sed 's/Not \(Before\|After \):/\1,/g' | sed "s/^[${TAB} ][${TAB} ]*//g" | awk -F, '{print $1" : ",$2}'
    echo
  fi
done
```

実行結果

```text
# bin/chk-certificates.sh 
Conf : 	/etc/nginx/conf.d/dogmap.jp-ssl.conf
Key : 	/etc/letsencrypt/live/dogmap.jp/fullchain.pem
Subject :   CN=dogmap.jp
DNS :  dogmap.jp
DNS :  www.dogmap.jp
Before :   Jun 11 15:00:00 2017 GMT
After  :   Sep  9 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/dogmap.jp-ssl.conf
Key : 	/etc/letsencrypt/live/www.dogmap.jp/fullchain.pem
Subject :   CN=www.dogmap.jp
DNS :  www.dogmap.jp
Before :   May  7 15:00:00 2017 GMT
After  :   Aug  5 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/lab.dogmap.jp-ssl.conf
Key : 	/etc/letsencrypt/live/lab.dogmap.jp/fullchain.pem
Subject :   CN=lab.dogmap.jp
DNS :  lab.dogmap.jp
Before :   May 21 15:00:00 2017 GMT
After  :   Aug 19 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/lets.ninja-ssl.conf
Key : 	/etc/letsencrypt/live/lets.ninja/fullchain.pem
Subject :   CN=lets.ninja
DNS :  lets.ninja
Before :   May 14 15:00:00 2017 GMT
After  :   Aug 12 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/lets.ninja-ssl.conf
Key : 	/etc/letsencrypt/live/www.lets.ninja/fullchain.pem
Subject :   CN=www.lets.ninja
DNS :  www.lets.ninja
Before :   May  7 15:00:00 2017 GMT
After  :   Aug  5 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/shot.dogmap.jp-ssl.conf
Key : 	/etc/letsencrypt/live/shot.dogmap.jp/fullchain.pem
Subject :   CN=shot.dogmap.jp
DNS :  shot.dogmap.jp
Before :   May 21 15:00:00 2017 GMT
After  :   Aug 19 15:00:00 2017 GMT

Conf : 	/etc/nginx/conf.d/test.dogmap.jp-ssl.conf
Key : 	/etc/letsencrypt/live/test.dogmap.jp/fullchain.pem
Subject :   CN=test.dogmap.jp
DNS :  test.dogmap.jp
Before :   May 21 15:00:00 2017 GMT
After  :   Aug 19 15:00:00 2017 GMT
```

AWS なら [EC2 Run Command](https://aws.amazon.com/jp/ec2/run-command/) で定期的に動かして、どっかに情報保存しておけば有効期限管理も楽になりますね。
pip install --upgrade pipしたらNo such file or directoryになる


こんにちはsekitakaです。

`pip`自体をアップグレードしたら`pip`の実行ができなくなってしまいました。
出力されたエラーは次の通りです。

```bash
bash-4.2# pip
bash: /usr/bin/pip: No such file or directory
```

確かに`/usr/bin/pip`はなくなっていました。
`which`しても見つからず。

ちなみに`pip`は`6.1.1`から`9.0.1`に上げました。

# 解決方法
```bash
hash -r
```

なんかキャッシュ的なものを消すコマンドを実行すると、無事`pip`が使えるようになりました。
`hash`コマンドについては今は時間がないので深く調べてません。

このハマり2回めなので忘れないようにメモ。
Quantopianチュートリアル LESSON 10

[前回](http://qiita.com/driller/items/9364610e87370bc98075) の続きです。

# LESSON 10 Managing Orders
Quantopianのスリッページモデルを使用していると、出した注文が必ずしもすべて約定するとは限りません。未約定の注文は約定またはキャンセルされるまで残るため、このような状態を考慮する必要があります。

`order_target_percent()` は未約定の注文を考慮しません。当日の引けで注文はキャンセルされますが、1日の間に未約定の注文が残ったまま追加の注文を出すと、元の資金をオーバして取引してしまいます(オーバオーダ)。

オーバオーダを回避するためには `get_open_orders()` 関数を用いて未約定の注文を確認します。引数に銘柄のインスタンスを渡すことで、対象銘柄の未約定注文を辞書型で返します。

下記の例では未約定の注文が存在しない状態で、且つ取引可能である場合にXTLをロングしています。コードは [こちら](https://www.quantopian.com/tutorials/getting-started#lesson10) からcloneできます。

```python
def initialize(context):
    # Relatively illiquid stock.
    context.xtl = sid(40768)

def handle_data(context, data):
    # Get all open orders.
    open_orders = get_open_orders()

    if context.xtl not in open_orders and data.can_trade(context.xtl):
        order_target_percent(context.xtl, 1.0)
```

# LESSON 11 Putting It All Together


[LESSON 9](http://qiita.com/driller/items/9364610e87370bc98075) <--> [LESSON 11](http://qiita.com/driller/items/dbf9d41fb13d6e5388cf#_reference-860518b3c671e8d98461)
Docker | Mac | mysql コマンドで外部=ホストからアクセスする ( mysql 公式イメージを利用 )

# コンテナを走らせる

この例ではホストの3308番ポートと、コンテナの3306番ポートをつなぐ

```
$ docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d -p 3308:3306 mysql
```

# コンテナの接続先IPアドレスを確認する

(dockerの環境による)

# mysql コマンドを叩く

IPアドレス、ポートを指定する。

```
$ mysql -u root -h 127.0.0.1 -P 3308
```

## エラーが出る場合

( すぐコマンドを叩くと `Can't connect to MySQL server on '192.168.99.100' (61)` って言われたりするので、コンテナ内部でmysqlが起動するのをしばらく待つ )
# 環境

- Docker version 17.06.0-ce, build 02c1d87
- Mac OS Sierra 10.12.4


# 参考

- [Connecting to a mysql running on a Docker container · Issue #95 · docker-library/mysql](https://github.com/docker-library/mysql/issues/95)
- [Cannot connect to MySQL docker container from container with Django app - Stack Overflow](https://stackoverflow.com/questions/40825617/cannot-connect-to-mysql-docker-container-from-container-with-django-app)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【mac】NeoBundleの導入手順

# 環境
macOS Sieera 10.12.5
# 手順
```
 $ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh

 $ sh ./install.sh
```
上記二行目のスクリプトを実行すると、以下のようにvimrc(init.vim)に記述する内容を教えてくれる。


```
"NeoBundle Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/Users/hogehoge/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('/Users/hogehoge/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"End NeoBundle Scripts-------------------------
```

vimrc(init.vim)を開き、ファイル上部にペーストすれば設定完了。

```
$ vim ~/.vimrc
```
SaaSForceでビューを作り

SaaSForceでビューを作るには、SQL文が書けないとできません。

そのため、今回は掛ける人からファイルをもらって、それを貼り付けることで成功させました。

私はプログラミングができないだけではなく、いろいろなPC技術上のハンデを抱えているので、できないことはお願いすることにしています。

なお、コツといいますか、SaaSForceは常に最新バージョンに進化しているので、情報が2ヶ月古いと過去の情報が役に立たなくなる可能性があるので、最新のバージョンであるかどうかを常に確認してください。

先月まではバージョン6が最新でしたが、現在2017年7月の時点ではバージョン61が最新となっています。

![wfc20161109000.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/dbd28021-18fc-fc37-94a2-5ad9b1ad34d7.jpeg)

まず、サンプルのファイルを手に入れて、一括して取込、ビューを作る基となるアプリを入れてしまいます。

何もないところから作ると大変ですので。

![wfc20161109001.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/599c3e71-3fb0-71e4-f7a9-55164700977c.jpeg)

そして、送ってもらったファイルを「システム設計書を取込」と言う機能を使って「システム設計書一括取込.xlsx」と「「画面設計インポート.xlsx」の二つを1つずつ取り込んでいきます。

![wfc20161109002.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/0886bea9-5e8d-0783-a250-6937aa051977.jpeg)

無事に入ると、このような表示が出ます。

でないともう一度やったほうがいいでしょう。

なお、何度やってもうまくいかない場合、ワンダフルフライ㈱に連絡して最新のバージョンなのか、それと、最新のファイルなのか確認してください。

![wfc20161109003.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/64d31722-1143-6a2e-0e3a-559583cd1a11.jpeg)

次にテーブルからビュー定義･作成を開きます。

既にビューがいくつかありますが、検索条件をクリックしてビュー検索の画面をおろし、『新規』をクリックします。

送ってもらったファイルの「帳票作成ビュー.txt」の帳票作成ビューを説明に貼り付け、SQL文を下の空欄に貼り付けます。

最後にビュー作成して登録をクリックすると、作業は終了です。
Linux — シェルの変数を四則演算で計算する (足し算・引き算・掛け算・割り算)

`$((変数+変数))` みたいな記法を使う。

# 足し算

```bash
$ a=1; b=3; c=5; echo $((a+b+c));
9
```

# 引き算

```bash
$ a=1; b=3; c=5; echo $((a-b-c));
-7
```

# 掛け算

```bash
$ a=1; b=3; c=5; echo $((a*b*c));
15
```

# 割り算

小数点は出ないっぽい。

```bash
$ a=1; b=3; c=5; echo $((c/b));
1
```

# 環境

- GNU bash, version 4.4.0(1)-release (x86_64-apple-darwin15.6.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LinuxでRAWイメージにGRUB2をインストールする

# はじめに
RAWイメージの作成は各所でTipsが紹介されているが、GRUB（ブートローダ）をインストールしたりなどの手順は余り紹介されていないので、ここに記す。
具体的にどのような時に使うかというと、私の場合はOSを自作したりする時に使う。

# この記事で行うこと
1. RAWイメージの作成とパーティション分割、フォーマット
2. RAWイメージへのGRUB2のインストール

# 対象環境
* CentOS 6.8

# RAWイメージの作成
RAWイメージの作成はLinuxでは一般的である。
`dd` コマンドを用いてRAWイメージを作成する

```shell-session-session:RAWイメージの作成
$ dd if=/dev/zero of=出力ファイル名 count=1 bs=所望のサイズ
```

# パーティションの作成とフォーマット
パーティションを分割するためには、まずはRAWイメージをループバックデバイスとして接続しなければならない。これはISOイメージをマウントする時に、`mount`コマンドで`-o loop`として指定する時に行っていることと同じである。

```shell-session:ループバックデバイスへの接続
$ losetup --find --show RAWイメージファイル
/dev/loop0
```

上記コマンドを実行すると、`/dev/loop[0-7]` デバイスにRAWイメージが接続された状態となる。なにもループバックデバイスに接続されていない状態では`/dev/loop0`に接続されるだろう。

以降は通常のブロックデバイス同様、`mkfs`コマンド、及び`fdisk`コマンド等を用いてパーティションの分割と、パーティションのフォーマットを行うことができる。

```shell-session:パーティションの作成
# parted /dev/loop0
GNU Parted 2.1
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/loop0 will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes                                                               
(parted) mkpart primary ext4 1 512M
(parted) mkpart primary ext4 514M 1024M
(parted) set 1 boot on
(parted) print                                                            
Model:  (file)
Disk /dev/loop0: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size   File system  Name     Flags
 1      1049kB  512MB   511MB               primary  boot
 2      514MB   1024MB  511MB               
```

ここでは例として2つのパーティションを作成したものとする。

作成したパーティションはそのままではOSに認識されていないため、パーティション作成後に改めて登録する必要がある。このとき`kpartx`コマンドを使用する。

```shell-session:パーティションの再認識
$ kpartx -a /dev/loop0
```

上記コマンドを実行すると、作成した2つのパーティションが`/dev/mapper`以下にloopXpYのような名前となって現れる。

```shell-session:作成したパーティションの表示
$ ls /dev/mapper/loop0*
/dev/mapper/loop0p1  /dev/mapper/loop0
```

この例では/dev/loop0に作成した2つのパーティションは`/dev/mapper/loop0p1`、`/dev/mapper/loop0p2`となった。パーティションをフォーマットする場合は、これらのデバイスに対して`mkfs`コマンドを実行すれば良い。

```shell-session:パーティションのフォーマット
$ mkfs -t ext4 /dev/mapper/loop0p1
$ mkfs -t ext4 /dev/mapper/loop0p2
```

# GRUB2のインストール
ここでは前章までで作成したパーティション`/dev/loop0p1`をブートパーティションとして、GRUB2をインストールする。

まずはパーティションをマウントし、GRUB2用のディレクトリを作成する。

```shell-session:ブートディレクトリの作成 
$ mount /dev/loop0p2 /mnt
$ mkdir /mnt/boot
$ mount /dev/loop0p1 /mnt/boot
```

その後、`grub-install`コマンドを使用してGRUB2をインストールする。
このときブートディレクトリは`/boot`となるはずなので、オプション`--boot-directory`で指定をする。

```shell-session:GRUB2のインストール
$ grub-install --boot-directory=/boot /dev/loop0
Installation finished. No error reported.
```

# 後片付け
まず、パーティションをアンマウントする

```shell-session:パーティションをアンマウント
$ umonut /mnt/boot
$ umount /mnt
```

RAWイメージのパーティションを認識させないようにして、ループバックデバイスから取り外しを行う。

```shell-session:ループバックデバイスからの取り外し
$ kpartx -d /dev/loop0
$ losetup -d /dev/loop0
```
staticファクトリーメソッドその1

新卒Androidエンジニアです。
EffectiveJavaを最近読んでいて**staticファクトリーメソッド**と言うキーワードを知りました。

#staticファクトリーメソッド
EffectiveJava曰く、

```
クラスのインスタンスを返す単なるstaticメソッド
```
とのことです。

例えば、Booleanクラスのコードの例を見てみると、

```java
public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}
```

このメソッドはbooleanという基本データ値をBooleanオブジェクト参照へと変換しています。

通常、クラスのインスタンスをクライアントが得るためにはpublicなコンストラクタを通じる必要がありますが、staticファクトリーメソッドを用いれば、staticなメソッドを通じてインスタンスを得ることができます。

ちなみに、名前が似ていますがデザインパターンの一種であるファクトリーメソッドとは異なるので、混同しないように注意が必要です。

#シングルトンに置けるstaticファクトリーメソッド
デザインパターンの話が出てきたのでついでに書いておくと、シングルトンパターンという

```
そのクラスのインスタンスが一つしか生成されないことを保証する
```

デザインパターンがあります。

これを実現するコードとして、Javaの場合よく以下のような書き方が見られるかと思います。

```java
public class Singleton {

    private static Singleton singleton = new Singleton();
    
    private Singleton() {
    }
   
    public static Singleton getInstance() {
        return singleton;
    }
}
```

この場合、getInstance（）がstaticファクトリーメソッドになっています。
staticファクトリーメソッドのことを知らなかったとしても、シングルトンパターンを知っている人は多いかと思うので、この例でイメージはつくのではないかと思います。

#メソッドの一般的な名前
各人がそれぞれ好き放題にメソッド名を決めてしまっては他のstaticメソッドと見分けがつかなくなってしまうため、命名規約もあります。
一般的には以下のメソッド名があります。

| メソッド名 | 役割 |
|:-----------|:------------|
| valueOf       | パラメータと同じ値を持つインスタンスを返す。型変換。        |
| of     | valueOfのvalueを抜いたメソッド名      |
| getInstance       | パラメータで指定されたインスタンスを返すが、同じ値を持つとは言えない。シングルトンの場合は引数を取らず、唯一のインスタンスを返す。        |
| newInstance         | getInstanceと似ているが、返されるインスタンスが全て別々のものである点が異なる。          |
| getType       | getInstanceと似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある点が異なる。       |
| newType    | newInstanceと似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある点が異なる。     |

使用しているクラスでこれらのstaticメソッドがあったら、staticファクトリーメソッドなんだなと気がつくことができます。

標準クラス（先ほどのBooleanなど）でも、これらのメソッドを見ることができます。

#メリット
では、staticファクトリーメソッドを使うと何が嬉しいのか
それについては長くなってしまうのでその2にまとめたいと思います。
今回はここまで

#参考
ジョシュア・ブロック 著 柴田 芳樹 訳 Effective Java 第二版
redux-formのinput type="radio" buttonではまったこと

何度も忘れるので自分用メモ
redux-formでtype="radio"のvalueの値は数値では動かない。redux-formのバグ?

```:SampleData
const items = [
  {
    name: "neko",
    value: 123
  },
  {
    name: "mike",
    value: 456
  }
]
```

```:NG-Code
items.map((item, i) =>
  <label key={i}><Field name="select" component="input" type="radio" value={item.value} />{item.name}</label>
)
```

```:OK-Code
items.map((item, i) =>
  <label key={i}><Field name="select" component="input" type="radio" value={`${item.value}`} />{item.name}</label>
)
```
vagrant up 突然のエラー！

いつものように vagrant up をしましたら
急にアップデートが走りましてマウントできなくなりました！

環境
VirtualBox
Vagrant
CentOS 7.2

>Vagrant was unable to mount VirtualBox shared folders. This is usually
>because the filesystem "vboxsf" is not available. This filesystem is
>made available via the VirtualBox Guest Additions and kernel module.
>Please verify that these guest additions are properly installed in the
>guest. This is not a bug in Vagrant and is usually caused by a faulty
>Vagrant box. For context, the command attempted was:
>
>id -u apache
>
>The error output from the command was:
>
>id: apache: no such user


Google先生に助けを求めたところ.......
はい。みなさん一度は通るようですねｗｗｗ

私の場合、いろいろ確認したところ
なぜかhttpdさんがお亡くなりになっていました

なぜお亡くなりになられたのかまでは調べ方がわからず不明なのです
↑知ってる方いたら教えてください(＞＜;;;

で、上の意味はapacheなんてユーザいないぜって言ってるですが
Vagrantfileのマウントの設定でapacheを指定しているためにおこっているみたいです

>  # config.vm.synced_folder {host_path}, {guest_path}, option...
>  config.vm.synced_folder "./www/", "/home/{username}/www",
>    :owner => "apache",
>    :group => "apache",
>    :mount_options => ["dmode=775,fmode=775"]

ひとまず、オーナーとユーザをコメントアウトして再起動すると
正常に起動しました。

参考になったサイト
http://yukithm.blogspot.jp/2015/07/vagrant-apache.html

再度httpdをインストールしなおして
>sudo yum -y install httpd

apacheが存在しているか確認
>/etc/passwd

httpdの自動起動設定
>systemctl start httpd
>systemctl enable httpd

あれ？ほぼ作り直しじゃない？ｗｗｗ
と思いつつ

念のためPHPの設定やらMYSQLの設定やら全部チェックしなおし。

一応 vagrant reload してエラーなく起動を確認した後に
Vagrantfileのマウントのオーナーとユーザを戻して再起動。
で無事、元通りになりました（；∀；｀)ぶわぁっ

ネットで同じ状況になった記事を書いてくださった方々に感謝です
http://berukann.hatenablog.jp/entry/2016/01/24/163124
http://qiita.com/ooba1192/items/96b7ab25d2bda1676aaa
http://nori3tsu.hatenablog.com/entry/2014/03/22/123313
他多数
私が本当に使っているVimのコマンド一覧

# はじめに

- 私はVim派です。
- Linuxサーバは、ほぼCentOSを使ってます。
- ログ調査とかシェル書いたりとかに使ってます。
- ランキング形式にしたいとおもいます。
- 私は以下くらいのコマンドしか使えません。というか使いません。

# ランキング

## 第一位

### 困ったらescキー押しとけってことだ。

```text
esc
```

## 第二位

### 困ったらescキー押して、q!でそっとファイルを閉じるんだ。

```text
:q!
```

## 第三位

### ここぞというときに保存するんだ。癖で閉じちゃうけど「w」のほうがオススメ。

```text
:w or :wq
```

## 以下同列

### とりあえず何か書いてみよう。

```text
i
```

### 削除、削除、削除

```text
dd
```

### ぜーんぶ消しちゃえ

```text
:%d
```

### 全部ペーストしたい

```text
a
```

の後に

```text
Command（Ctrl） + v
```

### 一つ前の状態に戻したい

```text
u
```

### 先頭行に飛びたい

```text
gg
```

### 最終行に飛びたい

```text
G
```

### 行番号に飛びたい

```text
:(行番号)
```

### 行番号を表示したい

```text
:set number
```

# シリーズページリンク
- [私が本当に使っているAtomのパッケージ一覧](http://qiita.com/neriai/items/b43c2efbc06370fe193c)
- [私が本当に使っているVimのコマンド一覧](http://qiita.com/neriai/items/d05e65698f7cbe7efe3c)
- [私が本当に使っているLinuxのコマンド一覧 - 常用編](http://qiita.com/neriai/items/622053317ec4a4cd197a)
- [私が本当に使っているLinuxのコマンド一覧 - Extra編](http://qiita.com/neriai/items/5322dd0fe34bbccbefdb)
Docker Machine の VM構成変更

[Docker Machine](https://docs.docker.com/machine/) のdefault VMのメモリは1GBとなっていますが、さすがに少なすぎるので、docker-machineコマンドで8GBメモリ/2 coreに変更にしてみます。なお、ハイパーバイザは諸般の事情によりVMware
 Workstation Pro ですので、ドライバは vmwareworkstation です。

>docker-machine create -d vmwareworkstation --vmwareworkstation-memory-size 8192 --vmwareworkstation-cpu-count 2 8gb

docker-machine ls で確認。
>$ docker-machine ls
>NAME      ACTIVE   DRIVER              STATE     URL                         >SWARM   DOCKER        ERRORS
>8gb       -        vmwareworkstation   Running   tcp://192.168.146.11:2376           v17.06.0-ce
>default   -        vmwareworkstation   Stopped                                       Unknown

新しい VM を使うための環境変数確認。

>$ docker-machine env 8gb
>export DOCKER_TLS_VERIFY="1"
>export DOCKER_HOST="tcp://192.168.146.11:2376"
>export DOCKER_CERT_PATH="C:\\Users\\foo\\.docker\\machine\\machines\8gb"
>export DOCKER_MACHINE_NAME="8gb"
>export COMPOSE_CONVERT_WINDOWS_PATHS="true"

環境変数設定。

>$  eval  $("C:\Program Files\Docker Toolbox\docker-machine.exe" env 8gb)
>
>$ docker-machine ls
>NAME      ACTIVE   DRIVER              STATE     URL                         >SWARM   DOCKER        ERRORS
>8gb       *        vmwareworkstation   Running   tcp://192.168.146.11:2376           v17.06.0-ce
>default   -        vmwareworkstation   Running   tcp://192.168.146.10:2376           v17.06.0-ce
subversion->gitlabへのリポジトリの移行

#注意事項
- 実験の記録なので細かいことは無視してください
- subversionのtrunkの使い方が独自
- gitlabって書いてるけどたぶんgitでもOK
- たぶんsubvsersionの環境は関係ない

#対象読者
**- とにかくsvbversion->gitlabにしたい**

#前提条件
- gitlabがどこかのLinuxサーバにインストールされてる。
- ローカルのwindowsにgitが入っている。

#再現環境
-サーバー
 OS:rhel6
 GitLab:Community Edition 9.3.0
 git:2.11
 subversion:1.6.11

-ローカル
 OS:windows7
 git:2.10

#subversionの状態
 trunkの下に各プロジェクトのソースを置いてしまった
 -trunk
 ├ projectA
 ├ projectB <- 対象はこれ
 ├ projectC
 
-----

1.Subversionのサーバにログインしてauthorのリストを作成する。

```Linux:command
svn log http://(reposryサーバのURL)/trunk/projectB --xml | grep -P "^<author" | sort -u | \perl -pe 's/<author>(.*?)<\/author>/$1 = $1 <$1\@XXXXXX.co.jp> /' > （リストの掃出し先）
```

とやると

```list:list
fujico = fujico <fujico@XXXXXX.co.jp> 
fujigo = fujigo <fujigo@XXXXXX.co.jp> 
```

というような工程6で使うgitlabに移植されるユーザの改訂履歴のマッピングデータができる。

2.GitlabにAuthorのリストに対応したユーザを作る

（1と2の作業いらない？未検証）

3.Gitlabでリポジトリを作る
　readme.md以外は空のリポジトリを作る
　移行先の名称は任意です。このタイミングで変えたい場合はかえる。
 （今回サンプルで使うリポジトリの例）
  http://(gitサーバのURL）:8080/xxxx/projectB.git 


4.ローカルのPCにgitの作業用ディレクトリを作成
　（例）c:\src_dir\test

5.DOCプロンプト作業ディレクトリに移動

```msdos:msdosコマンド
 cd c:\src_dir\test
```

6.次のコマンドを実行する
　次のコマンドを実行するとsubversionの形式からgitの形式に移行されたローカルリポジトリがc:\src_dir\testにできます。
　サーバにpushまでされません。
```msdos:msdosコマンド
git svn clone -A c:\（保存先）\工程1で作ったリスト --trunk=http://(reposryサーバのURL)/trunk/projectB http://(gitサーバのURL）:8080/xxxx/projectB.git 
```
　この後、移行スクリプトが流れます。

7.ローカルリポジトリのprojectB.gitを確認
　完了したc:\src_dir\testにprojectB.gitができていることを確認

8.リモートリポジトリの内容をマージ
　出来上がったローカルリポジトリをリモートにpushする前に
　工程3でsubversionになかったreadmeファイルの差分ができています。
　なのでマージする必要があります。単純にマージするとエラーを吐きます。
```msdos:msdosコマンド
cd c:\src_dir\test\projectB.git
```

```msdos:msdosコマンド
> git merge
（エラーメッセージ）
fatal: refusing to merge unrelated histories
```
　
9.なので無視するコマンドを実行する。

```msdos:msdosコマンド
> git merge --allow-unrelated-histories origin/master
```

10.移行内容をローカル->リモート
　移行内容をgitに内容をpushして完了
【初心者向け】RESTをざっくり理解

# RESTとは
  webの複合アーキテクチャスタイルの一つ。REST以外にもP２Pなどがある。

## アーキテクチャスタイルとは
  アーキテクチャ設計の指針。アーキテクチャを決定する際の羅針盤

## 複合アーキテクチャスタイルとは
　複数のアーキテクチャスタイルを組み合わせたもの。RESTでは具体的に以下のスタイルを組み合わせている。

1, クライアント/サーバ ・・・ UIとサーバを分離する

2, ステートレスサーバ ・・・ クライアントのアプリケーション状態をサーバで持たない
  →アプリケーション状態とはセッション状態とほぼ同意義。セッションをクライアントが持ってる状態のことをステートレスと言う

3, キャッシュ ・・・ 一度受け取ったリソースをクライアントで使い回す

4, 統一インターフェース ・・・ インターフェイスを固定する。
例)http1.1ではメソッドを8つだけに固定して、サーバ <-> クライアント間で通信する。

5, システムを階層に分離する

6, コードオンデマンド ・・・ プログラムをサーバからクライアントにダウンロードして実行する
　　例)js,flash
【Ruby】配列イテレータ内の変数を外から参照したい

# 結論
for文はスコープを作らないので、ループ変数を外から参照できます。

```rb:for
for i in ['a', 'b'] do
  s = i
end
puts s
```

```rb:出力
'b'
```

# Rubyのスコープについて
配列でイテレータを回したい場合以下の二つが考えられると思います。

- Array#each
- 繰り返し構文のfor

## forとeachの違い

- eachはブロックを作る
- forはブロックを作らない

ブロックはスコープを作るので、eachはスコープを作ります。
Rubyの繰り返し構文はスコープを作らないので、forはスコープを作りません。
私が本当に使っているAtomのパッケージ一覧

# はじめに

- 私はAtom派です。
- 今現在入れてるパッケージ一覧です。
- 以前はSublime Textでした。
- その前はEclipseでした。
- 面倒くさいとviやmiやサクラエディタで書きます。
- この中で一番好きなパッケージはregex-railroad-diagramです。理由はなんか図の見た目がかっこいいからです。
- 二週間くらいパソコンから離れた生活をしてきます。（投稿を一時止めます）

# [Atom](https://atom.io/)とは

- GitHub製のエディタです。
- 良いところはSublime Text調なところ。
- 気になるところはたまにフリーズしたり、エラーがでるところ。
- ショートカットとか使いこなしていないです。

# パッケージ

## 全般
### [show-ideographic-space](https://atom.io/packages/show-ideographic-space)
全角スペースを可視化してくれます。

### [regex-railroad-diagram](https://atom.io/packages/regex-railroad-diagram)
正規表現を図式にしてくれます。

### [project-manager](https://atom.io/packages/project-manager)
パッケージ毎にプロジェクト管理をしてくれます。

### [minimap](https://atom.io/packages/minimap)
ファイルのの全体像をマップ調にプレビュー表示をしてくれます。

### [japanese-menu](https://atom.io/packages/japanese-menu)
Atomのメニューを日本語化してくれます。

### [highlight-selected](https://atom.io/packages/highlight-selected)
ファイル上ぜ選択されている単語を強調表示してくれます。

### [file-icons](https://atom.io/packages/file-icons)
拡張子毎にファイルのアイコン表示をしてくれます。

### [autocomplete-paths](https://atom.io/packages/autocomplete-paths)
ファイルパスを自動補完してくれます。

## プログラム

### [tag](https://atom.io/packages/tag)
HTMLやXMLの閉じタグを入れてくれます。

### [docblockr](https://atom.io/packages/docblockr)
コメントブロックを挿入してくれます。

### [atom-beautify](https://atom.io/packages/atom-beautify)
様々な言語毎にソースコードを自動整形してくれます。

### [atom-autocomplete-php](https://atom.io/packages/atom-autocomplete-php)
PHPの自動補完をしてくれます。

### [autocomplete-ruby](https://atom.io/packages/autocomplete-ruby)
Rubyの自動補完をしてくれます。

### [autocomplete-python](https://atom.io/packages/autocomplete-python)
Pythonの自動補完をしてくれます。

### [linter](https://atom.io/packages/linter)
全般的な文法チェックをしてくれます。

### [linter-tidy](https://atom.io/packages/linter-tidy)
HTMLの文法チェックをしてくれます。

### [linter-csslint](https://atom.io/packages/linter-csslint)
CSSの文法チェックをしてくれます。

### [jsonlint](https://atom.io/packages/linter-jsonlint)
JSONの文法チェックをしてくれます。

### [linter-phpcs](https://atom.io/packages/linter-phpcs)
PHPのPSRに基づいた文法チェックをしてくれます。

### [php-cs-fixer](https://atom.io/packages/php-cs-fixer)
PHPのPSRに基づいた文法を整形してくれます。

### [linter-php](https://atom.io/packages/linter-php)
PHPの文法チェックをしてくれます。

### [linter-ruby](https://atom.io/packages/linter-ruby)
Rubyの文法チェックをしてくれます。

### [linter-python](https://atom.io/packages/linter-python)
Pythonの文法チェックをしてくれます。

## テーマ

### [monokai](https://atom.io/themes/monokai)
こんな感じ

<img width="685" alt="スクリーンショット 2017-07-07 10.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/90598/64b786d2-98fb-3186-3ef2-860cf705eee6.png">

## その他

### [git-plus](https://atom.io/packages/git-plus)
Gitコマンドを利用できます。

### [language-apache](https://atom.io/packages/language-apache)
Apacheの文法チェックをしてくれます。

# シリーズページリンク
- [私が本当に使っているAtomのパッケージ一覧](http://qiita.com/neriai/items/b43c2efbc06370fe193c)
- [私が本当に使っているVimのコマンド一覧](http://qiita.com/neriai/items/d05e65698f7cbe7efe3c)
- [私が本当に使っているLinuxのコマンド一覧 - 常用編](http://qiita.com/neriai/items/622053317ec4a4cd197a)
- [私が本当に使っているLinuxのコマンド一覧 - Extra編](http://qiita.com/neriai/items/5322dd0fe34bbccbefdb)
【Laravel 5.4】ファサード の作り方(でも多用は良くない)

ファサードはスタティックな関数的に使えるので便利といえば便利。
だけど、使い勝手が良い反面、弊害もあるみたい。（後述）

それでは作り方を・・・。
## クラス作成
場所はサービスプロバイダ側でひもづけできていれば、必ずしも app/Services である必要はなさそう。

```php:app/Services/Payment.php
<?php
namespace App\Services;

class Payment {
    public function process()
    {
        // ここに何やかの処理を記述する。
    }
}
```
## サービスプロバイダ作成
artisan コマンドでスカフォールド

```shell-session
php artisan make:provider PaymentServiceProvider
```
レジスタ部分にバインドを記述

```php:app/Providers/PaymentServiceProvide.php
<?php
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class PaymentServiceProvider extends ServiceProvider {
    public function boot()
    {
        //
    }
 
    public function register()
    {
        $this->app->bind(
            'payment',             // キーとクラスをバインド
            'App\Services\Payment'
        );
    }
}
```
## ファサードクラスを作成

```php:app/Facades/Payment.php
<?php
namespace App\Facades;
 
use Illuminate\Support\Facades\Facade;
 
class Payment extends Facade {
    protected static function getFacadeAccessor() {
        return 'payment';  // バインドキーを返す。
    }
}
```
## サービスプロバイダと別名の設定を追加する。

```php:config/app.php
<?php
return [
         :
    'providers' => [
         :
        App\Providers\PaymentServiceProvider::class,
    ],
    'aliases' => [
         :
        'Payment' => App\Facades\Payment::class,
    ],
```

## 使い方
これで以下の様に使えるようになる。
use はファサードを指定する。

```php:
use App\Facades\Payment;

   Payment::process();
```

# でも、なんかファサードは多用すると良くないらしい orz
便利に使える反面
なんでも盛り込もうとするとコードがスパゲティ化したりする。
かと言って、全くファサードを使わないっていうのも極論と思うし。
標準関数レベルの汎用ファサードを適材適所で使おうってことだね。

参考：[ファサード警察](https://scrapbox.io/fendo181/%E3%83%95%E3%82%A1%E3%82%B5%E3%83%BC%E3%83%89%E8%AD%A6%E5%AF%9F)

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
Handlerを使用したスレッド間通信を落書きしてみた

・AndroidOSは、スレッドごとに1つのMessageQueueを持っている。
・MessageQueueには1つのLooperがセットになっている。
・Looperがキューからメッセージを取り出して、取り出したメッセージの内容を実行していく。
・別スレッドのMessageQueueへメッセージを送るには、送信先スレッドに属したHandlerへpostすることで送ることができる。
・Handlerは、そのHandlerのインスタンスを作成したスレッドに属する。

![CIMG7597.JPG](https://qiita-image-store.s3.amazonaws.com/0/165589/77b0c521-438f-e5cc-b928-48999a6d6a55.jpeg)
クラウドサーバでTensorFlow　その2

#概要
クラウドサーバでTensorFlowやってみた。
csv + shuffule_batchの動作確認してみた。

#写真

元

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/52fb41ea-b468-8b46-93cf-a9d0e1c0d7ed.png)

結果

![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/18104/501ac481-0a20-1393-7725-ced153471555.png)

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#サンプルコード

random生成

```
import numpy as np
import matplotlib.pyplot as plt

x = np.random.randint(0, 255, 10000)
y = np.random.randint(0, 255, 10000)
v = np.empty((0, 2))
for i in range(10000):
	z = np.hstack((x[i], y[i]))
	v = np.vstack((v, z))
np.savetxt("batchtest0.csv", v, fmt = "%.0f", delimiter = ",")
x0, y0 = np.loadtxt("batchtest0.csv", unpack = True, usecols = (0, 1), delimiter = ',')
plt.scatter(x0, y0, marker = '.', alpha = 0.8, linewidths = 0.01)
plt.show()


```

csv + shuffle_batch

```
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

filename_queue = tf.train.string_input_producer(["batchtest0.csv"])
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
x, y = tf.decode_csv(value, record_defaults = [[1], [1]], field_delim = ",")
xs, ys = tf.train.shuffle_batch([x, y], 100, capacity = 500, min_after_dequeue = 400)

with tf.Session() as sess:
	coord = tf.train.Coordinator()
	threads = tf.train.start_queue_runners(sess = sess, coord = coord)
	try:
		for i in range(100):
			dx, dy = sess.run([xs, ys])
			plt.scatter(dx, dy, marker = '.', alpha = 0.8, linewidths = 0.01)
		plt.show()
	finally:
		coord.request_stop()
	coord.join(threads)

```
Windows Live Mail から Outlook へのメールクライアント移行


Windows Essentials 2012 スイートのサポートが 2017 年 1 月 10 日 に終了しているため、メールクライアントの移行が必要。

「Windows Essentials 2012」のサポートが終了
http://forest.watch.impress.co.jp/docs/news/1038239.html

Windows Essentials
https://support.microsoft.com/ja-jp/help/18614/windows-essentials

Essentials 2012 リリース ノート
https://support.microsoft.com/ja-jp/help/13785

Windows Essentials とは？
Windows Essentials(ウィンドウズ エッセンシャルズ)は、マイクロソフトが提供していたWindows用フリーウェア集。Windows Live Mailが含まれていた。
https://ja.wikipedia.org/wiki/Windows_Essentials

# 移行方法どーするのよ！！
安心してください。移行ツールがありますよ。

* Windows Live メールから Outlook 2010 または Outlook 2007 にメッセージを移行する方法
https://support.microsoft.com/ja-jp/help/982234

* Windows Liveメール（2012）のメールデータをOutlook 2016に移行する方法
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=019476

* Windows Live Mail から Outlook への移行
http://takaq1.plala.jp/contents/windows/live_outlook/index.html

要は・・・
1. Microsoft Outlook をインストール
2. とりあえずメール設定せずに一旦進める→Outlook データファイルを作成
3. Windows Live Mail からメールデータを直接 Outlook データファイルにエクスポート
4. Outlook にメール設定する
せっせとコピーしたテキストを、せっせと書き換える Python3+pyperclip 

# 企画
コピーした文章を定期的に書き換えるという無駄を極めたプログラムが書きたくなったのでやってみる。
ソースコードがめちゃくちゃ短いので多分初心者向け。

## 手順を考える
1. コピーされているテキストを取得
2. 書き換える
3. クリップボードに貼りつけ
4. 定期的に繰り返す

ただし書き換える内容は一部だけにする。

## 環境
- Windows10
- Python 3.5.2 |Anaconda 4.2.0 (64-bit)

# やってみよう！
## pyperclipを使ってみる
まずクリップボードにコピーした文章を取得する。
これにはpyperclipを使えばいい。

```txt:コマンドプロンプト
pip install pyperclip 
```
とコマンドプロンプトに打ち込むとインストールできるはず。
先ほどの文章をコピーしてプログラムを実行してみよう。

```python:sample01.py
import pyperclip, re

copy_text = str(pyperclip.paste())
print(copy_text)
```

```txt:実行結果
だが全てを書き換えてしまっては明らか過ぎて面白くない。
では一部だけ変更するようしてはどうだろうか。
```

コピーしたテキストを取得することには成功したので、逆にテキストをクリップボードにコピーしてみる。

```python:sample02.py
copy_text = 'hello world!'

print(copy_text)
pyperclip.copy('\n'.join(copy_text))
```

```txt:実行結果
私の名前はAliceです
hello world!
```

## 書き換える
それではコピーしたテキストを書き換えていこう。

全てを変更すると面白くない（そもそもテキストを取得する必要すらない）ので、一部だけ変更したい。例えば数字。
数字が出てきたらランダムな数字に置き換えてしまおう。

コピーする文章は日本語である場合が多いと思うので、アルファベットも変更しよう。こちらは特定の文字列が出現したときのみ書き換えることにする。

```python:sample03.py
import pyperclip, re

copy_text = str(pyperclip.paste())
print(copy_text)

new = re.sub(r'[\d]', '*', copy_text)
new = re.sub(r'day|best|hello', '****', new)

if len(copy_text) > 0:
    pyperclip.copy('\n'.join(new))
    print('Rewrite:', new)
else:
    print('Nothing')
```
re.subで文字列の置換。r' 'は正規表現。
本当はランダムな数字で置き換えたり、ランダムな文字列に変更したりを考えていたのだけれど、上手くいかなかった。きっと誰かがうまいこと考えてくれることを期待しよう。

```txt:実行結果
I will do my best day to day!
Rewrite: I will do my **** **** to ****!
```
ちなみにコピーした英文は「今日も一日頑張るぞい！」のGoogle翻訳。
NewGame二期楽しみだぞい。

## 定期的に起動
最後のオシゴト。
ThreadからThreadを実行することで5秒おきに実行することにする。
なお、前述までのプログラムを一部変更した。

```python:copyChange.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

u"""Hoge クリップボードのテキストを勝手に書き換え
      例文：I will do my best day to day 2017!
"""

import pyperclip, re, threading, random


def task():
    copy_text = str(pyperclip.paste())

    new = re.sub(r'[\d]', str(random.randint(0, 9)), copy_text)
    new = re.sub(r'day|best|hello', '****', new)

    if len(copy_text) > 0:
        pyperclip.copy(''.join(new))
        print('---Rewrite Complete!---')
    else:
        print('---Failure---')
    th = threading.Timer(5, task)
    th.start()

t = threading.Thread(target=task)
t.start()
```
定期的に繰り返していることがわかるようにrandomを使って数字を変更するように書き換えた。同時に例文にも2017が追加されている。
また、実行するときにコピーした文章がprintされるのも邪魔なので消した。

```txt:実行結果
---Rewrite Complete!---
---Rewrite Complete!---
---Rewrite Complete!---
```

```txt:クリップボード
I will do my **** **** to **** 4444!
I will do my **** **** to **** 7777!
I will do my **** **** to **** 8888!
```

ここまでお疲れさまでした。

# おまけ
このプログラムは起動しない限りクリップボードが書き換えられない。
そこでさらに凶悪度を増すために自動で起動させる方法を提示しておく。

今回はWindows想定なのでタスクスケジューラを使えばいい。
他のOSでもそれぞれ自動起動の方法があると思うため、自分のPCに苛められたい人はぜひ検索して試してみるといいだろう。
[タスク スケジューラを起動する](https://technet.microsoft.com/ja-jp/library/cc721931(v=ws.11).aspx)

コマンドプロンプトでもschtasksで出来るかも。
使ったことないしわからないけれど。


# 参考資料
- [正規表現操作](https://docs.python.jp/3/library/re.html)


# お詫び
- コードが正しく表示されていないという編集リクエストをいただきました。現在は修正済みです。kobitoでは表示されていても、Qiitaでは上手くいってないこともあるのですね。ご報告・訂正、ありがとうございました。
gebでファイルをダウンロードする


gebでダウンロードしようとしてボタンをクリックしても、ファイル保存ダイアログの「OK」をクリックできないため、ダウンロードできない。

```groovy:
browser.with {
    go 'https://docs.docker.com/docker-for-mac/install/'
    def applink = $('a',text:'Get Docker for Mac (Stable)')
    println "----- ${applink.@href}"
    applink.click()
}
```

![Docker_dmg_を開く.png](https://qiita-image-store.s3.amazonaws.com/0/3956/52d1e9f9-d6b7-010f-e730-4b0ac8df2b24.png "Docker_dmg_を開く.png")

DownloadDupport クラスの download() を使う。
[The Book Of Geb - Direct Downloading](http://www.gebish.org/manual/current/#direct-downloading)

java.net.HttpURLConnection のインスタンスが返るので、 InputStream をそのまま保存すれば良い。

```groovy:
browser.with {
    go 'https://docs.docker.com/docker-for-mac/install/'
    def applink = $('a',text:'Get Docker for Mac (Stable)')
    println "----- ${applink.@href}"
    def conn = download(applink.@href)
    if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){
        InputStream is = conn.getInputStream()
        OutputStream os = new File('./Docker.dmg').newOutputStream()
        os << is
        is.close()
        os.close()
    }
}
```

groovyスクリプト全体は以下。

```groovy:geb_download_dmg.groovy
@Grab('org.gebish:geb-core:1.1.1')
@Grab('org.seleniumhq.selenium:selenium-firefox-driver:3.4.0')
@Grab('org.seleniumhq.selenium:selenium-support:3.4.0')
@Grab('io.github.bonigarcia:webdrivermanager:1.6.2')
@GrabExclude('org.codehaus.groovy:groovy-all')

import geb.*
import org.openqa.selenium.*
import org.openqa.selenium.remote.DesiredCapabilities
import org.openqa.selenium.firefox.FirefoxDriver
// https://github.com/bonigarcia/webdrivermanager
import io.github.bonigarcia.wdm.FirefoxDriverManager

import java.net.HttpURLConnection

//ドライバ読み込み
FirefoxDriverManager.getInstance().setup()
DesiredCapabilities capabilities = DesiredCapabilities.firefox()
capabilities.setCapability('marionette', true)

Browser browser = new Browser(driver:new FirefoxDriver(capabilities))

browser.with {
    go 'https://docs.docker.com/docker-for-mac/install/'
    def applink = $('a',text:'Get Docker for Mac (Stable)')
    println "----- ${applink.@href}"
    def conn = download(applink.@href)
    if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){
        InputStream is = conn.getInputStream()
        OutputStream os = new File('./Docker.dmg').newOutputStream()
        os << is
        is.close()
        os.close()
    }
}

browser.quit()
```

## 追記

自分が書く前に記事がありました。
downloadBytes() で byte配列が返るそうです。
[Gebでファイルをダウンロードする - 山ｐの楽しいお勉強生活](http://yamap55.hatenablog.com/entry/2017/03/01/190340)

```groovy:
browser.with {
    go 'https://docs.docker.com/docker-for-mac/install/'
    def applink = $('a',text:'Get Docker for Mac (Stable)')
    println "----- ${applink}"
    def bytes = downloadBytes(applink.@href)
    new File('./Docker.dmg').newOutputStream().write(bytes)
}
```
Expo XDEでAndroid Studio不要でAndroidシミュレータを動かす[Mac]

# やってみたこと
[create-react-native-app触ってみた！！](http://qiita.com/Shagamii/items/c3205bb64ccaa5258077)を見て、ReactNativeで作成したアプリをExpoを使ってiOSとAndroid両方で動かしてみたくなった。Androidは実機が手元になく、(Expo公式推奨のAndroidエミュレータである)Genymotionで動かすためには、Android Studioのインストールが要求されがちだったので回避した。あと、Android Studioが有っても無くても若干設定が必要なのでついでに記載する。

# 主な対象
- Expoを使ってReactNativeアプリをAndroidのシミュレータ上で動かしたいがAndroid Studioをインストールまではしたくない人


# 前提
- create-react-native-appなどでExpoが使える
- Expo XDEがインストールされている

# 方法
やり方は[公式](https://docs.expo.io/versions/v18.0.0/guides/genymotion.html#genymotion)を参考にした。

## Step 1
### Android Studioが無い人（Genymotion toolsを使用）

0. Genymotionのadbコマンドのパスを探す。macOSの場合は基本的に``/Applications/Genymotion.app/Contents/MacOS/tools/``である。

0. PATHにパスを追加し、adbコマンドが実行できるかどうかを確認する

```bash 
$ export PATH=$PATH:/Applications/Genymotion.app/Contents/MacOS/tools/
$ adb device
```

### Android Studioが有る人
0. GenymotionのSettings->ADBを選び、"Use custom Android SDK tools"にチェックマークを入れてAndroid SDKのパスを入力する。

<img width="662" alt="Screen Shot 2017-07-07 at 6.34.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/108880/dcbe8cf4-6a9c-fc5c-9a27-319436b2fc48.png">


## Step 2
- XDEにパスを反映させる

```bash
$ npm install -g exp
$ exp path
```

# 完成
- Nexus 5X(Android 7.0)でシミュレーションはうまく動作せず、Nexus 5(Android 6.0)では動作した。うまく動作しない端末が存在する。
- ソースコードを変更して保存しただけでiOSとAndroidの両方に反映されていく感覚が体感できて、なんかすごい

<img width="1016" alt="Screen Shot 2017-07-07 at 5.20.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/108880/07a6895e-5f19-14f5-e44e-b8fbd1cc1a83.png">
Riotでfluxを学ぶ ToDo編①

fluxとはなんぞ？

調べてもイマイチしっくりくる解説がないので、
自分で書いてみてその便利さを体験してみようと思います。

予定としてはこんな感じ。

* Riotでfluxを学ぶ ToDo編①（本記事）
* [Riotでfluxを学ぶ ToDo編②](http://qiita.com/0ceanMoo/items/1e7a957fdb8e2a4f4b39)
* [Riotでfluxを学ぶ ToDo編③](http://qiita.com/0ceanMoo/items/7e0517d19eac715831eb)
* Riotとfluxでカウンターとカレンダーを試す


さて始めるか
っと思いましたが、そもそもriotの使い方が怪しいので←
この章では、fluxとか考えず普通の使い方で簡単なToDoリストを作ってみます。

[今回作るToDoリストのデモ](http://riot_todo_1.playcode.io/)

## riotのカスタムタグ

``` todo.tag
<todo></todo>
<script type="riot/tag">
<todo>
  <h1>TODO - 普通の使い方</h1>
  <form onsubmit="{addTask}">
    <input ref="task" placeholder="新規タスクを入力">
    <button>追加</button>
  </form>
  <ul>
    <li class="{is-done: task.done}" each="{task in tasks}" onclick="{toggleTask.bind(this, task)}">{task.title}</li>
  </ul>
  <style>
    .is-done {
      text-decoration: line-through;
      color: #ccc;
    }
  </style>
  this.tasks = [
    {title:"riotで何か作ってみる",  done:true},
    {title:"fluxを実践してみる",    done:false},
  ];
  addTask(e) {
    e.preventDefault()
    this.tasks.push({title:this.refs.task.value, done:false})
    this.refs.task.value = ""
  }
  toggleTask(task, e) {
    task.done = !task.done
  }
</todo>
</script>
```


## riot.jsの読み込みとカスタムタグのマウント
```todo.html
<script src="https://cdn.jsdelivr.net/npm/riot@3.6.0/riot+compiler.min.js"></script>
<script>
  riot.mount("todo")
</script>
```

ちなみに、riotの利点はサっとHTMLに直接書いてしまえる事だと考えているので、
簡単なものを試すだけなのに、ファイル分割してタスクランナーでコンパイルなんてしないです。

もちろん、巨大なプロジェクトではそれなりの開発環境を整えますよ。
どっちもイケるってのが、やはりriotの凄いところだ。

小さなものもriotで、
大きなものもriotで。

riotもっと流行れ！

## コード解説
ん、シンプルだ。
思いのほかスッキリしたのが書けたけど、一応説明しますと

* コンストラクタ？でthis.tasksにToDoを２件登録
  * this.tasksを、liタグのループで展開されるよう、埋め込んでおく
* 追加ボタンのonclickにaddTask()を登録
  * addTask()では、入力されたToDoをthis.tasksに追加する
  * riotが自動で、this.update()を実行する
  * この時、liタグに埋め込んだ this.tasks のループ部分が再描写されるので、追加したToDoが追加表示されることになる
* liタグに表示されるToDoのonclickに、toggoleTask()を登録
  * toggleTask()では、ToDoの状態を反転させるだけ
  * addTask()と同様に、自動でthis.update()が実行され、状態が更新された最新のthis.tasksでToDoリストが再描写される

この書き方で十分分かりやすいし、

MVCだのfluxだのって考え方を取り入れなくても問題ないんじゃないの？
そんなの採用したら、複雑化して余計分からなくなるだけじゃないの？
と思わないこともない。

っがそんな無秩序に書いていけば、それほど遠くない未来にカオスになるだろう、
というのも想像に難くない。と思わなくもない。

全体が頭に入っている状態なら、細かいトコにすら目が届くが、
数カ月後に機能を追加するとなった時、この無秩序に何でも追加できる環境は、カオスを生み出す助けをする

いや、秩序のない環境で書かれたコードは、既にカオスだ。
今はカオスに見えなくても、それはカオスなのだ。

まぁカオスの話はおいといて、
次は、riot.observableを使って、このToDoリストを書きなおしてみる事にする。

fluxにはまだ遠い。
(初心者向け)Flickr Apiを使って画像を引っ張ってくる(1)

### ~API Documentationの中身を見る編~

自分向けメモな意味合いを含めて、画像たくさん使って説明します。
最終的にやりたいことを画像をひっぱってくることですが、それをするにはいくつかのステップを踏む必要があります。
すごく単純にまとめてしまうと、

-  apiKeyを使って、request用URLを作成 
-  帰ってきたresponseであるjsonファイルを見て、必要な情報だけを指定する。
-  指定した情報をメモリに保存。
-  表示する。


## 1. api登録
まずは[フリッカーのapiサイト](https://www.flickr.com/services/api/)でyahoo.comのアカウントを取得して、apikeyをゲットしてください。
![Screen Shot 2017-07-05 at 7.06.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/2ac666c3-e169-19b1-0210-8f8632595fb1.png)

無事ログインできたら、こんな画面になるので、apikeyはこちらでGetできる。
![Screen Shot 2017-07-05 at 7.11.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/a478615b-4d0a-6c74-dccc-8986bb5a9d3c.png)


## 2. requestを送るためのURLを作成する

### A. URLってなんやねん

こんな感じのURLです。▲▲▲▲▲▲▲はapiKey

```
 https://api.flickr.com/services/rest?api_key=▲▲▲▲▲▲▲▲(method=flickr.interestingness.getList&format=json&nojsoncallback=1&extras=url_h,date_taken
```

URLを分解してみてみましょう。
![Screen Shot 2017-07-06 at 11.43.51 AM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/9d5b9fb9-9746-e195-03dd-d1cc6955840f.png)

##### ① Rest でリクエストを送るためのフォーマット(urlの冒頭)
*ドキュメント：https://www.flickr.com/services/api/request.rest.html*
##### ② 上記で取得したApiキー
##### ③ どういった画像が欲しいか指定する。上の場合、 “interestingness” = 面白い という意味なので、興味深い画像が帰ってくる感じ 
*ドキュメント:https://www.flickr.com/services/api/flickr.interestingness.getList.html
ちなみに、他のメソッドが使いたい場合は、[トップページ](https://www.flickr.com/services/api/)にあるAPI Methods一覧を見るといいですよ〜。*
##### ④ データのフォーマットを指定する。この場合JSON。指定しなければ、デフォルトでxmlが帰ってくる
##### ⑤ nojsoncallバックを指定する
##### ⑥ 帰ってくるデータの中に、画像のurlと撮った日付を含める
METHODがflickr.interestingness.getListの場合、画像URLと撮った日付が帰ってこないので、EXTRASで指定する必要がある。


### B. どんなJSONデータが帰ってくるの？

こんなです。(firefox)
画像URLだけ別タブで開いて見て、ちゃんと欲しい画像が表示されれば、成功！
![Screen Shot 2017-07-05 at 7.28.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/a3fb353e-1ace-7ddb-fac4-ce7daee3df09.png)

### C. API ExplorerでURLのテストしてみる

URLを直打ちしてテストしてもいいのですが、面倒!
なので、Flickrが提供しているApi Explorerを使おう。
https://www.flickr.com/services/api/explore/flickr.interestingness.getList

このように入力すれば、Bの画像と同じ結果が返ってくるはず。
![Screen Shot 2017-07-06 at 12.13.18 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/b851ceaf-5d4e-8226-4269-22f4d05f0f53.png)

### じゃ早速(やっと)コードを書いていきましょう、それは次号で!
え、待てないんだけど、という人は完成をどうぞ。
https://github.com/Saayaman/FlickrApi
教育への取り組みについて

このプレゼン資料は[第６回 Rubyビジネスフォーラム](https://ruby-b.connpass.com/event/56185/)で使った資料です。 :thumbsup: 

# 提供
リバティ・フィッシュ株式会社

よりニッチに。よりユニークに。 
IT市場はもちろん、ヘルスケア・医療・介護など次世代市場における
企業や生活者のユーザビリティを向上させる
サービス、ソフトウェアを開発しています。

Rubyアソシエーション認定システムインテグレータGoldになりました！:tada:

![footerLogo.png](https://qiita-image-store.s3.amazonaws.com/0/137044/50af3000-4d7c-909a-60e3-d124bb6b3cdb.png)

---
# 自己紹介
のぐち　あきら

- @opt-link
- リバティ・フィッシュ株式会社　所属
- Ruby歴３年くらい
    - `UnboundMethod`大好きです
- 会社イベントまとめ役
    - 親子プログラミング教室やってます
- 新人研修担当

新人教育あるあるを交えながら、教育への取り組みを説明します。

---
# 新人研修あるある
こんなシーン見たことありませんか

- 初めてのRubyを渡すだけ
- 自学自習という丸投げ
- 質問がきてもなかなか返せない
    - ~~業務もあるんだもの・・・・~~
- ゴールが明確じゃないから楽しくない

---
# 新人に何がおこるか（１）
その場しのぎの知識なRubyなプログラムでなくなる。

例えば、

【問題】
1から20の連続した整数の配列で偶数だけ削除してください。

【先輩の期待】

```ruby
[*1..20].delete_if(&:even?)
```

短いからいいというわけではないですが:laughing: 

---
# 新人に何がおこるか（２）

【新人の答え】

```ruby
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20].delete_if{|val| val.even?}
```

出力はあっているが、コレジャナイ感・・・
べったべたですやん・・・

---
# 新人教育で大事なこと

新人教育で体系的な知識を身につけてもらうことが大事です。

とはいえ、教材を作るのはかなり苦労するんです:cry: 

- 実践的すぎて複雑
- 簡略化すると活用シーンが浮かばない
- ~~Procを使いすぎてちんぷんかんぷん~~

--- 
# そんなあなたに朗報です :laughing: 
Ruby技術者認定試験だと体系的にRubyを学習できます :thumbsup: 

<font color="Red">REx（レックス）</font>を使うとより楽しく、
Ruby技術者認定試験（Gold）まで視野に入れた勉強ができます:tada:

http://rex.libertyfish.co.jp/

<br>
<br>
<br>

Rubyの知識も大事ですが、論理的思考も大事ですよね？

---
# 中高生向けのプログラミング教室もやってます

ScratchライクなSmalrubyを使ってプログラミング教室もやってます。
作ったプログラムをギャラリーでシェアしてお家でも学習できます！

ブースも出してますので、よかったら見に来てください:bee:
html側の記述でIEのレンダリングモードの指定はしないで欲しい

IEのレンダリングモードをmetaタグで指定できるということを知らなかったので衝撃を受けたのと同時に設定しないでほしいと思ったことがありました。

IE11の機能を使用したjavascriptのツールを使っていた時のことでした。
普通に実装すると問題なく動作するのだが、iframeを使ってそのページを読み込んでいる場合に何故かjavascriptのツールでエラーが出て使えなくなっていた。iframeがダメなのかとも思い新規にiframeのみを使った簡潔なページを作り読み込ませてみたところ問題なく動作していた。

エラーは以下のようなものでした。

```
"Uint8ClampedArray" is undefined
```

これはIE11で使える機能なので理由が全くわからず悩みました。
互換モードでもおかしいのかと思い、IEの設定を見ても問題なし。

悩んだ結果iframe側のソースにあった怪しいIE10の文字列を含んだ下記のタグを消した結果
動作するようになりました。

```html
<meta http-equiv="X-UA-Compatible" content="IE=10"/>
```

結果、<b>この設定を入れることでIE10のレンダリングモードでレンダリングされ</b>
IE10には無い```Uint8ClampedArray```のエラーが出ていたという事でした。

内部からそんな設定ができるなんて知らなくて衝撃でした。
pythonでJSのsetTimeoutみたいなこと

というお題でいくつか試してみました。

# 同期処理

まず一番シンプルには次のように `time.sleep`を使えば指定した時間処理を遅延させることはできます。

```py3
import time
def hello(target):
    print("Hello {}".format(target))

time.sleep(3)
hello("World")
```

しかしこれでは `time.sleep`以降の処理すべてが遅延します。setTimeoutみたいに特定の処理だけ遅延させるにはどうすればよいのでしょうか？

# 非同期処理（スレッド）

threading.Timerを使えばできます。

```py3
from threading import Timer

def hello(target):
    print("Hello {}".format(target))
    
timer = Timer(3, hello, ("World", ))
timer.start()
```

以下のように途中でキャンセルもできます。

```py3
timer.cancel()
```

この方法ではTimerの呼び出しごとにスレッドを生成します。若干非効率ですし、JavaScriptのsetTimeoutの方法とは異なります。

# 非同期処理（asyncio）

JavaScriptは単一スレッドでイベントループがさまざまなイベントを処理しています。Python3.4以降でもそういう形で実行する方法があります。asyncioというPython3.4以降に標準添付されているパッケージを使う方法です。JavaScriptと同じくイベントループを使ってます。ただし、JavaScriptではイベントループは暗黙的なものでしたが、asyncioでは明示的に操作してあげる必要があります。

以下の2つがコード例です。[^1][^2][^3]

やっていることはほぼ同じで違うAPIを用いた例を掲載しました。call_later版はasyncio.call_laterで指定した秒数後（以降に）指定した関数を実行するようなイベントを発生させてます。コルーチン版[^4]は wrap_with_delayという指定秒数制御をイベントループにもどしてから元の関数を呼ぶコルーチンでラッピングしてます。今回のコードだとcall_later版の方が簡潔ですが、複数の処理が連鎖するような場合は同期処理のように書けるコルーチン版の方がわかりやすくなります。

## call_later版

```py3
import asyncio

def hello(target, loop=None):
    print("Hello {}".format(target))
    if loop is None:
        loop = asyncio.get_event_loop()
    loop.stop()  # イベントループをとめて制御をもどす処理を追加

loop = asyncio.get_event_loop() # デフォルトのイベントループ取得
loop.call_later(3, hello, "World")
loop.run_forever() # イベントループスタート。明示的にstopしないと戻ってこない。
# loop.close()
```

## コルーチン版

```py3
import asyncio

# asyncとつけると通常の関数ではなくコルーチン
async def wrap_with_delay(sec, func, *args):
    await asyncio.sleep(sec) # awaitで制御をイベントループにもどす
    func(*args)

def hello(target, loop=None):
    print("Hello {}".format(target))
    if loop is None:
        loop = asyncio.get_event_loop()
    loop.stop()  # イベントループをとめて制御をもどす処理を追加
    
loop = asyncio.get_event_loop()
asyncio.ensure_future(wrap_with_delay(3, hello, "World"))
loop.run_forever()
# loop.close()
```

[^1]: 本来イベントループは複数の処理を時分割して並列に実行するためのしくみなので、この例のように遅延実行のみイベントループにのせることはふつうしません。

[^2]: イベントループをまわっしぱなしだと実行が終わらないので、簡単に試せるようにループをとめる処理を追加してあります。他の方法との比較という観点からは余計な処理です。

[^3]: デフォルトのイベントループをクローズするとそれ以降 asyncio.get_event_loop がエラーになるので、jupyter notebookでの実行を考えてコメントアウトしてます。

[^4]: このコードそのものはPython3.5以降で動作するがちょっと変えればPython3.4でも実行可能
スクリプトはhead内で完結したい派

# scriptタグのasync属性はスクリプトはhead内で完結したい派の自分にはありがたい限りの機能でした。

scriptはレンダリングの後方で処理した方がよいという事でbodyの最後で読み込んだり記述したりするという方法がありましたが、自分は見難いのが嫌いなので、頑なにheadタグ内に記述してきました。

html5ではscriptタグにasync属性を付けることでレンダリングと非同期に読み込むことができるそうです。
これを使うことで後方にスクリプトを記述する必要も無視して良さそうな感じに思えました。

<b>とりあえず、すぐに使用するもの以外（イベント発火等の後で使用するもの）には基本asyncを付けておけば良さそうです。(コメント指摘により追記: 依存性のあるスクリプトやイベント時に読み込まれていない可能性のあるスクリプトはasyncは使うべきではないということです。)</b>



```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>SAMPLE</title>
<head>
<script src="moment.min.js" async></script>
<script src="underscore-min.js" async></script>
<script src="jquery-3.2.1.min.js"></script>
<script>
$(function(){
	var now = moment();
	console.log(now.toDate());
	console.log(_.min([10, 5, 100, 2, 1000]));
});
</script>
</head>
<body>
<div>BODY</div>
</body>
</html>
```

jqueryはすぐに使用するのでasyncを付けてしまうと

```
Uncaught ReferenceError: $ is not defined
```
となります。

defer属性はDOMContentLoadedの直前に読み込まれるという事でした。