OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity] EventTrigger.On(Begin|End)Drag は IDragHandler を実装しないと動かない

表題の通りです。
UnityのuGUI上でドラッグ動作の開始/終了時に処理を実行させたい時の話です。

[IBeginDragHandler - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/EventSystems.IBeginDragHandler.html)
[IEndDragHandler - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/EventSystems.IEndDragHandler.html)

> 注: IBeginDragHandler に加え IDragHandler を実装する必要があります。
> 注: IEndDragHandler に加え IDragHandler を実装する必要があります。

![drag1.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/38b2d9de-a347-d009-3897-90d55d39538a.gif)

`IDragHandler` を実装していない場合に `On(Begin|End)Drag` が実行されません

![drag2.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/8b8cab97-3796-8526-71ca-7e1d8ee01061.gif)

`IDragHandler` を実装すると `On(Begin|End)Drag` が実行されます

### UniRx.Triggersで実行する場合にも同様
`On(Begin|End)DragAsObservable` 実行時に 
`GetOrAddComponent` される `Observable(Begin|End)DragTrigger` に関しても、それぞれ `IBeginDragHandler` / `IEndDragHandler` のみを実装しているため `On(Begin|End)DragAsObservable`のみの宣言だと動作しません

![drag3.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/783e57e1-275e-a4c2-0fa0-f10b30fe7601.gif)

明示的に `this.gameObject.AddComponent<ObservableEndDragTrigger>()` か `this.OnDragAsObservable().Subscribe();` を記載する必要があります

![drag4.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/8144886e-73f4-04e6-d96e-dc3c9674d020.gif)
はてなダイアリー to Markdown > v0.1:sub list対応, v0.2-v0.3: スーパーpre記法対応

はてなダイアリーは新規登録受付を停止している。
新規登録受付を停止したサービスが今後どの期間利用できるか不透明な中、はてなダイアリーの内容の別サービス移行をしている。

はてなダイアリーでは独自のはてな記法があるため、それをMarkdown形式に変換する必要がある。

### はてな記法

- [はてな記法](http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E4%B8%80%E8%A6%A7)

### code v0.1

リスト表記について対応した。

https://ideone.com/BUzR59

```py
import sys

# on Python 3.5

'''
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''

# read from stdin
lines = sys.stdin.readlines()

SPACE4 = "    "

for elem in lines:
    wrk = elem
    if "---" in wrk:
        wrk = wrk.replace("---", SPACE4 + SPACE4 + "-")
    if "--" in wrk:
        wrk = wrk.replace("--", SPACE4 + "-")
    print(wrk, end='')

```

### 使用方法

- 変換したいはてなダイアリーの内容をstdinに貼る
- 実行する
- 出力されるstdoutをMarkdownとして利用する

再実行する場合はstdoutの「Clear the output」で出力をクリアしてから実行する。

### code v0.2, v0.3

スーパーpre記法に対応した。

https://ideone.com/pyFxzo

```py
import sys

# on Python 3.5

'''
v0.3 Apr. 25, 2018
   - conv_super_pre_notation() takes cpp notation
v0.2 Apr. 25, 2018
   - add conv_super_pre_notation()
   - add conv_sublist()
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''


def conv_sublist(astr):
    if "---" in astr:
        astr = astr.replace("---", SPACE4 + SPACE4 + "-")
    if "--" in astr:
        astr = astr.replace("--", SPACE4 + "-")
    return astr


def conv_super_pre_notation(astr):
    astr = astr.replace(">||", "```")
    astr = astr.replace(">|cpp|", "```cpp")
    astr = astr.replace(">|c|", "```c")
    astr = astr.replace("||<", "```")
    return astr

# read from stdin
lines = sys.stdin.readlines()

SPACE4 = "    "

for elem in lines:
    wrk = conv_sublist(elem)
    wrk = conv_super_pre_notation(wrk)
    print(wrk, end='')

```

### TODO

自分の移行作業において必要な実装を逐次行う。
ツールについての個人的なまとめ

#この記事について#
自分の備忘録として、ツール全般についての自分の考えや調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。


#テキストエディタ

| 名前      |       説明|       参照|
|:-----------------|:------------------|:------------------|
|vim|CUIのエディタ。主にLinux環境で使用。|[Vim初心者に捧ぐ実践的入門](https://qiita.com/okamos/items/c97970ab34ff55ff3167)|
|cron|linuxのスケジューラー。指定時間にプログラムを実行できる|[cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)|
RustでS3にファイルの読み書きをしてみた

# 目的
RustでS3の読み書きをしてみたかったです。JSONファイルを書き込んでから、取得してみます。
rusoto_s3 = "0.40.0"で動かなくなっていたので、修正。

```rust:Cargo.toml
[package]
name = "s3"
version = "0.1.0"
edition = "2018"

[dependencies]
rusoto_core = "0.40.0"
rusoto_s3 = "0.40.0"
futures = "0.1.29"
serde_json = "1.0.40"
```

```rust:main.rs
use rusoto_core::{Region};
use rusoto_s3::{S3, S3Client, GetObjectRequest, PutObjectRequest};
use futures::{Future, stream::Stream};
use serde_json::Value;

fn main() {
    // 環境変数から取得する
    std::env::set_var("AWS_ACCESS_KEY_ID", "xxxxx");
    std::env::set_var("AWS_SECRET_ACCESS_KEY", "xxxxx");

    // クライアントの作成
    let client = S3Client::new(Region::UsEast1);

    // JSONの作成
    let data = r#"{
        "name": "予定表〜①ﾊﾝｶｸだ",
        "value": 123456
    }"#;
    let value: Value = serde_json::from_str(&data).unwrap();

    // リクエスト作成
    let mut request = PutObjectRequest::default();
    request.bucket = String::from("bucket_name");
    request.key = String::from("test.json");
    request.body = Some(format!("{}", value).into_bytes().into());

    // アップロード
    let _result = client.put_object(request).sync().unwrap();
    //println!("{:?}", result);

    // 取得するS3のデータを作成する
    let mut request = GetObjectRequest::default();
    request.bucket = String::from("bucket_name");
    request.key = String::from("test.json");

    // データを取得する
    let object = client.get_object(request).sync().unwrap();
    let body = object.body.unwrap().concat2().wait().unwrap();

    // JSONに変換する
    let data = String::from_utf8_lossy(&body);
    let value: Value = serde_json::from_str(&data).unwrap();
    println!("{:?}", value);
}
```
Python 基本コード2

```python
team=['sato','nao','john','lisa','kaoru','ryo','bob','jack','mary','linda','yosuke','takashi','saori', 'yuki','tomo', 'take','yusuke','nori','mari','sachi']
boss=['john','lisa','bob','jack','takashi','nori','mari','sachi']
even=[]
odd=[]

cnt = 1
for member in team:
    if(cnt%2 == 0):
        even.append(member)
    else:
        odd.append(member)
    cnt = cnt + 1
print(even)
print(odd)

['nao', 'lisa', 'ryo', 'jack', 'linda', 'takashi', 'yuki', 'take', 'nori', 'sachi']
['sato', 'john', 'kaoru', 'bob', 'mary', 'yosuke', 'saori', 'tomo', 'yusuke', 'mari']


```


```python
team=['sato','nao','john','lisa','kaoru','ryo','bob','jack','mary','linda','yosuke','takashi','saori', 'yuki','tomo', 'take','yusuke','nori','mari','sachi']
boss=['john','lisa','bob','jack','takashi','nori','mari','sachi']
even=[]
odd=[]

cnt = 1
for member in team:
    if(cnt%2 == 0):
        name = member + ' even'
        even.append(name)
    else:
        name = member + ' odd'
        odd.append(name)
    cnt = cnt + 1
print(even)
print(odd)


['nao even', 'lisa even', 'ryo even', 'jack even', 'linda even', 'takashi even', 'yuki even', 'take even', 'nori even', 'sachi even']
['sato odd', 'john odd', 'kaoru odd', 'bob odd', 'mary odd', 'yosuke odd', 'saori odd', 'tomo odd', 'yusuke odd', 'mari odd']
```

```python
def show_member(num):
    even=[]
    odd=[]
    
    for n in range(len(boss)):
        if(n%2==0):
            even.append(boss[n])
        
        else:
            odd.append(boss[n])
            
    if(num%2==0):
        print_member(even)
        
    else:
        print_member(odd)
        
        
def print_member(mlist):
    for member in mlist:
        print(member)

#ぶんりする
```

```python
def show_boss(n):
    boss=['john','lisa','bob','jack','takashi','nori','mari','sachi']
    print(n)
    for n in range(n):
        print(boss[n])

def say():
    print('hello')       

def sayst(word):
    print('---------')
    print(word)
    print('---------')
    
sayst('start')
show_boss(5)
say()
sayst('end')

