OmniAICreator/Qiita-1.07M huggingface dataset:
Gitが全然分からなかったので勉強した。眠い。

眠い。

#Gitとは
分散型バージョン管理システム

#大きな構成から知ろう！
Gitは、大きく以下の3つからなる。

- Gitディレクトリ
    - **プロジェクトのためのメタデータ**と、**オブジェクトのデータベース**があるところ
    - 作業ディレクトリに**クローン**したり、ステージング環境からコミットを受付けて、**永久不変に保持するスナップショット**として保持する
- 作業ディレクトリ
    - プロジェクトの一つのバージョンの単一チェックアウト
    - 新規作成するか、クローンする事で作成される
- ステージングエリア
    - 次のコミットに何が含まれるかに関しての情報を蓄えた場所
    - 作業ディレクトリからスナップショットを受付け、Gitディレクトリにコミットする

つまり
「 - 」 →　(新規作成)　→　「作業ディレクトリ」
「Gitディレクトリ」　→　(クローン)　→　「作業ディレクトリ」
「作業ディレクトリ」　→　(add)　→　「ステージングエリア」
「ステージングエリア」　→　(コミット) →　「Gitディレクトリ」

というサイクルになる。

<br />
ここまでOK( ･ω･ )??
<br />

#コマンドで確認していく

#Step1. ユーザ設定
まず初めに、ユーザ/メールを設定する必要がある。

```sh
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
git config -l
```

#Step2. 作業ディレクトリ作成
上記したように、2パターンあります。

###パターン１：新規作成
新規プロジェクトを作って、そのプロジェクトをgit管理する。

```sh
#homeディレクトリ配下にアプリの基となるディレクトリ作成
cd /home
mkdir myapp
cd myapp

#git initで、カレントディレクトリをGitディレクトリに変換
git init
```

###パターン２：クローン
既存のGitディレクトリをクローンを作る。~~クローンって厨二っぽくて格好良い。~~
今回は例として、ここに書いてるように[Grit](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97)をクローンする。

```sh
#homeディレクトリ配下にアプリの基となるディレクトリ作成
cd /home
mkdir myapp
cd myapp

#git cloneで、カレントディレクトリにGritをクローンする
git clone git://github.com/schacon/grit.git
```

#Step3. 作業ディレクトリ→ステージングエリア→Gitディレクトリへの一連の上げ方

```sh
#index.htmlを作成/編集
cd /home/myapp
vim index.html

#git addで、ステージングエリアに上げる
git add index.html

#git commitで、Gitディレクトリに上げる
git commit
```

この段階で役立つコマンドがいくつかあるので紹介！必見！
`git add .` : 現在ディレクトリ配下の変更を全てadd
`git status` : 現在の状態を教えてくれる。(addすればいいのか、commitすればいいのか、みたいな)
`git diff` : 変更の差分を教えてくれる。(addする前に使う。addした後は--cachedオプションを付ける)
`git log` : コミット履歴が見れる。色々オプションもあるので

#Step4. 直前のコミットを変更したい！
って事ありますよね。
「コミットしたけど変数名間違えた。けど、コミットするほどの内容じゃないし､､､どうしよう。」って事。

```sh
#add -> commit(間違) -> ファイル編集 -> add -> 以下のコマンド
git commit --amend
```

#Step5. コミットを取り消したい！！！
って事もありますよね。
`git reset --hard HEAD` : 作業ディレクトリまで上書き(hard)
`git reset --soft HEAD` : 作業ディレクトリまでは上書かない(soft)
`git reset --hard HEAD~2` : 2個前に戻る(HEAD~2)
`git reset --hard a1b2c3d4e5` : 指定された場所に戻る(git logした時のアレ)


#Step6. ブランチを切りたい！マージしたい！
ブランチっていうのは「分岐」。マージっていうのは「合流」。
詳しくは調べて下さい。(只今am03:00)
チェックアウトっていうのも、調べて下さい。(眠い)(元気になったら投稿編集します)

```sh
git branch         #現在のブランチ(default:master)
git branch hoge    #hogeを作る
git checkout hoge  #hogeに移動
git marge hoge     #hogeをmasterにmarge #masterで実行
```

#Step7. logファイルはバージョン管理から無視したい！！！
カレントディレクトリに、ファイル `.gitignore` を生成する。

```sh
# filename: .gitignore
*.log
```

#Step8. プルリク！！！
Gitと言えば「プルリク」！
よく聞きますよね、プルリクエスト。
コマンドだとこうなります。

```sh
git push origin master
```

プルリクエストを受取るのは、以下のコマンドです。

```sh
git pull origin master
```


プルリクなのにプッシュ.....
何でプッシュなんだろう.....

と思ったら、こういう事ですね。
Aさん「編集したよ、Bさん！プルしておいて！pullをrequest!!!」
Bさん「はーい」

なのでプルリク。
納得。


##最後に
自己満で申し訳ない。
眠い。


<br />
以上。おやすみ。
Angular2のIE9対応 Tips

# Angular2でIE9対応をするにあたって何が必要になるかを記載したいと思います。

## Angular2のバージョン
package.jsonで定義しているバージョンで記載します

```json:package.json
{
    "dependencies": {
        "@angular/common": "~2.2.0",
        "@angular/compiler": "~2.2.0",
        "@angular/core": "~2.2.0",
        "@angular/forms": "~2.2.0",
        "@angular/http": "~2.2.0",
        "@angular/platform-browser": "~2.2.0",
        "@angular/platform-browser-dynamic": "~2.2.0",
        "@angular/router": "~3.2.0",
    }
}
```

## 必須になる下位互換のモジュール
```html:sample.html
<script src="node_modules/angular2/es6/dev/src/testing/shims_for_IE.js"></script>
<script src="node_modules/systemjs/dist/system-polyfills.js"></script>
<script src="node_modules/core-js/client/shim.min.js"></script>
```

## ルーティング周りで必要な実装
IE9ではpushStateが対応していないのでルーティングが上手く対応出来ません。
そこでhashStateを使用したルーティングを行わなければいけません。
キモになるのは<font color="red">{useHash: true}</font>になります
オプションの意味は下記公式ドキュメントのURLに記載されています
https://angular.io/docs/ts/latest/api/router/index/ExtraOptions-interface.html


```text:キモになる箇所
RouterModule.forRoot(appRoutes, {useHash: true}])
```

```Typescript:sample.routing.ts
import { NgModule }      from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const appRoutes: Routes = [
  { path: '', redirectTo: 'sample', pathMatch: 'full' },
  { path:'sample', loadChildren:'./app/routing/sample_child.routing.js#AppChildRouteModule' }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes, {useHash: true})
  ],
  exports:[
    RouterModule
  ]
})
export class AppRouteModule {
}
```

## IE9対応を行う上でのデメリット
1. URLがHashStateになるのでルートディレクトリが【localhost:8080/#/app】といったURLになってしまいます。
2. アニメーションが使えません。EdgeやFireFox,Chrome等で使用する際は下記URLの対応が必要となります
　 http://qiita.com/MakotoTaniguchi/items/a416b8b4fe3d0132e132
3. componentのtemplate(HTML)にバインドするオブジェクトを上書きすると【Symbol.iterator】プロパティが未定義とお𠮟りを受けます。  
   よって配列等は再代入出来ないのでpopメソッドで全部吐き出してからpushメソッド等で再格納しないといけないです。

## バージョンアップした場合
1. Angular4にバージョンを上げた際にはIE9対応は適応出来ませんでした。
Djangoを触ってみた感想

#概要

最近流行っていると聞いてPythonのフレームワーク「Django」を触ってみました。
読み方はｼﾞｬﾝｺﾞ？ﾄﾞｼﾞｬﾝｺﾞ？と思っていましたがｼﾞｬﾝｺﾞでいいみたいですね。
まだそんなに触れていませんが、なんかいい感じと思ったので凄く適当な感想を書きます。


#Djangoを触ったきっかけ
普段はもっぱらC/C++でゲーム開発が主なのですが
自分のホームページでも作ろうかと思い、昔やっていたPHPでがりがり制作活動にいそしんでいました。

CakePHPとかそんな大それたものもいらないし、適当に自作MVCを作ってやっていたのですが
ずっとC/C++で型のある言語をやっていたせいか非常にPHPがやりにくい
かつてはPHPerだったのに。。。

標準の関数名や引数の並びの統一感のなさ
配列の書きにくさや、<?php ?>というセレクターの冗長さ
null,0,空文字,bool値の扱いにくさ
etc...

LL言語といいつつなんか無駄にやる事多くなる！！！
型がない言語なのに、それなりに型を意識させられたりするところに本末転倒さを感じる！
syntaxがなんかキモイ！！

