OmniAICreator/Qiita-1.07M huggingface dataset:
MacにDocker - コンテナからイメージの作成

[MacにDocker](http://qiita.com/sakasa/items/d32f2cab50a597b5eb50)
ここの子ページ的な

# コンテナからイメージ作成（docker commit）
centos7のイメージからコンテナ起動して、centos7で色々設定を行い、その後イメージの作成を行います。

## centos7のイメージを取得
```
$ docker pull centos:7
$ docker pull images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
centos                     7                   980e0e4c79ec        4 weeks ago         196.8 MB
```
## centos7のコンテナ起動
centos7のイメージからコンテナ名mycentosでコンテナ起動。

```
$ docker run -it --name mycentos centos:7 /bin/bash
[root@b8f64d7790e8 /]#
```
ここからはcentosの設定なので、不要な場合読み飛ばしてください。

```
### コンテナ内でcentosの操作 ###

##########
# ■最新化
[root@b8f64d7790e8 /]# yum -y update

##########
# ■rootのパスワード設定
[root@b8f64d7790e8 /]# passwd
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

##########
# ■ユーザ追加
[root@b8f64d7790e8 /]# useradd <ユーザ名>
# 追加したユーザにパスワード設定
[root@b8f64d7790e8 /]# passwd <ユーザ名>
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
# 追加されたことを確認
[root@b8f64d7790e8 /]# su - <ユーザ名>
[<ユーザ名>@b8f64d7790e8 ~]$ whoami
<ユーザ名>

##########
# ■sudo設定
[root@b8f64d7790e8 /]# yum -y install sudo
[root@b8f64d7790e8 /]# visudo
## 最終行に以下を追加
<ユーザ名>    ALL=(ALL)       ALL
# sudo設定確認
[root@b8f64d7790e8 /]# su - <ユーザ名>
[<ユーザ名>@b8f64d7790e8 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[<ユーザ名>@b8f64d7790e8 ~]$ sudo cat /etc/shadow
[sudo] password for <ユーザ名>: # ユーザのパスワードを入力して実行できることを確認

##########
# ■vimのインストール
[root@b8f64d7790e8 ~]# yum -y install vim-enhanced
# vimのエイリアスを設定
[root@b8f64d7790e8 ~]# vi /etc/profile
## 最終行に以下を追加
alias vi='vim'
# 変更を適用
[root@b8f64d7790e8 ~]# source /etc/profile
# centos設定終了
[root@b8f64d7790e8 /]# exit
```
## コンテナの状態確認
```
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS               NAMES
b8f64d7790e8        centos:7                   "/bin/bash"              58 minutes ago      Exited (1) 8 seconds ago                       mycentos
```
停止している
## コンテナからイメージ作成
初期設定したcentos7のコンテナ（コンテナ名：mycentos）からイメージを作成します。

```
$ docker commit -a "<作成者を任意で設定>" -m "<コミットメッセージを任意で設定>" mycentos <Docker Hubのユーザ名>/mycentos:1.1
```
## 作成したイメージの確認
```
$ docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
<Docker Hubのユーザ名>/mycentos            1.1                 49f48b38810e        24 seconds ago      413 MB
centos                                   7                   980e0e4c79ec        4 weeks ago         196.8 MB
```
## 作成したイメージからコンテナ起動
作成したイメージ<Docker Hubのユーザ名>/mycentosからコンテナ名mycentos2でコンテナ起動。

```
docker run -it --name mycentos2 <Docker Hubのユーザ名>/mycentos:1.1 /bin/bash
[root@305dfeb8a6c4 /]#
```
コンテナ名mycentosで追加したユーザが存在することを確認

```
[root@305dfeb8a6c4 /]# su - <ユーザ名>
[<ユーザ名>@305dfeb8a6c4 ~]$ 
```
[Electron]process.cwdではなくapp.getPathを使う

よく考えるとわかるものの、この間引っかかった（のを書いていなかったので1ヶ月ぐらい経ってから書いている）メモ


## 現象
Electronでディレクトリのパスを取得する際にprocess.cwd()を利用していると実行環境によって取得できるパスが変わる。

```
$electron index.js 
// ->//Users/my_account/Documents/electron/test 動かしているディレクトリ
```

で動かしているときと

```
$asar pack ./ ./test.asar
$electron test.asar
// ->//Users/my_account/Documents/electron/test 動かしているディレクトリ
```

のときとパッケージングしたあと

```
electron-packager ./ test  --platform=darwin,win32 --arch=x64 --version=1.3.3
//アプリを実行
// -> / (ルート直下）
```

で挙動が違うので注意が必要。


なので、利用する際はprocess.cwd()ではなく、[app.getPath](https://github.com/electron/electron/blob/master/docs/api/app.md#appgetpathname)を利用する。



## サンプルコード

以下のコードで動かしています（index.htmlのみ記載）

```
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> Hello electron. </title>
    </head>
    <body>
        <script>
            function done() {
                alert("cwd: " + process.cwd() );
            }
        </script>
        <button onClick="done()" > done </button>
    </body>
</html>

```

## 参考
[process.cwd() returns '/' #2108](ps://github.com/electron/electron/issues/2108)
[ElectronでOS固有のファイルパスを得る app.getPath()の出力まとめ](http://qiita.com/progre/items/2718f4ad20eecf27d599)
[app.getPath](https://github.com/electron/electron/blob/master/docs/api/app.md#appgetpathname)
Unity向けのWebSocketライブラリの組み込み

# 本Qiitaについて

Unity向けWebSocketのBuild方法と使いかたについて記載しています。

# 関連Qiita

* [DayDream開発機の設定](http://qiita.com/akira-sasaki/items/582d84b6e3e717aaf661)
* [UnityでのDayDreamデモアプリのBuild](http://qiita.com/akira-sasaki/items/6065e926b76620c12424)
* [DayDream Readyのスマフォ](http://qiita.com/akira-sasaki/items/4d648f9da28ff89973d4)
* [DayDream開発機の作り方](http://qiita.com/akira-sasaki/items/78e86d82dd307c494596)
* [DayDream関連リンク](http://qiita.com/akira-sasaki/items/3f37d7908be802191705)
* [UnityでRESTでアクセス](http://qiita.com/akira-sasaki/items/09e4556ec4ad55a19a14)
* [UnityのJsonUtilityでJSON配列を処理する](http://qiita.com/akira-sasaki/items/71c13374698b821c4d73)

# Editorの用意

Unity付属のMonoDevelopだと、うまくBuildかからなかったので、下記URLより最新のXamarin Studioをダウンロードしてくる。

http://www.monodevelop.com/download/

Mono for Mac OS X もダウンロードして、インストールする。

http://www.mono-project.com/download/

# WebSocketのライブラリ

WebSocketのライブラリは、Websocket-sharpを使用する。

https://github.com/sta/websocket-sharp

ローカルにGit cloineするか、ZIPをダウンロードして解凍する。

websocket-sharp.slnをXamarin Studioで開く。

<img width="483" alt="wc001.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/161b82a1-432f-7f32-58ee-0b733359da3f.png">

# Build

Release Buildをおこなう。

<img width="554" alt="wc002.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/80b42ed2-9702-af24-1980-7c6f79b922f4.png">

websocket-sharp-master>websocket-sharp>obj>Releaseに、websocket-sharp.dll が生成される。

<img width="609" alt="wc003.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/115737c6-5f5a-d80b-1da1-10b85db87b19.png">

# Unityへのdllの取り込み

<img width="746" alt="asset001.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/b7da9745-e9e8-674d-eaf6-5f66bb438def.png">

<img width="809" alt="asset002.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/378da9d7-fa4a-f16e-66c7-7adedefee3b3.png">

生成された websocket-sharp.dll  をAssets>Plugins>websocket にドラッグ&ドロップする。

<img width="603" alt="asset003.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/9ecb4707-ff31-7b63-ee45-e7fd17be01c8.png">

# WebSocketにアクセスするためのコード

```csharp
using UnityEngine;
using System.Collections;
using WebSocketSharp;

public class WebSocketClient: MonoBehaviour {

	private WebSocket ws;

	void Start()
	{
		// WebSocketのechoサーバ.
		this.ws = new WebSocket("ws://echo.websocket.org");

		// WebSocketをOpen.
		this.ws.OnOpen += (sender, e) => 
		{
			Debug.Log("[WS] Open");
			ws.Send ("Hi WebSocket");
		};
			
		// メッセージを受信.
		this.ws.OnMessage += (sender, e) =>
		{
			Debug.Log("[WS]Receive message: " + e.Data);
		};

		// WebSoketにErrorが発生.
		this.ws.OnError += (sender, e) =>
		{
			Debug.Log("[WS]Error: " + e.Message);
		};

		// WebSocketがClose.
		this.ws.OnClose += (sender, e) =>
		{
			Debug.Log("[WS]Close");
		};

		// WebSocketに接続.
		ws.Connect();

	}

	void OnDestroy()
	{
		this.ws.Close();
	}
}
```
結合文字列を合成する安全な方法を考える

[結合文字列をUnicode正規化で合成する方法の危険性](http://qiita.com/monokano/items/d4c37d9bc9833eaeda6e) では、結合文字列を解消する方法としてNFCを適用することの危険性を説明しました。それではどうしたらいいのかをここで考えてみます。

# 考察
結合文字列を解消する現実的な方法は「[Composition Exclusion](http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt)を処理対象から除いてNFCを適用する」だと思います。そこでComposition Exclusionを正規表現にしてみたのが[こちら](http://bit.ly/2e3a8Vh)。

これをもとにして[happyscript](http://qiita.com/happyscript)さんが書いてくれたPerlのスクリプトがこちら。

```perl:safetyNFC.pl
#!/usr/bin/perl

use strict;
use Unicode::Normalize;
use utf8;  #-ソースがUTF8だという宣言
use Encode;
binmode STDOUT, ":utf8";  #-画面に出力したい文字コード
binmode STDERR, ":utf8";  #-エラー出力に使いたい文字コード
binmode STDIN, ":utf8";  #-標準入力から入ってくる文字コード

my $Target;
my $myReg = '[^\x{0340}\x{0341}\x{0343}\x{0344}\x{0374}\x{037E}\x{0387}\x{0958}-\x{095F}\x{09DC}\x{09DD}\x{09DF}\x{0A33}\x{0A36}\x{0A59}-\x{0A5B}\x{0A5E}\x{0B5C}\x{0B5D}\x{0F43}\x{0F4D}\x{0F52}\x{0F57}\x{0F5C}\x{0F69}\x{0F73}\x{0F75}\x{0F76}\x{0F78}\x{0F81}\x{0F93}\x{0F9D}\x{0FA2}\x{0FA7}\x{0FAC}\x{0FB9}\x{1F71}\x{1F73}\x{1F75}\x{1F77}\x{1F79}\x{1F7B}\x{1F7D}\x{1FBB}\x{1FBE}\x{1FC9}\x{1FCB}\x{1FD3}\x{1FDB}\x{1FE3}\x{1FEB}\x{1FEE}\x{1FEF}\x{1FF9}\x{1FFB}\x{1FFD}\x{2000}\x{2001}\x{2126}\x{212A}\x{212B}\x{2329}\x{232A}\x{2ADC}\x{F900}-\x{FAFF}\x{FB1D}\x{FB1F}\x{FB2A}-\x{FB36}\x{FB38}-\x{FB3C}\x{FB3E}\x{FB40}\x{FB41}\x{FB43}\x{FB44}\x{FB46}-\x{FB4E}\x{1D15E}-\x{1D164}\x{1D1BB}-\x{1D1C0}\x{2F800}-\x{2FA1F}]+';

if ($#ARGV > -1) {
   $Target = decode('utf8',$ARGV[0]);
} else {
   while (<STDIN>) {
      $Target .= $_;
   }
}

$Target =~ s/($myReg)/NFC($1)/eg;

print $Target;
```
他の言語にも応用できると思うのですが、どうでしょうか。

* コメントでUnicodeプロパティの正規表現パターンを教えてもらいました。Perlはここが充実しているのでいいですね～
[VirtualBox]仮想環境で macOS Sierra を導入(isoイメージ作成)[Sierra]


[「仮想Sierra環境を作る - まさたか日記」 ](http://mk.hatenablog.com/entry/2016/09/24/082145) を見ていただければ、そのままなのですが、`Sierra` 正式版にて少しトラップがあるので、若干の修正版を寄稿します。

## Sierraのisoファイルを作成する

元々では `Install OS X Sierra.app` 内の `InstallESD.dmg` を直接マウントすることになっていますが、失敗します。

1. 正式版はファイル名が異なる
1. `.app` 内にある場合は、`Resource Busy` になる (全てではない?

従って、次の通りにすることが望ましいとして、少し修正しました。まず、これらを実行する前に、15GB以上の空き容量があるワークディレクトリへ移動してください。

### 正式 `macOS Sierra` で成功した版

```bash:Sample
$ cp -a "/Applications/Install macOS Sierra.app/Contents/SharedSupport/InstallESD.dmg" .
$ hdiutil attach ./InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/esd
$ hdiutil create -o Sierra.cdr -size 7316m -layout SPUD -fs HFS+J
$ hdiutil attach Sierra.cdr.dmg -noverify -nobrowse -mountpoint /Volumes/iso
$ asr restore -source /Volumes/esd/BaseSystem.dmg -target /Volumes/iso -noprompt -noverify -erase
$ rm /Volumes/OS\ X\ Base\ System/System/Installation/Packages
$ cp -rp /Volumes/esd/Packages /Volumes/OS\ X\ Base\ System/System/Installation
$ cp -rp /Volumes/esd/BaseSystem.chunklist /Volumes/OS\ X\ Base\ System/
$ cp -rp /Volumes/esd/BaseSystem.dmg /Volumes/OS\ X\ Base\ System/
$ hdiutil detach /Volumes/esd
$ hdiutil detach /Volumes/OS\ X\ Base\ System
$ hdiutil convert Sierra.cdr.dmg -format UDTO -o Sierra.iso
$ mv Sierra.iso.cdr Sierra.iso 
$ rm Sierra.cdr.dmg
```

### ※ コピペしやすいように、行頭の `$ ` 外しておいた版

```bash:no_prompt
cp -a "/Applications/Install macOS Sierra.app/Contents/SharedSupport/InstallESD.dmg" .
hdiutil attach ./InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/esd
hdiutil create -o Sierra.cdr -size 7316m -layout SPUD -fs HFS+J
hdiutil attach Sierra.cdr.dmg -noverify -nobrowse -mountpoint /Volumes/iso
asr restore -source /Volumes/esd/BaseSystem.dmg -target /Volumes/iso -noprompt -noverify -erase
rm /Volumes/OS\ X\ Base\ System/System/Installation/Packages
cp -rp /Volumes/esd/Packages /Volumes/OS\ X\ Base\ System/System/Installation
cp -rp /Volumes/esd/BaseSystem.chunklist /Volumes/OS\ X\ Base\ System/
cp -rp /Volumes/esd/BaseSystem.dmg /Volumes/OS\ X\ Base\ System/
hdiutil detach /Volumes/esd
hdiutil detach /Volumes/OS\ X\ Base\ System
hdiutil convert Sierra.cdr.dmg -format UDTO -o Sierra.iso
mv Sierra.iso.cdr Sierra.iso 
rm Sierra.cdr.dmg
```

後は、`VirtualBox` でできあがった `Sierra.iso` から CDブートするだけです。
github pagesからリポジトリにワンクリックで飛ぶブックマークレット


↓これをブックマークする

<a href="#">github pages to Repository</a>

URLをこれに書き換える

```js
javascript:(function(){window.location.href="https://github.com/"+window.location.host.split(".")[0]+window.location.pathname})()
```

`username.github.io/reposirtory`で押すと`github.com/username/reposirtory`に移動する。
Unityでソナー風の表現をするSonarFxの紹介と解説

#SonarFx
ソナーのような表現ができるフリーのアセットです。
下記のgif動画で赤い波が中心から湧き出る表現がそれです。
(キューブが湧き出てるのはパーティクルで、この記事では解説しません。)
このアセットがどうやってこのエフェクトを表現しているのか解説します。
[SonarFx](https://github.com/keijiro/SonarFx)

![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/116884/1d063c3e-b7d9-8b7f-947d-c35f0a17b3d7.gif)

#使い方
下記のブログで使い方が説明がされてるので省きます。
[テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2014/08/05/233000)

#仕組み
Cameara.SetReplacementShader(shader, null)
で画面範囲内に映るモデルのシェーダーを、
ソナーの中心点から一定距離が時間変化で赤くなるサーフェースシェーダーに差し替えることで、ソナー表現をしています。

#shader部分
処理の肝になるシェーダーの解説です。
下記シェーダーで、時間変化で一定距離のモデルの表面のEmittionが変化するのを表現しています。

```SonarFx.shader
        void surf(Input IN, inout SurfaceOutput o)
        {
#ifdef SONAR_DIRECTIONAL
            float w = dot(IN.worldPos, _SonarWaveVector);
#else
            float w = length(IN.worldPos - _SonarWaveVector);
#endif

            // Moving wave.
            w -= _Time.y * _SonarWaveParams.w;

            // Get modulo (w % params.z / params.z)
            w /= _SonarWaveParams.z;
            w = w - floor(w);

            // Make the gradient steeper.
            float p = _SonarWaveParams.y;
            w = (pow(w, p) + pow(1 - w, p * 4)) * 0.5;

            // Amplify.
            w *= _SonarWaveParams.x;

            // Apply to the surface.
            o.Albedo = _SonarBaseColor;
            o.Emission = _SonarWaveColor * w + _SonarAddColor;
}
```

```SonarFx.shader
float w = length(IN.worldPos - _SonarWaveVector)
```
上記はソナーの中心からモデルのメッシュまでの距離になります。

```SonarFx.shader
w -= _Time.y * _SonarWaveParams.w;
w /= _SonarWaveParams.z;
w = w - floor(w);
```
wの少数部分のみを抽出して横軸時間のノコギリ波を作っています。
http://moge32.blogspot.jp/2013/11/gen-waveform.html

```SonarFx.shader
// Make the gradient steeper.
float p = _SonarWaveParams.y;
w = (pow(w, p) + pow(1 - w, p * 4)) * 0.5;
```
ノコギリ波にボカしを加えています。
ちなみに_SonarWaveParamsはSonarFx.cs側からシェーダーに渡されるパラメータになります。

```SonarFx.cs
var param = new Vector4(_waveAmplitude, _waveExponent, _waveInterval, _waveSpeed);
Shader.SetGlobalVector(waveParamsID, param);
```

```SonarFx.shader
 // Apply to the surface.
 o.Albedo = _SonarBaseColor;
 o.Emission = _SonarWaveColor * w + _SonarAddColor;
```
最後にEmissionに波の効果を反映して終了です。
かなりシンプルな手法でこれだけのエフェクトを実現しているのが驚きです。
Xcode8でのSwift3対応でPodfile周りでやったこと

# 概要

XCode8にアップデートしてライブラリ周りでビルド通らず困った時にやった対応の備忘録。

# 動作環境

XCode 8.0

# 内容

## Swiftのバージョン指定を追加する

```
Use Legacy Swift Language Version” (SWIFT_VERSION) is required...
```

っていうメッセージでビルドがこける時

```:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
    end
  end
end
```

Podfileの最後に上記を加えます。
これでpod update をした時にSwift3.0としてビルドしてくれるようになります。

## リポジトリ指定を追加する

上記を行って、ビルドエラーが出るライブラリについてはSwift3対応のリポジトリがある(と思う)ので、それを確認してPodfileの指定に追加します。

```:Podfile
pod "Instructions", :git => "https://github.com/ephread/Instructions.git", :branch => "swift3"
```

最後の":branch" の指定が取得対象のリポジトリの指定になっているので、Swift3用のリポジトリを指定してあげます。
ライブラリによってbranch名は違うと思うので、各ライブラリのgithubリポジトリで確認してください。
これで再度 pod update かけたあとに  Clean → Build で通ればOKです。

# 参考

http://stackoverflow.com/questions/38446097/xcode-8-beta-3-use-legacy-swift-issue
pleskが表示されない(Call to a member function getWebServerPackage() on a non-object (class.ServiceControl.php:76))


# ある日、pleskにログインしたら

以下のエラーが表示されておりました。

```php
ERROR: Call to a member function getWebServerPackage() on a non-object (class.ServiceControl.php:76)
```

以下真っ白


# 原因


pleskの設定値が保持されている、
”psa”データベースの”ServiceNodeEnvironment”テーブルのレコード値の１つが、
空欄になっているのが原因でした。

pleskの自動アップデートが行われた後、このような現象が起こるようです。


# 解決方法

コマンドラインからmysqlにadmin userでログインし、
以下の２つの作業を行います。

1. 空欄になっているレコードを削除する
2. 正常なレコードを挿入



- 空欄になっているレコードを削除する。

```bash
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql -u admin psa -e
"delete from ServiceNodeEnvironment where name='httpd';"
```

- 正常なレコードを挿入

``` bash
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql -u admin psa -e
"insert into ServiceNodeEnvironment values
(1,'componentsPackages','httpd','`rpm -q --qf "%{VERSION}.%{RELEASE}\n" httpd`')"
```

もし、

```bash
Thread died in Berkeley DB library
```

というエラーが表示された場合、
RPMのデータベースが壊れているかもしれません。

その場合は、こちらのリンクを参照してください。

http://readit.l8r.in/post-568/



# お世話になった記事

https://kb.plesk.com/en/120503

http://readit.l8r.in/post-568/
RockSmith2014のゲーム配信するための設定

# RockSmith2014のゲーム配信するための設定

## RockSmith2014の設定

### 配信の設定

#### 配信ソフトへ音がこない

オーディオの独占がオンになっている可能性がある
オフの場合は配信ソフト側の設定を見直す

**[ツール]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/72bba90e-2fd7-4126-eb3d-731c8f65382e.png)

**[オプション]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e4467060-29bd-727d-943f-9a26a613b67f.png)

**[オーディオ設定]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/80cd1ea4-f8f9-088b-8043-ab936dbf99e2.png)

**[オーディオの独占]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/fd3b6308-dd5d-fcc4-2186-ea46fb2eb93e.png)

**[オフ]に設定する**
オフに設定したら、ESCキーを何度か押してRockSmithを終了させる
(WindowのXボタンでは設定が反映されない)
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/08f84784-b9e4-9ac6-4e51-a8ec0dcc73f1.png)


### ベース側のトラブルシューティング

#### いきなりノイズを発生するようになった

チューニングでTABキーを押下して「シミュレートされたベース」になっていないか確認する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b9785d41-9226-790b-5696-c06d24f456ca.png)

#### ベースの音が小さい

ベースの音が小さいと低音が反応しずらくなる。
Gainの値を大きくする


**[ツール]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/72bba90e-2fd7-4126-eb3d-731c8f65382e.png)

**[オプション]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e4467060-29bd-727d-943f-9a26a613b67f.png)

**[オーディオ設定]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/80cd1ea4-f8f9-088b-8043-ab936dbf99e2.png)

**[リアルトーンケーブルのゲイン]を選択**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8dc6d56d-fd43-a9f3-bcf3-ac9af22ca502.png)

**ゲインの数値を上げる**
ゲインを上げた後はキャリブレーションが始まる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e2f2cfa7-2905-a3ed-a2d5-b6557644e7b3.png)
ローカルでのruby on rails開発環境構築用参考サイト集

VirtualBoxをインストールする
【初心者でもわかる】VirtualBoxインストール方法を詳しく！http://eng-entrance.com/virtualbox-install
vagrantを使用するなら
Vagrant入門 (全13回)
http://dotinstall.com/lessons/basic_vagrant
キーボードが英語やドイツ語になっていたりするので
　GRUB でイコール "=" を入力する方法
　　https://users.miraclelinux.com/support/?q=node/154
　まずはCentOS6.4 日本語化
　　http://yu-ya45.hatenablog.com/entry/2013/06/19/230846
　CentOSで日本語キーボードに変更する(in CUI)
　　http://qiita.com/yoshiken/items/b06a97dd8958f3a6dd09
　CentOS6.4　英語キーボードを日本語キーボードへ設定変更
　　http://yu-ya45.hatenablog.com/entry/2013/06/20/224250
　Vagrant の CentOS 7 にて日本語設定
　　http://qiita.com/sirone/items/a210c4f26ef9dbfef4b4
このままだと使いにくいのでGUIを使えるようにする。
　CentOS7 に後から GUI (X Window System) を追加する　　　　　　　http://blog.amedama.jp/entry/2015/09/01/232339
　[CentOS]CentOS7最小限のインストールからのGnomeデスクトップ環境構築
　　http://zero-config.com/centos/gnome-0001.html
　CentOSでのCUIとGUIの切り替えについて
　　http://blog.rutti.net/item_217.html#.V_tcROCLTIU
　CentOS 7をCUIで起動する方法
　　http://note.kurodigi.com/centos7-cuilaunch/

rbenvを入れていく
基本的には　CentOSにrbenvをインストールする方法に従う。
　　http://www.task-notes.com/entry/20150624/1435114800
　まっさらなCentOS6.5(AWS)にRails4.1.1とruby 2.1.2p95を入れる
　　http://qiita.com/TasukuNakano/items/cc52d10585f7295cefef
　[初心者向け] Vagrantで構築した仮想環境にrbenvを利用してRubyをインストール
　　http://qiita.com/roki1801/items/bd20f9ed92209333476e
　rbenv で Ruby2.1.2 がインストールできなかった話
　　http://qiita.com/Tocyuki/items/4c44553d23a675a8fa3e
  CentOS6.5 + rbenvでrubyを2.2.0にUpdateする際のメモ
   http://qiita.com/koudaiii/items/5d56044d4fc3863961d9
  rbenv installation permission denied
   http://stackoverflow.com/questions/31588604/rbenv-installation-permission-denied
一般ユーザでsudoが実行できない場合
　http://qiita.com/ume_tomo/items/71861a7797d5f5f12b2b
visudoコマンド（sudoコマンドの為の設定ファイルの編集）
　http://www.garunimo.com/program/linux/visudo.xhtml
vi って何コレ使いにくい！
　http://www.flipflipflip.com/vps_wp/20140202vps14.html
sudoersを変更する、よく使う設定例
　http://takuya-1st.hatenablog.jp/entry/20090806/1249554458

Ruby on Rails - railsのインストール
　http://saitoh.hatenablog.jp/entry/2014/08/31/170800
Railsの環境構築 ~起動にエラーはつきもの？Rails起動編~
　http://krs1.hatenablog.com/entry/2016/05/30/120000
LinuxにRuby on Railsをインストールする
https://tsuchikazu.net/linux_ruby_on_rails_install/
SNS系アプリ開発で便利なライブラリ達 <<前編>>


いま話題のIPhoneアプリ「Rom」の中身を分解してチップス形式でお届け！
 
Romアプリは下記リンクより
https://itunes.apple.com/us/app/rom-minnadewaiwaioshaberi/id1130668811?mt=8
 

さてさて、初回はRomでも使用しているSNS系アプリ開発で便利なライブラリ達をサクっとご紹介します

まずはUI/UX 画面系のライブラリ達です。

# SVProgressHUD
画像のダウンロードや通信待ちでカッコイイLoadingポップアップを数行で表示してくれるSVProgressHUD

* https://github.com/SVProgressHUD/SVProgressHUD



# MMDrawerController
Androidアプリではお馴染みの左サイドからニョキっと出てくるメニュー画面を実装してくれるMMDrawerController

* https://github.com/mutualmobile/MMDrawerController



# PageMenu
カテゴリ毎に何かをリスト表示したい時、タブ付きで横スクロールViewを実現してくれるPageMenu

* https://github.com/uacaps/PageMenu


# Spring
Viewに対して各種アニメーション動作を用意してくれるライブラリ
多数のアニメーションが用意されていて、動作に強弱をつけたりを数コードで実現してくれます

* https://github.com/MengTo/Spring


# RAMAnimatedTabBarController
アイコンタップ時にも微動駄しないUITabVIewContorllerを拡張して、アイコンタップ時に各種アニメーションを設定できるRAMAnimatedTabBarController。

* https://github.com/Ramotion/animated-tab-bar


# iCarousel
フリック動作で画像を走馬灯のように回せるカルーセルメニューを実装してくれるiCarousel
ユーザ一覧や画像選択等に使用すると見た目も、選択しやすさもグッとアップ

* https://github.com/nicklockwood/iCarousel


前半はここまで！
後半は稼働監視や、JSONデコードなど裏方さんのライブラリ達を一挙紹介していきます
型定義ファイルのインストール方法(TypeScript 2.0版)

# 概要

[TypeScript 2.0](https://blogs.msdn.microsoft.com/typescript/2016/09/22/announcing-typescript-2-0/)が正式リリースになりました。
今まで型定義ファイルを管理するツールとして typings (さらに前だとtsd)という専用のツールが提供されていましたが
TS2.0からは[npm](https://www.npmjs.com/)だけで管理できるようになります。

# 利点

* 専用のツールのインストールが不要になる
* 専用のコマンドを覚える手間が無くなる
* typings.json のような専用の管理ファイルが不要になりpackage.jsonだけで管理できる

# 使い方

(以下はnpmがインストールされていること前提で話を進めます。)
TS2.0の型定義ファイルの管理には npmの[`scoped package`](https://docs.npmjs.com/misc/scope)という機能が使われており
typesという名前のスコープ以下に型定義ファイルのパッケージが登録されています。

```bash
$ npm install --save @types/lodash
```

上の例では lodash をインストールしています。
npmのインストールコマンドで、パッケージ名のプリフィックスに `@types/` をつけるだけでOKです。

## 型定義ファイルを探す

大抵の型定義ファイルは元のnpmのパッケージと同名で登録されており、先頭に `@types/` をつけた名前が目的にパッケージの可能性が高いですが、キーワード検索したい場合も出てくるかと思います。
残念ながらtypingsのようにリポジトリから検索するコマンドは現在提供されていないようです。[^1]
今のところは下記のサイトで型定義ファイルの検索ができるようです。
http://microsoft.github.io/TypeSearch/

[^1]: npmがscoped package内の検索に対応していないためだと思われます。

## インポートの方法

```ts
import * as _ from "lodash";
```

パッケージをインポートする場合は、これまでと同様にモジュール名を指定するだけでOKです。

ちなみに型定義ファイルは `node_modules/@types` フォルダ以下にインストールされます。
名前解決時に`@types`というフォルダ名が特殊扱いされてその中身も探してくれるみたいです。
IntelliJ IDEAでよく使うキーボードショートカットたち


分類は適当.
IntelliJのkeymap内で検索するときはショートカットキー自体を教えてくれるよりも何の操作なのかっていう項目を書いてくれたほうが嬉しい気がするので操作名を書くことにする. (デフォルトのショートカットキーは無効になってたりいじってたりする人多そうなので)

# カーソル系

## Clone Caret Below, Clone Caret Above
次の行, 前の行にカーソルを複製する.

## Add Selection for Next Occurrence
選択している単語にカーソルを複製する.

## Toggle Sticky Selection
Emacsのmark setみたいな感じで選択を開始する.
もう一回押せば選択解除になる.

# コード系

## Reformat Code
リフォーマットする. たぶん書いてる言語によっていろいろ違うのでは?(未確認)

## Completion
明示的にコード補完を呼び出す. Smart TypeとBasicがある.
たぶんこれも書いてる言語によっていろいろ違う気がする.

# その他?

## Test
該当するメソッド･クラスのテストファイルを開く.
逆にテストファイルを開いているときは該当クラスのファイルを開く.

## Search Everywhere
めっちゃいろいろ探せる.
vagrantによるCentOS環境構築メモ

Windows10にvagrantを使った環境構築を試みてみたので、手順を記録。
基本的にはドットインストール参照http://dotinstall.com/lessons/basic_localdev_win
目的は
・vagrantって何ぞや？
・vagantってどうやって使うんや？
ということを解消するため。
現時点でこの環境を使って何かしようというものではない。

ちなみにこのWindows10はいろいろぶちこんでいる~~お遊び用~~テスト用のサブPCなのでぶっ壊れても気にしない。~~というか、Win10が入っている時点で壊れているも同然。~~

#1. Virtual Boxのインストール
インストールしたバージョンは5.0。色々なサイトを見てみると、5.1以上は不具合が多数報告されているとのこと。
※ちなみにVirtual Boxである必要性はない。VMWareとかでももちろんok試してないから保証はしないけど。

これを書いている現在（2016/10/10）時点ではどうなってるか知らん。

#2.vagrantのインストール
インストールしたバージョンは1.8.4。色々なサイトを（以下同文）

#3.vagrant初期化
この辺はドットインストール参照。vagrantの公式サイトは
https://www.vagrantup.com
↑これ

#4.PUTTY導入
ここもドットインストール参照。なぜかはじめはうまくいかなかったが、日を改めて作業用に作成したvagrantフォルダをクリーンにして再度挑戦してみたら一発でするっと接続できた。
趣味でやる分にはうまくいかないときは、さくっと諦めることも肝心。

ここで間違ってもteratermの方がカッコいいんじゃね？と邪な挑戦をしてはいけない。初心者は指示されたことを忠実にこなすべきである。

~~#5.とりあえず最新化~~
vagrantに接続できたらとりあえず、以下のコマンド実行して最新化しておく。
>sudo -s
>yum update

ちなみに時間がけっこうかかる。待っている間はデレステでもして時間をつぶす。スタミナ漏れには気をつけなけなければならない。時間は有限だ。
スタミナを消費し終えて画面を見てみると[y/N]と聞かれていることに気付くはず。当然yを押す。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/130149/f25597e7-de7f-61bf-cfe6-f01ccb54a34d.jpeg)

212個という莫大な更新が走るようなので、待っている間はスクフェスでもして（以下同文）

#6.必要なツール・プログラムのインストール
本来であれば自分にとって必要なものをインストールするものである。
が、目的はあくまでvagrantを使用した環境を構築すること。
ここはさくっとドットインストールを参照して一気に入れてしまう。
とはいえ、一括で入れることになるので相当時間がかかる。
※ドットインストールからgitで落とした場合のフォルダ名がcentos65なので混乱しないように

と、思ったらエラー発生。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/248da4d8-944f-1c45-f0cf-75c6def7ab86.jpeg)

![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/130149/df2b8d76-cb4a-1c3f-da6f-b9b52b4cb63d.jpeg)

どうもrubyのインストールがうまくいかなかったようです…

どうやら原因はこれ↓っぽい？
https://gist.github.com/yutokyokutyo/864ddfa00146d8c9c51d
最新化後、そのまま管理者権限でインストールを実行したのがダメだったぽい……
今後は不必要に管理者権限で実行しないようにしよう。

結局ユーザの変更などをやってもダメっぽいので一度破棄して、5をとばして6から実行した。
初心者は指示されたことを忠実にこなすべきである。



最後に今回入れたのはCentOS6.7なので、フォルダ名を変更
>mv centos65 centos67
MacサーバからNO-IPを自動更新する

MacサーバからNO-IPを自動更新する
==============================
NO-IPの公式アプリで自動更新ができないため、スクリプトで自動更新を実現しました。

NO-IPのMac用公式アプリでdaemonを自動起動に設定しても、自動起動している様子はなく、daemonを起動してもログが記録されないので、更新しているかも分かりません。そこで、[こちら](http://www.blaize.net/2015/03/no-ip-dynamic-update-client-duc-with-shell-scripts-and-or-cron-jobs/)で紹介されている方法をMacに適用しました。

ここで紹介されているスクリプトは、Macだと動作しない場合があるので、少しだけ修正しました。
（Macだとデフォルトでインストールされている`wget`がSSLの問題で正常に動作しない場合があるので、`curl`で代用しました。）

また、`cron`の代わりにMacでは`.plist`を記述して、`launchctl`で登録します。

追記：
なぜか、全く同じ条件にも関わらず、30分など時間を置いて実行すると、no-ipの更新APIが"badauth"（認証エラー）を返してきます。しかし、立て続けに実行すると５回目位から成功するようになります。なので、スクリプトも実行される度に６回エンドポイントを叩くように修正しました。
もっとちゃんとした解決策を知っている人が居たら教えてください！

El Capitanのみで動作確認しました。

設定手順
------------
[スクリプト](https://github.com/pikanji/no-ip)をダウンロード（[zipファイルはこちら](https://github.com/pikanji/no-ip/archive/osx.zip)）
展開して、`no-ip.sh`と`no-ip.plist`のみを使用します。

`no-ip.plist`のLabelの値を適当な文字列に変えてください。
(他のとかぶってなければそのままでも動きますが。`launchctl list`コマンドなどで表示される際に使用されるものだと思います。）

`no-ip.sh`を配置し、実行権限を付けます。

```bash
sudo mv no-ip.sh /usr/local/bin/no-ip.sh
sudo chmod +x /usr/local/bin/no-ip.sh
```

`no-ip.plist`を配置し、オーナーをrootに変更します。

```bash
sudo mv ~/no-ip/no-ip.plist /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/no-ip.plist
```

設定ファイルを作成します。

```bash
sudo vi /etc/no-ip/no-ip.conf
```

内容は下記を適宜修正します。

```
user=username
password=password
hostname=hostname.example.com
logfile=/var/log/no-ip.log
detectip=true
interval=10

```
追記：
１度の実行で複数回の更新APIへのアクセスをするために、intervalを追加しました。

最後の行に改行を入れないと、最後の行の設定が読み込まれないので気をつけてください。

`launchctl`で起動します。
`sudo launchctl load -w /Library/LaunchDaemons/no-ip.plist`

ちなみに、停止はこちら
`sudo launchctl unload /Library/LaunchDaemons/no-ip.plist`

このplistでは毎時間、0分と30分に実行されるように記述しています。
変更したい場合、plistの中を見ればどこを変更すべきかすぐにわかります。

plist作成の参考：[Apple Developer](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html)
結合文字列をUnicode正規化で合成する方法の危険性

## ここで扱うこと
結合文字列を解消する目的でUnicode正規化形式のNFCを適用する方法がよく紹介されています。このように合成を目的としてNFCを利用するのは大変に危険です。なにが危険なのかを説明します。

## 用語の選定
Unicode標準とUCS（ISO/IEC 10646）は用語体系が異なります。その違いがここでは深刻な影響を与えるため、慎重に用語の選定をしなければいけません。ここで扱う問題はUCSの用語では説明不可能なので、Unicode標準の用語を選びます。

Unicode標準では「合成」を「結合文字列から合成済み文字にすること」のみを指します。

![UnicodeStandard.png](https://qiita-image-store.s3.amazonaws.com/0/27806/a157a599-8d90-dd61-3f64-7bdaa39d432b.png)

## なにが危険なのか
NFCが合成だけをするのならいいのですが、それだけではなく、意図しないところで別の文字に変わってしまう現象が発生します。とくに漢字でそれが大量に発生します。下図はその一例。

![NFC](https://qiita-image-store.s3.amazonaws.com/0/27806/34042ed9-69d4-d5d2-c2c9-8cc16b5f9100.png)

このようにNFCを適用すると、別の漢字に変わってしまいます。NFCだけでなく、Unicode正規化ではどの形式でもこの現象が発生します。対象となる文字は [CompositionExclusions.txt](http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt) にまとめられています。この中の日本語の漢字は人名で使われているものが多く、それが別の漢字に変わってしまうのは深刻な事態を招きます。

Unicode正規化は、そもそもバックグラウンドでの文字列照合で使われる処理であって、テキスト文字列を整形するためのものではありません。安易に利用しないようにしましょう。

## それではどうしたらいいのか
[結合文字列を合成する安全な方法を考える](http://qiita.com/monokano/items/15c1d70d2f77bd37d067) で考察してみました。
UbuntuをVMWareで自動インストール後の設定


# タイムゾーンの設定

```shell-session
timedatectl set-timezone Asia/Tokyo
```

# ロケールの設定

```shell-session
apt-get install language-pack-ja
update-locale LANG=ja_JP.UTF-8
```

# キーボードレイアウトの設定

```shell-session
dpkg-reconfigure keyboard-configuration
```
Swift3.0 で ひらがな <-> カタカナ 変換する

Swift3 で動くコードがなかったので。
[Stringクラスにひらがな・カタカナ変換をextensionする](http://qiita.com/MIN/items/a37b6e1ce0f41872fd2c) を Swift3 でいけるようにしただけです。

## extension

```
extension String {
    func toKatakana() -> String {
        var str = ""

        for c in unicodeScalars {
            if c.value >= 0x3041 && c.value <= 0x3096 {
                str += String(describing: UnicodeScalar(c.value + 96)!)
            } else {
                str += String(c)
            }
        }

        return str
    }

    func toHiragana() -> String {
        var str = ""

        for c in unicodeScalars {
            if c.value >= 0x30A1 && c.value <= 0x30F6 {
                str += String(describing: UnicodeScalar(c.value - 96)!)
            } else {
                str += String(c)
            }
        }

        return str
    }
}
```

## 参考

* [Stringクラスにひらがな・カタカナ変換をextensionする \- Qiita](http://qiita.com/MIN/items/a37b6e1ce0f41872fd2c)
* [Swift でひらがな／カタカナを変換する \| hacknote](http://hacknote.jp/archives/11899/)
iOSアプリ申請時に「このビルドは無効です」となりアーカイブのアップロードができない時


## 困った内容
アプリを申請しようとアーカイブをアップロード。
iTunes Connectでビルドを選択しようとしたら
「このビルドは無効です。」と表示されてビルドを選択できない。
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/aca3fe7d-8d14-8f8b-87b2-3a9fd7d6e22a.png)

## あれ、こんなメールが来ていた
Appleから下記メールが届いてしまいた。
SpeechFrameworkに関するInfo.plistの設定が足りてなかったらしい。
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/e2d3fd75-0dff-d7f0-e6f8-90e02fc3337a.png)

## 早速
Info.plistに「Privacy - Speech Recognition Usage Description」の設定を追加した所、、、無事に解決しました。
AppleのサンプルアプリのSpeakToMeを見るとたしかに設定されているので、参考にしてなかったのはいけなかったと反省。若干改善案をぼやくと、メールで教えてくれるのもいいですけど、そもそもXcodeのビルドでFailedにするとか、「このビルドは無効です。」の表示から原因が追えるようなUI/UXにして欲しいですね。何にせよ、とりあえずアップロードできたのでOKです。
perl使いのpythonメモ - formatって便利ですね。


- pythonであれ？とおもったことをメモしときます。

## %で変数展開

- perlでのsprintfにあたるのは、pythonでは%で実現できます。お手軽でいいですね。

```python
>>> u"%s,%02d" % ('ABC',2)
'ABC,02'
```

## formatというのもありました。

### {添字}で展開できるようです。

```python
>>> "{0},{1}".format('ABC',2)
'ABC,2'
```

### %02dみたいなフォーマット指定もできるみたい。

```python
>>> "{0},{1:02d}".format('ABC',2)
'ABC,02'
```

### リストの展開であれ？

- 直接記入じゃなくて変数を入れてみます。

```python
>>> a = ['a','b','c']
>>> a
['a', 'b', 'c']
>>> "{0}_{1}_{2}".format(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
```

- あれ？怒られちゃいました。
- 変数のaのところを\*aって書くようです。

```python
>>> "{0}_{1}_{2}".format(*a)
'a_b_c'
>>> "{0}_{1}_{2}".format(*['a','b','c'])
'a_b_c'
>>> "{0}_{1}_{2}".format(*('t','u','p'))
't_u_p'
```

### 辞書型との組み合わせが便利！

- まぁここまでなら、そうだよねって程度ですよね。
- でも辞書型との組み合わせが便利です、これだけでテンプレートモジュール使ってるみたい。
- 変数は\*を２つの、\*\*dと書けばいいようですね。

```python
>>> d={"name":"John","age":25}
>>> d
{'name': 'John', 'age': 25}
>>> "call me '{name}' , I'm {age}".format(**d) 
"call me 'John' , I'm 25"
```

- The 簡単！

## 辞書型とformatの組み合わせの例

- 今時はJSONみたいに辞書と配列くらいしかないので応用範囲も広いですね。

```python:rss.py
# -*- coding: utf-8 -*-

import feedparser

qiita_dic = feedparser.parse('http://qiita.com/tags/python/feed.atom')

for entry in qiita_dic.entries:
    print(u"{title}\t{link}\t{published}\t{author}".format(**entry))
```

- 実行結果です、１行でできるのがいいですね！

```shell
sh-3.2$ python rss.py
TensFlowの環境設定メモ	http://qiita.com/s_nakamura/items/b502fb29b3f6321a0403	2016-10-10T16:09:52+09:00	s_nakamura
機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた 〜その１〜	http://qiita.com/sasaco/items/3b0b8565d6aa2a640caf	2016-10-10T15:28:54+09:00	sasaco
[自分用メモ] Pythonのシーケンス型・マッピング型	http://qiita.com/RyoMa_0923/items/a714eb5dce24e9463c00	2016-10-10T13:16:19+09:00	RyoMa_0923
Pythonのコーディング規約PEP8を要約してみる(2)	http://qiita.com/sartan123/items/a74010b06f47792e7660	2016-10-10T11:55:54+09:00	sartan123
StackStorm : st2sdkでpackを開発する	http://qiita.com/unchemist/items/10046264d29fb7c7334b	2016-10-10T03:08:35+09:00	unchemist
Ubuntu で 窓替えのような機能を実装する	http://qiita.com/fx-kirin/items/f41aaaeef9a5886cf87f	2016-10-10T00:50:32+09:00	fx-kirin
〜〜〜
```

## perlだと...

- こんな感じかな〜、formatと比べると直感的じゃないですね...

```perl
sh-3.2$ perl -le '{my %d = ("name"=>"John","age"=>25);print sprintf("call me %s , Im %d",map {$d{$_}} ("name","age"))}'
call me John , Im 25
```
[JAWS-UG CLI] CodeCommit #1 リポジトリの削除

AWS CLIを利用して、CodeCommit上のリポジトリを削除してみます。


前提条件
========


CodeCommitへの権限
------------------

CodeCommitに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.9.20

```bash:コマンド:
aws --version
```

```json:結果(例):
      aws-cli/1.11.2 Python/2.7.11 Darwin/15.6.0 botocore/1.4.60
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド(バージニアリージョンの場合):
export AWS_DEFAULT_REGION='us-east-1'
```

注釈: 2016-01-17時点でCodeCommitはus-east-1のみ提供されています。


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         us-east-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


1. 事前作業
===========

```bash:コマンド:
aws codecommit get-repository \
        --repository-name ${CODEC_REPOSITORY_NAME}
```

```json:結果(例):
      {
        "repositoryMetadata": {
          "repositoryName": "handson-20161010",
          "cloneUrlSsh": "ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/handson-20161010",
          "lastModifiedDate": 1234567890.123,
          "repositoryDescription": "hands on repository on 20161010",
          "cloneUrlHttp": "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/handson-20161010",
          "creationDate": 1234567890.123,
          "repositoryId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "Arn": "arn:aws:codecommit:us-east-1:XXXXXXXXXXXX:handson-20161010",
          "accountId": "XXXXXXXXXXXX"
        }
      }
```


2. リポジトリの削除
===================

```bash:変数の確認
cat << ETX

        CODEC_REPOSITORY_NAME: ${CODEC_REPOSITORY_NAME}

ETX
```

```bash:コマンド:
aws codecommit delete-repository \
        --repository-name ${CODEC_REPOSITORY_NAME}
```

```json:結果(例):
      {
        "repositoryId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
```


3. 事後作業
===========

```bash:コマンド:
aws codecommit get-repository \
        --repository-name ${CODEC_REPOSITORY_NAME}
```

```json:結果(例):
      An error occurred (RepositoryDoesNotExistException) when calling the GetRepository operation: handson-20161010does not exist
```


完了
====
[JAWS-UG CLI] CodeDeploy #3 アプリケーションの削除

AWS CLIを利用して、CodeDeploy上のアプリケーションを削除します。


前提条件
========


CodeDeployへの権限
------------------

Code Deployに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.2

```bash:コマンド:
aws --version
```

```text:結果(例):
         aws-cli/1.11.2 Python/2.7.11 Darwin/15.6.0 botocore/1.4.60
```

   バージョンが古い場合は最新版に更新しましょう。

```text:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


変数の確認
----------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
               Name                    Value             Type    Location
               ----                    -----             ----    --------
            profile         iamFull-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
         access_key     ****************XXXX shared-credentials-file
         secret_key     ****************XXXX shared-credentials-file
             region                         us-east-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```text:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


1. 事前作業
===========


1.1. アプリケーション名の指定
-----------------------------

```bash:変数の設定
CODED_APP_NAME=handson-app-20161010
```


1.2. アプリケーションの確認
---------------------------

```bash:コマンド:
aws deploy get-application \
        --application-name ${CODED_APP_NAME}
```

```json:結果(例):
      {
        "application": {
          "applicationName": "handson-app-20161010",
          "linkedToGitHub": false,
          "applicationId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "createTime": 1234567890.123
        }
      }
```


2. アプリケーションの削除
=========================


2.1. アプリケーションの削除
---------------------------

```bash:変数の確認
cat << ETX

        CODED_APP_NAME: ${CODED_APP_NAME}

ETX
```

```bash:コマンド:
aws deploy delete-application \
        --application-name ${CODED_APP_NAME}
```

```text:結果(例):
(戻り値なし)
```


3. 事後作業
===========

アプリケーションが存在しないことを確認します。

```bash:コマンド:
aws deploy get-application \
        --application-name ${CODED_APP_NAME}
```

```text:結果(例):
      An error occurred (ApplicationDoesNotExistException) when calling the GetApplication operation: Applications not found for XXXXXXXXXXXX
```


完了
====
[Ruby] SinatraでMysqlのデータを返却するjson APIを作る


[前の記事](http://qiita.com/Feburic/items/20590d02152e06faf502)とかでMysqlに貯めたデータを外から使いたいと思ってSinatraでjsonAPI化したので手順をメモ。
mysql2でやったけど、本来はActiveRecordとかを使うべきなのかもしれない。

## 下準備
### 必要なGemをインストール
```
gem install mysql2
gem install sinatra
gem install json
```
### テーブルを作成
サンプル用のテーブルを作成。作成後適当なデータをinsertしておく。
既になにかしらデータの溜まったテーブルがあるならそれを使えばいいです。

```
mysql> CREATE TABLE `data` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Title` varchar(256) DEFAULT NULL,
  `URL` varchar(512) DEFAULT NULL,
  `Created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

mysql> desc data;
+--------------+--------------+------+-----+-------------------+----------------+
| Field        | Type         | Null | Key | Default           | Extra          |
+--------------+--------------+------+-----+-------------------+----------------+
| Id           | int(11)      | NO   | PRI | NULL              | auto_increment |
| Title        | varchar(256) | YES  |     | NULL              |                |
| URL          | varchar(512) | YES  |     | NULL              |                |
| Created_at   | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+--------------+--------------+------+-----+-------------------+----------------+
```

## API部分のコード
mysql2で取得したレコードを1行づつ配列に格納した後to_jsonでjson化、APIのレスポンスとする。
不要なカラムがある場合は、sqlで落とす他にto_jsonの引数で取捨選択することも出来る模様。

```ruby:api.rb
require 'sinatra'
require 'mysql2'
require 'json'
require 'yaml'

get '/api' do
  content_type 'application/json'
  db_to_json
end

def db_to_json
    client = Mysql2::Client.new(YAML.load_file('database.yml'))
    sql = "select * from data limit 10" #10件分取得

    ary = Array.new
    client.query(sql).each {|row| ary << row}
    return ary.to_json
end
```
DBの設定ファイル

```ruby:database.yml
database: データベース名
host: localhost
username: ユーザ名
password: パスワード
```

## リクエストしてみる
### sinatraを起動
`$ ruby api.rb`
### wgetでアクセス（jqで整形）
```bash
$ wget -O - "http://localhost:4567/api" | jq .
[
  {
    "Id": 1,
    "Title": "MechanizeでTwitterアナリティクスのデータエクスポートを自動化する",
    "URL": "http://qiita.com/Feburic/items/20590d02152e06faf502",
    "Created_at": "2016-10-10 02:16:00 +0900"
  },
  {
    "Id": 2,
    "Title": "Amazonの商品ページURLフォーマットに関するメモ",
    "URL": "http://qiita.com/Feburic/items/6e918b1a9345367622c9",
    "Created_at": "2016-10-10 02:16:00 +0900"
  }
]
```

うまいこと動いてるっぽい。
argumentsオブジェクトを配列(Array)にする方法

今更ですが`arguments`オブジェクトを配列(Array)にする方法をいくつかあげてみた。

# :large_blue_circle:黒魔術系： `arguments`オブジェクトそのもののクラスを`Object`から`Array`に変更する

配列(Array)の様に`arguments`を扱えるようにする。非常に危険なので注意。

```js
Object.setPrototypeOf(arguments, Array.prototype);
// または
arguments.__proto__ = Array.prototype;
```

```js
function sortArgs() {
	Object.setPrototypeOf(arguments, Array.prototype);
	return arguments.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

実はArray-likeなオブジェクトになっているだけなので、そのまま使用しないように。
というか、実際のプロジェクトには使っちゃいけない。
あまり速くもないし。

# :large_blue_circle:`for`を使って`arguments`を配列にコピーする

普通。`args = []`より`args = new Array(n)`がいいかも。

```js
var args = [];
for (var i = 0; i < arguments.length; ++i)
  args[i] = arguments[i];
```

```js
function sortArgs() {
	var args = new Array(arguments.length);
	for (var i = 0; i < arguments.length; ++i)
		args[i] = arguments[i];
	return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

# :large_blue_circle:`slice`を呼んで`Array`に変換する

`slice`を呼んで配列にする。これは非常によく見かける方法。

```js
var args = [].slice.call(arguments);
// または
var args = Array.prototype.slice.call(arguments);
```

```js
function sortArgs() {
	return [].slice.call(arguments).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

# :large_blue_circle:...argsで`Array`として引数を得る

ES6 (ES2015) 以降ならこの方法が一番いいと思う。

```js
(...args)
```

```js
function sortArgs(...args) {
	return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

似てるけど他に以下の方法もある。

```js
function sortArgs() {
	return [...arguments].sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

# :large_blue_circle:`Array.from`を呼んで`Array`に変換する

ES6 (ES2015) 以降ならこの方法もある。

```js
var args = Array.from(arguments);
```

```js
function sortArgs() {
	return Array.from(arguments).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

# :large_blue_circle:`Array`を呼んで`Array`に変換する

ちょっとトリッキーな方法。

```js
var args = arguments.length === 1 ? [arguments[0]] :
             Array.apply(null, arguments);
```

```js
function sortArgs() {
	var args = arguments.length === 1 ?
		[arguments[0]] : Array.apply(null, arguments);
	return args.sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

長さが1の時に注意が必要。`Array(n)`は違う意味になるため。

# :large_blue_circle:`map`を呼んで`Array`に変換する

こういうのもある。

```js
var args = [].map.call(arguments, x => x);
```

```js
function sortArgs() {
	return [].map.call(arguments, x => x).sort().join(',');
}

console.log(sortArgs(1, 3, 5, 2, 4, 6));
```

# :large_blue_circle:`push`を呼んで`Array`に変換する

あまり役に立たない。

```js
var args = [];
[].push.apply(args, arguments);
```

# :large_blue_circle:`concat`を呼んで`Array`に変換する

これも役に立たない。

```js
var args = [].concat.apply([], arguments);
```

# :large_blue_circle:ほか



## Stack Overflow
### Converting the “arguments” object to an array in javascript
http://stackoverflow.com/questions/960866/converting-the-arguments-object-to-an-array-in-javascript
MSC-MOD20 > MSC-MOD10との比較 > まとめ

microSDカードモジュール MSC-MOD10とMSC-MOD20の違いについて。

[比較のまとめ @ mindmup](https://atlas.mindmup.com/yasokada/msc_mod10_msc_mod20_161010/index.html)

2016年10月10日 MSC-MOD20のソフト実装にしばらく時間を使ったが、保留とすることにした。

状況が変わって再開することもあるかもしれない。その時用に上記を用意した。
RxSwift, Realm, Chart, Quick, Swinjectなどを使ったサンプルプロジェクト



プログラマたるもの解説文読むよりサンプルプログラム見た方が理解しやすいんじゃないかということで有名どころのライブラリを使ったサンプルアプリを作成して、[GitHubで公開しました](https://github.com/dobnezmi/EmotionNote)。

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/8102e74b-e2b2-615d-2a50-f534c2410350.png "screen1.png")
![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/77573/7a95afc3-17da-3b9d-d6db-e4fa112bd470.png "screen2.png")

感情を記録しよう、というアプリです。


#使っているライブラリ
以下のライブラリを使用しています。
[RxSwift](https://github.com/ReactiveX/RxSwift)
[Swinject](https://github.com/Swinject/Swinject)
[Quick](https://github.com/Quick/Quick)
[Nimble](https://github.com/Quick/Nimble)
[Realm](https://github.com/realm/realm-cocoa)
[Chart](https://github.com/danielgindi/Charts)
[SIFloatingCollection](https://github.com/ProudOfZiggy/SIFloatingCollection_Swift)

また、[VIPERアーキテクチャ](https://www.objc.io/issues/13-architecture/viper/)で実装しています。
それおかしいだろ、という部分があればご指摘いただけると嬉しいです。

ちょうどSwift3への移行期が挟まっていることもあって各ライブラリをCarthageで入れていたり、直接プロジェクトに入れていたりマチマチになっています。SIFloatingCollectionについてはSwift3に未対応なのでコードいじっています。

アプリとしてはとてもシンプルなものなので各ライブラリの使い方も見つけやすいんじゃないかなと思います。
ECRを使ってみる

# ECR
ECRはAmazon EC2 Container Registryの略で、docker hubやquay.ioと同じdockerイメージのregistryです。

ここでは、自分のnginxイメージをECRにpushして使ってみます。

## 準備
aws cliのインストール

```
$ sudo easy_install pip
$  sudo pip install awscli --ignore-installed six
```

credentialの設定

```
$ aws configure
```

IAMでユーザー作ってcredential.csvダウンロード

```
$ aws configure
AWS Access Key ID [None]: AK*******
AWS Secret Access Key [None]:***************
Default region name [None]: us-east-1
Default output format [None]: json
```

## ECSからregistryを選択
ECSへの初回アクセス時に「ECSで何したい？」みたいなこと聞かれるのでimageをregistryしたいです。みたいなチェックボックスのみチェックして先に進みます。

進んだ先にある「create repogitory」をクリックして名前を入力して先に進めば指示が出てきます。だいたいこの指示に従えば良いです。

## イメージをpushする
次にログインコマンドを得ます。

```
$ aws ecr get-login --region us-east-1
docker login -u AWS -p AQECAHhwm0YaISJeRtJm5n1G6uqeekXuoXXPe5UFce9Rq8/14wAAAuUwggLhBgkqhkiG9w0BBwagggLSMIICzgIBADCCAscGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMNB*****d37hSvJ5bYCU82qmBnuV*****0sy9YUzAYEU4HcqZfE84gQAtajmQkMSEyAyMg= -e none https://*****.dkr.ecr.us-east-1.amazonaws.com
```

ここで出た`docker login`コマンドをコピペして実行

そしてnginxのDockerfileがあるディレクトリまで移動してビルドします。

```
$ docker build -t dev_nginx .
```

そのあと作ったイメージにタグ付けします

```
$ docker tag dev_nginx:latest ****.dkr.ecr.us-east-1.amazonaws.com/dev_nginx:latest
```

最後にpushすれば完了です

```
$ docker push *****.dkr.ecr.us-east-1.amazonaws.com/dev_nginx:latest
The push refers to a repository [******.dkr.ecr.us-east-1.amazonaws.com/dev_nginx]
e7a4abc5075e: Pushed
5f70abc8a086: Pushed
4b26abc9a475: Pushed
ccb1abcd3fb7: Pushed
e387abcd2065: Pushed
63babc221cce: Pushed
e02dabc53481: Pushed
dea2e4abcd29: Pushed
latest: digest: sha256:******************* size: 10704
```

## docker-composeへの設定
docker-composeのimageにpushしたイメージを以下のような形式で書けば完了です。

```
# docker-compose.yml
nginx:
  image: *****.dkr.ecr.us-east-1.amazonaws.com/dev_nginx:latest
          .
          .
          .
```

これでbuildし直して`docker-compose up`して起動を確認したら完了です。

## 出たエラー
```
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken
```
IAMのECRの権限が足りません。追加しましょう。
[Node.js + Express]CSURFモジュールをURIパターンで無視させる。

WEB-API実装のときに、いきなりPOSTしようとしたら「invalid csrf token」とかいって怒られて困ったので、回避パターン考えました。
※標準(csurf version 1.9.0)ではリクエストメソッドの回避パターンしかオプションで用意されていないっぽい。

方法はシンプルで、CSURFのモジュール実行の手前でFUNCTIONをかまします。

```javascript:ignoreUriPattern
var express = require('express')
var app = express();
var csrf = require('csurf');

//csurfファンクションの取得(いつもapp.use(csrf({ cookie: true }))とかしてたとこ）
var csrfFuc = csrf({ cookie: true });
//アプリにかませる
app.use(function(req,res,next){
    //無視するURIのパターンを並べる
    var ignoreUris = ['^\/api\/.*$']
    for (var i=0,len=ignoreUris.length; i<len; i++) {
        //パターンマッチしたらそのまま処理を次へまわす。
        if(req.url.match(ignoreUris[i])){
            next();
            return;
        }
    }
    //パターンマッチしなかったら、CSRFの処理を通す。
    csrfFuc(req,res,next);
})
```
CMakeでコンパイラが設定されていない時の対処法

# 環境
Windows10
[Visual Studio 2015] (https://www.visualstudio.com/vs/)　インストール済
[CMake 3.6.2] (https://cmake.org/download/)　インストール済

### 参考
http://stackoverflow.com/questions/31619296/cmake-does-not-find-visual-c-compiler

# エラー内容

CとCXXのコンパイラがunknown

```
The C compiler identification is unknown
The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:2 (PROJECT):
  The CMAKE_C_COMPILER:

    wcl386

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.


CMake Error at CMakeLists.txt:2 (PROJECT):
  The CMAKE_CXX_COMPILER:

    wcl386

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.
```

# 原因
Visual StudioにC++のコンパイラがインストールされていなかった

# 対処法
Visual StudioでC++プロジェクトを作成し、パッケージをインストールする

## プロジェクトの新規作成
スタート画面からNew Projectをクリック
![2016-10-10.png](https://qiita-image-store.s3.amazonaws.com/0/17879/766041df-354d-8ac3-5e4e-28cd2b33029c.png)

### Visual C++を選択
なんでもいいので、テンプレートのVisual C++のタブからテンプレートを選択してOKをクリック
![2016-10-10 (1).png](https://qiita-image-store.s3.amazonaws.com/0/17879/e54ab5f8-6436-3194-0fe3-7dcde8b2aa96.png)
 
### Universal Windows Platform Toolsをインストール
ポップアップのInstallをクリック
![2016-10-10 (2).png](https://qiita-image-store.s3.amazonaws.com/0/17879/a6e2be66-d95a-4ffc-8184-673ad2b2c8c7.png)


## CMakeのエラーが解消されていることを確認
以上でC++のコンパイラがインストールされるので、CMakeが通るはず。

File > Delete Cacheでキャッシュを削除してからConfigureをクリック

![2016-10-10 (6).png](https://qiita-image-store.s3.amazonaws.com/0/17879/db6c0a41-93ed-f436-b00c-c2a3acca42e4.png)