---------
start
---------
5
john
lisa
bob
jack
takashi
hello
---------
end
---------
```
cocos2d-xでWebSocketの通信を行う

# やりたかったこと

cocos2d-x上でWebSocketを使って各端末間で通信したかった

# 用意するもの

## WebSocketを受け付けるサーバー

今回はPHPの [Ratchet](http://socketo.me/) を使ってサーバーを用意した。
[Ratchetのチュートリアル](http://socketo.me/docs/hello-world) に従ってtelnetでの接続確認後にHttpで受け付けるように変更してサーバーとして利用している。

先日の [記事](https://qiita.com/FrozenVoice/items/56d0606324089b7e96d6) はこの時にWindows10上でtelnetが使いたかったので生まれた。

## cocos2d-xでの送受信

WebSocket::Delegateが用意されているのでそちらを利用する。

```cpp:WebSocket.h
#include <WebSocket.h>

class WebSocket : public cocos2d::Scene, WebSocket::Delegate
{
public:
    virtual void onOpen(WebSocket* ws);
    virtual void onMessage(WebSocket* ws, const WebSocket::Data& data);
    virtual void onClose(WebSocket* ws);
    virtual void onError(WebSocket* ws, const WebSocket::ErrorCode& error);

    WebSocket* webSocket;
```

```cpp:WebSocket.cpp
bool WebSocket::init()
{
    webSocket = new WebSocket();
    webSocket->init(*this, "ws://[WebSocketサーバー]");

    webSocket->send("メッセージ送信");
}

void Chat::onOpen(WebSocket* ws) {
    log("接続しました。");
}
void Chat::onMessage(WebSocket* ws, const WebSocket::Data& data) {
    log(data.bytes);
}
void Chat::onClose(WebSocket* ws){
    log("切断されました。");
}
void Chat::onError(WebSocket* ws, const WebSocket::ErrorCode& error){
}
```
cでxor

#概要
cでxorやってみた。

#サンプルコード

```
#include <stdio.h>
#include <math.h>

int x[3];
int t[3];
double g[3];
double z[3];
double h[3][3];
double w[3][3];
#define sigmoid(a)	  		(1.0 / (1.0 + exp(-(a))))
int main()
{
	srand((unsigned) time(NULL));
	double alpha = 0.06;
	for (int j = 0; j <= 2; j++)
	{
		for (int i = 0; i <= 2; i++)
		{
			w[j][i] = (double) ((rand() % 2000) - 1000) / 1000;
		}
	}
	for (int j = 0; j <= 2; j++)
	{
		for (int i = 0; i <= 2; i++)
		{
			h[j][i] = (double) ((rand() % 2000) - 1000) / 1000;
		}
	}
	for (int count = 0; count < 70001; count++)
	{
		x[0] = 1;
		x[1] = rand() % 2;
		x[2] = rand() % 2;
		t[0] = (x[1] ^ x[2]);
		for (int i = 0; i <= 2; i++)
		{
			double sum = 0;
			for (int j = 0; j <= 2; j++)
			{
				sum += w[j][i] * x[j];
			}
			g[i] = sigmoid(sum);
		}
		for (int i = 0; i < 1; i++)
		{
			double sum = 0;
			for (int j = 0; j <= 2; j++)
			{
				sum += h[j][i] * g[j];
			}
			z[i] = sigmoid(sum);
		}
		alpha = 0.06;
		for (int j = 0; j < 1; j++)
		{
			for (int i = 0; i <= 2; i++)
			{
				h[i][j] += alpha * g[i] * (t[j] - z[j]) * z[j] * (1.0 - z[j]);
			}
		}
		for (int k = 0; k < 1; k++)
		{
			for (int j = 0; j <= 2; j++)
			{
				double dj = (t[k] - z[k]) * z[k] * (1.0 - z[k]) * h[j][k] * g[j] * (1.0 - g[j]);
				for (int i = 0; i <= 2; i++)
				{
					w[i][j] += alpha * x[i] * dj;
				}
			}
		}
		double error = 0;
		for (int i = 0; i < 1; i++)
		{
			error += (t[i] - z[i]) * (t[i] - z[i]);
		}
		if ((count % 10000) != 0) continue;
		printf ("epoc : %6d loss : %.4f \n", count, error);
	}
	printf("0,0 = ");
	x[1] = 0;
	x[2] = 0;
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += w[j][i] * x[j];
		}
		g[i] = sigmoid(sum);
	}
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += h[j][i] * g[j];
		}
		z[i] = sigmoid(sum);
	}
	printf("%.2f\n", z[0]);
	printf("0,1 = ");
	x[1] = 0;
	x[2] = 1;
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += w[j][i] * x[j];
		}
		g[i] = sigmoid(sum);
	}
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += h[j][i] * g[j];
		}
		z[i] = sigmoid(sum);
	}
	printf("%.2f\n", z[0]);
	printf("1,0 = ");
	x[1] = 1;
	x[2] = 0;
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += w[j][i] * x[j];
		}
		g[i] = sigmoid(sum);
	}
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += h[j][i] * g[j];
		}
		z[i] = sigmoid(sum);
	}
	printf("%.2f\n", z[0]);
	printf("1,1 = ");
	x[1] = 1;
	x[2] = 1;
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += w[j][i] * x[j];
		}
		g[i] = sigmoid(sum);
	}
	for (int i = 0; i <= 2; i++)
	{
		double sum = 0;
		for (int j = 0; j <= 2; j++)
		{
			sum += h[j][i] * g[j];
		}
		z[i] = sigmoid(sum);
	}
	printf("%.2f\n", z[0]);
}

```

#成果物

https://paiza.io/projects/gcuLtqRk3yiyZQV2jjCY7w

以上。
nagiosでgvfsへのアクセス不可エラーを無視する方法

ubuntu 17.04 で確認。
nagiosユーザーでnagiosが実行されているが、
nagiosとはuidが異なるマウントポイントに対してはアクセスできずエラーとなる。

## 問題

> DISK CRITICAL - /run/user/1000/gvfs is not accessible: 許可がありません

![スクリーンショット_2018-04-24_07-50-55.png](https://qiita-image-store.s3.amazonaws.com/0/25728/49f309b2-bdbd-b72d-e075-27b853498cab.png)

## nagiosの設定を修正

```diff:/etc/nagios3/conf.d/localhost_nagios2.cfg
 define service{
         use                             generic-service         ; Name of service template to use
         host_name                       localhost
         service_description             Disk Space
-        check_command                   check_all_disks!20%!10%
+        check_command                   check_disk!20%!10%!/
         }
```

なお check_all_disks は以下で定義されている。
/etc/nagios-plugins/config/disk.cfg
raspberry piのホスト名でアクセスするときの注意点

# raspberry piにホスト名でアクセスする方法

raspberry piにホスト名でアクセスしようとしたときにはまったので解決策をメモ。


## ホスト名を確認

ホスト名は`hostname`コマンドで確認ができる。

```sh:terminal
$ hostname
raspberrypi
```

以下はよく使うオプション。一緒に覚えておくとよい。

```sh:terminal
# エイリアス名を表示
$ hostname -a
hoge

# ホスト名のipアドレスを表示
$ hostname -i
192.168.0.xxx

# ロングホスト名(FQDN : Fully Qualified Domain Name)を表示
$ hostname -f
poo.foo.co.jp

# DNSドメイン名を表示
$ hostname -d
foo.co.jp

# ホスト名を変更する
$ hostname foo2.co.jp
```


## pingで疎通を確認

windowsからraspberry piにpingを飛ばしてみる。

```sh:terminal
$ ping raspberrypi
ping 要求ではホスト raspberrypi が見つかりませんでした。ホスト名を確認してもう一度実行してください。
```

エラーが返ってくる。ここがハマりポイント。


## 解決策

ホスト名の末尾に`.local`を付けると幸せになれる。
ただし、iTunesについてくるBonjourサービスが必要。

```sh:terminal
$ ping raspberrypi.local

raspberrypi.local [xxxx::xxxx:xxxx:xxxx:xxxxxx]に ping を送信しています 32 バイトのデータ:
xxxx::xxxx:xxxx:xxxx:xxxxxx からの応答: 時間 =7ms
xxxx::xxxx:xxxx:xxxx:xxxxxx からの応答: 時間 =6ms
xxxx::xxxx:xxxx:xxxx:xxxxxx からの応答: 時間 =6ms
xxxx::xxxx:xxxx:xxxx:xxxxxx からの応答: 時間 =6ms

