OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのIAMユーザーに、Cloud formationでCreating Stackできる権限を付与する

IAMユーザーを作ってAPIキーを発行して、CLIでCloud formationを使おうと思ったら、
Attach PolicyのボタンからReadOnlyの権限しか付与できなくて困りました。

<img width="409" alt="IAM画面2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/5a4de433-05c1-0fa2-2d8b-6ea2f8c2d618.png">

# Create Policyで権限を作る

自分でポリシーを細かく設定して作れるようなので、作ります。

Policies → Create Policyでポリシーを作ります。

<img width="431" alt="IAM‗CreatePolicy.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/a098be97-1a09-12e8-855c-e771757dddfc.png">

Policy Generatorボタンを押します。

<img width="730" alt="IAM‗PolicyGenerator.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/ec60471b-25d8-3803-f946-421fd3f7526b.png">

Edit Permissionします。

<img width="728" alt="IAM‗EditPermission.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/242662a3-647b-99af-d35b-28b0270a7806.png">

Cloud formationのARNを入力して、適当にワイルドカードを入れます。

<img width="725" alt="IAM_ARN設定.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/67848382-91a8-a63a-42a6-a0f1279efc15.png">

Add Statementボタンを押す。
Next Stepボタンを押す。

プレビューを確認し、Create Policyを押します。

<img width="723" alt="IAM‗Preview.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/40226e09-e252-10aa-6368-577420032637.png">

作ったポリシーが、Atach Policyで選べるようになってます。
このポリシーをユーザーにAtachすれば権限の付与完了です。
<img width="503" alt="IAM_Atach.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/138682/ea32168f-20ae-c73e-0abb-4c87fd64511a.png">


# 感想

Policyをjsonでぱっと作れるようになっておくと早そうですね。
コンソールからやるのも楽なので良いですね。
入れ子になっているListにStreamAPIを使ってみた

個人的なメモ

java8の勉強をちょっとしてみた。

Listが入れ子になっている場合、
StreamAPIをどうやって使えばいいか知りたかったのでコードを書いてみました。
まずは表示されたので、この使い方であっているのかな。

```
public class AppMain {
    public static void main(String[] args) {
        AppMain main = new AppMain();
        main.execute();
    }

    private void execute() {
        List<List<String>> list = getList();
        printout(list);
    }

    private void printout(List<List<String>> list) {
        list.stream().forEach(
                childList -> childList.stream().forEach(System.out::println));
    }

    private List<List<String>> getList() {
        List<List<String>> list = new ArrayList<>();
        list.add(Arrays.asList("aa11", "aa22"));
        list.add(Arrays.asList("bb11", "bb22"));
        list.add(Arrays.asList("cc11", "cc22"));
        return list;
    }
}
```
Grape で共通のパラメータを利用してDryにする

認証情報や大きなオブジェクトのパラメータなど、複数のインターフェースで同じパラメータを定義したかった。
色々調べても解放が見つからなかったので、下記で頑張って解決


```ruby:api/v1/users.rb
 resource users do
  params do
    eval APIParams::Group.new.auth_params
  end
  get '/new' do

  end

  params do
    eval APIParams::Group.new.auth_params
  end
  get '/edit' do

  end
end

```

``` ruby:lib/api_params.rb
module APIParams
  class User
    def auth_params
      <<-EOS
      optional :access_token, type: String
      optional :secret, type: String
      EOS
    end
  end
end
```
特定のパッケージに含まれるファイルをオープンしているプロセスを調べるワンライナー（rpm編）

例として、openssl-libsのパッケージに含まれるファイルをオープンしているプロセスを調べる

- `lsof`の結果を絞り込むだけの場合

```
$ sudo lsof +c 15 |grep -f <(rpm -ql openssl-libs)

```

- プロセス名だけを表示する場合

```
$ sudo lsof +c 15 |grep -f <(rpm -ql openssl-libs) |awk '{count[$1]++} END{for(key in count){print key}}'
```

- プロセス名とPIDだけを表示する場合

```
$ sudo lsof +c 15 |grep -f <(rpm -ql openssl-libs) |awk '{count[$1" "$2]++} END{for(key in count){print key}}'
```
Pleskで管理者パスワードを忘れてしまった場合

Pleskの管理者パスワードが分からなくなってアクセスできなくなった。
さあ困ったなんてこと良くありますよね。（良くあっては困りますね。。。）

Plesk でパスワードを表示するために使っていた伝統的な方法(Plesk8までかな？)

> `# cat /etc/psa/.psa.shadow 
> $AES-128-CBC$9PyN0G1YCE+NN4jYKG524R4==$tLYKG524R4WSGndXUHeWbg==`

平和な時代はここに生のパスワードが入っていました。当然今はAES128で暗号化されています。

そして、しばらく前のバージョンまでは、 `admin --show-passowrd ` で閲覧することが出来ていました。（Plesk11か12まで）

> `# /usr/local/psa/bin/admin --show-password
> Due to security reasons the option '-show-password' is no longer supported. Use '--get-login-link' to generate a one-time login link.`

最新版のPlesk Onyxではそれも出来なくなっていました。ではどうするかというと、

> `# /usr/local/psa/bin/admin --get-login-link
> https://localhost.localdomain:8443/login?secret=u5G4xxxxxxxxOgz%2Bxxxxxxxx%2FFgzcxdegnjjoiwjmwldfhoisKk%3D`

こういうリンクが表示されるので、これで一度だけログイン出来る。

ログインしたら変更して改めて忘れないようにしてください。
Reactでhigher order componentsを試してみた

## Higher Order Componentsとは

自分の雑な理解では `react componentをラップして様々な拡張性を与えられるテクニックのこと`

詳しくはこちらを読むとわかると思います。

ReactのHigher Order Components詳解 : 実装の2つのパターンと、親Componentとの比較
http://postd.cc/react-higher-order-components-in-depth/

## propsをrenderした後から更新したくなった

離れた場所にrenderしたcomponent同士をどうにか連携できないものか（この設計の是非は脇に置いといてください…）という課題がありまして、
例えば2カラムのレイアウトのページで、メインカラムとサイドバーにそれぞれcomponentをrenderしていたとします。
サイドバーの何かをクリックすると、メインカラムの内容が変化するようなものです。

## Higher Order Componentsを試してみる

単純なHigher Order Components(以下HOC)はこれだけです。

```js
// nameプロパティが必須なコンポーネント
class Test extends React.Component {
  static get propTypes() {
    return {
      name: React.PropTypes.string.isRequired
    };
  }

  render() {
    return (
      <div>{this.props.name}</div>
    );
  }
}

// これが Higher Order Components を行う関数
function hoc(WrappedComponent) {
  // ローカルコンポーネントを定義して返す
  return class HOC extends React.Component {
    render() {
      // ローカルコンポーネントで対象のコンポーネントのReact elementを返す
      return <WrappedComponent {...this.props} />;
    }
  }
}

const enhancedTest = ReactDOM.render(
  React.createElement(hoc(Test), { name: "kozo" }),
  document.getElementById("app")
);
```

このように単に関数内のローカルコンポーネントのrenderで受け取ったコンポーネントのReact elementを返すだけです。
このままだと特に何もできないのですが、自分は以下のようにすることでrender後にコンポーネントの外から、
つまりプレーンなjavascriptの世界からコンポーネントを操作できるようになりました。

```js
function hoc(WrappedComponent) {
  return class HOC extends React.Component {
    constructor(props) {
      super(props);
      // 敢えてpropsとして渡された値をstateにセットする
      this.state = props;
    }

    render() {
      // stateの内容をpropsとして渡す
      return <WrappedComponent {...this.state} />;
    }
  }
}

const enhancedTest = ReactDOM.render(
  React.createElement(hoc(Test), { name: "kozo" }),
  document.getElementById("app")
);

// 任意のタイミングでTestコンポーネントのpropsを書き換え可能に
enhancedTest.setState({ name: "yamagata" });
```

これで別のコンポーネントの `onClick` などをトリガーにコンポーネントの外側から自由に操作が可能になりました。
dropbox > Dropbox Basic（無料）ユーザー：2016 年 10 月 3 日より、ウェブ ブラウザで HTML コンテンツをレンダリングする共有リンクの使用が無効になります。 / Dropbox Pro と Dropbox Business ユーザー：2017 年 9 月 1 日より、HTML コンテンツのレンダリングが無効になります。

http://qiita.com/hiyuzawa/items/dbe82feecc57ec84a880
のアニメーションが見れなくなっていたので調べてみた。