というわけでもっとさくっといけちゃうLL言語ないかなー
フレームワークもトレンドを追いかけてみようかなー
と思ってDjangoに手を出してみました。
はい、愚痴が長くなりましたが感想です。

#Djangoの環境構築
基本はコマンドベースでしたが、特にトラブルもなくすんなりと行けました。
仮想環境で動くからプロジェクト毎の管理も楽そう。

環境構築で最も萎えるのが、マニュアル通りに進めてもエラーになるというオカルト現象ですが
今回、いっさいオカルト発生せず。素晴らしいですね。

#コーディング
まずPythonが割と書きやすい。
Syntaxがシンプルで多機能だし、配列は[]で書けるし、セミコロンがないのも慣れると楽だなぁと思いました。
これこそLL言語って感じなのだろうか。
PHPより書くのが楽だぁ。

#フォームや値チェック
Djangoフォームというものを使ってみた。
フォームクラス作ったらデータチェックもフォームタグの作成もちゃちゃっとできて楽。
いやー感動した。

#IDEについて
VS Code使ってみたけどインテリセンスがいまいち。
やはりPyCharm(有償)を使うしかないのか。。。
Djangoのインテリセンスも含めてとなるとEclipseかPyCharmくらい？
Eclipseは嫌いなので試していませんが、今のところ無償IDEでいいのはなさそう。
誰か知ってたら教えてほしい。



#まとめ
まだDB操作とかはしておらず、基本的なルーティングやら
MVCモデルにおけるところのCV程度を扱ったところですが
結構好印象です。

超簡単にかける！
まぁでもフレームワークの導入時とかはだいたいそんなもんですよね
実際凝った事やりだすと壁にぶつかったり、使いにくさに気づいたり


まだそこまで触りこんでいませんが
かなり人気もあるようですし、もっと触っていきたいと思います。
ES2017 async/await で sleep 処理を書く

___`async/await` は `ES2016` でなく `ES2017` でした。以下修正しています。___

Node.js v7 より ES2017 async/await が利用できるとの話を耳にしたので「サーバサイドでくらい ES2017 使ってみるかな」とちょいちょい使い始めています。どこかのサーバへクエリを叩いてその結果をさらに別のサーバへのクエリに使うという処理って、手元でちょっとしたツールを作るときにも大いに登場する処理なのですが、`async/await` が使えることでとても簡単に書けるようになったので、その使用感などを僭越ながら簡単に紹介していきたいと思います。

## 単純なスリープ処理

始めに感動したのは async/await を使うとスリープ処理がいとも簡単に書けるというところでした。`async/await` と `Promise` を色々とこねくり回したところ `msec => new Promise(resolve => setTimeout(resolve, msec));` という記述で `sleep` 処理が書けるのだな、という結果に。

```js:async-sleep.js
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));

(async () => {
  console.log('スタート');
  await sleep(1000);
  console.log('1秒経ってる!')
})();
```

これを `--harmony-async-await` オプションをつけて実行すると、`console.log` 通りの表示になります。

```bash
$ node --harmony-async-await async-sleep.js
スタート
1秒経ってる!
```