xxxx::xxxx:xxxx:xxxx:xxxxxx の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 6ms、最大 = 7ms、平均 = 6ms
```

疎通が確認できた。
立体スライドパズルを作ってみた

#アプリ紹介
##[THE SLIDE PUZZLE](https://itunes.apple.com/us/app/the-slide-puzzle/id1016280878?mt=8)
このゲームは自分で撮った写真や保存してある画像でスライドパズルができるごく一般的なスライドパズルゲームなのですが、対戦ができたり、様々なモード（二種類しかついてないけど...）でパズルが楽しめるちょっと変わったパズルゲーム。
一番苦労したのがカメラで写した映像をリアルタイムで映し出してパズルにできる機能かな
画像だけじゃなくリアルタイムで動く映像を分割してパズルにするってめちゃくちゃ面白いですよw
<img width="200" alt="Simulator Screen Shot - iPhone 6 Plus - 2018-04-16 at 05.51.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/93175/0dea389b-13de-74a1-3439-8841aa933386.png"><img width="200" alt="Simulator Screen Shot - iPhone 6 Plus - 2018-04-16 at 05.52.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/93175/bd9ce4d9-85b5-d9a7-f661-aff48b4b222f.png"><img width="200" alt="Simulator Screen Shot - iPhone 6 Plus - 2018-04-16 at 05.52.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/93175/2d410135-8abf-9b16-e2e1-4e17b048a34d.png">
#作るきっかけ
このアプリはアプリ甲子園準決勝に行ったアプリなんですが残念ながら決勝には行けずそこから目立ったアップデートは特に手も加えてなかったんですが当時もし決勝に行っていたら追加したかったと頭に思い描いていた機能がありました。
それが立体パズルです。
要するにルービックキューブをスライドパズルの要領で完成させちゃおうぜ！!
的な考えが頭をよぎってたんですww
でも決勝に行けずにやる気が失われずっと手をつけてなかったんですが今回三年ぶりに手をつけて見ました！！！
#2Dスライドパズルに3Dの立体パズルを追加してみた！
今までのパズルはX軸とY軸だけで行なっていたパズルにZ軸を追加してみました。
これにより縦横だけでなく奥行きでもパズルがすることが可能になり６面すべて揃えないとクリアできないスライドパズルに仕上がりました！
わかりやすく伝えると画像や[動画](https://youtu.be/IypgNlhOju4)を見た方が伝わります。
<img width="200" alt="Simulator Screen Shot - iPhone 6 Plus - 2018-04-16 at 05.55.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/93175/602249dc-8521-b22c-2a89-f3f18cf601b0.png"><img width="200" alt="Simulator Screen Shot - iPhone 6 Plus - 2018-04-16 at 05.55.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/93175/02e1084c-d249-f9c6-2f36-bc4255fe39da.png">

#まとめ
2Dに比べて格段に難しいです。
一分以内にクリアできたら天才ですね....
みなさんぜひ頭の体操に[ダウンロード](https://itunes.apple.com/us/app/the-slide-puzzle/id1016280878?mt=8)してください







まだバグが少しある感じがあるかな・・・
Alpine Linux上でSudachiPyを動かして形態素解析した

# 概要

* AlpineLinux上でSudachiPyを動かしてみた。

# はじめに

形態素解析器といえば[MeCab](http://taku910.github.io/mecab/)という知識で止まっていたが、最近になって[Sudachi](https://github.com/WorksApplications/Sudachi)の存在を知ったので触ってみる。
メインはJavaで実装されているようだが、Pythonの[SudachiPy]
(https://github.com/WorksApplications/SudachiPy)も開発中のようだったので、今回はPython版を使ってみた。

# 手順

DockerFileで７ステップ。

* Alpine Linuxのベースイメージを調達し、alpine:3.7のイメージからスタートする。

```
FROM alpine:3.7
```

* 前提ライブラリや構築時に使うライブラリを入れる。

```
RUN apk --no-cache --update-cache \
    add python3 \
        git \
        curl \
        unzip \
    && ln -s /usr/bin/python3 /usr/bin/python \
    && ln -s /usr/bin/pip3 /usr/bin/pip \
    && pip install --no-cache-dir --upgrade pip
```

* [SudachiPy]
(https://github.com/WorksApplications/SudachiPy)のReadMeを参考に（というかそのままコピペして）git cloneしてインストールする。

```
RUN git clone https://github.com/WorksApplications/SudachiPy.git \
    && cd SudachiPy \
    && pip3 install -e .
```

* 辞書が入っていないので別途ダウンロードして解凍し、Readme記載の通りの名前と場所に配置する。ファイル名とか格納場所とかを見失いやすいので注意。

```
RUN wget -q https://github.com/WorksApplications/Sudachi/releases/download/v0.1.0/sudachi-0.1.0-dictionary-core.zip \
    && unzip sudachi-0.1.0-dictionary-core.zip \
    && mv system_core.dic　SudachiPy/resources/system.dic
```

* 「すもももももももものうち」を形態素解析してみる。

```
RUN echo "すもももももももものうち" | sudachipy -a -m A -o outputA.txt     && cat outputA.txt
```

* typeオプションがA、B、Cとあるので、残りの2通りも試してみる。

```
RUN echo "すもももももももものうち" | sudachipy -a -m B -o outputB.txt     && cat outputB.txt
RUN echo "すもももももももものうち" | sudachipy -a -m C -o outputC.txt     && cat outputC.txt
```

# 実行結果

DockerFileの使い方として間違っている気がするけど、Dockerビルドの延長で実行しているので、その結果を貼る。

```
Step 5/7 : RUN echo "すもももももももものうち" | sudachipy -a -m A -o outputA.txt     && cat outputA.txt
 ---> Running in 64c5ae7ccd34
すもも	名詞,普通名詞,一般,*,*,*	李	すもも	スモモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
の	助詞,格助詞,*,*,*,*	の	の	ノ
うち	名詞,普通名詞,副詞可能,*,*,*	内	うち	ウチ
EOS
```

```
Step 6/7 : RUN echo "すもももももももものうち" | sudachipy -a -m B -o outputB.txt     && cat outputB.txt
 ---> Running in 8e35cefb72f4
すもも	名詞,普通名詞,一般,*,*,*	李	すもも	スモモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
の	助詞,格助詞,*,*,*,*	の	の	ノ
うち	名詞,普通名詞,副詞可能,*,*,*	内	うち	ウチ
EOS
```

```
Step 7/7 : RUN echo "すもももももももものうち" | sudachipy -a -m C -o outputC.txt     && cat outputC.txt
 ---> Running in cb1dc26b2c13