https://www.dropbox.com/ja/help/16
> Dropbox Basic（無料）ユーザー：2016 年 10 月 3 日より、ウェブ ブラウザで HTML コンテンツをレンダリングする共有リンクの使用が無効になります。Dropbox から直接 HTML コンテンツを表示する方法でウェブサイトを制作している場合、この日付以降はブラウザでコンテンツのレンダリングができなくなります。HTML コンテンツ自体は引き続き Dropbox に残り、共有することもできます。[詳しくはこちら](https://www.dropbox.com/help/167)


有料ユーザは
> Dropbox Pro と Dropbox Business ユーザー：2017 年 9 月 1 日より、HTML コンテンツのレンダリングが無効になります。
SimpleDB の Select での SingleQuote や BackQuote のはまり所

## OK

```sql
aws sdb select --select-expression 'SELECT * FROM `HOGEDOMAIN`' --profile AWS_PROFILE
```

## NG

```sql
aws sdb select --select-expression 'SELECT * FROM HOGEDOMAIN' --profile AWS_PROFILE
```

```sql
aws sdb select --select-expression "SELECT * FROM HOGEDOMAIN" --profile AWS_PROFILE
```

```sql
aws sdb select --select-expression "SELECT * FROM `HOGEDOMAIN`" --profile AWS_PROFILE
```
macOS Sierraにしてからcaps lock→controlのリマップが効かない場合の対処法

macOS Sierraにアップグレードしてからcaps lock→controlのリマップやKarabinerが動作しないため, その対処法をメモ.

# 問題点

### caps lock→controlにリマップが効かない

設定→キーボードから設定をし直し, 再起動しても効果なし.
![sSS 2016-10-04 18.16.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/135313/1227ed78-f8c6-6ee9-dfcd-626297dbdc13.jpeg)

### Karabinerも動かない
またcaps lock以外のKarabinerを使ったリマップ設定も2016/10/04時点ではkarabinerがSierraに対応していないため動きません. そのため, USキーボードのMacでは定番の設定である**左Command→英数, 右Command→かな**が使えない
# ![sSS 2016-10-04 18.19.42.jpg](https://qiita-image-store.s3.amazonaws.com/0/135313/394c6a27-1af0-8559-bf51-bd897fb33e8f.jpeg)

# 対処法
Sierra上でも動作する[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)を利用してリマップの設定を行います.

ただし, Karabiner-Elementsは通常のKarabinerのようにGUIで設定せず, 設定ファイルを自ら編集する必要があります.

以下のサイトでKarabiner-Elementsの導入方法や実際の設定ファイルが記載されています.
<http://qiita.com/tumujin/items/5c0180b5c5d70c125be0>

また公式のリポジトリで設定ファイルのサンプルも公開されています.
<https://github.com/tekezo/Karabiner-Elements/tree/master/examples>
distutilsのlogが出ない問題


- distutilsは`distutils.log`というモジュールでログの出力レベルを変えている。distutilsはsetup.pyから利用されるので、コマンドライン引数などはsetuptoolsに含まれるため、ユーザーが制御できない。しかし、このログレベルを変えるのは簡単ではないようだ
- pipは`setup.py egg_info`をオプション引数なしで実行しており、この中でビルドが走り、問題があるとここで止まる。引数無しで実行しているため、ログレベルを変えられない。egg_infoっていかにもビルドとは違うことをしそうなものだが、ここで止まってしまうのはsetup.pyの書き方がまずいのかもしれない
	- 色々調べたら、cythonインストール問題で、build_extのfinalize_optionを無理やりいじったせいで、egg_infoでビルドが走ってしまってるのが原因だった。cython問題根深い・・・
- setup.py install -vvv ではinstallコマンド用の引数を渡すことはできる。しかし、実際には中でsetuptoolsがeasy_installコマンドを実行しており、ここに-vvvの引数（verbose=3）は渡されない。その為、やはりログレベルを変えられない。ちなみに、この引数はsetuptools内でパースしていて、`{'verbose': 3}`に変換する。ただし、3は`int`
- setup.cfgファイルにglobalという項目をつけると、setup.pyがここを読んで引数を足してくれる。しかし、 `verbose = 3` を指定すると `3` が内部では文字列として扱われ、結局if文に引っかからずログレベルを変えられない
- setup.py -vvv installすると実はログレベルを変えられる。コマンド名の前に指定したオプションはglobal-optionと呼ばれ、setuptoolsの全てのコマンドに追加される。そのため、easy_installに対してもこの引数は渡されるので、ログレベルを変えられる。ちなみに、pipのglobal-optionはこれに対応するようだが、上述したとおりegg_infoにはこの引数は渡されない
SourceKitのクラッシュでコード入力を邪魔されないようにする


#問題点
Swiftのソースコードを解析してシンタックスハイライトや入力補完をしてくれるSourceKitServiceというのがいます。
このSourceKitが不安定でSwift2.3では多少マシになっていたのですがSwift3でまた頻繁にクラッシュするようになりました。

Xcode7まで(6までかも)はSourceKitがクラッシュしても

![fdaef68f-f6d8-e7b7-c54f-a8519ec3b8e4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/24979/75f30a58-5ba4-f129-eab4-b1c7dd737fe6.jpeg)

のように、Xcode上のHUDにエラーが表示されていました。

しかし、Xcode8からは「SourceKitService が予期しない理由で終了しました。」というアラートが表示され、入力中でも強制的にフォーカスがアラートに向いてしまいカーソルをまた合わせるのにトラックパッドを使ったり無駄に入力したりする必要が出てきてしまいました。

#解決策

##クラッシュレポートをダイアログ表示しないようにする

`defaults write com.apple.CrashReporter DialogType none`

を実行することでクラッシュレポートをダイアログで表示しないようにできます。

##クラッシュレポートを通知で表示する

もっとスマートな方法はこちらです。

`defaults write com.apple.CrashReporter UseUNC 1`

これを実行することで、クラッシュレポートを通知センターで表示することができます。

![スクリーンショット 2016-10-04 15.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/24979/897742b8-e235-63f9-4afe-3ccce581169e.png)

クラッシュレポートを送信したい時などは、コチラのほうがスマートですね。
git configのuser.emailやuser.nameを設定せずにsshのログインユーザ名を使ってcommitする方法

# 概要
社内の共有サーバにsshログインして、gitの共有レポジトリの修正をささっとしたい場面がちょくちょくありまして、
その都度以下のような手順でコミットしておりました。

```
# まずはnameとemailを設定する
git config --local user.name "hogefugapiyo"
git config --local user.email "hoge@hoge.fuga.piyo"
# コミットする
git commit -m "message"
# 設定を外す
git config --unset user.name
git config --unset user.email
```

しかしこれが面倒になってきたので
direnvをつかってsshのログインユーザ名からcommitユーザ名とメールアドレスを動的に設定する方法を考えました。

# direnvの設定方法
ここを参考に設定しました。
http://qiita.com/tkmiya34/items/875742eb56ebe54d8828

# .envrcの作成
git configでcommitユーザを指定せずとも、以下4つの環境変数からもcommitユーザが指定できるようでした。
https://git-scm.com/book/es/v2/Git-Internals-Environment-Variables#Committing

`GIT_COMMITTER_NAME`
`GIT_COMMITTER_EMAIL`
`GIT_AUTHOR_NAME`
`GIT_AUTHOR_EMAIL`

`who am i`コマンドを使うことでログインユーザ名を取得できるので、
取得したユーザ名を加工して上記変数を.envrcで設定してあげることでコミットユーザを動的に変更できます。

※`whoami`コマンドの場合はsuとかしてしまうとユーザ名が変わってしまうので`who am i`を使うと良いと思います。

# 最後に
direnv使わずとも.bash_profileや.bashrc等のログインシェルで設定できる環境の方もいると思います。
また、他に良い方法があれば教えてください。
Type "xxx" does not confirm to protocol 'NSObjectProtocol'エラーが出る場合の対処法


## 実行環境

| 環境 | バージョン |
| --- | -------- |
| Mac | 10.11.6 |
| Xcode | 8.0 |
| Swift | 3.0 |

## 発生した現象

下記のようにクラスにデリゲートを設定した時に「Type "xxx" does not confirm to protocol 'NSObjectProtocol'」というエラーが発生。

```
class xxx: testDelegate {
}
```

### 対応方法

NSObjectを追加する

```
class xxx: NSObject, testDelegate {
}
```

### 参考サイト

*[stack overflow: Swift : Type CCC doesnt conform to protocol 'NSObjectProtocol'](http://stackoverflow.com/questions/34638065/swift-type-ccc-doesnt-conform-to-protocol-nsobjectprotocol)
個人的な探索的テスト観

#探索的テストって何？
標準化されつつあるという話も聞きますが、「テストケース自体は書かないが、テストケースに記述されていないことを、テストケースを書いたときとほぼ同じことをするテスト」と理解してます。
探索的テストはテストそのもので、たまたま形式知にしやすいものが、境界値分析などのテスト技法になっているだけで、効果があるかを別にすれば、テスト中に何か考えて行動に移した時点でそれは探索的テストになっていると思ってますし、今は探索的テストと呼ばれているものの中から新しいテスト技法が出てくることもあると思います。

#探索的テストは何をするの？
以下のような活動を同時行って繰替えします。

* テストする目的を理解すること
ここでは仕様を読んだりヒアリングをしたりすることだと思ってます。

* テストする機能を理解すること
仕様を理解することに加えて、実際にソフトウェアを動かして、仕様に書かれていない情報を補完することだと思ってます。

* リスク分析をすること
目的、機能を理解した上で、何に焦点を当てるのかを定めること
焦点を当てるための方法は状況にもよると思いますが、危なさそうものや、弱そうなところに焦点をあてて、どんなテストで取り除くかの方針だけチームと合意が取れればいいので、大雑把にはリスク分析と考えていいと思います。

#探索的テストをする理由は？
何か考えてテストしたら勝手に探索的テストになると思っているので、個人的には特に無い気がしてます。
世間的には、テストケースを書く時間や、不要な結果を記録する時間が省かれるので、時間が短縮され、実装の単純ミスや、ユーザビリティの問題が検出しやすくなるというのが理由になると思います。

#探索的テストの学習の仕方は？
何か考えて行動すれば探索的テストにはなっていると思うので、探索的テストにフォーカスをあてたトレーニング方法は存在しないと思います。
単にテストする作業を頭で組み立てて、時間対効果の低い作業を省略して実行するに過ぎないので、テストの本を読んで業務で実践していけばいいと思います。
「英文の読み方」が単語を覚えたり文法を覚えたりする地道な作業と分離できないように、勉強していたらどこかで「あ、できてるかも」と思えるようになると思います。

#探索的テストのいくつかの型
探索的テストには、決まった形はありませんが、よくある形は存在します。

ものすごく読みにくいですが、以下のドキュメントに分類があります。
https://msdn.microsoft.com/ja-jp/library/jj620911(v=vs.120).aspx
ちなみに、この文書は機械翻訳だから日本語として分かりにくいのではなく、英文読んでもツアーの喩えでけむに巻かれた感があって、結局分からなくなるだけなので、まあ読まなくてもいい気もしますが、読んでみると発見があるかもしれません。
個人的には「The FedEx Tour」というのが面白かったです。
これは、意訳すれば「データの流通の観点」となると思います。
ソフトウェアの中では、現実の宅配便のようにデータが使い回されているので、そのデータという小包の梱包に始まるライフサイクルを無事な配達、あるいは削除、死蔵、果ては誤配達することに着目する観点で、学習するテストである探索的テストらしい観点ではないかと思います。
ASP.NETのChartコントロールでクリックしたChartデータの値を取得する方法

#やること
* ツールボックス→データ→Chartを貼り付ける
* Chart→プロパティ→グラフ→Series→コレクションを起動
* プロパティ→PostBackValueに値を設定する「#VALX」など
  + [PostBackValueに入力する値は、ここを参照](https://msdn.microsoft.com/en-us/library/dd456687.aspx)
* Chart→プロパティ→イベント→Clickを選択
* e.PostBackValueを受け取る

これだけ。

[Chart.Clickイベント](https://msdn.microsoft.com/en-us/library/system.web.ui.datavisualization.charting.chart.click(v=vs.110).aspx)
`Occurs when the active image map area defined by P:System.Web.UI.DataVisualization.Charting.DataPoint.PostBackValue on the Chart control is clicked.`
C > link > 文字列を定義してインデックスアクセス > *dstPtr++ = "0123456789ABCDEF"[nibble];

@SaitoAtsushi さんにいただいた[コメント](http://qiita.com/7of9/items/92f5a0850370d3f3e558#comment-4cd1207dc70f48f1020d)。

```
*dstPtr++ = "0123456789ABCDEF"[nibble];
```

将来の検索用にリンク記事とします。

0からFの並び以外にも何かに流用できないだろうか。

### 関連コード

[stackoverflow](http://stackoverflow.com/questions/8889733/converting-number-into-different-notations)で上記の使い方の失敗例が掲示されていました。

http://ideone.com/LoFO3r

```c
#include<stdio.h>

char *convert(unsigned int num, int base)
{
    static char buff[33];
    char *ptr;

    ptr=&buff[sizeof(buff)-1];
    *ptr='\0';
    do
    {
      *--ptr="0123456789abcdef"[num%base];
      num/=base;
    } while(num!=0);
    return(ptr);
}

int main(){

    puts(convert(65,8));
    puts(convert(65,10));
    puts(convert(65,16));
    
	printf("%s = %s = %sn", convert(65,8), convert(65,10), convert(65,16));    

    return 0;
}
```

```txt:結果
101
65
41
101 = 01 = 01n
```

~~このあたりは注意が必要そうです。~~

上記の問題は`"0123456789ABCDEF"[nibble];`という書き方とは別に起因する問題のような気がしてきました。

http://ideone.com/0yHNQ0
[Ruby]MySQL上のデータをCSV出力

```ruby:dump.rb
#!/usr/bin/env ruby

require 'mysql2'
require 'csv'

table = "table_name" 
columns = "*" 
host = "localhost" 
username = "user" 
password = "password" 
database = "database" 

client = Mysql2::Client.new(
  host: host,
  username: username,
  password: password,
  database: database,
  stream: true,
  cache_rows: false,
)

results = client.query("select #{columns} from #{table}")

CSV.open("#{table}.csv", "w") do |csv|
  csv << results.fields
  results.each do |row|
    csv << row.values
  end
end
```

* stream: true, cache_rows: false あたりが無いとバッファリングしてメモリがあふれる
* ec2上でやったら時間がUTCになってた
c > 構造体の変更対応 > 2つの選択肢

計算処理ルーチンを実装している中で、「構造体をまったく別物にしたい」と言われたときの対応。

状況

- データや設定を構造体で定義
- 複数のソースとヘッダでその構造体を使用
  - ファイルスコープstatic関数: 33個
  - public関数: 9個
- テスト駆動開発で実装してきたのでテストできる環境がある

選択肢

1. 今あるソースを書換えていく
  - 欠点: 構造体変更時のコードの破損に気づかない
  - 欠点: 破損したときに「正しい値は何か」を調べるのが難しい
2. 新しいソースを作って、そちらで実装していく
  - 利点: 元環境と比べて、おかしいところを突き止められる
  
5時間で変更できた。
去年の自分は方法1を採用していて、同じような作業の場合数日を要していた。

- テストは大事
- どう進めるかの検討も大事

もっといい方法はあるだろうか？

- gitでbranchを切り替えながら比較するというのはどうか
  - branch切替え時のコンテキストスイッチに自分が対応できるかどうか
- 旧コードの実行ファイルを作っておくのはどうか
  - 比較する時に詳細を追うのは難しそう。
macOSでnodebrewインストールしたらパスが通らなくなった話と解決方法

## 起こった問題
MacOSをEl CapitanからSierraにバージョンアップしたところ、
nodebrewのパスが通らなくなった。
ターミナルを再起動すると、commond not foundとなってしまった。
その際の解決方法。

## nodebrewインストール
```
# インストール
curl -L git.io/nodebrew | perl - setup
```

## nodebrewのパスを通す
```bash:.bash_profile
# パスを通す。.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

## .bash_profile再読込
```
source ~/.bash_profile
```

## 確認
```
which nodebrew => /Users/user_name/.nodebrew/current/bin/nodebrew
```
emacsでバックアップファイルを作らない。


# 要件
emacsでファイルを作成→編集→保存した際に*.~みたいなバックアップファイルを生成しないようにする

>参考
[emacsでバックアップファイルを作らないようにする方法](http://rontan.sakura.ne.jp/2009/02/tips_emacs_bkfile/)

# 手順

前提
emacsがインストールされている
ホームディレクトリ(~/以下)に.emacsファイルがある。
→なければ、新しく.emacs ファイルを作成する。

以下を.emacs ファイルに追記

```.emacs
;;; *.~ とかのバックアップファイルを作らない
(setq make-backup-files nil)
;;; .#* とかのバックアップファイルを作らない
(setq auto-save-default nil)
```

これで作成されなくなる。
はず。
Pocketされた数を取得（node.js）


PocketボタンのHTMLを取得してパースするしかないらしい。面倒だな。。

```js
const jsdom = require('jsdom');

const TARGET = 'http://qiita.com/KeitaMoromizato/items/fe37ed75816554a6be54';

jsdom.env(
  `https://widgets.getpocket.com/v1/button?label=pocket&count=vertical&align=left&v=1&url=${TARGET}`,
  [], (error, window) => {
    if (error) {
      console.error(error);
      process.exit(-1);
    }

    const countEl = window.document.querySelector('#cnt');
    console.log(+countEl.innerHTML);
  }
);
```
事故メモ（自己メモ）

低レベルなバグだったので反省込めてメモる。そして二度と思い出さないことにする。
本バレが嫌なので言語をC#に変換しとく。

intの配列(つまりint[])の間に要素を一つ挿入するメソッドを書いてた。

            var v = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            v = InsertArray(v, 2);//v = {1,2,0,3,4,5,6,7,8}

InsertArray()をさっくり作った

        static int[] InsertArray(int[] p_array,int p_index)        {
            int[] result;
            result = new int[p_array.Length + 1];
            for(int i=0; i < p_array.Length; i++)            {
                if (i < p_index)
                    result[i] = p_array[i];
                if (i == p_index)
                    result[i] = 0;
                if (i > p_index)
                    result[i + 1] = p_array[i];
            }
            return result;
        }

境目でバグ起こすんじゃね？と引っかかりながらも当時は必死でとりあえず実戦投入してシステムは動いたのでOKとしてた。
ソースコードレビュー？何それおいしいの？

で、後日追加の改修が入ったときに余裕があったのでInsertArray()をきちんとテストしてみると、やっぱし挿入部分でバグ起こしてやがった。

            var v = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            v = InsertArray(v, 2);//v = {1,2,0,0,4,5,6,7,8}

たまたまシステムでは挿入部分付近は参照していなかったのでセーフだったがメソッドが名前通りには機能していないのは気持ち悪い。
修正したいけどシステムの動作は問題ないわけで修正するための理由が見つからぬ。
どうせ数か月のうちには消滅することが確定しているシステムなのでこのメソッドのバグはこのまま闇に葬ろう。
GitHub上の最新ベータ版 concrete5 を Cloud9 で作ってテストできる環境を作る方法


concrete5 の開発の最新版を使いたい時、GitHub で確実に再現するバグの Issue 登録をする時の確認用に、GitHub の concrete5 レポジトリの最新のものをテストする必要があります。

関連：concrete5 の GitHub にバグ報告・機能要望をする方法
http://qiita.com/katzueno/items/59adc4aca520dc13ae14#_reference-c39569590ac1a947eca8

今回は Cloud9 を使って簡単に concrete5 の GitHub 上の最新環境を構築する方法をお伝えします。

この方法はあくまでもテストとして行ってください。ここでインストールした concrete5 は本番サイトなどで必ず利用しないようにしてください。

## Cloud9 に concrete5 GitHub レポジトリの concrete5 サイトを作る 

- Create Workspace
- 適当に名前をつける
- concrete5 の GitHub の URL `https://github.com/concrete5/concrete5` を入れる
- Templates は Apache, PHP, MySQL の物を選ぶ
- 作成開始
- 画面が表示される
- Terminal Window で`git checkout develop` で develop ブランチをチェックアウト (concrete5 の Git では、master ブランチは使っていないため、空白状態でクローンされる)
- Terminal で `composer install` して、外部ライブラリをインストール
- https://github.com/katzueno/concrete5-install-shell-scripts/blob/master/config/cloud9.concrete.php のファイルを /application/config/concrete.php にコピー、もしくは、同名の殻のテキストファイルを作成して、テキストを貼り付け。
- サーバーを起動「Run Project」
- URL が `[スペース名]-[ユーザー名]-c9users.io/` へアクセスして、インストール開始
- MySQL の情報
    - サーバー 127.0.0.1
    - ユーザー名: 自分の cloud9 のユーザー名
    - パスワード: 空欄
    - DB 名: c9
- 他は適当にパラメーターを入力してインストール実行 (*後述「Clone を活用しよう」を参照)

これで、開発中の最新の concrete5 環境を入れることが出来ます。

## Clone を活用しよう

インストール直前ぐらいでストップしておいて、Workspace をバグの Issue ごとに Clone すると良いかもです。

## 数日経ったら、git pull & composer install を忘れずに

数日経てば、新しいコミットがマージされているかもしれません。

ターミナルで、

```
git pull
composer install
```

を忘れずに入力して、最新の状態にとどめておきましょう。

## concrete5 が壊れたら、クリーンインストール

開発環境では、インストールされている concrete5 サイトが時々コードの改変のせいで壊れてしまう場合があります。その場合は、きちんとアンインストールを行いましょう。

```
cd /home/ubuntu/workspace
concrete/bin/concrete5 c5:reset
```

はい(Y) を押すと、/applicaiton/files/ やデータベースのテーブルが一斉に削除されます。

そうして concrete5 の再インストール作業を行ってください。もしくは下記コマンドラインを一部修正すると Terminal からインストールできます。

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。


以上
Ansibleのtagsについて実験してみた（dependencyとか）

個人的備忘です。

# 環境情報
## バージョン

```
localhost$ ansible-playbook --version
ansible-playbook 2.0.1.0
  config file = /Users/xxx/Desktop/rapid/localhost/ansible.cfg
  configured module search path = Default w/o overrides
```

## 構成

```
-test.yml
-roles
 - aaa
  - tasks
   - main.yml
   - aaa_sub.yml
   
 - bbb
  - meta
   - main.yml
```

test.yml

```
- hosts: localhost
  gather_facts: False
  roles:
     - { role: bbb, tag: bbb }
```

roles/aaa/tasks/main.yml

```
- debug: msg="aaa1"
  tags: aaa1

- debug: msg="aaa2"
  tags: aaa2

- set_fact:
     test: true
  tags: aaa3

- include: aaa_sub.yml
  when: test == True
  tags: aaa3
```

roles/aaa/tasks/aaa_sub.yml
```
- debug: msg="aaa_sub"
```

roles/bbb/meta/main.yml

```
dependencies:
  - { role: aaa, tags: aaa }
```


## 実験してみた

(1) ansible-playbook test.yml --tags=bbb
　→　何も表示されない
　
(2) ansible-playbook test.yml --tags=aaa
　→  role aaa が実行される（aaa1とaaa2とaaa_subが表示される）

(3) ansible-playbook test.yml --tags=aaa,bbb
　→  role aaa が実行される(2)と同じ

(4) ansible-playbook test.yml --tags=aaa1
　→  role aaa が実行されaaa1が表示される

(5) ansible-playbook test.yml --tags=aaa2
　→  role aaa が実行されaaa2が表示される

(6) ansible-playbook test.yml
　→  role aaa が実行される(2)と同じ

(7) ansible-playbook test.yml --tags=aaa3
　→  role aaa が実行されaaa_subが表示される
bit列を奇数列と偶数列にO(log n)で分離する

別に難しくはないし既にありそうだけど、見つからないので一応記事に残しておく。

# 操作の概要
![g14310.png](https://qiita-image-store.s3.amazonaws.com/0/17891/063c46fa-dce6-fbf0-4184-6606ce11d44a.png)


こんな感じにbit列の奇数番目の列と偶数番目の列を左右に分離する操作を考える。
これは自明にO(n)で処理ができる。各bitを再配置するのに3回程bit演算が必要になるので、 全体で3 x 32 = 96回程度bit演算をすることになる。
Polar符号の文脈ではこの操作のことをReverse Shuffleと呼ぶらしい（よく知らない）。

# 実装
```cpp
uint32_t even_odd_separate32(uint32_t x) {
    uint32_t odd  = x & 0b10101010101010101010101010101010;
    uint32_t even = x & 0b01010101010101010101010101010101;
    odd = (odd | (odd << 1)) & 0b11001100110011001100110011001100;
    odd = (odd | (odd << 2)) & 0b11110000111100001111000011110000;
    odd = (odd | (odd << 4)) & 0b11111111000000001111111100000000;
    odd = (odd | (odd << 8)) & 0b11111111111111110000000000000000;
    even = (even | (even >> 1)) & 0b00110011001100110011001100110011;
    even = (even | (even >> 2)) & 0b00001111000011110000111100001111;
    even = (even | (even >> 4)) & 0b00000000111111110000000011111111;
    even = (even | (even >> 8)) & 0b00000000000000001111111111111111;
    return odd | even;
}
```
仕組みは、bit列を偶奇に分けた後、少しずつスライドする幅を増やしながら隙間を詰めていっているだけなのですぐわかると思う。2進数リテラルを利用しているので、C++14以降でしかコンパイルできないけど、この方が理解しやすいと思うのでこのまま残しておく。

この実装だと、2 + 3 x 8 + 1 = 27回のbit演算で済んでいる。
AWS Lambda (Node.js-v4.3.2)の実行環境に近いEC2環境の構築


[Lambda 実行環境と利用できるライブラリ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)を参考に作業します。

## EC2インスタンスの起動

東京リージョンでamzn-ami-hvm-2015.09.1.x86_64-gp2(ami-383c1956)を起動
それ以外のリージョンの場合にも適宜対応したAMIを指定して起動します

## パッケージのアップデート
Linux カーネルバージョン4.1.27-25.49.amzn1.x86_64なので、yum.confを書き換えてインストールします

```/etc/yum.conf
- releasever=latest
+ releasever=2015.09
```

```terminal
$ sudo yum update -y
```

そのままだとインストールするパッケージの依存関係が解消できないので元に戻しておきます

```/etc/yum.conf
+ releasever=latest
- releasever=2015.09
```

## node-v4.3.2のインストール

[Using Packages and Native nodejs Modules in AWS Lambda](https://aws.amazon.com/jp/blogs/compute/nodejs-packages-in-lambda/)を参考に作業します

```bash:terminal
$ sudo yum install gcc44 gcc-c++ libgcc44 cmake –y
$ wget http://nodejs.org/dist/v4.3.2/node-v4.3.2.tar.gz
$ tar zxfv node-v4.3.2.tar.gz
$ cd node-v4.3.2
$ ./configure
$ make
$ sudo make install
$ which node
/usr/local/bin/node
```

※ 実際のAWS Lambdaでのnodejsのインストール先は「/usr/local/lib64/node-v4.3.x/bin/node」です

## デフォルトで入っているであろうyum package/npmのインストール

```bash:terminal
$ sudo yum install ImageMagick
$ sudo /usr/local/bin/npm install aws-sdk@2.4.9 -g
$ sudo /usr/local/bin/npm install imagemagick -g
```

ここまででAWS Lambdaのデフォルト環境に近い環境の構築は完了です。

# 参考情報

## AWS Lambdaの環境変数

```javascript:env
{
  PATH: '/usr/local/lib64/node-v4.3.x/bin:/usr/local/bin:/usr/bin/:/bin',
  LAMBDA_TASK_ROOT: '/var/task',
  LAMBDA_RUNTIME_DIR: '/var/runtime',
  AWS_REGION: 'ap-northeast-1',
  AWS_DEFAULT_REGION: 'ap-northeast-1',
  AWS_LAMBDA_LOG_GROUP_NAME: '/aws/lambda/oracletest',
  AWS_LAMBDA_LOG_STREAM_NAME: '2016/10/04/[$LATEST]bdbfb2ae7782458bbb7c411c1bd33407',
  AWS_LAMBDA_FUNCTION_NAME: 'oracletest',
  AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '128',
  AWS_LAMBDA_FUNCTION_VERSION: '$LATEST',
  LANG: 'en_US.UTF-8',
  LD_LIBRARY_PATH: '/usr/local/lib64/node-v4.3.x/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib',
  NODE_PATH: '/var/runtime:/var/task:/var/runtime/node_modules',
  AWS_ACCESS_KEY_ID: '******',
  AWS_SECRET_ACCESS_KEY: '******',
  AWS_SESSION_TOKEN: '************' }
```

## AWS Lambdaの実行時のカレントディレクトリ
/var/task
DRBD9環境をVagrant+Ansibleで540秒でインストールしてみた。

DRBD9環境をVagrant+Ansibleで540秒で構築してみました。
VirtualBoxとVagrantがインストールされたホストマシンを用意してください。

今回実行したマシンの環境は以下です

## ホストマシン環境
||バージョン|
|:--|:--|
|OS|MacOS Sierra|
|VirtualBox|5.1.6|
|Vagrant|1.8.6|

## 構築するDRBD9環境
以下になります。
Ubuntu16.04サーバ3台をVagrantで構築し、その後AnsibleでDRBD9のパッケージをインストールします。
drbdctlは３台のサーバをコントロールするソフトウェアです。

![DRBD9-server2.png](https://qiita-image-store.s3.amazonaws.com/0/101744/f861034b-35ed-5b90-5873-6337f6295e2f.png)


## Vagrantでサーバ3台構築
ホストマシンにログインし任意の場所に移動します。
例では/vagrantを作成して移動します。

```shell-session
$ cd ~/
$ mkdir vagrant
$ cd vagrant
```

次にVagrantfileと実行用のスクリプトを取得します。

```shell-session
$ git clone https://github.com/ksawada1979/DRBD9-Vagrant.git
$ cp ./DRBD9-Vagrant/* ./
```

次にvagrant.shを実行します。

```shell-session
$ ./vagrant.sh 
```

自動的にサーバ3台作成されます。
途中で各サーバにログインするためのパスワード入力を求められますので入力してください。

## Ansible実行準備
以降の手順は全て一号機で実施します。

まず一号機であるホスト名DRBD9-1にログインします。

```shell-session
$ vagrant ssh DRBD9-1 
```

ログインしたらAnsible実行のためにパッケージを追加します。

```shell-session
$ sudo apt-get install -y ansible git
```

次に鍵作成と鍵交換をします。
一号機を含め二号機、三号機と鍵交換します。

```shell-session
$ ssh-keygen -t rsa
$ ssh-copy-id -i .ssh/id_rsa.pub ubuntu@192.168.33.11
$ ssh-copy-id -i .ssh/id_rsa.pub ubuntu@192.168.33.12
$ ssh-copy-id -i .ssh/id_rsa.pub ubuntu@192.168.33.13
```

次にAnsibleのプレイブックを取得します。

```shell-session
$ git clone https://github.com/ksawada1979/DRBD9-Ubuntu16.04-Ansible.git
$ cd DRBD9-Ubuntu16.04-Ansible
```

## Ansible実行
以降の手順は全て一号機で実施します。
Ansibleを実行して3台のサーバにDRBD9とDRBD manageをインストールします。ついでに時刻同期用にntpもインストールします。

```shell-session
$ ansible-playbook -i ansible_hosts drbd9.yml
```

以上でインストールが完了です。

## DRBD9環境構築
次に構築になりますが、長くなりそうなので以下に分割しました。

簡単にできるDRBD9環境構築
http://qiita.com/ksawada1979/items/1fa59f1945e4853dde11

## 環境破棄
vagrantで作成した環境を破棄する場合は以下のコマンドで破棄できます。

```shell-session
$ vagrant destroy
```

再度作成する場合は本ページの手順どおりで540秒でインストール可能です。
色々な動作を確認して壊してを繰り返すにはちょうど、

## 参考
以下サイトを参考にさせていただきました。

VagrantのVMに複数のディスクを追加する方法
http://qiita.com/kjtanaka/items/8f3e92e029e46f826754
[Git] 直前のcommitのuser.nameとuser.emailを修正する

Gitメモ。コミットしてからuser.nameとuser.emailが間違っていたことに気がついた場合の修正方法。
以下を使用する。

```console:直前のコミットのuser.nameとuser.emailを修正
$ git commit --amend --reset-author
```

以下、設定テンプレート

```bash:
# グローバル設定の場合
$ git config --global user.name "名前"
$ git config --global user.email "メールアドレス"

# ローカル設定の場合
$ git config --local user.name "名前"
$ git config --local user.email "メールアドレス"

$ git commit --amend --reset-author
```

もっと昔からの情報をまとめて更新したい場合は以下などを使用して下さい
[コミットログの作者、メールアドレスなどをまとめて修正する方法 - Qiita](http://qiita.com/neogym/items/4539dc8f7ff2bffff52f)
暗号化されたRDSのスナップショットを別アカウントで復元する

# はじめに

やり方は下記にありますが、わかりづらかったのでメモ。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ShareSnapshot.html#USER_ShareSnapshot.Encrypted

AWS Key Management Service (AWS KMS) で管理される暗号化キーを共有してゴニョゴニョやります。

前提として

* デフォルト暗号化キーで暗号化してある場合は、キーが共有できないので無理

です。

# 手順

ざっくり、暗号化キーをアカウントのルートアカウントに共有→ルートアカウントが対象のIAMアカウントに鍵を共有→スナップショットを共有→復元先のアカウントでスナップショットをコピー→スナップショットから復元 という感じの手順です。

## スナップショットを取る

手動スナップショットしか共有できないようなので手動で取得しておきます。
(時間かかる作業なので先に)

## RDSの暗号化キーを確認

マネージメントコンソールのRDSインスタンスの構成の詳細から確認できます。

<img width="347" alt="スクリーンショット 2016-10-04 15.06.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/82022/0770498f-c5e5-27df-ca4b-50e68b209454.png">

## 暗号化キーを復元先のアカウントに共有する

マネージメントコンソールから IAM > 暗号化キー で該当のリージョンをフィルタして共有したい暗号化キーを選択します。

外部アカウントの追加で復元先アカウントのアカウントIDを入力します。アカウントIDは右上のメニューの「アカウント」から確認できます。

<img width="1082" alt="スクリーンショット 2016-10-04 15.13.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/82022/ab3b288e-78e2-9838-d953-1fa14de2662f.png">

## 復元先のアカウントでIAMアカウントに権限を付与

上記でルートアカウントに権限が渡るのですが、AWSの制限によりKMSで共有された暗号化キーをルートアカウントでは扱えないので、権限をIAMアカウントに付与します。

IAMのユーザのアクセス許可からインラインポリシーにてユーザーポリシーの作成を選択肢カスタムポリシーを作ります。カスタムポリシーには下記を入力します。

ARNはキーの詳細画面にある情報を入力します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUseOfTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey",
                "kms:CreateGrant",
                "kms:RetireGrant"
            ],
            "Resource": [
                "{共有したキーのARN}"
            ]
        },
        {
            "Sid": "AllowAttachmentOfPersistentResources",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": [
                "{共有したキーのARN}"
            ],
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": true
                }
            }
        }
    ]
}
```

## 対象のスナップショットを共有する

スナップショットを選択して「スナップショットの共有」で対象のスナップショットを該当のアカウントIDに対して共有します。

## 復元先のIAMアカウントで入ってスナップショットをコピーする

そのまま復元ができないようなので、一旦スナップショットをコピーします。

マネージメントコンソールのRDSのスナップショット一覧から、共有ファイルでフィルタすると共有されたスナップショットがでてくるのでコピーを選択します。

マスターキーで「キーのARNを入力」を選択し、キーのARNを入力してコピーします。

![スクリーンショット 2016-10-04 15.20.47.png](https://qiita-image-store.s3.amazonaws.com/0/82022/6aa213e7-683f-ada7-571a-a56547a90619.png)

## スナップショットの復元からインスタンスを立ち上げる

スナップショットのコピーが完了すると「スナップショットの復元」からインスタンスを起動できます。

暗号化キーの共有を解除すると、インスタンスは削除されるので注意してください。

# 終わりに

手順がよくわからず思ったより結構たいへんでした。

クラウド上にあると物理的にアクセスされてデータを持っていかれる可能性は少ないので暗号化のメリットとかよくわかっていなかったのですが、こうやって見てみるとアカウント間でそう簡単にはデータを持っていけなくなるため、暗号化しておくのは大事だなと思いました。
VS Codeでデフォルトじゃないバージョンのtypescriptを使う方法

vs codeで開いたプロジェクトにtypescript2.0が含まれてるとvs codeは2.0を使いますか？って聞いてくれる
間違って二度と表示しないを選んじゃって赤線だらけになった(1.8?で使えない記法が入ってた)ので、設定を戻そうとしたけどどこで戻すかわからなくなったのでメモ

* ユーザ設定もしくはワークスペース設定のsettings.jsonを開く
* "typescript.tssdk": "<利用するバージョンのtypescriptのlibディレクトリのパス>" を追記
* 再起動

で意図したバージョンで扱ってくれるようになりました
https://code.visualstudio.com/docs/languages/typescript#_using-newer-typescript-versions
ちゃんとドキュメントを読みましょう
macOS sierra で homebrew を使って libgcrypt がインストールできない

# homeberw を使って libgcrypt をインストールしようとした

```
==> Downloading https://gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.7.1.tar.bz2
Already downloaded: /Users/***/Library/Caches/Homebrew/libgcrypt-1.7.1.tar.bz2
==> ./configure --disable-silent-rules --prefix=/usr/local/Cellar/libgcrypt/1.7.1 --disable-asm --with-libgpg-error-prefix=/usr/local/opt/libgpg-error
==> make
==> make install
==> make check
Last 15 lines from /Users/***/Library/Logs/Homebrew/libgcrypt/04.make:
HMAC_SHA3_384           20ms    10ms    20ms
HMAC_SHA3_512           10ms    20ms    10ms
/bin/sh: line 1: 71242 Segmentation fault: 11  GCRYPT_IN_REGRESSION_TEST=1 ${dir}$tst
FAIL: benchmark
/bin/sh: line 1: 71261 Segmentation fault: 11  GCRYPT_IN_REGRESSION_TEST=1 ${dir}$tst
FAIL: bench-slope
SKIP: hashtest-256g
======================================
4 of 25 tests failed
(1 test was not run)
Please report to http://bugs.gnupg.org
======================================
make[2]: *** [check-TESTS] Error 1
make[1]: *** [check-am] Error 2
make: *** [check-recursive] Error 1

READ THIS: https://git.io/brew-troubleshooting
If reporting this issue please do so at (not Homebrew/brew):
  https://github.com/Homebrew/homebrew-core/issues
```

なんかテストにコケてインストールできない。

# 解決策

https://github.com/Homebrew/homebrew-core/commit/831157188c6abd91bd63aa990a95ebc5edea2f18

に従って、ワークアラウンドを施します。

# 結果

```
==> Downloading https://gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.7.1.tar.bz2
Already downloaded: /Users/***/Library/Caches/Homebrew/libgcrypt-1.7.1.tar.bz2
==> ./configure --disable-silent-rules --prefix=/usr/local/Cellar/libgcrypt/1.7.1 --disable-asm --with-libgpg-error-prefix=/usr/local/opt/libgpg-error
==> make
==> make install
==> make check
🍺  /usr/local/Cellar/libgcrypt/1.7.1: 17 files, 1.5M, built in 3 minutes 12 seconds
```

🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺
【基本】Gitで前のコミットとの差分を見る方法

#GitでのDiffコマンド
```bash
git diff ブランチ1 ブランチ2
```

#直前のコミットとの差分を見る
```bash
git diff HEAD~ HEAD
```

HEADとは現在の最新のコミットのことです。また、「~」をつけると一世代前をさします。つまり最新のコミットと一世代前のコミットを比べているのですね。ちなみに~~が二個だと二世代前です。

#更に省略すると
```bash
git diff HEAD~
```
HEADを省略すると自動的に最新のコミットと比較されます。

#最後に
下記の方法でDiffのツールを設定すると、グラフィカルに変更分の差分を見れたり変更ができて便利です。
「git の差分比較・マージを WinMerge で行う」
http://qiita.com/kobake@github/items/fb317b4fdacad718a4b2
VirtualBox のインスタンスをクローンして他のノートに展開したらブリッジ接続がうまくいかなかった話


## 前提
* ホストマシンは Windows10
* VirtualBox のバージョンは 5.1.4
* ゲスト OS 配下の通り
	* CentOS6.8
	* CentOS7.1
	* Debian8.5
* ゲストはブリッジ接続のみ
* ゲストは DHCP でローカル IP を自動取得する

## 症状
それぞれのゲストマシンはネットワークを利用でき、外には出られる。
しかし、ホストマシンからゲストへ SSH ができない。
`ifconfig` などでゲストの IP を確認すると全てのノートで同じ値だった。

## 原因
クローン(仮装アプライアンスのエクスポート)をすると、ネットワークアダプタの MAC アドレスが同一になってしまう。
そのため、ルーターは同一の MAC アドレスには同一の IP でルーティングする。
その結果 SSH で IP を指定してログインしようとしても、対象のマシンが探せなくなる(厳密には最初の1台はつながる)。

## 対応
MAC アドレスを変えましょう！
### MAC アドレス変更手順
1. VirtualBox で イメージを選択
2. [設定]
3. [ネットワーク] タブ
4. [高度]が閉じてるのでクリックして開く
5. 現在の MAC アドレスをメモしておく (重要！)
5. MACアドレスを変更（手入力 or 右端の丸いアイコンを押す）
6. [OK]

### ゲストでネットをできるか確認する。
普通にゲストを起動する

#### CentOS6.8 の場合
繋がらない。
そもそもネットワークが上がってこない。
MAC アドレスが設定ファイルに記述されているものと異なるせいでエラーがでるためだ。

以下はネットワーク周りの設定を特にいじっていない状態を前提としている。

まず修正すべき設定ファイルは `/etc/sysconfig/network-script/ifcfg-eth0` である。
このファイルを `vi` などで `HWADDR` の値を編集する。
編集する値は先ほど設定した MAC アドレス。

次に編集すべきファイルは `/etc/udev/rules.d/70-persistent-net.rules` で。
`vi` などで開いてみると2行あると思われる(設定をいじってある場合は多い場合もある)。
このうち「 MAC アドレス変更手順」の5でメモっておいた MAC アドレスが書いてある行の先頭に `#` を書いてコメントアウトする。
そして、新しく設定された MAC アドレスが書いてある行の `name="eth1"` となってある箇所 `name="eth0"` に変更する。

その後再起動 (`shutdown -r now`) させる。
これで MAC アドレスの更新され、新しいローカル IP アドレスが発行されるはず。
`ifconfig` で確認する。

#### CentOS7.1 の場合
そのまま繋がる(かしこい！)。

#### Debian8.5
そのまま繋がる(かしこい！)。

## 結論
エクスポートによるゲストのコピーは便利だけど、同時に使うときは気をつけよう！
CentOS6 は MAC アドレスの設定で苦労するようなので、順次サポートも切れていくしサクッと7使おう。
anacondaでPython環境構築から仮想環境構築まで

# はじめに
研究でpythonを使う必要があったので、環境構築した内容を共有します。
まず、macの場合はシステムにはじめからpython2.7が入っています。

# pyenv
pythonの複数バージョンを管理してれます。
Rubyで言うrbenv的なやつです。

早速インストールを行います。
いくつかインストール方法はありますが、今回はHomebrewでインストールします。

```
$ brew install pyenv
```

次にPATHを通します。

``` 　.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

```
$ source ~/.bash_profile
```

インストール可能なpython一覧を確認できます。
```
$ pyenv install -l
```

# Anaconda
次にAnacondaをインストールします。
これは、python本体に加えて、様々なパッケージを一括でインストール可能にしたパッケージです。
pyenvを使ってインストールします。
今回はversion 2.x系での環境構築を行います。

```
$ pyenv install anaconda-2.4.0
```

これで2.x系のanacondaが入りました！
このanacondaにはpython2.7が入っています。

```
$ pyenv global anaconda-2.4.0
$ python --version
Python 2.7.12 :: Anaconda custom (x86_64)
```
インストールしたanacondaを指定することで、システムではなくanacondaのpythonになりました！
pythonのバージョンを確認するとPython 2.7.12になってますね。

# 仮想環境構築
次にanacondaで仮想環境を構築していこうと思います。
開発はこの仮想環境で行っていきます。
もし何か起こっても、簡単にリセットできて安心ですね！

pythonで仮想環境を構築するのにvirtualenvというのもありますが、anacondaでもcondaというものを使って、仮想環境を構築できます！

```
$ conda create -n [仮想環境の名前] python=2.7
```

このコマンドで簡単に仮想環境を構築することができます。

```
$ conda env list
```

このコマンドで今ある仮想環境が確認できます。

```
source activate [仮想環境の名前]
source deactivate
```

activateで仮想環境に入ることができます！
出るときはdeactivateです！

私はactivateする時に一回つまずきました。
pyenvとcondoのactivateが衝突する問題です！
> http://qiita.com/y__sama/items/f732bb7bec2bff355b69

PATHを追加しましょう。

# 最後に
今回pythonの環境構築を行いました！
他の言語に比べるとパッケージ管理やらバージョン管理やら用意されているものが多くて混乱した印象です！
pyenv => anaconda => 仮想環境
みたいに、構造が何層にもなってますが、特に１つの環境で良いのならもっと簡単にできたなって思います。
anacondaだけでよかったな...

以上 python環境構築でした。
/etc/sysctl.conf 覚書

``/etc/sysctl.conf`` のコメント行の日本語訳。

## /etc/sysctl.conf

システム変数を設定する為の設定ファイルです。

ここに掲載されていないシステム変数については
``/etc/sysctl.d/`` を参照してください。
詳細は ``sysctl.conf(5)`` を参照してください。

```bash
kernel.domainname = example.com
```

コンソール上で低レベルのメッセージを停止します。

```bash
kernel.printk = 3 4 1 3
```

## netbase において事前に検索される機能

なりすまし保護(リバースパスフィルタ)を有効にします。
なりすまし攻撃を防ぐ為にすべてのインターフェイスにおいて
送信元アドレス検証をオンにします。

```bash
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
```

[TCP/IP SYN cookie](http://lwn.net/Articles/277146/) を有効にします

注: これは IPv6 TCP セッションにも影響を与える可能性があります。

```bash
net.ipv4.tcp_syncookies = 1
```

IPv4 パケット転送を有効にします。

```bash
net.ipv4.ip_forward = 1
```

IPv6 パケット転送を有効にします。
このオプションを有効にすると、ホストのルーター通知に基づく
ステートレスアドレス自動設定が無効になります。

```bash
net.ipv6.conf.all.forwarding = 1
```

## 任意の設定

以下の設定はホストのネットワークセキュリティと、
リダイレクションを介したなりすまし攻撃や中間者攻撃を含む、
いくつかのネットワーク攻撃に対する防御を向上させることができます。
ただし一部のネットワーク環境では、これらの設定を無効にする必要があります。
確認のうえ必要に応じて有効にしてください。

ICMP リダイレクトを無視します(MITM 攻撃を防ぎます)

```bash
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
```

ゲートウェイリストにデフォルトで列記されているゲートウェイに対してのみ
ICMP リダイレクトの受信を許可します。(デフォルトで有効)

```bash
net.ipv4.conf.all.secure_redirects = 1
```

ICMP リダイレクトを送信しません(当該端末はルーターではありません)

```bash
net.ipv4.conf.all.send_redirects = 0
```

IP ソースルートパケットを無視します(当該端末はルータではありません)

```bash
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
```

あり得ないパケット(不審なパケット?)を記録します。

```bash
net.ipv4.conf.all.log_martians = 1
```

## マジックシステムリクエストキー

- 0 = 無効
- 1 = すべて有効

Debian カーネルはこれを 0 に設定します。(キーを無効にします)
0 以外の値を指定した場合の動作については [sysrq.txt](https://www.kernel.org/doc/Documentation/sysrq.txt) を参照してください。

```bash
kernel.sysrq = 1
```

## 保護されたリンク

特定の条件下でリンクを作成または追跡しないように保護します。
Debian カーネルは両方とも 1 (制限あり)に設定されています。
[fs.txt](https://www.kernel.org/doc/Documentation/sysctl/fs.txt) を参照してください。

```bash
fs.protected_hardlinks = 0
fs.protected_symlinks = 0
```
AWS SDK for PHP V3の非同期処理をSESで試してみる

# AWS SDK for PHP V3の非同期処理をSESで試してみる

ちょっと前ですが、AWS SDK for PHPが非同期処理に対応しました。

[Concurrency in Version 3 of the AWS SDK for PHP](https://blogs.aws.amazon.com/php/post/Tx3OJWBAYNU6HMG/Concurrency-in-Version-3-of-the-AWS-SDK-for-PHP)

非同期処理を使うと並列実行しやすいとのことで、SESのメール送信APIで順次処理と非同期処理の実行時間を比較してみました。

## 必要環境

- PHP >= 5.5

## 準備

composerからインストールします。

```
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require aws/aws-sdk-php:~3.0
```

## メール送信：順次処理版（sync.php)

```php
<?php

require 'vendor/autoload.php';

define('MY_LIMIT', 24);

use Aws\Ses\SesClient;

$client = SesClient::factory(array(
    'version'=> 'latest',     
    'region' => 'us-east-1',
));

$request = array();
$request['Source'] = '(送信元アドレス)';
$request['Destination']['ToAddresses'] = array('(送信先アドレス)');
$request['Message']['Subject']['Data'] = 'ses';
$request['Message']['Body']['Text']['Data'] = 'example';

for ($i = 0; $i < MY_LIMIT; $i++) {
    try {
        $result = $client->sendEmail($request);
        $messageId = $result->get('MessageId');
        echo("Email sent! Message ID: $messageId"."\n");
    } catch (Exception $e) {
        echo("The email was not sent. Error message: ");
        echo($e->getMessage()."\n");
    }
}
```

## メール送信：非同期処理版（async.php)

6並列で実行してみました。

```php
<?php

require 'vendor/autoload.php';

define('MY_LIMIT', 24);
define('MY_CONCURRENCY', 6);

use Aws\Ses\SesClient;
use GuzzleHttp\Promise;

$client = SesClient::factory(array(
    'version'=> 'latest',     
    'region' => 'us-east-1',
));

$request = array();
$request['Source'] = '(送信元アドレス)';
$request['Destination']['ToAddresses'] = array('(送信先アドレス)');
$request['Message']['Subject']['Data'] = 'ses';
$request['Message']['Body']['Text']['Data'] = 'example';

$promiseGenerator = function($total) use ($client, $request) {
    for ($i = 0; $i < $total; $i++) {
        yield $client->sendEmailAsync($request);
    }
};

$promise = Promise\each_limit(
    $promiseGenerator(MY_LIMIT),
    MY_CONCURRENCY,
    function ($result) {
        $messageId = $result->get('MessageId');
        echo("Email sent! Message ID: $messageId"."\n");
    },
    function (Exception $e) {
        echo("The email was not sent. Error message: ");
        echo($e->getMessage()."\n");
    }
);
$promise->wait();
```

## 比較

timeコマンドで比較しました。

```
$ php -v 
PHP 5.6.26 (cli) (built: Sep 15 2016 13:22:01) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
$ time php sync.php
$ time php async.php
```

3回ずつ実行した場合のreal値の平均値が以下となりました。

|sync.php|async.php|
|:-----------|------------:|:------------:|
|9.403 秒|2.557 秒|

非同期処理で並列実行すると3倍以上速くなりました！
iOS10以降でも32bit端末を意識しなければならない時

# はじめに

`Int`を使うことで、デバイスが64bitか32bitを意識することなくコードを書けるようになってはいたのですが、ハマった箇所があったのでまとめておこうと思います。
※現状で確認できているのは、`NSPredicate`のみで起こるクラッシュです。

## iOS10をサポートしているデバイス

![スクリーンショット 2016-10-04 13.36.09.png](https://qiita-image-store.s3.amazonaws.com/0/60325/ce24478b-adfb-78bf-9ba6-e95a364fd03e.png)[^1]

その中でも、`iPhone5`、`iPhone5c`、`iPad 4th`、`iPad mini 2`は32bit端末になります。
最新のOSが32bit端末をサポートしているので、もしbit数まわりでクラッシュが起きる場合には考慮しなくてはならなくなると思います。

## 端末のbit数を意識しなければならない状況とは？

```swift
let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %lld", id)
```

この場合、`Int`が`Int64(long long int)`であろうことを考慮して、`%lld`に指定するかと思います。
しかしながら、`%lld`では32bit端末で実行時エラーとなってしまいます。
※`String(format:_:)`ではクラッシュせずに値がおかしくなてしまうだけですが、`NSPredicate(format:_:)`ではクラッシュしてしまいます。

これを簡単に解決する方法は`%lld`を`%ld`にすることかと思います。

下記のように`sizeofValue(id)`と`sizeof(Int32)`を比較して、`%ld`または`%lld`を出し分けるという方法もあります。

```swift
let id: Int
let fetchRequest: NSFetchRequest
//32bit端末対応
let key = sizeofValue(id) == sizeof(Int32) ? "%ld" : "%lld"
fetchRequest.predicate = NSPredicate(format: "id = \(key)", id)
```

## ちなみにObjective-Cでは...

32bit端末で`%lld`を実行しても、値がおかしくなってしまうだけでクラッシュはしませんでした。

```objc
NSInteger id = 10; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %lld", id];
NSLog(@"%@", predicate);
```

# 最後に

`Int32`の最大値は2,147,483,647なので、そもそも最大値を越えた場合は32bit端末で正常な動作はしないのですが、32bitと64bitの端末はまだ存在しているということを頭の片隅に置いておくと、不要なクラッシュを防ぐことができるかもしれません。

## 2016/10/05追記

下記のコードでも対応可能でした。

```swift
let id: Int
let fetchRequest: NSFetchRequest
fetchRequest.predicate = NSPredicate(format: "id = %@", NSNumber(value: id))
```

分岐を書く必要がないので、`NSNumber`を使うとスッキリするかもしれません。

[^1]: [https://support.apple.com/ja-jp/km206870](https://support.apple.com/ja-jp/km206870)
既存の関数の呼び出しをフックする方法

# 既存の関数の呼び出しをフックする方法

既存の関数の呼び出しの前後にあれこれしたいというのはよくある話ですが、割りと簡単にできる方法です。

## 簡単な例

```javascript
//オリジナルの関数
function add(n, m){
	return n + m;
}

//呼び出してみる
add(1, 2) // 3

//フックしてみる
var origin = add;
add = function(){
	console.log(arguments);//呼び出されたパラメータを出力

	//オリジナルへ委譲
	var result = origin.apply(null, arguments);

	//結果を2倍して返す
	return result * 2;
}

add(1, 2) // 6
```

## consoleへのフック

応用として、console.logの出力を本番と開発でオンオフするということをやってみます。
console.log、console.info、console.error、console.warnをフックします。

```javascript
//開発フラグがtrueの場合は出力を行う、本番モードはfalseにする
console.development = false;

//関数名を分解
"log,warn,error.info".split(",").forEach(function(key){
	//オリジナルの関数を取得
	var origin = console[key];

	//consoleに上書き
	console[key] = function(){
		//デバッグフラグがあるときだけオリジナルへ委譲
		if(console.development){
			//Node.jsならconsoleは不要、ブラウザは必要
			origin.apply(console, arguments);
		}
	};
});
```

上記例で言えば、単純に`if(development)console.log = function(){}`でよいのですが、
実例としてconsole.logが実行された時に、本番モードではリングバッファに追記して、
レポート出力時にバッファから出力するという目的でフックを使っています。

## インスタンスの関数へのフック

prototypeを使えばStringの関数のフックも可能です。

```javascript
var origin = String.prototype.charAt;
String.prototype.charAt = function(index){
	console.log("index=" + index);
	return origin.call(this, index);	
};
```

インスタンスの関数をフックするときにはcallやapplyの第一引数にはthisを渡す必要があります。
引数がハッキリしている場合はapplyではなくcallで呼び出せます。
使いみちが少なそうな感じもしますが、私はNode.jsのrequireの呼び出しをフックするために使っています。

```javascript
//モジュールからモジュールクラスを取得
var Module = module.constructor;

//プロトタイプのrequireを取得
var origin = Module.prototype.require;

//requireを置き換え
Module.prototype.require = function(path){
	//何がrequireされたのかを出力
	console.log(path);

	//オリジナルへ委譲
	return origin.call(this, path);
}

//何かをrequireしてみる
require(any);//ログが出力される

```

## 制限

この方法はシンプルですが、コンストラクタには適用できません。
要素数が不定の csv データを転地

```csv:1.csv
1,2,3
1,2
1,2,3,4,5
```

上記ファイルのような要素数が不定の csv データを転地して以下のようにする。

```
1,1,1
2,2,2  # ←は見やすくしたバージョン。本当は以下のように潰れる.
3, ,3  # 3,,3
 , ,4  # ,,4
 , ,5  # ,,5
```

Excel でするには行数/フィールド数が多すぎたので。
csv といいつつ、```,``` は スペースに置換してから使ったので、comma-separated じゃないけど、なんていうのが正しいのかな？


```awk
#! /usr/bin/gawk -f
# transposed_matrix.awk

BEGIN {
    #BEGIN ブロック追加.
    n = 0;  
    # ねんのためだったけど、awk の世界は 1 始まりなので
    # 余計なことをした気がしないでもない
}
{
    n = n < NF ? NF : n;  # この行、追加
    for (i = 1; i <= NF; i++) {
        val[i, NR] = $i;
    }
}

END {
    #for (i = 1; i <= NF; i++) {}  # NF が最後の行のフィールド数になっているので記録した最大レコード数を使用する.
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= NR; j++) {
            printf("%s,", val[i, j]);
        }
        print "";
    }
}

```

出展: [AWK Users JP::転置行列を作る](http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_110)
Githubをもっと便利に使う

#Codetree

「GitHub issue」に足りない一覧性を提供してくれる「[Codetree](https://codetree.com)」。
複数プロジェクトを一覧化することが出来ないかなと、いろいろ調べていてたどり着いたツールです。

マイルストーンごとに一覧化したり担当者ごとに一覧化したりできます。

#waffle.io

「GitHub issue」を看板形式にしてくれる「[waffle.io](https://waffle.io)」
バックグラウンドで位置情報を取得

#バックグラウンドで位置情報を取得
自分用のメモとして

##追記（2016/10/15）
バッググラウンドで取った位置情報をFirebaseのrealtimeDBに送信していたが、
メールアドレス認証(Auth)を付けたら、全く動かなくなった

原因調査中、分かり次第別記事にて解説入れます！
原因
-FirebaseのDBのルールをいじったから
-本記事のviewControllerの前に認証用のviewControllerを追加したから
-認証が悪い

##追記（2016/10/21）
くだらない理由で解決した

info.plistのPrivacy - Location Always Usage Descriptionを
Location Always Usage Descriptionと書き換えていた。
この辺のパーミッション系はいじっちゃダメってことでした。


##環境
iOS10 Xcode8 Swift3


##初期設定
ターゲット->backgroudModeをON->Backgroud Fetchにチェックを入れる

![スクリーンショット 2016-10-04 14.20.18.png](https://qiita-image-store.s3.amazonaws.com/0/137949/0abada99-d6d9-4b74-4df4-d0a66fe081e5.png)


info.plistにPrivacy - Location Always Usage Descriptionを追加
Valueにはパーミッションのアラートに表示するテキストを入力

![スクリーンショット 2016-10-21 8.54.23.png](https://qiita-image-store.s3.amazonaws.com/0/137949/d19e31b9-97d6-fae6-7927-bd99b40ed8c7.png)



##ViewController.swift
```Swift:ViewController.swift
import UIKit
import CoreLocation

class ViewController: UIViewController,CLLocationManagerDelegate {    
    var myLocationManager: CLLocationManager!
    var myLatitude       : String = ""
    var myLongitude      : String = ""
    
    //Success get location
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = manager.location {
            self.myLatitude  = "\(location.coordinate.latitude)"
            self.myLongitude = "\(location.coordinate.longitude)"
            
            print("\(self.myLatitude):\(self.myLongitude)")

        }
    }
    
    //Cant get location
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("error")
    }
     
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let status = CLLocationManager.authorizationStatus()
        if status == CLAuthorizationStatus.restricted || status == CLAuthorizationStatus.denied {
            return
        }
        
        myLocationManager = CLLocationManager()
        myLocationManager.delegate = self
        
        //
        if status == CLAuthorizationStatus.notDetermined {
            myLocationManager.requestAlwaysAuthorization()
            myLocationManager.startMonitoringSignificantLocationChanges()
        }else{
            myLocationManager.startMonitoringSignificantLocationChanges()
        }
        
        //
        if !CLLocationManager.locationServicesEnabled() {
            return
        }
        
        myLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        myLocationManager.distanceFilter = 100   
    }
}
```

###参考
バックグラウンドで位置情報を取得する（CoreLocation::CLLocationManager）
http://qiita.com/shngt/items/6687edeb055113e5fd70
【iOS 9対応】知っておきたい位置情報周りの変更点
http://qiita.com/koogawa/items/024b00173561ed06ce9a