このあたり [Promiseとasync-awaitの例外処理を完全に理解しよう](http://qiita.com/gaogao_9/items/40babdf63c73a491acbb) にはとても理解を助けられました。`Promise` から値を取り出すまで処理をストップするのが `await` で、その `await` で全体の処理がブロックされないように `async` で定義した非同期関数内でしか `await` を使えなくなっていますよ、というのが現状の僕の理解です。

JavaScript ってシングルスレッドのためか、処理をブロックさせないためにとことん非同期領域に処理を投げて、そのせいで連続する処理の記述が面倒になってる節があると思うのですが、`async/await` も例に漏れずといった印象。**でも今までよりはずっと素敵です。**ぜひブラウザでも使えるようになって欲しい。

## スリープを利用したインターバル処理

さて、`Promise` と `async/await` の関連が理解できてきたのが気持ちよくて、もう一例作ってみました。今度は二つの処理のレーシング(?)を利用したインターバル処理の例です。さっき定義した `sleep` 処理を再利用します。

```js:async-interval-repeater.js
// さっきと同じ sleep 処理
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));

// 最低間隔を確保したいタイプのリピート処理を行う関数
const intervalRepeater = async (callback, interval) => {
  while (true) {
    const startTime = Date.now(); // 時間計測用
    console.log('処理を始めるよ！')

    // 本処理と sleep を同時実行して最低間隔を確保する
    await Promise.all([callback(), sleep(interval)])

    console.log('処理が終わったよ！ 経過時間[ms]:', Date.now() - startTime)
  }
}

// resolve までに数秒(ランダム)かかるクエリのダミー
const dummyQuery = () => sleep(Math.random() * 2000);

// 最低でも 1秒 の間隔を挟みながらクエリを送る処理
intervalRepeater(dummyQuery, 1000);
```
ループで連続した処理を平易に書けるのがうれしいですね。

これもさっきと同様に実行すると

```bash
$ node --harmony-async-await async-interval-repeater
処理を始めるよ！
処理が終わったよ！ 経過時間[ms]: 1014
処理を始めるよ！
処理が終わったよ！ 経過時間[ms]: 1005
処理を始めるよ！
:
:
```

このように最低間隔 1秒 が確保されたリピート処理が実装できます。

この処理の用途として何を想定したかと言うと、とあるAPIを定期的に叩くような場合に欲しくなったりする

- 前の処理の完了を待って次の処理を行う
- 処理の最低間隔を確保する

の二つを両立したい場合です。前者だと `Promise` チェーンで処理を連続させることもできますが、たまにクエリの結果が空だったりすると処理が爆速で終了して、必要以上の間隔でクエリが再送されてしまったりします。また、後者の場合 `setInterval` を利用することも考えられますが、前の処理の完了を待たずに次の処理が始まってしまう処理のオーバーラップが発生したりしていました。連続するレコードを処理する場合など、処理のオーバーラップはできれば避けられたら考慮事項が少なくなるな、なんて場合も結構多い気がします。

これまで同様の処理を実装しようとすると [limiter](https://www.npmjs.com/package/limiter) などの毎秒クエリ数を制限するライブラリでクエリ処理をラッピングしたりしていましたが、`async/await` を利用するとそうした工夫からも解放され、リモートリソースを叩くようなツールがとても快適に作れるようになるんですね。

...という初めての Qiita でした。何も書けずに手をこまねいている期間が長くなってしまったので、簡単な記事でも書いてみねば、と思いきって書いちゃいました。

他の方の記事と被っていたり邪魔だったりしたらすみません、生温かく注意していただけると嬉しいです。
monacoind 0.14系をcentos7へインストールする

# 前提条件

* コンパイル時に2gb以上のメモリ（なければswapでカバー）

# ビルド

## tarファイルをダウンロードして展開

```
curl https://codeload.github.com/monacoinproject/monacoin/tar.gz/monacoin-0.14.2 > monacoin-0.14.2.tar.gz
tar zxvf monacoin-0.14.2.tar.gz
```

## 必要なパッケージをインストール

```
sudo yum install -y autogen automake libtool gcc gcc-c++
sudo yum install -y boost boost-devel openssl-devel libevent-devel
sudo yum install -y libdb-cxx-devel libdb-cxx
```

## configureをかけてからmake

* walletが要らなければ ./configure --disable-wallet を実行

```
cd monacoin-monacoin-0.14.2
./autogen.sh
./configure --with-incompatible-bdb
make
```

## インストール

* /usr/local/bin 以下にインストールされます

```
sudo make install
```

# 起動

## コマンドラインから起動

```
monacoind -server -daemon
```

### ブロックチェーン同期確認

```
monacoin-cli getinfo
```

結果がjsonで返ってきます
終わるまでひたすら待ちます

```:getinfo結果
{
  "version": 140200,
  "protocolversion": 70015,
  "blocks": 736,
  "timeoffset": 0,
  "connections": 1,
  "proxy": "",
  "difficulty": 0.000244140625,
  "testnet": false,
  "relayfee": 0.00100000,
  "errors": ""
}
```

何日分まで終わったか確認したければ以下のコマンドでログを追っかける

```
tail -f ~/.monacoin/debug.log
```

# その他情報

* https://monacoin.org/ja/download.html
* http://askmona.org/4835

# systemd設定

```:/etc/systemd/system/monacoin.service
[Unit]
Description=monacoin
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/monacoind -server -txindex=1 -rpcuser=monacoin -rpcpassword=monacoin123
WorkingDirectory=/home/centos
KillMode=process
Restart=always
User=centos
Group=centos

[Install]
WantedBy=multi-user.target
```

## 起動

```
systemctl start monacoin
```

## 停止

```
systemctl stop monacoin
```

## RPCテスト

```
monacoin-cli -rpcuser=monacoin -rpcpassword=monacoin123 getinfo
```
Androidで端末内の画像を取得

###内容
ボタンを押して、端末内の画像を取得（表示）します。
完成イメージ。

![14870041770Ys5q7cJNpeK3vN1487004176.gif](https://qiita-image-store.s3.amazonaws.com/0/15564/264f5655-4058-b992-6650-28ad832aacaa.gif)


###Layout
画像選択Buttonと取得した画像を表示するImageViewを用意します。

```xml:activty_main.xml
    <Button
        android:id="@+id/button2"
        android:text="get image"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/image_view"
        android:scaleType="fitStart"
        android:adjustViewBounds="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
```

###Activity
ボタンの押下時の処理でドキュメントを開くインテントを作成して、画像フォルダの読み込みを設定します。
結果の画像を取得するため、startActivityForResultで起動します。
第2引数には任意のIDを付与します。（戻ってきた時の判定で使用）

```java:MainActivity.java(1)
public class MainActivity extends AppCompatActivity {
    private static final int RESULT_PICK_IMAGEFILE = 1000;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.image_view);

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, RESULT_PICK_IMAGEFILE);
            }
        });

    }
```

startActivityForResult 終了後 onActivityResult が呼ばれて、
「結果コード、呼び出し時のID、結果」が渡されます。

結果コード(resultCode)には正常終了[RESULT_OK]、キャンセル[RESULT_CANCELED]が入っており、
呼び出し時のIDは　startActivityForResult　の第二引数が入っています。
resultDataの中身は画像パスが入っています。
その画像パスからBitmapを作成してLayoutのImageViewにセットします。

```java:MainActivity.java(2)
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == RESULT_OK) {
            Uri uri = null;
            if (resultData != null) {
                uri = resultData.getData();

                try {
                    Bitmap bmp = getBitmapFromUri(uri);
                    imageView.setImageBitmap(bmp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }

}
```

###リファレンス
・ストレージ アクセス フレームワーク
https://developer.android.com/guide/topics/providers/document-provider.html?hl=ja

・アクティビティから結果を取得する
https://developer.android.com/training/basics/intents/result.html?hl=ja
『クラウド量子計算入門』の演習を行う (5 制御 NOT ゲートの量子実験) その１


# はじめに

こちらの本を読みつつ、演習・実験を試してみます。

- [『クラウド量子計算入門―IBMの量子シミュレーションと量子コンピュータ』](https://www.amazon.co.jp/dp/4877834087/)

![q.jpg](https://qiita-image-store.s3.amazonaws.com/0/20418/e67e0ddc-ba9e-e647-a277-7cd216410bb5.jpeg "q.jpg")

以下、過去分です。

- 「[クラウド量子計算入門に関するN件の投稿 - Qiita](http://qiita.com/tags/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E9%87%8F%E5%AD%90%E8%A8%88%E7%AE%97%E5%85%A5%E9%96%80)」

---

# 5 制御 NOT ゲートの量子実験

## 5.2 制御 NOT ゲートによるもつれ状態生成

### 5.2.1 ベル状態の生成

#### 演習 5-1

> 量子シミュレータで、次のように初期状態 $ |10\rangle $ でアダマール演算と制御 NOT ゲートとを用いて、もつれ状態を生成する量子回路を作成し、実行結果が行列計算とも一致しているか確かめよ。 

```math
|10\rangle
\rightarrow^{H \otimes I}
\rightarrow^{CNOT}
\frac{1}{ \sqrt{2} } ( |00\rangle - |11\rangle )
```

##### 行列計算

```math
H \otimes I |10\rangle
=
\frac{1}{ \sqrt{2} }
\begin{bmatrix}
1
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix} &
1
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix} \\
1
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix} &
-1
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}
\end{bmatrix}
\begin{bmatrix}
0 \\
0 \\
1 \\
0
\end{bmatrix}
=
\frac{1}{ \sqrt{2} }
\begin{bmatrix}
1 \\
0 \\
-1 \\
0
\end{bmatrix}
=
\frac{1}{ \sqrt{2} }(|00\rangle - |10\rangle) \\
```

```math
\rightarrow^{CNOT} 
\frac{1}{ \sqrt{2} }(|00\rangle - |11\rangle)
```

##### 量子回路

![visualIBMQASM.png](https://qiita-image-store.s3.amazonaws.com/0/20418/ced2cb30-9624-7a90-4a42-ef6e06df8a31.png "visualIBMQASM.png")

##### 測定

| c[2] | n |
|:--|:--|
| 00 | 4076 |
| 11 | 4116 |

#### 演習 5-2

> 量子シミュレータで、次のように初期状態 $ |01\rangle $ でアダマール演算と制御 NOT ゲートとを用いて、もつれ状態を生成する量子回路を作成し、実行結果が行列計算とも一致しているか確かめよ。

```math
|11\rangle
\rightarrow^{H \otimes I}
\rightarrow^{CNOT}
\frac{1}{ \sqrt{2} } ( |01\rangle - |10\rangle )
```

##### 量子回路

![visualIBMQASM.png](https://qiita-image-store.s3.amazonaws.com/0/20418/2eaba50b-1551-0c70-8f35-41988b036d90.png "visualIBMQASM.png")

##### 測定

| c[2] | n |
|:--|:--|
| 01 | 4076 |
| 10 | 4116 |

### 5.2.2 制御 NOT ゲートの上下反転

#### 演習 5-3

> 量子シミュレータで、制御 NOT ゲートの前後に制御ゲートも目標ゲートもアダマール変換で挟んだ量子回路を作成し、入力ビット $ |11\rangle $ とすると、その実行結果とベクトル計算式とで一致しているか確かめよ。

##### ベクトル計算

```math
|11\rangle \rightarrow^{H \otimes H}
=
\frac{ |0\rangle - |1\rangle }{ \sqrt{2} }
\otimes
\frac{ |0\rangle - |1\rangle }{ \sqrt{2} }
=
\frac{1}{ \sqrt{2} }( |00\rangle - |01\rangle - |10\rangle + |11\rangle )
```

```math
\rightarrow^{CNOT}
\frac{1}{ \sqrt{2} }( |00\rangle - |01\rangle + |10\rangle - |11\rangle )
=
\frac{ |0\rangle + |1\rangle }{ \sqrt{2} }
\otimes
\frac{ |0\rangle - |1\rangle }{ \sqrt{2} }
\rightarrow^{H \otimes H}
|01\rangle
```

##### 量子回路

![visualIBMQASM.png](https://qiita-image-store.s3.amazonaws.com/0/20418/86fff3ba-aa30-61de-d671-8d76aa980ad5.png "visualIBMQASM.png")

##### 測定

| c[2] | n |
|:--|:--|
| 01 | 8192 |
Raspberry Piにディスプレイとマウスとキーボートを繋がずに自動でRaspbianをインストールする

## NOOBSインストーラを使う

NOOBSは[Raspberry Piの公式サイト](https://www.raspberrypi.org/downloads/noobs/)からダウンロードして解凍したものを[SDカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)でフォーマットしたmicroSDにコピーする

## NOOBSインストールをsilentinstallにする

コピーしたmicroSDの直下にあるrecovery.cmdlineにsilentinstallオプションを追加する

```sh:recovery.cmdline
runinstaller quiet ramdisk_size=32768 root=/dev/ram0 init=/init vt.cur_default=1 elevator=deadline silentinstall
```

これでRaspberry PiにmicroSDと有線LAN、電源を挿すと勝手にインストールができる

## Raspbianのsshサーバを自動起動設定でインストールをする

Raspbianは初期状態でsshサーバが起動しないので、NOOBSインストール中にsshサーバの自動起動設定を行う

コピーしたmicroSDのos\Raspbianにあるpartition_setup.shにsshサーバの自動起動設定を追記する
（@mt08 さんから指摘を受けて修正）

```sh:partition_setup.sh（18行目）
#mt08:(↓一行追加) bootパーティションに ssh を作成
touch /tmp/1/ssh

if ! grep -q resize /proc/cmdline; then
```

あとはこのmicroSDカードをRaspberry Piにセットし電源を入れたらひたすらpingを打ってインストールが完了するのを待つだけ
（ルータ側でdhcpの固定配送を設定して置く）

```sh:cmd
ping -t 192.168.xxx.xxx
```

あとで無線LANの設定方法も書こう

（追記）
## Raspbianの無線LANを自動起動でインストールをする

最後に無線LANも自動起動でインストールをすれば、Raspberry Piに電源を挿すだけで済む

```sh:partition_setup.sh（18行目に更に追記）
# 無線LANの起動設定
sed -ri '/^allow-hotplug wlan0$/i\auto wlan0' /tmp/2/etc/network/interfaces  
echo "network={" >> /tmp/2/etc/wpa_supplicant/wpa_supplicant.conf
echo "        ssid=\"your_ssid\"" >> /tmp/2/etc/wpa_supplicant/wpa_supplicant.conf
echo "        psk=\"your_password\"" >> /tmp/2/etc/wpa_supplicant/wpa_supplicant.conf
echo "}" >> /tmp/2/etc/wpa_supplicant/wpa_supplicant.conf

#mt08:(↓一行追加) bootパーティションに ssh を作成
touch /tmp/1/ssh
```

無線LANは一般的なWPA/WPA2のTKIP/AESモードが前提。またRaspberry Piは2.4Ghz帯（チャンネル1～13）にしか対応していないらしいので注意。

アクセスポイントがステルスモードの場合は更に１行追加する

```sh:partition_setup.sh（22行目に更に追記）
echo "        scan_ssid=1" >> /tmp/2/etc/wpa_supplicant/wpa_supplicant.conf
```

# 参考文献
- [NOOBS用のイメージを作って、Raspberry Piに自動インストールする](http://tnishinaga.hatenablog.com/entry/2014/08/28/020359)
- [Raspberry Pi 3インストール→無線LAN→日本語入出力→Macから操作（SSH・VNCサーバ・AFP）](http://qiita.com/RyosukeKamei/items/5ecf2aa5d5cda848fe51)
- [Installing Raspbian from NOOBS without display](http://raspberrypi.stackexchange.com/questions/15192/installing-raspbian-from-noobs-without-display)
- [RaspberryPiでWPA-PSKのWiFiに接続する方法](http://qiita.com/teao26/items/970a721b5351e4c9918c)
- [Raspberry Pi 3のインストール & 初期設定(Raspbian Jessie Lite)](http://l-w-i.net/t/raspbian/init_001.txt)
WebProxy配下でFTPS

# 目的
WebProxy配下のFTPクライアントからFTPSを通したい

# 構成
client(lftp,curl)
|
WebProxy(squid)
|
FTPServer(proftpd)

# 各設定の抜粋

FTPServer

この辺りに書いてあることを参考にImplicitModeで待ち受けようとしたが
何かを間違えているのか、うまく動作せず。。
Explicitで待ち受け。
http://www.proftpd.org/docs/contrib/mod_tls.html


_/usr/local/etc/proftpd.conf_ 


```
<IfModule mod_tls.c>
# <VirtualHost FTPサーバのPrivateIPを設定した>
    TLSEngine on
    TLSRequired off
#    Port 990
    TLSLog  /var/log/proftpd/tls.log
    TLSProtocol TLSv1 TLSV1.2
    TLSCipherSuite ALL:HIGH:MEDIUM
    
    TLSRSACertificateFile /etc/pki/tls/certs/ftps.crt
    TLSRSACertificateKeyFile /etc/pki/tls/private/ftps.key
    TLSOptions NoCertRequest
    TLSVerifyClient off

# </VirtualHost>
</IfModule>
                  
```

2.webProxy(Squid)

_/etc/squid/squid.conf_

```
acl SSL_ports port 21
```


3.client

_~/.curlrc_

```
cat << _EOF_ > ~/.curlrc
proxy="http://プロキシのPrivateIP:3128"
_EOF_
```

実行コマンド


_・ls_

```
curl --ftp-ssl -u FTPユーザ名:パスワード ftp://xx.xx.xx.xxx
```

proxyのログ

```
1487002892.132    324 xxx.xx.xx.xx TCP_MISS/200 5261 GET ftp://FTPユーザ名@xx.xxx.x.xxxx/ - DIRECT/xx.xxx.x.xxx text/html
```



_・put_

```
curl --ftp-ssl -u FTPユーザ名:パスワード -T "put_file_name" ftp://xxx.xxx.xx.xx -k
```






# 参考
https://curl.haxx.se/mail/archive-2006-09/0021.html
Pythonで A+=B と A=A+B の違いを調べてみたのでメモ

# 実験環境

| OS | macOS Sierra |
|---|---|
| CPU | 2.3 GHz Intel Core i7 |
| メモリ | 16 GB 1600 MHz DDR3 |
| Pythonのバージョン　| 2.7.10 |

# 実験
## 準備

* 以下のような少し大きめのデータと関数を用意して、それぞれ実行時間、演算後のオブジェクト識別子、バイトコードを確認してみた。
    * 関数の呼び出しの前後で `time.time()` を呼び出して差分で実行時間を計測
    * 演算後のオブジェクト識別子は、組み込み関数の `id()` を利用
    * バイトコードの確認は、`dis`モジュールを利用

```Python
def add(list_x, list_y):                                                        
    list_x = list_x + list_y                                                    
    return list_x   

def inplace(list_x, list_y):                                                    
    list_x += list_y                                                            
    return list_x 

list_a = [[0 for x in range(10000)] for y in range(10000)]
list_b = [[0 for x in range(10000)] for y in range(10000)]
```

## 実験結果
* 以下のような出力をするコードを組んで、確認した。

```
add(list_a, list_b)
実行時間: 0.000458
id(list_a): 4391953400 -> 5530614960
------ dis.dis(add) ------
  8           0 LOAD_FAST                0 (list_a)
              3 LOAD_FAST                1 (list_b)
              6 BINARY_ADD          
              7 STORE_FAST               0 (list_a)

  9          10 LOAD_FAST                0 (list_a)
             13 RETURN_VALUE
   
  
inplace(list_a, list_b)
実行時間: 0.000285
id(list_a): 5530614960 -> 5530614960
------ dis.dis(inplace)  ------
 44           0 LOAD_FAST                0 (list_a)
              3 LOAD_FAST                1 (list_b)
              6 INPLACE_ADD         
              7 STORE_FAST               0 (list_a)

 45          10 LOAD_FAST                0 (list_a)
             13 RETURN_VALUE        

```

|   | add | inplace | 結果 |
|---|-----|---------|-----|
| 実行時間 | 0.000458 | 0.000285 | inplaceの方が早い |
| バイトコードの差 | BINARY_ADD | INPLACE_ADD | バイトコードでも変化していることが確認できる |
| id(list_a) | 変化あり | 変化なし | addは新しいオブジェクトとして生成されていて、inplaceは同じオブジェクトに値が代入されている。 |

* どうやらaddの方は新しいオブジェクトのためのメモリ領域を確保しなければならない分、遅くなっているようだ。
* 差は微々たるものだが、内部の動作を意識すると メモリ・実行速度の観点で A+=B を利用したほうが良さそうだと思った。

# モチベーション
両者の内部的な動きを意識したことがなかったので自分なりに調査してみた。
「どっちでも一緒やろ！」と思っていた自分が恥ずかしい限り・・・こういった部分まで理解していく姿勢を身につけねばと思い始めた今日この頃です。
DNF2のリリースを読んでみた

Fedora22以降で採用されるらしい新しいRH/CentOS系のパッケージ管理システムDNF。
最近CentOS7を試してることもあり、本やらqiitaやらでいろいろ調べてましたが、公式見たらver2(DNF2)がリリースされていたらしい。
また、後でもう一回変更点を見るのもアレなので覚え書き。

http://dnf.baseurl.org/2016/12/20/dnf-2-0-0-and-dnf-plugins-core-1-0-0-has-been-released/

・よりわかりやすくなった依存性問題のレポート
・弱い依存関係がサマリーで表示される
・repoquery PluginはDNF本体に含まれるようになった
・60以上のバグを修正
・より直感的なヘルプ生成、etc

・yumとの互換性(include, includepkg, exclude)を
扱えるように改良中
ただし、
(いろいろ頑張りすぎて)DNF1との完全な
互換性が(まだ)ない
とも書いてある。

DNF1とDNF2の違いは
http://dnf.readthedocs.io/en/latest/dnf-1_vs_dnf-2.html
によると、
1. Groupinstallのオプション「with-optional」が「--with-optional」になった
2. dnf.confの設定に使う、「include」オプション、「exclude」オプションはそれぞれ「includepkgs」、「excludepkgs」に置き換わった

細かい中身がよくわかってないので
実際に動かしたらまた追記します。
Androidエラー(Execution failed for task ':app:buildInfoDebugLoader')

android studioを触っている最中に謎のエラーが出たのでメモ。

###エラー内容

```
Error:Execution failed for task ':app:buildInfoDebugLoader'.
> Exception while doing past iteration backup 
```


###対応方法
下記で出なくなりました。

```
Build -> Rebuild Project
```
pythonでposixメッセージキューを扱う

## 概要

* Unix系のプロセス間通信などで使用するposixメッセージキューをpythonで扱う
* posix_ipcモジュールを使ってプロセス間通信を行う

## 手順

* pipでposix_ipcをインストールします

```bash
$ sudo pip install posix_ipc
```

* posix_ipcモジュールのMessageQueueクラスを使うことでposixキューの各操作ができます

## 実装

* 送信側

```py

#!/usr/local/env python
# -*- coding: utf-8 -*-

import json
import posix_ipc
import time

if __name__ == "__main__":
    posix_ipc.unlink_message_queue("/queue_name")

    mq = posix_ipc.MessageQueue("/queue_name", posix_ipc.O_CREX)
    counter = 0
    while True:
        counter += 1

        # sendでエンキュー, str, unicodeを送信
        mq.send(json.dumps({"loop_count": counter}))
        print "queue: %d" % counter
        time.sleep(1.0)

    posix_ipc.unlink_message_queue("/queue_name")

```

* 受信側

```py
#!/usr/local/env python
# -*- coding: utf-8 -*-

import json
import posix_ipc
import time

if __name__ == "__main__":
    mq = posix_ipc.MessageQueue("/queue_name")
    while True:
        msg = mq.receive()
        print json.loads(msg[0])
        time.sleep(0.5)
```

* キューの名前は/から始める必要があり、複数の/を含めることはできない(階層構造にはできない
* メッセージキューの最大メッセージ数はデフォルトでは10
「iTerm2でzsh補完するときディレクトリが真っ青で見にくいよ問題」を解決する方法

# はじめに
どうゆう問題かというと、以下のようなものです。
（lsを実行）
![スクリーンショット 2017-02-14 0.13.45.png](https://qiita-image-store.s3.amazonaws.com/0/140792/5945c195-fc87-04d8-4bfa-2bcf1dd20fba.png)


(zshの補完機能を利用する)
![スクリーンショット 2017-02-14 0.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/140792/ad29febc-7b80-5b01-87b3-8218b9becf7a.png)


つまり、**lsコマンドを叩いた時には以下のように見やすい色でディレクトリが表示されるのに補完機能を使うと色が真っ青で見えにくくなるというものです。**

ターミナルの色を変えるために以下のような設定をしている場合があると思うのですが、なぜか補完機能を使うときだけ真っ青になるという状態になっていました。

``` file:.zshrc
export LSCOLORS=cxfxcxdxbxegedabagacad
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
alias ls="ls -G"
```

今回はiTerm2自身の色を設定を変更することでこの問題を解決する方法を説明します。

# iTerm2のテーマ変更方法

「iTerm2 -> Preference (command + ,) -> Profiles -> Colors」でiTerm2の色を変更することができます。
![スクリーンショット 2017-02-14 0.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/140792/af6fb0e4-b5ed-b80b-1a20-13fca001aa6f.png)


例えば、Backgroundの部分の色を変更するとそれがターミナルに反映されます。

![スクリーンショット 2017-02-14 0.19.02.png](https://qiita-image-store.s3.amazonaws.com/0/140792/d152db4f-3f3b-d0e1-1291-b3a480886521.png)


また、変更した色の設定は`.itermcolors`という形式のファイル名で保存することで、エクスポートやインポートが可能です。

おすすめとしては、**ゼロから色の設定をするのは面倒なので、gistなどから自分の気に入ったitermcolorsをインポートし、色を調整するという方法がいいと思います。**

今回はHybrid.itermcolorsというテーマを取ってきました。
https://gist.github.com/luan/6362811

これをローカルに保存し、先ほどの画面の右下にある「Color Presets... 」ということろに「import...」という項目があるのでそこからテーマをインポートします。
そして、微調整をしていきます。(例えば、背景を黒にしたければ、Backgroundのところを黒色に設定すればiTerm2の背景が黒くなります。)
さらに、微調整が終わったテーマをエクスポートすればオリジナルのiTerm2のテーマが出来上がります。

以上の手順で真っ青になる問題を解決することができました。

（テーマ変更後）
![スクリーンショット 2017-02-14 0.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/140792/13c45f05-12cf-881d-8654-983aba369014.png)






# 参考
- [【iTerm2 + zsh】色設定をする](http://yuk.hatenablog.com/entry/2014/09/23/072648)
Xamarin Studio で、プロジェクトファイル毎に packages.config を変える方法

同一ディレクトリにあるプロジェクトで、それぞれ nuget packages の構成を変えたい場合があります。

デバッグ用とリリース用のプロジェクトを分けていて、デバッグ用にのみ必要な nuget パッケージを使っている、とか。

```
MyAwesomeApp_debug.csproj    <-- Debugログ収集用の nuget パッケージを使っている
MyAwesomeApp_release.csproj  <-- そんなものは必要ない
```

ライブラリをデバッグしながらアプリを実行したい場合と、アプリだけで実行したい場合、とか。

```
MyAwesomeApp.csproj           <-- アプリ単体のプロジェクト（lib は nuget から得る)
MyAwesomeApp_with_lib.csproj  <-- lib をアプリからデバッグしたい時のプロジェクト(lib はプロジェクト参照でソースが提供されるので nuget 要らない)
```

私がやりたかったのは後者で、 [Xamarin.Forms.GoogleMaps](https://github.com/amay077/Xamarin.Forms.GoogleMaps) のサンプルプロジェクトは、

* サンプルのみ利用したい人（普通はこっち）は、 XF.GoogleMaps は nuget から読み込ませたい
* 開発に参加する人は、XF.GoogleMaps はプロジェクト参照で読み込ませたい

という２つのニーズがあります。

通常、 プロジェクトで使用する nuget パッケージは、``xxx.csproj`` と同じディレクトリにある ``packages.config`` というファイルで管理されます。

ところが上記のような同じディレクトリ内に複数のプロジェクトがある場合、どちらも ``packages.config`` を参照してしまいます。

なにか良い手はないかなーと探していたら、ありました。

* [visual studio 2013 - Changing packages.config to somethingelse.config - Stack Overflow](http://stackoverflow.com/a/34513284/3309589)

どうやらですね、 ``packages.config`` は、 ``packages.プロジェクト名.config`` というファイル名に変えると、その ``.csproj`` のためだけの nuget パッケージ設定ファイルになる模様。

さっそく、サンプルプロジェクトに [適用しました](https://github.com/amay077/Xamarin.Forms.GoogleMaps/tree/master/XFGoogleMapSample/XFGoogleMapSample)。

![](http://blog.amay077.net/assets/images/posts/how_to_make_packages_config_for_each_projects_01.png)

プロジェクトは ``XFGoogleMapSample.csproj`` と ``XFGoogleMapSample.local.csproj`` があるので、それにあわせて ``packages.XFGoogleMapSample.config`` と ``packages.XFGoogleMapSample.local.config`` を用意しました。(``packages.config`` は消しました。)

２つのプロジェクトをそれぞれ含む２つのソリューションを開いてみると、

![](http://blog.amay077.net/assets/images/posts/how_to_make_packages_config_for_each_projects_02.png)

このように、 ``XFGoogleMapSample.local.csproj`` の方は、 ``Xamarin.Forms.GoogleMaps`` が Packages にないのがわかります。

このように、 ``packages.[projectname].config`` とすると、プロジェクト固有の nuget 設定ファイルにすることができます。（このケースでも ``packages.config`` が存在しているとそちらが優先されてしまうようです。）

この構成で、 Xamarin Studio、 Visual Studio for Mac, Visual Studio ２０１５ で問題なく読み込めましたし、 [Bitrise](https://www.bitrise.io/) という CI サービスでも使えたので、実用には問題なさそうです。
Site Reliability Engineering(SRE)を読む

# 概要
下記にWEB上で公開されている
http://landing.google.com/sre/book/index.html

# 内容
- Table of Contents 目次
- Foreword 序文
- Preface 序文

# Part I - Introduction
- Chapter 1 - Introduction　導入
- Chapter 2 - The Production Environment at Google, from the Viewpoint of an SRE  
  SRE視点からのGoogleの本番環境


# Part II - Principles 原則
- Chapter 3 - Embracing Risk　リスクを受け入れる
- Chapter 4 - Service Level Objectives　サービスレベル目標
- Chapter 5 - Eliminating Toil　骨折り損をなくす
- Chapter 6 - Monitoring Distributed Systems　分散システムの監視
- Chapter 7 - The Evolution of Automation at Google　グーグルにおける自動化の進化
- Chapter 8 - Release Engineering　リリースエンジニアリング
- Chapter 9 - Simplicity　シンプルさ

# Part III - Practices 実践
- Chapter 10 - Practical Alerting 実践的な警告
- Chapter 11 - Being On-Call　オンコールになる
- Chapter 12 - Effective Troubleshooting 効果的なトラブルシューティング
- Chapter 13 - Emergency Response 緊急対応
- Chapter 14 - Managing Incidents インシデントの管理
- Chapter 15 - Postmortem Culture: Learning from Failure 死後の文化：失敗から学ぶ
- Chapter 16 - Tracking Outages トラッキングの停止
- Chapter 17 - Testing for Reliability 信頼性のテスト
- Chapter 18 - Software Engineering in SRE SREにおけるソフトウェアエンジニアリング
- Chapter 19 - Load Balancing at the Frontend フロントエンドでの負荷分散
- Chapter 20 - Load Balancing in the Datacenter データセンターでの負荷分散
- Chapter 21 - Handling Overload 過負荷の処理
- Chapter 22 - Addressing Cascading Failures カスケード障害の解決
- Chapter 23 - Managing Critical State: Distributed Consensus for Reliability クリティカルステートの管理：信頼性のための分散コンセンサス
- Chapter 24 - Distributed Periodic Scheduling with Cron Cronによる分散型定期スケジュール
- Chapter 25 - Data Processing Pipelines データ処理パイプライン
- Chapter 26 - Data Integrity: What You Read Is What You Wrote データの完全性：あなたが読んだことはあなたが書いたものです
- Chapter 27 - Reliable Product Launches at Scale 信頼できる製品のスケールでのローンチ

# Part IV - Management
- Chapter 28 - Accelerating SREs to On-Call and Beyond　SREのオンコールへの加速と超越
- Chapter 29 - Dealing with Interrupts　割り込み処理
- Chapter 30 - Embedding an SRE to Recover from Operational Overload　運用の過負荷から回復するためのSREの組み込み
- Chapter 31 - Communication and Collaboration in SRE　SREにおけるコミュニケーションとコラボレーション
- Chapter 32 - The Evolving SRE Engagement Model　進化するAREエンゲージメントモデル

# Part V - Conclusions
- Chapter 33 - Lessons Learned from Other Industries　他の産業から学んだ教訓
- Chapter 34 - Conclusion　結論

# 付録
- Appendix A - Availability Table
- Appendix B - A Collection of Best Practices for Production Services
- Appendix C - Example Incident State Document
- Appendix D - Example Postmortem
- Appendix E - Launch Coordination Checklist
- Appendix F - Bibliography
git lfsを使ったリポジトリのwebhook

大規模案件でgitlfsをつかうべー
Macとwindowsのsorcetreeで動作確認出来たから、案件使おうとhooks設定した。

でも、centosで該当リポジトリかローカルプルするという単純なことができない。

git pull
git lfs pull
だとエラーでるんだよなー。

これもしかしてcentosにはgitifsを入れなければいい話なわけ？
proxy環境下でpm2モジュールのインストール

Node.jsのプロセス管理ツールである[pm2](https://www.npmjs.com/package/pm2)はモジュールを追加することで様々な機能を追加できますが、モジュールを追加する```pm2 install```がproxy環境下ではうまく動作しなかったのでなんとかインストールした際のメモです。
## npm, gitのproxy設定ではうまくいかず…
pm2のモジュールインストールコマンド```pm2 install```は、どうせ内部ではnpmやgitを使っているんだろうと思ってnpmrcやgitconfig、http_proxy環境変数にproxyを設定してみました。…が、うまく接続できませんでした。
## ローカルからのインストール
[公式のドキュメント](http://pm2.keymetrics.io/docs/advanced/pm2-module-system/)にはローカルフォルダからインストールする方法が書いてあるので、こちらを試したところ、うまくインストールできました。たとえば、pm2のログローテートを実現するモジュール```pm2-logrotate```をインストールする場合は以下の通りです。

```bash
$ # gitのproxy設定（必要ならば）
$ git config --global http.proxy http://プロキシ名:ポート番号
$ git config --global https.proxy http://プロキシ名:ポート番号
$ git config --global url."https://".insteadOf git://
$ # pm2モジュールの取得
$ git clone https://github.com/pm2-hive/pm2-logrotate.git
$ # インストール
$ cd pm2-logrotate
$ npm install
$ pm2 install .
```
なお、```git clone```後に```npm install```を忘れたら「pmxが無い」と怒られてしまいました。
また、ドキュメントには"Install a module in dev mode from local folder"と書いてあり、```pm2 install```した場合との違いは調べ切れておりません。すみません。
今頃Apache Solrインストールon bash on windows

# 何をしたいか

全文検索Apache Solrの威力を試したいが、 WindowsマシンにVMを立てたり、JavaやJettyもろもろをWindows上にばらばら入れたくない。

# Bash on WindowsにApache Solrを入れてみる

途中までは下記サイトの亜流で頑張る。
https://www.digitalocean.com/community/tutorials/how-to-install-solr-on-ubuntu-14-04

記述によれば、ubuntuにsolrをインストールする場合に選べるパッケージは３種類。

* solr-common
* solr-jetty
* solr-tomcat

私見でtomcatよりjettyが軽いというイメージがあったので、
solr-jettyを選択した。

```
sudo apt install solr-jetty
```
 
３分ほどかけて１００個位のパッケージをインストール完了。

jettyは生インストール状態なので、他のホストからアクセスできるように設定する。

```
sudo vi /etc/default/jetty
```

```
#jetty起動を許可する文
NO_START=0
#jettyを他のホストからアクセス可能にする文
JETTY_HOST=0.0.0.0
```

下記コマンドでjettyを起動してみる。

```
sudo /etc/init.d/jetty start
```

# ちょっとひっかかるjettyのJSP

これだとERROR505が出る。

```
HTTP ERROR 500
Problem accessing /solr/index.jsp. Reason:
JSP support not configured
Powered by Jetty://
```

すでにこのバグは対応済みらしく
https://github.com/ckan/ckan/pull/2966

下記コマンドで必要なパッケージをインストールすれば回避できた。

```
wget https://launchpad.net/~vshn/+archive/ubuntu/solr/+files/solr-jetty-jsp-fix_1.0.2_all.deb
dpkg -i solr-jetty-jsp-fix_1.0.2_all.deb
```

# 実行結果

http://localhost:8080/solrにアクセス。

起動画面
![2017-02-13.png](https://qiita-image-store.s3.amazonaws.com/0/96277/8370e81d-59a2-f837-8c7d-e8b3f8ed84fc.png)

検索実行画面（何もデータがないため検索結果はなし）
![2017-02-13 (1).png](https://qiita-image-store.s3.amazonaws.com/0/96277/f64b963e-2040-748f-a4cc-224da2c688e7.png)

# そして最後に残念なお話

Apache Solrは2017/01現在、6.4.1がダウンロードできるとのことです。
http://lucene.apache.org/solr/

さて問題です。
今回インストールできたバージョンはいくつでしょうか。

【答え】
Solr Specification Version: 3.6.2.2013.12.15.17.23.54

Solr Implementation Version: 3.6.2 debian - buildd - 2013-12-15 17:23:54

３年以上前・・・

![2017-02-15.png](https://qiita-image-store.s3.amazonaws.com/0/96277/e1dbdb5b-d0ce-6e45-41de-c943154b046e.png)


ということで、やってみました、ということでした。
VisualStudioを快適に操作する作業スペースを確保するためのTips

## 前置き

会社で提供されているモニターの解像度が低く、どうにか作業スペースを確保しようと思ったことがきっかけ。

## 環境
Visual Studio 2015

## 横幅の確保

### フォントを小さくする
実践していて使用に耐えうる現実的なラインのフォントサイズ。
* フォント：Consolas
* サイズ：10 or 9

### 行番号
オプション→テキストエディタ→各言語→行番号
今までなんとなく表示してきたけどあんまり役に立ったことがない。
Unityのコンソールに表示されるスタックトレースの行番号に行きたい場合、Ctrl-gで行番号に直接ジャンプするほうが早い。

### インジケーターマージン
オプション→テキストエディタ→表示→インジケーターマージン
ブレークポイントをクリックで配置できなくなる。
ショートカットでばんばん配置可能なので非表示で問題なし。

### マージン
オプション→テキストエディタ→表示→マージン
変更した行の表示を行うスペースだった場所。
gitと同期しているわけではなかったので、「あ、ここらへん最近更新したのね」がわかる程度の代物。
どのみち別途差分確認は行うはずなので不要。

### タブを片方にまとめて「自動的に隠す」ようにする
タブを片方にまとめることでたたんだときのスペースを削減することができる。
横も下も常にタブはたたんでおく。
もちろんソリューションエクスプローラーも例外ではない。
みんなソリューションエクスプローラーだけは後生大事に右か左かに配置しているけど、常に画面に表示しないといけないほど使ってる？

## 縦幅の確保

### ツールバー
ツールバーが許されるのは小学生までだよねー
おかんの使ってるブラウザみたいになんか表示されてるけどそのまま～みたいな人はおかん化してきてるので注意（そんなことはありません）

### ステータスバー
コードを書く上で必要な情報は特にないので非表示にしてよし。

### ナビゲーションバー
目的の関数の定義にすぐ飛ぶことができる。
使用頻度の関係から画面から非表示にした。
こいつが常に一覧表示されるウィンドウがあったら１００％使うのに。

### 全画面表示
タイトルバーの幅だけ広くできる。
時と場合によりけり。

### 水平スクロールバー
これも使う機会が少ないので非表示にしている。

### Hide Main Menu
メインメニューを非表示にできる拡張機能。
Altキーを押すことで一時的に表示できる。
メインメニューが常に表示されていないと作業にならない人以外は導入を考えてもよいかも。
GearVRのアプリ開発時にエディタで視点移動をしたい

GearVRのアプリをUnityで開発していると、エディタでの実行時にHMDの回転をしたくなる時がある。

このような場合、開発に使うPCにOculusなどのHMDが接続されていればそこで回転などをエディタ内でもテストできる。
ただし出先での開発だったり、開発機がMacだったりなど色々な理由でHMDが使えない場合がある。

# 解決策: MouseLookのスクリプトを使う

ということでMouseでの操作で視点を回転できるようにする。以前はFirstPersonControllerなどに付属するスクリプトもあったが全く同等のものがStandardAssetには無かったので下記のスクリプトを使った。

http://wiki.unity3d.com/index.php/SmoothMouseLook

かつ、このままでGearVRなどのHMDで実行した時にもマウスに反応する処理が残ってしまう。そこで下記のスクリプトを使い、VR実行時は該当のスクリプトを無効にするようにした。

```DebugHelper.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.VR;

public class DebugHelper : MonoBehaviour {

	public MonoBehaviour targetComponent; //アタッチしたSmoothMouseLookのスクリプトをアタッチする

	// Use this for initialization
	void Start () {
		if (VRSettings.enabled) {
			this.targetComponent.enabled = false;
		}
	}
}
```

上記の２つのスクリプトをメインのカメラに下記のようにアタッチしている。(インスペクタ上でSmoothMouseLookのスクリプトをDebugHelperのTargetComponentの所へドラッグしてドロップ)

<img width="352" alt="Unity_5_6_0b3__64bit__-_main_unity_-_VR-TileGolf_-_Android__OpenGL_4_1_.png" src="https://qiita-image-store.s3.amazonaws.com/0/10032/4ff2744b-03d6-8f9b-af00-f9d6bbdb730a.png">


# 結果

まだ潜在的な問題もありそうだが、ひとまず動いている。
結果的にPC向けのビルドも簡単に作れるようになった。(PlayerSettingでVR Supportをオフにするだけ)

![ScreenFlow.gif](https://qiita-image-store.s3.amazonaws.com/0/10032/59e283bd-10da-e7dd-fc70-7c46bfcf2f71.gif)
Windows10へAutoHotkeyの導入（キーマップの変更）

Windows10へAutoHotkeyを入れて、キーマップを変更して、誤変換や誤打を解消した

#できること
* キーの位置を入れ替えたり、ショートカットを作れたりします
* 無変換を押したらALTとか、CapsLockを押したらCtrlとか
* 特殊ショートカットの登録ができます（Windows + Hで秀丸起動とか)
* 簡単なスクリプトを書く事で連続する処理とかも書ける（らしい）
* https://ja.wikipedia.org/wiki/AutoHotkey

#経緯
* キーボードを変更したら、スペースキーのサイズが違うため、誤って使わない変換や無変換キーを押下するようになってしまった

#インストール
* https://autohotkey.com/
* Downloadからダウンロード　私はDownload AutoHotkey Installerからインストーラーをダウンロードしました
* インストーラーを起動して完了
* 他マニュアルサイトでは、ウィザードが立ち上がるみたいに書いてましたが、なぜかHelpだけ立ち上がりました

#スクリプトの作成
* メモ帳（好みの）にてファイルを作成
* スクリプトを記述（1ファイルに複数記述してOK)
* 保存（好きな場所へ、〇〇〇.ahk）
* 保存した〇〇〇.ahkをダブルクリック
    * 初回インストール時は、設定画面が出ます。
    * 私は64bit、起動時に強制的に起動するように設定
* 以上でショートカットなり、設定したものが使えるようになります

#スクリプトの書き方

```
; <- 先頭セミコロンはコメント
#h <- Windows + hキー（# == Windows)
/* この範囲はコメント扱い */
トリガー::処理 /*::以降が処理となる*/
```

#私の設定したスクリプト
```
;;;秀丸の起動 win + h
#h::Run, C:\Program Files (x86)\Hidemaru\Hidemaru.exe
;;;変換をkanaへ変更
vk1Csc079::vkF2sc070
;;;無変換をaltへ変更
vk1Dsc07B::Alt
;;;capslockをctrlへ変更
CapsLock::Ctrl
sc03a::Ctrl
```

#参考サイト
* https://sites.google.com/site/autohotkeyjp/
    * 仕様が詳しく記載されている
    * https://sites.google.com/site/autohotkeyjp/reference/KeyList
        * KeyのListが載っているのでこちらを参考にキー設定を行った
* http://ch.nicovideo.jp/Jinsichi/blomaga/ar455334
CentOS7でSPFチェック機能導入  Postfix pypolicyd-spf で動作させるとメールが届かなくなる


既にPostfixは正常にメールの送受信ができる状態から始めます。

yum install pypolicyd-spf
でpypolicyd-spfを導入

いきなりSPF認証されてないメールを弾くのもアレなんで
認証結果をメールヘッダに追加するだけの設定にする。

```/etc/python-policyd-spf/policyd-spf.conf
Mail_From_reject = False
```

あとはPostfixのmain.cfやmaster.cfを適宜編集
http://qiita.com/dumpty-alma@github/items/b89ef0ca4801034558b3
を参考にさせて頂きました。

そしてPostfixを再起動し、外部からメールを送ってみる。
、、、、こない。
別のメールアカウントからも送ってみる。
、、、、、、こない。

SPF認証できないメールを弾くような設定もしていないし
そもそも送信に使ったメールアカウントはSPF認証対応済みだし
なんで？ってことでPostfixのSPF連携を解除して同じくメール送信。
、、、届いた。

とりあえずログを見てみる。

```

Feb 11 17:36:39 www policyd-spf6490: Traceback (most recent call last):
Feb 11 17:36:39 www policyd-spf6490: File "/usr/libexec/postfix/policyd-spf", line 700, in <module>
Feb 11 17:36:39 www policyd-spf6490: instance_dict, configData, peruser)
Feb 11 17:36:39 www policyd-spf6490: File "/usr/libexec/postfix/policyd-spf", line 412, in _spfcheck
Feb 11 17:36:39 www policyd-spf6490: res = spf.check2(ip, helo_fake_sender, helo, querytime=configData.get('Lookup_Time'))
Feb 11 17:36:39 www policyd-spf6490: File "/usr/lib/python2.7/site-packages/spf.py", line 297, in check2
Feb 11 17:36:39 www policyd-spf6490: receiver=receiver,timeout=timeout,verbose=verbose,querytime=querytime).check()
Feb 11 17:36:39 www policyd-spf6490: File "/usr/lib/python2.7/site-packages/spf.py", line 378, in init
Feb 11 17:36:39 www policyd-spf6490: self.set_ip(i)
Feb 11 17:36:39 www policyd-spf6490: File "/usr/lib/python2.7/site-packages/spf.py", line 405, in set_ip
Feb 11 17:36:39 www policyd-spf6490: self.ipaddr = ipaddress.ip_address(i)
Feb 11 17:36:39 www policyd-spf6490: File "/usr/lib/python2.7/site-packages/ipaddress.py", line 163, in ip_address
Feb 11 17:36:39 www policyd-spf6490: ' a unicode object?' % address)
Feb 11 17:36:39 www policyd-spf6490: AddressValueError: 'xxx.xxx.xxx.xxx' does not appear to be an IPv4 or IPv6 address. Did you pass in a bytes (str in Python 2) instead of a unicode object?
Feb 11 17:36:39 www postfix/spawn6488: warning: command /usr/bin/python exit status 1

```

なんかエラーが出とる。

https://bugs.centos.org/view.php?id=12393&nbn=2


CentOS7のバグっぽい、ステータスを見るとまだ治って無さそう。

2017年11月22日追記
https://bugs.centos.org/view.php?id=12393&nbn=2
を見るとステータスは変わってないけどコメントにこの問題は解決しリポジトリにも登録っぽいことが書いてある。
自前サーバは自動的にupdateするようになっているのでspfのパッケージのバージョンを確認
対処版になっているようだ。
spf機能をONにしてメールをサーバに送信
ログ出力に
www policyd-spf[6007]: Pass;
が出力されているのを確認、受信メールのヘッダにも
Received-SPF: Pass (sender SPF authorized)
がついているのを確認した。
どうやらほぼ1年ぶりに治ったようです。
GroovyのURL#getTextや#getBytesでヘッダなどを設定する方法

　Groovyでは、URLクラスを使って簡単にファイルをダウンロードできたり、Web APIのレスポンスをテキストファイルとして保存できたりします。

　このようにです。

```groovy:
new File(imageName) << new URL(imageUrl).getBytes()
new File(tempName) << new URL(url).getText()
```

　さて、これらのメソッドでヘッダなどの設定はできないのでしょうか？

　実は`URL#getText`と`URL#getBytes`には次の`Map`を引数にとるオーバーロードがあります。

* [URL#getBytes(java.util.Map)](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/net/URL.html#getBytes(java.util.Map))
* [URL#getText(java.util.Map)](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/net/URL.html#getText(java.util.Map))

　それぞれのドキュメントによると、`Map`の要素として次のものが有効なようです。

```
connectTimeout : the connection timeout
readTimeout : the read timeout
useCaches : set the use cache property for the URL connection
allowUserInteraction : set the user interaction flag for the URL connection
requestProperties : a map of properties to be passed to the URL connection
```

　この部分の[コード](https://github.com/groovy/groovy-core/blob/01309f9d4be34ddf93c4a9943b5a97843bff6181/src/main/org/codehaus/groovy/runtime/ResourceGroovyMethods.java#L2029)を見てみます。

　`requestProperties`で渡したMapは、[URL#getBytes(java.util.Map)](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/net/URL.html#getBytes(java.util.Map)) or [URL#getText(java.util.Map)](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/net/URL.html#getText(java.util.Map))の内部で生成している`URLConnection`の`setRequestProperty`の呼び出しに使われます。

　次のコードは`UserAgent`と`Accept-Language`を設定して、`URL#getText(java.util.Map)`を呼び出すコードです。

```groovy:
new File(tempName) << new URL(url).getText(requestProperties: [
    "UserAgent": "YOUR USER AGENT",
    "Accept-Language", "jp"
])
```

* 参考 : [Groovy Goodness: Use Connection Parameters to Get Text From URL](http://mrhaki.blogspot.jp/2011/09/groovy-goodness-use-connection.html)
circuits.ioでLチカしてみた

# circuits.ioでLチカしてみた

https://circuits.io/
このサイトで回路を作ってたら脳汁が出まくりだったのでメモ。

## 準備

- circuits.ioでアカウントを作成し、新しいプロジェクトを作成します。

## 部品を置いてみる

- 「＋Components」を押して、部品を追加する
> とりあえずArduino UNO R3とブレットボードを追加してみる
![lchika_3.png](https://qiita-image-store.s3.amazonaws.com/0/160143/732b39e8-e8f9-9a68-f637-8decfce3d6a4.png)

## 配線していく

> GND　→　ブレッドボード　→　LEDの左ピン
> LEDの右ピン　→　抵抗　→　Arduinoの13ピン
> というように接続していきます。
![lchika_6.png](https://qiita-image-store.s3.amazonaws.com/0/160143/b5c163c9-5578-11e2-7a7c-980d51e77aa7.png)

## プログラムの準備
> Code Editorボタンを押すと、Arduinoのプログラムを編集する事ができます。
> とりあえず今はデフォルトのままで、「Start Simulation」を押しましょう



**クララが立った！！**

LEDが光ってたらうまく動いたという事です。

![lchika_5.png](https://qiita-image-store.s3.amazonaws.com/0/160143/6b2f88e2-e3e6-f95c-ad81-26643c28dbe0.png)

## 感想
電子ブロックにあこがれた世代からすると、WEB上でこんなに簡単に電子実験ができるなんて・・と感慨深いです。
プログラムを覚えたい人は、最初はこれくらい直観的な環境でLチカをコントロールする所から始めるのも
いいんじゃないでしょうか。
とりあえず、お手本を何種類か用意して、早押しゲームみたいな回路を子供と作ってみようかと思ってます。

↓上で使用したデフォルトコードを載せておきます
プログラムを見て、どのようにLEDが光るか想像してみてください。

```c:arduinoデフォルトコード
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
```
Unityで簡単な計算ゲームを実装してリリースまでした話

## 概要

Unityの練習として簡単な計算ゲームをリリースしたので

その過程をメモしておきます

だいぶ前の話を書いているので

細かいところは変わっているだろうし

記憶があいまいなところがあるかもですが

ご容赦くださいませ



## 作ったアプリとその仕様

下記が作成したアプリです


[CalcPower](https://itunes.apple.com/jp/app/calcpower-train-your-computing/id1101739888?mt=8)

### 仕様

* 制限時間内に足し算、引き算、掛け算をどれだけこなせるかをスコアで競う
* スコアはツイッターとゲームセンター（iOSのみ）でシェアできる

以上。シンプルです。


## 実装

### ボタンについて

ボタンの実装にはいくつか方法がありますが　（あとから知った）

今回はmainCameraに下記プログラムを書いたクラスを追加して実装しました

```csharp

void Update () {
	if(Input.GetKeyDown (KeyCode.Mouse0)) {
		Vector3    aTapPoint   = amera.main.ScreenToWorldPoint(Input.mousePosition);
		Collider2D aCollider2d = Physics2D.OverlapPoint(aTapPoint, enablelayer);

		if (aCollider2d) {
			tapped_obj = aCollider2d.transform.gameObject;
			if (tapped_obj.tag == "num" || tapped_obj.tag == "back" || tapped_obj.tag == "rank" || tapped_obj.tag == "twitter") {
				tapped_obj.SendMessage ("tapped");
				}
		}
			
	}
	if(Input.GetKeyUp (KeyCode.Mouse0)) {
		if (tapped_obj.tag  == "num") {
			tapped_obj.SendMessage ("untapped");
		}
	}
}
```

簡単に説明すると

どこでもいいので画面がタップされたら最初のif文の中に入り

タップされた座標にあるオブジェクトcolliderを取得してきます

そのcolliderのtag名がnum、backなどだったら

そのオブジェクトに対してtapped関数を実行するようにSendMessageを送る

と言った具合です

逆にnumオブジェクトからアンタップした場合に

untapped関数を実行するようにSendMessageを送ります

### 画面の遷移について

画面の遷移にはシーンの切り替えをしています

ボタンを押すと下記のようにnameのシーンに飛ばします。

```csharp
public void tapped () {
	Application.LoadLevel(name);
}
```

### ツイッターのシェアボタンについて

ツイッターのシェアボタンは下記を使っています。

http://smartgames.hatenablog.com/entry/2016/03/13/165456

コードはこんな感じです。

```csharp
public void tapped () {
	MainSpriteRenderer.sprite = _tapped;
	string text = PlayerPrefs.GetString ("twitter");
	#if UNITY_IOS
	uniTwitterShare (text);
	#elif UNITY_ANDROID
	Application.OpenURL("http://twitter.com/intent/tweet?text=" + WWW.EscapeURL(text));
	#endif
}
```

### ゲームセンターのボタンについて
ゲームセンターは下記を参考に入れてます。
http://qiita.com/yimajo/items/503cb2451e303e9f3841

```csharp
public void tapped () {
	int highScore = PlayerPrefs.GetInt (SceneManager.GetActiveScene().name + "Score");

	Ranking.ReportScore(highScore, "CalcPower_" + SceneManager.GetActiveScene().name);
	Ranking.ShowLeaderboardUI ();
}

```

## テスト

実機にあげてテストします。

あげてみると変な挙動してたりします。

特にUIviewを使おうとしていると

サイズ感がおかしくなって面倒だったので

このアプリでは全て画像になっています


## リリース

大変申し訳ないですが、

大分前なので古くなっていますし、

忘れてしまったので飛ばします。


## 問題点

デザイン的なところは説明などは一切無くしてどの国でも数学の記号は同じということでリリースしていますが

説明文がないので最初はとまどいそうというのがかなり懸念でした

友人にやってみてもらったところ

人によっては結構すぐわかってもらえますが

あまりスマホ慣れしてない人には不親切すぎるUI設計だったようです

もうちょっとUIも考えないとダメですね


## 最後に

とりあえず、これだけ簡単なアプリでもちゃんとApp Storeに置いてもらえるということに

驚いたことを覚えています

審査落ちしてもいいかなくらいの心持ちだったのですが、

一発通過で拍子抜けしました

あと、計算機部分のコードがないじゃないかと思われた方もいるかもしれませんが、

一年近く前に書いたのと、初めてUnityで書いたコードなので

解読に時間がかかりそうなので

もし知りたいと言う人がいれば別記事に書きたいと思います。

では、今回はこんな感じで。次回は二作目を紹介します。