すもも	名詞,普通名詞,一般,*,*,*	李	すもも	スモモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
も	助詞,係助詞,*,*,*,*	も	も	モ
もも	名詞,普通名詞,一般,*,*,*	桃	もも	モモ
の	助詞,格助詞,*,*,*,*	の	の	ノ
うち	名詞,普通名詞,副詞可能,*,*,*	内	うち	ウチ
EOS
```

今回の一文だけだとtypeオプション(the mode of splitting)の違いは関係なかった。


# 今後

今回は何も考えずに実行するところまで。もう少し内容を見てみたい。
char型変数の配列をひとつのint型変数として表示する

# 経緯
苦手なC(C++)で入力したchar型のアドレス内の情報をint型の整数で表示するプログラムを作成したのでメモとして残しておきます。
このプログラムを作成した理由はchar型とint型でどのようにアドレス配置しているかを確認するためでしたが、コメントで多くの高度なプログラムをご教授頂いたので、記事を修正させていただきました。
(自分含む)初学者向けです。

# 環境
Visual Studio Community 2017

# 具体的なプログラム
1234567890(16進数で0x499602D2)を要素数4のchar型の配列として宣言し、10進数のint型としてキャストしprintfで出力するプログラム

## 簡易的な解決方法
このプログラムを作成するにあたり直面する問題として、エンディアンとポインタがあると思います。
## エンディアン
int型で0x499602D2を

```hoge.cpp
unsigned char c[4] = { 0x49, 0x96, 0x02, 0xD2 }; // 0x499602D2 = 1234567890
```

と1バイトずつ格納するビッグエンディアンの場合です。
別の方法として、

```hoge.cpp
unsigned char c[4] = { 0xD2, 0x02, 0x96, 0x49 }; // 0x499602D2 = 1234567890
```
と格納するリトルエンディアンがあり、こちらが今回の環境で正解となります。
蛇足ですが聞いたところによるとビッグエンディアンはネットワーク機器やAMD製CPUで採用されているらしく、Intel製CPUだとリトルエンディアンでメモリに格納されているらしいです。

## ポインタ
出力の際のポインタは留意しておく必要があります。
最初の頃ポインタを理解するのは難しいので間違えがちですが、上記の入力の場合以下の出力が正解です。

```hoge.cpp
printf("%u\n", *(unsigned int *)&c);
```
自分も完璧に理解している訳ではないのですが、&cと(unsigned int *)、*は、
「char型変数cの先頭アドレスを取得」「その先頭アドレスをunsigned int型に変換」「その先頭アドレスの情報を読み取る」
と処理していると思われます(ここは自信ない…)

## 完成形

```hoge.cpp
#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 入力
    unsigned char c[4] = { 0xD2, 0x02, 0x96, 0x49 }; // 0x499602D2 = 1234567890

    // 出力
    printf("%u\n", *(unsigned int *)&c); // unsigned intでcを出力する

    system("pause"); // 一時停止
    return 0;
}
```
のように入力することで、

```
1234567890
```
と出ると思われます。

# より良い解決方法
コメントしてくださっている方々のおっしゃる通り、int型は必ずしも4バイトであるとは限りません。
当方で提案されたコードをコンパイルしようとしたのですが、std::copyの仕様上安全ではない！ってコンパイラーに怒られて解決方法がわからずに挫折しました…
ほぼCの知識しかないのが悔やまれる…。
CollectionView.indexPathForItem(:at)でindexPathが取れない!? CollectionVIewCellのサイズ判定についてのメモ

## 背景

UICollectionViewDropDelegateを使用して、D&Dを実装しているときのお話です。

Dragしてきたオブジェクトの座標にあるCollectionViewCellを判定しようとしていたときに事件が起きました・・・


**IndexPathが取れない!!!**

```Swift
    func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) ->  UICollectionViewDropProposal {
        var currentPosition = session.location(in: collectionView)

        let indexPath = collectionView.indexPathForItem(at: currentPosition) //ここれindexPathがnilになる
        ...
```

座標が間違っている？　

 いいえ、currentPositionはDrop先を親Viewとして座標を取得できていました。


## 原因

collectionViewのセルサイズが設定されていなかった(画像は設定後です)

![スクリーンショット 2018-04-24 1.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/118247/7a041d9e-bcff-f7b2-dff2-06ed2df9c81f.png)

実際に生成しているCellとこちらの設定のCell Sizeは独立しているようで、先のコードで取得する際に用いられるセルの座標はStoryboardでの設定のようでした。

なので、実際に生成しているCellのサイズが正しくても、そのサイズとStoryboard上のCell Sizeは合わせないと混乱しちゃいますので、ご注意を。

または、`UICollectionViewDelegateFlowLayout.collectionViewLayout`でもできるそうな(検証してない)。

```Swift
extension SampleViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 50)
    }
}
```
グラフ直径に対する簡単な近似アルゴリズム

グラフの直径とは

```math
D:=\max_{u,v\in V} \mathrm{dist}(u,v)
```

によって定義される量です. [こちら](https://qiita.com/knewknowl/items/1dfab11fe31f0d42a206)の記事ではその計算量の歴史について触れましたが, 今回は直径に対する高速な近似アルゴリズムについて具体的に紹介します. 連結な重み無し無向グラフ$G=(V,E)$の直径$D$が知りたいとします. 二頂点$u,v$間の最短経路長を省略して$uv$と書くことにします.

# Double sweep

1.頂点 $u$ 適当にとってくる.
2.$u$ を開始点としたBFSにより, 最も遠い頂点 $f_1$ を得る.
3.同様に $f_1$ から最も遠い頂点 $f_2$ を得る.
4. $f_1f_2$ を出力.

**Claim: $0.5D \leq f_1f_2\leq D$ (つまり $f_1f_2$ は 2-近似).**

**Proof**: 観察として, 以下がわかります:
- 任意の頂点 $x$ に対し, $ux\leq uf_1$ ( $f_1$ の定義より明らか).
- 任意の頂点 $x$ に対し, $xf_1 \leq f_1f_2$ ( $f_2$ の定義より明らか).
グラフ上の最短経路長は三角不等式を満たすので, 任意の二頂点 $x,y$に対して
$xy \leq xu+yu \leq 2uf_1 \leq 2f_1f_2$.
今, $x$ と $y$は任意だったので, 直径の両端点となるようにとれば
$f_1f_2 \leq D \leq 2f_1f_2$. (証明終)

**Claim: 木 $T$ を入力としたとき, double sweepは直径のexactな値を出力する. すなわち, 任意の二頂点 $x,y$ に対し, $xy\leq f_1f_2$.**

$T$ を $u$ を根とした根付き木とする. $f_1$ と $f_2$ のLCA(least common ancestor)を $v$ とおく. 最後に, 二頂点$s,t$を結ぶ $T$ 上のパスを $P(s,t)$ と書くことにする. まず, 以下に述べるobservationを示す.

**Observation. 任意の頂点 $x$ に対して
(i). $v\in P(u,x)$ ならば $vx \leq vf_1$.
(ii). $v \not\in P(u,x)$ ならば $vx \leq vf_2$ ($\leq vf_1$).**

**Proof of Observation:**
(i): そうでないと仮定すると, $ux=uv+vx>uv+vf_1=uf_1$ となり, $f_1$ が $u$ から最も遠いという仮定に矛盾.
(ii): そうでないとすると, $f_1x=f_1v+vx > f_1v + vf_2=f_1f_2$ となり, $f_2$ が $f_1$ から最も遠いという仮定に矛盾.

**Proof of Claim**: 任意に二頂点 $x,y$ をとる.
1): $vx \leq vf_2$ とする. このとき, グラフ上の三角不等式より
$xy \leq xv+xy \leq vf_2+vf_1=f_1f_2$.

2): $vx>vf_2, vy>vf_2$ とする. このとき, $P(f1,x)$ は $v$ を含まない. なぜならそうでないとすると, $f_1x=f_1v+vx>f_1v+f_2v=f_1f_2$ となり矛盾するからである. $y$ に対しても同様の議論が成り立つ. $x$ と $f_1$ の lca を $w$ とおく. このとき,
$xy\leq xw+wy \leq f_1w+wy=f_1y\leq f_1f_2$
となる.
ここで, ２番目の不等式は, $w$ は $f_1$ と $x$ の共通祖先であり, $v\in P(u,x)$ および $v\not\in P(f_1,x)$ より $w$ は $v$ の子孫であるため, 
 $f_1u=uw+wf_1\geq ux=uw+wx$であることから成り立つ.
 (証明終)


# Random Sampling

1. $D'\gets 0$ とする.
2. 頂点 $u$ を $V$ 上の一様分布に従って選ぶ.
3. $u$ から最も遠い頂点 $f$ を計算し, $D'\gets \max(D', uf)$ で更新する.
4. ステップ1から3を $\lceil 100n^{1-\delta}\log n\rceil$ 回繰り返す.
5. $D'$ を出力する.

**Claim: 定数 $\delta>0$ に対し, 直径 $D$ が $D\geq n^{\delta}$ を満たすとします. このとき, 任意の $\epsilon>0$ に対して上記アルゴリズムは $O(mn^{1-\delta}/\epsilon)$ 時間で $D'$ を出力し, $D'$は $1-n^{-50}$ 以上の確率で$\frac{D}{1+\epsilon}\leq D' \leq D$ を満たす (つまり $D'$ は $(1+\epsilon)$-近似). **

**Proof**: double sweepが2-近似を達成するので, $\epsilon$ は1未満とします. 二頂点 $a,b$ を直径の両端点 (即ち $ab=D$ ) とします. このとき, $ab$-間の最短経路上には $a$ との距離が $\frac{D}{1+\epsilon}$ 以上であるような点が $\frac{\epsilon}{1+\epsilon}D$ 個以上あります. 従って, ランダムに選んだ $u$ に対して
$\Pr\left(au < \frac{D}{1+\epsilon}\right)\leq 1-\frac{\epsilon D}{(1+\epsilon)n} \leq 1-\frac{\epsilon}{2}n^{-1+\delta} \leq \exp(0.5\epsilon n^{-1+\delta})$
が成り立ちます.
ランダムに $u$ を選ぶプロセスを $100 n^{1-\delta}\log n$ 回以上繰り返すので, アルゴリズムの出力が $(1+\epsilon)$-近似にならない確率は高々
$ \exp(0.5\epsilon n^{-1+\delta}\cdot 100n^{1-\delta}\log n)=n^{-50}$
となります. (証明終)


#結びに

他にも面白い近似アルゴリズムが知られています. 特に私のお気に入りは Aingworth et al. (1996) の "ほぼ1.5-近似" アルゴリズムですが, またの機会に紹介したいと思います.
Upgrade Debian 7 to 8

To upgrade Debian OS from 7 to 8 by itself.

## update the packages in 7

```
apt-get update
apt-get upgrade
```

## modify the sources

Replace all `wheezy` in `/etc/apt/sources.list` to `jessie`.

## upgrade packages to 8

```
apt-get update
apt-get upgrade
apt-get dist-upgrade
```

The last one might be run twice if needed.

## remove unused packages

```
apt-get autoremove
```

## reboot

## delete the linux image

```
apt purge linux-image-3.2.0-4-amd64 -y
```

## For Apache/PHP module

You might have to purge all php packages and reinstall them, and find extension directory by `php -i | grep extension_dir` and edit it manually to `php.ini`.
初めてのJavaScript その3

前回の続きとなります。
[初めてのJavaScript その2 - Qiita](https://qiita.com/ichi-kato/items/94d1365fc8c027e3d835)

# 色々な関数

## ローカル関数に関して
```html:index.html
  <script>
        function hello() {   
            var local = 3 + 12 - 4  // ローカル変数
            alert(local); // OK
        }
        alert(local);  // NG エラーになる
  </script>
