OmniAICreator/Qiita-1.07M huggingface dataset:
Qiitaのガイドラインに必要だったもの

オープンソースソフトウェアの育て方
http://producingoss.com/ja/

これ引用するだけにしとけば燃えなかったんだよなぁ
特に日本人に特効
再利用すべきなのはQiitaの方でした

[「なぜQiitaをつくったのか」
再利用性・汎用性の高い情報が集まる場をつくりたい](http://help.qiita.com/ja/articles/qiita-roots#%E3%80%8C%E3%81%AA%E3%81%9Cqiita%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B%E3%80%8D%E5%86%8D%E5%88%A9%E7%94%A8%E6%80%A7%E3%83%BB%E6%B1%8E%E7%94%A8%E6%80%A7%E3%81%AE%E9%AB%98%E3%81%84%E6%83%85%E5%A0%B1%E3%81%8C%E9%9B%86%E3%81%BE%E3%82%8B%E5%A0%B4%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%9F%E3%81%84)

ちなみに**さくらの約款はもっとヤバいのでこっちこそ広まれ**

第３５条（紛争の解決）
１．利用契約について紛争、疑義、または取決められていない事項が発生した場合は、当
社および利用者は誠意をもって協議の上これを解決するものとします。
２．利用契約に起因し、または利用契約に関連する一切の紛争について、利用者が当社を
提訴する場合は、東京地方裁判所を、第一審における専属的合意管轄裁判所とします。
当社が利用者を提訴する場合は、それぞれの国の法により裁判管轄を有する裁判所に
加え、東京地方裁判所に提訴をすることができ、また、**当社の選択により、裁判所へ
の提訴に代えて、日本の東京における日本商事仲裁協会の商事仲裁規則に従って行わ
れる仲裁により解決することができ、利用者はこれに同意します。当該仲裁は、当社
によって選任される１名の仲裁人により行われ、仲裁手続の言語は日本語とします。
当該仲裁における判断は上訴の権利を伴わず、利用者及び当社を拘束します。**

https://www.sakura.ad.jp/agreement/20170315_taihi_kihon.pdf
https://www.sakura.ad.jp/agreement/[a]yakkan0_kihon.pdf

なおさくらは黙殺した模様

https://twitter.com/ShibaKaido/status/841270739395268608

こういう契約ってどこの鯖屋でもクライアントが不利で実際の拘束力は契約でなく鯖屋の社会的信用から生じてるんだけどだからといって**法の意義を毀損するような著しく不平等な契約がまかり通るかというとそれは違うよね**っていう
AppのIconからVersionやCommitを判別して混乱を防ぐ

<img width="375" alt="8FE31810-1C87-48DC-A378-80C8B04273CD.png" src="https://qiita-image-store.s3.amazonaws.com/0/24765/0f5fbaff-f49b-2c3b-c4dc-5085d82317b3.png">

# Update 2018/08/12
iOS版にてiOS11端末にアプリをインストールした際にアイコン画像が変わらないという問題があったので修正しました。(v1.0 -> v1.1)
今までのように直接ビルド中間ファイルのアイコンファイルを書き換えるのではなく、actoolを使って生成する方法に変更しました。（この方法をWWDC2018でAppleのエンジニアの方に教えていただきました:clap:）

# Update 2017/11/09
Android版も作りました（まだalpha版＆ちょっと手抜きなのでちゃんと動かない可能性もあります。）
https://github.com/Tueno/IconHUD-Android

# 問題

社内でプロジェクト関係者の人が開発版のアプリを社内サーバーから入れて試してもらえるようになっているのですが、こんな問題がありました。

* APIサーバーの環境ごとに複数アプリを書き出して共存させていて、インストール後にどのアプリがどこに繋がるのかがパッと見てわからない
* 不具合が発生したアプリのコミットIDがわからない（不具合が発生した報告を貰ったが実は後のコミットで修正済みだった、など）
* どのブランチのアプリなのかパッと見てわからない

（そもそも開発フローやルールの問題というのもありそうですが...）

# 解決法

アイコンにビルド時の情報を載せることで、ホーム画面からアプリの情報が簡単に把握できるようになりました。

# やり方

ツールを
https://github.com/Tueno/IconHUD （iOS版）
https://github.com/Tueno/IconHUD-Android （Android版）
に公開しました。

## 機能
* ビルド日時・バージョン・コミットID・ブランチ名をアイコン画像の上に追加します
* プロジェクト内のアイコンファイルを書き換えません（ビルド用の一時ファイルのみ上書きします）
* TravisCI上での実行に対応（ブランチ名が正しく取得できないため別途処理が必要でした）
* Releaseビルドでは動作しません（BuildConfig/BuildTypeをチェックしているので変更した場合はご注意下さい）
* 必要に応じてDebugビルドでの処理を止められます（時間短縮用）

実行するとこんな感じになります。
![iconhud_sample.png](https://qiita-image-store.s3.amazonaws.com/0/24765/b7dd7e70-a82e-77bb-96f4-138c761b25b1.png)

## プロジェクトに導入するには

iOS版
```
brew tap tueno/iconhud
brew install iconhud
```

Android版
```
brew tap tueno/iconhud-android
brew install iconhud-android
```

でインストール後に、プロジェクト側に実行処理を記述するだけです。（記述箇所と内容はリポジトリのREADMEを参照。）

ちなみに、ビルドディレクトリのアイコン画像を加工するので、プロジェクトに入っているアイコン画像を汚すことはありません。
また、Debugビルド時には不要な場合は

```
--ignore-debug-build
```

のようにオプションを指定してください。
（その他のオプションについては `-h` で確認できます。）


# 注意点など

※Releaseビルドでは動作しないようになっているので、iOS版では社内配布用のBuildConfigを作成してご利用ください。
※アイコン画像が存在しない場合には対応できていません。
※昔の方法ですが、 `Info.plist` にアイコン画像ファイルを指定する方法には対応していません。(iOS版)

まだ少ない人数でしか使っていないため、抜け漏れや不具合などありましたらPRもしくはご指摘いただけると助かります！
MYSQL workbenchにおけるER図の見方

#ER図の構成要素
-エンティティ・・・データのまとまり（下図では全体を囲っている四角）
-アトリビュート（属性）・・・エンティティの中の属性情報（下図ではfilm_id SMALLINT以下のデータ）
-リレーション・・・エンティティ同士の関係性を表現する線（下図では左右に伸びている線）
-カーディナリティ（多重度）・・・「１対１」、「１対多」などリレーションの詳細を表現する記号（下図ではエンティティの左右についている鳥の足のような記号）


<img width="171" alt="スクリーンショット 2017-05-10 19.42.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/a14bc0ba-2d2b-6276-74aa-7174dadd408f.png">

#エンティティ同士の関係
-依存関係・・・必ず紐づくデータが存在しなければならない関係のこと、エンティティ間で親子関係になる
-非依存関係・・・エンティティ間の親子関係がないリレーション、一方が存在しなくてももう一方が存在することが出来る

#ER図の見方
-○・・・対０を表す
-｜・・・対１を表す
<img width="26" alt="スクリーンショット 2017-05-10 19.29.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/eb2c8e78-bedf-57f1-469d-2f433dca9db6.png">・・・対多を表す
-実線・・・依存関係を表す
-点線・・・非依存関係を表す
<img width="126" alt="スクリーンショット 2017-05-10 19.27.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/953e3fcb-b86d-e354-bd13-eceeb76c12ad.png">・・・１対１の関係
<img width="124" alt="スクリーンショット 2017-05-10 19.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/bca334be-3966-dc1a-e8b7-b86c41c0c2e6.png">・・・１対０以上の関係
<img width="127" alt="スクリーンショット 2017-05-10 19.27.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/3d8027fc-5013-3765-6c9f-aabef779ef3d.png">・・・１対１以上の関係
<img width="123" alt="スクリーンショット 2017-05-10 19.27.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/7b54ea52-efc1-0d27-2500-747e13292933.png">・・・多対多の関係
<img width="122" alt="スクリーンショット 2017-05-10 19.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/6f26e3b4-b284-3161-8be6-b37c39abddb8.png">・・・０または１対多の関係

##アトリビュート横についている記号について
-鍵マーク・・・主キー
-赤ひし形・・・外部キー
-白ひし形（赤枠）・・・NULLがある外部キー（外部キーであると仮定されているが、主キーとのリレーションがない）
-青ひし形・・・NULLはないが、主キーでも外部キーでもないもの
-白ひし形（青枠）・・・NULLがあり、主キーでも外部キーでもないもの

＊主キー・・・一意の重複のないデータ
＊外部キー・・・他の表と関連づけされているキー
特定のディレクトリを圧縮してGoogleDriveにうpしたい？


#簡単にプロジェクトを丸ごと圧縮してGoogleDriveにバックアップしたい事
そんな事、ありますよね？
え？ない？
まぁgithubとか使えばいいんだけど、もっと手軽ということで。

GoogleDriveをコマンドラインから使う為の、
https://github.com/prasmussen/gdrive
を使って、こんなのを作って使っています。


```gbackup.sh
#!/bin/bash
readonly TARGET=$1

#タイムスタンプ
TIMESTAMP=`date '+%Y%m%d_%H%M%S'`

#make zipfile
zipFileName="${TARGET}_${TIMESTAMP}.zip"
zipcmd="zip ${zipFileName} -r ${TARGET}"
eval $zipcmd

##pload to GoogleDrive
eval "gdrive upload -p id_of_desitination_dir ${zipFileName}"

```
gbackup.sh targetDir
とすると、
targetDirをzip圧縮して
targetDir_20170508_164637
のようにファイル名にタイムスタンプを付け、自動でGoogleDriveにupします。
特定のディレクトリをスナップショット的に保存するのに使っています。

#設定
最終行の
id_of_desitination_dir
をバックアップを保存したいGoogleDrive上のフォルダのIDに置き換えてください。
IDはそのディレクトリ内をブラウザで表示した時のURL
https://drive.google.com/drive/u/0/folders/xxxxxxxxxxxx
の最後尾のxxxxxxxxxxxxです。
【Swift3】アプリから電話をかける方法

```.swift
let url = NSURL(string: "tel://09012345678")!
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url as URL)
} else {
    UIApplication.shared.openURL(url as URL)
}
```

※シミュレーターでは反応しません。

【参考】
・[nsurl - How to use openURL for making a phone call in Swift? - Stack Overflow](http://stackoverflow.com/questions/24251259/how-to-use-openurl-for-making-a-phone-call-in-swift)
・[ios - how to open an URL in Swift3 - Stack Overflow](http://stackoverflow.com/questions/39546856/how-to-open-an-url-in-swift3)
iOSでDateをyyyy-MM-ddにフォーマットするベンチマーク

NSDateFormatterが遅いらしいというのは聞くので、
2017-05-10 形式にフォーマットする速度を、実際に計測してみました。

* NSDateFormatter （インスタンスをキャッシュしない／する）
* time_t + String(format:)
* time_t + strftime

## 結果

iPhone6 plus にて。

|| 実機|Simulator|
|:---|---:|---:|
|DateFormatter|18.274|9.317|
|DateFormatter shared instance|1.455|0.592|
|localtime + String(format:)|1.347|4.036|
|localtime + strftime|0.612|6.411|

Listなど、同じフォーマットをたくさん処理するなら、
とりあえずDateFormatterのインスタンスを共有するようにしとけば良さそう。
iOS7未満もサポートするなら、strftimeを使えばいいんじゃないか。

Simulatorでlocaltime使うと妙に遅い理由は何なんだろう。

## コード

```swift:swift2.3です
func benchmark(@noescape closure: (NSDate) -> Void) -> NSTimeInterval{
    let count = 100_000
    let date = NSDate()
    let start = date
    (0..<count).forEach { _ in
        closure(date)
    }
    return NSDate().timeIntervalSinceDate(start)
}

// DateFormatter
let t1 = benchmark() { (date) in
    let formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    let str = formatter.stringFromDate(date)
}

// DateFormatter shared instance
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let t2 = benchmark { (date) in
    let str = formatter.stringFromDate(date)
}

// localtime + String(format:)
let t3 = benchmark { (date) in
    var timeValue = Int(date.timeIntervalSince1970) as time_t
    let tmValue = localtime(&timeValue)
    let str = String(format: "%04d-%02d-%02d", tmValue.memory.tm_year + 1900, tmValue.memory.tm_mon + 1, tmValue.memory.tm_mday)
}

// localtime + strftime
let t4 = benchmark { (date) in
    let bufferSize = 11
    let buffer = UnsafeMutablePointer<Int8>.alloc(bufferSize)
    var timeValue = Int(date.timeIntervalSince1970) as time_t
    let tmValue = localtime(&timeValue)
    let len = strftime(buffer, bufferSize, "%Y-%m-%d", tmValue);
    let str = NSString(bytes: buffer, length: len, encoding: NSASCIIStringEncoding)
    buffer.destroy()
}

print(String(format:"DateFormatter %4.3f seconds", t1))
print(String(format:"DateFormatter shared instance %4.3f seconds", t2))
print(String(format:"localtime + String(format:) %4.3f seconds", t3))
print(String(format:"localtime + strftime %4.3f seconds", t4))
```

### 補足

* NSDateFormatterはiOS 7からスレッドセーフ
    * 参照: https://developer.apple.com/reference/foundation/nsdateformatter#1680059
* en_US_POSIX を設定しているのは、和暦設定時もyyyy表示するため
    * 参照: http://qiita.com/usagimaru/items/16263cbe32922cf57003
GAE/Goでのアプリの組み方


GoもGAEも不慣れな状態でやってみたら、タイミングもあって色々ハマったのでまとめました。
マサカリやもっといい方法があればぜひコメントください。

変更履歴

- **※Go1.8に対応**

## 目的

- GAEのアプリをリリースしたい
- テストも書きたい
- ローカルでの動作確認もしたい
- 外部ライブラリ使いたい
- DataStoreやQueueを使いたい

## 環境

- GAE/Go standard environment (go1.8.3)
- Google Cloud SDK 167.0.0
  - app-engine-go

サンプルのソースコードはこちら。
https://github.com/uryyyyyyy/GAESample

## GAEアプリのディレクトリ構成

### ディレクトリ構成

色々悩んだ結果こうなりました。

```
$ tree .
.
├── app
│   ├── gae_service1
│   │   ├── local.yaml
│   │   ├── main.go
│   │   └── prod.yaml # stg.yamlも必要があれば
│   ├── gae_service2
│   │   ├── local.yaml
│   │   ├── main.go
│   │   └── prod.yaml
│   └── other_application # GAE以外にgoアプリがあれば
│       └── main.go
├── bin # GAE以外のアプリのバイナリ置き場など
├── commands # 各種コマンド置き場
├── src # 自分で書いたコード
│   ├── gae_service1 # 各サービスでのみ使うコードとか
│   ├── gae_service2
│   ├── other_application
│   └── utils # 共有したいコードとか
└── vendor
    ├── glide.lock
    └── glide.yaml
```

### Commands

Makefileは個人的に使いにくかったのでshellベースにして、commandsフォルダ以下に置きました。

処理内容はお好みですが、共通部分としてGOROOT、GOPATHなどの設定をしています。

```
export GOROOT=$(dirname $(which dev_appserver.py))/../platform/google_appengine/goroot-1.8
export GOPATH=`pwd`:`pwd`/vendor
export GAE_ROOTDIR=`pwd`
```

GOROOTは見ての通りで、GAEでの動作環境に合わせています。
GOPATHは、src以下を入れるのは良いとして、vendorを普通のGoアプリのようにsrc直下に置くと `gocloud app deploy` コマンドがうまく動かないためワークアラウンドとして避けています。いいやり方があれば知りたい。

コマンドの具体的な内容としては、例えば

- ローカルでのGAEアプリのrun（必要に応じて複数立ち上げたりcronも入れたりする）
- deployコマンド（バージョニングや）

などがあります。いずれも記述量は少ないものの、たまに気をつけることがあるのでshell化しています。詳しくはサンプルを見てください。

### なぜこうなったのか

#### vendorについて

前述したとおり、GAEにはvendorの考慮がされていないようで、普通にvendor以下に置いてしまうとデプロイがうまくいかなかったりが頻発しました。
`goapp` コマンドを使ったり `nobuild_files` の記述で回避できているケースもあるようですが、面倒なのでフォルダを別で管理してGOPATHに追加することで誤魔化しています。

また、GCPUGで聞いた所、 `appengine` パッケージでなく、 `google.golang.org/appengine` を使うことが推奨されているようなので、glideなどで管理しつつなるべく最新に追従させるようにしています。
（今後go1.8が正式対応するにあたり、context周りで破壊的変更が入るだろうとのことでした。）

#### appディレクトリについて

GAEへのデプロイをする際に、普通にsrc以下にエントリのファイルを置くと、ビルド時になぜかファイルが重複してアップロードされるようでエラーになります。
エントリポイントとその他ファイルを別ディレクトリに置くと上記問題が解消されるとの記事を見かけたので、そのように対応しています。

#### app.yaml（local.yaml / prod.yaml）について

GAEでは、各種設定をyamlファイルで記述することになっています。
デフォルトではapp.yamlが読まれるのですが、環境毎に設定を分けたい場合は任意のファイル名にできます。
例えば、localでは外部サーバーへのアクセスはしてほしくない、ログをたくさん吐きたい、という場合のために、各環境毎に環境変数を変えたyamlを用意しています。

また、複数のGAEアプリケーションを立ち上げることはよくあると思うので、service名を付けて区別するようにします。

#### GAEへのデプロイ

gcloudではデフォルトでは日時でバージョンが振られます。
これだけではどの状態のアプリをリリースしたのかわからないので、git hashをversionに含めるようにしています。

#### testやlintについて

特に気にせず書けています。
goのappengineのコードでのテストの書き方はまた別の機会に書きます。
入れ子になったタグの親要素にだけnth-of-typeを使って反映させる


#nth-of-typeとは
>E:nth-of-type(n)は、疑似クラスの一種で、 n番目のその種類の要素にスタイルを適用する際に使用します。

引用元 : [CSS3リファレンス E:nth-of-type(n)](http://www.htmq.com/selector/nth-of-type.shtml "CSS3リファレンス E:nth-of-type(n)")

#nth-childとの違い
似たような擬似クラスで `nth-child` というものがあるのですが、
大雑把に説明すると、

以下のようなHTMLがあった際に

```
<div>
	<p>1つ目のPタグ</p>
	<p>2つ目のPタグ</p>
	<span>1つ目のspanタグ</span>
	<p>3つ目のPタグ</p>
	<p>4つ目のPタグ</p>
</div>
```

```
div p:nth-of-type(4){
	background-color : red;
}
```

だと `<p>4つ目のPタグ</p>` の背景色が `赤` になり、

```
div p:nth-child(4){
	background-color : red;
}
```
だと `<p>3つ目のPタグ</p>` の背景色が `赤` になる感じです。

要は、nth-of-typeは`divの子で4つ目のpを赤くする` 
nth-childは`divの子で4番目の要素がpなら赤くする`って感じです。

nth-of-typeの場合divの `子であるpだけ` をカウントしているのですが
nth-childの場合divの `子である全ての要素` をカウントしています。

![スクリーンショット 2017-12-20 9.34.29.png](https://qiita-image-store.s3.amazonaws.com/0/72559/b02446e5-1a0a-e90c-30ce-b3fc6b088239.png "スクリーンショット 2017-12-20 9.34.29.png")

<font color="DeepPink">※今回はこの程度の説明で良いだろうってことで簡単に書いてます。詳しくは別途調べてください。</font>

#今回したいこと
例えば、tableの中にtableが作り(つまり入れ子)になってるものに対し
外側のtableの1番目のtdだけを赤くしたいとします。

そこで以下のようなCSSを書いてしまうと

```
table.table1 td:nth-of-type(1){
	background-color : red;
}

```

以下のように入れ子になっているテーブルにまで影響が出てしまいます。

```
<table class='table1'>
	<tbody>
		<tr>
			<td>
			ここの背景を赤くしたい
			</td>
	
			<td>
				<table>
					<tbody>
						<tr>
							<td>ここまで赤くなる</td>
						</tr>
					</tbody>
				</table>
			</td>
		</tr>
	</tbody>
</table>
```

#解決
`> セレクタ`　を使います。
`>` セレクタを使うと `ある要素の直下の階層にある要素にスタイルに適用`されるので、
以下のように書きます。

```
table.table1>tbody>tr>td:nth-of-type(1){
	background-color : red;
}
```

#最後に
tableを入れ子にするくらいならdivで組めば良いと思う。

<font color="DeepPink">※何か他に良い方法があれば教えてください</font>
CakePHP2でtype="date"のまま（selectタグではなく）inputタグを出力したかった話

Chromeはinputタグにtype="date"と入れてやると独自のカレンダーが表示されるので、これを実装したいと思った。
参考： http://qiita.com/growsic/items/b6ef236d9d4f062365b8

FireFoxとか対応してないブラウザもあるのでそちらはbootstrap-datepickerで対応した。
参考： http://chaika.hatenablog.com/entry/2015/09/28/175239

今回はCakePHP2系で開発する。
元となるHTMLにJSを埋め込み、ブラウザ毎の挙動を確認した。
その後inputタグをFormHelperを使って書き直したところ問題が発生した。

```php
<?php
echo $this->Form->input('sampledate', array('type' => 'date'));
```
これではCakePHPが勝手にselectタグを作成してしまう。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/162724/d74b1a83-e23b-2d95-16cd-c810e3ba2480.png)
だからといって'type' => 'text'としてしまってはカレンダーは表示されない。
jQueryでtypeの値を変えてしまおうかとも思ったが、どうやら仕様上不可能なようだった。

FormHelperを使わなければいいじゃんという話になりそうだが、解決策はあった。

```php
<?php
echo $this->Form->text('sampledate', array('type' => 'date'));
```
FormHelper::textを使用し、optionsでtypeを設定してやれば良い。想定通りinputタグのまま出力される。
<input name="data[Model][sampledate]" type="date" id="ModelSampledate">
[GitHub]別リポジトリの更新を取り込む

## やりたいこと
他のリモートリポジトリの更新を自分のリポジトリに取り込みたい

## 例
- 元となるリポジトリを複数人でそれぞれ`Fork`してカスタマイズしている
- 基本的には自分の使いやすいようにカスタマイズする
- でも、他の人がいい感じのカスタマイズしてたりすると、それを自分のリポジトリに取り込みたくなる

### 例のイメージ

![remote-add.001.png](https://qiita-image-store.s3.amazonaws.com/0/102583/17da9dfb-0ebf-135f-1e95-837e04291790.png)

## やり方（`master`ブランチを取り込む場合）
1. 自分のリポジトリをローカルにクローンする
    - `$ git clone https://github.com/self/project.git` 
2. クローンしたディレクトリに移動する
    - `$ cd self-pj` 
3. Aさんのリポジトリ(取り込みたいリポジトリ)を`remote`に登録する
    - `$ git remote add a-san https://github.com/a-san/project.git`
4. Aさんのリポジトリを`pull`する
    - `$ git pull a-san master`  
5. 自分のリモートリポジトリに`push`する
    - `$ git push origin master`

## 参考
http://qiita.com/tak74/items/b0d1cc92fd172468fbf3

上記記事を参考にさせていただきました。
同じような内容を、自分の環境に合わせた表現にしました。
よく使うgcloudコマンドたち

## 一般
### 自分のプロジェクト一覧を表示
`gcloud projects list`

### cloud sdkのプロパティを見る
`gcloud config list`

### プロジェクト切り替え
`gcloud config set project <your-project-id>`

## GCE
### インスタンス一覧を見る
`gcloud compute instances list`

### インスタンスの作成(centos-7で)
`gcloud compute instances create <your-instance-name> --project <your-project-name> --image-family centos-7`

### 使用可能なimage一覧を見る
`gcloud compute images list`

### インスタンスの起動・停止
`gcloud compute instances start <your-instance-name>`
`gcloud compute instances stop <your-instance-name>`

### インスタンスにssh
`gcloud compute ssh <your-instance-name>`

### 通常のsshコマンドで接続できるように設定
`gcloud compute config-ssh`
~/.ssh/configに稼働中のインスタンスへの接続設定が作られる。
`ssh <your-instance-name>.<zone>.<your-project-id>`
ssh [tab]で

### インスタンスへローカルのファイルをコピーする
`gcloud compute copy-files <local-path> <your-instance-name>:<remote-path> --zone <zone>`

### インスタンスにあるファイルをローカルにコピーする
`gcloud compute copy-files <your-instance-name>:<remote-path> <local-path> --zone <zone>`
Xcodeのバージョンがまた上がったことによるコードサインの諸問題

いつの間にか、またMacのJenkinsでのUnity自動ビルドが失敗するようになりました…。

>xcodebuild: error: invalid option '-exportProvisioningProfile'.

正確には、Xcodeビルド(アーカイブ)後のコードサインのための`xcodebuild -exportArchive`で失敗。どうやらいつの間にかXcodeのバージョンが8.3に上がっていて(誰がやったんだ…？)、ProvisioningProfileを指定する`-exportProvisioningProfile`オプションがなくなったようです。

試しに`-exportProvisioningProfile`を外すと、今度は
>xcodebuild: error: The flag -exportOptionsPlist is required when specifying -exportArchive.

と言われます。となれば、ExportOptionsPlistを作って差し上げましょう。

プロパティリスト(.plist)は適当なテキストエディタでも作れるんですが、文字コードとかヘッダとかいろいろ細かい問題があると困るので、Xcodeで作ります。

Xcodeのメニューバーから"File->New->File..."で"Resource"の"Property List"を選択してください。あとは"Key"の＋ボタンをクリックすると、項目が追加できます。

必要な項目(キー)は、

```
xcodebuild -help
```
をすると最後のほうに設定可能なキーのリストが出てきます。私の場合はアドホック用のビルドなので、

![plist.png](https://qiita-image-store.s3.amazonaws.com/0/141731/e3f3a021-2246-aec0-3dbb-572d82ee6d54.png)

|Key|Value|メモ|
|:--|:--|:--|
|method|ad-hoc|他にapp-store,package等がある|
|teamID|**********|いつもの10桁の英数字|

のみ設定しました。ProvisioningProfileはteamIDとBundleIdから勝手に参照するようです(もしかしたらこれも不要かも？)。


最終的にコマンドラインで

```
xcodebuild -exportArchive -archivePath Hoge.xcarchive -exportPath Hoge.ipa -exportOptionsPlist Hoge.plist
```

とすると、コードサインが行われて.ipaファイルが生成されます。

…と思ったら、なんか以前(Xcode 8.2.1)と挙動が違う。以前と同じexportPathだと"Hoge.ipa/"というフォルダに.ipaファイルが書き出されてしまいます…。しかも、ipaファイルの名前は勝手にApplicationPropertiesのNameにされてしまうようです。

ということで、

```
xcodebuild -exportArchive -archivePath Hoge.xcarchive -exportPath . -exportOptionsPlist Hoge.plist
mv Unity-iPhone.ipa Hoge.ipa
```
の二段構えでなんとかなりました。Unity-iPhone.ipaの部分は環境に合わせて変更してください。.xcarchive内のinfo.plistを見て差し替えるという手もありますが、時間が無いのでこれで。

それにしても、iOSアプリ開発はXcodeがバージョンアップするたびに手法が変わって、追いつくのが大変…。
JavaScriptの静的解析ツール「plato」

レビューとか、実装のお供に。コード解析ツールです。

```bash
npm i -g plato
plato -r -e .eslintrc -d outputDir src
```

- -rで再帰的に。
- -eは、eslintでlintしている場合（デフォルトはjshint）
- -dは、解析結果の出力先フォルダ
- 最後のsrcが、調査対象フォルダ

※.eslintrcをYAMLで書いてたらエラーになった。JSON形式しかダメとは。。。

npm scriptに登録しておくと```npm run plato```とかできてよさげ。
とにかく右クリックを禁止したい（コンテキストメニューを出さない）

これやるとページ全体で右クリックできなくなるので、DOMを指定したり、開発時は動作しないようにしたりするのはよしなに。

```js
<script>
jQuery(function($){
	$(document).on('contextmenu',function(){ return false; });
});
</script>
```

現場からは以上です。
CognosからデータベースにユーザーID情報などを引き渡し、データベースの権限管理や監査などの機能と連携する情報

##概要
タイトルが長くなってしまいましたが、CognosからデータソースであるDBへの接続は、基本的に1本の接続定義(接続用ユーザーIDも1ユーザーを定義)にて接続するため、Cognos側のログインユーザーが誰であろうと、DB側から見ると同じユーザーでアクセスしてきているように見えます。
そうなると、DB製品としての、接続ユーザーに対してキメ細やかな権限管理や監査を提供する機能が使えない、という話が良くあります。

そんな時に役に立ちそうな参照情報を、まとめておきます。
基本的には、Cognosのデータソース定義の中で設定できる、コマンドブロックを使用します。
下図の、「セッション開始のコマンド」の設定を行う事で、CognosからDBへの接続時に何らかの情報を投げたり、コマンドを実行したりする事ができます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/938a90ae-cab8-b084-7d3c-a603e0715d68.png)


##Oracle データセキュリティ機能との連携
少し古い資料ですが、Oracleのデータセキュリティ機能とCognosを連携する際に、CognosのコマンドブロックでOracleにユーザーIDやパスワードの情報を投げている、最もわかりやすい説明資料ですが、なぜか検索にひっかかりにくい資料なので、貴重な資料として紹介しておきます。
http://public.dhe.ibm.com/software/dw/dm/cognos/security/design/leveraging_oracle_security_public.pdf

コマンドブロックはこんな感じですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/95d8336b-0420-c6e1-6698-cc947b511fbf.png)

##DB2との連携
前述の様に、Oracleの場合の記載方法の情報は見つかるのですが、OCI_ATTR_XXXXと書かれると、Oracle接続のための書き方に思えるので、DB2の場合はどうするのだろうと悩みます。
そんな時に、このTechnoteが役に立ちます。
**Troubleshooting IBM Cognos BI accessing DB2 Data Sources configured for Trusted Context**
http://www-01.ibm.com/support/docview.wss?uid=swg21449936

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/723807dc-3301-a267-ec07-fc867468e8cf.png)
Oracleの接続にしか見えないですが、
**Although the name of the argument is OCI_ATTR_USERNAME which reminds of ORACLE it is indeed correct and deliberately set. **
だそうです。

DB2のトラステッドコンテキスト機能は、こちらをご参照下さい。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0050514.html

##DB2の監査機能との連携
以下のように、WorkLoadManagerのストアードプロシージャーを呼び出す記述を行う事で、DB2側にユーザー名を渡し、DB2の監査機能を利用する事ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/1e823273-094d-aa91-df06-45aa43b7e76b.png)

DB2の監査機能は、こちらをご参照下さい。
http://www.ibm.com/developerworks/jp/data/library/dataserver/j-d_db2security02/
http://www.ibm.com/developerworks/jp/data/library/dataserver/j-d_db2security03/
HerokuのDBをローカルにリストアする手順まとめ

よくやるので手順メモ。

# Heroku→ローカル

### HerokuDBの最新キャプチャ（バックアップ）作成

```
heroku pg:backups:capture
```

だいたい毎日バックアップ取る設定にしてるので、ぴったり最新でなくてもよければそっちを使ってもOK。


### キャプチャのURLを取得

```
heroku pg:backups:url b730
```

最後の`b730`は、キャプチャ作成時に表示されるIDを指定。

### キャプチャをローカルにダウンロード

```
curl -o db.dump "DOWNLOAD_URL"
```

`DOWNLOAD_URL`のところは、さっき取得したURLをつっこむ。

これで手元に`db.dump`としてファイルが落ちてきました。


### ローカルのDBにリストア

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U USER -d DATABASE db.dump
```

`USER`と`DATABASE`は実際のDBの設定を入れてください。


# ローカル→Heroku


```
heroku pg:backups restore db.dump DATABASE_URL --app APP_NAME
```

---

おしまい。
MIMEタイプってなんだ？

自分用の忘備録なので、とても基礎的な基礎な内容ですが残しておきます。

#HTML5には文法が2種類ある
MIMEタイプというものを知る前に、こんな経緯がありました。
HTML5の勉強をし始めたばかりの自分は、
**HTML5には2種類の文法があるよ。**という話を初めて聞きました。

**1.MIMEタイプ「text/html」で配信するページ向けのHTML構文**
拡張子：.htmまたは.html
通常HTML5といえばこちらの構文。

**2.MIMEタイプ「application/xhtml+xml」で配信するページ向けのXHTML構文**
拡張子：.xml
XMLの仕様に従う構文。

と、ここで早速疑問が浮かびます。
**そもそも、「MIMEタイプ」って何ぞや？**
あいまいみーまいんというやつなのか？

#拡張子はよく知っているけど、「MIMEタイプ」って？
webの世界では、ファイルの種別を何であるか示す「拡張子」という概念と、もうひとつ「MIMEタイプ」という概念があるそうです。

##[MDNさんはこう言っておりました。](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)
>MIME タイプはクライアントに対して、転送するドキュメントの種類を伝える機能です。ウェブにおいて、ファイル名の拡張子は意味を持ちません。従って、サーバーはそれぞれのドキュメントと共に正しい MIME タイプを転送するよう適切に設定することが重要です。ブラウザーはたいてい MIME タイプを、読み込んだリソースに対して行う既定のアクションを決めるために使用します。

##MIMEタイプ構文
>type/subtype

拡張子はファイルの種別を分けるのに使いますが、MIMEタイプはさらにもう少し詳しい情報をブラウザに伝えるためのもの。

画像ファイルのgif、テキストファイルのcssみたいな。
確かに見た目が同じ画像ファイルと言っても、gifとjpgは違うファイルですしね。

|タイプ|	説明|代表的なサブタイプの例|
|:-----------------|:------------------|:------------------|
|text|テキストを含んでおり、理論上は人間が読めるドキュメントを表します。|	text/plain, text/html, text/css, text/javascript|
|image|なんらかの種類の画像を表します。動画は含まれませんが、アニメーションする画像 (アニメーション GIF など) は画像のタイプで表します。|image/gif, image/png, image/jpeg, image/bmp, image/webp|
|audio|なんらかの種類の音声ファイルを表します。|audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav|
|video|なんらかの種類の動画ファイルを表します。|video/webm, video/ogg|
|application|なんらかの種類のバイナリーデータを表します。|application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml,  application/pdf|
（MDNさんより引用）


例えばこう……
ブラウザ「サーバーさん、logo.gifくんを呼びたいんだけど」
サーバー「おお、そいつは画像のgif形式だね、任せとけ～」
ブラウザ「そうそう、そいつだよ！ありがとう、表示出来たよ！」
みたいな感じなのか。

そもそものきっかけだったHTML5の文法が2種類な理由から大分外れましたが……
**拡張子以外の方法で、転送するドキュメントの種類をブラウザに伝える方法**という認識でよいのかなーという結論になりました。


HTML5の文法が2種類であることについてはまた記事を分けよう…
jupyter notebookを立ち上げる(+気持ちセキュリティ対策をする)


##目標
  - [ ] jupyterをポートを9999に変える
  - [ ] パスワードログイン方法にする

### jupyterインストール
```shell-session
$ sudo pip install --upgrade pip
$ sudo pip install jupyter
```

###リモートアクセスのためのパスワードハッシュ
```shell-session
$ ipython
In [1]: from IPython.lib import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]:~~~~~~ハッシュ化されたパスワード〜〜〜〜
Out[2]:exit
```

###jupyterで作成されるノートの保存ディレクトリーを作成
```shell-session
$  mkdir ~/jupyter_dir
```
 
### jupyterのコンフィグを作成コンフィグを変更
```shell-session
$ jupyter notebook --generate-config
Writing default config to: ~/.jupyter/jupyter_notebook_config.py
$ vi + ~/.jupyter/jupyter_notebook_config.py
```
```shell-session:jupyter_notebook_config.py
      最終行に以下を追加
          c.IPKernelApp.pylab = 'inline'
          c.NotebookApp.ip = '*'
          c.NotebookApp.open_browser = False
          c.NotebookApp.port = 9999
          c.NotebookApp.password = u'<作成したハッシュキー>'
          c.NotebookApp.notebook_dir = '<作成したディレクトリー>'
```
 
###バックグラアウンドで起動
```shell-session
$ cd ~
$ nohup jupyter notebook >> jupyter.log 2>&1 &
``` 
エラーがあれば(~/jupyter.log)を見ればなんとなくわかる

###jupyterに接続して繋がることを確認する
http://IPアドレス:9999
Fastlaneとpatsplat/plistを使っている時にバイナリ形式plistが出力されるときの原因と対策

なんか1回ずつFastlaneでgymしてdeliverしてーはできるが、2個以上連続してビルドするとエラーになる。

# 条件/環境
* Fastlane 2.28.9.
* [plist 3.3.0](https://github.com/patsplat/plist)
* [xcodeproj (>= 1.4.4, < 2.0.0)](https://github.com/CocoaPods/Xcodeproj)
* [CFPropertyList (~> 2.3.3) ](https://github.com/ckruse/CFPropertyList)
* ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]


# 現象

* 発生しだしたのは4月末頃から。
* Fastlaneとpatsplat/plistを使うと、ひょんなときにplistがバイナリ形式で出力され、patsplat/plistでエラーがでる。
* そのため、1度目のビルドは通るが、2度目にInfo.plistを変更した後のビルドは通らない。(謎)
    * patsplat/plist が `invalid byte sequence in UTF-8` というexceptionを投げてくる。


# 修正方法

plist と CFPropertyListを共存させてはならぬ。[^1] [^2]
patsplat/plist 使わず、ckruse/CFPropertyList を使って実装することを提案します (　´･‿･｀)


[^1]: 使い方によっては不具合があることについては既に半年以上前に[Fastlane側のIssue](https://github.com/fastlane/fastlane/pull/6835)やCocoaPods/Xcodeprojで[認識されているが議論はほぼ全く進んではいない](https://github.com/CocoaPods/Xcodeproj/issues/442)。個人的にはFastlane側で対策する問題ではなく、Cocoapods/Xcodeprojが対策すべきーと思うが、そもそも論として、各ライブラリはそれぞれが不具合無く存在している以上、共存させて使ってバグを出している側がイケないので僕たち使う側が治すべきだと思う。またplistもCFPropertylistも古参のライブラリでもあるため治るまで時間が掛かるのではないかという点もある。そもそも半年も治ってない時点で治るまでの時間がかかるのは察せマス。
[^2]: てか、なんでこのタイミングでバグふんだんだろ。FastlaneのIssue見る限り年末には発覚してないと変


# 一時的な回避。作業用lane.

現象にあげるexceptionが発生したときにする作業用lane.(`Proj`は任意のプロジェクト名)
治るものじゃないけど、取り敢えず3つビルドしたいんだ！というときに使った。

```rb
lane :reset_plist do
  UI.message "Your working folder: " + `pwd`
  `git checkout HEAD -- ../Proj/Info.plist`
  `git checkout HEAD -- ../Proj`
  `git checkout HEAD -- ../ProjTests/Info.plist`
  `git checkout HEAD -- ../ProjUITests/Info.plist`
  `rm ../Proj/Info.plist.new1`
end
```

呼び出し:`$ fastlane reset_plist`



# 根本的な原因

前提として、

* FastlaneはCocoapods/Xcodeprojを使っている。
* patsplat/plist はバイナリ形式plistには対応していない
* Cocoapods/Xcodeprojはバイナリ形式plistには対応している。(ckruse/CFPropertyListを使うことにより対応している。)

そのためバイナリ形式に変換されたInfo.plistはpatsplat/plistは扱うことができない。

そして、 `patsplat/plist` 内の実装抜粋はこちら:

```rb
  # Helper method for injecting into classes.  Calls <tt>Plist::Emit.dump</tt> with +self+.
  def to_plist(envelope = true)
    d = Plist::Emit.dump(self, envelope)
    return d
  end
```
```rb
class Hash #:nodoc:
  include Plist::Emit
end
```

次に、 `ckruse/CFPropertyList` 内の実装抜粋はこちら:

```rb
class Hash
  # convert a hash to plist format
  def to_plist(options={})
    options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY

    plist = CFPropertyList::List.new
    plist.value = CFPropertyList.guess(self, options)
    plist.to_str(options[:plist_format], options)
  end
```

以上のことにより、plist と CFPropertyListを使っている場合は予期せず違うやつを呼び出してしまう事がある。悲しい。
組込みC > atan2() > xが0.0の戻り値 > 3.40282346E+38 > 定義域エラーが発生した場合、関数は処理系定義の値を返す

```txt:動作環境
とある16bitのMCU用開発環境 (C言語)
```

用意された`math.h`のatan2()を使用。

関連 http://www.c-tipsref.com/reference/math/atan2.html

```math
tan^{-1}(y/x)
```

ここで、xが0.0の時の処理はどうなっているか。

### ideone
http://ideone.com/DCurD9

```c
#include <stdio.h>
#include <math.h>

int main(void) {

	printf("%f\n", atan2(0.0, 0.0));
	
	return 0;
}
```

```txt:run
0.000000
```

### 使用中の組込みC 

`3.40282346E+38`が返るようになっていた。

結果としてprintf()表示した時に`inf`となる。

使用している機器が故障して、データが取得できなくなった場合などはxが0.0になる場合がある。
その時に使用中の組込みCのライブラリでは、きちんと対処をしないと`inf`になるようだ。

他の開発環境・ライブラリの場合でx=0.0のatan2()戻り値がどうなるかは未調査。

atan2()を使う前に常にx=0.0のチェックを入れるのは安全ではある。

### ATAN2(3)

http://man7.org/linux/man-pages/man3/atan2.3.html
RETURN VALUE の項目に色々な場合の戻り値がある。

> If y is +0 (-0) and x is -0, +pi (-pi) is returned.
> If y is +0 (-0) and x is +0, +0 (-0) is returned.

使用中の組込みCではこのような戻り値ではない。

### 教えていただいた事項

@SaitoAtsushi さんの[コメント](http://qiita.com/7of9/items/54ba0a9f6e4a778d7ace/#comment-917ab5d2292d8504e033)にて処理系定義の値が返っているようであることが分かりました。

情報感謝です。
[Linux][kernel module] ローダブルカーネルモジュールのロード時に引数でパラメータを渡す方法

ローダブルカーネルモジュールのinsmod時にパラメータを渡せるようにする方法メモ
基本的にmodule_param(3) を使用すれば良いです。

カーネルモジュールのビルド方法に関しては以下などを参考にして下さい。

[[Linux][kernel module] 簡単なローダブルカーネルモジュールのビルドとロード - Qiita](http://qiita.com/koara-local/items/39002cc1f611e26114f8)

# ソース

```c:testmod.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

MODULE_LICENSE("MIT");

static int param1 = 1;
static int param2 = 2;

module_param(param1, int, S_IRUGO);
module_param(param2, int, S_IRUGO);

static int testmod_init(void)
{
	printk(KERN_INFO "driver loaded\n");
	printk(KERN_INFO "param1 = %d\n", param1);
	printk(KERN_INFO "param2 = %d\n", param2);
	return 0;
}

static void testmod_exit(void)
{
	printk(KERN_INFO "driver unloaded\n");
}

module_init(testmod_init);
module_exit(testmod_exit);
```

## module_param(3)について

`module_param(param1, int, S_IRUGO);` のようにする。

+ 第一引数に変数名
+ 第二引数に型名
+ 第三引数は読み込み専用属性。`S_IRUGO|S_IWUSR` でルートのパラメータ変更許可。

## 使用できる型について

+ bool
+ invbool
+ charp
+ int
+ long
+ short
+ uint
+ ulong
+ ushort

## 配列パラメータ(module_param_array(4))

配列パラメータをを取り扱える `module_param_array(4)` も存在する。
TODO: サンプル作成

# 実行例

```console:実行例（パラメータなし）
$ sudo insmod testmod.ko
$ sudo rmmod testmod.ko
$ dmesg | tail
[109428.165469] driver loaded
[109428.165472] param1 = 1
[109428.165474] param2 = 2
[109428.173077] driver unloaded
```
```console:実行例（パラメータあり）
$ sudo insmod testmod.ko param1=10 param2=20
$ sudo rmmod testmod.ko
$ dmesg | tail
[109428.165469] driver loaded
[109428.165472] param1 = 10
[109428.165474] param2 = 20
[109428.173077] driver unloaded
```

# 関連
[[Linux][kernel module] 簡単なローダブルカーネルモジュールのビルドとロード - Qiita](http://qiita.com/koara-local/items/39002cc1f611e26114f8)

# 参考
「Linux デバイスドライバ 第3版」 2.8 モジュールパラメータ p.35
体系的なSwift言語学習



言語学習をしていると、もっと体系的に学びたい、実際に実務でどんな感じのソースコードが書かれているかみたいなどと思うことがあると思います。その中で自分が体系的に学べたものをいくつか紹介したいと思います。
※内容は初心者から中級者向けです。

###Github Repositories
- https://github.com/raywenderlich/swift-algorithm-club

 　raywenderlichさんによる、swiftでalgorithmを学べるリポジトリです。

　

- https://github.com/kickstarter/ios-oss

　 Kickstarterさんが実際にリリースしているアプリのオープンソースリポジトリです。

　

- https://github.com/mixi-inc/iOSTraining/blob/master/Swift/README.md

　　mixiさんが公開している、実務スキルを身につけることができるトレーニングコースです。
　　Swift版は、Cyberagentさんのキャンプで使われたものがマージされたものみたいです。


##Youtube Channels（動画配信サービス 無料）
- https://www.youtube.com/user/Archetapp/playlists
 
 　　Jared Davidsonさんが爽やかな顔で登場して、
 　　有名アプリのUIを作成したり、実践的なアプリを作成したりしています。

　

- https://www.youtube.com/channel/UCysEngjfeIYapEER9K8aikw/playlists

　　Brian Adventさんが様々な機能をおっとりとした声で
　　解説をしながらコーディングする、実践的な動画をアップロードしています。

　

- https://www.youtube.com/channel/UCuP2vJ6kRutQBfRmdcI92mA/playlists

　　Brian Voongさんが今流行りのFirebaseを使ったチャットアプリを作ったり、
　　Playgroundを使ってAlgorithmsをコーディングしながら解説したり、
　　実践的な動画をアップロードしています。

##Udemy（動画学習サービス　有料）

- https://www.udemy.com/ios10-perfect/

　　Xcodeをインストールしようから実践的なアプリを複数作って、
　　体系的に様々な機能を学ぶことができます。

##Books

- [絶対に挫折しない iPhoneアプリ開発「超」入門 第6版 【Swift 4 ＆ iOS 11】完全対応](https://amzn.to/2Hg9e8f)

絶対に挫折しないシリーズは、すごく優しいので、始めに購入する本としてオススメです。

- [Swift実践入門 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)](https://www.amazon.co.jp/dp/4774187305/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=getty02-22&linkId=e02751acbb3ed0ad7100f94b21a37d48 "Swift実践入門 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)")

　　「Swift実践入門」Swiftとは？からGithub Search APIを使った、
　　クライアントアプリを作成するまで体系的に学べるとても良い本です。

- [[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus/dp/477419414X/ref=as_li_ss_tl?s=books&ie=UTF8&qid=1514597581&sr=1-1&keywords=Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&linkCode=ll1&tag=getty02-22&linkId=108dbb48f1335d45491de7432c13f378 "Swift実践入門 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)")

　改訂新版も出るみたいなので要チェックです。


- [モバイルアプリ開発エキスパート養成読本 (Software Design plus)](https://www.amazon.co.jp/dp/4774188638/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=getty02-22&linkId=9ca42574440331a830c7ca47a93a2059 "モバイルアプリ開発エキスパート養成読本 (Software Design plus)")

　　「モバイルアプリ開発エキスパート養成読本」 流行りのRxSwiftを使用し、
Githubユーザー検索APIを使ったクライアントアプリ作成する章がとても実践的です。
　　

これからも体系的な学習が出来るサービス、リポジトリなどがあったら随時更新していきます。
オススメの学習法があったら教えていただけると幸いです :pray:
Google Cloud Speech APIの使い方について

Google Cloud Speech APIを使用したくて試しているのですが以下のエラーが出てきて実行できません。

クイックスタートの例を参考して実行しました
https://cloud.google.com/speech/docs/getting-started

サーバーから以下のレスポンスが帰ってきました
{
  "error": {
    "code": 400,
    "message": "Invalid recognition 'config': bad encoding..",
    "status": "INVALID_ARGUMENT"
  }
}

アクセストークンが取得できているので問題と思うのですが
なぜうまくいかないのかがわかりません
iOS/Androidのテキスト読み上げ (TTS: Text To Speech) をUnityで試せるサンプルを作りました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/98817e68-bdf7-1e4a-41f8-2b8f6d2fee35.png)

自分の`Unity`で作っているアプリでText To Speech(TTS)を使う機会があったので他の開発者が使うときも参考にできるように上記の簡単なサンプルアプリを[GithubにFreeTTSForUnity](https://github.com/wapa5pow/FreeTTSForUnity)としてpushしておきました。iOSとAndroidで使えます。

既存のUnity Asset Storeにあるものはほとんどが有料だったり、読み上げ後のイベントが設定できなかったりして使いにくかったので自分で作りました。

# 画面の説明

画面に①〜⑦の番号をふっておきましたので各々説明します。

1. 読み上げを行うテキストが入っています（内部的には、スペースで区切ると、区切られた言葉ごとにイベントを発行し、順次読み上げていきます）
2. 読み上げのスピードを調整します。iOSは0.5, Androidは1とか1.3とかがよさそうですが、実際に聞いてみて調節してください
3. 読み上げの声の高さを調節します
4. 読み上げの言語を設定します。⑤のChoose Languageボタンを押したあとにBCP 47の文字列で、言語がアルファベット順に出てくるのですきなのを選択します。①のテキスト言語と違っていると発音されないときもあります
5. ④の説明を参照
6. 読み上げを開始します
7. 読み上げを終了します

# ソースコードを変更したくなったとき

## iOSの場合

[ここ](https://github.com/wapa5pow/FreeTTSForUnity/tree/master/Assets/Plugins/iOS)を直接いじるといいかなと思います。

## Androidの場合

まず[ここ](https://github.com/wapa5pow/FreeTTSForUnity/tree/master/AndroidStudio)をAndroidStudioで開きます。
以下あたりのファイルを編集して変更し、gradleの`exportAar`というタスクを実行すると`Assets/Plugins/Android/freetts.plugin-release.aar`にパッケージが配置されるようになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/65cef3f2-4a32-07c3-a0e9-027714f75991.png)

`exportAar`は以下をダブルクリックすると実行できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30079/4fa5c7c9-ba46-63f1-5bea-02c31ba0372c.png)

# まとめ

UnityでTTSがつかえるサンプルをつくりました。TTSの実装でこまったら活用してみてください
swift ビルド完了しても シミュレータが起動しない


![スクリーンショット 2017-05-10 16.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/168714/8ccff4c5-7bb7-7741-e644-304d4041d406.png)
XcodeのBuildが成功しているにも関わらず、上記のようなエラーが表示されて、シミュレータが開きませんでした。

このページを参照してログを確認してみました。
http://qiita.com/coa00@github/items/6ae2766a2991424fd144

```
tail -f ~/Library/Logs/CoreSimulator/CoreSimulator.log
```

結果解決には至りません。



似たような問題を抱えた人はいないか探して、下記リンクを参考にしました。
https://apple.stackexchange.com/questions/206547/connection-interrupted-error-in-ios-simulators-after-updating-to-xcode-7

見に覚えはないですが、どうやらシミュレータを2重で起動している可能性が高いようです。
シミュレータのアプリ消したところ下記エラーが表示されました。
![スクリーンショット 2017-05-10 16.37.36.png](https://qiita-image-store.s3.amazonaws.com/0/168714/21b3183c-f449-4145-06c5-0aa112ec35bb.png)

この後Xcodeを再起動して、もう一度Buildしたら無事にシミュレータが動きました。

何が原因だったかはまだ分かりませんが、一先ず解決しました。
nodemon実行時のエラー


## エラー内容

nodemonを実行した際に次のようなエラーが発生し、nodemonのプロセスが停止してしまう。

```
$ nodemon ./app.js
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node ./app.js`
[nodemon] Internal watch failed: watch /Users/xxx/Documents/projects/xxx.js ENFILE
```

## エラーの原因

nodemonではファイルを監視し、監視対象のファイルが変更されるとプロセスを再起動する。このエラーは、その監視対象のファイル数が多すぎるため発生する。

## 解決方法

不要なファイルを監視対象から外すことで解決できる。nodemonを実行するディレクトリにnodemon.jsonというファイルを作り、監視対象から外すファイルリストを次のように記述する。

```
{
  "ignore": ["*.test.js", "fixtures/*"]
}
```

## 参考サイト

* [nodemon](https://github.com/remy/nodemon)
VirtualBoxにcentOS7を入れる

## やりたいこと
とりあえずVirtualBoxにcentOS7を入れ、ローカルからSSHでアクセスできるように。
（SS撮るのを忘れてしまった……が、大体これで作れたハズ）

##前提条件
VirtualBoxがインストール済みであること。

##バージョンメモ
VirtualBox 5.1.22
centOS 7

---
#①centOS7を入手

以下のURLから、「CentOS-7-x86_64-DVD-1611.iso」をDLする。
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/
(リンク切れ時用→ https://www.centos.org/)

#②仮想マシンの作成
1. VirtualBoxを起動。
2. 新規ボタンを押下し、画面に従って作成する。今回は以下のように設定した。

| 項目 | 設定値 |
|:----|:------|
| 名前 | centOS7_lamp |
| タイプ | Linux |
| バージョン | Red Hat(64bit) |
| メモリ | 1024MB |
| ハードディスク | 仮想ハードディスクを作成する |
| ハードディスクのファイルタイプ | VDI (VirtualBox Disk Image) |
| 物理ハードディスクにあるストレージ | 可変サイズ |
| ファイルの場所 | デフォルトのまま |
| 仮想ハードディスクのサイズ | 8.00GB |

#③CentOSのインストール

1. 作成したマシン「centOS7_lamp」を起動
2. 起動ハードディスク選択で、①でDLした.isoファイルを選択
3. 起動し、→install CentOS Linux 7を選択


**インストール時に操作する言語**
「日本語」を選択→続行

**システム＞インストール先**
ローカルの標準ディスクをチェック（レ点チェックマークが付いていること）

**システム＞ネットワークとホスト名**
1. 画面右下の「設定」ボタン押下
2. イーサネットをONにする
3. 編集ポップアップ内の「IPv4のセッティング」を選択し、アドレスの設定をする

| 項目 | 設定値 |
|:----|:------|
| 方式 | 手動 |
| アドレス | 192.168.XX.XX |
| ネットマスク | 255.255.255.0 |
| ゲートウェイ | 192.168.GG.GG |
| DNS | 192.168.DD.DD |
※自分の環境に合わせて設定する
4. 編集ポップアップ内の「IPv6のセッティング」を選択

| 項目 | 設定値 |
|:----|:------|
| 方式 | 無視する |

**ソフトウェア＞ソフトウェアの選択**

| 項目 | 設定値 |
|:----|:------|
| ベース環境 | GNOME Desktop |
| 選択した環境のアドオン | 互換性ライブラリ |
|  | 開発ツール |

**インストールの開始**
インストールを実行しながら、rootパスワードとユーザの設定をする。
インストールが完了したら、再起動

#④初期設定

1. ライセンス契約に同意します。→完了
2. ログインし、言語を日本語。キーボードは日本語（109キー日本語レイアウトのキーボード）を選択

※キーボードは自分の環境に合わせて選択する

#⑤GUIからCUIに切り替える

**アプリケーション＞ユーティリティ＞端末**
 rootでログインしていない場合、suでルートに切り替えておくこと

CUIに切り替え

```
#systemctl disable gdm.service
```

再起動

```
#reboot
```

これでCUIに切り替わっているはず。

#⑥ネットワーク
1. VirtualBoxで、作成した仮想マシンを選択し、「設定」ボタンを押下（仮想マシンの電源はOFFにしておくこと）
2. ネットワーク＞アダプタ１で、「ブリッジアダプタ」を選択
3. MACアドレスをコピーしておく

**MACアドレス設定**
設定ファイル編集

```
#vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
```
コピーしておいたMACアドレスを、「:」で2文字ごとに区切って指定し追記

```
HWADDR=00:00:00:00:00:00
```
ネットワーク再起動

```
#systemctl restart network
```

アドレス設定確認

```
#ifconfig | less
```

#⑦SELinux無効化
現在の状態を確認

```
#getenforce
```
| 設定値 | 意味 |
|:----|:------|
| Enforcing | 無視する |
| Disabled | 無効 |

常に無効化する

```
#vi /etc/selinux/config
```
以下のようにファイルを編集する

```
SELINUX=disabled
```
再起動

```
#reboot
```
---

以上、SSHからアクセスできたら作業完了。
ipythonとpythonが違うバージョンで起動してしまう時の対処法

#pythonとipythonのバージョン確認
pythonやipythonをインタラクティブシェルで起動すると、はじめに以下のようにバージョンが記されるはず

そのバージョンがipythonとpyhtonで異なっているとインストールされたパッケージに相違がでて面倒…になっていたので直したときの話
<img width="503" alt="スクリーンショット 2017-05-10 16.15.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/131651/56ce7504-e650-f5f2-ae0c-c1374c849bc1.png">

#対処法
```$ which python```
```$ which ipython```
でそれぞれの場所を確認します

```which ipython```で出てきた場所（/usr/local/bin/ipythonなど）について
```$ vi　/usr/local/bin/ipython```などで編集します

すると、

```
#!/Users/user_name/.pyenv/shims/python

set -e
[ -n "$PYENV_DEBUG" ] && set -x

program="${0##*/}"
if [[ "$program" = "python"* ]]; then
  for arg; do
    case "$arg" in
    -c* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export PYENV_FILE_ARG="$arg"
        break
      fi
      ;;
    esac
  done
fi
```
のようになっているはずなので、一番上の行を```which python```で出てきた時の場所に変更しましょう


これでターミナルを再起動したらipythonがpythonと同じバージョンで起動してくれました！




参考：http://stackoverflow.com/questions/9386048/ipython-reads-wrong-python-version
CircleCI 2.0 の setup_remote_docker 実行後、既にコンテナが起動していた件

※ 雑にメモのみ。

申請して [Docker Layer Caching](https://circleci.com/docs/2.0/docker-layer-caching/) を有効にしてもらい、 `setup_remote_docker` を `reusable: true` で実行している。

複数のコンテナを使っているため、手軽にコンテナを立ち上げるために `docker-compose up -d` で起動している。

その後、 `docker-compose stop` をせずに CircleCI のジョブを完了させている。

という状況で、 `setup_remote_docker` のすぐ後の `run:` で `docker-compose ps` をしてみたところ、各コンテナの State が Up だった。

stop しなくても止まってくれるものだと勘違いしていた。
jqueryが使いたいとき(動作確認用)

## jqueryを一時的に利用したいとき

```js:デバッガコンソールで実行.
var script = document.createElement("script");
script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js");
document.getElementsByTagName("head")[0].appendChild(script);
```

## 他

```js:jQueryUI.
var style = '<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/cupertino/jquery-ui.min.css">';
$('head link:last').after(style);
var script1 = document.createElement("script");
script1.setAttribute("src", "http://code.jquery.com/jquery-1.10.2.min.js");
document.getElementsByTagName("head")[0].appendChild(script1);
var script2 = document.createElement("script");
script2.setAttribute("src", "http://code.jquery.com/ui/1.10.3/jquery-ui.min.js");
document.getElementsByTagName("head")[0].appendChild(script2);
```
React Storybookで 'regeneratorRuntime is not defined' と怒られる


Storybookにもbabel-polyfillを追加する。

.storybook/webpack.config.jsを以下の内容で作成。

```webpack.config.js
module.exports = function(storybookBaseConfig, configType) {
  storybookBaseConfig.entry.preview.unshift('babel-polyfill')
}
```

Storybook 2.21.0で確認


# おまけ

自分のプロジェクトでは、babel適用のコードは`.es6`という拡張子で書いているので、以下のようになる

```webpack.config.js
module.exports = function(storybookBaseConfig, configType) {
  storybookBaseConfig.entry.preview.unshift('babel-polyfill')

  storybookBaseConfig.resolve.extensions.unshift('.es6')
  storybookBaseConfig.module.loaders.push({
    test: /\.es6$/,
    exclude: /node_modules/,
    loader: 'babel',
  })

  return storybookBaseConfig;
}
```
クラス名画像の作り方

[yolo](https://pjreddie.com/darknet/yolo/)などのDeepLearningを見ると、よくお目にかかる
　　・car
　　・bicycle
　　・dog
などの文字

![alt](https://pjreddie.com/media/image/model2.png)

これは学習済みのモデルから、物体検出された物体(クラス)をみやすく表示するのに使われる「クラス名画像」と言われるものらしい

この画像が準備されていないと、学習時に「クラス名を分類する画像がないぞ！」とエラーになるので、何かしらの手段で準備する必要がある

yoloで準備されている画像はこんな感じ

>$ file dog.png bicycle.png car.png 
dog.png:     PNG image data, 36 x 25, 8-bit grayscale, non-interlaced
bicycle.png: PNG image data, 58 x 25, 8-bit grayscale, non-interlaced
car.png:     PNG image data, 31 x 25, 8-bit grayscale, non-interlaced

因みにyoloにはスクリプト(make_labels.py)が準備されており、クラス名画像も簡単に作れる。

私の環境にはFontがあまり準備されていなかったので、ImageMagickをインストールして、最低限のオプションでクラス名画像を作ってからトレーニングを始めてみた

>$ sudo apt-get -y install imagemagick
> $ convert -fill black -background white -bordercolor white -border 4  -pointsize 18 label:＜ラベル名＞  ＜ラベル名＞.png
AndroidStudioを利用して特定のタブレットをエミュレートする。

Android Studioの設定が面倒だったので、メモを残す。

## やりたいこと
タブレット（Asus Zen Pad）でのChromeでのレイアウトを確認するために、
いちいちタブレット実機でテストをせずに、
PCからエミュレートしたい。

## やったこと
Windows8にAndroid Studioをインストールし、
Android Emulatorを使ってエミュレートする。

## Android Stuido インストール
省略
https://akira-watson.com/android/adt-windows.html
等参照

## エミュレートしたい端末情報の確認
OS：「設定」→「端末情報」から、OSを確認
Android 6.0だった。

解像度：http://www.benricho.org/Tips/browse_size.htmlで確認
画面は1280 x 800だが、
実際には上下に表示があるので、ウィンドウサイズは 1280 x 728

## バーチャルデバイスを作成
Android Stuidoを立ち上げる。
「Tools」→「Android」→「ADV Manager」でADVマネージャーを起動する。
「Create Virtual Device」から新規作成する。

![image](https://qiita-image-store.s3.amazonaws.com/0/121093/cdcaf81d-17dd-7f35-8893-eb2b6f49e734.png)

Tabletを選択する。
画面の解像度(1280 x 800)から「Nexus7(2012)」を選択する。
「Next」で次へ。
システムイメージを選択時、Marshmallow(Andoroid6.0)はデフォルトではないので、「Download」からダウンロード。
選択して「Next」
AVD Nameに適当な名前を入力して「Finish」

そうするとVirtual Deviceが作成される。
![image](https://qiita-image-store.s3.amazonaws.com/0/121093/6e221e80-4d69-14d8-d03c-5f0559912f1b.png)

Actionsの三角ボタンを押すとタブレットが立ち上がる。
これでエミュレーターができる！と思いきや、
1. 微妙にウィンドウサイズが違う
2. Google Chromeが無い！
ということに気づく

以下、対応。

## パスの設定
adbをコマンドプロンプトから使うため、
環境変数に、{インストールされたディレクトリ}\Android\sdk\platform-tools　を追加する。

## Chromeをインストール
http://qiita.com/dayoshix/items/02f1127e914106780d12
を参考にさせていただきました。


Chrome.apkを入れる。
怪しいサイトからダウンロード（セキュリティが怖いので自己責任で）
http://www.apkmirror.com/apk/google-inc/chrome/
ここから最新版のChromeをダウンロードする。

分かりやすいようにファイル名をChrome.apkに変更する。

コマンドプロンプトを立ち上げる。
```
adb install {Chrome.apkのあるパス}\Chrome.apk
```
これでChromeが使えるようになった。

## ウィンドウサイズを合わせる。
先ほどのサイト（http://www.benricho.org/Tips/browse_size.html）で確認

![image](https://qiita-image-store.s3.amazonaws.com/0/121093/673dd87f-910f-b67e-bd8b-33afa1a9c940.png)

ものすごい中途半端なサイズになっている。
無理やり計算して合わせる。
横：1280 : 962 = x : 1280
縦：800 : 529 = y : 728

計算すると、横：1703、縦：1100に設定すれば（無理やり）希望通りのサイズになるはず！

再びコマンドプロンプト
```
adb shell wm size 1100x1703
```
xは英語小文字のxです。

これで再びウィンドウサイズ確認
![image](https://qiita-image-store.s3.amazonaws.com/0/121093/1277676d-b0c6-eb84-9641-395e264e4e6b.png)

はい、大体合ってる。
サイズを調整したければ再度数字を変えて上記を打ち込めば良い。

これで簡単に画面の確認ができました！

## 終わってから考えたこと
Chromeのデベロッパーツールから、カスタムデバイスを設定すると、
似たようなことがはるかに簡単にできました。。。
まあ、OSも揃えてテスト出来るので、よしとしましょう。
Alibaba Cloud、EIP(Elastic IP)解説。ECS運用を楽にする！

本記事は、<a href="https://jp.aliyun.com/" target="_blank">AlibabaCloud</a> ECSでインターネットからのアクセスをするために必要な、２種類のパブリックIPの特徴と利用シーンを説明します。
より柔軟に利用できるElastic IP（以下、EIP）を利用する場合の購入方法と活用事例を理解に役立ててください。

## 1. EIPの有効な利用シーン
EIPは、ECSインスタンスとは独立して単独で所有できるため、様々な場面で有効に活用できます。
EIPを利用すると、ECSに変更や更新があった場合でも、パブリックIPアドレスを変更することなく、ECSを切り替えることができるほか、利用状況に応じて帯域幅の変更も可能です。

### シーン１: ECSインスタンスの故障時の切り替え
ECSインスタンスが故障してしまった場合もEIPを利用していれば、代替機への簡単に移行することができます。

<img width="678" alt="スクリーンショット 2017-05-10 13.53.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/ea4935c6-257f-7b25-f4c0-46253cd39781.png">

### シーン２: ECSインスタンスのスケールアップ
ECSインスタンスのスケールアップにEIPは最適です。スペックが不足してきた場合には、高スペックインスタンスを用意し、EIPを付け替えることで、簡単にスケールアップができます。

<img width="737" alt="スクリーンショット 2017-05-10 13.58.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/407d65e6-ea1b-2cd0-859d-3767aab97a11.png">

### シーン３: ECSインスタンス上のシステムバージョンアップ
EIPはシステムバージョンアップにも利用できます。
バージョンを上げたECSインスタンスを用意しておきEIPを付け替えることでバージョンアップが可能です。
ミドルウェアのバージョンアップなど、大きな変更を伴うバージョンアップのときなどに有効です。
もちろん、バージョン2からバージョン1に戻す場合でも、同様にEIPを付け替えることで戻すことができます。

<img width="742" alt="スクリーンショット 2017-05-10 14.37.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/abe70b8a-c942-af44-f7d8-49f065befaf1.png">

### シーン４: 帯域幅の増幅
EIPは帯域幅上限を変更することができます。
トラフィックの増加に伴う、帯域幅の増幅も停止時間なく行うことができます。

<img width="633" alt="スクリーンショット 2017-05-10 14.00.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/76ba23fe-1ea2-2774-73c9-e0e7541ee56a.png">

## 2. 2種類のパブリックIPとその特徴
上記でEIPの説明の活用シーンを説明しましたが、
AlibabaCloudでは2種類のパブリックIPがあり、次のような特徴をもちます。
特徴を理解し、どちらを利用するか選択する必要があります。

|比較項目|EIP|ECSパブリックIP|
|:--|:--|:--|
|単独リソースとして所有|可|不可|
|ECS との動的なバインドおよびバインド解除|可|不可|
|動的な帯域幅の変更|可|不可|
|IP保持課金／非課金|従量課金<br />(金額はEIP購入画面にて確認)|非課金|
|設定方法|EIPを購入しECSへバインド|ECS購入時に設定|

ECS管理コンソールでは以下のように表示され区別されます。
(エラスティック)：EIP 
(インターネット)：ECSパブリックIP 

<img width="886" alt="スクリーンショット 2017-05-10 14.41.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/8816d88c-5345-cc99-243c-800e7b3a281c.png">

## 3. パブリックIPの取得方法
### 3-1. EIPの取得方法
EIPの取得方法については下記ドキュメントをご参照ください。
EIPは必要に応じて、バインド先のECSインスタンスを変更したり、バインド解除したりすることができ柔軟性が高いです。

参考ドキュメント：[EIPの取得手順](https://jp.aliyun.com/help/doc-detail/27768.htm)

また、EIPをバインドするECSインスタンスはパブリックIPを持っていないことが必要です。
ECS購入時に「ネットワーク帯域幅　ピーク」を「0Mbps」に設定することでパブリックIPを持たないインスタンスを作成することができます。

<img width="1028" alt="スクリーンショット 2017-05-10 14.59.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/259/febd5c4a-75b8-3885-1109-8e45c0596705.png">

### 3-2. ECSパブリックIPの取得方法
ECS購入時に、「ネットワークタイプの選択」で「ネットワーク帯域幅　ピーク」を「１Mbps以上」に設定することで、ECSパブリックIPを取得することができます。
この方法で取得したパブリックIPは変更、削除をすることができないので注意が必要です。

## 4. EIPアドレスのバインド／バインド解除
ECSへのEIPアドレスのバインド／バインド解除は、ECSインスタンスを停止することなく実行することができます。ECSとEIPアドレスは1対1の関係にあります。
EIPのバインド／バインド解除の方法については下記ドキュメントをご参照ください。

- [Elastic IP Address (EIP) のバインド](https://jp.aliyun.com/help/doc-detail/27714.htm)
- [Elastic IP アドレスのバインド解除とリリース](https://jp.aliyun.com/help/doc-detail/51995.htm#unbind)

## 5. EIPアドレスの帯域幅変更
EIPアドレスの利用状況(トラフィック)に応じて、動的に帯域幅の変更が可能です。IP管理コンソールより変更が可能で、変更はすぐに反映されます。
Android 7 以降で mitmproxy が動作しない

# 原因
Android 7 (API Level 24) からセキュリティポリシーが変わり Chrome と Webview 以外についてはユーザーが登録した証明書を受け付けない仕様になったそうです。

# 対処方法
自分のアプリで受け付けるようにするにはネットワーク・セキュリティの設定をアプリに追加する必要があるようです。


## 1. ネットワーク・セキュリティの設定を記述した xml を作る 
以下の xml を app/src/main/res/xml に作成します。ここでは network_security_config.xml とします。この設定は \<debug-overrides>に囲まれているので、デバッグビルドのときにしか反映されないことに注意です。

```xml
<network-security-config>  
     <debug-overrides>  
          <trust-anchors>  
               <!-- Additionally trust user added CAs -->  
               <certificates src="user" />  
          </trust-anchors>  
     </debug-overrides>  
</network-security-config>
```
## 2. network_security_config.xml を AndroidManifest.xml から読み込まれるようにする
AndroidManifest.xml のApplication タグのところに android:networkSecurityConfig の設定を記述します。

```xml
<application
        android:name=".OrenoApp"
        android:networkSecurityConfig="@xml/network_security_config"
        >
        ...
</application>
```

## 3. これでビルドして試せばうまくいくはず

# 参考情報等
* https://github.com/mitmproxy/mitmproxy/issues/2054
Xcodeでショートカットからプロジェクト(ワークスペース)ディレクトリをターミナルで開く

Xcodeでプロジェクトを開いている時に `pod install` したい時、Finderを開いてディレクトリを辿って、、、というのは不便だ。

ショートカットでプロジェクトのルートにcdしたTerminalを開きたい。

シェルスクリプトをXcodeのBehaviorに登録してショートカットを割り当てることで実現できたのでメモ。

## スクリプトを作る

次のようなスクリプトファイル(例: OpenInTerminal.sh)を作る

```bash
#!/bin/bash
open -a Terminal .
```

※あとでXcodeにこのスクリプトを実行させるように登録するのだが、登録したスクリプトが実行される時、カレントディレクトリはアクティブなWindowで開いているプロジェクト(ワークスペース)のルートとなるようだ。したがって `open -a Terminal` でカレントディレクトリ `.` を開けば、プロジェクトのルートにcdした状態でTerminalが開く。

また同様に `open -a SourceTree .` などとすればSourceTreeも開けたりする、便利。


## 実行権限を与える

chmod +x OpenInTerminal.sh

## Xcodeからショートカットで実行できるようにする

Xcodeのbehaviorに `` Cmd+` ``などのショートカットでOpnInTerminal.shを実行するように登録する

<img width="750" alt="スクリーンショット 2017-05-10 15.34.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/26921/e73526b8-b6e8-2d8c-190e-248b190bd2fb.png">

## 動作確認

設定画面を閉じ、なんらかのプロジェクトを開いた状態で `` Cmd+` `` を押してみる。

※なお設定画面を開いたまま実行すると `/` にcdした状態でTerminalが起動する。

## 参考文献

- [ios - Terminal window inside Xcode? - Stack Overflow](http://stackoverflow.com/questions/21998706/terminal-window-inside-xcode)
- [Xcode からプロジェクトの場所をターミナルで開く Behavior を作る。](https://ez-net.jp/article/18/VNWZ5JlM/HZ72wBqtse6a/)