OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi2でフォトトランジスタの値を読む


## 環境情報

Raspberry Pi2 Model B
OS: Raspbian JESSIE
A/Dコンバータ：MCP3002
Python 2.7

## 目的

Raspberry Pi2 のSPIフォトトランジスタの値をA/Dコンバータを利用して取得し、暗くなったらLEDを点灯させる

## 用語の説明

### SPI通信とは

シリアル・ペリフェラル・インタフェースの頭文字をとってSPI通信と呼び、少ないピンでデータをやり取りする低速インタフェース。
４つの端子で構成される。

SCK・・・Serial Clock
MISO・・・Master In Slave Out
MOSI・・・Master Out Slave In
SS・・・Slave Select 

### A/D変換とは

アナログ→デジタル変換のことであり、アナログとは連続値でありデジタルとはあるタイミングのスナップショット値のようなもの。
電圧の変化などのアナログ値を、デジタル数値に変換するチップをA/Dコンバータと呼ぶ。

## 回路

回路は、回路図を用意できないので写真で。。


![IMG_1863.jpg](https://qiita-image-store.s3.amazonaws.com/0/93861/5ea5ef14-3091-64ab-ce65-a2f131abc49f.jpeg)



MCP3002のつなぎ方は、データシートを参考にした。

http://www.ee.ic.ac.uk/pcheung/teaching/ee2_digital/MCP3002.pdf

### はまりポイント

プログラムを記載して実行してみたが、一向に値が変わらない現象があったが、その理由はVss端子が＋(3.3V)につながっていたためで、GNDにつないだことで、値が得られるようになった。

## プログラム

### pi-spidev のインストール

pi-spidevは、PythonでSPI通信を利用するためのPythonモジュール。以下のコマンドで利用可能となる。

~~~
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
~~~

### データ取得処理

Pythonでの実装は、GPIOとpy-spidevを利用してフォトトランジスタの値が、10を下回ったらLEDを点灯させることを実現する。
以下が、実際のPythonプログラム。

~~~ç

#!/usr/bin/env python
# Read the analog sensor value via MCP3002
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import spidev
import time
import subprocess

def ledFlash(num):
    if num < 10:
        GPIO.output(LED , GPIO.HIGH)
    else:
        GPIO.output(LED , GPIO.LOW)
    return


GPIO.setmode(GPIO.BCM)
LED = 25
GPIO.setup(LED , GPIO.OUT)

# opne SPI device 0.0

spi = spidev.SpiDev()
spi.open(0 , 0)

try:
    while True:
        resp = spi.xfer2([0x68, 0x00]) ・・・ポイント①
        value = (resp[0] * 256 + resp[1]) & 0x3ff　・・・ポイント②
        print value
        ledFlash(value)　・・・ポイント③
        time.sleep(0.2)
except KeyboardInterrupt:
    spi.close()


GPIO.cleanup()


~~~


* ポイント①
　MCP3002へのインプット信号は、コンバータの仕様として以下となる。
 　CH0　から取得する場合　0b01101000、0b00000000　(2進数）
    CH1   から取得する場合　0b01111000、0b00000000   (2進数)
    spidev.xfer2メソッドに上記の16進数を渡している。
    
* ポイント②
   resp (応答）から、応答を受け取って（10bit）取得して値をＧＥＴ
   ※ここはもう少し詳しくなんでこういう計算式なのか理解する必要あり
   
* ポイント③
　用意しておいたLEDの点滅メソッドに値を引数にして渡している
　メソッド内では、値が10以下になったらLEDを光らせている。（部屋が結構暗かったので通常で、16-17の値だったので、10に設定しているがここは光らせたい閾値を変えれば良い）
 


## 参考になった記事

[部屋の明るさを取得するフォトトランジスター編](http://lchikaamazon.hatenablog.com/entry/2014/12/02/111022)

[自分の部屋の温度をロギングしてみました。](http://blog.goo.ne.jp/fdfpy/e/17fea75c9320d1b008ac124a6fe99f67)
「ひらくん」をPerlで「30723089304F3093」に変換する

　さて本日のPerlネタは文字コードについてです。

　たまーに入力されている文字のコード値が知りたくなりますよね？　いや、なるんですよ、知りたくなる人もいるんですよ。はい、そんな一人である私も先日ちょっと16進表現のコード文字列が必要になることがありましたので、Perlで手軽に出力する方法をご紹介します。

　Perl内部で文字コードのエンコードを手軽に行なうにはEncodeモジュールの from_to というものを利用します。from_toというくらいなので下のデータのエンコードと変換したいエンコードを指定します。これで処理を行なうと指定したエンコードで変換されたデータが得られますのでその値をunpackで表示するという算段です。まあ使い方自体は大して難しくないのでソースをさくっと見てみましょう。

```pl
#!/usr/bin/perl
use utf8;
use Encode;
use strict;

# UTF-8フラグを落とす
my $buf = Encode::encode_utf8('ひらくん');

# UTF-8⇒UTF-16文字コード変換
Encode::from_to($buf, 'UTF-8', 'UTF-16BE');
my $is_u16 = uc unpack("H*", $buf );
print $is_u16 . "\n";
```
処理結果：
```
30723089304F3093
```

　ここでポイントとなるのはPerlのUTF8フラグというものです。use utf8をしてソースをutf8で記述している場合、Perlの変数はutf8フラグがonの状態になっています。この状態ですとPerlは変数内のデータをUTF8の文字として扱ってくれるので文字数のカウントなどもバイトサイズではなく、きちんと文字数を返してくれるわけです。ただ from_to の処理ではこのUTF8フラグがonになっていると都合がわるいのでこれをoffにする必要があります。それが encode_utf8 です。

　from_to で指定するエンコードの種類ですが基本的にはfrom側がutf8でto側になにか別のエンコードを指定することになるかと思います。そのさいに指定できるエンコードの種類は次の方法で確認かのうです。

```pl
@list = Encode->encodings(":all");
for (@list) {
        print $_ . "\n";
}
```
　それでは今回はここまでー
Webページをデスクトップアプリ化 - nativefierを使ってみる

#nativefierとは

1行でシングルページWebアプリケーションをデスクトップアプリ化してくれる優れもの

Webアプリを[`Electron`](http://electron.atom.io)でWrapし、[`Electron-packager`](https://github.com/maxogden/electron-packager.git)を使ってネイティブ( `.exe ` `.app` ... )を出力するみたいです

>Githubリポジトリ : [jiahaog/nativefier - Github]
(https://github.com/jiahaog/nativefier)

主としてOSX向けに開発したそうですが、Linux・Windowsでも動くそうです

#インストール

[npmでパッケージとして公開](https://www.npmjs.com/package/nativefier)されています

```
$ npm install -g nativefier 
```
もし`npm`入ってない人は`brew`なり`apt-get`なりでNode.js入れて、`npm`インスコすると幸せになれます

注)アプデが非常に激しいので、本記事も極力最新版の情報に更新しています
既に入っている人は`npm update`してもらえると整合性が取れるかと思います...

#使いかた

試しに

```
$ nativefier maps.google.com
```
とすると、カレントディレクトリに`Google Maps- *`フォルダが生成されます
中を覗くとライセンスなどと共に、お目当のデスクトップアプリが入っているかと思います。

生成されたアプリはこんな感じになりました

![Google Map.png](https://qiita-image-store.s3.amazonaws.com/0/69173/6f2dff74-d73d-bb61-3d08-3e3d8dfb2bf8.png)


##*認証の必要なWebサイトをアプリ化
Twtter , Whatsapp , Facebook Messenger など*認証が必要なサイト*（原文:Certain Websites）は ~~`--pretend`~~ `--honest` オプションをつけてやります

```
$ nativefier --honest "http://web.whatsapp.com"
```

##アプリの名前を指定
`--name`オプションで名前を指定することができます

```
$ nativefier --name "Google Map" "maps.google.com"
```

##アプリのアイコンを指定
OSXでは`--icon`オプションで`.icns`ファイルを指定します

`.icns`の詳しい作りかたは以下のサイトに委ねたいと思います
>[Macアプリの.icnsを作るときのメモ - Qiita](http://qiita.com/Jacminik/items/a4c8fe20a4cba62f428b)


##その他の主なオプション

基本的に

```
$ nativefier [options] <targetUrl> [dest]
```
と指定していきます。

|項目     |説明                                                      |
|:--      |:--                                                        |
|options  |オプションをぶちこむ場所                                       |
|targetUrl|アプリケーションにしたいWebアプリのURL                           |
|dest     |ビルドしたファイルを出力する場所 ( 省略した場合はカレントディレクトリ )|

となってます

###・高さ、幅指定
```
--width <value>
--height <value>
```
デフォルトはそれぞれ`1280px`,`800px`です

###・通知を表示

```
--counter
```
OSXのみ、Dockに通知を表示することができます（Webページが対応している場合）
###・プラットフォーム、アーキテクチャの指定

```
-p, --platform <value>
-a, --arch <value>
```
プラットフォームは`darwin`,`linux`,`win32` アーキテクチャは`ia32`か`x64`を指定できます。デフォルトでは自動で識別します。

###・ヘルプの表示　

```
-h, --help
```

##使ってみた所感

私自身TweetDeckとFacebookなどはいつもブラウザで開きっぱなしでタブがかさばっていたので幾分か楽になった気がします

しばらくコードいじって遊んでみて、気が向いたらプルリクでもぶん投げようかなと思っている所存です

Electronいいっすね
Mac El Capitan pygameのインストール


# El Capitanにpygameをインストール

http://ken.quoit.jp/2015/03/11/macosx-yosemite-homebrew-pygame-install/

の手順だとpygameがインストールできなかったのでメモ。

```sh
$ brew install sdl sdl_image sdl_mixer sdl_ttf portmidi 
$ brew install mercurial
```

これの後に

```sh
$ pip install hg+http://bitbucket.org/pygame/pygame
```

をやっても

```sh
Cannot find command 'hg'
```
って言われてしまう。

brew install後のログを見ると

```sh
🍺  /usr/local/Cellar/mercurial/3.6.3: 375 files, 4.5M
```

ってでてるので
hgのシンボリックリンクを貼ってやる。

```sh
$ ln -s /usr/local/Cellar/mercurial/3.6.3/bin/hg /usr/local/bin/.
```
UE4 でGamePlayTagを対応させるメモ

# テスト環境  

UE4.10.1

# 概要  

AI周りで必要になるGamePlayTagをプロジェクトに対応させる方法  


# 導入手順  

## Configファイルを使う方法
1. DefaultEngine.iniを編集  

```ini:DefaultEngine.ini
[GameplayTags]
ImportTagsFromConfig=true
```
2. プロジェクト設定のプロジェクト欄にゲームプレイTagsを編集
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/d15fde4b-1a17-e89a-dd75-250728352883.png)


## GamePlayTagデータテーブルを使う方法

1. データテーブル作成、作成する構造体はGameplay Tag Rowを選択してOKを押してください
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/46ee80c8-b9d6-bed7-1093-a7737d7d504c.png)
2. テーブルに名前を付けてください  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/bc6ebdf7-abfb-8fa2-1ad2-46b9d245d389.png)
3. 値を記載してください  
RowName(行名)は数字で書く必要が有ります  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/a73f2119-9546-ace8-0b0c-8537c20faf81.png)

## コンフィグファイルに書込み  
下の表を参考に"/Config/DefaultEngine.ini"に追加してください  


|実際のディレクトリ|DefaultEngine.iniに書き込む物|
|:---------------|:---------------------------|
|/Content/Datatable/MyGamePlayTag.uasset|/Game/Datatable/MyGamePlayTag|


```DefaultEngine.ini
[GameplayTags]
+GameplayTagTableList=/Game/ディレクトリ.../先ほど作ったテーブルのアセット名
```
* 実際に書き込んでいる所  
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/b2bd205c-9802-9ab3-aa81-a7f38eb4f0b1.png)


## 動作チェック  
GmaeplayTagが必要な箇所で編集を押して下記のような表示が出ればOK
![image](https://qiita-image-store.s3.amazonaws.com/0/66029/097cf510-2f35-ee48-d55a-13cdcc16c415.png)
MacでAndroid開発中に手軽にスクリーンショットを撮る

#はじめに
Android開発に触れたばかりの時は、端末でスクリーンショットを撮り、それを何らかの手段で開発しているマシンに転送するという、どう考えても頭のおかしい方法でスクリーンショットを撮っておりました。。。

#やり方
コマンドラインとかよく分からないなんて場合はAndroidStudioのUI上で撮影が出来ます。
とは言え、コマンドラインも一度登録しておけばワン・コマンドで実行できるのでこれを期に.bashrcに登録していただければと思います。

##AndroidStudioで撮る
Andorid Monitorを開き、左側にあるカメラのアイコンをクリックすると接続されている端末のスクリーンショットが撮影できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/68671/74eb8d1a-437f-5c70-2726-961c75fffa7b.png)

こんな感じでウインドウが出てきて、撮影されたスクリーンショットが表示されます。
右クリックでコピーとかも出来ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/68671/92205d75-9f81-a75e-bce3-a970fd7c65b7.png)

##コマンドで撮る
AndroidStudioで撮るのもだいぶ楽なのですが、スクリーンショット画像をそのまま簡単にコピーペーストする事を考えると、この方法が今の自分の中での最適解です。

前提として下記を満たしているものとします。

- adbコマンドが使えるようになっている
- 開発中のMacに接続されているAndroid端末(実機、エミュレーターは問わない)は1台である 

```bash
#スクリーンショットを撮影し、端末内の/sdcard/screen.pngに保存
adb shell screencap -p /sdcard/screen.png

#端末内の/sdcard/screen.pngから撮ってきてローカルの/tmp/screen.pngに置く
adb pull /sdcard/screen.png /tmp/screen.png

#端末内の/sdcard/screen.pngは削除する
adb shell rm /sdcard/screen.png

#openコマンドでローカルの/tmp/screen.pngを開く
open /tmp/screen.png
```

こんな感じでプレビューが開き、撮られたスクリーンショットの表示までしてくれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/68671/d11878e0-a0e6-baff-d95c-da4a4cdbc18e.png)

ワンライナーだとこんな感じです。

```bash:ワンライナー
adb shell screencap -p /sdcard/screen.png;adb pull /sdcard/screen.png /tmp/screen.png;adb shell rm /sdcard/screen.png;open /tmp/screen.png
```

私は上記のワンライナーを.bashrcにaliasとして登録し、いつもワン・コマンドで実行しています。

```bash:.bashrc
alias screenshot="adb shell screencap -p /sdcard/screen.png;adb pull /sdcard/screen.png /tmp/screen.png;adb shell rm /sdcard/screen.png;open /tmp/screen.png"
```

ターミナルで実行するだけでスクリーンショットがプレビューで開かれます。

```bash
$ screenshot
```

## おまけ 動画を撮りたい
4.4以上の端末だとscreenrecordコマンドを利用することでmp4動画を撮影することが出来るようです。
ffmpegを使ってgifへの変換が出来るようで調べたら記事がいっぱい出てきますが面倒な場合は変換は適当にどこかのWebサービスにお任せしてしまう方が楽です。
こんな感じで.bashrcに入れておくと幸せになれます。

```bash:.bashrc
alias screenrecord="adb shell screenrecord --bit-rate 10000000 /sdcard/screen.mp4; sleep 3; adb pull /sdcard/screen.mp4 /tmp/screen.mp4; adb shell rm /sdcard/screen.mp4; open /tmp/screen.mp4"
```


#おわりに

これでQiitaやGithubに端末のスクショを載せるのも簡単に出来ます。
もっと楽な手段をご存じの方はぜひ教えて下さい。
Ransackで複数項目の検索ボックスを作成する

Ransackで検索ボックスを作成する際のメモ

複数項目で検索する際は項目を_orで繋げればオッケー

```ex.erb
<%= search_form_for(@q,url: "/", method: :get) do |f| %>
  <%= f.label :名前 %>
  <%= f.search_field :name_or_part_1_cont, class: "form-control", placeholder: "" %>
```

https://github.com/activerecord-hackery/ransack
に載ってますが、日本語での情報がなかったためメモさせていただきました。
AWSのMFAをスマホを使って設定

AWSの初期ユーザはrootユーザなので、メールアドレスとパスワードのみの
かなりヤワなセキュリティになっています。
そのため、最低限二段階承認は設ける必要があります。

# 準備するもの
認証コードを発行するための__MFAデバイス__が必要です。
デバイスには物理と仮想の二種類があります。

スマホがあれば仮想でOKです。

■仮想MFAデバイス用アプリ一覧

|端末|アプリケーション|
|:--|---|
|Android|AWS Virtual MFA、Google Atuhenticator|
|iPhone|Google Atuhenticator|
|WindowsPhone|Authenticator|
|Blackberry|Google Atuhenticator|

一応物理デバイスはこちらのサイトで購入可能です。
[Gomalto社](http://onlinenoram.gemalto.com)


# MFAの設定
1. IMAのダッシュボードを開き、セキュリティステータスの「ルートアカウントのMFAを有効」からMFAの管理で次の画面へ
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/004b771f-9089-f41b-08f2-31c88ab59187.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/194d7f4e-6c1c-8ae0-074d-b6ea05a778da.png)
　
 
2. ポップアップで仮想デバイスを選択。仮想MFAアプリがインストールされているか確認されるので、インストールしてから次に進む。
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/55e287b8-403f-3742-362e-7e6420d41fb6.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/5fe18a2b-b44c-7553-2e1b-f91ecabd2247.png)
　
 
3. QRコードの各仮想デバイスで読み込む。今回はGoogle Atuhenticatorを使用しました。連携したアプリに表示されるワンタイムパスワードを認証コード１に入力し、そのパスワードが消えて次に表示されたパスワードを承認コード２に入力する。正常に完了すればその旨が表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/aac76e47-5729-dbee-0ffe-4b262e0300a3.png)![image](https://qiita-image-store.s3.amazonaws.com/0/33165/8592e585-787a-334a-aff1-af46022c55fc.png)
 
 
# MFAを利用してログイン確認
1. ログアウトして再度ログインを行う
2. 以下の画面が表示されたら正常に登録されている。
![image](https://qiita-image-store.s3.amazonaws.com/0/33165/75344ea2-a389-1723-ab10-ab9efa07767f.png)
 
# まとめ
今回Qiitaに初投稿しました。
備忘録みたいで、あまり自分の意見みたいなものは無いですが・・・
これからも投稿できたらと思います！
Zybo > Link > void setup_io();

FPGAの部屋の人のページ
http://marsee101.blog19.fc2.com/blog-entry-2388.html

こちらで「setup_io()」なる関数が記載されている。

ページにあるリンクの http://elinux.org/RPi_Low-level_peripherals を見たが、関連する情報は見つけられていない。
RPi > Link > GPIO > RPi Low-level peripherals

Zybo関連でFPGAの部屋さんのページを見ていて、以下を見つけた。

http://marsee101.blog19.fc2.com/blog-entry-2203.html
> なお、void setup_io() は、”RPi Low-level peripherals”のものをそのまま使用しているので、そちらを参照して欲しい。

で、そのリンク先というのは
http://elinux.org/RPi_Low-level_peripherals

GPIOに関して詳しく書かれている。
Zybo > Link > GPIO > LED / Buttons / Switches @ ZYBO Reference Manual

ZyboのGPIOでLED, Buttons, SwitchesのGPIOの説明は
[ZYBO Reference Manual](http://www.xilinx.com/support/documentation/university/XUP%20Boards/XUPZYBO/documentation/ZYBO_RM_B_V6.pdf)
のページ22、Figure 14にある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b995e391-9081-ad23-60da-e2129e4056bb.png)


例として、

- PSからアクセスできるLEDはMIO7。
- PSからアクセスできるButtonsはMIO50, MIO51
- PLからアクセスできるLEDsとしてD17, G14, M15, M14
など
Zybo > Link > ZYNQのMIO GPIOをLinuxから使う

ZYNQのMIO GPIOをLinuxから使う
http://embdlog.blogspot.jp/2015/07/zynqmio-gpiolinux.html

上記ページには「FPGAの部屋」の人のページを参考にZyboのMIO7のLEDを点灯している。
php.iniのパス指定と現在指定されているphp.iniの場所を知る方法

覚書として。

# パス指定
`httpd.conf` などのApacheの設定ファイルの中の `PHPIniDir`ディレクティブの値が最も優先して適用されます。
自分で読ませたいときにはここに書き込むのが一番早いみたいです。
`PHPIniDir`ディレクティブはVirtualHostブロック内には書いてはいけないようなので
ファイル末尾などわかり易い場所に書いておきましょう。
他には環境変数`PHPRC`に指定する方法などがあるようです。

詳しくはここに書いてあります。
PHP: 設定ファイル - Manual: http://php.net/manual/ja/configuration.file.php


# 現在指定されているphp.iniの場所
## phpinfoを見る
何らかの方法で`phpinfo();`を実行して見ると書いてあるようです。
ブラウザで開いた場合、 **Configuration File (php.ini) Path** という行に書いてありました。

# php --iniコマンドを使う

` php --ini` と実行すると読み込まれたiniファイルの一覧とその順序を調べる事ができます。

[php_ini_scanned_files()](http://php.net/manual/ja/function.php-ini-scanned-files.php)関数で .ini ファイルのリストを取得する事も出来ます。

## その他
`locate` や `find` でもいいですが、もし仮に複数個あった場合、上の方法で特定してみましょう。
Ruby on Rails (4.2.3) でプリコンパイルを無効化する手段が諸説あって辛かった件

# 無効化はできた

とりあえず `config/application.rb` の中に

```rb:confg/application.rb
config.assets.precompile = []
```
と指定する事でプリコンパイルの対象となるファイルを空にして無効化してる。

## 正直ゴリ押し感が否めないけども

他の方法方法あったら教えてくださいな。
できるだけ簡単な方法で。

## 何をしようとしてたか
Rails を使った API サーバーのお試し実装。
Heroku にデプロイしようと考えていたので Rails のバージョンは、Heroku の[サンプル](https://github.com/heroku/ruby-getting-started/blob/master/Gemfile)から

API サーバーだけのつもりだったので precompile は一切必要じゃなかったけど、何も設定せずにデプロイしたら precompile に失敗して落ちるのを発見したのが始まり

--- --- --- --- ---
ここから愚痴

# どのバージョンの Rails だったら適応できるのかがわからない
調べていった中では

```rb:config/application.rb
config.assets.enabled = false
```
で解決するよ！ とか書いてあったけどデプロイしてもしてもそんな気配はゼロ
pipeline 無効化とか書いてあるけど、それと precompile って違うの？ pipeline と precompile の関係がよく分からないよ！

ドキュメントは豊富。でもバージョンも豊富。
しかも互換性少ないっぽいのが stackoverflow とかからもヒシヒシと伝わってくる。

# いや、init時以外でも気軽にオフにさせてくれ
ドキュメントの中では「プロジェクトを生成するときに `--skip-sprockets` オプションを指定すれば無効化できるよ！」とか書いてある。

```bash:terminal
$ rails new appname --skip-sprockets
```

。。。え、あれ？他に方法無いの？もっと気軽にオフにできないの？config とかで。
せめて Gemfile をに設定書いてパッケージをインストールし直したら外れた状態にできるよとか無いの？

# rake のタスクって。。。 いや、行行しくない？あんまりコンフィグ広げたくないんだけど
中には Rake のタスクだからこうやって上書きしちゃえばいいよ！みたいなのもあった。

```rb:lib/tasks/assets.rake
Rake::Task["assets:precompile"].clear
   namespace :assets do
     task 'precompile' do
     puts "Not pre-compiling assets..."
   end
end
```
うんまぁ一番堅実なのかもしれないけど、わざわざこんな仰々しい物書かなくちゃいけないの？
`config.assets.enabled = false` が効かないばっかりになんでこんなファイル書かないと行けないの？

# 多分 Rails 初心者あるあるの愚痴なんだろうなぁ
あと個人的に自動化とかが圧倒的にしやすくなってはいるんだろうなとは思いつつも rake コマンドは好きじゃなかった。

そんな感じの愚痴と備忘録
RedshiftのトランザクションのSerializable Isolation Violationエラーについて

#はじめに
初投稿ですw
観測した現象から推測して知見としてまとめてますので、違ってる可能性はありまーす。ご利用は自己責任でお願いします。もっと詳しいこと知ってたら、教えてエロい人

#発生原因と対処法
このエラーは以下のルールに違反するので発生する
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_serial_isolation.html

以下のトランザクションは
同時に実行しても直列化可能なので問題ない。


```
begin transaction;

delete from target 
using stage 
where target.primarykey = stage.primarykey; 

insert into target 
select * from stage;

end transaction;
```

しかし以下のようにテーブルへのselectなど、
何かしらの処理を行った場合は
ふたつ目のトランザクションで
Serializable isolation violationが発生し、
ロールバックしてしまった。

```
begin transaction;

select * from hoge limit 1;

delete from target 
using stage 
where target.primarykey = stage.primarykey; 

insert into target 
select * from stage;

end transaction;
```

恐らく処理を行う際に
データベースのスナップショットが作成され、
ひとつ目のtransactionのcommit後と差異が発生、
redshiftは直列化可能ではないと認識し
ロールバックするものと思われる。

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_serial_isolation.html
から引用
>同時トランザクションは互いに認識されません。互いの変更を検出できません。各同時トランザクションにより、トランザクションの始めにデータベースのスナップショットが作成されます。データベーススナップショットは、ほとんどの SELECT ステートメント、COPY、DELETE、INSERT、UPDATE、TRUNCATE などの DML コマンド、次の DDL コマンドの最初の発生時にトランザクション内で作成されます。

直列化可能に見えるが、redshiftちゃん的には
スナップショットから判断してNGらしい。。厳しい。。


なお
`select * from hoge limit 1;`
ではなく
`select 1;`
だと
データベースのスナップショットが作成されないようで
エラーは発生しない。

またtempテーブルは同じ名前でも処理ごとに別物なので
selectして更新しようが何しようが直列化可能なのでエラーは発生しない

#systemコマンドでsqlを流した場合とActiveRecordでsqlを流した場合のトランザクションの違い

以下のsqlをファイルに書き込んで、systemコマンド(psql ~ < sqlのファイル)で流した場合はトランザクションは全て別のものになる

```
select * from hoge limit 1;
select * from hoge limit 2;

begin transaction;
select * from hoge limit 3;
end transaction;

select * from hoge limit 4;

begin transaction;
select * from hoge limit 5;
end transaction;
SQL
```

しかし以下のSQLをActiveRecordで流した場合

```
sql = <<SQL
select * from hoge limit 1;
select * from hoge limit 2;

begin transaction;
select * from hoge limit 3;
end transaction;

select * from hoge limit 4;

begin transaction;
select * from hoge limit 5;
end transaction;
SQL

ActiveRecord::Base.connection.execute(sql)
```

トランザクションは以下のようになる

```
トランザクション1
select * from hoge limit 1;
select * from hoge limit 2;
select * from hoge limit 3;
```

```
トランザクション2
select * from hoge limit 4;
select * from hoge limit 5;
```

ActiveRecordの場合、begin transactionがない場合は勝手にbegin transactionを付加しているような挙動をするということである。(ActiveRecordのどこで行っているのか現在確認中 Adapter?)

**ActiveRecordでRedshiftに接続して使う場合は、この辺りを理解していないとSerializable isolation violationのワナにかなりハマりやすくなる**

#おまけ
最近ロールバックしちゃったトランザクションを確認できるSQL

```
select stl.*,sv.table
from stl_tr_conflict stl
left join SVV_TABLE_INFO sv ON stl.table_id = sv.table_id
order by abort_time desc limit 100;
```

特定のクエリのトランザクションID(xid)を確認

```
select starttime,xid, querytxt from stl_query
where querytxt LIKE '%select * from hoge limit 4%' 
order by starttime desc  limit 1;
```

特定のトランザクションのクエリを確認

```
select starttime,querytxt from stl_query
where xid = 5864985 order by starttime;
```
webscript.ioを使って RESTful APIを作成

# はじめに
webscript.ioとは、スクリプトを実装するだけで簡単にBackend Serverを作ることができるサービスです。Web APIを持ったBackend Serverを建てる場合、Web Serverの立ち上げが必要になりますが、webscript.ioを用いれば、サーバーをたてることなく実現することが可能です。

https://www.webscript.io/

サービスには有料版と無料版があり以下のような差分があります。

![スクリーンショット 2016-01-21 12.16.39.png](https://qiita-image-store.s3.amazonaws.com/0/85182/60704060-ccfe-13d8-26e5-b615b159f542.png)

7日間でEnd Point消えてしまいますが、ハッカソンやプロトタイピングには十分使用できるのではと思います。

# エンドポイントの作成
タブで"Script"に移動して、左下の"Create a new script"を押します。そこで適当なsubdomainとパスを指定して下さい。
![スクリーンショット 2016-01-21 12.31.56.png](https://qiita-image-store.s3.amazonaws.com/0/85182/9735627f-0ff8-4974-08c7-441f2c31bd91.png)

まずは、以下のような簡単にSuccessを返すScriptを書いて、BrowserでアクセスしてみるとSuccessが返ってくると思います。

![スクリーンショット 2016-01-21 12.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/85182/a25803f2-448d-745c-718b-3e740ffca11c.png)

# Storageを使用する
webscript.ioはtable型にデータを永続化させることが可能です。永続化には"storage"という変数を用います。nameという変数のデータを保存したい場合は、storage.name="XXX"という形で保存が可能です。以下のScriptのサンプルはPOSTのクエリーパラメータで指定した値を、次のGETの呼び出しで取得できるものになります。

```Xml
POST http://imiyatest.webscript.io/members?name=imiya
```
```xml
GET http://imiyatest.webscript.io/members
imiya
```
<img width="603" alt="スクリーンショット 2016-01-21 16.24.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/9e3a2947-8087-2977-b9ec-0393e6210953.png">

# POST/GETでメンバー登録、メンバー情報の取得ができるようにする
以下のようにPOSTメッセージでメンバー登録を行い、その後にGETでメンバーの情報を取得することを目指します。

```Xml
POST http://imiyatest.webscript.io/members?name=suzuki

HTTP/1.1 200
Content-Length: 29
Content-Type: application/json
Access-Control-Allow-Origin: *
Cache-Control: no-store

{"id": "3", "name": "suzuki"}
```

```Xml
GET http://imiyatest.webscript.io/members?id=3

HTTP/1.1 200
Content-Length: 29
Content-Type: application/json
Access-Control-Allow-Origin: *
Cache-Control: no-store

{"id": "3", "name": "suzuki"}
```

スクリプトは以下のようになります。まずstorageに総数を覚えておき、ユーザが追加される度にインクリメントしてそれをユーザーIDとします。GETではqueryされたidをキーとして、storageからユーザの名前を取得しています。

```js
function addData(name)
	storage.count = (storage.count or 0) + 1
	storage[storage.count] = name
	response = {id=storage.count, name=name}
	return response
end

function getData(id)
	response = {id=id, name=storage[id]}
	return response
end

if request.method == "GET" then
	return getData(request.query.id)
elseif request.method == "POST" then	
	return addData(request.query.name)
else
	return "Unknown"
end

```
【Leap Motion】JavaでLeapMotionからカメラ画像を取得する。そして保存する。

Leap Motionからカメラ画像を取得することができます。
Leap Motionから画像を取得する⇒画像ファイルとしてローカルに保存する、ということをやってみました。
なお、画像はグレースケールの状態です。

今回かなりはまってしまいました。。。

公式ページはこちら→[Camera Images](https://developer.leapmotion.com/documentation/java/devguide/Leap_Images.html?proglang=java)


#環境
OS:Windows
言語：Java
LeapMotionSDK：v2.3.1.31549
IDE：Eclipse

環境構築はすべて終わっているものとします。
[【Leap Motion】LeapMotionをEclipse+Javaで開発するための準備](http://qiita.com/chihiro/items/374232a2994eb0e9f50d)


#LeapMotionコントロールパネルでの設定
まずはLeapMotionから画像を取得することに許可をしなければなりません。
LeapMotionのコントロールパネルを開き、全般タブを開きます。
「イメージを許可する」にチェックを入れます。これでOKです。
この状態でビジュアライザーを開くと、白黒の写真が表示されるようになるはずです。

※LeapMotionのコントロールパネルは、Windowのタスクバーに出ているLeapMotionのアイコンを右クリックし、設定を選択すると立ち上がります。

#Javaプログラム

###POLICY_IMAGESフラグを設定
ControllerクラスsetPolicyメソッドを使用して、POLICY_IMAGESフラグを設定する必要があります。

```java:Main.java
Controller controller = new Controller();
controller.setPolicy(Controller.PolicyFlag.POLICY_IMAGES);
```

###画像データを取得する
画像データを取得します。
LeapMotionの画像の取得方法は2つあります。

①Controllerクラスのimagesメソッドを使い、ImageListを取得する
②Frameクラスのimagesメソッドを使い、ImageListを取得する

①の場合、取得できるのはもっとも最近の画像のリストです(LeapMotionにはレンズが2つついているので返り値は2枚の画像が入ったリストです)。
②の場合、取得できるのはこのFrameに関連する画像のリストです。
Frameから得られる画像の場合Frameの処理に時間がかかるので、Controllerから取得できる画像よりも前の時点の画像になるようです。

また、①の場合、ListenerクラスonImages()メソッドを実装して画像を得ることができます。
onImages()は新しい画像の準備ができ次第呼び出されます。

```java:LeapListener.java
@Override
public void  onImages (Controller controller){
    ImageList images = controller.images();   // 画像の取得
}
```

今回は①の方法を使用して画像を取得します。

ImageListはImage型オブジェクトを保持するためのListです。
取得したリストの中のインデックス0の画像が左カメラ、インデックス1の画像が右カメラの画像です。
Imageクラスdata()メソッドにより、Imageオブジェクトから画像のデータをbyteの配列として取得できます。

```java:LeapListener.java
@Override
public void  onImages (Controller controller){
    ImageList images = controller.images();  // 画像の取得
    Image leftImage = images.get(0);         // 左のカメラの画像
    Image rightImage = images.get(1);        // 右のカメラの画像
    byte[] imageData = leftImage.data();     // 画像データの取得
}
```

###画像データから画像ファイルを作成し保存する
上記で取得した画像データを画像ファイルとして保存します。

今回はsaveImageというメソッドを準備して、このメソッドの中で画像データを画像ファイルとして保存します。

```java:LeapListener.java
private void saveImage(Image img){
    BufferedImage bufImg = new BufferedImage(img.width(), img.height(), BufferedImage.TYPE_BYTE_GRAY);

    DataBuffer dataBuf = bufImg.getRaster().getDataBuffer();

    byte[] data = img.data();
    for (int i = 0; i < data.length; i++) {
        dataBuf.setElem(i, data[i]);
    }

    String imgFilePath = "~.png";　　// ご自身の環境にあわせて
    File imgFile = new File(imgFilePath);
    try {
        ImageIO.write(bufImg, "png", imgFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

```

BufferedImageクラスは、ColorModelおよびイメージデータのRasterで構成されています。
作成したBufferedImageからWritableRasterを取り出し(getRaster())、その中のDataBuffer(getDataBuffer())に値を入れることで、画像オブジェクトが完成します。
あとはこれを書き出してやればOKです！

画像データを取得するまではさくっといったのですが、画像の書き出しができなくて困っていましたが、やっとできました。
LeapMotionから取得した画像はゆがみ補正したりもできるので、次はそれもやってみようと思います。
【備忘録】Inodeのサイズ拡張するとき


NetAppのInodeが枯渇してしまうと新規でファイルを作成できなくなる。
このため、Inodeが枯渇しないように注意しないといけない。

下記にInodeサイズ拡張時のコマンドや事前事後のサイズ確認に使用するコマンドを整理する。

-

# 1.拡張するためのコマンド

以下のコマンドを実行することで、Inodeサイズ拡張が可能。

````コマンド
> maxfiles [Volume名] [拡張後TotalSize(byte)]
````

上記のコマンドを実行すると、下記のような出力がされます。

````実行例（6.5MBに拡張する場合）
> maxfiles vol1 6815744
The new maximum number of files will be rounded to 6815744.

````


-

# 2.事前事後状態を確認するためのコマンド

以下のコマンドを実行することで、Inodeサイズの使用率や残量の確認が可能。

````コマンド
> df -i

> maxfiles [Volume名]
````

-

おわり。
AzCopyを利用したAzureStorageのバックアップ

#問題
AzureStorageのBLOB/TABLEのバックアップをWorkerRoleなどから取る際、データ容量がデカイとBackUpに失敗する。

```エラー内容.
Manifest file for this export operation is: "xxx.manifest".
[ERROR] Failed to export Azure table. Detailed error: There is not enough space on the disk.
```
#原因
>worker または Web ロールの既定の一時ディレクトリの最大サイズは 100 MB
[クラウド サービスの Web/worker ロールに対する既定の一時フォルダーのサイズが小さすぎる](https://azure.microsoft.com/ja-jp/documentation/articles/cloud-services-troubleshoot-default-temp-folder-size-too-small-web-worker-role/)

#対応策
>ストレージ テーブル エンティティをストレージの Blob にエクスポートするとき、AzCopy はまずテーブル エンティティをローカルの一時データ ファイルにエクスポートし、次にそれらのファイルを Blob にアップロードします。このような一時データ ファイルは、既定のパス “%LocalAppData%\Microsoft\Azure\AzCopy” を持つジャーナル ファイル フォルダーに格納されます。/Z:[journal-file-folder] を指定すれば、ジャーナル ファイル フォルダーの場所を変更して、一時データ ファイルの場所を変更することができます。
[AzCopy コマンド ライン ユーティリティを使用してデータを転送する](https://azure.microsoft.com/ja-jp/documentation/articles/storage-use-azcopy/#azcopy-azure-1)


>ファイルの書き込みまたは読み取りが必要な場合に、インスタンスで実行されるコードからローカル ストレージ リソースにアクセスできるように、仮想マシンのインスタンスに情報を格納できます。
[ローカル ストレージ リソースを構成する](https://azure.microsoft.com/ja-jp/documentation/articles/cloud-services-configure-local-storage-resources/)

#実際のソース
ここではTableのバックアップ処理を例に


```ServiceDefinition.csdf
<LocalResources>
  <LocalStorage name="AzWork" cleanOnRoleRecycle="true" sizeInMB="100000" />
</LocalResources>
```

```workerrole.cs
public override bool OnStart()
{
    //念の為にいれたが、いらないと思う。
    customTempLocalResourcePath = RoleEnvironment.GetLocalResource("AzWork").RootPath;
    Environment.SetEnvironmentVariable("TMP", customTempLocalResourcePath);
    Environment.SetEnvironmentVariable("TEMP", customTempLocalResourcePath);
    return base.OnStart();
}
```

```call.cs
//Workerの場合
azpath = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\", @"approot\AzCopy\AzCopy.exe");
manifestname = table + DateTime.Today.ToString("yyyyMMdd") + ".manifest";
BkTable(table,azpath,manifestname,customTempLocalResourcePath);
```


```run.cs
public void BkTable(string table, string azpath,string manifestname,string _path)
{
    StringBuilder arguments = new StringBuilder();
    arguments.Append(@"/source:" + [sourcetable] + "/" + [targettable]);
    arguments.Append(@" /dest:" +  [destblob] + "/" + [destcontainer]);
    arguments.Append(@" /sourcekey:" + [sourcekey]);
    arguments.Append(@" /destkey:" + [destkey]);
    arguments.Append(@" /SplitSize:" + "100000"); //Roleに従う
    arguments.Append(@" /Z:" + _path ); //←ここでLocalStorageを指定
    arguments.Append(@" /manifest:" + manifestname);

    ProcessStartInfo info = new ProcessStartInfo
    {
        FileName = azpath,
        Arguments = arguments.ToString(),
        UseShellExecute = false,
        RedirectStandardInput = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        ErrorDialog = false,
        CreateNoWindow = true
    };
    using (Process proc = new Process())
    {
        //エラー処理など割愛
        proc.StartInfo = info;
        proc.Start();
    }
}
```
HTTPとHTTPSの比較


**htmlもしくは jsonなどAPIレスポンスでの効果検証
複数の画像ダウンロードされた場合の http　との比較**

**画像**
http：
└ proxyからキャッシュあり：14.92
└ proxyからキャッシュなし：16.42

http-ssl：
└ proxyからキャッシュあり：7.62
└ proxyからキャッシュなし：8.43

http2-ssl
└ proxyからキャッシュあり：5.56
└ proxyからキャッシュなし：5.75

**htmlもしくはJSONレスポンス**
http
└ proxyからキャッシュあり：0.311
└ proxyからキャッシュなし：0.368

http-ssl
└ proxyからキャッシュあり：0.302
└ proxyからキャッシュなし：0.350

http2-ssl
└ proxyからキャッシュあり：0.278
└ proxyからキャッシュなし：0.297


## proxyからキャッシュあり
```
|            | http        | http-ssl     |http2-ssl |
|:-----------|------------:|:------------:|:---------|
| Image      |       14.92 |      7.62    |      5.56|
| Text       |       0.311 |      0.302   |     0.278|
```

## proxyからキャッシュなし
```
|            | http        | http-ssl     |http2-ssl |
|:-----------|------------:|:------------:|:---------|
| Image      |       16.42 |      8.43    |      5.75|
| Text       |       0.368 |      0.350   |     0.297|
```


**http**
![http.png](https://qiita-image-store.s3.amazonaws.com/0/103998/8798b801-5657-8942-526e-f4a16215c598.png)

**http-ssl**
![http-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/103998/e6f60db7-17a7-6ca1-8867-9069195b96f1.png)

**http2-ssl**
![http2-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/103998/f3176465-a7b4-08c3-bf52-99eafe120740.png)
RequireJS,Browerify,webpackってそもそも何なの？という人向けのまとめ

# 前提
小規模なJavaScriptのサイトの場合、JQueryを使ってDOMイベントをトリガーにいろんな処理を行ってDOMに反映する。というような処理が多い。このままだとDOMにしか情報を保持していない状態になり、ビューとデータが混在した状態になる。

```js
$(function() {
  // イベントハンドラ
  $("#button").on("click", function(){
    $.ajax({
      url: url,
      dataType: "json",
    }).done(function(results){
      // 表示
      $.each(results, function(result) {
        $('<li>')
          .text(result.name)
          .appendTo("#list")
          .on("click", function(){
            //何かしらの処理
          });
      });
  });
});
```

最初のうちはこれでも大丈夫だが、少し処理を追加していくとわけがわからなくなってくる。そのため、規模が大きくなってくるとビューとデータを分離させて俗にいうMV*の構成にして実装する必要がある。

またunderscore.jsやmoment.jsなど外部のモジュールを使いたいことも多い。

外部のモジュールや自分のモジュールを分割していくと、モジュールの依存関係が発生する。(例:Backbone.jsはunderscore.jsに依存)

それらの依存関係をブラウザの実行時やファイル結合時にうまく解消する必要が出てくる。

# 従来の解決方法
JavaScriptにはサーバーサイド言語にあるようなモジュールの定義や他のモジュールを読み込む仕組みが言語仕様として用意されていない。そのため、通常は依存関係を考えてscriptタグを順番に並べたり、順番に結合したりする。

ある程度の規模の場合は、concatで必要なJSファイルを結合していって十分な場合は多い。実際、業務アプリケーションをAngularJSで以前作っていたがその時はGruntでconcatしてビルドしていた。

参考URL: Concatだけでビルドを済ませてた例（Backbone.jsとAngularJS） ::ハブろぐ https://havelog.ayumusato.com/develop/others/e613-concat_build_pattern_examples.html

ただし、ES6でもモジュール機構が標準で実装されているし、コンポーネント指向といった考えも出てきていて今度はモジュール単位に分割したものを再利用する流れが主流になってくると予想されるため、モジュール管理した開発手法に慣れておくのは重要だと思う。

# CommonJSとAMD
モジュール定義と依存解決のAPI仕様(スタイル)としては大きく2つがある。それがCommonJSのModuleとAMD

JavaScriptは元々クライアント側の言語だが、普及するにつれてサーバーサイドもJavaScriptで書きたいという需要が増えてきた。

最初のうちは開発者が自分でAPIの仕様を決めて実装していたが、そのうち共通の仕様を決めようという流れが起きた。それがCommonJS。

当初はサーバーサイド(ServerJS)というAPI仕様だけを定めていたが、その内それ以外の仕様も含めようとなり、CommonJSに改名された。

モジュールの仕様に関してはCommonJSで策定されたわけではなく、Node.jsの実装が先行し、それがCommonJSに採用された形。

そのためCommonJSのモジュールを説明するときにNode.jsのコードが説明に持ち出されることは多い。例えば以下のようなコード。

```js
# human.js
module.exports.getFullName = function() {
  //
};

# action.js
var fullName = require('human').getFullName;
exports.sayHello = function() {
  return 'Hello' + fullName;
};

# main.js
require('action').sayHello;
```

このCommonJSのモジュール仕様にそって書いたJavaScriptをブラウザ上で動かせるようにしたモジュールシステムがBrowserify。

Browserifyは実行時にrequireに指定されたモジュールを読み込むというアプローチではなく、事前にrequrie部分を書き換えるビルドプロセス。依存関係もこの時に解決する。

# AMDとは
AMDはAsynchronous Module Definitionの略で、モジュールを非同期でロードする仕組みやAPI定義のことを指す。

AMDも元々、CommonJSで仕様を決めていたが、決まりきらず別グループに移動し策定された。

AMDの仕様を実装したのが、RequireJS。
RequireJSのモジュール定義と読み込みは以下のようなコード

```js
# util.js
//モジュール定義
define(function() {
  //定義するモジュールを持つオブジェクトを返す
  return {
    add: function(a, b) {
      return a + b;
    }
  }
});

# main.js
// 読み込み
require(['util'], function(util) {
     var result = util.add(10, 21);
     console.log('10 + 21 = ' + result);
});
```

Browserifyとは異なり、ビルドで依存関係を解決するのではなく、実行時に依存関係を解決する。

RequireJSはモジュールシステムではかなり、先駆け的な存在だが、Node.jsの普及もあり、CommonJSスタイルで書けるように(Browserify or webpack)などで書く方が主流になりつつあるらしい。

# webpackとは

webpackとはRequireJSやbrowserifyの後発のモジュールシステムでCommonJS、AMD両方の書き方があり、色々便利な書き方が出来るらしい。今後触ってみたい。

# 最後に
非同期ロードについて、非同期でJavaScriptを読み込むのでDOM構築を邪魔しない？くらいにしか理解できていないので、そこに関しては別記事にまとめたいと思う。
今cURLで並列処理を書くならジェネレータを使え！

# はじめに

PHPでのcURLを用いたHTTPリクエストの並列処理，全てが完全な並列でよければ`curl_multi_*`関数群を使って「[複数のRSSに並列リクエスト後マージして返す関数](http://qiita.com/mpyw/items/77288c948b64eab1a3b3)」の例のようにサクッと書けちゃうんですが，**部分的に直列化したい**ケースが入ってくると一気にハードル高くなりますよね．

例えばこんな要件．これを「出来るだけ並列に効率よくやってください」って言われたらすぐ書けるでしょうか？あ，`pcntl_fork()`とかは禁止で．

<ul>
  <li>
    <ol>
      <li> <code>https://google.com</code> のHTMLを取得
    </ol>
  <li>
    <ol>
      <li> <code>https://github.com</code> のHTMLを取得
      <li> このバイト長を取得
    </ol>
  <li>
    <ol>
      <li> <code>https://github.com/mpyw</code> のHTMLを取得
      <li> XPathでプロフィール画像のURLを抜き出す
      <li> 更に画像に対してリクエストを実行し，レスポンスを画像ファイルとして保存する
    </ol>
</ul>

**`mpyw/co`** を使えば非常に直感的に書くことが出来ます．

- **[GitHub - mpyw/co](https://github.com/mpyw/co)**

```php:PHP&#32;5.5~5.6,&#32;7.0+&#32;共通関数
function curl_init_with($url, array $options = [])
{
    $ch = curl_init();
    $options = array_replace([
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
    ], $options);
    curl_setopt_array($ch, $options);
    return $ch;
}
function get_xpath_async($url) {
    $dom = new \DOMDocument;
    @$dom->loadHTML(yield curl_init_with($url));
    return new \DOMXPath($dom);
}
```

```php:PHP&#32;7.0+&#32;からの呼び出し
var_dump(Co::wait([
    "google.com HTML" => curl_init_with("https://google.com"),
    "Content-Length of github.com" => function () {
        return strlen(yield curl_init_with("https://github.com"));
    },
    "Save mpyw's Gravatar Image URL to local" => function () {
        $xpath = yield get_xpath_async('https://github.com/mpyw');
        $src = $xpath->evaluate('string(//img[contains(@class,"avatar")]/@src)');
        yield curl_init_with($src, [CURLOPT_FILE => fopen('/tmp/mpyw.png', 'wb')]);
        return "Saved as /tmp/mpyw.png";
    },
]));
```

```php:PHP&#32;5.5~5.6&#32;からの呼び出し
var_dump(Co::wait([
    "google.com HTML" => curl_init_with("https://google.com"),
    "Content-Length of github.com" => function () {
        yield Co::RETURN_WITH => strlen(yield curl_init_with("https://github.com"));
    },
    "Save mpyw's Gravatar Image URL to local" => function () {
        $xpath = (yield get_xpath_async('https://github.com/mpyw'));
        $src = $xpath->evaluate('string(//img[contains(@class,"avatar")]/@src)');
        yield curl_init_with($src, [CURLOPT_FILE => fopen('/tmp/mpyw.png', 'wb')]);
        yield Co::RETURN_WITH => "Saved as /tmp/mpyw.png";
    },
]));
```

備考: [CURLOPT_*のデフォルトオプション結合の罠](http://qiita.com/mpyw/items/d279ea2e971d110059eb)

今回はcURLリソースで割りきってPromiseインタフェースは使わないことにしたのですが，JavaScriptの[tj/co](https://github.com/tj/co)あるいは`async/await`を用いたコードによく似ていることがわかります．PHPでも頑張ればここまで出来るんです！

# 仕様

仕様はGitHubのドキュメントに英語で書いてあるので割愛します（オイ
1000万件のSHIFT-JISのやんちゃさんをコマンドラインだけでUTF-8に文字処理する

久しぶりにSJISファイルなんか変換しちゃったりして、しかもそれが1Gのファイルで1000万件ある。

普段オープン系のプログラマでは日常的な文字コード変換かもしれない。

カチャカチャッターン流では

"1Gのshit-jis で日本語 の織り交ざったテキストファイルを、文字コードをutf-8にしてひらがな部分を全角カタカナに統一する"のをワンライナーでやりきってみた。

　(最後の tr- d は理論上不要なのにオマジナイとしてあると幸せかもしれない)

```
zcat textfile.gz | nkf -w -Z -Lu --katakana | tr -d "\r" > result.txt
```

ワンライナーとはいえ、準備で何回かッターン!ッターン!して周囲をイラつかせた、おまじないが必要な理由が知りたい人は下へ読み進んでほしい。

## nkf 先生の登場

久しぶりに使ったら、7系にはyum にないんだって
Amazon Linux AMI 2015.09.1 (HVM)

親切な方のメモから、6系のパッケージで問題ないとのこと。

`sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm`

オプションですべて事足りるはずだった。

### utf に出力する

`-w`

### 都合により、全角カタカナに統一

`--katakana`

### 改行は UNIX(LF)

`-Lu`

### 英数字を半角に変換

`-Z4`

## 結果、やんちゃっぷりを発揮してくれた
- もともとはわりと色々な記号や全角半角があったSHIFT-JIS(分かち書きしてあったはず。。)
- nkfのみの変換の結果、改行でないところにCRが途中に混入していたりして?。。元ファイルをみても変な文字はない。改行コードもLFに変換指定しているので、バグ?
- でもそのファイルを使用するとプログラムがエラーになる。
- rU (universal new Line ) にしてもエラーになるので最後の手段


## おまじないが効いた

だいたい、CR 改行文字があるよ、って言われるので(抜いてるはずなのに)
sed でやってみたりしたけど、なぜか引っかからない

```
 tr -d "\r"
```

これで最強だった.

## 副産物

PHPだったら、たしか変な変換はしないよね、とおもって確かめてみたかったときに、パイプでコマンドラインから　巨大なgzファイルの最初の10行を開いて、1行ずつ　パイプで標準入力を処理するHACKを閃いた

`sudo yum install -y php php-mbstring`

これでphp.iniにもすでにmbstringが有効になってるので、なにもせずに下記のコマンド。

```
zcat filename.gz | head | php -r ' echo mb_convert_kana( fread(STDIN, 4096)))'
```

4096バイトしか読むことができないけど、1行にそんなにないので、おもむろにfread に渡す
gz を開かないまま色々としたい時にちょっと便利
ASP.NET Core MVCにカスタムモデルバインダーを追加する

ASP.NET 5から名称がASP.NET Core 1.0になったりと、betaから追いかけていると変更には慣れっこでしたが、RCになってからも振り回されましたね。  
ASP.NET MVC 5で追加していたカスタム機能をASP.NET Core MVC 1.0でも実現してみました。

#MVCモデルバインディングのカスタマイズ
まずはこれ。
FormからのPOST等で、ユーザが入力した値をモデルクラスのインスタンスで受け取ることができて便利です。  
MVC5では、カスタム版ModelBinderを追加することで「1,024」のようなカンマ区切り数値をdecimal型のプロパティにバインドすることができました。  
過程をすっ飛ばして、カスタム版モデルバインダーを追加するサンプルはこちら。
[https://github.com/shimitei/ConvertModelBinder](https://github.com/shimitei/ConvertModelBinder)
ASP.NET Core MVCはオープンソースなので、とりあえずソースを見ればなんとかなります。

#ConvertModelBinderとは？
ASP.NET Core MVC用のカスタムモデルバインダーです。 decimal(decimal?)型プロパティへのバインドを拡張します。  
例えば「1,024」を数値の1024としてバインドすることができます。  
注意点としては、入力値の変換はConvert.ToDecimalで行っていることです。実行時のカルチャ（ロケール）の影響を受けます。

#RC1での実装内容
実装部分の解説です。
モデルバインダーのクラスは、IModelBinderを継承します。
このインターフェースはメソッドを1つ持っているだけなので、このBindModelAsyncメソッドを実装するだけです。  
メソッドの処理内容としては、バインド先の型を確認して自分の担当の型であれば入力文字列を対象の型に変換して返します。
自分のバインド対象の型でなければ、決まった値を返すことで他のモデルバインダーに処理が移るようになっています。ModelBindingResult.NoResultAsync以外の値を返すと、他のモデルバインダーには処理が回らないことになります。  
モデルバインダーはシステムに追加された順番がバインド処理の優先順位のようなので、今回のカスタムモデルバインダーは標準のモデルバインダーよりも優先させる必要があります。（標準のモデルバインダー処理でdecimal型プロパティへバインドされてしまう。）  
カスタムモデルバインダーをシステムに登録するには、Startup.csのConfigureServicesで次のように設定します。

```C#
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        // Add this
        options.ModelBinders.Insert(0, new ConvertModelBinder());
    });
}
```

#RC2への変更に対応
結構変わってるじゃないですか... 

RC2からはモデルバインダーを直に登録せずに、代わりにカスタムモデルバインダー用のプロバイダーを登録します。プロバイダーの方でバインダーが対応している型なのかをチェックする仕組みになりました。 
RC2とRTMではStartup.csのConfigureServicesで次のように設定します。

```C#
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        // Add this
        options.ModelBinderProviders.Insert(0, new ConvertModelBinderProvider());
    });
}
```

また、RC2以降はこのカスタムモデルバインダーを追加しなくてもDateTimeへのバインドはConvert.ToDateTimeを通したように動作します。このためConvertModelBinderのRC2対応版ではdecimalへのバインド処理のみ行うように変更しました。 

#1.0 RTM対応
ようやく正式リリースですが若干変更があり、モデルバインダーのバインド処理の成否の返し方が変更されています。  
RC2では成否を明示的に記述していましたが、バインド結果が返されるかどうかで判るためか簡略化されています。詳しくはConvertModelBinderのソースコードを参照ください。  
[https://github.com/shimitei/ConvertModelBinder](https://github.com/shimitei/ConvertModelBinder)
httpsへ強制リダイレクトするコピペ用RewriteRule（ELBやCloudFront対応）

```apache:.htaccess
# force https
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !=https
RewriteCond %{HTTP_HOST} !=unsecure.example.com
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
```

- mod_ssl 判定は `%{HTTPS}` で行う。
- ELBなど一般的なリバースプロキシで https してるときは `X-Forwarded-Proto` ヘッダを見る。
- CloudFrontの場合は `CloudFront-Forwarded-Proto` ヘッダを通す設定をしたうえでそれを見る。
- https リダイレクトしたくないホスト名がある場合は Host ヘッダを見て除外。
- RewriteRule はパスマッチの頭に `^/?` を付けておくと `httpd.conf` 直書きでも `.htaccess` でも使えるようになるのでコピペが捗る。

あと、個人的にはあまり使わないが Host ヘッダを通さずに X-Forwarded-for の方を採用したい場合は Host ヘッダの代わりにそっち使うようにスべし。その場合 X-Forwarded-Forは複数経由して増える場合があるのでその考慮を忘れないこと。（コピペメモは省略、後で追記するかも）

## RewriteCond が多い時のTips
`RewriteCond` の第1引数って只の文字列なうえに複数変数とか列挙出来るので例えば上記のケースは以下のようにまとめることが出来る。

```apache
RewriteCond %{HTTPS},%{HTTP:X-Forwarded-Proto},%{HTTP:CloudFront-Forwarded-Proto} !(on|https)
RewriteCond %{HTTP_HOST} !=unsecure.example.com
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
```

個人的に縦に長い条件って読みにくいので結構捗る。
Promiseをcancelする

Promiseをキャンセルしたい場面は多々あるけどES6のPromiseはキャンセルをサポートしていない。
bluebirdのPromiseならキャンセルできる。

```js
var Promise = require("bluebird");
Promise.config({cancellation:true});

var promise = Promise.delay(500).then(()=>{
	console.log('called');
});

promise.cancel();
```
Rubyプロジェクトの循環的複雑度を計測する

# 循環的複雑度(Cyclomatic Complexity)とは
> プログラムの複雑度を測るのに使われる。プログラムのソースコードから、線形的に独立した経路の数を直接数える。(Wikipediaより)

とある。分岐等の数を計測し、どれだけリスクが低いプログラムかを定量的に評価でき、一般的に下記のような線引きがあるようである。

|複雑的循環度|評価|
|:-:|:-:|
| ~ 10| シンプルでよい構造。バグが入りにくい  |
|21 ~ |構造的にリスクを伴う複雑さ。バグ入りやすい|
|50 ~|この域になるとテストが不可能になる|
|75 ~|98%の確率でバグが入る|


ということで、ためしにRubyのソースを計測してみた。

# Rubyプロジェクトで循環的複雑度を計測する
## インストール
今回はgithubで公開されているSaikuroというツールを使って計測を行ってみる。
https://github.com/metricfu/Saikuro

```
gem install metric_fu-Saikuro
```

## 使い方
いたってシンプル。
このコマンドを実行すれば解析後の結果をhtmlとして出力してくれる。

```
$ saikuro -c -i {対象ディレクトリ} -o {解析結果出力先ディレクトリ}
Parsing xxxxxx.rb
Parsing yyyyyy.rb
Parsing zzzzzz.rb
$
```

複数のディレクトリを一気にやることも可能。

```
$ saikuro -c -i {対象ディレクトリ1} -i {対象ディレクトリ2} -o {解析結果出力先ディレクトリ}
Parsing xxxxxx.rb
Parsing yyyyyy.rb
Parsing zzzzzz.rb
・・・
$
```

実行後に-oで指定したディクトリにhtmlファイルが出力される。

```
xxxx.rb_cyclo.html
index_cyclo.html
```

## 実行結果
上記で解析したhtmlファイルを開くとこのような感じになる。
index_cyclo.html
![index.png](https://qiita-image-store.s3.amazonaws.com/0/29379/c99a2599-64ce-857d-4eab-290bf289a6fb.png)

* Errors and Warnings
ErrorとWarningが出ているクラスの一覧(複雑度が高いやつっぽい？)

* Analyzed Files
解析したファイル一覧

indexのリンクから更に細かい部分が確認できる
![cyclo_1.png](https://qiita-image-store.s3.amazonaws.com/0/29379/52cd087a-8f48-9bbe-1d9e-dd68318a2529.png)
  
![cyclo_2.png](https://qiita-image-store.s3.amazonaws.com/0/29379/c0c5a944-9e30-7da5-f3ce-ec5dc3b75696.png)

循環的複雑度は、低ければ低いほどメンテナンス性やテスタビリティが高くなるため、定期的に計測をしてみたい。
bigqueryにおけるスキーマ管理の悩みとUNIONの性質について

まず、結論を先に書いておくと、全然解決してなくて、今も絶賛悩み中です。

bigqueryにデータをロードする時、1テーブルに全データを投入し続けていくと1クエリで読み込むデータがどんどん大きくなり課金額が上がってしまう。(bigqueryはWHERE句等に関わらず常にテーブルの全行を読み込む)
なので、日付毎や何らかのキー毎にテーブルを分けるというのが割と良くあるユースケースになっている。
それを支援するために、テーブルワイルドカード関数が用意されていたり、テーブルのUNIONが`,`で区切るだけで記述できたりする。

最初勘違いがあったのだが、bigqueryはテーブルレベルでスキーマが異なっていても、クエリで利用するカラム名と型が一致していればUNIONできるという性質を持っている。
まあ、よくよく考えれば当たり前で、普通のRDBでUNION句を利用しても同じことなのだが、bigqueryのクエリ記述上、テーブルワイルド関数とか`,`区切りのUNIONで、あんまりそれが可能なように見えなかった。

```sql
SELECT id, user_id FROM TABLE_DATE_RANGE(dataset.post, TIMESTAMP('2016-1-1'), TIMESTAMP('2016-1-15'))
```

こういうクエリの時に、post20160110辺りからスキーマが変更されていても、クエリで利用しているカラムさえ一致していれば問題無い。
まあ、当たり前っちゃ当たり前である。

ちなみに、もしカラムを減らす場合には`ignoreUnknownValues`を付けておかないと、既存の余計なカラムを含んだデータをそのまま送っているとエラーになる。

問題はカラムを増やした場合の過去データの扱いである。
過去のデータ量が大量になってくるとデータを入れ直すってのは、かなり辛い仕事になりそうだ。
やるにしても、一回GCSにextractしてembulkか何かで加工しながらbigqueryに戻すって感じになるんだろうか。

後考え付くのが、テーブルを別テーブルにCOPYしてオリジナルを削除し、同じ名前でViewを作り直すという方法。
Viewの作成とCOPYジョブは割とすぐ終わるので、API叩くスクリプトを書けばそこそこの時間で終えられそう。
お金もかからない。
問題は、変更が積み重なってくるとViewの編集が辛くなりそうっていう点か。

そもそも、そんな事をするぐらいなら最初から投入後のデータを直で使うのではなく、一回Viewでラップしておくのが良いのではという気もする。見た感じのテーブル量が倍になってしまうが、将来的にカラムが増えたり減ったりした時も、クエリ文字列の編集だけでとりあえず乗り切れる気がする。
(今更そんな感じにするのはちょっと面倒なのだが……。)


もしかしたら、bigqueryはガンガンViewを活用していくのが正解なのかもしれない。
とりあえず、あるテーブルを別名のテーブルに退避して、ビューに差し替えるってのは使い道がありそうな気がする。
RewriteBaseについて調べてみた

RewriteBase は、 mod_rewrite で使用するもの。

```
記述例1
RewriteBase /

記述例2
RewriteBase /test
```

マルチドメインかどうかによって、設定の要否がかわる？

＜参考になったページ＞
http://ysklog.net/server/mod_rewrite/1427.html
Ansible 2.x は connection local にバグがある

経緯とかは後で書くとして、こちらがソース

https://github.com/ansible/ansible/issues/13624

対応策としては `ansible_connection = ssh` を使って localhost でも ssh 接続にすれば解決する。

# 経緯
## 今までセットアップできてたのに突然落ちるように
自分のメインのPCとして Ubuntu をデスクトップに突っ込んでいて、最近 Ansible でセットアップができるようにしようとコツコツと playbook を作っていたのだけど、今日久々に内容を更新して実行したら

```
fatal: [127.0.0.1]: FAILED! => {"failed": true, "msg": "ERROR! privilege output closed while waiting for password prompt:\nBECOME-SUCCESS-ivlqlqubbijeusfhqiyftxjknfjzqgbm\n{\"invocation\": {\"module_args\": {\"executable\": null, \"name\": \"gulp\", \"global\": true, \"ignore_scripts\": false, \"state\": \"present\", \"production\": false, \"registry\": null, \"version\": null, \"path\": null}}, \"changed\": false}\n"}
```

なんてエラーが出てきた。

`priviledge output closed while waiting for password prompt`
とか出てるけど、 `--ask-become-pass` でパスワードは渡してるから何がなにやら。

## ごにょごにょ調べるも中々見つからず
似たような文は当たるけど `--ask-sudo-pass` の仕方が悪いよ〜みたいなもので、今回とはちょっと違うのしかヒットしない。

## 多分 Ansible 2.0 に変えたのが原因
今までは平気だったのに突然ダメになるんだから何か原因があるんだろうって考えたらどう考えても Ansible 2.0 にしたのが原因だろうなと気づいたので `ansible 2` みたいなキーワードも入れて調べてみたら[こんな](https://github.com/ansible/ansible-modules-core/issues/2552)記事を発見。
ちょうどこのエラーが起きてるところは `with_items` 使ってるし怪しい -"- と思い見てみると案の定の様子。

```
An evidence is that the playbook above works finewith localhost ansible_ssh_host=127.0.0.1 setting 
in the inventory instead of localhost ansible_connection=local.
```

とあったので `ansible.cfg` で `ansible_connection = local` としていた部分を `ansible_connection = ssh` にしてもう一度実行したらうまく動作してくれた。

まだ issue は開いているけどプルリクはマージされてるみたいだから近々修正されてくれることを期待してる。

そんな感じで
YAMLで空の配列を表現する

YAMLで設定ファイルを書いていて、空の配列を書く場合どうやるのか調べたのでメモ。


```
files:
  - a.txt
  - b.txt
  - c.txt
```

例えばこのようなYAMLのfilesを空の配列にしたいと思うわけです。

```
files:
```

このように書くとfilesがnullになってしまうのでNG。


```
files: []
```

こう書くことで、空の配列として認識してくれるようです。
php の viewファイルに <?php と書かずに <?=$area ?> などで出力させる方法　short_open_tag 

PHPのview ファイル （html)に、PHPの記述をするときに、

本来であれば、<?php の記述が必要になる。

ところが、そのまま変数を表示するときなど　php の文字が入っていると見にくい。

<?=$area ?> など　php を省略して書ける書き方がある。

.htaccess 
の一番上の行に
<pre>
php_flag short_open_tag ON
</pre>
と記載すればよい。

設定の変更を確認するには、viewファイルで、

<?php phpinfo(); exit; ?>

として出力させるとPHPの設定情報が出力される。

このphpinfo で　short_open_tag の確認をすればよい。

ただし、条件式などを書いたり、<?= でそのまま出力させないときは、
PHPであることを明示するために、<?php と書いた方がよさそう。　
・・・その方がNetBeansとかで色も変わって見やすいです。
CentOS7（1511）はCentOS7.2と呼ぶのか

## 背景
CentOS7.1ってないの？って探していたら、そもそもバージョンのふりかたが変わっていたのであった

### 結論
- RHEL7.0 -> CentOS7(1406)
- RHEL7.0 -> CentOS7(1503)
- RHEL7.1 -> CentOS7(1511)

とのことだった。
つまり、今後は、7.xとは呼ばないようだ。

#### しかし、CentOS7.2と呼ぶことがありそうだ
- RHEL7.0 -> CentOS7(1406) -> CentOS7.0
- RHEL7.0 -> CentOS7(1503) -> CentOS7.1
- RHEL7.1 -> CentOS7(1511) -> CentOS7.2

こう判断しているVirtualboxイメージがあったので起動してみた。

---

### サイト情報
* 公式：[Release Notes](https://wiki.centos.org/Manuals/ReleaseNotes/)
 * CentOS7(1503) -> CentOS7(1511) 

### RHELを参考にすると

* 参考：[「RHEL 7.1」ベースの「CentOS 7（1511）」リリース](https://thinkit.co.jp/news/bn/8524)
 * 引用

```
The CentOS Projectは12月14日（現地時間）、Red Hat Enterprise Linux 7.2をベースとしたクーロンOS「CentOS 7（1511）」を正式リリースした。対応アーキテクチャはx86_64のみとなっている。
```

よって、CentOS7.1という名前のイメージはなさそう。と、探していて思ったのであった。

### おまけ
* このとき、イメージを探したいときに管理はどうしてんだろう？となった

### 例）puppetlabsのCentOS7(1511)にあたるイメージが欲しいとなったとき
* [Atlas by HashiCorp](https://atlas.hashicorp.com/puppetlabs)よりvirtualboxイメージ欲しいなと探したら
 * [puppetlabs/centos-7.2-64-puppet](https://atlas.hashicorp.com/puppetlabs/boxes/centos-7.2-64-puppet)
 * 突然の `puppetlabs/centos-7.2-64-puppet`
* 分岐に苦労していたのであった。
 * [update networking params to support CentOS 7.1 and 7.2](https://github.com/heathseals/puppetlabs-packer/commit/2db072de6dade675540f03f3902fc5cc1b9b0d81)
 * 1406 -> 1503 -> 1511 だから、仕方ないよね ... 

#### virtualboxで起動して確認すると
* Vagrantfile

```yaml
% cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "puppetlabs/centos-7.2-64-puppet"
  config.vm.hostname = "test001"
  config.vm.network :private_network, ip: "192.168.0.123"
end
```

* `vagrant up && vagrant ssh`

```
[vagrant@test001 ~]$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

CentOS7.2だった。なるほど。
今後は、どう呼べばいいんだろう。
管理者権限が無くてもPowerShellのスクリプトを実行できるようにする方法

Windowsを使い慣れていない人向けなので、普段からWindowsを使っている人には当たり前のことかもしれません。

いろんなしがらみの影響で管理者権限が与えられていないWindowsで業務を行なうということがある人もいると思います。

そういった業務を行なう際にもっと自動化をしたくなることもあるかと思います。Windowsの場合は(よほど古いバージョンで無い限り)標準でPowerShellという強力な環境が付いているのでこれを活用できますが、上記のように管理者権限を与えられていない場合、巷にあるような`Set-ExecutionPolicy`による実行ポリシーの変更が効かず、断念されている方もいるのではないでしょうか？

そういった環境下でもPowerShellを使える(はずの)やり方があるのでメモします。

(はず)と書いたのは、いつの間にか私の環境でのデフォルトの実行ポリシーが`Bypass`になっていて、`Restricted`の環境下で本当に使えるかどうか不明だからです。

# オプションをつけて起動する

答えは簡単で、PowerShellを起動する際に`-ExecutionPolicy`オプションをつけてあげればいいだけです。

```bash
D:\Users\taku>powershell -ExecutionPolicy RemoteSigned
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS D:\Users\taku> Get-ExecutionPolicy
RemoteSigned
```

`-ExecutionPolicy`に実行したい権限を指定してあげてPowerShellを起動させれば上のように指定した権限が適用されます。

後は実行したいスクリプトを選んで実行させればいいだけです。

応用として、PowerShellのショートカットのプロパティのリンク先を下のように変更してあげれば、ショートカットから希望の実行ポリシーでPowerShellを立ち上げられます。

![property-of-powershell.png](https://qiita-image-store.s3.amazonaws.com/0/13150/642f1410-4ddc-a0b0-a16b-7ac5dac69b81.png)
Android 6.0 (compileSdkVersion 23) で、DefaultHttpClient が使えなくなった場合の対処法

# 背景
Android Studio 1.5.1を用いて、新規にプロジェクトを作成し、HTTPサーバと通信するために、カスタマイズ可能な、Apache HTTP ライブラリを使おうとしたら、使えない！なんでだろうと調べて見た結果、Android 6.0(SDK 23)で、削除したとのこと！

# 環境
Android Studio 1.5.1 (OSX版）
compileSdkVersion 23

# 対処方法
build.gradle ファイルに、useLibraryを指定します。

```lang:build.gradle
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    useLibrary 'org.apache.http.legacy'

...省略

}
```

# 対処した後の画面

![160121-0001.png](https://qiita-image-store.s3.amazonaws.com/0/33220/25656d83-7e09-eba5-dc79-d2229a29d8df.png)

推奨しないからって、線だらけになってしまいます・・・・

以上、ご参考までに