```

上記の通り、関数の中で定義した変数はその関数内でしか使えません！！

## 即時関数
```html:index.html
  <script>
        // 引数を渡す書き方
        (function(name) {
            // alert(name);
        })("Me"); 

　　　　 //　即時間数のメリット
        (function() {
            var x = 10,
                y = 20;
            // x , y はローカル変数となり、外部からの影響を受けなくなる
        })();
  </script>
```

上記の通り、即時に実行する関数を*即時間数*といいます。
**主に、ローカル変数を実現するために使ってきましたが、今では代わりにletやconst（後述）を使うのが一般的な気がします。**

# タイマー処理の書き方
## setTimeout
```html:index.html
  <script>
        var i = 0;
        function show() {
            var t = setTimeout(function() {
                show();    // 自分自身を飛び出すので結果ループ処理となる
            }, 1000);  // 一秒ごとに実行
            if (i > 3) {
                clearTimeout(tid);  // clearTimeoutを使うことでsetTimeout処理を終了させることができる。
            }
        }
        show();  
  </script>
```

ほかに*setInterval*というタイマー系の関数もありますが、使い勝手がイマイチなので、特にもし必要なければ覚えなくてもいいかもしれません。
興味ある方は[こちら](https://developer.mozilla.org/ja/docs/Web/API/Window/setInterval)を見てみてください。

# 配列
グループ化されたデータである

```html:index.html
    <script>

        // var eki_1 = "東京", eki_2 = "名古屋";
        // ↑のように書くのはすこしだるいし、変数が多くて読みづらいかと思います。
        // 下のように配列で書くとすっきりします。
        var eki= ["東京", "名古屋", 100];  // 異なる型を入れることができる
        
        eki[0] = "大阪";　// 東京が大阪に書き換えられます

        // 下記のような配列の中に配列を書くことができます。
        var m = [
            [1, 2, 3],
            [4, 5, 6]
        ];
        // m[1][2]);  で6という数字が取れます。
    </script>
```
配列の添え字は**「0」**始まりであるのを忘れないでください!

# オブジェクトについて
名前と値をもつ、オリジナルなまとめられたデータ

```html:index.html
    <script>
        var user = {
            name: "kato", // 名前はプロパティと呼ばれます（例：nameプロパティ）
            age: 20
        };
        alert(user.name);  // katoと出力される
        user.age= 20;　　　 // ageを20に書き換え
        alert(user.age);　　// 20と出力される
    </script>
```

## オブジェクト内のメソッドについて
オブジェクト内にメソッドをはやすことができます

```html:index.html
    <script>
        var user = {
            name: "kato", // プロパティ
            age: 80,
            getUserInfo: function() {    // getUserInfoメソッド
                alert("名前：" + this.name + "年齢：" + this.age);
            }
        };
        user.getUserInfo();
    </script>
```

**this.hogehoge**のように、**this**を使うことで同じオブジェクトのプロパティにアクセスすることができます！



今日はここまで、続きは次回で！！:coffee:
Excel Access VBA 成人の日、体育の日、敬老の日、第5週の月曜日を計算するユーザー定義関数

これはシートで計算する場合はこちら

[【Excel Tips】成人の日や体育の日などのハッピーマンデーの日付を求めるには？ 2008/11/27 09:00
](https://enterprisezine.jp/iti/detail/854)
[成人の日（1月の第2月曜日）を求める−WEEKDAY関数・DATE関数 -relief](http://www.relief.jp/docs/003241.html)

古くからある手法ですが、だれも計算しないですよね。
[年間カレンダーの作成](http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_052.html)

##3つのポイント
###シート上ではDate関数,VBAではDateSerial関数は日付を0にすると前月末の日付になる。
これを利用して前月末が何日かを気にせず日付を取得して曜日を取得します
###第1が7第2が14第三が21第4が28。
VBAでは35から引くと第5週がわかります
###ネットでは1999年以前が存在しない
いつからかは忘れたけど、とりあえず1999年以前はちゃんと日付だそうよ
ただ振替休日には対応していません。また、何年前かまでは調べていないので、あまり過去にさかのぼらないでください。

##コード(2020独裁シフト対応済)
4桁の西暦で日付を返します
上から
体育の日
成人の日
敬老の日
です。

```vb

Function DayOfJpnGymnasticDay(iyear) As Date
'体育の日を返します
'なお2021年からはスポーツの日になります
'日本政府を止めない限り2020年は7月24日に移動します
If clng(iyear) >= 2000 And iyear <> 2020 Then
DayOfJpnGymnasticDay = DateSerial(clng(iyear), 10, 14 - Weekday(DateSerial(iyear, 10, 0), 3))
ElseIf iyear = 2020 Then
DayOfJpnGymnasticDay = DateSerial(clng(iyear), 7, 24)
Else
DayOfJpnGymnasticDay = DateSerial(clng(iyear), 10, 10)
End If
End Function

Function DayofJpnCommingofAageDay(iyear) As Date
’敬老の日
If iyear >= 2000 Then
DayofJpnCommingofAageDay = DateSerial(iyear, 1, 14 - Weekday(DateSerial(iyear, 10, 0), 3))
Else
DayofJpnCommingofAageDay = DateSerial(iyear, 1, 15)
End If
End Function

Function DayofJpnCommingofAageDay(iyear) As Date
If clng(iyear) >= 2000 Then
DayofJpnCommingofAageDay = DateSerial(clng(iyear), 1, 14 - Weekday(DateSerial(iyear, 10, 0), 3))
Else
DayofJpnCommingofAageDay = DateSerial(clng(iyear), 1, 15)
End If
End Function

Function DayofJpnRespectForEldery(iyear) As Date
'成人の日
If clng(iyear) >= 2000 Then
DayofJpnRespectForEldery = DateSerial(iyear, 9, 21 - Weekday(DateSerial(iyear, 9, 0), 3))
Else
DayofJpnRespectForEldery = DateSerial(iyear, 9, 15)
End If
End Function
```

##第5週の月曜日
2018年4月でやってみると

```vb
Function Mondayof5thon2018_04(iYear) As Date
Mondayof5thon2018_04 = DateSerial(iYear, 4, 35 - Weekday(DateSerial(iYear, 4, 0), 3))
End Function
```
これで4月30日月曜が返ります
一般的に第5週の月曜日があるか。
エラーになると `00:00:00` を返します。

```vb
Function Mondayof5thon2018_04(iYear, imonth) As Date
'第五月曜日があるか
Dim Dt As Date
Dt = DateSerial(iYear, imonth, 35 - Weekday(DateSerial(iYear, imonth, 0), 3))
If Month(Dt) < 5 Then
Mondayof5thon2018_04 = Dt
Exit Function
Else
Mondayof5thon2018_04 = vbEmpty
End If
End Function
```
MacでSymfonyフレームワークを使用したプロジェクトを作成


## 1. インストーラーをインストール

```
sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
sudo chmod a+x /usr/local/bin/symfony
```

## 2. インストーラーを更新

```
symfony self-update
```

## 3. プロジェクトを作成

### 最新バージョンで作成

```
symfony new my_project
```

### LTSバージョンで作成

```
symfony new my_project lts
```

## 4. 動作確認

```
cd my_project
php bin/console server:start
```
以下にアクセス。
http://localhost:8000


### 参考ページ
* [GitHub - symfony/symfony-installer: The Symfony Installer](https://github.com/symfony/symfony-installer)
Macにphpbrewをインストールしてphpをバージョン管理


詳しく知りたい方は最後の参考ページを参照してください。

## 1. インストール

```
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
```

## 2. セットアップ

bashを使用している方は以下を実行してください。
それ以外のシェルを使用している方は[参考ページ](https://github.com/phpbrew/phpbrew/blob/master/README.md)を参照してください。

```
phpbrew init
echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc
source ~/.phpbrew/bashrc
```

## 3. 基本的な使い方

### 利用可能なphpバージョンを表示

```
phpbrew known
```

### phpのリリース情報を更新

```
phpbrew update
```

### phpビルド時に利用できるconfigureオプションを表示

```
phpbrew variants
```

### phpをビルド＆インストール

```
phpbrew install 7.2.4 +default
```

### ビルドディレクトリをクリーン

```
phpbrew clean 7.2.4
```

### phpバージョンを切り替える（一時的）

```
phpbrew use 7.2.4
```

### phpバージョンを切り替える（デフォルトに設定）

```
phpbrew switch 7.2.4
```

### インストールしたphpを表示

```
phpbrew list
```

### phpbrewをアップグレード

```
phpbrew self-update
```

## 注意
今回、私のMacで phpbrew install を実行したところ、

```
ld: file not found: /usr/lib/system/libsystem_darwin.dylib for architecture x86_64
```

というエラーが発生しました。
いろいろ解決策を探し試したが、最終的には xcode の最新版をインストールすることで解決しました。


## 参考ページ
* [GitHub - phpbrew/phpbrew: Brew & manage PHP versions in pure PHP at HOME](https://github.com/phpbrew/phpbrew)
【Ruby on Rails】RSpecのdescribe/context/itの意味を理解した件

RSpecを書くときに、describeとかitの意味を理解していなかった。
そこでdescribe、context、itに何を記述すればいいのか？を考えながらRSpec書いたら、まじでみやすくなった。

なので、describe、context、itの意味を備忘録的に本当に最低限まとめておく。

```rb
descirbe '#ここにはテスト対象を書く'  do

