OmniAICreator/Qiita-1.07M huggingface dataset:
Powershellスクリプト 例外処理の罠

#はじめに
Powershellで大き目の規模の自動化スクリプトを開発する際のエラーハンドルではまりやすいところ

##例外ハンドルについて
Powershellスクリプトで例外をcatchする場合は以下のとおり記述します。

```test.ps1
try{
    #write some code
}catch{
    #write some code if error occured
}finally{
    #write some code
}
```

しかし、Powershellでは.NetのPowershellのコマンドレットだけでなく、net useのようなコマンドを利用することがあります。

この場合、以下のように記述してもエラーをハンドルできません。

```test.ps1
try{
    net use \\hostname\share password /user:user
}catch{
    Write-Error("エラー"+$_.Exception)
}finally{
    #write some code
}
```

これは、netuse.exeを実行した結果を文字列で出力されるだけで、エラーを扱うには一工夫必要です。
また、ファイル操作系のコマンド実行でもエラーがcatchされないことがありました。


```test.ps1
try{
    Move-Item -Path "SrcPath" -Destination "DstPath"
}catch{
    Write-Error("エラー"+$_.Exception)
}finally{
    #write some code
}
```

##① エラー判定
###環境変数「$LASTEXITCODE」を利用する

例としてnet useコマンドを例に挙げましたが、.exeファイルの実行後、Powershellの環境変数である$LASTEXITCODEに値が格納されます。

一般的には、正常終了していれば0が格納されており、以下のようにできます。

```test.ps1
try{
    net use \\hostname\share password /user:user
    if($LASTEXITCODE -ne 0){
        throw
    }
}catch{
    Write-Error("エラー"+$_.Exception)
}finally{
    #write some code
}
```

ただ、これが使えるのは外部スクリプトの実行の場合なので、上記ファイル操作系のコマンドには利用できません。
なので、ファイル操作系は以下のオプションを利用します。

```test.ps1
try{
    Move-Item -Path "SrcPath" -Destination "DstPath" -ErrorAction Stop
}catch{
    Write-Error("エラー"+$_.Exception)
}finally{
    #write some code
}
```

##② エラー内容
エラーの内容を取得するには以下の方法があります。
###1. $_.Exception($_.Exception.Message)
発生した直近の例外が格納されています。
catch句の中で利用します。

###2. $ERROR
セッション内で発生したエラーを配列で格納しています。
net useコマンドでエラーが発生した場合もエラー内容を保持しています。

Powershell勉強中のため、マサカリどんどんお待ちしてます。
Qiitaの画像アップロードについて

