OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7にOpenCVをインストールする



最小限にインストールしてみます。

## 必要なものをインストールする
rootで作業します。
まずはOpenCVのサイトを参考に必要そうなものをインストールします。

```shell-session
$ su -
# yum install -y git gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel
# yum install -y cmake libjpeg-devel libtiff-devel libpng-devel jasper-devel
# yum install -y mesa-libGL-devel libXt-devel libgphoto2-devel nasm libtheora-devel
# yum install -y autoconf automake gcc-c++ libtool yasm openal-devel blas blas-devel atlas atlas-devel lapack lapack-devel
# yum install -y numpy
```

## OpenCVをビルドしてインストールする
githubのソースコードからビルド・インストールします。
このあたりも公式サイト通りです。

```shell-session
# cd /usr/local/src
# git clone https://github.com/opencv/opencv.git
# cd opencv
# mkdir build
# cd build
# cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
# make -j7
# make install
```

共有ライブラリ情報を追加します。

```shell-session
# echo /usr/local/lib > /etc/ld.so.conf.d/opencv.conf
# ldconfig -v
```

## 確認する
ちゃんとインストールできたか確認します。

まずは適当なフリー画像をwgetしておきます。

```shell-session
$ wget http://hogehoge/hogehoge.jpg ./data/w001.jpg
$ ls data/
w001.jpg
```

確認はC++ですることにします。
先ほどダウンロードした画像を読み込み、確認として「画像の高さ」を出力するプログラムです。

```cpp:opencvtest.cpp
#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, const char* argv[]) {
   std::cout << "start -- \n";

   cv::Mat image = cv::imread("data/w001.jpg" , 0);
   if (image.empty()) {
      std::cout << "read error.\n";
      return -1;
   }

   std::cout << image.rows ;

   std::cout << "\nend -- \n";
   return 0;
}
```

コンパイルして実行します。

```shell-session
$ g++ -o opencvtest opencvtest.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lop
encv_core -lopencv_imgcodecs -lopencv_highgui
$ ./opencvtest
start --
1200
end --
```

高さ「1200」なので合っていますね。

インストールだけで疲れたので、続きはまた今度です。

## 参考
http://docs.opencv.org/3.3.0/d7/d9f/tutorial_linux_install.html
http://qiita.com/twaka/items/7555785aea11879d6718
http://nephy.hateblo.jp/entry/2016/09/18/153804
一括でファイル名やフォルダ名を変換する　～PowerShell編～

#ファイル名やフォルダ名を特定の書式で一括変換

``` PowerShell
dir | rename-item -newname { $_.name -replace '([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])','2017-$2-$3' }
```
MEAN.IOを試してみる（インストール編）

普段は完全にPHPerだけどSPAに興味が出てきたのと、他の言語もやってみたい！ ということで、MEAN.IOを試してみた。

## MEANって何？

MongoDb、Express、Angular、NodeJSの頭文字をとって、MEAN。最近LAMPの代わりとして注目されてきている組み合わせです。
利点としては、クライアントからサーバまですべてJavaScriptで記述でき、データのやり取りもすべてJSON形式で行えるということ。

## mean.ioのインストール