end
```

describeには、基本的にテスト対象を書く。
例えば、Userクラスのfindメソッドをテスト対象とする場合は、以下のように書く。

```rb
describe 'User' do

  describe '#find' do 

  end
end
```

特に、メソッドであることを明示するためにメソッド名の前に#を記載する。
また、テスト対象のメソッドに引数がある場合は、それも書いておくと親切！

```rb
describe 'User' do

  describe '#find(user_id)' do 

  end
end
```

次にcontext。
contextとは、テスト対象のメソッドをどういう条件で実行するかを記載してあげる。

正常系なのか？異常系なのか？と言った具合。

例えば、条件をuser_idがnullであるときを考える場合は、以下のようになる。

```rb
describe 'User' do

  describe '#find(user_id)' do 
   context 'when user_id is null' do 

   end
  end
end

```
contextに書く英文は、whenやwithを使うことが多い。

そして、このcontextの下に、条件を満たすような値やmockを設定してあげる。

```rb
describe 'User' do

  describe '#find(user_id)' do 
   context 'when user_id is null' do 
     #letとかbeforeとかallowはググってみてケロ
     let(:user_id) { nil } 
     let(:body) { {id: 1, name: 'ほげ太郎'} }
     before do
       allow(Hoge).to receive(:select).and_return(body.to_json) 
     end
   end
  end
end


```
こうすることで、context周辺を見れば、条件を満たす変数の状態などがひと目でわかる！
↑↑↑↑↑追記↑↑↑↑↑
allowはbefore句で囲まないとエラーでます！指摘してもらいました！
確かに忘れてました。


そんで最後。itにはテスト実行時の期待値を記載する。

```rb
describe 'User' do
  describe '#find(user_id)' do 
   context 'when user_id is null' do 
     let(:user_id) { nil } 
     let(:body) { {id: 1, name: 'ほげ太郎'} }
     
     before do
       allow(Hoge).to receive(:select).and_return(body.to_json) 
     end

     # 注:エラーが起きることを検証する場合は、returnsよりもraisesと書く方が
     # Rubyの文法的には自然かも
     it 'returns ActiveRecordNotFound' do
     end
   end
  end
end
```

こんな感じ。

ある程度RSpecに記載する英単語や英文は、限られてそうなので書きながら覚えてしまうのがいいかもですね。
M5stackで遊んでみる(Hello World)

前回まででM5Cloudにデバイスを登録できたので、M5Cloud経由でHello Worldを試してみようと思います。

# M5Cloudへログインしてmain.pyを編集する

ログインしたら確かこの画面だったと思うんですが、もし違っていたら左上のICのアイコンをクリックすれば
Device Managementの画面へ行けます。

<img width="527" alt="スクリーンショット 2018-04-23 23.25.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/12695/6db34089-1144-96e1-708d-53d392ea3a44.png">

ここで　`</>` のアイコンをクリックします。

<img width="552" alt="スクリーンショット 2018-04-23 23.24.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/12695/1623bfcc-0057-8a85-6c7f-b43ba1d6b86d.png">

すると、 `main.py` が表示されます。もし違っていたらmain.pyをクリックして表示しましょう。

コメントを見た瞬間に、もうHello worldできそうな感じです。

# Hello Worldしてみる。

なんか、拍子抜けですが、とりあえずコメント外して動かしてみることにします。
コメントをはずして一番左下のUpload & Runのボタンを押します。

<img width="285" alt="スクリーンショット 2018-04-23 23.37.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/12695/5428bdc9-6fad-2766-7f73-bb4617807c34.png">

このボタンです。
<img width="49" alt="スクリーンショット 2018-04-23 23.37.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/12695/c5f70cb3-6837-c6ab-3206-02e7af5906c0.png">

ボタンを押すと、M5stackが再起動&ファイル同期し始めて、
こんな感じになります。簡単ですね。
<img width="533" alt="スクリーンショット 2018-04-23 23.51.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/12695/6026f6c9-0d08-dbd0-974c-18105752d609.png">


# そもそもMicroPythonでは何ができるのか

ググっていれば断片的には何ができるか分かるんですが、それだけだと色々と困りそうなので
どこかにドキュメントがないか探してみたところ、M5CloudのGitHubが見つかりました。
ここのREADME.mdにMicroPythonのAPIが諸々書いてあるので参考にしていきます。

https://github.com/m5stack/M5Cloud/blob/master/README.md
【Rails】共通テンプレートの小さなメモ

`app/views/layouts` の `application.html.erb` が標準のレイアウトファイル。

```erb
<!DOCTYPE html>
<html>
<head>
  <title>ControllerTest</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>
```

`yield` の部分各コントローラで表示するテンプレートが埋め込まれる
Office 2016 for MacのVBAでUnicode(UTF-16)テキストファイルを出力する

# まえがき
ActiveX Data Objects(ADODB)がないOffice for Macで、VBAでUTF-16(リトルエンディアン)なテキストファイルを出力する方法です。

**追記: [UTF-8で出力するサブルーチンも作りました。](https://qiita.com/Nebutan/items/a70ad944c273365249be)**

# やりかた
StringをByte配列に代入し、Open 〜 For Binaryでファイルをオープンし、PutでByte配列を出力します。

```vb:utf16.xlsm
Sub Sample()
    Const fname As String = "ファイル名"
    Dim str As String
    Dim u16str() As Byte

    str = "出力したい文字列"

    ' ファイルがすでに存在する場合は削除
    ' これを忘れると既存ファイルの一部が出力ファイル末尾に残ったりする
    If Dir(fname) <> "" Then
        Kill fname
    End If

    Open fname For Binary Access Write As #1

    ' BOMを書き込む(バイトオーダーを逆にしておく)
    Put #1, 1, &HFEFF

    Put #1, , u16str

    Close #1
