OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity]自作ShaderのMaterialに値を代入する方法

#方法
```
material.SetFloat(name, float);
```
これでできる。ほかの型でも同様に可能。
詳しくは[ここ](https://docs.unity3d.com/jp/current/ScriptReference/Material.html)を参照。
#コードの例
```
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class ShaderScript : MonoBehaviour {
	public Material mat;
	public string name;
	public float floa;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		mat.SetFloat(name, floa);
	}
}

```
publicの変数の値を毎フレームマテリアルに設定するだけのコードです。
RailsにNginxのproxy cacheを設定する


railsにnginxのproxy cacheをしたくなったので、「rails nginx proxy cache」とググって以下のサイトを参考にしたが、どうしてもキャッシュができなかったので記載する

[ バージョン情報 ]
nginx: 1.10.2
rails: 4.2.6


[ 参考サイト] 
https://mattbrictson.com/nginx-reverse-proxy-cache
http://www.mk-mode.com/octopress/2014/04/23/nginx-proxy-cache-setting/

## nginxでproxy cacheを設定する

先に正解を掲載。
後に掲載する参考サイトとの差分は
1.  `proxy_ignore_headers "Set-Cookie" "Cache-Control";` でSet-Cookieヘッダーも無視している
2. `proxy_cache_valid`を設定している


```nginx
http {
  proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=default:8m max_size=1000m inactive=30d;
  proxy_temp_path   /var/cache/nginx/tmp;
}

upstream rails {
  server unix:/path/to/.unicorn.sock fail_timeout=0;
}

server {
  listen 80 default deferred; # for Linux
  root /path/to/app/current/public;
  try_files $uri/index.html $uri.html $uri @app;

  location @app {
    # Standard reverse proxy stuff
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://rails;

    # Reverse proxy cache
    proxy_ignore_headers "Set-Cookie" "Cache-Control";
    proxy_cache default;
    proxy_cache_lock on;
    proxy_cache_use_stale updating;
    proxy_cache_valid  any      10m;
    add_header X-Cache-Status $upstream_cache_status;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /path/to/app/current/public;
  }
}
```

## 参考サイトの設定

参考: https://mattbrictson.com/nginx-reverse-proxy-cache

nginxの設定

```nginx
http {
  proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=default:8m max_size=1000m inactive=30d;
  proxy_temp_path   /var/cache/nginx/tmp;
}

upstream rails {
  server unix:/path/to/.unicorn.sock fail_timeout=0;
}

server {
  listen 80 default deferred; # for Linux
  root /path/to/app/current/public;
  try_files $uri/index.html $uri.html $uri @app;

  location @app {
    # Standard reverse proxy stuff
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://rails;

    # Reverse proxy cache
    proxy_cache default;
    proxy_cache_lock on;
    proxy_cache_use_stale updating;
    add_header X-Cache-Status $upstream_cache_status;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /path/to/app/current/public;
  }
}
```

railsの設定

```ruby:rails
class MyController < ApplicationController
  before_action :allow_page_caching

  # controller actions...

  private

  def allow_page_caching
    expires_in(5.minutes) unless Rails.env.development?
  end
end
```

## 解説

参考サイトにおいて、railsではデフォルトでレスポンスヘッダーに

```
Cache-Control: max-age=0, private, must-revalidate
```

が付与されてしまう。なので、rails側で `expires_in(5.minutes)` とすることで

```
Cache-Control: max-age=300, public
```

に変更している
nginxで

```
proxy_ignore_headers Cache-Control;
```

としてもよい。すると、Railsが何を返そうが、キャッシュされるようになるはずだった。


しかし、どうやらrailsは毎回Set-Cookieも返すらしい。そいつも無視しておかないとキャッシュが設定されないそうだ。
そして、nginxのバージョン差異のせいか、 `proxy_cache_valid` も設定しておかないとダメみたいだ。

もっと詳しい情報をお持ちの方、ぜひ教えてください。
よろしくお願いします。
python3系でのPython Image Libraryの使用方法

O'Reillyの「ゼロから作るDeep Learning」の3章。
MNIST画像（手書き数字認識のサンプル画像）を表示するのにPILを使うよって。

PIL（Python Image Library）についてはこちらなどご参照ください
http://www.lifewithpython.com/2013/09/pil.html

サンプルコードを写経して実行。したらエラーがでましたね。

```python
from PIL import Image
...
```

```
Traceback (most recent call last):
  File "/Users/ukwksk/Training/orreilly-deep-learning/chapter03/section3_6_number_recognition.py", line 7, in <module>
    from PIL import Image
ImportError: No module named 'PIL'
```

「PILがありませんよ」
あ、標準ライブラリじゃないのね。

```
$ pip install PIL
Collecting PIL
  Could not find a version that satisfies the requirement PIL (from versions: )
No matching distribution found for PIL
```
PILってライブラリはないの...?

調べたところ、PILは2系までのイブラリで、3系にはないっぽい
https://librabuch.jp/blog/2013/05/python_pillow_pil/

「本書では下記のプログラミング言語とライブラリを使用します。
-　Python3系
-　NumPy
-　Matplotlib 」
とはなんだったのか..

というわけで上記のURLに従って
```$ pip install pillow```
で、無事に解決しました。
[Unity]Shaderでかっこよさげな(?)シーン遷移 ~その1~

#できるもの
![1月-15-2017 15-25-47.gif](https://qiita-image-store.s3.amazonaws.com/0/113509/4305227a-1083-f493-91c0-5104489fa2ab.gif)
バトルシーンへの遷移の時に使えそう。
少なくとも一瞬でパッと切り替わるよりかはマシかなぁ?
(スクリプトから進行度合いの値を入れる必要があります。詳しくは[ここ](http://qiita.com/torumu106/items/20fcb7590f653695f26f))
(それが嫌なら_Time.yに演算を少し施して使うといいかもです。)
#コード
```
Shader "Original/NewImageEffectShader 1"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		percent ("percent", Range(0, 1)) = 0.5
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always
		// 追加
        CGINCLUDE

        #define PI 3.14159

        float mod(float  a, float  b) { return a-b*floor(a/b); } 
        uniform float percent;
        ENDCG

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);

				float2 r = 2.0 * (i.uv - 0.5);
                float aspectRatio = _ScreenParams.x / _ScreenParams.y;
                r.x *= aspectRatio;
                fixed4 bgCol = fixed4(0.0, 0.0, 0.0, 0.0);

                float2 rm = float2(mod(r.x, 0.2) - 0.1, mod(r.y, 0.2) - 0.1);
                if(rm.x >= 0 && rm.y >= 0){
                	if(percent / 5 > rm.x){
                		col = bgCol;
                	}
                }
                if(rm.x < 0 && rm.y < 0){
                	if(percent / 5 > rm.x + 0.1){
                		col = bgCol;
                	}
                }
                if(rm.x < 0 && rm.y >= 0){
                	if(percent / 5 >= -rm.x + 0.1){
                		col = bgCol;
                	}
                }
                if(rm.x >= 0 && rm.y < 0){
                	if(percent / 5 >= -rm.x + 0.2){
                		col = bgCol;
                	}
                }

				return col;
			}
			ENDCG
		}
	}
}

```
#仕組み
x座標とy座標を0.2で割った余りを考えそのあと愚直に場合分けをしています。
配列の大きさ

C/C++ では配列の要素数を知るために配列のバイト数を要素のバイト数で割るというイディオムがよく知られているのですが、演算子 `sizeof` が返すのはあくまでも (要素の数ではなく) バイト数であることや、 C/C++ でのポインタ関連表記がややこしいことなどと併さって間違ったことをしてしまうというのはよくあり、そのような内容の投稿を見る機会がありました。

> [C++ > stdint.h > sizeof(int[][3])とsizeof(uint8_t[][3]) > 48と12](http://qiita.com/7of9/items/100e4c88e4c165fb5e3e)

あらためて挙動を追ってみます。

# `sizeof` で一次元配列の大きさを取得する

まず簡単な一次元配列ならそれほど問題はありません。

```cpp
#include <iostream>

static const int table[3] = {1, 0, 0};

int main() {
  std::cout << "Table extent is " << std::endl;
  std::cout << sizeof(table)/sizeof(*table) << std::endl;
  return 0;
}
```

# `sizeof` で二次元配列の大きさを取得する

これが二次元配列だとどうなるでしょうか。

```cpp
#include <iostream>

static const int table2[][3] = {
  { 1, 0, 0 },
  { 0, 1, 0 },
  { 0, 0, 1 },
  { 0, 1, 1 }
};

int main() {
  std::cout << "Table extent is " << std::endl;
  std::cout << sizeof(table2)/sizeof(*table2) << std::endl;
  return 0;
}
```

このように表示されるのがわかると思います。

```
Table extent is 4
```

`4` というのは `table2` の第一次元の要素数ですね。 `*table2` の型は `int[3]` なので `table2` 全体のバイト数を `*table2` のバイト数で割ると第一次元の要素数になるのです。

# 各次元の要素数を取得する

では配列の第二次元の要素数を取得するには `sizeof` に渡すときに `*` をひとつ多く付けることで可能です。

```cpp
#include <iostream>

static const int table2[][3] = {
  { 1, 0, 0 },
  { 0, 1, 0 },
  { 0, 0, 1 },
  { 0, 1, 1 }
};

int main() {
  std::cout << "Table extent of dimension 2 is " << std::endl;
  std::cout << sizeof(*table2)/sizeof(**table2) << std::endl;
  return 0;
}
```

そして、 C++11 の `type_traits` には `std::extent` というクラステンプレートがあり、各次元の要素数を取得することが出来ます。 型システムの恩恵を受けられるので、 `sizeof` を使った古いやりかたはなるべく捨ててこちらに移行するべきでしょう。

以下のように使えます。

```cpp
#include <iostream>

static const int table2[][3] = {
  { 1, 0, 0 },
  { 0, 1, 0 },
  { 0, 0, 1 },
  { 0, 1, 1 }
};

int main() {
  std::cout
    << "Table extent is "
    << std::extent<decltype(table2),0>::value
    << "x"
    << std::extent<decltype(table2),1>::value
    << std::endl;
  return 0;
}
```

```
Table extent is 4x3
```

# 配列全体の大きさ

多次元配列について「配列の大きさ」といったとき、その配列が__配列の配列__であると見たいのであれば上記の方法でいいのですが、__多次元の広さを持った配列__として解釈するのであれば `table2` の大きさは `12` であって欲しいですよね。

そういう機能がないか調べてみたのですが、 C++11 にはそのような機能が見当らなかったので書いてみました。

```cpp:fullextent.h
#ifndef HEADER_0ea4160a60cf2063fa848012290e278f
#define HEADER_0ea4160a60cf2063fa848012290e278f

#include <cstddef>
#include <type_traits>

template<class T>
class fullextent {
private:
  template<size_t r, size_t i>
  static constexpr typename std::enable_if<(r!=1), size_t>::type helper(void) {
    return std::extent<T, i>::value * helper<r-1, i+1>();
  }    
  template<size_t r, size_t i>
  static constexpr typename std::enable_if<(r==1), size_t>::type helper(void) {
    return 1;
  }
public:
  typename std::enable_if<std::is_array<T>::value, size_t>::type
  static constexpr value = std::extent<T, 0>::value * helper<std::rank<T>::value, 1>();
};
#endif
```

使い方は以下のような要領です。

```cpp
#include <iostream>
#include <fullextent.h>

static const int table2[][3] = {
  { 1, 0, 0 },
  { 0, 1, 0 },
  { 0, 0, 1 },
  { 0, 1, 1 }
};

int main() {
  std::cout
    << "Table extent is "
    << fullextent<decltype(table2)>::value
    << std::endl;
  return 0;
}
```

# まとめ

配列の大きさを知りたいときは `sizeof` よりも `std::extent` を使いましょう。
2の補数についてわかりやすく

2の補数とは、2進数の減算において威力を発揮する（2進数を減算を加算で表すことができる）。

# 定義
2の補数とは2進数表示したものに、数字の0と1を入れ替え、1を足したものである。

```　例
4の場合

4の2進数表示は0100。この0100の0と1を入れ替えると1011となる。これに1を足すと1100となる。
よって、1100が4の2の補数表示となる。
```

# やり方
減算において、マイナスがついている符号を2の補数表示し、加算する。加算した結果が2進数で表された減算の答えになる。

```　例
5-3 = 2 の場合

5は2進数で0101。3は2の補数で1101
よって
0101 + 1101 = 0010
0010は10進数で2だから、この式は正しい。
```

| 10進数 | 2 進数 | 2の補数 |
|--------|--------|---------|
| 0000   | 0000   |         |
| 0001   | 0001   | 1111    |
| 0002   | 0010   | 1110    |
| 0003   | 0011   | 1101    |
| 0004   | 0100   | 1100    |
| 0005   | 0101   | 1011    |

# 原理
ビットを反転させるという行為は、n桁の2進数の場合、
(n桁全てが1)　-　(元の数字)
という計算をする行為と同じである。例えば、『4の2進数表示は0100。この0100の0と1を入れ替えると1011となる。』と先ほど述べたが、
1111 - 0100 = 1011
となる。これは4の2進数表示は0100をビット反転させたものと同じである。

以上から　5-3 = 2 の場合
0101 - 0011 = 0101 + (1111 - 0011 + 1 ) = 10000 + (0101 - 0011)
となり、4桁で考えると10000が無視されるので、2の補数を用いて減算を加算で実現できる。
TypeScript moduleの２つの記述形式

# 何
- TypeScriptのmodule(旧外部モジュール)機能について、書き方が２つあり、ネットの情報は新旧混ざっているため整理する。
- 参考）https://www.typescriptlang.org/docs/handbook/modules.html

# 書き方２つ
1.es6形式
2.「export = and import = require()」 形式　(何か名前ある？)

## es6形式(ECMAScript2015形式)
- 例)


```
export interface StringValidator {
    isAcceptable(s: string): boolean;
}
```
```
import { ZipCodeValidator } from "./ZipCodeValidator";
```

- 新しくモジュールを使う場合はこちらで良い
- TypeScript1.5から導入された模様


## 「export = and import = require()」 形式
- 例)

```
class ZipCodeValidator {
   ...
}
export = ZipCodeValidator;
```

```
import zip = require("./ZipCodeValidator");
```

- 「export =」 で、公開する要素を指定する。
- 「export =」 は、１つモジュールで１回しか使えない。(export single object)
- 「import xxx = require」 で、使用する要素を指定する。
- CommonJS/AMDのexportsオブジェクトの考え方に合わせているが、互換性はない。
- この形式のモジュールを"tsc --module es6"でコンパイルすると、以下のエラーが出る。

```
error TS1203: Export assignment cannot be used when targeting ECMAScript 2015 modules. 
Consider using 'export default' or another module format instead.
```

(moduleをes6形式で書くか、諦めて"--module CommonJS"などにしなさいと言う意味)
pyenv installでエラーが出た話（叙事的な話で、結局クリティカルな原因は不明）

O'Reillyの「ゼロから作るDeep Learning」を読み始めた。
同書ではpython3系で進めていくということなのでpyenvで設定を。

```
$ pyenv install 3.5.1
Downloading Python-3.5.1.tar.xz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz
Installing Python-3.5.1...
^C
BUILD FAILED (OS X 10.11.6 using python-build 1.0.6-13-g4d96271)

Inspect or clean up the working tree at /var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.20170109121924.16365
Results logged to /var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.20170109121924.16365.log

Last 10 log lines:
checking for execv... yes
checking for faccessat... yes
checking for fchmod... yes
checking for fchmodat... yes
checking for fchown... yes
checking for fchownat... yes
checking for fexecve... no
checking for fdopendir... yes
checking for fork... yes
checking for fpathconf... make: *** No targets specified and no makefile found.  Stop.
```

pyenv公式issueに（別のversionで）同じ問題に当たった人が。
https://github.com/yyuu/pyenv/issues/423
開発者の[Yamashitaさん](https://github.com/yyuu)がちゃんとコメントしてました。

Xcodeがちゃんと動いてないよーって...
http://qiita.com/tanakahisateru/items/c0eaa25dbde669b282cb
を参考に、とりあえずbrew doctorをしてみることに。

```
$ brew doctor
.
.
.
Warning: Your Xcode (8.1) is outdated.
Please update to Xcode 8.2 (or delete it).
Xcode can be updated from the App Store.
.
.
.
```

Xcodeのバージョンが古いって怒られてました。
インストールめっちゃ時間かかったけどとりあえず更新。
https://itunes.apple.com/jp/app/xcode/id497799835?mt=12

で、再度```pyenv install 3.5.1```をしたものの同じエラーに。

http://www.python-izm.com/contents/basis/pyenv.shtml
を見ていると
```$ brew install readline xz```
って叩いた記憶ないな、と思ってやってみたらエラーが変わった。
```
/private/var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.20170111003433.38822/Python-3.5.1/python.exe: No module named ensurepip.__main__; 'ensurepip' is a package and cannot be directly executed
```

いやそれはなんかそろそろ僕が悪くない気がしてきた...
そういえば初回install時にやたら時間かかるなあと思って```^C```ってやっちゃった気が。
そのせいで悪さしてるとしたら、、、？ 一旦リセットだ！ええい！

```$ rm -rf /var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.*```

そして```pyenv install 3.5.1```を再度叩いて、ちゃんとtailで生成されるlogを追う。
...無事成功！！！

```
$ pyenv install 3.5.1
Downloading Python-3.5.1.tar.xz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz
Installing Python-3.5.1...
Installed Python-3.5.1 to /Users/username/.pyenv/versions/3.5.1
```

``` 
$ tail -f -n 100 /var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.20170115134121.24695.log
```

結局根本的な原因はわからなかったけど、Xcodeとか関係なく、最初から
```$ rm -rf /var/folders/rm/czd685gs0zsdx1z1yb3p446m0000gn/T/python-build.*```
一発で解決していたのではないかという話でした。
RaspberryPiでFAT32の外付けハードディスクをマウント

FAT32フォーマットのUSB外付けハードディスクをマウントした時のメモ
・利用したOSはRASPBIAN JESSIE WITH PIXEL
・USB外付けハードディスク、容量は500G
・フォーマットはFAT32

1.外付けハードディスクをUSBに接続してRaspberryPiをブート

2.認識の状態を確認する
```
$ df
ファイルシス   1K-ブロック    使用    使用可 使用% マウント位置
/dev/root         61819132 4276364  54973020    8% /
devtmpfs            469532       0    469532    0% /dev
tmpfs               473864       0    473864    0% /dev/shm
tmpfs               473864    6508    467356    2% /run
tmpfs                 5120       4      5116    1% /run/lock
tmpfs               473864       0    473864    0% /sys/fs/cgroup
/dev/mmcblk0p1       63503   20604     42900   33% /boot
tmpfs                94776       4     94772    1% /run/user/1000
/dev/sda1        488263744     160 488263584    1% /media/pi/587A-E65E
```
/dev/sda1として認識されているらしい

3.マウント先のディレクトリを作成
```$ sudo mkdir /mnt/usbhdd```
4.外付けハードディスクをマウント
```$ sudo mount -t vfat /dev/sda1 /mnt/usbhdd --option codepage=932,iocharset=utf8```

5.マウント状態を確認
```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         59G  4.1G   53G    8% /
devtmpfs         459M     0  459M    0% /dev
tmpfs            463M     0  463M    0% /dev/shm
tmpfs            463M  6.4M  457M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1    63M   21M   42M   33% /boot
tmpfs             93M  4.0K   93M    1% /run/user/1000
/dev/sda1        466G  192K  466G    1% /mnt/usbhdd
$ ls -lh /mnt/usbhdd
合計 96K
drwx------ 2 pi pi 32K  1月 15  2017 $RECYCLE.BIN
drwx------ 2 pi pi 32K  1月 15  2017 System Volume Information
-rw-r--r-- 1 pi pi   0  1月 15  2017 新しいテキスト ドキュメント.txt
drwx------ 2 pi pi 32K  1月 15  2017 新しいフォルダー
```
Windowsで作成した日本語のファイル名とフォルダー名も問題なく表示できている。
Ansibleの多段SSHで、通常のSSHコマンドとControlPathを共有する

# Ansibleの多段SSHで、通常のSSHコマンドとControlPathを共有する

通常のSSHコマンドで繋いだ踏み台サーバへのコネクションをAnsibleで共有して使いたい場合に躓いたので書いておきます。
ansible.cfgのデフォルトではControlPathが独自のものになっているので、これを共有するように変更します。
http://docs.ansible.com/ansible/intro_configuration.html#control-path

[localhost] -> [step.example.com] -> [destination.example.com]

```bash
### 読み込んでくれる場所にansible.cfgを置く(今回はカレントディレクトリ)
### 読み込み優先順位の参考: http://docs.ansible.com/ansible/intro_configuration.html
$ vim ansible.cfg
[ssh_connection]
control_path = ~/.ssh/controlmaster-%%r@%%h:%%p
ssh_args = -o ControlPersist=15m -F ssh_config -q

### ssh_configを編集 (ansible.cfgのssh_argsで指定されている設定ファイル)
$ vim ssh_config
# MacOS Sierraでの設定変更回避のオプションも含まれます
HostkeyAlgorithms ssh-dss
AddKeysToAgent yes
ForwardAgent yes

# 対象サーバへのssh設定
Host destination.example.com
  ProxyCommand ssh step.example.com nc %h %p

# 踏み台サーバへのssh設定# 
# ControlPersist 10は通常のsshで使うときの便利のため、切断後10秒でコネクションが消える
Host step.example.com
  ControlMaster auto
  ControlPersist 10
  ControlPath ~/.ssh/controlmaster-%r@%h:%p
```

```bash
### ControlMasterを作成するためにsshする際は、先ほどのssh_configを参照して作る
$ ssh -F ssh_config step.example.com

### 上記sshセッションをオープンしたままansibleを実行すると、その接続を利用してansibleを実行してくれる
$ ansible-playbook -i hosts example.yml -K
```
fzf.vimがいい感じ あとvim-plugも

Emacsの`ido`のあいまいマッチが気に入ったので、`peco`の代わりに`fzf`を使ってみることにした。

# fzfの良かった点

- tmuxとの連携がいい感じ
- あいまいマッチのため、タイプ数が減って楽になった

tmuxとの連携は、tmuxの中でfzfを起動すると、自動的にペインが分割されて選択できるため、
現在の画面を失わずに選択できる。

![Screenshot_2017-01-16_10-00-50.png](https://qiita-image-store.s3.amazonaws.com/0/103885/e1712ba7-4a69-4868-f1bb-f673abff9ec1.png)


# fzf.vimがいい感じだった

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/786af3f6-d5f2-498a-9859-613bd9691f19.gif)


https://github.com/junegunn/fzf.vim

Vimと連携するため、fzf.vimを導入。

vim-plugを推奨しているため、それも導入。

```sh
% curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

の後、.vimrcに下記を記述すればOK

```vim:.vimrc
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
```

# キーバインド

`<Space>`キーを`<Leader>`に設定して、なんちゃってSpacemacsにした。

```vim:.vimrc
" like Spacemacs
let mapleader = "\<Space>"

nnoremap <Leader>b :Buffers<CR>
nnoremap <Leader>x :Commands<CR>
nnoremap <Leader>f :GFiles<CR>
nnoremap <Leader>a :Ag<CR>
nnoremap <Leader>k :bd<CR>
command! FZFMru call fzf#run({
\  'source':  v:oldfiles,
\  'sink':    'e',
\  'options': '-m -x +s',
\  'down':    '40%'})
nnoremap <Leader>r :FZFMru<CR>
```

例えば、`<Space> b`でバッファ一覧を開けるので、Emacsでの`C-x C-b`が代用できる。

バッファ切り替え

![Screenshot_2017-01-15_14-46-40.png](https://qiita-image-store.s3.amazonaws.com/0/103885/24503a4e-ffb9-81ca-9d21-2bd73f33590e.png)

Git管理下のファイルを開く

![Screenshot_2017-01-15_14-45-41.png](https://qiita-image-store.s3.amazonaws.com/0/103885/8463bb98-c698-bdfe-57ab-74e420fa86a3.png)



`the_silver_searcher`の検索結果にジャンプ
やや見づらい

![Screenshot_2017-01-15_14-46-15.png](https://qiita-image-store.s3.amazonaws.com/0/103885/7e3abcf0-e5c1-e170-b703-2d8372ae2ac3.png)
typescriptのカラーコードとバックスペースを除去

RaspberryPiでコマンドの実行ログを残しておこうとして、scriptコマンドを使用したが、カラーコードやバックスペースがそのまま残ってしまい編集しにくかったので、除去する方法。
```sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]//g" typescript| col -bx >typescript.txt```
まだいくつかのカーソル移動のエスケープシーケンスとか残っていそうだけど、かなり見やすくなったので、ひとまずはこれでよしとする。
文字列の中に出現したURL文字列にaタグをつける

## 引用

How to add an anchor tag to a URL in a String
http://stackoverflow.com/questions/21857602/how-to-add-an-anchor-tag-to-a-url-in-a-string

## 実装例

```JavaScript
$('p:contains("http://")').html(function(_, text) {
    var url = text.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})/g);

    $.each(url, function(i, v) {
        text = text.replace(v, '<a href="' + v + '">' + v + '</a>');        
    });
    return text;
});
```

[JSFiddle](http://jsfiddle.net/623Sd/)
視界の端の影をImageEffectで作る。

UnityのImageEffectShaderでFPSでよくある視界の端の影を作ってみました。
値をいじれば視界を狭めて周囲を見えにくくしたりできます。
回想シーンなんかにもオススメですね。
#こんな感じになります
<img width="1079" alt="スクリーンショット 2017-01-15 14.30.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/113509/8820ee2d-dcc0-79e1-9627-1a041f008597.png">
#コード
フラグメントシェーダーの部分に以下のコードを書く
(何のことを言っているかわからない人は[[Unity] ShaderTutorial2D](http://qiita.com/Teach/items/08701010e077b1933923)の最初の部分をみてください)
```
float2 r = 2.0 * (i.uv - 0.5);
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
col = lerp(col, float4(0.0, 0.0, 0.0, 0.0), smoothstep(1.0, 2.5, length(r)));
```
#仕組み
<img width="1081" alt="スクリーンショット 2017-01-15 14.39.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/113509/83f5be48-651e-0d78-0038-2fcd434b64be.png">
(１目盛は0.1)
この座標の真ん中から距離1.0までは透明にして2.5以降は黒(画面外)
1.0から2.5の間はなめらかに補間する。
この辺りの値を変えてみても面白いかもしれませんね。
iOSエンジニアの正規表現入門

## 位置

- `^`
先頭

- `$`
行末

## 量指定子

- `*`
直前のパターンに0回以上一致。`img[0-9]*`の場合、`img`,`img8`,`img123`などに一致

- `+`
直前のパターンに1回以上一致。`img[0-9]+`の場合、 `img8`,`img123`などに一致

- `?`
直前のパターンに0回か1回一致。`img[0-9]?`の場合、 `img`,`img1`が一致し、`img123`には一致しない

- `{n}`
直前に指定された文字のn回の繰り返し。`e{2}`は`Green`に一致し、`like`には一致しない

- `{n,}`
直前に指定された文字のn回以上の繰り返し。`e{2,}`は`Green`, `Greeen`, `Greeeen`に一致。`e{1,}`は`e+`と同義 

- `{,n}`
直前に指定された文字のn回以下の繰り返し。`e{,3}`は`Greeen`,`Green`,`Gren`に一致

- `{n,m}`
直前に指定された文字のn回以上m回以下の繰り返し。`e{1,3}`は`Greeeeeeeeeeeeen`の最初の3つの一致。`e{0,1}`は `e?`と同義 


## 文字


- `a`
文字`a`

- `.`
任意の1文字(改行は含まない)

- `\d`
数字1文字。`[0-9]`と同義

- `\D`
数字1文字以外。`[^0-9]`と同義

- `\w`
英数字1文字。`[a-zA-Z0-9]`と同義

- `\W`
英数字1文字以外。`[^a-zA-Z0-9]`と同義

- `\s`
空白文字1文字。`[\t\n\r\f\v]`と同義

- `\S`
空白文字 1 文字以外。`[^\t\n\r\f\v]`と同義

- `\t`
タブ1文字

- `\n`
改行1文字。


## エスケープ

| 特殊文字   | エスケープ |
|:---------:|:---:|
| \         | \\\ |
| *         | \\* |
| +         | \\+ |
| .         | \\. |
| ?         | \\? |
| { }       | \\{\\} |
| ( )       | \\(\\) |
| [ ]       | \\[\\] |
| $         | $ |
| -         | \\- |
| &#124;    | \ &#124; |
| /         | \\/ |

## 文字クラス

- `[abc]`
`abc`いずれか1文字

- `[^abc]`
`abc`以外の文字

- `[a-z]`
`a`から`z`までの子文字アルファベットのいずれか1文字。(ハイフンなどを含めたい場合`[-a-z]`)

- `[A-Z]`
`A`から`Z`までの大文字アルファベットのいずれか1文字

- `[0-9]`
`0-9`の数字のいずれか1文字

- `[A-Za-z0-9]`
結合したパターン。`A-Z`または`a-z`または`0-9`の英数字

- `[a-z&&[^bc]]`
`b`と`c`を除く`a-z`。`[ad-z]`と同義

- `(abc)`
カッコ内の文字列をひとつのグループとして管理する

- `(abc|def)`
abc, defの文字列のいずれか

- `(?:abc)`：***肯定先読み***
`abc`に一致する文字列が始まる位置にある検索文字列と一致する。一致した文字列はキャプチャはされない。`industry|industries`と指定する代わりに、`industr(?:y|ies)`と指定することができる。`Windows(?=95|98|NT|2000)`は、`Windows 2000`の`Windows` に一致し、"Windows 3.1" の "Windows"には一致しない。

- `(?!abc)`：***否定先読み***
`abc`に一致しない文字列が始まる位置にある検索文字列と一致する。一致した文字列はキャプチャはされない。`Windows (?!95|98|NT|2000)`は、`Windows 3.1` の `Windows` に一致し、`Windows 2000`の`Windows`には一致しない

- `(?<=abc)`：***肯定戻り読み***
`abc`に一致する文字列が始まる位置にある検索文字列と一致する。一致した文字列はキャプチャはされない。`(?<=Ubuntu|Debian GNU) Linux` は、`Ubuntu Linux` の `Linux` に一致し、`Vine Linux`の`Linux`には一致しない。

- `(?<!abc)`：***否定戻り読み***
`abc`に一致しない文字列が始まる位置にある検索文字列と一致する。一致した文字列はキャプチャはされない。`(?<!Ubuntu|Debian GNU) Linux` は、`Vine Linux`の`Linux`に一致し、`Ubuntu Linux`の`Linux`には一致しない。

## サンプルコード

```swift

extension String {
    func isNumber() -> Bool {
        let pattern = "^[\\d]+$"
        guard let regex = try? NSRegularExpression(pattern: pattern) else { return false }
        let matches = regex.matches(in: self, range: NSRange(location: 0, length: length))
        return matches.count > 0
    }
}

let numberString = "0123"
print(numberString.isNumber()) // true

let alphabet = "abcd"
print(alphabet.isNumber()) // false
```

## 参考
- [とりあえずこれだけ覚えよう。正規表現の基本](http://www.karakaram.com/study-regexp)
- [正規表現・ワイルドカード](http://www.cudo29.org/regexp.html)
- [正規表現の構文](https://msdn.microsoft.com/ja-jp/library/cc392020.aspx)
- [【保存版】正規表現でエスケープが必要な文字一覧表](http://qiita.com/katsukii/items/1c1550f064b4686c04d4)
- [正規表現（肯定先読み、否定先読み、肯定戻り読み、否定戻り読み）](http://d.hatena.ne.jp/satosystems/20100519/1274237784)
Pi board (Single Board Computer) and Allwinner

# Raspberry Pi

Raspberry Pi は既に5年　出てきた時は衝撃的でありましたが、今では類似品が沢山出てきました。
新たに Raspberry Pi Zero が出てきましたが、入手難です。

# ワークショップしたい

Raspberry Piとセットでワークショップ。RaspberryPiを持って帰るようにしたいけど、RaspberryPiだけで5000円超えるとキビシイ。
RaspberryPiZeroだと安いけど、入手難でできない。


# 安いPiボード

いくつか買ったもの
![IMG_20170115_113101.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/2f38c839-39f3-e6aa-ca28-f3d33b0becca.jpeg)


NanoPi-Neo
Allwinner H3, Quad-core Cortex-A7@1.2GHz

![IMG_20170115_112952.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/ed0fc4ff-5ff0-0b13-b8ab-12964cbed7bd.jpeg)
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/9e054dd6-c834-6d6e-86ff-596535043bda.png)

Orange Pi Zero
Allwinner H2 Quad-core Cortex-A7 H.265/HEVC 1080P.

Banana Pi BPI-R1
Allwinner A20 ARM Cortex-A7™ Dual-core
Banana Pi Routerや、Lamobo R1としても売られている。

# Allwinner
珠海全志科技股份有限公司（Allwinner Technology Co. Ltd.）
H2 Cortex-A7 Quad-core
H3 Cortex-A7 Quad-core
A20  Cortex-A7 Dual-core

## 中華なトホホ
### GPL違反
カーネルやU-bootなどのソースコードを提供していない
(1)
### バックドア
当然、バックドアがある。提供されているKernelでは、デバイスにメッセージ送信することでroot権限を奪取できる。(2)

(1),(2) https://en.wikipedia.org/wiki/Allwinner_Technology

## 比較
NanoPi-Neo Allwinner H3, Quad-core Cortex-A7@1.2GHz
Orange Pi Zero H2 Quad-core Cortex-A7 H.265/HEVC 1080P.
Banana Pi BPI-R1 A20 ARM Cortex-A7™ Dual-core

# Armbian

https://www.armbian.com/
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/780c3def-4a7d-f353-dca3-c738b6d40bdf.png)

対応ボード沢山
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/6bd04b9d-0fc2-e6e8-ef06-c4064aa6e417.png)


タグ
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/ddc514e8-2a4d-d142-bcd3-c69869c44efd.png)

UbuntuとDebianがあるが、Debian で。

NanoPiNeo用
Armbian_5.20_Nanopineo_Debian_jessie_3.4.112.7z
298M

Orange Pi Zero用
Armbian_5.24_Orangepizero_Debian_jessie_3.4.113.7z
189M

Banana Pi BPI-R1用
Armbian_5.24_Lamobo-r1_Debian_jessie_4.8.15.7z
202M

容量少なくて好印象です。

ARMBIANについてはこちら
http://qiita.com/nanbuwks/items/98eae3801edd24ede942
cocos2d-x 2.2.6のAndroidのapkがGoogle Play Consoleのセキュリティーエラーでリジェクトされたときの対処

cocos2d-x 2.2.6のAndroidのapkをGoogle Play Consoleにアップロードすると

>セキュリティ アラート
アプリで使用中の OpenSSL のバージョンにセキュリティの脆弱性があります。詳しくは、Google ヘルプセンターのこちらの記事で、脆弱性の修正期限などについてご確認ください。

と

>セキュリティ アラート
アプリで使用中の libpng のバージョンにセキュリティの脆弱性があります。脆弱性の修正期限など、詳しくは Google ヘルプセンターのこちらの記事をご覧ください。




というセキュリティーアラートが上がりまして、アップデートできませんでした

# まずはapk確認

```bash
$ unzip -p your.apk | strings | grep "OpenSSL"
> ...
> LSv1 part of OpenSSL 1.0.1h 5 Jun 2014
```

と

```bash
$ unzip -p your.apk | strings | grep "libpng"
> ...
> libpng version 1.2.46 - July 9, 2011
> ...
```

ってな感じになってまして、これだと古い

# OpenSSLの対応
http://www.bengigi.com/cocos2d-x-fix-for-openssl-problem/

こちらを参考に、 このブログのリンクの**Curl_fix_2.zip for Cocos2d-x 2.x**をダウンロードしまして、

`cocos2dx/platform/third_party/android/prebuilt`に入ってる`libcurl`を置き換えます

# libpngの対応

http://www.bengigi.com/cocos2d-x-2-x-android-libpng-vulnerability-fix/

こちらを参考に、このブログの記事内の**libpng_fix.zip for Cocos2d-x 2.x**をダウンロードしまして、

`cocos2dx/platform/third_party/android/prebuilt`に**libpng**は置き換えて、**libzlib**は追加します

`projects/your_propject/proj.android/jni/Android.mk`に

```
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libzlib_static

$(call import-module,libzlib)
```

を追加します


# ビルドして確認

これで、ビルドしてapkを作りまして、

```bash
$ unzip -p your.apk | strings | grep "OpenSSL"
> ...
> \CAST part of OpenSSL 1.0.1r  28 Jan 2016
```

と

```bash
$ unzip -p your.apk | strings | grep "libpng"
> ...
> libpng version 1.6.16 - December 22, 2014
> ...
```

となってればオッケーです
pythonでGoogle Analytics API(core v3)を実行する

```py3:testga.py
# -*- coding: utf-8 -*-
# Google Analytics API

import yaml
import datetime
import httplib2
from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client import tools
import argparse

CLIENT_SECRETS = 'client_secrets.json'

# The Flow object to be used if we need to authenticate.
FLOW = flow_from_clientsecrets(
    CLIENT_SECRETS,
    scope='https://www.googleapis.com/auth/analytics.readonly',
    message='%s is missing' % CLIENT_SECRETS
    )

# A file to store the access token
TOKEN_FILE_NAME = 'credentials.dat'

def prepare_credentials():
    parser = argparse.ArgumentParser(parents=[tools.argparser])
    flags = parser.parse_args()
    # Retrieve existing credendials
    storage = Storage(TOKEN_FILE_NAME)
    credentials = storage.get()
    # If no credentials exist, we create new ones
    if credentials is None or credentials.invalid:
        credentials = tools.run_flow(FLOW, storage, flags)
    return credentials 

def initialize_service():
    http = httplib2.Http()
    credentials = prepare_credentials()
    http = credentials.authorize(http)
    return build('analytics', 'v3', http=http)


# API実行(core API)
def get_ga_data(service, profile_id, start_date, end_date):
    ids = "ga:" + profile_id
    metrics = "ga:pageviews"
    dimensions = "ga:Year,ga:month,ga:day,ga:pagetitle"
    filter = "ga:pageviews>=100"
    data = service.data().ga().get(
        ids=ids, start_date=start_date, end_date=end_date, metrics=metrics,
        dimensions=dimensions, filters=filter).execute()
    return data

# main
if __name__ == '__main__':
    service = initialize_service()
    profile_id = "12345678"  #対象サイトのプロファイルID
    start_date = "2017-01-01"
    end_date = "2017-01-10"
    data = get_ga_data(service, profile_id, start_date, end_date)
    row = data["rows"]
    nm = ['ga_year','ga_month','ga_day','ga_pageTitle','ga_pageviews'] 
    lst = []
    for i in row:
        d = dict(zip(nm,i))
        lst.append(d)
    print(lst)
    print("finish!")  

```
・Google Developers Consoleにて、Google AnalyticsのAPIを有効化する
・同じくgoogle Developersにて、oauth用の認証トークンを取得
　(ファイル名：client_secrets.json)
・初回アクセス時はブラウザが表示されてGoogleのOauth認証を実施、その時credentials.datが生成（２回目以降はこのcredentials.datを元にしてOauth認証を省略できる）
・上記のスクリプトではget_ga_data()でGoogle Analytics APIを実行してデータを取得、最後に辞書dictの形式にしているのは[SQLAlchemyで最寄りのRDBにデータを格納する](http://qiita.com/Fortinbras/items/884b140de5af10183738)ため
MacからSSHポートフォワードで自宅のSambaにアクセスする

# MacからSSHポートフォワードで自宅のSambaにアクセスする

![20170105224241.png](https://qiita-image-store.s3.amazonaws.com/0/46188/7ca0dd41-6a15-fc2d-2af9-74834a7af6ce.png)

現在自宅で動作しているSambaサーバはローカルNWからのみアクセスできる状況で、外部からアクセスすることはできません。
常々外からアクセスしたかったのですが、SSHポートフォワードならどうにかできるのではないかと思い、今回試してみました。

外部からSSHできるサーバが必要です。
**smbサーバのホスト名:** smb.example.com (内部のみで解決できるものでもOK)
**sshできるサーバのホスト名:** sshd.example.com

## 単純にローカルPCのLocalhostへ139番をforwardする

ローカルPC上で下記のコマンドを実行します。

```bash
### 127.0.0.1の139からsmb.example.comの139へForwardする
% sudo ssh -L 139:smb.example.com:139 username@sshd.example.com
```

localhostの139へアクセスしようとしても、Mac内のルールにより阻まれるようです。(127.0.0.1としても同様)

![20170105224247.png](https://qiita-image-store.s3.amazonaws.com/0/46188/92189a65-03b9-4f00-69a1-a68d36f9d6dc.png)

![20170105223428.png](https://qiita-image-store.s3.amazonaws.com/0/46188/18966228-eff6-e6f2-c54b-d1afe2e30ba9.png)

## ループバックアドレスを追加して試す

127.0.0.1でなければ良いのではないかということで、127.0.0.2をループバックアドレスに追加してみます。

```bash
### ループバックアドレスを追加
% sudo ifconfig lo0 alias 127.0.0.2 255.255.255.0
% ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=3<RXCSUM,TXCSUM>
	inet6 ::1 prefixlen 128
	inet 127.0.0.1 netmask 0xff000000
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
	inet 127.0.0.2 netmask 0xff000000
	nd6 options=1<PERFORMNUD>
...

### 127.0.0.2の139からsmb.example.comの139へForwardする
% sudo ssh -L 127.0.0.2:139:smb.example.com:139 username@sshd.example.com
```

127.0.0.2を指定して接続してみると、無事接続できました。

![20170105224233.png](https://qiita-image-store.s3.amazonaws.com/0/46188/b4610d57-d899-d215-5cd2-c4e48d72f6af.png)

![20170105224241 (1).png](https://qiita-image-store.s3.amazonaws.com/0/46188/64fe6669-1281-8779-4d0e-b46647cbcc41.png)

## 補足

1024番以上であればsudoしなくても大丈夫です。

```bash
### 127.0.0.2の8139からsmb.example.comの139へForwardする
% ssh -L 127.0.0.2:8139:smb.example.com:139 username@sshd.example.com
```

![20170105224623.png](https://qiita-image-store.s3.amazonaws.com/0/46188/2dc94558-5524-61fd-a40e-42f1cd82c8a2.png)

あとは、ショートカットも作っておくと便利です。

![20170105225219.png](https://qiita-image-store.s3.amazonaws.com/0/46188/b0796d44-e105-3e52-7b7a-dc9a4b678d1f.png)

--

この投稿は、以前にブログに書いたものと同様の内容になります。
http://jimaoka.hatenablog.jp/entry/smb-sshforward
無料のGRC代替クラウドサービス「Serposcope」をConoHaで動かす

# Conohaにサーバーを立てる

メモリ512MBのプランなら月630円。

![bacbe5e559115dad87f60d973511c005[1].png](https://qiita-image-store.s3.amazonaws.com/0/76653/26321504-0a3f-24a3-5f1b-88910612b14d.png)

Serposcopeを動かすためのアレコレを入れていきます。

## Nginxのインストールと設定

まずはNginx。

```
$ yum -y install nginx
```

Serposcopeを `/var/www/serposcope` に入れる前提で設定していきます。
また、URLに `:7134` をつけるのもスマートじゃない感じがするので、ポート80に来たアクセスを7134に振るようにしておきます。 

``` /etc/nginx/nginx.conf

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/serposcope;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            root              /var/www/serposcope;
            proxy_pass        http://127.0.0.1:7134;
            proxy_set_header  X-Forwarded-Host $host;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

```

終わったら設定を反映するための再起動と、Nginxが自動で起動するよう設定しておきます。

```
$ systemctl restart nginx
$ systemctl enable nginx
```

## Serposcopeのインストール

まずはSerposcopeの動作に欠かせないJavaをインストールします。

```
$ yum -y install java-1.8.0-openjdk.x86_64
```

次に、 `/var/www/serposcope` ディレクトリを作ってSerposcopeをインストールします。

```
$ mkdir -p /var/www/serposcope
$ cd /var/www/serposcope
$ wget https://serposcope.serphacker.com/download/2.6.0/serposcope-2.6.0.jar
```

`nohup` でターミナルを閉じても終了しないようにしつつ起動。

```
$ nohup java -jar /var/www/serposcope/serposcope-2.6.0.jar
```

## Firewallの設定

`http` と、Serposcopeが使う `7134` のポートを通します。

```
$ firewall-cmd --add-service=http --permanent
$ firewall-cmd --add-port=7134/tcp --zone=public --permanent
```

`--permanent` を使ったため設定をリロード。

```
$ firewall-cmd --reload
```

# できあがり

IPアドレス `http://***.***.***.***/` にアクセスすると `http://***.***.***.***/create-admin` にリダイレクトされアカウントが作成できます。

![1ffa7d313d3b80d990986fbc113ea2be[1].png](https://qiita-image-store.s3.amazonaws.com/0/76653/32f675d9-aa2c-d34c-032a-58c60c15d395.png)

ログインして出来上がり。

# アップデート
```
$ cd /var/www/serposcope
$ wget https://serposcope.serphacker.com/download/2.10.0/serposcope-2.10.0.jar
$ nohup java -jar /var/www/serposcope/serposcope-2.10.0.jar
```

# 参考

[段田さんのブログ](https://dandashokai.com/3670)でSerposcopeを知りました。陳謝。
時刻かつURLごとのアクセス数(ヒストグラム形式)を一気に集計するSQL

BigQueryとかでログっぽいものを集計する時のアイデアメモ。
こういうのは名前が決まってると会話しやすいんだけど、なんか必殺技名ないものかしら。

## 元データのイメージ

以下のようなテーブルにログ的なデータが入ってたとする。

`logs`

|created|path|message|
|:-:|:-:|:-:|
|2017-01-01 00:00:00.0123|/foo| なんか適当な付加情報|
|2017-01-01 00:00:01.1234|/baa| なんか適当な付加情報|
|2017-01-01 00:00:02.0123|/baa| なんか適当な付加情報|
| ... | | |


これを時刻ごとに区切って、◯時台だと`/foo`に何回、`/baa`に何回、アクセスがあったよーみたいなのを計算したい。

どう書きますか？


## 私の回答

要件によるんだけど、pathのパターンが数種類だけで決まっているなら、すごく簡単な1個のSQLで作れる。
ここではBigQueryの関数を使っているけれど、時刻の関数はどのRDBMSにもついてるだろうし、たぶん似たような発想で作れると思う。

```sql
  SELECT UTC_USEC_TO_HOUR(created) AS period
       , SUM(path = '/foo') AS foo
       , SUM(path = '/baa') AS baa
       , SUM(path = '/moo') AS moo
    FROM logs
   WHERE created BETWEEN '2017-01-01' AND '2017-01-02'
GROUP BY period
ORDER BY period
```

こういう感じのデータが取れるはず。

|hour|foo|baa|moo|
|:-:|:-:|:-:|:-:|
|2017-01-01 00|112|2523|321|
|2017-01-01 01|90|2121|123|
|...| | | |

ポイントはアクセス数を出すときにCOUNTじゃなくてSUMを使うこと。trueは1としてカウントされ、falseなら0でカウント対象にならない。
Structの保存

#Structの保存をしたい

swiftのStructってデータの管理に便利ですよね。
私はよくJSONで受け取ったデータをStructにパースして使っています。

でもUserDefaultsにStructを保存することはできません。
なのでDictionaryを使ってなんとかして見るというお話しです。

##例えば

このユーザーデータを保存したいとします。


```swift

struct SampleUserData {
    var id:Int
    var name:String
    var profileUrls:profileUrlData
    
    struct profileUrlData {
        var midium:String
        var original:String
        var small:String
        
        init(json: JSON){//JSONはSwiftyJSON　
            self.small = json["small"].stringValue
            self.original = json["original"].stringValue
            self.midium = json["midium"].stringValue
        }
    }
    
    init(json: JSON){
        self.name = json["name"].stringValue
        self.id = json["id"].intValue
        self.profileUrls = profileUrlData(json: json["profile_urls"])
    }
}

```

##実装

まず保存可能な型が批准するプロトコルを作ります。

```swift

protocol Storable {//保存したい型が批准する
    var dict:[String:Any]{get}
    init(dict: [String:Any])
}

```

で保存したいStructを批准させます。


```swift

struct SampleUserData:Storable {
    var name:String
    var id:Int
    var profileUrls:profileUrlData
    
    var dict: [String : Any]{//保存用
        return ["name": name,"id": id,"profile_urls": profileUrls.dict]
    }
    
    struct profileUrlData:Storable {
        var midium:String
        var original:String
        var small:String
        
        var dict: [String : Any]{//保存用
            return ["midium":midium,"original": original,"small": small]
        }
        
        init(json: JSON){
            self.small = json["small"].stringValue
            self.original = json["original"].stringValue
            self.midium = json["midium"].stringValue
        }
        init(dict: [String : Any]) {//展開用Init
            self.midium = dict["midium"] as? String ?? ""
            self.original = dict["original"] as? String ?? ""
            self.small = dict["small"] as? String ?? ""
        }
    }
    
    init(json: JSON){
        self.name = json["name"].stringValue
        self.id = json["id"].intValue
        self.profileUrls = profileUrlData(json: json["profile_urls"])
    }
    init(dict: [String : Any]) {//展開用Init
        self.name = dict["name"] as? String ?? ""
        self.id = dict["id"] as? Int ?? 0
        self.profileUrls = profileUrlData(dict: (dict["profile_urls"] as? [String: Any] ?? [:]))
    }
}

```

最後にUserDefaultsをちょっといじります。


```swift

extension UserDefaults {
    func set(_ value: Storable,forKey defaultName: String){
        self.set(value.dict, forKey: defaultName)
    }
    func `struct`<T: Storable>(type: T.Type,forKey defaultName: String)->T?{
        return T(dict: dictionary(forKey: defaultName) ?? [:])
    }
}
```

##使い方

```swift
let data:JSON //APIとかから取ってきたJSON
let defaults = UserDefaults()
let userData = SampleUserData(json: json)//保存するデータ
        
//保存する時
defaults.set(userData, forKey: "sampel_key")
        
//読み込む時
let loadUserData = defaults.struct(type: SampleUserData.self, forKey: "sampel_key")

```

これで保存できると思います。
ただしStructみたいな大きなものの保存は時間がかかることが多いと思うので、
Asyncスレッドで行なっとほうがいいと思います。

あとUserDefaultsは起動時？に一旦全部保存したものをメモリに展開するっぽいので、
あまり保存しすぎにも注意。


他にもいい方法あったら教えてください
sourcetreeの無料ラインセンスが更新されない

gitはコマンド主義だったので、ずっとsourcetreeをほっておいたら、アプリが更新されていた。
アップデートしようとしたら、既存のアカウントのライセンス更新をおこなうことが出来ない。
止むを得ないので新しいメールアドレスでatlassianアカウントを再発行でアップデート完了。

みんなはどうしてるよ
tweepyでRTを取り消す方法

#まず結論
**API.get_status(ID,include_my_retweet=1)**
と指定すると帰ってくるstatusオブジェクトにcurrent_user_retweet{u'id':xxx, u'id_str':u'xxx'}がくっついてくる。
そのIDがretweetIDであり、それをAPI.destroy_status(ID)に入れるとRTが取り消される仕組み。
使用例としてはこんな感じになる。

```python:undo_retweet.py
status = api.get_status(ID, include_my_retweet=1)
if status.retweeted == True:
    api.destroy_status(status.current_user_retweet['id'])
```

#細かい概要
まずtweepyのAPIリファレンスを除くと下のような感じで表示されている。
このようにIDだけ指定するとcurrent_user_retweetは帰ってこない上にAPI.destroy_retweet(id)も存在しないためRTの取り消しができない。
![Image1](https://qiita-image-store.s3.amazonaws.com/0/159834/9e864a7a-e434-47f1-ae71-d9687b2355b2.png)

一応retweet時に返されるstatusオブジェクトのIDがretweetIDなのだが、一度retweetしてしまうと手動で取り消してやって、さらにretweetIDをtxtファイルなんかに保存しないといけなくなる。これは非常にめんどくさい。
そこで調べてみた所下記の記事が見つかった
http://pg-kura.hatenablog.com/entry/20120328/1332949548

PHP(?)の記事らしいのだが、これがtweepyでそのまま使えるらしい。
要するにリファレンスを見るとidしか指定できないような感じだが実際はinclude_my_retweetも指定できるよということである。
SQLアンチパターン：フィア・オブ・ジ・アンノウン (恐怖の unknown)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 欠けている値を区別する

# アンチパターン

一般値を NULL に相当するものとして扱うこと

- SQLは、null を False、空文字列と異なる特殊な値をとして区別する
- null をさけるために一般値を使う

## 用いてもいいパターン

# 解決策

NULL を一意な値として使う

- NULL は、TRUE でも FALSE でもない
- NULL は、検索時も別（IS NULLとか）
- NOT NULL 制約を使う

# まとめ

データ型を問わず、欠けている値には NULL を用いるようにしましょう。

# 感想

なるべく、NOT NULL制約を使うようにしていたなあ

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
関連付けたテーブルの取得時、特定のカラムでソートして取得する方法

## ユースケース
会社`companies`モデルと、社員`employees`モデルがあって、一対多の関係を設定済み。
`companies`モデルの取得時に、`employees`モデル側を`id`カラムではなく`number`カラム順で取得したい。

### ダメな例
はじめは以下のように書いた（どこかのサイトの記事を参考にして）

```rb
class Company < ApplicationRecord
  ...中略...
  has_many   :employees, order: 'number'
```

すると、以下のように「そんなキーないですよ」と怒られます。

```
Unknown key: :order. Valid keys are: :class_name, :anonymous_class, :foreign_key, :validate, :autosave, :table_name, :before_add, :after_add, :before_remove, :after_remove, :extend, :primary_key, :dependent, :as, :through, :source, :source_type, :inverse_of, :counter_cache, :join_table, :foreign_type, :index_errors
```

### 正しい例

正しくは以下。

```rb
class Company < ApplicationRecord
  ...中略...
  has_many   :employees, -> { order(:number) }
```

古い記事だったからかもしれないが、とりあえず `5.0.0` では上記の書き方で動いたので、備忘録として残しておく。
RStudio Desktop に R の位置を教える方法

<img width="532" alt="Screenshot 2017-01-15 10.29.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/6637/b6eafdbb-7797-7894-db90-d56a4d01d093.png">

RStudio Desktop が R を発見できないとき、上のようなメッセージが表示され起動できない。

私は R を `brew install homebrew/science/r` でインストールしている。そして、homebrew を `/opt/brew` に置いているため、RStudio が R を見つけられず上のメッセージが表示されてしまう。

このような状況で RStudio Desktop に R の位置を伝えるには、`RSTUDIO_WHICH_R` 環境変数を使う必要がある。この環境変数に R コマンドのフルパスを指定すると RStudio Desktop を起動できるようになる (この処理が実装されているのは、macOSの場合は[ここ](https://github.com/rstudio/rstudio/blob/master/src/cpp/desktop-mac/AppDelegate.mm#L196)、その他の UNIX 系 OS の場合は[ここ](https://github.com/rstudio/rstudio/blob/master/src/cpp/desktop/DesktopPosixDetectRHome.cpp#L56)だと思う)。

上のエラーメッセージを RStudio Desktop のコード内で grep するだけで正しいやり方を見つけられたので OSS はとても便利だ。公式な情報源はおそらく[このページ](https://support.rstudio.com/hc/en-us/articles/200486138-Using-Different-Versions-of-R)だと思うのだが、私はここにたどり着けなかったので実装を見に行った。

ちなみに、macOS Sierra で端末エミュレータ内ではなくグローバルに環境変数をセットするには、[launchctl を使ってログイン時に環境変数を設定させる必要がある](http://qiita.com/hoisjp/items/19374252db8e748c3407)。

また、CRAN で配布されている R をインストールしている場合、RStudio Desktop は適切に R コマンドを見つけられるため、上記のような面倒な手続きは不要である。例えば macOS の場合、[R.framework 内の R コマンドの位置が埋め込まれている](https://github.com/rstudio/rstudio/search?utf8=%E2%9C%93&q=%2FLibrary%2FFrameworks%2FR.framework)ため、このような問題は起こらないはずである。
アナログ センサー(水分 / 温度) +NTP時計 , with ATmega328P

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。

![IMGP6324.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/096e8997-612d-aa73-7165-7ddcfa122fc8.jpeg)

アナログ(水分センサ＋温度センサ)、NTP時計でDeepSleep(省エネ)版

### Youtube
https://www.youtube.com/watch?v=DFSB9XVi51M
### Parts
Analog- Soli Moisture Sensor
Analog Temperature Sensor : LM60BIZ
I2C 0.96 inch OLED display
### arduino Library:
Time: http://playground.arduino.cc/code/time
TimeLib
WiFiUdp
Adafruit_SSD1306
### Schematic
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-4/blob/master/Analog4_OLED_sch.pdf

![ss-SCH-0107p2.png](https://qiita-image-store.s3.amazonaws.com/0/159710/8f09d708-94b9-2c2e-7814-fe1ffc8ee406.png)
### Driver ,Git
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-4
### Analog DATA
![ss-Moist-0107p1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/7cbe9145-7b9d-503d-3260-3bbc586c5cd9.png)
***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related -List :
http://kuc-arc-f.com/make/?p=1199
C++ > stdint.h > sizeof(int[][3])とsizeof(uint8_t[][3]) > 48と12

```txt:動作環境
ideone > C++14
C++ Builder XE4でも確認
```

[C++ Builder XE4で実装していたプログラム](http://qiita.com/7of9/items/a0e8cf6ab5a4c22d615f)にてstdint.hを使い始めて、はまった。

http://ideone.com/iOea2H

```cpp
#include <iostream>
using namespace std;
#include <stdint.h>
 
static const int kTable_cond1[][3] = {
	{ 1, 0, 0 },
	{ 0, 1, 0 },
	{ 0, 0, 1 },
	{ 0, 1, 1 }
};
static const uint8_t kTable_cond2[][3] = {
	{ 1, 0, 0 },
	{ 0, 1, 0 },
	{ 0, 0, 1 },
	{ 0, 1, 1 }
};
 
int main() {
	printf("%zu\n", sizeof(kTable_cond1));
	printf("%zu\n", sizeof(kTable_cond2));
	return 0;
}
```

```txt:結果
48
12
```

上記の違いにより
`int tbl[3];`
`int sizeCond = sizeof(kTable_conditions) / sizeof(tbl);`
の結果が4と1の違いが出て、はまった。

<hr>
@SaitoAtsushi さんに上記に関する詳細記事を用意いただきました。
http://qiita.com/SaitoAtsushi/items/ee17466c464fb7a270d2

感謝です。
DeepSleep ,NTP Clock(OLED) + analog Sensor(LM60BIZ) with ATmega328P

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino/softwareSerial/ arduinoライブラリ等 を使用した製作事例の一部となります。

![IMGP6321.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/c3522a2c-c056-e804-a792-50738d8a347b.jpeg)

NTP時計、アナログ温度センサ(LM60BIZ )の組合せで
DeepSleep活用で省エネ仕様。モバイル電源で動作可能としています

### Youtube
https://www.youtube.com/watch?v=Nr1gms7E9XY
### arduino Library:
Time: http://playground.arduino.cc/code/time
TimeLib
WiFiUdp
Adafruit_SSD1306
### 配線
A0 : Moisture Sensor
A4/A5 : I2C OLED 0.96 inch display
### Schematic
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-3/blob/master/Analog_OLED.pdf
![ss-Analog_OLED.png](https://qiita-image-store.s3.amazonaws.com/0/159710/6c17626f-a71f-fc68-5ecf-616a4876df4a.png)

### Driver ,Git
https://github.com/kuc-arc-f/makeKuc-SNTP-Analgog-3

### Analog DATA
![ss-NTP-0103a1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/489ede1c-f8dd-92ab-f05c-a87ca1b77936.png)

***
[related- Parts ] mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
スライサー（FDM式３Ｄプリンタ向け）の作成　目次

# 目次

* [其の１　概要](http://qiita.com/isTwt/items/fb6b16573a3a5ddd1d25)
* [其の２　ソフト概要](http://qiita.com/isTwt/items/c23381879f889e59d5ca)
* [其の３　座標軸](http://qiita.com/isTwt/items/8ba8aeaf63cc9ace5b04)
* [其の４　法線](http://qiita.com/isTwt/items/867ac5934b2329257c82)
* [其の５　出力結果の構成](http://qiita.com/isTwt/items/695f7a932d687b711ff1)
* [其の６　層の構成](http://qiita.com/isTwt/items/1d52a242c448cc72270f)
* [其の７　輪切りアルゴリズム](http://qiita.com/isTwt/items/129ee9d06d79ee38d871)
* [其の８　閉領域の縮小アルゴリズム](http://qiita.com/isTwt/items/9a0703a4fa27bbcc7379)
* [其の９　インフィルアルゴリズム](http://qiita.com/isTwt/items/55488a133b9f92a4b96b)
* [其の１０　閉領域の分割アルゴリズム](http://qiita.com/isTwt/items/57856da03709b683b010)
* [其の１１　サポートモデル](http://qiita.com/isTwt/items/e360204409d33a096c9c)
* [其の１２　ラフトモデル](http://qiita.com/isTwt/items/c9e7ae151d7a5beb0e12)
* [其の１３　スカート／ブリムモデル](http://qiita.com/isTwt/items/2c114755fe7e18bc3695)
* [其の１４　閉領域からのポリゴン化アルゴリズム](http://qiita.com/isTwt/items/92874c74fcfcda1e6268)
* [其の１５　平面ポリゴンの立体化アルゴリズム](http://qiita.com/isTwt/items/3d2ee881f92681acda74)
* [其の１６　出力順番について](http://qiita.com/isTwt/items/0c15ff57a967933e13ce)
* [考察１　最適経路について](http://qiita.com/isTwt/items/326ab68f7d0fb1830acc)
* [考察２　外壁の厚みについて](http://qiita.com/isTwt/items/57d5e45b40f791ef6c99)
* [考察３　レイヤー高さについて](http://qiita.com/isTwt/items/10d8fd576c238db60b3f)
* [考察４　マイクロレイヤリングについて](http://qiita.com/isTwt/items/d33af09a2f9c42c4278f)
* 考察５　エッジについて
* 考察６　オーバーハングについて
* 考察７　スライスパラメータと出力物の関係について
* 例題１　凸形状モデルのスライス
* 例題２　凹形状モデルのスライス
* 例題３　穴空形状モデルのスライス
* 例題４　斜傾形状モデルのスライス
* 付録Ａ　STLファイルフォーマット
* [付録Ｂ　G-Code](http://qiita.com/isTwt/items/ad3ae9ff394359d821ec)
* [付録Ｃ　パラメータ](http://qiita.com/isTwt/items/c02d942f9568d80cf3a8)

-----
目次の頁を設けることにしました。