[mean.ioのホームページ](http://mean.io/)の通りにやったらよくわからなくなったので、Gitを参考にインストールを行った。

### mean.ioのHP上のインストール方法
```
$ sudo npm install -g mean-cli
$ mean init yourNewApp
```
さらにチュートリアル動画ではWindowsでインストールしていた

```
npm install -g mean-cli
mean init yourNewApp
```

今回試したのは[mean.ioのGit](https://github.com/linnovate/mean)にあるインストール方法~~（でもエラー出るやんけ）~~

### Installing
- `fork` this repo
- `clone` your fork
- `npm install webpack-dev-server rimraf webpack -g` to install required global dependencies
- `npm install` to install all dependencies or yarn
- `npm run server` to start the dev server in another tab

ここまでやってサーバ立ち上げたらエラーが大量に出た。どうも足りないモジュールがあるらしい。
なので1つずつインストールしていく。

```
npm install @angular/cdk --save
```

と思ったらこれだけだった。

再度サーバ立ち上げたら何とか立ち上がった。
TypeScriptとのバージョンの影響かわからないが、まだまだエラーが出ている。
とりあえずは立ち上がった。


## インストールしてみて
インストーラが成熟していないし、ドキュメントもすべて英語で正解とは限らないという、なかなかわくわくする状態みたい。
forkしていろいろいじってみたいと思える楽しいやつだ。


（2017/09/11追記）mean.ioのgitのREADMEがものすごく書き変わっていた。`@angular/cdk`も追加されてたし、少しずつ改善されていっているようだ。
（2017/10/15追記）TypeScriptのバージョンが上がっていることで、使用しているモジュール内にエラーがでまくってビルドできない（無視すれば使えるが）この辺もどうにかできないかなぁ
ラグランジュの未定乗数法

以下の本を参考にラグランジュ未定乗数法の式の意味を再確認したのでまとめる。

<a href="https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%AA%E3%82%89%E5%88%86%E3%81%8B%E3%82%8B%E6%9C%80%E9%81%A9%E5%8C%96%E6%95%B0%E5%AD%A6-%E5%9F%BA%E7%A4%8E%E5%8E%9F%E7%90%86%E3%81%8B%E3%82%89%E8%A8%88%E7%AE%97%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%E9%87%91%E8%B0%B7-%E5%81%A5%E4%B8%80/dp/4320017862/ref=sr_1_1?ie=UTF8&qid=1504395229&sr=8-1&keywords=%E3%81%93%E3%82%8C%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%80%E9%81%A9%E5%8C%96%E6%95%B0%E5%AD%A6"><img width="200" alt="これなら分かる最適化数学―基礎原理から計算手法まで" src="https://qiita-image-store.s3.amazonaws.com/0/200359/822206d1-b8b4-4eaa-5a5e-d3b2ad1359bb.png"></a>

以下のサイトも参考にした。

[ラグランジュの未定乗数法の解説と直感的な証明](http://www.yunabe.jp/docs/lagrange_multiplier.html:title)
##ラグランジュの未定乗数法
等式制約条件$g(x, y) = 0$のもと、ある関数$f(x, y)$を最大化または最小化にする際に用いるのがラグランジュの未定乗数法(Lagrange Multipliers)である。

ここで以下の問題を考える。
$$
a
$$
図で表すと以下のようになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200359/453d9317-fab9-4118-83f5-865f5a8069ac.png)

$x_1 = x, x_2 = y$と書き直すと
これを満たす最適解は
$$
F (x_1,x_2) = f(x_1, x_2) - \lambda g(x_1, x_2)
$$
とおくと、次の式を満たす。
$$
\frac{\partial F}{\partial x\_d}=0 \ (d= 0, 1),  \ \quad \frac{\partial F}{\partial \lambda} = 0
$$
$\lambda$はラグランジュ乗数と呼ぶ。

$\frac{\partial F}{\partial x\_d}=0 \ (d= 0, 1)$ はつまり$\nabla f = \lambda \nabla g$ を意味している。この式は、等高線$f(x, y)$と曲線$g(x, y)=0$の法線ベクトルは平行ということを示している。何故これを満たさなければならないかというと、曲線上で関数$f(x, y)$が極値（最大、最小）を取る点では、その点を通る$f(x, y)$の等高線が曲線に接しているからであり、このことは等高線$f(x, y)$と曲線$g(x, y)=0$の法線ベクトルは平行ということである。

また、 
$$
\frac{\partial F}{\partial \lambda} = 0 \\\
g(x, y) = 0
$$
となり、$\frac{\partial F}{\partial \lambda} = 0$は制約条件そのものを示している。
ラグランジュの未定乗数は、多次元で等式制約が複数個ある時も成り立つ。((詳しくは、これならわかる最適化数学 P76~ 参照))
macOS Sierraでbrewを使ってgccをインストールする際makeで止まる…ように見えるという話。

pcのスペック

- macOS Sierra
- MacBook Air (11-inch, Early 2014)

macにbrewを使ってoctaveをインストールする際に依存ライブラリにgccがあったようでbrewでgccをインストールする処理が走りました。
その時、下記のようにmakeで止まったようになってしまいました。

```terminal
$ brew install gcc
Warning: Building gcc from source:
  The bottle needs the Xcode CLT to be installed.
==> Downloading https://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.xz
Already downloaded: /hogehoge/Library/Caches/Homebrew/gcc-7.2.0.tar.xz
==> Downloading https://raw.githubusercontent.com/Homebrew/formula-patches/e9e0ee09389a54cc4c8fe1c24ebca3cd765ed0ba/gcc/6.1.0-jit.patch
Already downloaded: /hogehoge/Library/Caches/Homebrew/gcc--patch-863957f90a934ee8f89707980473769cff47ca0663c3906992da6afb242fb220.patch
==> Patching
==> Applying 6.1.0-jit.patch
patching file gcc/jit/Make-lang.in
==> ../configure --build=x86_64-apple-darwin16.7.0 --prefix=/usr/local/Cellar/gcc/7.2.0 --libdir=/usr/local/Cellar/gcc/7.2.0/lib/gcc/7 --enable-languages=c,c++,objc,obj-c++,fortran --progr
==> make
```

こちら自宅のpcだけでなく、会社のmac(macbook pro、macOS Sierra)でも発生していました。

会社のPCの場合は、何回かやっていたらなぜかうまくいったのですが、自宅PCだとどうも上手くインストール出来ませんでした。
少し調べていくうちに

https://oku.edu.mie-u.ac.jp/~okumura/macosx/

のHomebrewの項目で、
> JAGS をインストールしようとして brew insall jags すると，2時間ほどかけて280Mほどのgccをまずインストールしてくれた。ただし起動コマンドは gcc-6 なのでシステムのgcc（clang）とぶつからない。gfortran も使える。これがわずらわしい場合は JAGS のサイトのリンクからMac用インストーラをダウンロードする。

という記述を発見。まさか、２時間もかかるのか。

確かに何か実行されているようで、ファンがブンブン回っていたのですが、20分たっても全く表示が変わらないのでなんらかのループにひかかっているのかと思いました…
試しに１時間ほど待ってみたらインストールされました…

なのでタイトルの通り、止まって見えるだけで実行されているので辛抱強く待ちましょうということです。

これがOSに依存する動きなのかは調べていないので詳しくはわからないです。
paizaキャンペーン問題「怪盗813からの挑戦状」を解いてみた

問題を解いたら、抽選でAmazonギフト券とかお肉とかが貰えるとのことで、チャレンジしてみた。
https://paiza.jp/poh/phantom_thief

## 問題
> お宝の場所の情報は怪盗の居る場所を 0, 0 として N 個 のお宝の x, y 座標がメートル単位で書かれています。
各座標間は直線で移動します。0, 0 の位置からスタートし、可能な限り短いルートでお宝を全て盗むルートを出力してください。

## 考え方
原点から一番近い座標を出力して、その座標からまた一番近い座標を出力して…を繰り返せば、短いルートで進めるのでは？と思って、解いてみた。

解答をブログとかに書いてもいいと書いてあったので、以下に掲載。

```java:提出コード
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String firstLine = sc.nextLine().replaceAll(" ","");
        int itemCount = Integer.parseInt(firstLine);
        
        ArrayList<Point> pointList = new ArrayList<Point>();
        
        //標準入力から座標リストを作成する
        for(int i = 0; i < itemCount ; i++){
            String[] line = sc.nextLine().split(" ");
            int x = Integer.parseInt(line[0]);
            int y = Integer.parseInt(line[1]);
            pointList.add(new Point(x,y));
        }
        
        Point originPoint = new Point(0,0);
        while(pointList.size() > 0){
            int minDistance = Integer.MAX_VALUE;
            Point minDistancePoint = new Point();

            //基準点から一番距離の近い座標を座標リストから取得する
            for(Point getPoint : pointList){
                int tmpDistance = getDistance(originPoint,getPoint);
                if(minDistance > tmpDistance){
                    minDistance = tmpDistance;
                    minDistancePoint = getPoint;
                }
            }
            //座標位置を表示する
            minDistancePoint.output();
            //基準点を変更する
            originPoint = minDistancePoint;
            //座標リストから座標を削除する
            int index = pointList.indexOf(minDistancePoint);
            pointList.remove(index);
        }
    }

    //二点の座標間の距離を求める
    public static int getDistance(Point p1, Point p2) {
            double x1 = p1.x;
            double y1 = p1.y;
            double x2 = p2.x;
            double y2 = p2.y;

        double distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
        return (int) distance;
    }

}

//座標クラス
class Point{
    int x;
    int y;
    
    public Point(){
        this.x = 0;
        this.y = 0;
    }
    
    public Point(int x , int y){
        this.x = x;
        this.y = y;
    }
        
    public void output(){
        System.out.println(x + " " + y);
    }
}
```

## 結果
こちら。最適解じゃなかったようだ。
https://paiza.jp/poh/phantom_thief/result/a8a222d8

## 最適解を求めるには？
ちょっと調べたところ、[巡回セールスマン問題](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C)と呼ばれる問題っぽい。
（最初の座標に戻らなくていいので、少し違う？）

今回私が解いた方法は「欲張り法」というアルゴリズムのようだ。

巡回セールスマン問題を解くためのアルゴリズムには「2-opt法」「山登り法」「焼きなまし法」などがあり、これらを使うともっと最適解に近くなるようだけど、難しそうなので諦めた。
C++の簡単なメモリアロケータ実装

# はじめに
ゲーム開発においてメモリ割り当てコストが気になったので検証・勉強もかねて独自のメモリアロケータを実装しました。

# 設計
- メモリ割り当て時間の短縮を重視
- 固定長のメモリブロックをあらかじめ確保しておき、メモリ確保時に適切なブロック領域から割り当てを行う。
- ブロックサイズ8,16,32,64,128,256 (バイト)
- ブロック数各1024個。オーバーしたら自動で拡張
- 257バイト以上は通常のmallocを呼び出す
- 未割当領域のアドレスをスタックで管理を行う。

# 実装

プロジェクト一式
[Github](https://github.com/junmoka/MemoryAllocator)

簡潔に書くとこのような実装方法です。

```cpp
int blockSize = 8;
int blockNum = 1024;
void* memoryPool = new char[blockSize * blockNum];
Stack<void*> unUsedPoolStack;

for(int i = 0; i < blockNum; i++){

    //blockSize(8バイト)ごとにアドレスをStackに詰める
    unUsedPoolStack.push(memoryPool + i * blockSize);
}

void *operator new (size_t size) {
    void* p = nullptr;
    if(size <= 8){
        //Stackからアドレスを取り出し
        p = unUsedPoolStack.top();
        unUsedPoolStack.pop();
    }
    return p;
}

void operator delete (void* p, size_t size) {
    if(size <= 8){
        //使い終わったのでStackにアドレスを追加
        unUsedPoolStack.push(p);
    }
}

```

# 結果
通常のnewと自作のnewでの計測結果
12バイトのクラスを100万個割り当てを行い、それを10回繰り返した平均時間から実行速度割合を算出しました。

newTimeRate:newのみを100万回実行した平均
deleteTimeRate:deleteのみを100万回実行した平均
new/deleteTimeRate:newとdeleteを100万回実行した平均

Debug実行時
newTimeRate:51.1945%
deleteTimeRate:33.0951%
new/deleteTimeRate:43.4589%

Release実行時
newTimeRate:19.1974%
deleteTimeRate:7.625%
new/deleteTimeRate:7.99777%

上記からnewだけ見てもDebug時で2倍、Release時で5倍の速度が出せることがわかり、
200行程度のコードでこれだけ早くなったので満足いく結果になりました！
ただ、std::allocatorは実装していないためSTLにも適応する場合は追加実装が必要です。
JavaScriptで指定したN回分ループする

プログラムを書いていると、ある回数分ループする処理をハードコーディングしたいときってありますよね。

何も考えずに書くと、for文で実装すると思いますが、もう少し簡潔に書けないものかと思って調べました。

## 結論
ES2015のspread operatorを使ってループさせたい回数nの配列を作り、map（またはforEach）を使ってループさせる。

```js
[...Array(5)].map(() => console.log('5回実行'))

// counterが必要な場合
[...Array(5)].map((_, i) => console.log(i))
```

## 議論
ことの発端としては、rubyだとn.times doという書き方ができるのを知っていたので、jsで似たような実装（自前でtimesみたいな関数を作らずに）ができないものか、と思ったことです。

調べてみると、同じような疑問を持った人がいたようです↓
[Is there a mechanism to loop x times in ES6 (ECMAScript 6) without mutable variables?](https://stackoverflow.com/questions/30452263/is-there-a-mechanism-to-loop-x-times-in-es6-ecmascript-6-without-mutable-varia)

多くの回答がありますが、上記で結論としている方法が個人的にわかりやすいと思った方法です。他には、lodashの
 `_.times()`を使う方法や、 `Array(n).fill()`で配列を作る方法などが紹介されていました。
Visual Studio Codeでリモートサーバー上のNodejsをデバッグする

リモート（別サーバーやVagrant）で実行するNodejsのデバッグをVisual Studio Codeで行えるように設定します。

※ここでは
[dockerでVM上にnginx-Nodejs-Mongodbの開発用の雛形を作ってみた](http://qiita.com/Manjiii/items/da61b9781eb491338e35)
をリモートサーバーのサンプルとして使用しています。


#環境
MacOS 10.12.6 (Sierra)
Visual Code Studio:1.15.1 (1.15.1)
Nodejs:7.10.1
npm:4.2.0

#下準備
- Visual Studio Codeをインストール済みであること。
[Download Visual Studio Code](https://code.visualstudio.com/download)
- デバックしたいNodejsが稼働していること。
- 対象サーバーの下記で設定するデバッグ用のポートが開放されていること。


 


#デバッグの設定

#Nodejsのデバッグ設定

(2017/09/17追記・編集)
Nodejsのデバッグ設定は(ほんの少し詳しくして)下記に移動しました。
[nodeのデバッグ実行を有効にしてforeverで稼働する](http://qiita.com/Manjiii/items/9900a26cc8dd51c1614e)



#Visual Studio Codeのデバッグ設定

##Visual Studio Codeで対象ディレクトリを開く
ツールバー上の「ファイル」→「開く…」を選択し、サーバー上で稼働しているデバッグしたいNodejsと同じソースが置いてあるローカル上のディレクトリを開きます。


##デバッグ設定を追加する
ツールバー上の「表示」→「デバッグ」（もしくはサイドバー内の虫のアイコン）を選択してデバッグ表示にします。

「デバッグ」→「構成の追加」（もしくはサイドバー内の歯車アイコン）を選択して表示される入力フォームにDoc..と入力して
、「Docker: Attach」を選択すると自動的に.vscode/launch.json作成されます。
※後で編集できるので違ったものを選択しても問題ありません。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/48552/cc2e4467-b338-83e2-624b-714afd10b9e1.png)




##launch.jsonの編集
作成されたlaunch.jsonを以下を参考に編集します。

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "attach",
            "name": "Attach to Process", //<- 自分のわかりやすい名前
            "port": 9229,　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//<- デバッガがlistenしているポート
            "address": "192.168.33.10",  //<- デバッガが稼働しているサーバーのIP
            "localRoot": "${workspaceRoot}", 
            "remoteRoot": null
        }
    ]
}
```

#デバッグの確認

##デバッグの実行

デバッグ画面のサイドバー内上部に表示されているデバッグ再生ボタンの横のプルダウンが上記でつけた名前が選択されていることを確認して再生ボタンを押します。
正常に開始されるとデバッグ用のボタンが上部に表示され、下部のステータスバーが赤くなります。


![10.png](https://qiita-image-store.s3.amazonaws.com/0/48552/6e4ac41d-23b1-785a-cdd6-7429a125826b.png)




##ブレークポイントのテスト
適当な箇所にブレークポイントを設定します。


![11.png](https://qiita-image-store.s3.amazonaws.com/0/48552/cc9d984e-a0bf-1864-e5cc-063b494befd8.png)




ブレークポイントを設定した箇所を実行するページを開いて、
正常にデバッガーが動作していれば自動でVisual Studio Codeがアクティブになり
サイドバー内で変数やウォッチ式の参照、上部のデバッグ用のボタンを使用してステップイン/オーバー/アウトをすることができます。
また、下部にはデバッグコンソールにコンソールログが表示されます。


![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/48552/c872d85a-a505-c982-6f70-9b0ef646f57f.jpeg)


##サーバー上のソース（実行しているソース）でブレークポイントの指定
ローカル上のソースでブレークポイントの指定をしなくても、
デバッグ画面の「LOADED SCRIPTS」で表示される実行ソースでもブレークポイントの設定が可能です。
※ブレークポイントで停止時にはローカル上のソースが開きます。


##デバッグの終了
上部デバッグ用のボタン群の中にあるコンセントアイコンをクリックすればデバッガから切断されます。


#参考サイト
[Remote debug node js application using Visual Studio Code](https://medium.com/@dakshika/remote-debug-node-js-application-using-visual-studio-code-dc0fa0b4dec4)
[Debugging in Visual Studio Code](https://code.visualstudio.com/docs/editor/debugging)
axiosで値が取り出せない

axiosで値が取り出せずに2時間ほど悩みました。vueと一緒に使っています。
はじめの動かないコードはこちら

```html
<div id="app">
<form>
<input v-model="query" placeholder="query"><button v-on:click.prevent="fetch">送信</button>
</form>
<p>{{ text }}</p>
</div>
```

```js
var app = new Vue({
    el: '#app',
    data: {
        query: '',
        text: '',
    },
    methods:
    {
        fetch: function (event) {
            axios({
                method: 'post',
                url: '<URL>',
                data: {
                    query: this.query,
                },
            })
                .then(function (response) {
                    this.text = response.data.text;
                })
                .catch(function (error) {
                    console.log(error);
                });
        },
    },
})
```

.thenの後、this.dataがundifinedになっていました。Vueの中にaxiosが入れ子になっているため、参照できていませんでした。

修正後は次です

```js
var app = new Vue({
    el: '#app',
    data: {
        query: '',
        text: '',
    },
    methods:
    {
        fetch: function (event) {
            var self = this; // 追加
            axios({
                method: 'post',
                url: '<URL>',
                data: {
                    query: this.query,
                },
            })
                .then(function (response) {
                    self.data.text = response.data.text; // ここ修正
                })
                .catch(function (error) {
                    console.log(error);
                });
        },
    },
})
```
[動作例](https://nakapython.com/qiita/drf_demo/)

### ES2015

ES2015以降の新たなJavaScriptでは、function()のかわりに()=>記法を利用することにより、function内でもthisを引き継いで利用できるそうです([potato4dさん](http://qiita.com/potato4d)ありがとうございます)
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方3

# ユビキタス言語の最低ライン
- クラスや主要な操作の名前が含まれている
- モデル中明示されたルールについて議論するための用語も含まれている
- コンテキストマップや大規模な構造などに由来する用語によって補完される
- ドメインモデルに対して一般に適用されるパターンの名前によって強化される
- 概念間の関係性は、あらゆる言語に存在する結合規則となる
- 単語やフレーズの意味には、モデルのセマンティクスが反映されている
- 開発者の間で使用されなければならない
- タスクや機能を記述するためにも使わなければならない
- 開発者とドメインエキスパートが互いに意思疎通する際にも用いられなければならない
- ドメインエキスパート同士が要件や開発計画、機能を伝えあう際にも用いられなければならない

> 最低でも、ここまではたどり着かなければならない。(第一部第二章より)


多いわ><;

概念間の関係性の話しがちょっとわからない。。。「あらゆる言語に存在する」結合規則。。。あらゆる言語とは例えばなんだろう。。。ユビキタス言語の外側の話か、それとも英語、日本語とかの言語のことか？？？

あとは、コンテキストマップや大規模に由来する用語の話しも、まだ理解はできるものの実感はまだないかな・・・

ほかは、大体わかりますね。

もちろん、すぐにここまでたどり着かなければならないと言っているわけではなくて、学習、努力して最低でもここまで来てねという意味です。

できるか？

最近はできるんではないかと確信めいたものはあります。

ポイントはコミュニケーションをサボらない、努力することにあるかと思います。
そして、それは精神的なことではなく、やり方・仕組みを考えることが必要だと考えています。



ユビキタス言語の最低ラインにたどり着く方法を常に考える。
【Mac】隠しファイル・隠しフォルダを表示する方法

#はじめに

macを買ったばかりの頃、環境設定やソフトウェアの導入の際、
『PATHを通す為に「.bash_profile」や「.bashrc」を更新する。』
という作業が必要になる機会がたくさんありますよね。

その時に、ターミナルにてホームディレクトリにいる時に
<pre>$ ls -a</pre>
を叩くと「.bash_profile」や「.bashrc」が表示されますが、
Finderでは表示されずに不思議だと感じたことがあるのは私だけではないでしょう。

これはvimを使って編集するしかないのかぁ〜。
リテラシーの低い僕にとってはvimに慣れるの大変だなぁ〜。

と項垂れながら調べてみたところ、Finderで隠しフォルダ・隠しファイルを表示する方法がありましたのでまとめておきます。

#環境
macOS Sierra ver10.12.6
上記で動作することが確認できている方法をご紹介しております。

#隠しフォルダ・隠しファイルとは
「隠しフォルダ・隠しファイル」は、「誤操作で内容を変更してしまわないように、不可視設定がされているディレクトリやファイルのこと」を指すとのことです。

macだけでなくWindowsのPCでも、重要なふディレクトリやファイルは不可視設定がされているようです。

macで不可視設定がされているファイルには、.bash_profileなどのshellの設定ファイルの他にも、

・.ssh・・・SSHを管理するファイル
・ライブラリ・・・環境設定や個人フォントの設定などのファイルを格納するディレクトリ
・ゴミ箱・・・削除したら取り消せない。

などがあります。

確かに、不用意に操作しないように気をつけなければならないディレクトリやファイルが多いですね。

では実際に隠しフォルダや隠しファイルを表示する2通りの方法を以下に記載致します。

#ターミナルで実施する方法

ターミナルを起動し、以下のコマンドを実行してください。
<pre>$ defaults write com.apple.finder AppleShowAllFiles TRUE</pre>

上記コマンドを実行したら、設定を適用させる為に以下のコマンドでFinderを一度終了します。
<pre>$ killall Finder</pre>
再度、Finderを開くと、隠しフォルダ・隠しファイルが表示されていると思います。

#ショートカットキーで実施する方法

以下のキーを同時に押下します。
<pre>[command] + [shift] + [.(ドット)]</pre>

上記のショートカットキーで表示・非表示を切り替えられます。

#おわりに
これなら、テキストエディタで簡単に編集できますね！

最近はvimにも少しずつ慣れてきて、ターミナル上での操作で色々なことができるようになると嬉しいと感じることも多いですが、上記のコマンドやショートカットキーですごく助かりました。

最後までお読み頂きまして、ありがとうございました。

これからもmacの設定やショートカットキーで便利なことがあったらまとめていきたいと思います。
PHPで簡易プロファイリング

PHPで書かれたシステムのパフォーマンスチューニングをすることになったので、久しぶりにプロファイラを使おうとしたのですが、これがなかなかうまくいかない。

数年前にプロファイリングしたときには[xhprof](http://pecl.php.net/package/xhprof)を使ったので今回もこちらでと思ったのですが、最新リリースは2013年9月30日と4年も前。もちろんPHP7.0リリース前ですので、PHP7.0には対応していません。[有志が対応](https://github.com/Yaoguais/phpng-xhprof)してくださっているそうですが。

では他のプロファイラをと思って探したんですが、当たり前ですがどれもモジュールになっているのでインストールの壁が立ちはだかります。今回、少々特殊な環境で動作するシステムなもので、モジュールを勝手にインストールすることが出来ません。

そもそも、そんな精密なプロファイリングは必要なくて、各処理ブロックのおおまかな実行時間がわかればいい程度のことだったので、以下のような簡易プロファイラを作って対応しました。

```PHP:laptimer.php
<?php
class laptimer{
  private $starttime = 0;
  private $shoots = array();
  private $is_outputed;

  function __construct(){
    $this->reset();
  }

  function __destruct(){
    if(!$this->is_outputed){
      $this->report();
    }
  }

  function reset(){
    $this->starttime = microtime(true);
    $this->shoots = array();
    $this->is_outputed = false;
  }

  function shoot($subject = ''){
    array_push($this->shoots, array(
      'subject'=>$subject,
          'spendtime'=>microtime(true) - $this->starttime)
    );
    $this->is_outputed = false;
  }

  function report(){
    if(php_sapi_name() !== 'cli'){
      print "<!--\n";
    }
    foreach($this->shoots as $shoot){
      printf("%s : %f\n", $shoot['subject'], $shoot['spendtime']);
    }
    if(php_sapi_name() !== 'cli'){
      print "-->\n";
    }
    $this->is_outputed = true;
  }
};
```

使い方はこんな感じ。泥臭いですが、計測ポイントにコードを直接埋め込んでいきます。

```PHP
<?php
require('laptimer.php');

$timer = new laptimer;

for($n = 2; $n < 10; $n++){
  print "hanoi {$n}\n";
  hanoi($n, 'A', 'B', 'C');
  $timer->shoot("hanoi {$n} finish");
}

$timer->shoot('all finish');

function hanoi($n, $a, $b, $c){
  if($n > 0){
    hanoi($n-1, $a, $c, $b);
    print "{$n} disk move {$a} to {$b}\n";
    hanoi($n-1, $c, $b, $a);
  }
}
```

実行結果はこんな感じですね。

```
hanoi 2
1 disk move A to C
2 disk move A to B
1 disk move C to B
hanoi 3
1 disk move A to B
2 disk move A to C
1 disk move B to C
3 disk move A to B
1 disk move C to A

...

1 disk move A to B
hanoi 2 finish : 0.000062
hanoi 3 finish : 0.000119
hanoi 4 finish : 0.000192
hanoi 5 finish : 0.000333
hanoi 6 finish : 0.000601
hanoi 7 finish : 0.001117
hanoi 8 finish : 0.002158
hanoi 9 finish : 0.004223
all finish : 0.004225
```

とりあえずこの方法でボトルネックは発見できたので、目的は果たすことが出来ました。
Go の channel に出てくる矢印の意味

Go のライブラリを読んでいる時に、次のようなメソッドのシグネチャがあって、どういう意味か混乱した。混乱した理由は、channel の矢印の意味合いが理解できていなかったから。

```go
func (client WorkspacesClient) CreateOrUpdate(resourceGroupName string, workspaceName string, parameters Workspace, cancel <-chan struct{}) (<-chan Workspace, <-chan error) {
```

パラメータにも、戻り値にも、`channel` があって、そこに矢印が付いている。これどういう意味？

# Channel Direction

これは、チャネルの方向性の記述。

![Channel](http://2.bp.blogspot.com/-RlFbVyp66qw/TfFQDBF2JtI/AAAAAAAABIM/ArTxswQ0GeE/s1600/channels.png)

この絵の通りで、チャネルは、ベルトコンベアのようなもので、送る方と、受け取る方がある。製品を組み立てて、ベルトコンベアに載せる方と、受け取る方は例えば、それを箱詰めするとかそんなイメージ。

channel に置ける矢印の記法はそれを明確に表すためのもの。


`<-chan` は、送信のみのチャネルです

```go
ic_send_only := make (<-chan int) 
```

`chan<-` は、受信のみのチャネルです。

```go
ic_recv_only := make (chan<- int) 
```

なんとなく、ふわっとわかる気もするけど、よーわからんよ。しかも、パラメータと戻り値でもそれがあって、頭はパニックよ。試してみよう。

# パラメータの　Channel Direction

```go
package main

import (
	"fmt"
	"time"
)

func receive(c chan<- string, message string) { // channel for send only
	c <- message
}

func send(c <-chan string) { // channel for recieve only
	fmt.Println(<-c)
}
func main() {
	c := make(chan string, 1)
	// c <- "hello then"
	receive(c, "hello")
	fmt.Println(<-c)

	c = make(chan string, 1)
	c <- "world"
	send(c)
}
```

実行結果

```
$ go run cmd/spike/main.go 
hello
world
```

ちなみに、試しにこんな感じに変えてみると、 `fmt.Println(<-c)` の部分でエラーになってコンパイルできなくなる。

```go
func receive(c chan<- string, message string) { // channel for send
	fmt.Println(<-c)
	c <- message
}
```

よし、なんとか、パラメータの方は理解できたぞ。

# 戻り値の Channel Direction

じゃあ、戻り値はどうよ

```go
func returnChannel() <-chan string {
	message := make(chan string, 1)
	message <- "hello world again"
	return message
}
func returnChannelReverse() chan<- string {
	message := make(chan string, 1)
	go func(msg chan string) {
		fmt.Println(<-msg)
	}(message)
	return message
}

func main() {
	b := returnChannel()
	fmt.Println(<-b)

	d := returnChannelReverse()
	d <- "hello world once upon a time"
	time.Sleep(100 * time.Millisecond)
}


```
戻り値の場合は、基本的に、関数の中で、チャネルを作って、返すけど、それが、送信専用か、受信専用かということになる。`<-chan` は、送信のみのチャネル（関数から見て）が戻り値だから、関数を呼んだ方は受信ができる。一方 `chan<-` は、受信のみのチャネル（関数から見て）が戻り値なので、関数を呼んだ方は、戻ってきたチャネルに対して送信ができる。という感じ。ちなみに、最後にスリープで待っているのは、ここでスリープを入れないと、 go routine がチャネルから受け付ける前にプログラムが終了するから。

うん。やっとスッキリした。

```
hello world again
hello world once upon a time
```

# Reference

* [Channels in Go](http://golangtutorials.blogspot.co.uk/2011/06/channels-in-go.html)
* [Go の並行処理](http://jxck.hatenablog.com/entry/20130414/1365960707)
* [Go by Example: Channel Directions](https://gobyexample.com/channel-directions)
オフラインリアルタイムどう書く E17 の実装例


問題 : http://nabetani.sakura.ne.jp/hena/orde17palin/
実装リンク集 : http://qiita.com/Nabetani/items/aa15539c8dc2c610c1a0

まずは、種類別に数える実装から：

```ruby
# 0<x<m の b 進数での回文数の数
def impl( m, b )
  s=m.to_s(b)
  keta = s.size
  return m if m<=b
  shead=s[0,keta/2]
  head = shead.to_i(b)
  mids = keta.odd? ? [*0..(b-1)].map{|x| x.to_s(b)} : [""]
  # keta-1 桁までの数
  n0 = 1.upto(keta-1).sum{ |k|
    (k==1 ? 1 : b**(k/2) - b**(k/2-1)) * ( k.odd? ? b : 1 )
  }
  #keta桁の数で、前半が m の前半より小さい
  n1 = (head - b**(keta/2-1)) * mids.count
  #keta桁の数で、前半が m の前半と等しい
  n2 = mids.count{ |mid| (shead+mid+shead.reverse).to_i(b) < m }
  n1+n0+n2
end

def solve(src)
  x,y,b = src.split(",").map(&:to_i)
  (impl(y,b) - impl(x,b)).to_s
end

if $0==__FILE__
  DATA.map{ |line|
    num, src, expected = line.split(/\s+/)
    actual = nil;
    tick = actual = solve( src )
    ok = actual==expected
    p [ ok ? "ok" : "**NG**", num, src, expected, actual, tick ]
    ok
  }.tap{ |x| p ( x.all? ? "okay" : "something wrong" ) }
end

__END__
0 12,34,5 5
1 10,11,10  0
33  2099642384,2789567569,6 14787
```

出題者なのにあまりきれいに書けてなくてすいません。

続いて、「次の回文数」という関数を作ることで数え上げる作戦。
テストデータを見ると 7万件を超えないようなので、間に合うだろうという算段。
当日その場で書いたもの：

```ruby
def nextpa(x,b)
  s=x.to_s(b)
  keta = s.size
  shead=s[0,keta/2]
  head = shead.to_i(b)
  if keta.odd?
    smid = s[keta/2]
    mid = smid.to_i(b)
    newmid=x<(shead+smid+shead.reverse).to_i(b) ?  mid : mid+1
    if newmid<b
      return (shead+(newmid).to_s(b)+shead.reverse).to_i(b)
    else
      h=x<(shead+smid+shead.reverse).to_i(b) ?  shead : (head+1).to_s(b)
      m= shead.size<h.size ? "" : "0"
      return (h+m+h.reverse).to_i(b)
    end
  else
      h=x<(shead+shead.reverse).to_i(b) ?  shead : (head+1).to_s(b)
      if shead.size<h.size
        h="1"+"0"*(shead.size-1)
        return (h+"0"+h.reverse).to_i(b)
      else
        return (h+h.reverse).to_i(b)
      end
  end
end

def impl( x, y, b )
  x-=1
  n=0
  loop do
    x=nextpa(x,b)
    return n unless x<y
    n+=1
  end
end

def solve(src)
  x,y,b = src.split(",").map(&:to_i)
  impl( x, y, b ).to_s
end

# 以下略
```

こちらはさらにごちゃごちゃしている。
繰り上がりの処理で苦しんでいる感じがよく出ている。
こちらの実装は最初に挙げたものと比べるとだいぶ遅いんだけど、我慢できないほどではない。

問題はシンプルな内容だったのでどこかで既出かもと思っていたんだけど、やっぱり既出だったらしい( see http://qiita.com/cielavenir/items/ba87e17548291d63354f )

そういうこともあるよね、と思っていたけど、どうも初らしい。
そう思うと悔しいかも。
[Spring] 明示的トランザクション

Springのトランザクションを明示的に管理にする方法についてメモ。

###Springのトランザクション管理の中心となるインターフェイス
**[PlatformTransactionManager]**
PlatformTransactionManagerはトランザクション管理に必要なAPIを提供しており、
APIを呼び出すことでトランザクション操作を実行できます。
また、PlatformTransactionManagerはトランザクション管理の実装を抽象化するための
インターフェイスであるため、異なる種類のトランザクションを、種類の違いを意識をすることなく
同一のAPIで操作することができます。
（SpringはTransactionTemplateを推奨）

###PlatformTransactionManagerの実装クラス
| クラス名       | 説明       |
|:-----------------|:-----------------|
| DataSourceTransactionManager| JDBCおよびMyBatisなどのJDBCベースのライブラリによるデータベースアクセスを行う場合に使用する |
| HibernateTransactionManager | Hibernateによるデータベースアクセスを行う場合に利用する |

###トランザクションマネージャーの定義
1. PlatformTransactionManagerのBean定義
2. トランザクション対象とするメソッドを定義

###ローカルトランザクションを利用する場合
ローカルトランザクションを使用する場合は、JDBCのAPIを呼び出してトランザクション制御を行う
DataSourceTransactionを使用します。
ローカルトランザクションとは、単一のデータストアに対するトランザクションのことで、
一般的によく使われるトランザクションです。
例えば、単一のデータベースに対する複数の操作を1つの論理的な単位で処理したい場合に使われます。

```xml:XMLによるBean定義
<!-- BeanIDには"transactionManager"を指定するのがオススメ -->
<!-- Springのデフォルトとして、トランザクションのBeanIDを"transactionManager"としているため -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- @Transactionアノテーションを利用する場合 -->
<tx:annotation-driven>
```

###明示的トランザクション
プログラム的トランザクションとは、コミットやロールバックといったトランザクション制御に関する処理を
ソールコードに明示的に記述する方法のこと。
メソッド単位より細かい粒度でトランザクション制御を行いたい場合などに有効。

###トランザクションの分離レベル
トランザクションの分離レベルには、参照するデータや変更したデータを他のトランザクションと
どのように分離するかを指定します。
分離レベルは、複数トランザクションの同時実行とデータの一貫性に関係します。

| トランザクション分離レベル | 説明       |
|:-----------------|:-----------------|
| DEFAULT| 利用するデータベースのデフォルトの分離レベル |
| READ_UNCOMMITTED | ダーティリード、ノンリピータブルリード、ファントムリードが発生する |
| READ_COMMITTED| ダーティリードを防止するが、ノンリピータブルリード、ファントムリードは発生する |
| REPEATABLE_READ | ダーティリード、ノンリピータブルリードを防止するが、ファントムリードは発生する |
| SERIALIZABLE | ダーティリード、ノンリピータブルリード、ファントムリードを防止する |

###トランザクション伝播レベル
トランザクションの伝播レベルには、トランザクション境界でトランザクション参加する方法を指定します。
指定する値によって、「新たにトランザクションを開始するもの」
「すでに開始されているトランザクションに相乗りするもの」などがあります。

###トランザクション境界と伝播レベル
※後ほど記載

###Springで利用可能なトランザクション伝播レベル
| 伝播レベル | 説明       |
|:-----------------|:-----------------|
| REQUIRED | 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合、トランザクションを新規に作成し、開始する |
| REQUIRED_NEW | 必ず新規のトランザクションを作成し、開始する。もしその時点でトランザクションがすでに存在している場合、新規のトランザクションがするまでの開いた、現在のトランザクションを一時的に停止する |
| MANDATORY | 現在のトランザクションを継続して利用する。もしその時点でトランザクションが存在しない場合は、例外が発生する |
最速より速い素数判定プログラム(条件付き) C

たまたま[最速の素数判定プログラム C# Java C++](http://qiita.com/asksaito/items/76b71602dd956b79dbf7) という記事を見まして、条件によってはそれよりも更に速い方法もあるよと思ったので記事を書きます。

そのコードはこちら。GMP使ってます。

```C
#define MAX_ARRAY   (100000000)
#define MAX_ARRAY_SQRT (10000)

char    array[MAX_ARRAY];

void initarray( void )
{
    int n, i;

    /*  配列を初期化する    */
    for( i = 0; i < MAX_ARRAY; i++ )
        array[i] = 1;

    /*  配列をふるいにかける    */
    for( n = 2; n <= MAX_ARRAY_SQRT; n++ ) {
        if( array[n] == 0 ) {
            for( i = n * n; i < MAX_ARRAY; i += n )
                array[i] = 0;
        }
    }
}

int isprime( mpz_t n )
{
    mpz_t i, n2, tmp;
    int _n, ret;

    if( mpz_cmp_ui( n, MAX_ARRAY ) < 0 ) {
        _n = mpz_get_ui( n );
        return( array[_n] );
    }

    /*  2割り切れたら合成数    */
    if( mpz_even_p( n ) )
        return( 0 );

    mpz_init( i );
    mpz_init( n2 );
    mpz_init( tmp );

    /*  sqrt(n)を求める */
    mpz_sqrt( n2, n );

    mpz_set_ui( i, MAX_ARRAY + 1 );
    ret = 1;
    while( mpz_cmp( i, n2 ) < 0 ) {
        if( mpz_divisible_p( n, i ) ) {
            ret = 0;
            break;
        }
        mpz_add_ui( tmp, i, 2 );
        mpz_set( i, tmp );
    }

    mpz_clear( i );
    mpz_clear( n2 );
    mpz_clear( tmp );

    return( ret );
}
```

要するに、一定以下の整数については予め素数判定を行って結果を配列に保持しておき、その範囲の素数判定は配列をひくだけで行うということです。

「はー？」と思った方もいらっしゃるかもしれませんが、実際のところとして[ゴールドバッハ予想を単純な方法で検証した際](http://www.saoyagi2.net/integer/goldbach.html)には、24時間かかっていた処理を22秒で終わらせるという成果をあげたりもしてます。

一つの整数を一度だけ素数判定するなら元記事の方法がまあ速いでしょうけれど、多数の整数を繰り返し素数判定するならこんな方法もありますよというお話でした。
Swiftのenumが便利

enum使っていますか？
Swiftの列挙型は単なる整数型の集合ではなく、型を指定したり独自のメソッドを定義できたりと便利なものになっています。

## メソッドを定義 

Swiftの列挙型にはメソッドを定義することができます。

```
enum Direction {
    case up, down, right, left
    
    func reverse() -> Direction {
        switch self {
        case .up:
            return .down
        case .down:
            return .up
        case .right:
            return .left
        case .left:
            return .right
        }
    }
}

let up = Direction.up
up.reverse() // down

let right = Direction.right
right.reverse() // left
```

## 独自イニシャライザ

rawValueによる初期化だけでなく独自のイニシャライザを定義できます。

```
enum Animal {
    case dog, cat
    
    init?(name: String) {
        switch name {
        case "犬":
            self = .dog
        case "猫":
            self = .cat
        default:
            return nil
        }
    }
}

let dog = Animal(name: "犬") // dog
let hoge = Animal(name: "hoge") // nil
```

## 共用型の列挙型

シンプルな列挙型と、複数の異なるタプルの構造を併せ持つことができる列挙型を共用型の列挙型と言います。
下記の例では、"custom"に文字列型を付加しています。

```
enum Message {
    case foo
    case bar
    case custom(String)
    
    func string() -> String {
        switch self {
        case .foo:
            return "foo"
        case .bar:
            return "bar"
        case .custom(let s):
            return s
        }
    }
}

let foo = Message.foo
foo.string() // foo

let custom = Message.custom("hoge")
custom.string() // hoge
```

なお、共用型の列挙型では==演算子を独自に定義しないと値の比較ができません。
以下サンプルです。

```
static func ==(v1: Message, v2: Message) -> Bool {
    switch (v1, v2) {
    case (.foo, .foo):
        return true
    case (.bar, .bar):
        return true
    case (.custom(let s1), .custom(let s2)):
        return s1 == s2
    default:
        return false
    }
}

Message.custom("aaa") == Message.custom("bbb") // false
Message.custom("aaa") == Message.custom("aaa") // true
```
Unityのネットワーク対戦で相手にデータを送信する最も単純で簡単な方法

Unity2017+C#でやってます。PhotonNetworkを使えばUnityでネトゲ開発も余裕です！
#Photonで値同期
まず、PhotonはAssetStoreからImportされた状態＋PhotonServerに自動でログインと部屋にINする設定が前提としてある。まずここがわからないなら最初に補足から見てください。

以下がソース↓



```{SystemControl.cs}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SystemControl:MonoBehaviour{
private PhotonView _PhotonViewControl;
//PhotonのRPCを使うときのコントローラ。こいつを使って相手に値を送る。

private int[] sendData ={123,666666,2121212 };//送るデータ
private int[] ReciveData = {0,0,0};//受信データ




private void Awake(){ //初期化

    _PhotonViewControl = GetComponent<PhotonView>();
　　//Inspectorに突っ込んでおいたComponentからPhotonViewを引っ張りだす
}

public void Send_ToOthers(){//送信メソッド

    _PhotonViewControl.RPC("SendFunc",PhotonTargets.Others,sendData);
    //RPC([使うメソッドの名前],[メソッドを発動させる対象],[メソッドの引数に突っ込む値])
}

[PunRPC]//RPCで呼び出したいメソッドは、メソッドの前にこいつを必ず書いとく
private void SendFunc(int[] SendedData){//相手が送ってきたときに自動的に発動

    ReciveData = SendedData;
    //相手から来たデータを自分の受け皿に上書き保存

}




}//end this class
```
#実験


SystemControlとPhotoviewがちゃんとComponetに追加されていることを確認。↓
![SnapCrab_NoName_2017-9-2_23-56-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/182970/5cd61388-a3cf-4e9c-64de-e8a50f45f2bf.png)


適当に送信メソッドのボタン作ってとGUI.Labelで反応を試そう↓

![SnapCrab_NoName_2017-9-2_23-55-33_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/182970/1a9b2e8d-9954-9a1d-19c8-cafabbbac103.png)

ボタン押した後↓

![SnapCrab_NoName_2017-9-2_23-55-58_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/182970/6e9e3245-2c3b-39df-5ba4-afabe18620d0.png)

これだけでも、ちゃんと送信されてます。おわり。　
今回は配列を送信したけど、Stringでもintでも当然boolでも大丈夫みたい。ListとQueueは非対応なので、ToArrayして送る必要があります。

#どうやって動いてる？

PhotonRPCは、「Targetで指定した人に指定したRPCメソッドを発動させる」というのが前提としてあります。そして、引数も指定できます。今回はTargetをOthersとして、自分以外の部屋にいる全員が引数付きでメソッドを発動します。
そうやって、引数で届いた相手のデータを自分の持ってる受け皿にコピーして保存しておけば、受信ができるという形になります。
あと、Objectの位置共有でこの手法を用いることは**推奨されていません**。
当然ですが、それ用のPhotonコンポーネントなどもあるので、そちらをご利用ください。

#使いどころさん

自分はカードゲームとか、ボードゲームとかターン制のゲームにでも使ってました。
OnSerializeなんちゃらの手法はいっぺんに全部共有だし、ずれるわろくなことがない。
こいつは、共有したいやつだけをRPCメソッドに梱包しちゃえばいいので、何個も作れて使い分けもできるので、使い勝手がいいです。

#補足
ネトゲ作りたいんだけどPhotonとかServerにログインってまずなに・・・？ってところだけど、
Unityでネトゲを作るにはUNetとPhotonNetworkServiceというのがあります。PhotonNetworkは安いしリファレンスが分かりやすいし、利用者も多いので詰まりにくいのがいい点。100人同時接続ロビーも、月額300円で運営できますよ。
詳しい実装方法、利用はこちらから
>https://photonengine.jp/
>*Photon公式サイト*

利用についてはこちらの記事が非常にわかりやすいです。↓

>http://www.urablog.xyz/entry/2016/09/13/080115
>*僕もPhotonを使いたい author-うら干物書き* 

以上。
回文数の数


今週のアルゴリズムで既出の問題ですね…
cf: https://github.com/cielavenir/codeiq_solutions/blob/master/thisweek_masuipeo/tyama_codeiq575_mod.rb

```rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde17palin/
#http://qiita.com/Nabetani/items/aa15539c8dc2c610c1a0
def solve(t,b=10)
	return to_enum(:solve,t,b) if !block_given?
	(0...b).each{|i|return if i>t;yield i}
	start=1
	digit=1
	loop{
		start.step(start*b-1){|i|
			s=i.to_s(b)
			n=(s+s.reverse).to_i(b)
			return if n>t
			yield n
		}
		start.step(start*b-1){|i|
			s=i.to_s(b)
			(0...b).each{|mid|
				n=(s+mid.to_s(b)+s.reverse).to_i(b)
				return if n>t
				yield n
			}
		}
		start*=b
		digit+=b
	}
end

while gets
	x,y,b=$_.split(',').map &:to_i
	p solve(y-1,b).to_a.size-solve(x-1,b).to_a.size
	STDOUT.flush
end
```
ABC072C問題

##解答の方針
問題は[こちら](http://abc072.contest.atcoder.jp/tasks/arc082_a)から
配列内のデータ±1と等しい数字をカウント
以下は私の提出コード

```ABC072C.cpp
#include <iostream>
#include <algorithm>
#define REP(i, n) for(int i=0; i<(int)(n); i++)
using namespace std;
int main(void){
  int n, i, j, max, max2;
  cin >> n;
  int a[100001] = {}, cnt[100001] = {};
  REP(i, n) cin >> a[i];
  REP(i, *max_element(a,a+n)+2){
    REP(j, n) {
      if((i == a[j]) || (i == a[j]+1) || (i == a[j]+2)) cnt[i]++;
    }
  }
  max = *max_element(cnt,cnt+100001);
  cout << max << endl;
  return 0;
}
```

##結果と改善点
サンプルデータについては正答を得たが、for文2重ループのためTLE(time limit exceeded)となり、アクセプトされず。高速化とアルゴリズムに慣れる必要がある。
下記のように入力時にカウントをする事で簡潔に解く事ができる。

```ABC072C.cpp
#include <iostream>
#include <algorithm>
#define REP(i, n) for(int i=0; i<(int)(n); i++)
using namespace std;
int main(void){
  int n, i, max;
  cin >> n;
  int a[100001] = {}, cnt[100001] = {};
  REP(i, n){
    cin >> a[i];
    cnt[a[i]  ]++;
    cnt[a[i]+1]++;
    cnt[a[i]+2]++;
  }
  max = *max_element(cnt,cnt+100001);
  cout << max << endl;
  return 0;
}
```
macOSにrubyをインストール

## Homebrewのインストール
[Homebrew](https://brew.sh/index_ja.html)がインストールされていなかったのでインストール

## rbenvとruby-buildのインストール
```
$ brew update
$ brew install rbenv ruby-build
```

```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
```
$ source ~/.bash_profile
$ rbenv --version
rbenv 1.1.1
```
## rubyのバージョンを選択
```
rbenv install -l
```
```
rbenv install 2.4.0
```
###バージョンを確認
```
$ rbenv versions
* system (set by /Users/hogehoge/.rbenv/version)
2.4.0
```
###macのデフォで入っているバージョンなので、変更する
####とりあえず環境全体のバージョン指定
```
rbenv global 2.4.0

$ rbenv versions
system
* 2.4.0 (set by /Users/tomoaki/.rbenv/version)

```
SublimeでEmmetをJSXを使用する際に有効にする

SublimeでTabキーでEmmetのSyntaxを展開する。

http://wesbos.com/emmet-react-jsx-sublime/
https://gist.github.com/wesbos/2bb4a6998635df97c748
https://github.com/facelessuser/ScopeHunter

↓をSublimeのkeybindingsのUser設定にペーストする。

```javascript
[
  // http://wesbos.com/emmet-react-jsx-sublime/
  // https://gist.github.com/wesbos/2bb4a6998635df97c748
  // https://github.com/facelessuser/ScopeHunter
  {
  "keys": ["tab"],
  "command": "expand_abbreviation_by_tab",

  // put comma-separated syntax selectors for which
  // you want to expandEmmet abbreviations into "operand" key
  // instead of SCOPE_SELECTOR.
  // Examples: source.js, text.html - source
  "context": [
    {
      "operand": "meta.group.braces.round.js, meta.group.braces.curly.js, text.html, source.css",
      "operator": "equal",
      "match_all": true,
      "key": "selector"
    },

    // run only if there's no selected text
    {
      "match_all": true,
      "key": "selection_empty"
    },

    // don't work if there are active tabstops
    {
      "operator": "equal",
      "operand": false,
      "match_all": true,
      "key": "has_next_field"
    },

    // don't work if completion popup is visible and you
    // want to insert completion with Tab. If you want to
    // expand Emmet with Tab even if popup is visible --
    // remove this section
    // {
    //   "operand": false,
    //   "operator": "equal",
    //   "match_all": true,
    //   "key": "auto_complete_visible"
    // },
    // {
    //   "match_all": true,
    //   "key": "is_abbreviation"
    // }
  ]
}
]
```

#他の方が書いた記事
[ReactのjsxファイルでSublimeText3 + Emmetを使おう](http://qiita.com/woopsdez/items/1fbacb45cb3b140b0db3)
[高速にJSXを書いていくTips]
(http://qiita.com/akameco/items/78d7d36e1389321ce45a)
Sidekiq のログを標準出力に出したまま USR2 シグナルで他のログの再オープンをする方法

Sidekiq の特定のユースケースでちょっと困ったことがあったのでその対処法。特定のユースケースとは:

- Sidekiq 標準ログとは別のログをファイルに書き込んでおり logrotate などで定期的にローテートしたい時、かつ
- 標準のログはファイルではなく標準出力に出したい時
    - 要は Docker コンテナのログとして見たい時

である。

## 何が問題か

Sidekiq では、標準ログを書いているファイルを logrotate などでローテートした時には、USR2 シグナルを送ると標準ログのファイルを含めて append しているいろんなファイルを必要に応じて再オープンしてくれる。

しかし、これは標準ログをファイルに書いている時だけに起こる挙動であり、標準出力に出してる時は USR2 シグナルは何の影響も及ぼさない: [Code](https://github.com/mperham/sidekiq/blob/3b00587ea0b3f887df9053ee2f6b42a69481b5ce/lib/sidekiq/cli.rb#L152-L156)。そして、`require` オプションで渡すブート時のユーザコード (Rails の場合は `config/application.rb`) を読み込んだ後に Sidekiq がシグナルを trap しているので、簡単に USR2 のシグナルだけを trap してどうのこうのできない。

## 解決策

とりあえず雑に prepend で解決した。

```ruby
# require オプションで読み込まれるファイル

module MySignalHandler
  def handle_signal(sig)
    if sig == 'USR2'
      Sidekiq.logger.info "Received USR2, reopening log file"
      Sidekiq::Logging.reopen_logs
    else
      super
    end
  end
end

module Sidekiq
  class CLI
    prepend MySignalHandler
  end
end
```
Pythonを速くしたいときにやったこと -Numba編-

# 前置き

http://qiita.com/open_cans/items/f180ae4dc945dc7b9066
この記事の続きです。
主にミリ秒とかマイクロ秒まで気にする人向けに書いています。

## numbaとは
numbaとはpythonのコードをjitコンパイラでコンパイルして速くするやつ
すごく手軽に高速化できるかなりすごい奴

## numbaの使用例
```python:sample.py
import numba

@numba.jit
def sumation(num):
  sum=0
  for i in range(num):
    sum += i
  return sum

sum = sumation(100)
print(sum)
```

3行目のように関数の前に
@numba.jit
と書くだけ
ここまでお手軽で高速化できるなんてすごい！！

# numbaの注意点
手軽でいいんだけど使う際に注意してほしいことがいくつかあるので列挙する。

### 内包表記は使えない
前回の記事で内包表記最高みたいに書いてたけどnumbaでは使えない。
いないと思うけど前の記事をみて内包表記をガリガリ書いていたら内包表記からfor文に書き換えなくてはいけない

### 空リストは使えない
```python:sample.py
import numba

@numba.jit
def inputList(num):
  temp=[]
  temp.append(num)
  return sum

sum = inputList(100)
print(sum)
```
こんな風に書くとエラーが出る
temp=[]が原因となっている

### コンパイルするときの注意点
そもそも動かない関数に@numba.jitと書いてしまうとエラーが隠蔽されてしまったりしてよくわからないことになるので必ず確実に動くことを確認してから@numba.jitと書いてほしい

# numbaとnumpyを組み合わせるときの注意点

numpyを使っている関数をnumbaで高速化しようとしても時々高速化できていないことがある。
どうやらnumbaもnumpyの関数でサポートしていないものもあるらしい
この記事(http://nekowarau.seesaa.net/article/428663212.html)
によるとnumbaが対応しているnumpyの関数は(http://numba.pydata.org/numba-doc/0.14/numpy_support.html)
で確認できるようだ

もし対応していない場合はその関数をスクラッチで書いてしまおう
そうすると高速化の恩恵を得ることができる。
AWSのGPUインスタンスでjupyterを使う


機械学習の試行錯誤でGPUを使いたくなったとき、自前のPCにはGPUがないのでAWSを使います。
その時のやり方。

**環境**
- OS: Windows 10
- ターミナル: TeraTerm
- キー変換ツール: PuTTYgen

## 手順
1. GPUインスタンスを借りる
	1. AWS Marketplaceで"Deep Learning AMI"と検索して出てくるAMIを選択。（今回はUbuntsuを使う）
	2. インスタンスタイプで"g2.2xlarge"を選択
	3. インスタンスの詳細の設定。
		ここでIAMロールは適切なものを。できればスポットインスタンスにすると安く済む
	4. セキュリティグループの設定
		SSHの接続元が初期設定0.0.0.0/0になっているのを'マイIP'に変更する
	5. 作成する。

2. SSH転送の設定をする
    1. キーペア(*.pem)をダウンロードして、PuTTYgenで.ppk ファイルへ変換する。
    2. TeraTermのメニューから[設定] > [SSH転送]を開く
    3. [追加]から、[ローカルのポート]のほうへ8888, [リモート側ホスト]へlocalhost、[ポート]に8888を入力。[リッスン]には何も入力しない。
        (リモート側ホストがlocalhostというのが大事。SSHで接続したところから転送する先がそのマシンそのものということ)
3. ターミナルでログインする
    1. ホスト名のところに ubuntsu@ec2-なんたらかんたら.compute.amazonaws.com　といれる。
    2. 認証方式に [RSA/・・・鍵を使う]を選択して、秘密鍵に (PuTTYで変換した).ppkファイルを指定する。
    3. ログインできたら、jupyterを起動する。
       `$ jupyter notebook`
4. ブラウザで表示
    ターミナルにログインURLが出てくるので、そのURLをブラウザに入力して開く
Javascript: 関数のCurry化

#Javascript: 関数のCurry化

Curry me This: Partial Application in JavaScript
https://www.linkedin.com/pulse/curry-me-partial-application-javascript-kevin-greene
カリー化
https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96
「カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること（あるいはその関数のこと）である。」
#Code with comment

```javascript
// curry function turns fn to curried function
function curry(fn, ...args) {
  // arity is the number of arguments which fn takes
  const arity = fn.length

  function curried(...args2) {
    // locals keeps track of the arguments have been passed
    const locals = args.concat(args2)
    // when arguments passed exceeds arity, apply function and return
    if (locals.length >= arity) {
      return fn(...locals)
    // otherwise, return curry(fn, ...locals)
    // -> return ((args.length >= arity) ? curried() : curried)
    } else {
      return curry(fn, ...locals)
    }
  }
  // if already have all arguments, call curried without arguments
  // -> return fn(...locals)
  // otherwise return curried to take more arguments
  return ((args.length >= arity) ? curried() : curried)
}

function threeSum(a, b, c) {
  return a + b + c
}

const addFive = curry(threeSum, 2, 3)

console.log(addFive) // curried function, locals = [2,3]
console.log(addFive(4)) // 9
```
#Curry化の意味
カリー化も部分適用も道具に過ぎず、その真価はより多くのコードを再利用できる事にある。関数を最も普遍的な形で定義し、部分的に適用する事で特定の状況に適した関数を作り出すことができる。関数のサブクラス化というとわかりやすいかもしれない。ほとんどのプログラマーは特定の状況に合わせてサブクラス化される基底クラスという概念に慣れ親しんでいるだろう。それらの言葉での抽象化を考えることで、おそらく、カリー化の価値を理解することができるだろう。
#Example
```javascript
// returns function to takes len and obj
const hasLength = curry((len, obj) => {
  return (obj.length >= len)
})

const arr = [
  'first item',
  'another',
  'an item longer than other items.......'
]

// hasLength(15) is a function to take obj and check length
const arr2 = arr.filter(hasLength(15))
// arr2 = ['an item longer than other items.......']
```

```javascript
// verbose, but more clearly illustrates what code is doing

const hasLength = curry((len, obj) => {
  return (obj.length >= len)
})

const arr = [
  'first item',
  'another',
  'an item longer than other items.......'
]

const isFifteenCharsLong = hasLength(15)
const arr2 = arr.filter(isFifteenCharsLong)
// arr2 = ['an item longer than other items.......']
```

```javascript
const isFunction = (obj) => typeof obj === 'function'

const matches = curry((selector, element) => {
  // https://developer.mozilla.org/ja/docs/Web/API/Element/matches
  if (isFunction(element.matches)) {
    return element.matches(selector)
  } else {
    const elementList = document.querySelectorAll(selector)
    let i = 0

    while (elementList[i] && elementList[i] !== element) {
      i++
    }

    return (elementList[i] ? true : false)
  }
})

const isListItem = matches('.list-item')
const ul = document.getElementById('some-list')

ul.addEventListener('click', (evt) => {
  if (isListItem(evt.target)) {
    evt.target.classList.add('active')
  }
});
```
#他の方が書いた記事
[食べられないほうのカリー化入門](http://qiita.com/KDKTN/items/6a27c0e8efa66b1f7799)
Nuxt.jsでいい感じにi18nを使う

Nuxt 国際化（i18n）
https://ja.nuxtjs.org/examples/i18n/

上記ページのサンプルは、 `/en` やら `/fr` みたいなパスベースで切り替える感じだけど、あんま好きくないのでブラウザの設定ベースで言語を切り替えるようにする。

パスベースじゃないのでサンプルにある `vue-router` の `middleware/i18n.js` は不要。

`vue-i18n` はイケてるけど英語の設定で最初の1文字目を大文字にしたい〜みたいなところは特に標準では対応してないので適当にfunctionを追加。

というわけで僕が考えた最強のNuxtの `plugins/vue-i18n.js`。

```js:plugins/vue-i18n.js
import _ from 'lodash';
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import changeCase from 'change-case';

Vue.use(VueI18n);

// 各種大文字/小文字切り替え用のfunctionを用意する
Vue.mixin({
  methods: {
    // camelCaseにする
    $tcc(path) {
      return changeCase.camelCase(this.$t(path));
    },
    // 1文字目をupperCaseにする
    $tucf(path) {
      return changeCase.upperCaseFirst(this.$t(path));
    },
    // 1文字目をlowerCaseにする
    $tlcf(path) {
      return changeCase.lowerCaseFirst(this.$t(path));
    },
    // 全部upperCaseにする
    $tuc(path) {
      return changeCase.upperCase(this.$t(path));
    },
    // 全部lowerCaseにする
    $tlc(path) {
      return changeCase.lowerCase(this.$t(path));
    }
  }
});

export default ({ app, req, isClient }) => {
  // 標準はja
  let locale = 'ja';
  if (isClient) {
    // browserから取る場合はnavigator経由で取得
    const navigator = _.get(window, 'navigator', {});
    locale = (_.head(navigator.languages) || navigator.language || navigator.browserLanguage || navigator.userLanguage).substr(0, 2);
  } else if (req) {
    // ssrの場合はrequestから取得
    locale = req.headers['accept-language'].split(',')[0].toLocaleLowerCase().substr(0, 2);
  }
  app.i18n = new VueI18n({
    locale: locale || 'ja',
    fallbackLocale: 'ja',
    messages: {
      'en': require('~/locales/en.json'),
      'ja': require('~/locales/ja.json'),
    },
  });
}

```

これで以下のように使う場所に応じて大文字・小文字を切り替えられる。

```json:locales/en.json
{"app": {"brand": "my application"}}
```

```json:locales/ja.json
{"app": {"brand": "僕のアプリ"}}
```

```html:components/Header.vue(テンプレート内に書く場合）
<template>
  <div class="navbar-header">
    <nuxt-link to="/" class="navbar-brand">{{$tuc('app.brand')}}</nuxt-link>
  </div>
</template>
```

```html:components/Header.vue（jsから渡す場合）
<template>
  <div class="navbar-header">
    <nuxt-link to="/" class="navbar-brand">{{brand}}</nuxt-link>
  </div>
</template>
<script>
export default {
  data() {
    return {
      brand: this.$tuc('app.brand'),
    };
  },
};
</script>
```

たぶんこんな感じのやつで、英語なら「MY APPLICATION」ってなるし日本語「僕のアプリ」って表示されるはず。

### 参考
* https://github.com/kazupon/vue-i18n/issues/142
* https://github.com/nuxt/nuxt.js/issues/707
* https://jp.vuejs.org/v2/guide/mixins.html
Autohotkey小ネタ

#AltTabの画面でホイール移動
WheelDown:: AltTab
WheelUp:: ShiftAltTab
;設定ファイルの先頭部に記述しないと動かないので注意

#マウスホイールでカーソル横移動
;Shift+ホイールUp → 左カーソル
Shift & WheelUp::Send {left}

;Shift+ホイールUp → 右カーソル
Shift & WheelDown::Send {right}

#Ctrl 二回連続押しでランチャー起動
ctrl::
  If (A_PriorHotkey == A_ThisHotkey && A_TimeSincePriorHotkey < 1000)
  Input,InputChar,L1 T1,{RWIN}
  If ErrorLevel=Max
  {
    ;Yahoo
    If InputChar=y
      Run,C:\Program Files (x86)\Google\Chrome\Application\chrome.exe "http://www.yahoo.co.jp/"
    ;サクラエディタ起動
    If InputChar=s
      Run, D:\programs\sakura\sakura.exe
    Else
    ;ダウンロードフォルダ表示
    If InputChar=d
      Run, d:\Programs\HmFilerClassic\HmFilerClassic.exe d:\Download
    Else 
  }
Return

#保存時にAutoHotKey設定ファイル自動リロード
\#IfWinActive, ahk_class Notepad
~^s::
    ScriptName := "AutoHotkey.ahk"
    IfWinActive, %ScriptName%
    {
        Reload
    }
return		

#無変換+1or2でウィンドウ操作
; 無変換 + 1 → 最大化
sc07B & 1::Send, #{Up}

; 無変換 + 2 → ウィンドウ縮小（2回押すと最小化）
sc07B & 2::Send, #{Down}
Autohotkey で、いつでもどこでも Google 検索

#無変換+g でGoogle検索窓
sc07B & g::
    InputBox, sword, Google Search, , ,500,130
    if ErrorLevel <> 0
    {}
    else
    {
        NewStr := RegExReplace(sword, "\s+", "\+")
        Sleep 3
;        Run, "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -new-tab "http://www.google.co.jp/search?hl=ja&lr=lang_ja&ie=UTF-8&q=%sword%"
         Run, "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -new-tab "http://www.google.co.jp/search?hl=ja&lr=lang_ja&ie=UTF-8&q=%sword%"
    }
    return