End Sub
```

# 注記
* VBAの`Open 〜 For Binary Access Write`はファイルサイズをリセットしないので、既存ファイルを上書きする場合はオープン前にファイルを削除する必要があります。[^1]
* 上記コードで`Put`しているBOMは&HFEFFになっていますが、内部でバイトが前後するため実際にはファイルに&HFF, &HFEの順で書き込まれます。

[^1]: この記事の初版で紹介した方法が非常にまわりくどくなったのは、まさにこれを忘れてしまったためでした‥‥‥

# 参考
[VBAでサロゲートペア対応Len](https://qiita.com/RelaxTools/items/966bfc1810e6c94b9d07)
[VBAで絵文字💖]
(https://qiita.com/masaoki/items/3488320842a9c3f9fc4e)

# 言い訳
[当初の版](https://qiita.com/Nebutan/items/a2b00d44b5296bd4c9a1/revisions/3)では非常にまわりくどい方法を紹介していました。

これは当初「出力ファイルにゴミデータがつく」事象を、StringをByte配列に直接代入したのが原因と判断した故に採った方法でした。
しかし、実際の原因は前述の「VBAの`Open 〜 For Binary Access Write`はファイルサイズをリセットしない」を失念していたことで、「ゴミデータ」の正体は既存ファイルの上書きされなかった部分でした。

原因が判明したことによりこの記事の存在意義も薄れましたが、有益なご指摘をいただいたこともあり、経緯の記録としてこの記事を残すこととしました。
git-grepのすゝめ

## はじめに

普段複数人で開発をしてると、実装を追って調査が必要な場面が多々あります。
実装の影響範囲を調べる時に内部の実装を事細かに追う必要が出てきますが、そんな時git-grepは高速に検索を行える便利なコマンドです。
そんなgit-grepで普段使ってて便利だなと思ったコマンドを何個かあげます。

## 基本

### 正規表現を使いたい

```sh
git grep -E "regexp"
```
基本ですが結構利用頻度は高いです。
パターンを検索する場合の``git grep -e``も伏せて利用頻度が高いですが、どちらかと言うと``git grep -e``を使う時はパイプとかで連結させて処理させることが多いかも。

### 特定の単語を含む上下〇〇行のファイルの中身を見たい

```sh
git grep -C 5 -e "word"
```
設定ファイルとかを読んでいる時とかに、周りの設定ってどうなってたっけ？とか確認したい時に使ったりしてます。
ちなみに、-Cは条件一致時の上下〇〇行の結果を引っ張ってきますが、-Aの場合上〇〇行、-Bの場合下〇〇行の結果を引っ張ってこれます。

```sh
git grep -A 5 -B 3 -e "word"
```

みたいにして上下取得の幅を効かせられたりします。
ただ使う時は設定ちらっと見たいなーくらいの温度感なことが多いので利用頻度としては上の-Cオプションの方を自分はよく使います。

### 複数の単語が絡んだ文字を検索したい

```sh
git grep -e "first word" --and -e "second word"
```

所謂論理積の検索です。

### 最初の単語か二つ目の単語かどっちかが検索に含まれている行を知りたい

```sh
git grep -e "first word" -e "second word"
```

これは論理和の検索です。論理積と違うのは、-eオプションを選択した場合はデフォルトで論理和が選択された状態になっているので、複数条件は単純に-eで繋げばいいところです。  
明示的に記したい場合は  

```sh
git grep -e "first word" --or -e "second word"
```

でいけます。

## 最初の単語は含んでいるけど、二つ目の単語は含んでない行を知りたい

```sh
git grep -e "first word" --and --not -e "second word"
```

A AND NOT Bの書き方をすることで表現します。
ちなみに

```sh
git grep -e "first word" | grep -v "second word"
```

のように検索条件に一致したものから二つ目の単語を除外する検索方法もあります。

## 応用

### 作業分をcommitする前に変更分のメソッドが入っているか先に確認したい

```sh
git status -s -uno | awk '{print $2}' | xargs git grep -e 'method name'
```

``git status -s -uno``で作業分でまだgitに追跡されていないファイルを洗い出して、そこから不要な部分を削除し、``git grep``でメソッドを絞り出します。
``git add -p``などでaddする時に変更差分を確認することもできますが、先に自分のaddした差分に実際想定するメソッドが入ってるかを一撃で探し出せるのがいいとこです。

### 継承先変更などで削除したクラスのメソッドを抜き出したい

```sh
git diff --diff-filter=D --name-only --relative before_hash..after_hash | 
xargs git grep -l -e "extends ParentClass" | 
xargs git grep -e "function" | 
awk '{print $4}' | 
grep -o "[a-zA-Z0-9]*" | 
grep -v -e '^\s*#' -e '^\s*$'
```

※ 言語はPHPでの検索を想定してます。
commit-hashの差分から削除されたファイルから特定クラスを継承したメソッドをとってきます。
抽象クラスの親元を変更したりした場合に、どのメソッドを移動させたかを把握するために使います。

## まとめ

git grepは使いこなせばこなすほどに味が出てきます。
他のコマンドと組み合わせることで可能性がいくらでも広がってとても楽しいのでスキマ時間にオレオレ最強コマンドを作ってみましょう！
swiftのクラスをobjective-Cから参照したい


単純にswiftクラスを定義しただけでは、objective-Cから参照することはできません。

## swiftのクラスをobjective-Cから参照するためには

一番大事なことは、 `[ProjectName]-Swift.h` クラスを用いること！です。

### `[ProjectName]-Swift.h` について

そのままの意味ですが、objective-Cからwwiftファイルを読み込むための中間ファイルです。
ビルド成功によって、自動生成されます。
つまり作成されていた分のSwiftファイル情報が、ビルド成功時に自動的に `[ProjectName]-Swift.h` ファイルに記載されることとなります。

※ビルド成功しないと、生成・更新されないので注意。

### `[ProjectName]-Swift.h`を使う

swiftを利用したい `.m` ファイルでimportします。

```
#import "[ProjectName]-Swift.h"
```

これで、swiftのクラスをobjective-Cから参照することができます。

## でも参照できない場合がある！！

上記で成功しない場合、なにかしらの原因があります。

### チェック1：参照するクラスはNSObjectの派生クラス？

objective-Cのオブジェクトは、 **全てNSObject** です。
そのため、objective-CはNSObjectのクラスじゃないと参照できません。

### チェック2：クラスに `@objcMembers` を付けてる？

swift4から導入されたものです。
Objective-Cから使用できるswiftのクラスは明示的に宣言することになりました。
下記のように宣言しなければなりません。

```swift
@objcMembers
class HogeClass: NSObject {
}
```

### チェック3：その他

- ビルドが失敗していませんか？
- ビルドプロジェクトに属しているクラスですか？

※もっと原因があれば、都度追記します。

## 例外：swiftのstructは参照できない...

残念なことに、objective-Cからswiftのstructは参照することができません。
原因は、structはクラスじゃないからです。

> Objective-CはNSObjectのクラスじゃないと参照できません。

objective-CはNSObjectじゃないクラスは参照できません。
クラスでもないstructは、参照対象にならないのです。

## まとめ

objective-Cとswiftの共存のための話を書きましたが、
世の中的には、iOSのコードは基本全部swift化することが推奨されるようです。
新しくiosの勉強する人はぜひswiftの勉強に集中してください。
[HTML]selectboxのrequired設定が効かない時のミス

**selectboxにrequiredを設定したが効かない時の単純ミス**
<p>初心者プログラマの自分がはまってしまったミスを共有します。</p>
<h1>原因は単純でした</h1>
下記コードを作成した。選択しない状態で送信(submit)してもrequiredチェックが反応しない・・・

```html:select.html
<select>
    <option value="select" disabled selected required>選択してください。</option>
    <option value="アイス" required>アイス</option>
</select>
```

<h3>原因はdisabledにvalue値が設定されていたため</h3>

「選択してください。」を非活性、選択できない初期文言で設定したつもりが、value値を設定してしまったため、選択されていると認識され、空でも送信できた。

<h4>下記コードが修正コード</h4>

```html:select.html
<select>
    <option disabled selected required>選択してください。</option>
    <option value="アイス" required>アイス</option>
</select>
```

こんな単純なミスに躓くとは・・・

共有できましたら、幸いです。
Juliaでプロット

# グラフのeps出力
WindowsのJupyter Notebookで、日本語のグラフをepsで出力しようとしたら、思いの外手こずった。
Plotsというパッケージは、プロットのフロントエンドとして、様々なパッケージを動かせるが、日本語のグラフをepsで出力しようとするとどのバックエンドもうまくいかなかった。 
様々なパッケージを試した末に、Gastonというgnuplotを呼び出すパッケージに落ち着いた。 gnuplot5.0以降は日本語とも親和性が高いようだ。 PlotlyJSも良さそうであったが、Jupyter Notebookで連続してeps画像を出力しようとすると、2枚目で無限ループ？で停止した。

# まとめ
StatPlots, Gadfly, PyPlot, Plotly→日本語がうまくいかない。あるいは、eps出力できない。
PlotlyJS→日本語出力できるが、eps出力しようとすると、停止する。IJuliaでは、うまく動いた。
Gaston→高速、eps、日本語対応

参考文献
ソース:https://github.com/kim-tom/Julia_Gaston

Computational and Numerical Methods in Julia -Plotting in Julia I-
http://computationalnumericaljulia.com/plotting-in-julia-i/
emacsのタイトルバーに時計とファイル名を表示

# タイトルバーのカスタマイズ
[Frame Title#EmacsWiki](https://www.emacswiki.org/emacs/FrameTitle) を見て作成  
> Display date/time if ‘display-time-mode’ is set:

と書かれているあたりに時計表示について記載されていた

加えてファイル名(%f)もしくはバッファ名(%b)も表示するようにした

時計の書式については `C-h v display-time-string-forms` ヘルプを見てください（丸投げ）

## 設定例
```emacs-lisp:titlebar-clock.el
;; タイトルバーに時計とファイル名表示
(when (window-system)
  ;; display-timeより先にsetしておかないとdefaultの書式?になる workaround
  (setq display-time-string-forms
	'((format "%s/%s/%s" year month day)
	  (format "(%s:%s)" 24-hours minutes)))
  (display-time) ;; display-time-stringの有効化
  ;; タイトルバーの書式設定 global-mode-stringにdisplay-time-stringが入っている
  ;; バッファがファイルのときはフルパス、でなければバッファ名表示
  ;; if(buffer-file-name) の評価がsetq時で終わらないよう:eval
  (setq frame-title-format '("" global-mode-string
                             (:eval (if (buffer-file-name) " %f" " %b"))) ) )