Qiitaではサポートで以下のように書かれていますが
> "注意点
アップロード可能なファイル形式は jpeg、gif、png、tiff の4種類
1枚あたり最大サイズは 1MB
1MBを超える画像をアップロードしようとした場合は、自動的に1MBに収まるように大きさが変更されます
gif画像で1MBを超えるものについては動かなくなります"
[画像のアップロード方法とファイル上限 - Qiita:Support](http://help.qiita.com/ja/articles/qiita-team-upload-image "画像のアップロード方法とファイル上限 - Qiita:Support")

他にも
[Qiitaに1件も投稿していない時の画像アップロード容量の上限は月間2MBまで](http://qiita.com/unsoluble_sugar/items/f61be798972883e44877 "Qiitaに1件も投稿していない時の画像アップロード容量の上限は月間2MBまで")
こういった条件があるらしいです。

まじか
pythonで陰関数を描画

#陰関数の描画
陰関数とは，$f(x,y)=0$のうち，陽な形に変形することが難しいものをいいます．
円$x^2+y^2-1=0$などが代表的です．
変形できなくもないですが，場合分けが必要になるので，グラフを書く場合にはあまりスマートではないです．
こういった時，`contour`が便利です．


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

delta = 0.025
xrange = np.arange(-2, 2, delta)
yrange = np.arange(-2, 2, delta)
X, Y = np.meshgrid(xrange,yrange)

#軸の設定
plt.axis([-2, 2, -2, 2])
plt.gca().set_aspect('equal', adjustable='box')

#描画
Z=X**2+Y**2-1
plt.contour(X, Y, Z, [0])
plt.show()
```

コード中の`plt.contour(X, Y, Z, [0])`が， Z=0の等高線を描きます．
`[-1,0,1]`と指定すると，等高線が追加されていきます．かしこいですね．

#他の方法
かなり短くかけますが，$-\epsilon<f(x,y)<\epsilon$を塗っているだけな気がします．

```py:
from sympy import *
x, y = symbols("x y")
Z=x**2+y**2-1
plot_implicit(Z, (x, -2, 2), (y, -2, 2))
```


#実行結果
![aa.png](https://qiita-image-store.s3.amazonaws.com/0/96637/a7f55d88-ca03-7f0f-4903-1f62e4647509.png)
PICでAndroid Open Accessoryをつくる:04-2

# ファームウェア調整
PIC24FJ64GB002用に作成したファームウェアを調整し、赤外線を受信した際に回路上のLEDを点灯させるように修正ます。

## ファームウェアの調整
- PICKit3をPCと接続します
- MPLAB X IDEを起動します
- PICでAndroid Open Accessoryをつくる:04-1で使用したプロジェクトを開きます
- ソースファイルを修正します
- Source Files - app - app_android_basic_io.c 抜粋

```c:app_android_basic_io.c
static uint8_t GetPushbuttons(void)
{
    // 追記
    LED_Off(ANDROID_DEMO_LED_1);

    uint8_t toReturn;

    BUTTON_Enable(ANDROID_DEMO_BUTTON_1);
    BUTTON_Enable(ANDROID_DEMO_BUTTON_2);
    BUTTON_Enable(ANDROID_DEMO_BUTTON_3);
    BUTTON_Enable(ANDROID_DEMO_BUTTON_4);

    toReturn = 0;

    //if(BUTTON_IsPressed(ANDROID_DEMO_BUTTON_1)){toReturn |= (1<<0);} // 下記に修正
    if(BUTTON_IsPressed(ANDROID_DEMO_BUTTON_1))
    {
        LED_On(ANDROID_DEMO_LED_1);
        toReturn |= (1<<0);
    }
    if(BUTTON_IsPressed(ANDROID_DEMO_BUTTON_2)){toReturn |= (1<<1);}
    if(BUTTON_IsPressed(ANDROID_DEMO_BUTTON_3)){toReturn |= (1<<2);}
    if(BUTTON_IsPressed(ANDROID_DEMO_BUTTON_4)){toReturn |= (1<<3);}

    return toReturn;
}
```

- [PICでAndroid Open Accessoryをつくる:02](http://qiita.com/sin5-developer/items/fceb3701dc32310eae94)で作成したブレッドボードにPICKit3を接続します
- リボンバーから「Make and Program Device Main Project」を実行し、PICにプログラムを書き込みます
- 「Programming/Verify complete」が出力され書込みが成功したことを確認します

##動作確認
- 上記の作業で準備した、ファームウェアの書き込まれたPICを[PICでAndroid Open Accessoryをつくる:03](http://qiita.com/sin5-developer/items/93d008bd43d9b7c6a761)で作成したブレッドボードに設置します
- 電源用マイクロUSBコネクタにACアダプタを接続したうえで、USBコネクタをAndroidに接続します
- Android上で「基本的なアクセサリデモ(Basic Accessory Demo」を起動します
- IR受信機に向け赤外線リモコンを操作すると、操作している間プッシュボタン状態が「Not pressed」と「Pressed」が点滅すると同時に、ブレッドボード上のLEDが点滅します

##今後
これで作成した回路及びファームウェアの構築は終了です。
次回は、Android用アプリケーション作成のための環境構築を行います。
synologyのSAMBAがregzaから読めない

#TL;DR
DSMのVersionは`DSM 6.0.2-8451 Update 9`
sambaにcharsetを明示して、Web管理画面からsambaをOffしてOnする。

```:/etc/samba/smb.conf
[global]
   dos charset = CP932
   unix charset = UTF8
   display charset = UTF8
   unix extensions=no
```
ググると`unix extensions=no`もつけたほうが良いらしいので念のためつける。
私の環境では無くても問題なかった。
sambaの場所は「コンパネ > ファイルサービス > win/mac/nfs > windowsのファイルサービスを有効にする」 がそうだ。

#やったこと
##症状
Regzaの録画やTSファイルはNASに保存してあるのでREGZAからNASにアクセスしてみると以下のような状態になる。
![IMG_20170122_183536.jpg](https://qiita-image-store.s3.amazonaws.com/0/109103/9ade151a-c8cb-5324-099c-c2d2abb70d70.jpeg)

まだ、QNAPから引っ越ししたばかりでフォルダは掘っていないので、多分ファイル名が認識されずに'default'のフォルダとしてご認識されているのだろう。

##あわてず騒がずググる
まずはgoogle先生に「synology regza」で尋ねると、以下が見つかった。
http://ytaake.blogspot.jp/2015/07/synology-215jregza-z1.html
`unix extensions=no`を付けても改善せず。ってかもっとググると、これはsmbで録画失敗する人用の回避措置らしい。今回とはちょっと違う。惜しい。

##設定ファイルを眺める
上で設定ファイルを弄っているときに、気が付いたのだがglobalにcharsetが書かれていない。
これだな。
って事で、いつも通りにcharsetを書いてsambaを再起動させたら、無事解決した。
やっぱり素のLinuxに近いって素晴らしい。…これって自分でNAS鯖組んでも同じじゃね？と気が付いてはいけないと思う。
GAEでVision APIを呼び出す



GAEからVision APIを使ってみました

```python
image_data = user.image.read()
image_content = base64.encodestring(image_data)
headers = {'Content-Type': 'application/json'}
data = {
    "requests": [{
        "image": {
            "content": image_content
        },
        "features": [{
            "type": "SAFE_SEARCH_DETECTION",
            "maxResults": 10
        }]
    }]
}
results = urlfetch.fetch(
    url='https://vision.googleapis.com/v1/images:annotate?key='+GCP_API_KEY,
    headers=headers,
    payload=json.dumps(data),
    method=urlfetch.POST,
    deadline=60,
    validate_certificate=False # SSLのエラーが出るので必要
)
json_results = json.loads(results.content)

```

---

(追記)

サービスをリリースするためには、APIキーの制限をしたほうが良いよーとのことなので、設定してみると、なにやらエラーが

```
Requests from referer <empty> are blocked.
```

どうも、上記のコードだと`Referer`が入らないみたいですね

なので、`headers`に`Referer`を入れてあげちゃうと良さげ

```python
headers = {
	'Content-Type': 'application/json',
	'Referer': 'your domain here'
}
```
ぽーととか開放★めも

## Port80はnginxのもの！
```
# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 22927 root 6u IPv4 429940 0t0 TCP *:http (LISTEN)
nginx 22928 nginx 6u IPv4 429940 0t0 TCP *:http (LISTEN)
```

## ファイアウォール起動と自動起動
```
# systemctl start firewalld
# systemctl enable firewalld
```

## http開放
```
# firewall-cmd --zone=public --add-service=http --permanent
```

## 適応
```
# firewall-cmd --reload
success
```

## 確認
```
# firewall-cmd --list-services
dhcpv6-client http https ssh
```
そしたらどっかーのが接続できんくなった…

## ポート指定で許可
```
# firewall-cmd --zone=public --add-port=1818/tcp --permanent
# firewall-cmd --reload
success
```

## 確認
```
# firewall-cmd --list-ports
1818/tcp

# firewall-cmd --list-all
```

## 因みに削除
```
# firewall-cmd --zone=public --remove-port=1818/tcp --permanent
```
ヒャッハーヾ(*´∀｀*)ﾉ
carrierwave で新しいリサイズのバージョンを既存の画像ファイルに適用させる(Rails)


## やりたいこと
gem の `carrierwave` で新しいリサイズのバージョンを作る。
<br>
新しく `retina` というバージョンを作る場合、コードだけで言えば、アップローダーの中で

```image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  version :retina do
    process :resize_to_fit => [640, 640]
  end
end
```
と書いて、新しく画像を保存すれば 640 x 640 でリサイズしたものも勝手に保存してくれる。
ただ新しく保存した画像は自動的に 640 x 640 のものが作られるが、
既存の画像は作られず、 `@user.image.retina` などと書くとエラーが起こる。

```
@user.image.retina.presence || @user.image
```
とかにすればもちろん動くが、 `retina` と使いたい場所全てに書かないとなので、
バージョンが増えてきたら崩壊する。
<br>
そこで今回、既存の画像ファイルの `retina` でリサイズした画像を作っていく。


## モデル
|User        |
|:-----------|
|id          |
|image       |
`user` モデルがあり、`user` はカラムに `image` を持っている。

```app/model/user.rb
class User < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end
```
`image` にカラムに ImageUploader の設定を反映させる。

```app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  version :retina do
    process :resize_to_fit => [640, 640]
  end
end
```
こちらの設定は `retina` のバージョン以外は省略。

## リサイズ
リサイズは `recreate_versions!` というメソッドを使うとできる。
例えば

```
User.find(1).image.recreate_versions!
```
で id が 1 のユーザーの画像の `retina` バージョンが作られる。
もちろん全ユーザーの既存の画像を作り直したいので

```
User.find_each do { |user| user.image.recreate_versions! if user.image.present? }
```

とかにするとユーザーの画像が存在した場合にだけ画像を作り直す。
また画像は恐らく量が多いので `find_each` を使っている。
これをコンソールなどで叩いたらいいのだが、

* コンソールで打つの面倒臭い
* 本番環境でコンソールあんまり打ちたくない
等々あるので、
どこか適当なファイルに先程のコードを書き(今回は `lib/tasks/recreate_image.rb`)

```
rails runner lib/tasks/recreate_image.rb
```
と叩けば画像のリサイズ完成。
<br>
は一応するのだが、
エラーが起きた場合などにしっかり終えるようにしたいのと、
どのくらいまでリサイズが進んでるかとかも見たいので例外処理も加えて

```lib/tasks/recreate_versions.rb
User.find_each do |user|
  begin
    p user.id
    usere.image.recreate_versions! if user.image.present?
  rescue
    p "#{user.id} recreate failed."
  end
end
```
とかすると、多少雑ではあるけど、
id を見て進捗がわかるのと、もしリサイズがうまくいかなかった時はその画像の id を表示してくれるようにしてる。
リサイズできなかったやつは slack などで通知させようとも思ったが、
既存画像のリサイズ自体そんなに頻繁にやるものでもないので今回はやらなかった。
<br>
また、そもそも `rails runner` や `コンソール` を使わなくても、
どこかのアクションにこの処理を書けばいいのだが、URL を知ってさえすれば誰でも処理を回せてしまうのでコマンド対応にした。
synologyのNASをrsyncのコピー先にする

#TL;DR
DSMのVersionは`DSM 6.0.2-8451 Update 9`
以下の設定をして、SynologyのWeb管理画面でrsyncサーバをOffしてOnする。

```:/etc/rsync.conf
#motd file = /etc/rsyncd.motd
#log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
use chroot = no
uid = root
gid = root
[pub]
        path = /var/services/NetBackup/pub
        read only = no
[tv]
        path = /var/services/NetBackup/tv
        read only = no
```
rsyncの設定は コンパネ > ファイルサービス > rsync にある。

#雑記
QNAPのNASを使ってて次を考えていたが、その際に安さにひかれてsynologyのNASを選んでしまった。
QNAPと比べると素のLinuxに近いように思える。困ったときでも取り合えず思いつくフォルダに降りて作業すれば思った結果が返ってくるので、Linuxサーバに親しんだことのある人なら迷いなく行ける。QNAPが特殊すぎただけなのか。
一点気を付けたいのが、synologyのNASサーバー＆管理アプリのDSMを初期化するとNASに貯めこんだデータを全て消去されてしまうようだ。私は数日かけてrsyncした20TBを持っていかれて呆然としてしまった。
まだ触って日が浅いのでもうちょっと遊べそう。畳と環境は新しいのに限る。ただし安定運用に入ると本当に何もしなくなるのがいつも寂しい。

今気が付いたけどsynologyタグ一番、ゲットだぜ！
JS の class でメソッドを動的に呼ぶ小さいメモ

```js
class Hoge {
  constructor(){
    this.arr = [
      "hoge1",
      "hoge2",
      "hoge3"
    ]
  }
  hoge1() { console.log(1) }
  hoge2() { console.log("piyo") }
  hoge3() { console.log(100) }

  hoge(){
    var that = this
    this.arr.forEach(function(v, i, a){
      that[v]();
    })
  }
}
```

this を that に入れているけど..他に方法ありますでしょうか..。

```zsh
> h = new Hoge()
# Hoge { arr: [ 'hoge1', 'hoge2', 'hoge3' ] }
> h.hoge()
# 1
# piyo
# 100
# undefined
```
さくらVPSでCentos7を建てた時に最低限やること

#個人メモ
ほぼ[VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 \| dogmap\.jp](https://dogmap.jp/2011/05/12/vps-security/)の通り。
違いのみ記載

## serviceコマンドがsystemctlに変わった

```bash
service sshd restart
```
が

```bash
systemctl restart sshd
```

などへ。

## sshのポートを変えたらfirewallの設定も変える

```bash
vi /usr/lib/firewalld/services/ssh.xml

```
```bash
  <port protocol="tcp" port="22"/>
を
  <port protocol="tcp" port="10022"/>
```

に書き換えて

```bash
systemctl reload firewalld
```



## 参考(というより、まんま)
[VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 \| dogmap\.jp](https://dogmap.jp/2011/05/12/vps-security/)

[RHEL/CentOS7ではiptablesではなくfirewalld \- Qiita](http://qiita.com/sak_2/items/fe996c518e8075214b49)
js 配列の要素を欠落させる

##お題
第一引数の配列の要素を第二引数の関数がtrueになるまで先頭から欠落させる。
例　
`([1, 2, 3, 4], function(n) {return n >= 3;})`の場合、
配列の要素の先頭が3になるときまで、要素を欠落させる。

```js
function dropElements(arr, func) {
  // write your code.
}
dropElements([1, 2, 3, 4], function(n) {return n >= 3;});//[3, 4]
```

##出力結果 例

```js
dropElements([0, 1, 0, 1], function(n) {return n === 1;})// [1, 0, 1]
dropElements([1, 2, 3], function(n) {return n > 0;})// [1, 2, 3]
dropElements([1, 2, 3, 4], function(n) {return n > 5;})// []
dropElements([1, 2, 3, 7, 4], function(n) {return n > 3;})// [7, 4]
dropElements([1, 2, 3, 9, 2], function(n) {return n > 2;})// [3, 9, 2]
```

##つかったもの
for文
if文
shift()


##考え方
・for文で第二引数が`true`になるまで配列にshift()の処理を繰り返す。

##コード

```js
function dropElements(arr, func) {
  var times = arr.length;
  for (var i = 0; i < times; i++) {
    if (func(arr[0])) {
      break;
    } else {
      arr.shift();
    }
  }
  return arr;
}
dropElements([1, 2, 3, 4], function(n) {return n >= 3;});
```

##ES6

```js
function dropElements(arr, func) {
  return arr.slice(arr.findIndex(func) >= 0 ? arr.findIndex(func): arr.length, arr.length);
}
dropElements([1, 2, 3, 4], function(n) {return n >= 3;});
```
[findIndex()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)

##while文のコード

```js
function dropElements(arr, func) {
  while(arr.length > 0 && !func(arr[0])) {
    arr.shift();
  }
  return arr;
}
dropElements([1, 2, 3, 4], function(n) {return n >= 3;});
```

##他にもコードが浮かんだ方、コメントお待ちしております。
MySQL Workbenchを日本語化する（2017.1月時点）

#経緯
MySQL Workbenchをインストールし、日本語化しようとしたが、
最新版に対応している記事がほとんどなく、パッと一発でできる情報ソースが無かったため、
現時点で自身が行った方法を記す。

#環境
Mac OS Sierra
MySQL Workbench Version6.3.8

#メニューを日本語化する
①以下URLよりインストールする
[MySQL Workbench](https://www-jp.mysql.com/products/workbench/)

②日本語のソースをインストールするため以下のサイトにアクセスする
[OSS_ja_jp](https://ja.osdn.net/projects/oss-ja-jpn/releases/p10742)

③色々なりソースが出て来ますが、とりあえず以下をダウンロードする
mysql-workbench-gpl_5.2.34_ja6.tar.gz

④以下の手順で解凍する
mysql-workbench-gpl_5.2.34_ja6.gz
↓
(解凍）
↓
解凍後フォルダの中に
「mysql-workbench-gpl_5.2.34-6_i386.deb」がある
↓
(さらに解凍）
↓
解凍後フォルダの中に
「data.tar.gz」がある
↓
（もう一度解凍）

⑤４で最後に解凍したフォルダから以下のファイルを探す
usr/local/share/mysql-workbench/data/main_menu.xml

⑥⑤で探したファイルを以下のファイルに上書き保存する
（念のため、バックアップは取る）
Application/MySQLWorkbench/Contents/Resources/data/main_menu.xml

⑦私の場合は、ここで、MySQL Workbench再起動することで、メニューが日本語化されました。

#日本語で入力すると文字化けしてしまう

メインメニュー＞MySQL Workbench>Preferences>Modeling>Appearance>Fonts
にアクセスし、「Configure Fonts For」にJapaneseを選択する。

▼画面はこのような表示です。
![スクリーンショット 2017-01-22 18.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/131286/108b535d-25fc-0315-4566-4e7b1b98ff67.png)
vagrantでTimeoutした場合の対応方法(cable="true"版)


# 概要
友人に[VCCW](http://vccw.cc/)を紹介しようとして、最新バージョンを実行(vagrant up)したところ、定番の箇所でTimeoutになってしまいました。

```
SSH auth method: private key
```

今回遭遇した現象は、[この情報によると](https://www.virtualbox.org/ticket/15705)、VirtualBox 5.1のpackerの不具合で、ovfファイルにcable="true"が出力されないことが原因のようです。

対応策もそのページの末尾に記載されていました。
vox.ovfファイルにcable="true"を追加しても良いようですが、Vagrantfileを修正する方がスマートだと思います。

```
If you are using vagrant you can use the following workaround:

config.vm.provider "virtualbox" do |vb|
    # Workaround for https://www.virtualbox.org/ticket/15705
    vb.customize ['modifyvm', :id, '--cableconnected1', 'on']
end
```

VirtualBox 5.1以前のバージョンで作成しているbox.ovfファイルには、確かに、cable="true"が入っていました。

# 原因調査
config.vm.providerのブロックにguiを追加して、vagrant upしました。

```
config.vm.provider 'virtualbox' do |vb|
...
  vb.gui = true
...  
end
```

VirtualBoxは、以下の行でTimeoutになっていることがわかりました。

```
[ *** ] A start job is running for Raise network interfaces".
```

これを検索条件に入れて検索すると、この記事が見つかり、無事、起動できるようになりました。
 [Timeout error during `vagrant up`](https://github.com/chef/bento/issues/682)


# 参考資料
* [VCCW](http://vccw.cc/)
* [Ticket #15705 (new defect)](https://www.virtualbox.org/ticket/15705)
* [Timeout error during `vagrant up`](https://github.com/chef/bento/issues/682)
* [virtualbox用のbento/ubuntu16.04の2.3.0で接続が失敗するときの解決方法【個人メモ】](http://qiita.com/kilo7998/items/e3a04aedbfb53517ba8a)
[FileMaker]文字列置換Tips：Substitute

 
置換関数substituteを入れ子で使用すると大変便利です。

```rb:
Substitute(
  Substitute(
    置換元テキスト
  ;"検索テキスト2";"置換内容テキスト2")
;"検索テキスト1";"置換内容テキスト1")
```

## 例えばデータにカッコが含まれている場合

### 置換前

- "iPhone6S（中古）"

### 置換後

- "iPhone6S中古"

### 置換計算式

```js:
Substitute(
  Substitute(
   "iPhone6S（中古）"
  ;"（"; "") // 前カッコ削除
;  "）"; "") // 後カッコ削除
```

-- 


## さらにデータの半角全角が入り乱れている場合もあるでしょう。
### 置換前

- "iPhone7(中古）"
- "iPhone6（中古)"

### 置換後
- "iPhone7中古"
- "iPhone6中古"

### 置換計算式

```js:
Substitute(
  Substitute(
    Substitute(
      Substitute(
       - "iPhone7(中古）"
      ;"（"; "") // 全角前カッコ削除
    ;  "）"; "") // 全角後カッコ削除
  ;"("; "") // 半角前カッコ削除
;  ")"; "") // 半角後カッコ削除
```
備忘録: Python の関数定義で引数に * (アスタリスク) だけ指定の意味

たまにしかコーディングしないとすぐに忘れちゃう。

Python の関数定義で引数に * (アスタリスク)が1個だけ指定されているときがある(標準ライブラリのソースとか見てるとちょいちょいある):

`def connect_accepted_socket(self, protocol_factory, sock, *, ssl=None):`

これは、

> “*” や “*identifier” の後の引数はキーワード専用引数で、キーワード引数を使ってのみ渡されます。

http://docs.python.jp/3/reference/compound_stmts.html#function-definitions

すなわち `*,` をはさむと、それよりあとの引数は「キーワード引数としてでないと受け付けない」(位置引数では受け付けない)ということ。

```python
>>> def foobar(a, b, *, c=False):
...     print(a if c else b)
... 
>>> foobar(1, 2)
2
>>> foobar(1, 2, c=True)
1
>>> foobar(1, 2, True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foobar() takes 2 positional arguments but 3 were given
```

「アスタリスク」といちいち書くのは検索用。
自分自身がこの投稿をした事実を忘れてしまったときのために。
えるしってるか。口座番号は数字じゃない

入力項目で、数字のみを入れて欲しい場合、どうすればいいだろう。
例えば、金額欄にhogehogeとか入れられても困るのである。
そいつをvalidationで弾きたい。
postされたあとにサーバサイドで弾いてもよいが、どちらかというと入力時にブラウザのjsチェックで弾き、入力そのものをなかったことにしたい。
金額欄に `123456` と入れようとしてうっかりtypo、 `12345t6` と入れてもjsでこの `t` を取り除き、 `123456` という形に整形したい

そういうときどうするか？

jsだとみんな大好きparseInt先生を使う。
一例： `parseInt(value, 10)`

ところが問題がある。
一見数字に見えるが、実は口座番号は数字ではない。
どのあたりが数字でないかというと先頭に `0` が許容されている。
そのため 

```js
const value = '00123456';
const output = parseInt(value, 10); // 123456
```

入力者的には何回ゼロを入力欄に入れてもゼロが無視される結果が返る。
ユーザーはどうするかっていうとキレる。あるいはサポートに鬼電話。
口座番号が絡んでいる時点でこれはお金の問題である。つまり割とセンシティブな話になる。

そこで発想を変える。
ジョジョ逆に考えるんだ。口座番号は0-9までだけが許容された文字列だと。
ということでこうやって数字以外を置き換える。
[ありがたいアドバイス](http://qiita.com/shin_semiya/items/0ff7f026fa533657e3ed#comment-368d4b4a272af66fbf3d) に基づき改定しました

```js
const value = '00123456';
const output = value.replace(/\D/g, ''); // 00123456
```

補足：
\D : 半角数字以外
\d : 半角数字
意味的には以下に同じ
`const output = value.replace(/[^0-9^\.]/g, ''); // 00123456`


これで事態は解決する
[XCODE]Tabbed ApplicationでStoryboardを分割する


##概要
iOSのTabbedApplicationのStoryboardをタブごとに分割する方法です。

##手順
1. Tabbed Applicationを作成します
<img width="734" alt="スクリーンショット 2017-01-22 16.49.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/b1189c74-3b17-13b2-f7a1-1d0553a78943.png">

<img width="573" alt="スクリーンショット 2017-01-22 16.51.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/a56bcd68-067a-8ccb-2901-c8ac93af6a3a.png">

2.各タブごとのstoryboardを新規作成する
今回は、First.storyboardとSecond.storyboardを作成します。
<img width="260" alt="スクリーンショット 2017-01-22 16.53.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/fa43f388-1034-21cf-5e39-54ac95740fc6.png">

3.Main.storyboardのFirstViewControllerとSecondViewControllerを2で作成したstoryboardに各々カットアンドペーストする

4.First.storyboardとSecond.storyboardの「Is initial View Controller」のチェックをONにする
<img width="721" alt="スクリーンショット 2017-01-22 16.57.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/de671b6b-2803-0ec0-9c1a-d39a98ded09d.png">

5.MainTabBarControllerを新規作成する
<img width="734" alt="スクリーンショット 2017-01-22 17.05.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/dc654132-c94f-ace3-3d44-33f86a6ce7c5.png">

6.Main.storyboardのTabBarControllerのClassに5で作成したクラスを設定する
<img width="512" alt="スクリーンショット 2017-01-22 17.06.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/29633cb0-5db0-ab48-0fca-6d3e3d7a1ea6.png">

7.MainnTabBarControllerのViewDidLoadに以下のコードを追加

```Objc
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSMutableArray *viewControllers = [NSMutableArray new];
    
    // ファイル名を指定してStoryBoardを生成
    UIStoryboard *firstStoryBoard = [UIStoryboard storyboardWithName:@"First" bundle:[NSBundle mainBundle]];
    UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"Second" bundle:[NSBundle mainBundle]];
    
    // 生成した StoryBoard の InitialViewController を取得する
    UIViewController *firstViewController = [firstStoryBoard instantiateInitialViewController];
    UIViewController *secondViewController = [secondStoryBoard instantiateInitialViewController];
    
    // ViewControllersにUIViewControllerを追加する
    [viewControllers addObject:firstViewController];
    [viewControllers addObject:secondViewController];
    
    // TabBarControllerの持つViewControllerの配列に代入
    self.viewControllers = viewControllers;
}
```

8.実行！
<img width="375" alt="Screen Shot 2017-01-22 at 17.22.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/fdda247b-3f94-7fbe-d722-3047d02c4719.png">
<img width="375" alt="Screen Shot 2017-01-22 at 17.22.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/b43538e5-1c0e-2d19-c407-0a33712d0b95.png">

##メリット
Storyboardを分割することによってチーム開発時のコンフリクトを防ぐことが出来ます。

###参考にした記事
- [チーム開発するなら Storyboard を分割セヨ](http://dev.classmethod.jp/smartphone/iphone/ios-separate-storyboard/)
正規表現

正規表現とは、「いくつかの文字列を一つの形式で表現するための表現方法」のこと。
この表現方法を利用すれば、たくさんの文章の中から容易に見つけたい文字列を検索することができる。

### 普通の文字列
単純にその文字列にマッチする。

|正規表現|マッチする文字列|
|--------|--------------|
|やあ|やあ、こんにちは|

### この中のどれか => |
いくつかのパターンを候補にできる。

|正規表現|マッチする文字列|
|------------------|---------------|
|こんにちは\|今日は\||こんにちは、ケン, 今日はもうおしまい|

### アンカー => ^ , $
パターンの位置を指定するメタ文字。
アンカーを使うと対象の文字列のどこにパターンが現れなければいけないかを指定できる。
行の先頭 => ^
行末 => $

|正規表現|マッチする文字列|
|------------------|---------------|
|^やあ|やあ、ケン|
|じゃん$|これ、いいじゃん|
|^ハイ$|ハイ|

### どれか1文字 => [ ]
いくつかの文字を[]で囲むことで、「これらの文字の中でどれか1文字」という表現ができる。

|正規表現|マッチする文字列|
|------------------|---------------|
|こんにち[はわ]|こんにちは, こんにちわ|
|ども[〜ー…！、]|どもーっす, ども〜。, ものども！|

### なんでも1文字 => .
「.」はなんでも1文字にマッチするメタ文字。
スペースやタブなどの目に見えない文字にもマッチする。

|正規表現|マッチする文字列|
|------------------|---------------|
|うわっ、...！|うわっ、出たっ！, うわっ、それか！|

### 繰り返し => + , *
繰り返しを意味するメタ文字を置くことで、直前の文字が連続することを表現できる。
「+」は一回以上の繰り返しを意味する。
「*」は0回以上の繰り返しを意味する。つまり、あってもなくても構わないし連続していても構わないことを意味する。
「{m,n}」を使えば繰り返し回数を限定できる。「m回以上、n回以下」

|正規表現|マッチする文字列|
|------------------|---------------|
|は+|ははは, |
|^ええーっ！*|ええーっ！！！, ええーっもう帰ったの|
|ぷ{3,}|ぷぷぷ, うぷぷぷ|

### あるかないか => ?
直前の1文字があってもなくてもいいことを表現できる。

|正規表現|マッチする文字列|
|------------------|---------------|
|盛った[!!]?$|だいぶ盛った！, 完璧に盛った|

### パターンをまとめる => ()
「()」で1文字以上のパターンをまとめることができる。

|正規表現|マッチする文字列|
|------------------|---------------|
|(まじ\|マジ)で|ま、マジで？, まじでそう思います|
|(ほわん)+|ほわんほわんしてるね, 心がほわんとする|

### メタ文字を普通の文字として検索したい => \
メタ文字の直前に「\」を付加すれば普通の文字として検索できる

|正規表現|マッチする文字列|
|------------------|---------------|
|a\\*|a*|

以上、正規表現の一部を記載したが、調べて見たらもっとたくさんの表現がありそうなので、気が向いたら追記していく。
SQLアンチパターン：ランダムセレクション

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

アンチパターン:データをランダムにソートする

# アンチパターン

```sql
SELECT * FROM Bugs ORDER BY RAND() LIMIT 1;
```

- ソートは再現性もあり、インデックスのメリットも得られる
- インデックスとは、ある列の値を事前にソートしたもの

RAND関数を利用すると、インデックスのメリットが得られない
  - データベースを手作業でソートしているのと同じ（データスキャン）
  - データスキャンは、全体をスキャンしても利用するのは1行だったりするので無駄に終わることも多い

## 用いてもいいパターン

- 数が少なく、増えないデータ（都道府県とか）

# 解決策

- 1 と最大値の間のランダムなキー値を選択する
  - 欠番がないことが前提
- 欠番の穴の後にあるキー値を選択する
  - 
- すべてのキー値のリストを受けとり、ランダムに 1 つを選択する
  - アプリケーション側で対応する
- オフセットを用いてランダムに行を選択する
  - データセットの行数をカウントし、0 と行数までの間 の乱数を返す技法

# まとめ

クエリには最適化できないものもあります。最適化できない場合は、別のアプローチを採用しましょう。

# 感想

ランダムは、遅いのでアプリケーション側でやるようになった


[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
Selenium禁止

こんにちは！
今日もAPIがアレなWebサービスをアレしてますか！


W3C WebDriverでは、WebDriverによるアクセスを禁止できる
===================================================

実は、W3Cが規定するWebDriver規格では、WebDriverによる自動アクセスであることを判別できるAPIが定義されています。
https://www.w3.org/TR/webdriver/#interface

具体的には、Webブラウザー上のJavaScriptですと `navigator.webdriver` の値で判別できます。この値は、現在の実装状況を見る限りでは、次のように動作することがデファクトになっているようです。

* WebDriverによる自動アクセスの場合は `true`
* 自動アクセスでない、ユーザー操作の場合は `undefined`

この値を応用すれば、WebDriverによるアクセスを禁止できるということになります。
例えば次のようなJavaScriptを、ページアクセス時 最初に実行させれば、WebDriverによるアクセスだけをアレなことにできるでしょう。

```JavaScript
if (navigator.webdriver === true) {
   location.href = 'http://www.xvideos.com/';
}
```


なんでこんなAPI作るの？
======================

上記のW3C文書が草稿であった一時期には「DOS攻撃の軽減に使える」と書かれていた時期がありました。
現在の版ではそこまで踏み込まず「WebDriverによって制御されていることをWebサイトに通知する」という表現にとどまっていますが、広い範囲でのセキュリティが念頭に置かれたAPIであることには変わりは無いだろうと思われます。

2016年には実際に、Microsoft Azure上でWebDriverを利用して、Amazonで不正な電子書籍を販売していた事件が発覚しています。規格化するうえで、セキュリティ上の理由から第三者による自動アクセスを制限したい、というサービス提供者が現れることを見越してその手段を用意することは当然の取り組みなのかもしれませんね。

アマゾンの電子書籍で不正に利益--「キャットフィッシング」詐欺の実態(CNET Japan)
http://japan.cnet.com/news/commentary/35089790/


対応状況を実際に調べてみた
===========================

`navigator.webdriver` は新しいAPIで、まだまだすべてのブラウザーに関して実装されているわけではありません。
実際に `navigator.webdriver` の値を確認したところ、2019年2月10日現在では次の通りです。

|ブラウザー|navigator.webdriver|
|:--:|:--:|
|Firefox via GeckoDriver|**対応**|
|Google Chrome/Chromium|**対応**|
|Internet Explorer|未対応| 
|jBrowserDriver|未対応|
|Microsoft Edge|**対応**|
|Safari|**対応**|
【GAS】休日・祝日を判定する関数

## 休日・祝日を判定する関数

GASのスクリプトを平日だけ動かしたかったため、判定する関数を作成。

```javascript
function isHoliday(){
  var today = new Date();

  //土日か判定
  var weekInt = today.getDay();
  if(weekInt <= 0 || 6 <= weekInt){
    return true;
  }
  
  //祝日か判定
  var calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  var calendar = CalendarApp.getCalendarById(calendarId);
  var todayEvents = calendar.getEventsForDay(today);
  if(todayEvents.length > 0){
    return true;
  }
  
  return false;
}
```

## タイムゾーンが JST にならない場合は

`application.json` にて `TimeZone` を変更すればよろしいかと思います。

参考： [GASの新しいエディタでタイムゾーンを変更する](https://qiita.com/nabecima/items/899e4c5b951b9ae5d468)
Rails5なAPIで単純に404を返す方法

## 状況

API作成時に単純に404を返そうとしたら、deprecatedなwarningが発生
Rails5で怒られない書き方を調べたのでメモ

## 環境

Ruby 2.4.0
Rails 5.0.1

## 結論

```
head :not_found
```

を利用し、warningが出なくなった

## 流れ

最初に調べた方法で、以下のように記述

```
render :nothing => true, :status => 404
```

すると、テストは通るものの以下の警告が発生

```
DEPRECATION WARNING: `:nothing` option is deprecated and will be removed in Rails 5.1. Use `head` method to respond with empty response body. (called from show at controller.rb:xx)
```

内容的には5.1で削除される予定となっているので、テスト自体は通る
しかし、いずれ使えるなくなるとわかっているので、修正せねば
で、調べて行き着いたところが↓

```
head :not_found
```

## あとがき

iOSで次のバージョンで消えるよ！という警告を無視して痛い目に合いまくって来たので、事前の警告はしっかり対応していかねばと思った。
Rancherを試してみた。その２

[前回](http://qiita.com/ryota_hnk/items/9d91d49d7f3646e7eaa9)の続き。実際にコンテナ作ってみます。

#UIを使用してコンテナを作成する

管理画面からSTACKS→Userと進む

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/6687efb9-9268-201d-277a-c8ba366c5f4f.jpeg)

「Adding your first Stack」言わる。どうやら同じDockerImageから出来たコンテナのグループを「sevice」というらしい。dockerの「Link」の概念を拡張してDNSを利用して
サービスを見つけたりできるみたい。service同士で連携できるってことかな？なんかこの辺の概念は後で調べておこう。よくわからん

個別に作ることもカタログから作ることもできる。

カタログからwordpress作ってみようか。

画面からBrowse Catalogをクリック

![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/ded05376-6030-344f-f247-86774849f51f.jpeg)

カタログ画面に移る。いっぱいあるのう。

![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/df62eb5e-93b0-a557-6df7-955b420d5415.jpeg)


検索窓にwordpressって入れるか下の方にずーっと言ってwordpressのView Detailsをクリックすると、詳細な設定画面に移る。

名前やPublic Portをなんとなく入れたら下の方にあるLaunchをクリック。

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/32f2e994-c00e-ba69-3b10-f4e45d5316a6.jpeg)


そうするとなんかコンテナが起動してる感じの画面が出る。
![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/4b5ef01a-c251-0940-c1cd-4a8a79189a21.jpeg)


すべての状態が「Active」になったら

http://HostのIPアドレス:登録したPort

にアクセスする。（例は192.168.3.18の10080番）

おー！wordpressインストール画面だ！簡単だわこれは

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/ca9a385c-cc81-e64d-45a0-1be93458481c.jpeg)



#DockerのCLIを直接使ってコンテナを作成する

ホストから直接dockerコマンドで作ったコンテナも自動で登録されるっぽいのでやってみる。

ホストからnginxコンテナを動かしてみる。

```bash:
$ docker run -d --name=nginx01 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5040bd298390: Already exists
d7a91cdb22f0: Pull complete
9cac4850e5df: Pull complete
Digest: sha256:33ff28a2763feccc1e1071a97960b7fef714d6e17e2d0ff573b74825d0049303
Status: Downloaded newer image for nginx:latest
f8345fa2aea5540e0e3534089b330051757d0a848ecb6b17c20452268302d850

```

管理画面からINFRASTRUCTURE→Containersと進むと、さっき作ったnginxが増えとる！

![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/151399/c4acd6f1-899a-4853-8e7c-84f62453e71a.jpeg)

これは便利！うちの会社はCloudstackを使ってるんだけどこういう機能はなくて、VMをインポートしないとCloudstackの管理下におけなかったのよ。Openstackも同じじゃないかな？

「内部的にdocker psとかdocker inspect使えば簡単じゃねーの？」とか言うかも知れないけど、だったら****stackもvirshとかxeコマンドで行けるはずじゃないですか。

こういう風に簡単に作れて、既存のコンテナ環境も管理できるとなると導入コストはグッと下がると思いますよ。

ipsecのport聞かれたけど、拠点間コンテナ環境も簡単なのかな？

Rancherの第1印象は「簡単すぎて怖い」でした。俺がdockerとかkubernetesがどういう仕組みで動いてるか理解してないからでしょうね。

勉強しよう。
MacVimにhw (highway)を導入 macports版

# 前置き

今までUnite grepには、ag (The Silver Searcher)がよく使われてきたけど、
ちょいちょい引っかかるのが気になってたので、agよりさらに軽いらしいhw (highway)を導入してみる。
[highway という高速検索ツールを作りました · けんごのお屋敷](http://tkengo.github.io/blog/2015/10/19/release-highway/)

- [MacVim](https://github.com/splhack/macvim-kaoriya/)
- [Unite](https://github.com/Shougo/unite.vim)
- [highway](https://github.com/tkengo/highway/)
- [MacPorts](https://www.macports.org)

# hw (highway)のビルド

作者のサイトにはHomeBrewでの導入方法があったけど、
MacPortsでの導入方法がなかったのでここに記載。

MacPortsにContributeしてみようか。。。

## automake, autoconfインストール
入ってなければ適宜

```sh
$ sudo port install automake autoconf
```

## hwビルド、インストール

ここからLatest releaseをダウンロードして解凍
https://github.com/tkengo/highway/releases

```sh
$ tools/build.sh
$ sudo cp hw /usr/local/bin/
```
configureが無いのが流行りか？

## .vimrcに追記

```vimrc
" hw (highway) for Unite grep
if executable('hw')
  let g:unite_source_grep_command = 'hw'
  let g:unite_source_grep_default_opts = '--no-group --no-color'
  let g:unite_source_grep_recursive_opt = ''
endif
```

ちなみに私はコマンド派なので、Unite grep起動は下のように設定して「:Ug」って打ちます。

```
command Ug Unite grep -buffer-name=search -no-quit
```
ラズパイでシステムの状況をツイッターにつぶやこう (2)

## 言い訳。
記事を次の日に書くって言って結局今日になったの、やる気不足ちゃんと怠けぐせ君が活躍したおかげです！ごめんねっ！

## 前回からの続きでやったこと。
前回：http://qiita.com/onokatio/items/ada23d4ff6af69a8a5df

前回はシェル変数に値を代入できたので、次はツイッターにつぶやくために署名を作ってます。
それでは本題のTwitterのツイート部分に行こう！

## 心意気
これ以前も、TwitterでのBot制作をしたことがありますが、すべて何らかのライブラリなりラッパーなりを使用しており、今回シェルだけでツイートをするのは相当の無理がありました。
だがしかし！そんなことこそやるのが醍醐味です。
「無駄に洗練された無駄のない無駄なコードこそが最高のコードである」と考える僕は、結局やることにしました。

いや、別にC++やPHPのライブラリを使って、数十バイトで作っても何のデメリットもありません。でも、ここまで来たら全部一行で書きたいじゃあないですか笑

## 予想

今まで使ったライブラリのように、アプリとユーザーのキーとシークレットの系４つを使って適当に署名したのを「/1/statuses/update.json」にPOSTすればいんじゃないの？

## 調べてわかったことと、そのまとめ

https://dev.twitter.com/oauth/overview/authorizing-requests
ココの解説サイト様を参考にさせてにしました。世の中にはまるで運営じゃないかと見違うぐらいAPIに精通する方がいらっしゃるのですね。
茶番はこれくらいにしてさっそく初めましょう。

自分なりに意訳してまとめてみたHTTPリクエストの内容が以下のとおりです。

```:/1/statuses/update.jsonへのHTTPリクエスト内容
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
        OAuth oauth_consumer_key="Twitterアプリのカスタマーキー",
              oauth_nonce="32ビットの乱数をBASE64したやつ",
              oauth_signature="署名本体（後述）",
              oauth_signature_method="HMAC-SHA1",
              oauth_timestamp="署名した時のUNIX時間",
              oauth_token="ユーザーのアクセストークン",
              oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com

status=testtweet
```

そして肝心の署名部分の作り方を一行で説明すると、

```
「httpリクエストの、署名部分以外の残り全てのヘッダの文字列連結」を「Twitterアプリのカスタマーシークレットと、ユーザーのアクセストークンシークレットの文字列連結」で署名する
```
ちなみに署名に必要な関数の名前がHMAC-SHA1と呼ばれるものらしいです。


## HMAC-SHA1をシェルでやろう

調べてみると、opensslコマンドで使えるらしいので、以下のようになりました。

```bash:hmac-sha1
K="秘密鍵"
M="署名したい文字列"

echo -n $K | openssl sha1 -hmac $K
```

## じゃあ署名を作ってみよう

そして出来上がったコードがこちらです♪（三分クッキング的）

```bash:sig

CK="カスタマーキー"
CS="カスタマーシークレット"
AT="アクセストークン"
ATS="アクセストークンシークレット"

STATUS="つぶやきたい内容" 
TIME=`date +%s`

# 32ビットのランダムな文字をbase64に突っ込む
NONCE=`head -c 32 /dev/urandom|base64|sed 's/\/\|=\|+//g'`

# 秘密鍵の生成
K='${CS}&${ATS}'

# 公式ドキュメントどおりに必要なヘッダを並べる
SIG="include_entities=true&oauth_consumer_key=${CK}&oauth_nonce=${NONCE}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=${TIME}&oauth_token=${AT}&oauth_version=1.0&status=${STATUS}"

# エンコード
SIG=`curl -s -w '%{url_effective}\n' --data-urlencode ${SIG} -G ''|sed -e 's/\/\|?//g'`

# アドレスとPOSTの指定も追加
SIG='POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&'${SIG}

# 署名して、そのバイナリをbase64
SIG=`echo -n ${SIG}|openssl sha1 -hmac ${K} -binary|base64`
```

あとはこのSIGを使ってHTTPリクエストをすればいいだけです。

それでは次回は、とうとうツイートをしてみます。
たぶん一週間以内にはまた投稿します。

それではバイバイ!!－＝Ξヾ(ヾ(ヾ(ヾ(ヾ(ヾ(*´▽｀)ツ
MySQL 予約語と同じカラム名にINDEXを貼ろうとしてハマった


テーブルのカラム名を`key`という名前で定義していて、そのカラムにINDEXを貼ろうとして2時間ぐらいハマった。

```sql:crt_configs.sql
CREATE TABLE `configs` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`key` varchar(255) NOT NULL,
	`value` text,
	`note` text,
	PRIMARY KEY(`id`),
	INDEX idx_configs_key(key(255))
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
```

Syntaxエラー

```
ERROR 1064 (42000) at line 4 in file: 'path/crt_configs.sql': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key(255))
) ENGINE= INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci' at line 7
```

### 解決法
`key`はMySQLの予約語として既に存在するので、バッククォートで囲んでやらなければいけない。

```sql:crt_configs.sql
CREATE TABLE `configs` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`key` varchar(255) NOT NULL,
	`value` text,
	`note` text,
	PRIMARY KEY(`id`),
	INDEX idx_configs_key(`key`(255)) #　key -> `key` (バッククォートで囲む) 
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
```

### 参考
[識別子と予約語](http://www.dbonline.jp/mysql/ini/index4.html)
vagrantで仮想環境を作りsshする方法&作った仮想環境を簡単に複製できるようにする方法

##vagrantで仮想環境を作りsshする方法

①下記のURLからvagrantをダウンロード。
https://www.vagrantup.com/downloads.html


②好みのvagrant boxを下記URLから探しコピー、boxを追加。
http://www.vagrantbox.es/
（※今回boxはDebian Jessie 8.0 Release x64 (Minimal, Shrinked, Guest Additions 4.3.26)を使用します。）


vagrant box add 適当なbox名 コピーした好みのboxのURL

```
vagrant box add Debian/Jessie8.0 https://github.com/holms/vagrant-jessie-box/releases/download/Jessie-v0.1/Debian-jessie-amd64-netboot.box
```
※このコマンドを打つ場所はどこでもOK


③ローカルPCの任意の場所にディレクトリを作成し、そこにさっき追加したboxを使います宣言（init）。
vagrant環境作りたい場所で

```
$ mkdir test_vagrant
$ cd test_vagrant
$ vagrant init Debian/Jessie8.0
```

④作成されたVagrantfile private_networkをコメントアウトを外す。

```
$ vi Vagrantfile
 config.vm.network "private_network", ip: "192.168.33.10"
```

⑤あとは儀式（up）をして、ssh。

```
vagrant up
vagrant ssh
```

これで無事仮想環境ができる。

##仮想環境を簡単に複製できるようにする方法
仮想環境で色々インストールしたら、その環境をまた作りたいときに色々インストールするのは面倒。
そのときはこうする。

ssh前の作成したディレクトリ上で

```
vagrant package
vagrant box add box_test package.box
```

するだけ。

```
vagrant box list
box_test (virtualbox, 0)
```
boxができているのがわかる。

以上。
オートスケーリングのグループサイズについて

オートスケーリングを設定していて疑問に思ったことがあったので、
まとめてみた。

ちなみにオートスケーリングとは、AWSが提供しているサービスの一部でEC2を動的に縮小あるいは拡張する機能のことです。

今回はオートスケーリングの方式について説明するので、
何ができるのか、メリデメなどの詳しくは他の人がまとめているので、
そちらを参照してください！
<http://qiita.com/iron-breaker/items/2b55da35429da7b19e49>

まずオートスケーリングにも2つの方式があります。

1.静的なスケーリング(オートヒーリング)
2.動的なスケーリング（オートスケーリング）

1.静的なスケーリング
スケーリンググループ内のインスタンス数を維持する。
そのためスケーリンググループ内のインスタンスが故障した場合は、
削除し、新たなインスタンスを立ち上げる。
指定する「desired-capacity」の考え方は、
desired-capacity＝スケーリンググループに属するインスタンス数
となります。

2.動的なスケーリング（オートスケーリング）
動的なオートスケーリングは、静的なオートスケーリングと一番異なっている点は「desired-capacity」です。
動的なオートスケーリングの「desired-capacity」は、
desired-capacity＝スケーリンググループ内で増減するインスタンス数
となります。


今回オートスケーリングで困ったのは、
「desired-capacity」という単語です。

「desired-capacity」とはインスタンス台数を調整できる幅です。
GUI上だとグループサイズと記載されています。

ちなみに
desired-capacity＝調整タイプ＝グループサイズ
になります。

調整タイプには以下のものがある
ChangeInCapacity：既存の容量を増減する。現在の容量3でChangeInCapacityを5でポリシーを
　　　　　　　　　　作成すると3+5で8インスタンスとなる
ExactCapacity：指定した値に現在の容量を変更。現在の容量3でExactCapacityを5でポリシーを
　　　　　　　　作成すると5インスタンスとなる
PercentChangeInCapacity：割合で容量を増減。現在の容量10でPercentChangeInCapacityを
　　　　　　　　　　　　　　10(10%の意味)でポリシーを作成すると11インスタンスとなる

これがどのような時にどんな調整タイプが使われるかを以下にまとめてみました。

・ExactCapacity→静的なスケーリング(オートヒーリング)で使われているポリシー。指定した値に現在のスケーリンググループにあるインスタンス数を変更。
　　　　　　　　例：現在のスケーリンググループの既存インスタンス3でExactCapacityを5
　　　　　　　　　　でポリシーを作成すると5インスタンスとなる。

・ChangeInCapacity→動的なスケーリング（オートスケーリング）で調整タイプで指定したを値でインスタンス数を増減させる（これは増加させる単位をインスタンスに設定することでなる）。
　　　　　　　　例：現在のスケーリンググループの既存インスタンス3でChangeInCapacityを5
　　　　　　　　　　でポリシーを作成すると3+5で8インスタンスとなる

・PercentChangeInCapacity→動的なスケーリング（オートスケーリング）で調整タイプで指定したを値でインスタンス数を増減させる（これは増加させる単位をパーセントに設定することでなる）。
　　　　　　　　例：現在の現在のスケーリンググループの既存インスタンス10で
　　　　　　　　　　PercentChangeInCapacityを10(10%の意味)でポリシーを作成すると
　　　　　　　　　　11インスタンスとなる
　　　　　　　　
オートスケーリング設定で活用してみてください。
![資料.png](https://qiita-image-store.s3.amazonaws.com/0/106369/43ef3c74-3fcd-58e8-9c89-4f00984fe9d6.png)
ターミナルでパスワード入力を間違えた時、入力した文字を削除する方法

# パスワード入力間違えた...
sudoやssh-addなどでパスワード入力を求められる時、たまーに打ち間違えることがある。

<img width="344" alt="スクリーンショット 2017-01-22 15.48.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/116289/988904a1-2550-f5d1-5edd-09c855be2733.png">

そんな時、BackSpaceを押しても間違えた文字が消えてくれない・・・(；´Д｀)
（何打っているのかは見えないけども）

このまま間違えて打つのも嫌だし、場合によっては監視に引っかかってアラートが上がるし、打ち直したい！

# これで解決
sttyで設定しているショートカットを使うことで、打ち間違えた文字を消せて、改めて入力できた。

| ショートカット | 説明 |
|:-:|:-:|
| Ctrl + w | カーソルの左側の単語を削除する |
| Ctrl + u | カーソルの左側にある文字を削除する |

やったね！✧＼٩( 'ω' )و ／✧

# 残された謎
不思議なことに次のショートカットは効かない・・・
BackSpaceが効かないのと同じ理由なのかな？

| ショートカット | 説明 |
|:-:|:-:|
| Ctrl + h | カーソルの左側の文字を1つだけ削除する |
Mac OS X x Docker で com.docker.osx.hyperkit.linux failed to start となるときの対処法

スクリーンショット忘れた

Mac OS X を Siera にアップデートしつつ、その後に Docker もアップデート要請が出たので、アップデートしたところ、以下のエラーが

`com.docker.osx.hyperkit.linux failed to start`

解決方法
=======
https://github.com/docker/for-mac/issues/1071 に解決法があり、要約すると Factory reset しかないみたい。

放っておくとプロセスが終了してしまうので、Docker 起動したら、起動中に `Preference -> Reset -> Reset to factory defaults` と選択していくしか無い。
UnityAds導入アプリのiOS審査提出時における広告ID(IDFA等)の回答例

#はじめに

UnityAdsはUnityが提供するサービスでCPI型の動画広告です。
従来のCPC型のバナー広告に比べ比較的ユーザーに不快感を与えにくく、UnityのServiceということもあり実装も簡単というメリットがあります。
UnityAdsの実装方法はネットを漁ればたくさん出てくるので、この記事ではiOSの審査で困ったところだけまとめたいと思います。

#審査時の質問

iTunesConnectで必要な情報を入力し、審査の提出ボタンを押すとアプリの広告に関する質問が表示されます。
UnityAdsを使用している場合、ここのチェック項目で悩まされます。

## 輸出コンプライアンス

```
輸出コンプライアンス
このAppを前回提出してから暗号化機能を追加または変更しましたか？
輸出法により、暗号化を含む製品は輸出のための適切な認可を受ける必要があります。
```

私の場合は暗号化は使用していないためNoと答えましたが、気になる方は以下の記事が参考になります。
[iOSアプリで暗号化したRealmを使用した場合に審査での「輸出コンプライアンス」についての回答例](http://qiita.com/yusuga/items/f1ac28aa55263e08b0dc)

## 広告ID （Advertising Identifier又はIDFA）

```
広告ID （Advertising Identifier又はIDFA）
このAppは広告ID(IDFA)を使用しますか？
広告IDFAは、各iOSデバイスの固有IDで、ユーザにターゲティング広告を提供するための唯一の方法です。ユーザは、iOSデバイス上でのターゲティング広告を制限することを選択できます。
```

|質問事項|回答|
|:------------|:------------:|
|使用しますか？|Yes|
|App内で広告を出す|Yes|
|このAppのインストールを前に出した広告の成果であるとする|No|
|このApp内で行われたアクションを前に提供した広告と関連付ける|No|

私の場合、以上の回答にすることで無事審査を通過することができました。
Rails has_manyとbelongs_toの宣言🔰

#has_manyとbelongs_toの使い方

userとpostの例

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :posts
end
```
ユーザーはpost(投稿)を何個も持つ（投稿を何度もできる）
そのため、複数形


```ruby:post.rb
class Post < ActiveRecord::Base
  belongs_to :user
end
```
1つのpostに紐づくユーザーは１人しかいない
そのため、単数形
なんかエロく感じる動画をglslsandboxにあげてみたｗ

特に意味はないですが…

# レムニスケートを書きたい。
![レムニスケート曲線.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/04ee9a69-8680-63d0-ef3d-305b4e2f526e.png)

# レイマーチングで、書いてみました。
ふと、レイマーチングで、レムニスケート曲線を描きたくなったので書きたくなったので、書いてみました。

![lemniscate.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/6221c2c5-4889-324b-d633-77a4a4865c13.png)

距離関数はこんな感じ

```glsl
float dLemniscate(vec3 p){
    return (p.x*p.x+p.y*p.y+p.z*p.z)*(p.x*p.x+p.y*p.y+p.z*p.z) - 1.15 * (p.x*p.x-p.y*p.y-p.z*p.z);
}
```

すると、ヌーブラっぽくなったので、これは、なんかつくれるのではないか？

とだらだら、お絵かきをつづけたところ以下のような動画が作れました。

なんか「エロい！」そういう所感をしかない…

![なんかエロく感じる動画.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/9e289755-e0b0-5a11-6af5-e7713fd46ab6.png)


http://glslsandbox.com/e#38033.0

```glsl
precision mediump float;
uniform vec2  resolution;    
uniform vec2  mouse;         
uniform float time;          
uniform sampler2D prevScene; 


float dLemniscate(vec3 p){
    return (p.x*p.x+p.y*p.y+p.z*p.z)*(p.x*p.x+p.y*p.y+p.z*p.z) - 1.15 * (p.x*p.x-p.y*p.y-p.z*p.z);
}

float dWall(vec3 p){
    return dot(p, vec3(0.0, 0.0, 0.3*abs(sin(time)))) + 1.0;
}

float distanceHub(vec3 p){
    return min(dLemniscate(p), dWall(p));
}

vec3 genNormal(vec3 p){
    float d = 0.001;
    return normalize(vec3(
        distanceHub(p + vec3(  d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
        distanceHub(p + vec3(0.0,   d, 0.0)) - distanceHub(p + vec3(0.0,  -d, 0.0)),
        distanceHub(p + vec3(0.0, 0.0,   d)) - distanceHub(p + vec3(0.0, 0.0,  -d))
    ));
}

void main(){
    
    vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);

    vec3 cPos = vec3(0.0,  0.0,  3.0);
    vec3 cDir = vec3(0.0,  0.0, -1.0);
    vec3 cUp  = vec3(0.0,  1.0,  0.0);
    vec3 cSide = cross(cDir, cUp);
    float targetDepth = 1.0;
    
    vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);
    
    float dist = 0.0;  
    float rLen = 0.0;  
    vec3  rPos = cPos; 
    for(int i = 0; i < 32; ++i){
        dist = distanceHub(rPos);
        rLen += dist;
        rPos = cPos + ray * rLen;
    }

    
    if(abs(dist) < 0.001){
        vec3 normal = genNormal(rPos);
        vec3 light = normalize(vec3(mouse + 1.0, 1.0));
        float diff = max(dot(normal, light), 0.1);
        gl_FragColor = vec4(vec3(diff,diff*0.71,diff*0.75), 1.0);
    }else{
        gl_FragColor = vec4(vec3(0.0), 1.0);
    }
}
```
CMakeのModule -- CMakePrintSystemInformation使ってみた

# CMakePrintSystemInformation 使ってみた

##　使い方
include (CMakePrintSystemInformation)
するだけ。
system系の変数を標準出力に出力する。

デバッグ時とか、不具合報告時に役立つのだろう。


## 例
``` cmake:CMakeLists.txt
include(CMakePrintSystemInformation)
```

出力
```
CMAKE_SYSTEM is Darwin-14.5.0 Darwin 14.5.0
CMAKE_SYSTEM file is Platform/Darwin
CMAKE_C_COMPILER is /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
CMAKE_CXX_COMPILER is /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS is -dynamiclib -Wl,-headerpad_max_install_names
CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS is -dynamiclib -Wl,-headerpad_max_install_names
CMAKE_DL_LIBS is
CMAKE_SHARED_LIBRARY_PREFIX is lib
CMAKE_SHARED_LIBRARY_SUFFIX is .dylib
CMAKE_COMPILER_IS_GNUCC =
CMAKE_COMPILER_IS_GNUCXX =
CMAKE_CXX_CREATE_SHARED_LIBRARY is <CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>
CMAKE_CXX_CREATE_SHARED_MODULE is <CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_CXX_CREATE_STATIC_LIBRARY is
CMAKE_CXX_COMPILE_OBJECT is <CMAKE_CXX_COMPILER>  <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>
CMAKE_CXX_LINK_EXECUTABLE <CMAKE_CXX_COMPILER>  <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>
CMAKE_C_CREATE_SHARED_LIBRARY is <CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>
CMAKE_C_CREATE_SHARED_MODULE is <CMAKE_C_COMPILER>  <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>
CMAKE_C_CREATE_STATIC_LIBRARY is
CMAKE_C_COMPILE_OBJECT is <CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT>   -c <SOURCE>
CMAKE_C_LINK_EXECUTABLE <CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>
CMAKE_SYSTEM_AND_CXX_COMPILER_INFO_FILE
CMAKE_SYSTEM_AND_C_COMPILER_INFO_FILE

```
GitHub への支払いが滞ったらプライベートリポジトリは消されてしまうのか？

#前置き
会社のクレジットカードで GitHub の支払いをしています。
会社が合併してクレジットカードも新しくなることになりました。
GitHubに登録してあるクレジットカードが微妙なタイミングで失効しそうだったので問い合わせました。
実際に支払いが滞った経験ではないのでご承知おきください。

#結論
支払いが滞ってもリポジトリは削除されません

当初の支払日の2週間後に再度クレジットカードにチャージしようとし、
その時点でも支払ができなかったらアカウントをロックされますが、
リポジトリは削除されることはないそうです。
支払いが完了したらアカウントはアンロックされるそうです。
安心しました。

```c:payment.c
if ( myCreditCard == VALID ) {
  charge();
  exit();
}
wait( 14DAYS);
if ( myCreditCard == VALID ) {
  charge();
  exit();
}
lock_account();
/* delete_repository(); */
引数の型が同じで返却値の型が違う関数

C++ では仮引数の型が全て同じで返却値だけ型が違うような関数をオーバーロードすることは出来ません。 以下のようなオーバーロードを試みるとエラーになることが確認できると思います。

```cpp
constexpr int one(void) {
  return 1;
}

constexpr char one(void) {
  return '1';
}
```

どうしても返却値だけ型が違う関数を定義したいのならばテンプレート (特殊化) を使う方法があります。

```cpp
template<class T> constexpr T one(void);

template<> constexpr int one(void) {
  return 1;
}

template<> constexpr char one(void) {
  return '1';
}
```

ところが、 C++ の関数テンプレートの型推論は__引数の型__を基にしておこなうので、引数の型が同じ (今回の例では引数を受け取らない) 関数テンプレートでは推論できません。 以下のように、呼出すときに型を陽に指定する必要があります。

```cpp
#include <iostream>

int main(void) {
  constexpr int a=one<int>();
  constexpr char b=one<char>();
  std::cout << a << b <<std::endl;
  return 0;
}
```

関数呼出しの際にどうにかして型を書かずに済ます方法はないかと考えたとき、型変換演算子を活用するという方法を思い付きました。

```cpp
class one {
public:
  constexpr one(void) {}
  template<class T> constexpr operator T(void);
};

template<> constexpr one::operator int(void) {
    return 1;
}

template<> constexpr one::operator char(void) {
  return '1';
}

#include <iostream>

int main(void) {
  constexpr int a=one();
  constexpr char b=one();
  std::cout << a << b <<std::endl;
  return 0;
}
```

型変換の時点で実際の処理を発生させるので、副作用を<ruby>伴<rp>(</rp><rt>ともな</rt><rp>)</rp></ruby>う関数では注意深く扱う必要がありますが、そうでない場合には有用な場面もあるのではないでしょうか。
XCODEでデバッグビルドとリリースビルドを切り替える方法

XCodeのビルドにはデバッグビルドとリリースビルドっていう２種類がある。

##デバッグビルドとリリースビルドを切り替える方法
1.プロジェクト名をクリックする
<img width="274" alt="スクリーンショット 2017-01-22 14.44.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/08b9f680-fe41-8217-fed7-db68b9813b5e.png">

2.Edit Scheme...をクリクする
<img width="310" alt="スクリーンショット 2017-01-22 14.42.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/a2df5fdf-6658-837f-1295-244fd61413fe.png">

3.Build ConfigurationでDebugとReleaseを切り替える
<img width="899" alt="スクリーンショット 2017-01-22 14.52.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/2fb26034-cdc7-2bd6-0ae3-d3fdea30e345.png">

##DebugとReleaseの違い
最大の違いは、リリースビルドでは最適化が行われるということ。なのでデバッグビルドに比べて高速に動作する。

###Debugビルドのときだけ実行されるコード

```Objc
#ifdef DEBUG
        NSLog(@"DEBUGのときのみ実行される");
#endif
```
MacでUSBからのUbuntuの起動ディスクを作った時のメモ

注意！ 試すときは勉強してやってくださいね。操作ミスってディスク全部消えたとかUSBが使えなくなったとかは普通にありえそうですからね。バックアップとか取ったり色々防衛してください。


基本は下記に従って行った。UbuntuをインストールしたVirtualBoxを用意してやってます。

http://kledgeb.blogspot.jp/2016/04/ubuntu-1604-uefi-1-uefipcubuntu-1604.html

これに従ってみたけれど、Macでは起動できなくて

https://wiki.ubuntulinux.jp/UbuntuTips/Install/UEFI/Build%20Bootable%20Usbthumb

rEFInd Boot Manager の項目を見て、下記（注意：sdXYのとこはあなたのマシンによって違うので調べてやってください。失敗しても私は責任持てませんので自己責任でやってください）。
bash install.sh --usedefault /dev/sdXY --alldrivers

そしたらMac起動時にalt押しっぱなしにしてたらメニュー選択できるようになった！おおお。


でも、めっちゃ遅いのと、起動シーケンスで何かがタイムアウトするまで待たないといけなくて実用にならない気がしてきた。開発だけUbuntuでやってみたかったのよ。ただそれだけなのにインストール5回くらいやって、膨大な時間を無駄にするとは何してんでしょう（笑）

とりあえずメモっとく。Ubuntu使いたかったらネットワークの向こうにマシン作るのが妥当な気がしてきた。
uGUIの表示順を自由に変更する方法見つけた！

uGUIのオブジェクトの並び順は通常、Hierarchyビューで見たときに下にあるオブジェクトの方が上に表示される。
通常であればゲームオブジェクトの並び順を変えれば表示順も変更できるのでそれで問題ないのですが、
それが親子関係だった場合さあ大変。

どう頑張っても親の方が上にあるので、親子間の表示順を変更することができません。

# しかし、そんな問題をスマートに解決する方法を見つけました。
というか、ちゃんと用意されていました。

![スクリーンショット 2017-01-22 14.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/59336/13055092-4ce8-c478-b858-80fa365b6f3c.png)


並び順を変えたいオブジェクトにCanvasをアタッチすると、なんとインスペクターに
「Override Sorting」というチェックボックスが表示されて
それをチェックするとさらに
「Sort Order」
という項目が表示されて表示順を個別に変更することができます！

これで好きなように表示順を変更できます！やったね！
イエーイ！

# 追記
Canvasだけアタッチするとマウスイベントに反応しなくなるので、一緒にGraphic Raycasterもつけておこう！