```
## 表示例
### ファイル名
![Screenshot 2018-04-23 22.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/242567/660cb997-cb79-ec3b-f6fd-3a7635669e7b.png)
### バッファ名
![Screenshot 2018-04-23 22.53.08.png](https://qiita-image-store.s3.amazonaws.com/0/242567/a3754f7e-966f-aa7d-7a51-7305a9386c85.png)

# 感想
モードラインにフルパスは邪魔だし
時計もウィンドウごとにあってもしょうがないので
タイトルバーへの時計とファイル名表示は最適解だと思います
まあ、フルスクリーンとか-nwで使っている人には意味ないですが
S2Strutsのチュートリアルをやってみよう(#1_180423)

##本日の成果
　・eclipse⇔GitHub連携
　・S2Strutsチュートリアルプロジェクト導入

##困った点
　・eclipseに導入したtomcat9サーバが動かない
　＜事象＞
　　「Error: Could not the Java Virtual Machine.」
　　「Error: A fatal exception has occurred. Program will exit.」
　＜調査＞
　　(1)ecliseのサーバランタイム環境の確認
　　(2)eclipse.iniに-vm でjavaw.exeを参照させる
　　　＞そもそも動かなくなってしまった
　＜他＞
　　(1)使用しているJava10のJDKに対するPathは通っていた
　
##コメント
　GitHub連携は意外とすんなりいった。eclipseのGitパースペクティブ使うとPush/Commitが非常に楽　
　現場ではGit-Bashをバシバシ使っていくそうなので、PushぐらいはGit-Bashでやってみようかな
　あとTomcatの件は不明だが、出てるエラーから「Javaちゃんと通ってなくね！？」の疑いが。
CocosCreator v1.9.0で画像の一括読み込みと、画像変更のやり方

こんばんは、やわらーです。
本日詰まった画像読み込みと、画像の変更に関して早速メモ的に書いていきます。

# 2018/05/02追記
画像の読み込みですが、正確にはフォルダ内の順番ではないようです。修正版の記事を書きましたので、合わせてお読みください。
[JavaScriptの連想配列の作り方と、CocosCreatorの画像読み込み修正版](https://qiita.com/Yawarakko/items/fe608bcd21f3028ccb5b)

# 環境
windows10
Cocos Creator v1.9.0

# 画像の読み込み、変更
## 1.CocosCreator側の準備
CocosCreatorの画像はリソースフォルダから読み込まれます。なのでまずはリソースフォルダを作ります。Assetの+マークまたは右クリックでフォルダ作成、名前は`resources`にしてください。
今回はその下に`Images`フォルダを作成しました。
![bandicam 2018-04-23 23-10-34-652.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/60dd7138-0f82-742e-5c21-9215a67eaa65.jpeg)

また、画像はいらすとや様のものを使用しています。
## 2.スクリプト作成
```js:LoadResources.js
cc.Class({
    extends: cc.Component,

    properties: {
        imageData: null,
    },

    // LIFE-CYCLE CALLBACKS:

    onLoad () {
        this._loadImages();
    },

    // resourcesフォルダの読み込み
    _loadImages(){
        let self = this;
        cc.loader.loadResDir("Images", cc.SpriteFrame, function(err, assets){
            if(err){
                cc.error(err);
                return;    
            }
            self.imageData = assets;
        })
    },
});
```
リソースフォルダから一括で読み込むにはcc.loader.loadResDir()を使います。
引数は
url:リソースフォルダから見た読み込みたいフォルダのディレクトリ
type:読み込むファイルのタイプ
CallbackFunction:コールバック関数
です。
これでresources/Imagesに入っている画像が読み込まれました。

## 3.画像変更

```javascript:SpriteChange.js
let LoadResources = require("LoadResources")

cc.Class({
    extends: cc.Component,

    properties: {
        loadResources: {
            default: null,
            type: LoadResources
        },
        sprite: {
            default: null,
            type: cc.Sprite
        },
        _timer: 3,
        _imageNumber: 0,
    },

    update (dt) {
        this._timer -= dt; // タイマー減少
        if(this._timer < 0){
            this._timer = 3; // タイマーリセット
            this._imageNumber ++; // 画像切り替え
            // 配列の長さを超えたら番号をリセットする
            if(this._imageNumber > this.loadResources.imageData.length - 1){
                this._imageNumber = 0;
            }
            this.sprite.spriteFrame = this.loadResources.imageData[this._imageNumber]; // 画像切り替え
        }

    },
});
```
読み込まれた画像は配列に格納されています。
今回は3秒ごとに自動的に画像が変わるようにしてみました。

![bandicam 2018-04-23 22-51-29-481.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/2080d60c-29ce-a4d6-e253-b486b0a51b67.jpeg)

今回はCanvasノードにLoadResources.jsとSpriteChange.jsをAddComponentしその子にSpriteノードをつけています。CanvasノードのSpriteChangeにはそれぞれCanvasとSpriteを入れます。

# 実行確認
ここまで出来ましたら実際に確認してみます。
![images.gif](https://qiita-image-store.s3.amazonaws.com/0/167483/fe9a03c3-0156-789d-7c39-4017c94d4eb7.gif)
ちゃんと3秒ごとに画像が切り替わっているかと思います。

---

以上がCocosCreator v1.9での画像読み込みと切り替え方法です。
読みづらい部分や間違っている部分などがありましたらTwitter([@Yawara_Mireille](https://twitter.com/Yawara_Mireille))かここのコメントで教えていただけますととてもありがたいです。
ng-conf 2018 で学びを得たセッションまとめ

# ng-conf とは？

年に1度行われる、世界最大規模の Angular のお祭りです
様々なセッションやワークショップが開催され、Angular に関する多種多様な情報を得ることができます
今年は、4/18 ~ 4/20 で開催されたようです

<img width="867" alt="スクリーンショット 2018-04-23 22.14.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/e2fb738f-5853-ec41-5c8b-4bca0b165415.png">


そんなこんなで土日に大量の動画が投下され、飛ばし飛ばし見ていたのですが捌ききれませんねこれは・・・
今回は、ng-conf 2018 の素晴らしいセッションの中で「実際に使えそうだな！」と思った部分を抜粋してみました

# RxJS6 のイントロダクション

<img width="772" alt="スクリーンショット 2018-04-23 23.01.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/aab6d5b1-c6f3-290d-353a-cbae6f029d21.png">


## セッション

https://www.youtube.com/watch?v=JCXZhe6KsxQ

## セッションで使用されたスライド
https://docs.google.com/presentation/d/1h-h4IUgh8mRqItF2F2Ih8g-H9gYjb8MCwHnoIVm-hiU/edit#slide=id.g389cbad6b8_1_70

- RxJS6 の情報がとてもわかりやすくまとまっている
- 6 に移行するとき絶対重宝するやつ


# NgRx Selector の頻出パターン

https://youtu.be/Y4McLi9scfc?t=1024

<img width="444" alt="スクリーンショット 2018-04-23 22.24.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/fc63fa0e-70ad-abc5-7bc8-3d05639b562f.png">

- `NgRx` の router state をセレクタに組み込むことで `getById(id)` の引数を省略することができる
- そのため `id` を取得するための無駄なコードがあちこちに生まれない、クリーンですね

## Router Event によるグローバルスピナー の ON OFF 

https://youtu.be/LaIAHOSKHCQ?t=611

<img width="509" alt="スクリーンショット 2018-04-23 22.28.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/18413b73-b220-b9ef-89f1-27bf0b7e80a3.png">

- Guard 処理や Lazy Loading を行っている間、何も反応がないとユーザーが離脱してしまう
- そういった場合に、グローバルのスピナーやプログレスバーを ON OFF するために使うパターン
- 今まで `NavigationEnd` だけでやってたので直したい…

# Pipe をメモ化して高速化

https://youtu.be/ybNj-id0kjY?t=2319

<img width="558" alt="スクリーンショット 2018-04-23 22.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/0a27cc58-2420-3241-9647-7e2244ab67cf.png">

- リストに存在する大量のアイテムに同様の処理を行う場合、その引数が重複するものであれば、メモ化を行いパフォーマンスを劇的に改善できる
- **めっっっっっちゃくちゃ遅い** サンプルを実際に改善していく様子を見ながら学ぶことが出来る

# SSR with Angular Elements で First Interactive を改善

https://youtu.be/-8bObydfINA?t=1157

<img width="697" alt="スクリーンショット 2018-04-23 22.57.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/f316de3b-05d6-b90e-f46e-d6ffab8b9eb1.png">

- SSR の First meaningful paint は早いが、送られてきた view の描画 + クライアントでのアプリ立ち上げ処理があるため、First Interactive は遅い
- その問題を Angular Elements を使ったハイブリッドアプリで解決する

# まとめ

- 昨年から Angular を始めたので、初めて本格的に ng-conf を見ましたが思ったよりも実践的な内容が多くて面白かったです(≧▽≦)
- まだまだピックアップ出来ていない情報も多いと思うので、興味のある方は是非[セッション一覧](https://nitayneeman.com/posts/all-talks-from-ng-conf-2018/)からご覧ください！