OmniAICreator/Qiita-1.07M huggingface dataset:
C FFIでのコールバックの扱い（RustにおけるNullableな関数ポインタ）

Cの関数ポインタとRustの関数ポインタ
--------------------------------

```c
#include <stdio.h>

typedef void (*rust_callback)(int);
rust_callback cb;

int register_callback(rust_callback callback) {
    cb = callback;
    return 1;
}

void trigger_callback() {
  if (cb != NULL) {
    cb(7);
  } else {
    printf("callback function is not set!");
  }
}
```

([他言語関数インターフェイス]のものを改変)
このようなコールバックを扱うCのライブラリを呼び出すRustのFFIを作りましょう。

[他言語関数インターフェイス]では以下のように作るように書いてあります：

```rust
extern fn callback(a: i32) {
    println!("I'm called from C with value {0}", a);
}

#[link(name = "ext")]
extern {
   fn register_callback(cb: extern fn(i32)) -> i32;
   fn trigger_callback();
}

fn main() {
    unsafe {
        register_callback(callback);
        trigger_callback(); // Triggers the callback
    }
}
```

これは勿論動作します。しかし、これは本当にCのAPIを正しく踏襲できているでしょうか？

元のCのプログラムにおいて、`cb`には`NULL`を入れてもいいはずです。CのAPIでは、コールバックが必要ない場合は関数ポインタとして`NULL`を入れることはよく行われます。

```c
register_callback(NULL);  // callbackは登録しない
```

さてここで問題になるのはRust側の`register_callback`の定義です。`NULL`に相当するのは`std::ptr::null_mut()`なのでこれを代入してみましょう：

```rust
use std::ptr::null_mut;
extern "C" {
    fn register_callback(cb: extern "C" fn(i32)) -> i32;
}
fn main() {
    unsafe { register_callback(null_mut()) };
}
```

これはコンパイルできません：

```
   |
12 |     unsafe { register_callback(null_mut()) };
   |                                ^^^^^^^^^^ expected fn pointer, found *-ptr
   |
   = note: expected type `extern "C" fn(i32)`
              found type `*mut _`
```

これは`as`で明示的に変換しようとしてもできません。

Nullableな関数ポインタ
--------------------

ところでCからRustのバインディングを生成できる[rust-bindgen](https://github.com/rust-lang-nursery/rust-bindgen)はどうやっているのでしょうか？上のCのコードを`bindgen`してみましょう

```rust
pub type rust_callback = ::std::option::Option<unsafe extern "C" fn(arg1: ::std::os::raw::c_int)>;
extern "C" {
    #[link_name = "\u{1}cb"]
    pub static mut cb: rust_callback;
}
extern "C" {
    pub fn register_callback(callback: rust_callback) -> ::std::os::raw::c_int;
}
```

`#include<stdio.h>`があるので余計な部分がたくさん出てきますが、該当部分はこれだけです。
`Option<extern fn(i32)>`を使えば良いようですね。

```rust
extern "C" fn callback(a: i32) {
    println!("I'm called from C with value {0}", a);
}

#[link(name="ext")]
extern "C" {
    fn register_callback(cb: Option<extern "C" fn(i32)>) -> i32;
    fn trigger_callback();
}

fn main() {
    unsafe {
        register_callback(Some(callback));
        trigger_callback();
    }
    unsafe {
        register_callback(None);
        trigger_callback();
    }
}
```

```
$ cargo run
I'm called from C with value 7
callback function is not set!
```

上手くできました(/・ω・)/

参考
----
- [Rustの関数ポインタの落とし穴](http://qnighy.hatenablog.com/entry/2018/02/11/220000)

以上のソースコードは https://github.com/termoshtt/nullable_fn_ptr にあります

[他言語関数インターフェイス]: http://ykomatsu.github.io/rust/book-ja/ffi.html
gitの自分アカウント設定(リポジトリローカル)

# gitの自分アカウント設定

開発用とかのアカウント情報がglobalで設定されているとき、リポジトリローカルの設定として上書きするに使う設定。
よく忘れるので...

```shell-session
$ git config --local user.name "Tsuyoshi CHO"
$ git config --local user.email "Tsuyoshi.CHO@Gmail.com"
$ git config --local user.signingkey 55526347D4D76A9F
$ git config --local commit.gpgsign true
```

必要に合せて、各設定を置き換える

---

https://stackoverflow.com/questions/48230336/git-uses-wrong-subkey-for-signing-commits-with-gpg-key

副鍵を指定するなら

```shell-session
$ git config --local user.signingkey 383835010A5BB4C8!
```

のように`!`を付ける様子(一応確認してOKだった)
【SpatiaLite】ジオメトリの頂点数を返すST_NPoints関数の例

一番単純な例。

```sql
SELECT
	ST_NPoints(
		GeomFromText(
			'POINT(0 0)',
			0
		)
	) AS ST_NPoints
;
-- 1
```

`LINESTRING`は、それを構成する点の数を返す。

```sql
SELECT
	ST_NPoints(
		GeomFromText(
			'LINESTRING(0 0, 1 1)',
			0
		)
	) AS ST_NPoints
;
-- 2
```

`MULTI~`系のジオメトリは、含まれるジオメトリそれぞれの頂点数の合計を返す。

```sql
SELECT
	ST_NPoints(
		GeomFromText(
			'MULTIPOINT((0 0), (1 1))',
			0
		)
	) AS ST_NPoints
;
-- 2

SELECT
	ST_NPoints(
		GeomFromText(
			'MULTILINESTRING((0 0, 1 1), (2 2, 2 3, 2 5))',
			0
		)
	) AS ST_NPoints
;
-- 5
```

注意が必要なのが`POLYGON`で、リングを閉じるために始点と終点で同じ頂点を二度記述するため、そこが二重カウントされる。
以下の例では、三角形を与えているが`(0, 0)`が二重カウントされるので、`ST_NPoints`の戻り値としては`4`となる。

```sql
SELECT
	ST_NPoints(
		GeomFromText(
			'POLYGON((0 0, 1 1, 0 1, 0 0))',
			0
		)
	) AS ST_NPoints
;
-- 4
```

`GEOMETRYCOLLECTION`も`MULTI~`と同様に、含まれるジオメトリの頂点数の合計を返す。

```sql
SELECT
	ST_NPoints(
		GeomFromText(
			'GEOMETRYCOLLECTION('            ||
				'MULTIPOINT((0 4), (7 8)), ' ||
				'LINESTRING(2 3, 10 11)'     ||
			')',
			0
		)
	) AS ST_NPoints
;
-- 4
```
Oculus Goでテレポート移動する

VR でプレーヤーの視点を移動する際にはいわゆる「VR酔い」への対策が必要になります。瞬間的に視点位置が切り替わる「テレポート」は手固い酔い対策なので、Oculus Go での実装を調べてみました。

## 参考（というか全部）
Oculus の開発者ブログにそのものズバリな記事がありました。

[Teleport Curves with the Gear VR Controller](https://developer.oculus.com/blog/teleport-curves-with-the-gear-vr-controller/)

記事のタイトルはGear VR ですが、Oculus Go でも適用できます。
また、実装は本文中のリンクからUnity Package をダウンロード可能ですので、これを使えばテレポートを実現できます。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/241491/e785490b-3910-de73-4dfa-bced6fe4ecfb.gif)


移動だけでなく、タッチパッドに触れる位置によって移動後の向き変更もしてくれます。

### 確認した環境
* Unity 2017.4.2f2
* Oculus Integration 1.25

### 導入方法
1. Oculus Integration をインポート
2. Oculus/VR/Prefabs/OVRCameraRig をHierarchy に配置（Oculus 用カメラ。もともとのMain Camera は削除する）
3. OVRCameraRig/TrackingSpace/LeftHandAnchor とRightHandAnchor の下にOculus/VR/Prefabs/TrackedRemote を配置（コントローラー表示用。設定によって左右どちらかが表示される）
  * LeftHandAnchor 以下に配置したTrackedRemote はInspector でContoller をL Tracked Remote に変更
4. ダウンロードしたArcLocomotion.unitypackage をインポート
5. Project View のArcLocomotion/Prefavs/TallLocomotion をHierarchy に配置（テレポート用Prefav。BezierLocomotion かParabolicLocomotion でもOK）
6. TallLocomotion のInspector で以下を設定
  * Tall Raycaster のTracking Space にOVRCameraRig/TrackingSpace を設定
  * Arc Teleporter のObject To Move （移動させるオブジェクト）にOVRCameraRig を設定

最終的にHierarchy は以下のようになります。

![teleport-3.png](https://qiita-image-store.s3.amazonaws.com/0/241491/9809f8ec-4633-6701-71fa-4a61f5b5c578.png)


## テレポート先の指定とカーブの描画方法
簡単に中身も紹介。
記事では3つの手法が紹介されています。

1. ベジェ曲線 (Bézier curve)
2. 放物線 (Parabolic curve)
3. トールレイキャスト (Tall ray cast：上空からレイを飛ばす)

手法の詳細にはここでは触れませんが、ベジェ曲線と放物線では接地位置取得のために曲線をセグメントに区切って判定する必要があり、そのため単純にレイを飛ばすトールレイキャストが最も計算コストが低い、と書かれていました。

ちなみにトールレイキャストの曲線はベジェ曲線で描画されているようです（判定と視覚化が分けてある）。

## まとめ
Oculus Go でのテレポート実装を調べてみました。参考記事の実装はライセンスが明記されていなかったので注意が必要ですが、内容は非常に参考になります。
Slackのカスタム絵文字をLINEスタンプ風に表示するbotを作った

Slackのカスタム絵文字をLINEスタンプ風に表示してほしいという要望があったので作成してみた。

下記の記事を参考にしてGoogleAppsScriptで実装しました。
[Slackのemojiをデカくする](http://tech.grooves.com/entry/2017/04/04/122107)

# 処理の流れ
SlackではSlash commandsを自分で作ることができます。
https://api.slack.com/slash-commands

これを使って「/stamp :custom_emoji:」と入力されたら、GAS側はdoPostでコマンドを受け取りその絵文字の元々の画像をポストするようにします。
GASをウェブアプリケーションとして公開し匿名ユーザーを含む誰でもアクセス可能にしておきます。

GAS側の処理としては、

1. 絵文字を探す
2. 投稿元のチャンネルとユーザー情報（名前とアイコン）を取得する
3. 上記情報を使ってチャンネルにPostする
 
という流れになります。

また、GASでのslackに関する処理はほとんど下記のライブラリでできます（いつもお世話になっております）
[Slack BotをGASでいい感じで書くためのライブラリを作った](https://qiita.com/soundTricker/items/43267609a870fc9c7453)

# アクセストークンについて
アクセストークンはLegacy tokenとOAuth Access Tokenの2種類があります。
取得方法についてはそれぞれ下記の記事が詳しいですが、Legacy TokenはすべてにアクセスできてしまうのでOAuth Access Tokenを使って適切に権限を設定するほうがいいと思います。

- Legacy Token  
[Slack APIのTokenの取得・場所](https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)  
- OAuth Access Token  
[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)


なお、今回のソースで使用する権限は下記の3つです。

- Send messages as slamp_gas(chat:write:bot)
  - チャンネルに投稿する
- Access the workspace’s emoji(emoji:read)
  - 絵文字の一覧を取得する
- Access user’s profile and workspace profile fields(users.profile:read)
  - ユーザーのプロフィールを取得する

# 使い方
[元記事](http://tech.grooves.com/entry/2017/04/04/122107)の通り、`/stamp :custom_emoji:`とタイプするとその絵文字の元画像が投稿されます。
/stamp :まで打ってTABキーで補完してくれる他、/stampまで打って普通に絵文字を選んでもいいです。


# ソースとインストール方法
Githubに上げました。
https://github.com/iteduki/slamp_gas
Dartでmulti-line string(例：var s = '''サンプル''')

Flutterの[こちらのチュートリアル](https://flutter.io/tutorials/layout/#step-4)に沿って以下のコードを書いていて、ちょっと気になる箇所がありました。

```dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //...
    Widget textSection = new Container(
      padding: const EdgeInsets.all(32.0),
      child: new Text(
        '''
Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese 
Alps.Situated 1,578 meters above sea level, it is one of the larger 
Alpine Lakes. A gondola ride from Kandersteg, followed by a half-hour 
walk through pastures and pine forest, leads you to the lake, which 
warms to 20 degrees Celsius in the summer. Activities enjoyed here 
include rowing, and riding the summer toboggan run.
        ''',
        softWrap: true,
      ),
    );
  //...
}
```

```'''Lake Oeschinen...'''```という文字列リテラルを```new Text()```の引数に渡してあげていますが、この```Lake Oeschinen...```という文字列がなぜ **シングルクォート1つ(')**あるいはダブルクォート('')ではなく、**シングルクォート3つ(''')**で囲われているのかなぁと疑問に思いました。マークダウンでもないし。

他言語でも使うのかもしれませんが、勉強不足で初めて見る感じ。
(ざっと調べた感じ、少なくとも他にScalaという言語では使うのでしょうか)

[Dartのlanguage tourのStringの項目](https://www.dartlang.org/guides/language/language-tour#strings)を見てみると、どうやらこれは(```'''```も含めて)**複数行にわたって文字列リテラルを指定**するときに使うそうです。

> Another way to create a multi-line string: use a triple quote with either single or double quotation marks:

↑でいう```triple quote```が```'''```です。

コード例は以下。

```dart
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";
```

Javaみたいに```+```を使ったり、```StringBuilder```を使わなくても良くて楽ですね。
DockerでNode.jsの起動

## DockerでNode.jsを起動してみる
やり方は色々ありますが、公式イメージを使用するのが手軽なので今回はそれでやります。

## 手順
### docker-compose ファイルを作成  
	  version: "2"
	  services:
		node:
		  image: "node:latest"
		  user: "node"
		  working_dir: /home/node/app
		  environment:
		    - NODE_ENV=production
		  volumes:
		    - ../app:/home/node/app
		  expose:
		    - "3000"
		  ports:
		    - "3000:3000"
		  command: "npm run start"

※composeファイルの一つ上のディレクトリにアプリケーションフォルダ(app)を配置しマウントする設定にしています。  
※ポート3000での接続を想定。

### Dockerコンテナを起動
`docker-compose up -d`

## まとめ
Dockerの基本的な説明は省きましたが、殆ど上記方法だけで簡単な環境は出来てしまいます。
改めてDocker便利だなぁ～と実感しつつ、Node.js起動して終わりではなんなので； 今度はアプリを動かしてみたいと思います。
TypeScriptも覚えなきゃと思っていたので、次は「[Nest](https://nestjs.com/)」の[インストールと実行](https://qiita.com/tailix/items/4f98918b40b71a1ece76)をやってみます。
glibc newlib より速いクイックソート(qs9 qs10)、 世界最速をめざして

#qsortの新しいアルゴリズム qs9 を開発しました
https://qiita.com/t-kawa/items/262befe31723df32fbfb
で qs9 のベンチマークテストを実施しました。
その結果、ソート対象によっては間接ソートを取り入れた方が高速なことが判りました。
今回、間接ソートを取り入れた qs10 を開発しました。
#お願い
現在、 標準qsort　qs9　qs10　を比較するベンチマークテストを行っております。
http://ww51.tiki.ne.jp/~srr-cake/qsort/qs9/index.html
(最新版 http://ww51.tiki.ne.jp/~srr-cake/qsort/qs10a/index.html   　 2018/8/1)
興味をお持ちの方はご協力頂けないでしょうか。
特に、 非x86系システム や 32bitシステム での参加がなく困っております。
実行結果は、この記事のコメント欄にご記入下さい。

私の場合のベンチマークテストの環境と結果を次のコメント欄に記します。
【Git】普通に作業フォルダを一切触らずにfetch mergeして競合しないか確認＆ケース別対応メモ

# 説明
単純に**「カレントブランチにおいてfetch merge、または pull する時に競合するかどうか」**を**「作業フォルダを一切触らず」**に確認する方法と、応答別状況説明・及び対処法をメモ

無秩序なgit環境でとりあえず状況確認に実行してみる用途向けです。
**応答をケース別に分けて説明**しているので、mergeで何をしているかの理解も深めることができると思います。（多分）
本来マージして競合があればその場で解決＆検証するのが順当ですが
作業フォルダが変更されるのは困る・・という場合（あるのか？）や、利用できます。

間違いがあればご指摘コメントお願いします・・

# 手法

まずはフェッチ

```

$ git fetch 
```

完了後以下のコマンドで確認

```

$ git diff HEAD...origin/【ブランチ名】 | git apply -3 --check
```

【ブランチ名】には所定のブランチ名を指定してください。

# 応答と確認方法

実行結果の応答別に紹介

## Case 1 マージ無し
```

$ error: unrecognized input
```

の場合は「適用する差分がない」
エラーに見えますが、前半のコマンドの結果、「空（差分無し）」だったので後半のコマンドで消化不良になっているだけです。

## Case 2 正常にマージ可能
```

（無反応）
$ 
```

応答なしの場合は「マージ物はあるが、作業ファイルとの被りは無い」状態、マージしても競合しないはず。

## Case 3 マージ物と未コミットの作業ファイルが被っている
```

$ path/to/file: does not match index
```

<kbd>path/to/file</kbd>は対象のファイルへのパスです。
上記の場合は、「適用差分がコミットされてないのでローカルリポジトリにコミットしてください」
自動(3way)マージするにはローカルリポジトリへのコミットが必要です。

## Case 4 マージ物とローカルリポジトリの変更が被っているけど正常にマージされました
```

error: patch failed: path/to/file:line
Falling back to three-way merge...
Applied patch to 'path/to/file' cleanly.
```

の場合は「マージ物とリポジトリの変更が被っているけど自動(3way)マージし、正常にマージされました」
この場合は「git merge」の実行中に機械的なマージで解決され、手作業による競合解決は必要ない状態です。

## Case 5 マージ物とローカルリポジトリの変更が被り、自動マージしてみたがダメだった
```

error: patch failed: path/to/file:line
Falling back to three-way merge...
Applied patch to 'path/to/file' with conflicts.
```

の場合は「マージ物とリポジトリの変更が被っているので自動マージし、結果競合しました」
の場合は**確実に競合**です。手作業による競合解決が必要です。

## 結局見るべき応答は？

とりあえず、見るべきは以下の点。

- 「Case 3 コミットしてね」→　作業中のブツをローカルリポジトリにコミットしましょう。
- 「Case 5 自動マージ失敗」→　先方の変更点を先に適用して、再チェック。<br>
 （※ 空白も併せて確実にしないと解消されません）<br>
リモートの変化を知りたければ前半のコマンドを実行すると良いでしょう。

```

git diff HEAD...origin/【ブランチ名】
```

# 解説

何しているか不安な方はこちらを確認

前半の

```

git diff HEAD...origin/【ブランチ名】
```

で比較します。「HEAD...」とドットを三つにすることにより、**「リモートリポジトリとローカルリポジトリの分岐点」**と**「リモート」**の比較になります。
このコマンド単体を実行することにより、リモートの変化が確認できます。
標準出力されたデータはそのままパッチとして利用できるので次のコマンドにパイプ(` | `)で渡します。

```

git apply -3 --check
```
パッチを当てるふりをしてチェックしています。ここでエラーが出るかを確認しています。
base mine theirs の3wayマージで、自動マージも確認できます。
[windows7] vagrant up でエラーが出る。[powershell]

# Windows7でvagrant upをしたらエラーが吐かれて解決したお話
結論から申し上げますと、powershellのPATHを環境変数に追加してねというお話です。  
ただ、僕のようにwindowsに不慣れ & windows 7 & 初心者 という状況の人がいるかもしれませんので残しておきます。  

## 環境
- windows 7
- Git Bash

## エラー内容

``` console
$ vagrant up
The executable 'powershell' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.
```
- powershellのPATHが見当たらないという話。
    - 正直、なぜpowershellのPATHが必要なのかよく分かっていない。

## 解決策
**システム環境変数にPATHを追加します。**
1. コンピューター → プロパティ → システムの詳細設定 → 環境変数へ移動  

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/226532/b7682e49-68f1-0c98-4222-2b99e9437e68.png)


2. システム環境変数一覧からPATHを探し、"編集"で変数を追加する。
    - ※もしPATHが無いのであれば"新規"でOK

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/226532/730a9056-22a9-c754-e936-035eab7b7751.png)

- 変数値の文字列の一番後ろに`;C:\Windows\System32\WindowsPowerShell\v1.0`を追加して`OK`
    - これで追加完了。
    - ※**追加後、開いているGit Bashなどは再起動させること。これをしないと、追加した変数を読み取ってくれない。**

## さぁもう一度`vagrant up`！
```
$ vagrant up
The version of powershell currently installed on this host is less than
the required minimum version. Please upgrade the installed version of
powershell to the minimum required version and run the command again.

  Installed version: 2

  Minimum required version: 3
```
**はい次のエラーーーーーーー涙涙**
(これはpowershellのバージョンが要求しているものより低いものがインストールされているからアップグレードしてねというものなので、今のものとは関係ないはず。)

とりあえず、今回解決したかったエラーは解決したのでこの記事はここまで。
アップグレードの記事は探せばたくさん出てくると思いますので、Tryしてみてください。
もし無かったら、また書きます。
'gulp-csv2json'を使ってCSVをJSONに変換する方法


'gulp-csv2json'の使い方を覚え書き。

インストール方法はこちらから
https://www.npmjs.com/package/gulp-csv2json

## 解説

### やりたいこと
CSVをJSONにgulp4を使って変換させたい。。
（今回そのCSVはダブルクオートやクオートで囲われていない）



### 環境

- 環境
  - OS: Windows7
  - nodeJS: 8.11.2
  - npm: 6.1.0
- モジュール
  - gulp: 4.0.0
  - gulp-csv2json: 0.2.5
  - gulp-rename: 1.2.3



はしょっていますが、階層構造はこんなかんじです。

```
sample
  ├─ src/
  │  ├─ data/
  │  │  └─ csv/
  │  │        └─ *.csv
  │  │  
  │  └─ ...
  │     
  ├─ temp/
  ├─ dist/
  │
  ├─ .node_modules/
  ├─ .babelrc
  ├─ gulp.babel.js
  ├─ package-lock.json
  └─ package.json  
```


### 方法

```js:gulpfile.babel.js
import gulp from 'gulp';
import babel from 'gulp-babel';
import csv2json from 'gulp-csv2json';
import rename from 'gulp-rename';

// csvをjsonへ変換
const makejson = () => {
  // csvの値がダブルクオートで囲まれていないのでfalse
  var csvParseOptions = {
    quote: false
  };
  
  return gulp.src('src/data/csv/*.csv')
        .pipe(csv2json(csvParseOptions))
        .pipe(rename({extname: '.json'}))
        .pipe(gulp.dest('src/data/json/'));
};
exports.makejson = makejson;
```

これで`src/data/`内にjsonディレクトリが生成されてjsonファイルが出力されます。
ポイントとしては引用符で囲われていないCSVはオプションで`quote: false`にしてあげることです。

逆に、ダブルクオートで囲われている場合はオプションは**必要ない**です。
その他特別な文字で値が囲われている場合はbooleanではなく文字列として指定してあげればいいはずです。


パーサーオプションの一覧はこちら
http://csv.adaltas.com/parse/

ちなみに、`import`したモジュール名と`const`で宣言したタスク名は重複できないのでご注意ください。
週ごと集計したいけど「週数」だとわかりにくいので

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140981/3e2860b7-1d9f-9a9d-22cd-b82cb4bfb4c0.png)

```
str(DATEPART('year',DATETRUNC('week', [作業日時], 'monday')))
+"/"+
str(DATEPART('month',DATETRUNC('week', [作業日時], 'monday')))
+"/"+
str(DATEPART('day',DATETRUNC('week', [作業日時], 'monday')))
+"〜"+
str(DATEPART('month',DATEADD('day',6, DATETRUNC('week', [作業日時], 'monday'))))
+"/"+
str(DATEPART('day',DATEADD('day',6, DATETRUNC('week', [作業日時], 'monday'))))
```

```
DATETRUNC('week', [作業日時], 'monday')
```
これで、「月曜」開始の週で丸め込み

```
DATEPART('year',(丸め込みの日付))
```
で年の部分とかを取得して、 `2018/4/9` の部分を構築

```
str(DATEPART('month',DATEADD('day',6, DATETRUNC('week', [作業日時], 'monday'))))
```
丸め込んだ開始日に6日足して、その月と日を取得して `4/15` を取得



なかなかいい方法が思いつかなくて、ゴリゴリ書いた感じです。


せっかく日時をしてるのに、ドリルダウンドリルアップができないのでそれをしたいのだけど・・・・いい方法がわからないのですorz
Vue 親から子へ コンポーネント間のデータ受け渡し

# 親からから子へデータをどうやって送ればいいの？ってことで忘備録。

### 【送り方】親にある子コンポーネントのタグにバインド(:)で付けると色々送れる。

```html
<kodomo :koreageru="present" :tsutaetai="daijinakoto"></kodomo>
```

↑:子に伝える言葉="送るもの"

例えばv-forで回したアイテム（v-for="item in items"）←この場合でいうitemとかを送る場合は

```html

<kodomo v-for="item in items" :koreageru="item"></kodomo>
```

こんな感じで送るものを中に入れてあげれば子に持ってける。


### 【受け取り方】子にpropsって箱を作ってあげればいい！

    props:{
      'koreageru': {
        type: Arrey,
        default: ''
      },
      'tsutaetai': {
        type: String,
        required: true
      }
    },

みたいな感じで書きます。
type:とかdefault:とか色々指定して受け取れる。

例えば受け取った'koreageru'を使うには、

```html

<input type="text" v-model="koreageru">
```

これはテキストボックスの中に'present'と表示されます。

```html

<input type="text" v-model="tsutaetai">
```
これだと'daijinakoto'って表示される。

methodsにも'this.koreageru'みたいな感じで使える。

そうすると親からもらったデータを元に、子は自分で色々遊べるようになる。
ただし、子供がデータ'this.koreageru'をいじくりまわしても、
親のデータが変わることはない。、、、$emitを使わない限り。

親のデータを変えたかったら、、、これ読んでくだせぇ。

Vue 子から親へ コンポーネント間のデータ受け渡し
https://qiita.com/fukuman/items/b0bc84081ad0d2bc522a
日本で提供するアプリのGDRPに対する対処法について


##そもそもGDRPとは
GDRP(General Data Protection Regulation)とは5月25日にEUで施行された個人データ保護法のこと。EU加盟国＋EEA(欧州経済領域)の全ての個人データの保護を基本的人権と同等として、様々なサービス、企業に規制強化されたもの。

GDRPは日本の個人情報保護法と同様個人の名前、住所などはもちろんのこと、IPやクッキー、電子機器で入手したデーななどの情報までもが規制対象になっている。

そして、この個人情報の持ち出し違反者に対して最大世界売上4%または２０００万ユーロの制裁金が課される。

EEA域内に拠点がなくても、旅行サイトなど向こうの方が使うサービスの場合は適用になるので注意が必要

##対処法

###アプリの対処について

アプリの配信域内の国が含まれていれば、有料、無料を問わずGDRPの定期用の対象になる。
なので、EUに配信していてその地域で特にDLが多いとかでなければストアから下げてしまうのが良い。
iTunesConnectの配信国からヨーロッパをまとめて選択できるのでそれでまとめて対応できます。

マイAppからApp Store 「価格および配信状況」を選択し、「配信可否」の編集から配信する国を選択する。

全てのテリトリ

![スクリーンショット 2018-06-06 19.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/64331/e53dd87a-15df-3e11-8295-d1eedc908158.png "スクリーンショット 2018-06-06 19.52.46.png")

右上からヨーロッパを選択するとヨーロッパ一覧が出ます。
既存nuxt.jsプロジェクトにvuetifyを入れる

# インストール
```shell

npm install --save vuetify
```

# /pluginsでプラグインを入れる
nuxtでは`root/plugins`以下にプラグイン関係のファイルを作って管理するらしい。
`root/plugins/vuetify.js`

```javascript

import Vue from 'vue'
import Vuetify from 'vuetify'

Vue.use(Vuetify)
```

# nuxt.config.jsに記載

```javascript

module.exports = {
  plugins: ['~plugins/vuetify.js'],
}
```

# このままだとStyleが入らないので、index.vueにスタイルをimport
`root/pages/index.vue`

```vue
<script>
import 'vuetify/dist/vuetify.min.css'
</script>
```
css-loaderが入っていない場合はそちらも入れておく

```shell
npm install --save css-loader
```

## 参考
[公式](https://vuetifyjs.com/ja/getting-started/quick-start)
[How to use Vuetify in nuxt](https://laracasts.com/discuss/channels/vue/how-to-use-vuetify-in-nuxt)
Spring Boot 1.4系から1.5系にアップデートした際にAPIコールでレスポンスコード400が返る

# 現象 
Spring Bootを1.4.0から1.5.13にバージョンを上げた際、社内LANで提供しているAPIを呼び出すと、400エラーが返ってくるようになった。

# 調査
内蔵tomcatのバージョンが上がったことによるものとは思ったが、全く特定できなかった。
ただIPアドレスでの直アクセスだとアクセスできるので、名前解決問題？かと思ってDNSのあたりを調査するが、
原因はわからず。

# 原因
ホスト名にアンダースコア(_)が含まれており、[RFC952](https://tools.ietf.org/html/rfc952)では許容されていない。

# 解決策
ホスト名のアンダースコアをハイフンに変更。**アンダースコアは使わないほうがよい**。
（インフラエンジニアには基本中の基本なんだろうなぁ。。） 
<br>
<br>
フルスタックエンジニアへの道は険しい。。

### 参考
https://stackoverflow.com/questions/50581779/spring-boot-1-4-1-5-suddenly-checks-for-hostname
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=851357
https://ja.wikipedia.org/wiki/%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D
JavaScriptのクラスフィールドの話

# 最初に
MobXの勉強してたら、しれっとクラスフィールドが使われていたので、びっくりした。

どこかのバージョンで入るとは聞いていたけど、深追いしていませんでした。

ので、少し調べましたというお話。

20180607現在、ESnextのStage3です。
<img width="455" alt="classfield.png" src="https://qiita-image-store.s3.amazonaws.com/0/24484/50e78baf-48ad-d3dc-7865-8f73029e0022.png">

# 動作環境
自分の記事ですが、下記を参考にしてください。
https://qiita.com/tsuuuuu_san/items/d27b536fc39cf9fc899c#%E4%BB%98%E9%8C%B2

# 早速使う
参考：https://github.com/tc39/proposal-class-fields

## フィールド宣言
```js:ES2015の場合
class Myself {
    // この辺にクラスフィールド書きたいけど、書けないんだよ

    constructor() {
        // しょうがないので、ここに書くと使えるよ
        this.name = 'tsuuuuu_san';
    }
}

const myself = new Myself();
console.log('name:', myself.name);  // name: tsuuuuu_san
```

```js:ESnextの提案
class Myself {
    name = 'tsuuuuu_san';
}

const myself = new Myself();
console.log('name:', myself.name);  // name: tsuuuuu_san
```

## プライベートフィールド
フィールドに「**#**」をつけると、プライベートになる。

```js
class Myself {
    name = 'tsuuuuu_san';
    #age = 16;

    get anserAge() {
        return this.#age;
    }
}

const myself = new Myself();
console.log('name:', myself.name);          // name: tsuuuuu_san
console.log('age:', myself.age);            // age: undefined
console.log('anserAge:', myself.anserAge);  // anserAge: 16
```
コミットしようと思ったら違うブランチにいた場合の対処

# 状況
いい感じでソースをガリガリ書いていた。
テストもいい感じだ。
さあコミットしましょう！
念のため今のブランチを確認する。

```
$ git branch
```

__featureブランチで作業してると思ったら develop ブランチじゃん！！__


# 対処

もしaddしちゃってたら取り消す

```
$ git reset HEAD project/hoge.php

```


変更したファイルを退避

```
$ git stash

```

これで変更ファイルが退避されるので今の状況を確認してみる。

```
$ git status
On branch develop
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        project/fuga.php

nothing added to commit but untracked files present (use "git add" to track)
   
```
修正した project/hoge.php はリストから消えていて、新規追加した project/fuga.php はそのまま残っている。

`git stash save "message"`
にすると、何の作業中ソースなのかコメントを残せる

本来のブランチを作ってなかった場合はここで作る
今回は git flow で feature/piyo ブランチを作る

```
$ git flow feature start piyo

```

上記で新しく feature/piyo が作られ、カレントブランチも移動される。

ここで、さっき退避したファイルを戻す

```
$ git stash apply

```
git stash は、複数退避させて指定したものを戻す、ということもできる
apply は最新のを対象に戻す時に指定する


確認してみる

```
$ git status
On branch feature/piyo
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   project/hoge.php

Untracked files:
  (use "git add <file>..." to include in what will be committed)


        project/fuga.php

no changes added to commit (use "git add" and/or "git commit -a")

```


あとはいつも通り


そして、もう要らなくなったものは綺麗にお掃除しておく

現在のリスト

```
$ git stash list
stash@{0}: WIP on develop: cd4e171 ・・・・・
stash@{1}: WIP on branch1: 2345789 ・・・・・

```

指定して削除

```
$ git stash drop <stashのNo.>

```

または、全部削除

```
$ git stash clear

```



# 参考にさせていただいたページ
[3 Git のさまざまなツール - 作業を隠す](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E4%BD%9C%E6%A5%AD%E3%82%92%E9%9A%A0%E3%81%99)
https://gist.github.com/koudaiii/526707492ebc5915596e
https://gist.github.com/dtan4/5276185
モデル生成用マイグレーションファイル作成時のコンフリクトエラーへの対処方法

一度消したモデルを再度作成する（モデル名一緒）際に以下のエラーに遭遇。

# エラー内容

```shell
# bundle exec rails generate model user

      invoke  active_record
    conflict    db/migrate/20180607033653_create_users.rb
Another migration is already named create_destinations: /var/local/lib/app/test_app/db/migrate/20171218094339_create_users.rb. Use --force to replace this migration or --skip to ignore conflicted file.
```

マイグレーションちゃん真面目。素直に作らせてよ。

# 対処方法

コンフリクトを回避すためのオプション `--skip` と `--force` が用意されている。

```shell
# マイグレーションファイルの作成だけスキップされる（モデルに関連したファイル群は作成される）
bundle exec rails generate model user -s

# 通常通りマイグレーションファイルが作成される
bundle exec rails generate model user -f
```

# 参考記事
* http://ex-agent.com/2018/03/28/rails_error/
Vue 子から親へ コンポーネント間のデータ受け渡し

Vueの親子間コンポーネントのデータの受け渡しが
よくわからなくなるので忘備録。

##今回試したやつ
「子にあるボタンをクリックして、親が持ってるdataを操作」

1. 子に@click="submitOya" ←子供が親に送る言葉
2. methods内に"submitOya"でthis.$emit('close');を記述
3. 親の子タグ内に@close="tojimasu" ←親が子の'close'を受け取り
4. methods内に"tojimasu"で「ドア閉じてー」という内容を記述

##子コンポーネントのボタン
子供側のvue（子コンポーネント）に書いてね。

```html

<button @click="submitOya">子から親へボタン</button>
```

@click="submitOya" ← ここが親へ送るための記述 
クリックしたら"submitOya"を発動してねって意味。
次に子のmethods内に"submitOya"の内容を書く。

```.vue

methods:{
　submitOya: function(){
　　this.$emit('close');
　}
}
```

submitOyaがclickされたら'close'っていう言葉を送ります。
親に向かって、子供が「閉じてねー！」って言ってる感じを想像。
親へ送るときには$emitってやつを使います。※this.を忘れずに！

この時点では子供が親に向かって「閉じてねー(close)！」って言ってるだけなので、
次は親が受け取る準備をします。


##親の受け取り
親側のvue（親コンポーネント）に書いてね。

```.html
<kodomo @close="tojimasu"></kodomo>
```

受けとるには子供の言葉をそのまま使います。
今回は子供が言った'close'に@をつけて、「閉じてー(close)！」が'tojimasu'で親が受け取り。
受け取ると親が"tojimasu"が発動！
次に親のmethods内に"tojimasu"の内容を書く。

```.vue

data:function(){
　return {
　　doorStatus: true //「閉じたか」のフラグは親のdata内で持ちます。（trueは空いている状態）
　}
},

methods:{
　tojimasu: function(){
　　this.doorStatus = false
　}
}
```

このdata:function()...で
ドアの状態「閉じている、閉じていない」（true/false）のフラグデータを持つ。
'close'する前は、defaultの'doorStatus'（ドア）は'true'で閉じていない状態。
"tojimasu"が発動されたら'doorStatus' は 'false' になり、ドアは閉じます。

このドアはダイアログだったり、
このフラグに対してhasClassしたりして、CSSで色々できそうですね。


親から子供へデータを渡したい時は、、、これ読んでくだせぇ。

Vue 親から子へ コンポーネント間のデータ受け渡し
https://qiita.com/fukuman/items/b7e15a8dab4ebb870952
Chainer の log ファイルから学習曲線を plot

自分が知ってる中で最も楽。

以下、jupyter notebook での実行を想定。

```python
import pandas as pd

log_file = 'path/to/log'
pd.read_json(log_file)\
  .plot(y=['main/loss', 'validation/main/loss'],
        figsize=(15,10),
        grid=True)
```
Laravel の Collections で1件目だけ見つけたいループは first() でできる

配列から条件にマッチする1件目を取り出したいとき、Laravel の Collection で良い感じな書き方を知らなかったので、`filter()->first()` みたいな迂遠なやり方や、配列にしてから `foreach` してました。

ちゃんと Collections や Arr の API を確認してみたら、`Collection::first()` はコールバックを指定できて、そのものズバリな使い方ができるんですね。すごい便利！

やりたいことは下記のようなイメージで、`if ($i % 2)` に相当する条件式が複雑だったり重かったりするから、なるべく最小で break できたほうが嬉しいという場面を想定しています。

```php
$odd = function (int ...$args): ?int {
    foreach ($args as $i) {
        if ($i % 2) {
            return $i;
        }
    }
    return null;
};

$odd(...[1, 2, 3, 4, 5]); // 1
$odd(...[2, 3, 4, 5]); // 3
$odd(...[2, 4, 6, 8, 10]); // null
```

これを Collection で書けば、こんな感じに表現できる。
個人的には、とても自然な表現だと思えます。

```php
$odd = function (int ...$args): ?int {
    return collect($args)->first(function (int $i): bool {
        return ($i % 2);
    });
};

$odd(...[1, 2, 3, 4, 5]); // 1
$odd(...[2, 3, 4, 5]); // 3
$odd(...[2, 4, 6, 8, 10]); // null
```



ちなみに、最初の例をあえて Laravel の Arr で処理するのであれば、下記のような書き方ができます。（`Collection::first()` も処理内容としては `Arr::first()`）

```php
$odd = function (int ...$args): ?int {
    return \Illuminate\Support\Arr::first($args, function (int $i): bool {
        return ($i % 2);
    });
};

$odd(...[1, 2, 3, 4, 5]); // 1
$odd(...[2, 3, 4, 5]); // 3
$odd(...[2, 4, 6, 8, 10]); // null
```
Windows10でWifiには繋がるがWeb・メールが使えなくなったときに試したこと

# 備忘録レベル

## 症状
- 会社のPCでWindows10
- 自分のPCではなく他人のPCのため案の定「何もしていないのに繋がらなくなった」
- Wifiには接続できる
- Chromeで`www.google.co.jp`にアクセスしたところ`ERR_TIMED_OUT`
- メール `Thunder Bird`もずっと接続中のまま

## 対応
+ 他のPC確認で接続できるか確認
 + 同じWifiに接続できているのでこのPCの問題

+ `tracert www.google.co.jp`
 + 問題なくトレース完了

+ `ping www.google.co.jp`
 + 問題なく通る

+ `curl www.google.co.jp`
 + 応答がないのでHTTP経由でのアクセスに問題？
 + タイムアウトっぽいので、ファイアウォール周りかな？

+ ESETのセキュリティを全てオフにしてcurl
 + 応答がない、他のアプリが悪さしている？セーフモードで最小の構成で立ち上げよう。

+ セーフモードで立ち上げ(ネットワークのみの構成)
 + そもそもWifi接続に必要なアプリが立ち上がらなくてネットに繋げない
 + クリーンブートというものがあるのでそれを試してみる

+ クリーンブートする
 + Microsoft以外のサービスを全て無効にするようだ（そういうブート方法があるわけではなさそう）
 + http://windowsfaq.net/trouble/how-to-open-msconfig/

## 繋がった！！

しかし、繋がったとはいえ全てのサービスを無効にしているため、
どのサービスが影響しているか調査する必要がありそうだ。

+ クリーンブートで無効にしたサービスを全て有効にして再度、繋がらなくなるか確認
 + 問題なく繋がらなくなった

+ サービスを1件ずつ無効にしていく
 + 一番怪しいESET(セキュリティソフト)を無効にする
  + 繋がった！

## ESET Serviceを無効にすれば一応繋がる

では、なぜESETを起動していると繋がらないのか。
一度、ESETのセキュリティを全てOFFにしてもダメだったのに…。

+ プロトコルフィルタリングをOFFにすると繋がる
 + 対象外アプリケーションを設定しておけばそのアプリは繋がるはずなんだけど繋がらない

> プロトコルフィルタリングは、POP3、HTTPアプリケーションプロトコル、IMAPを検査し、フィルタリングする機能です。
> ププロトコルフィルタリングを無効に変更しても、リアルタイムファイルシステム保護機能（ファイルの読み込み / 書き込み / 実行時にファイルを検査する機能）にて、ご利用の端末は常時監視されておりますので、セキュリティ上の問題はありません。

まぁ、落とし所としてはここかな。
流石にこれ以上調べると時間がかかりすぎる…。
【Bootstrap3】モーダルのJavaScript呼び出しでデータを渡す

button要素で呼び出す、またはa要素で呼び出す場合は、「data-*」属性を使ってモーダルにデータを渡すことができます。

[参考: モーダル ≪ JavaScript ≪ Bootstrap3日本語リファレンス](http://bootstrap3.cyberlab.info/javascript/modals-data.html)

しかし、JavaScriptで呼び出す場合はどのようにして「data-*」属性のデータを参照すればよいでしょう？

以下のように書くことで参照できます。

```html:HTML
<button type="button" id="sampleButton" class="btn btn-primary btn-lg" data-recipient="受信者名">
	モーダル・ダイアログ 呼び出し
</button>

<!-- モーダル・ダイアログ -->
<div class="modal fade" id="sampleModal" tabindex="-1">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
				<h4 class="modal-title">タイトル</h4>
			</div>
			<div class="modal-body">
				本文
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
				<button type="button" class="btn btn-primary">ボタン</button>
			</div>
		</div>
	</div>
</div>
```

```javascript:JavaScript
$( function() {
	$('#sampleButton').click( function (e) {
		$('#sampleModal').modal({}, e.target);
	});
});
$('#sampleModal').on('show.bs.modal', function (event) {
	var button = $(event.relatedTarget);
	var recipient = button.data('recipient');
	var modal = $(this);
	modal.find('.modal-title').text(recipient + 'へのメッセージ');
});
```

キモは`$('#sampleModal').modal({}, e.target);`の部分。`modal()`の第2引数にオブジェクトを渡すことができます。（第1引数はモーダルのオプション）
Numpyで多次元配列を作る方法

XY平面上で格子点をとりたいときに。x=np.linspace...,y=linspce...とかやってもいいけど変数増えてめんどくさい時に
(x,y)でまとめられます。
```np.mgrid[x開始点:x終点:y交差,y開始点:y終点:y公差]```
で出来ます。終点は含みません。
公差のところを項数にもできます。このとき公差ではなく、項数であることを示すために、項数のあとにjをつける必要があります。

```
np.mgrid[x開始点:x終点:x項数j,y開始点:y終点:y項数j]
```

例

```py
In [43]: np.mgrid[1:5:0.5,0:5:0.5]
Out[43]:
array([[[1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ],
        [1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5],
        [2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. ],
        [2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5],
        [3. , 3. , 3. , 3. , 3. , 3. , 3. , 3. , 3. , 3. ],
        [3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
        [4. , 4. , 4. , 4. , 4. , 4. , 4. , 4. , 4. , 4. ],
        [4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5]],

       [[0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5],
        [0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]]])
```
GSuite でGmailのメールボックス容量(全体)を確認する

ググってもすぐ出てこなかったのでメモしておきます。

G Suite アプリの使用状況レポート - G Suite 管理者 ヘルプ
https://support.google.com/a/answer/4579578?hl=ja

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146444/0bbef59b-0f83-259c-57eb-b150dd509c70.png)

直リンク
https://admin.google.com/AdminHome#Reports:subtab=apps-usage-activity

サンプル画像。実データが無いので、正確な値が取れているかはよく分かりませんが・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146444/58bb533d-87f8-dc7d-c0c9-e5d840c64460.png)
Haskellの関数に等価性を定義したい！

## やりたいこと

`a -> b`を`Eq`のインスタンスにしたいです。

```hs
-- （構想）
instance Eq (a -> b) where
  f == g = ...
```

## きっかけ

> 一般的に関数の型をEqクラスのインスタンスにするのが実現不可能な理由は何か? どういった場合に実現可能か？

1年ぐらい前に、友人から上記の問いを出されて、その時に定義したものをまとめたいと思います。



## 関数の等価性の定義

おそらく、「**同じ引数なら同じ戻り値を返す**」関数同士は等価と言えるはずです。

そのため、関数の定義が異なっても等価なものもあります。
例えば、以下のように定義が異なっても`pow2`と`pow2'`は等価な関数のはずです。

```hs
pow2 x = x * x
```

```hs
pow2' x = x ^ 2
```

## すべての値を列挙する

`Eq`のインスタンスにする方針としては、
1. すべての引数を列挙する
2. すべての引数に対してのすべての戻り値が等価か調べる
です。

列挙するためには、`Enum`型クラスが使えそうです。
すべてを列挙するためには`Bound`型クラスが使えそうです。

つまり、以下ですべて列挙できます。

```hs
allRange :: (Enum a, Bounded a) => [a]
allRange = [minBound..maxBound]
```

使ってみるとこうなります。

```hs
-- Boolをすべて列挙
> allRange :: [Bool]
[False,True]
```

```hs
-- 独自型Colorを列挙
> data Color = Red | Green | Blue | White | Black deriving (Show, Enum, Bounded)
> allRange :: [Color]
[Red,Green,Blue,White,Black]
```

```hs
-- すべてのCharの数を調べる
> length (allRange :: [Char])
1114112
```

```hs
-- すべてのIntの数を調べる
length (allRange :: [Int])
(時間がかかります)
```


## `(a -> b)`を`Eq`のインスタンスにする

`(Enum a, Bounded a, Eq b)`という制約つきで、`a -> b`を`Eq`のインスタンスにできました。

```hs
instance (Enum a, Bounded a, Eq b) => Eq (a -> b) where
  f == g = fmap f allRange == fmap g allRange
    where
      allRange :: (Enum a, Bounded a) => [a]
      allRange = [minBound..maxBound]
```

### 実際に関数同士を比較してみる

まずは`ord :: Char -> Int`を使って等価性を調べてみます。
以下のように`ord`と`ord`なら等価になります。

```hs
> ord == ord
True
```

以下は`ord`と自作関数`nextOrd`は等価じゃないので、`False`です。

```hs
> nextOrd c = ord c + 1 -- nextOrdは自作関数
> ord == nextOrd
False
```

次は、定義が違う`pow2`と`pow2'`を比較します。
（`Int`だと現実的な時間で計算が終わらないので、`Int8`を使いました）

```hs
import           Data.Int

pow2 :: Int8 -> Int8
pow2 x = x * x

pow2' :: Int8 -> Int8
pow2' x = x ^ 2
```

以下のようにTrueになります。

```hs
> pow2 == pow2'
True
```


最後に、カリー化された関数でも試してみます。

```hs
import           Data.Int

-- 足し算
add = (+) :: Int8 -> Int8 -> Int8
-- 引き算
sub = (-) :: Int8 -> Int8 -> Int8
```

以下のように、うまく関数同士で、等価性の比較できました。

```hs
> add == add
True
```

```hs
> sub == sub
True
```

```hs
> add == sub
False
```

```hs
> sub == add
False
```
プログラミングの上達のコツ

#はじめに
授業で学んだ事のメモとして残します。

#上達のコツ
###◇作りたいものを見つける
　プログラムで作りたいものを明確にする。
###◇ひたすらコードを打つ
　サンプルコードでいいので処理を理解しながら打ち込む。(理解できなくても丸写しで打っても大丈夫、後から理解すればいい)
###◇サンプルコードを臆せずいじる
　探求心を持ち、自分でコードをいじってみる。(動かなくなった時の事も考えてあらかじめコピーを取っておく)
###◇自分で調べる癖をつける
　プログラミングしていればミスやトラブルは当たり前なので、諦めずにトラブルの解決法をとことん検索する。
###◇英語に臆しない
　エラーが英語で表示される、調べたいことが英文で書いてあるなど、プログラムの勉強をしていると避けては通れない道なので、英語がわからないなどと思わずに読む努力をしてみる。(翻訳機も活用)
###◇コードを死ぬほど打て
　よく言われる事で、これが一番の秘訣。
###◇プログラミングは一朝一夕で身につかない。
　だからこそ、身につけたら価値がある。
###◇諦めない
プログラミングを勉強している人は本当に諦めてやめる方が多い。講師の方でもやはりやり始めたときはそう思っていたそうです。
###◇いずれわかる時がくる
プログラミングの勉強は学習時間と比例して理解度があがるわけではなく、学習したことが一つの点となりその点をいくつも作っていけばいずれその点がつながり、つながった時に初めて理解できたと実感する。
evernoteでサブノートブックを作る方法

# evernoteでフォルダーわけをする
stackという機能をつかってさらにこまかくフォルダーわけをすることでわかりやすくなることを期待する。ノートではなくノートブック自体をどうやらドラックアンドドロップするればいいことがわかった。
こちらのユーチューブ[動画](https://www.youtube.com/watch?v=Eyb54Rh3biM)が参考になります。

この方法を活用すると抽象度コントロールが非常にしやすくなってきます。
例えば、今回している活動　プロジョクトは

##全てはノートを作ることから始めるべし
エバーノートはフォルダーわけをどんどんしていくために作られているのではない。まずはノートを作るということが重要。そのノートの親を次に決める。その時に現在のなかでなかったら作成する。
この作業を続けていると親と親を組み合わせてよりすっきりさせることが必要であるとわかってくる
これが抽象化である。
まずは抽象的な枠組みから考えるのではなく　具体的なれいから　少しずつ抽象化していくイメージである。
簡単に言えば、ノートブックのかずは　全部で７つにしておくことが良い。
これは、つまりコミュニティーを７つ持つことに対応すると言っても良いかな。どうだろう　ここまではまだ確定できないかもしれないが、とにかく少なくしていたほうがわかりやすいのは事実である。しかし、このグーグルのタイピングはとっても打ちやすいのでおすすめです。
Oculus Go 開発メモ - VRInputでスワイプするとOnClickも呼ばれてしまう件


## 症状

タイトルどおりで、VRInputを使ってスワイプを検出しようとすると、OnSwipeだけでなくOnClickやOnDown,OnUpなども呼ばれてしまう。


## 原因

VRInput.csを読んでみると、 ```Input.GetButtonDown("Fire1")``` でクリックを判定しているのだが、 ```Input.GetButtonDown("Fire1")``` はOculus Goのコントローラーのタッチパッドに触れた時（クリックした時ではない）にもtrueになるようだ。

## 対処

VRInput.csを以下のように書き換えた。

はじめに、どのボタンのクリックを拾いたいかを設定するフィールドを用意しておく。

```csharp:VRInput.cs（抜粋）
        [SerializeField] private OVRInput.Button clickButton = OVRInput.Button.PrimaryIndexTrigger;
```

次に、実際に入力を判定しているメソッド ```CheckInput``` を大幅に書き換える。

```csharp:VRInput.cs（抜粋）
        private void CheckInput(){
            // Set the default swipe to be none.
            SwipeDirection swipe = SwipeDirection.NONE;

            if (Input.GetButtonDown("Fire1")){
                // When Fire1 is pressed record the position of the mouse.
                m_MouseDownPosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
            }

            // This if statement is to gather information about the mouse when the button is up.
            if (Input.GetButtonUp ("Fire1")){
                // When Fire1 is released record the position of the mouse.
                m_MouseUpPosition = new Vector2 (Input.mousePosition.x, Input.mousePosition.y);

                // Detect the direction between the mouse positions when Fire1 is pressed and released.
                swipe = DetectSwipe ();
            }

            // If there was no swipe this frame from the mouse, check for a keyboard swipe.
            if (swipe == SwipeDirection.NONE){
                swipe = DetectKeyboardEmulatedSwipe();
            }

            // If there are any subscribers to OnSwipe call it passing in the detected swipe.
            if (OnSwipe != null){
                OnSwipe(swipe);
            }

            if(OVRInput.GetDown(clickButton)){
                if (OnDown != null){
                    OnDown();
                }
            }

            if(OVRInput.GetUp(clickButton)){
                if (OnUp != null){
                    OnUp();
                }

                // If the time between the last release of Fire1 and now is less
                // than the allowed double click time then it's a double click.
                if (Time.time - m_LastMouseUpTime < m_DoubleClickTime){
                    // If anything has subscribed to OnDoubleClick call it.
                    if (OnDoubleClick != null){
                        OnDoubleClick();
                    }
                }else{
                    // If it's not a double click, it's a single click.
                    // If anything has subscribed to OnClick call it.
                    if (OnClick != null){
                        OnClick();
                    }
                }

                // Record the time when Fire1 is released.
                m_LastMouseUpTime = Time.time;
            }

            // If the Cancel button is pressed and there are subscribers to OnCancel call it.
            if (Input.GetButtonDown("Cancel")){
                if (OnCancel != null){
                    OnCancel();
                }
            }

        }
```

以上。
android studioまとめ

#はじめに
授業で学んだ事のメモとして残します。

#Android studioのCreate New Project画面について

###Target Android Devices
![setumei.png](https://qiita-image-store.s3.amazonaws.com/0/249280/f57bbd13-a360-bd81-8c9d-b9d7f746585c.png)
AndroidのOSが動く端末はスマートフォンやタブレットだけでなくAndroid WearやAndroid TVなど数多くの種類がある。
他の端末向けのアプリも開発出来るようになっている。
Phone and Tabletの下のドロップダウンリストでは、作成するアプリが動作する最小のAPIレベルを選択。
　※APIレベルとは、Androidプラットフォームで提供されているフレームワークAPIのリビジョン（修正・改訂）をバージョンで識別している数値のこと。

###Add an Activity to Mobile
![setumei2.png](https://qiita-image-store.s3.amazonaws.com/0/249280/bf30c714-6e58-1d5f-2413-65d8404106a3.png)
プロジェクト作成時に、テンプレートに基づきある程度のソースコードが記述された状態を用意してくれる。その用意された13種類のテンプレートから選択するのがこの画面。
Empty Activityは、アクションバーにメニューなどの設定もない一番シンプルで作成しやすいプロジェクト。

###Add an Activity to Mobile画面の選択肢の内容
Add No Activity
　画面を必要としないアプリを作成するためのもの
Basic Activity
　アクションバーが表示され、フローティングアクションボタンが組み込まれたもの
Button Navigation Activity
　画面下部にナビゲーションのようにボタンを並べたアプリを作成するためのもの
Empty Activity
　あらかじめソースコードがほどんど記述されていない。一からアプリを作成するためのもの。
Fullscreen Activity
　ステータスバーやアクションバーが表示されないフルスクリーンのもの
Google AdMob Ads Activity
　広告バナーを表示するアプリを作成するためのもの
Google Maps Activity
　Googleマップを表示するためのもの
Login Activity
　非同期通信でログイン処理を行うためのもの
Master/Detail Flow
　スマートフォンでは一覧表示→詳細画面と画面遷移を行うのに対し、タブレットでは左に一覧、右に詳細を表示する画面構成を一つのアプリで実現するためのもの
Navigation Drawer Activity
　スライド式メニューを使うためのもの
Scrolling Activity
　画面をスクロールすると上部ヘッダ部分が自動的に縮小するもの
Settings Activity
　アプリの設定画面を作成するもの
Tabbed Activity
　タブを使った画面を作成するもの

###Configure Activity
![setumei3.png](https://qiita-image-store.s3.amazonaws.com/0/249280/0e33b44e-9804-f15f-5a85-f32a5c9e76b1.png)
この画面ではActivity NameとLayout Nameの二つの入力欄がある。
Androidアプリ開発では、処理をJavaクラス(.Javaファイル)、画面構成をXML(.xmlファイル)に記述する。
つまり、Javaクラスと.xmlファイルのペアで一つの画面が作られている。
このJavaクラスのことをアクティビティと呼び、Activityクラスを継承して作る。
画面構成用の.xmlファイルをレイアウトファイルと呼ぶ。通常、これらはペアで関連した名前を付ける。
プロジェクトについて

#はじめに
授業で学んだ事のメモとして残します。

#アプリケーションを開発する目的
世の中の問題や課題をその人の立場に立って解決し、人を幸せにすること
※ユーザの立場に立って考える

#シーズとニーズ
シーズ：種、技術
ニーズ：必要とされている物

#開発のやり方の変化
1.ウォータフォール
　上流から下流へ工程を1つずつ順番に終わらせていき、（基本的には）工程の後戻りをしないやり方。
2.アジャイル開発
　目的とする一番大切な事を先に開発する。

#開発の手順
1.ターゲット設定(ペルソナ設定)
　個人を詳細に設定することで、よりターゲットを絞ることで有効なアプローチがかけられる。
2.カスタマージャーニーマップ
　あらかじめ設定したペルソナの動きを可視化したもので、ペルソナが必要としている情報を適切なタイミングで提供するための設計図のこと。
3.ワイヤーフレーム
　webページのレイアウトを定める設計図のことで、webサイトの制作現場で聞かないことがない、といえる単語であり、サイト制作において決して欠かせない要素。
Ubuntu18.04(LTS)にadiaryを入れた時にハマったapache2の設定

# まずはじめに
CentOSとかでも出来ると思いますが、apache2.confをhttpd.confとか読み替えが必要です。
よく分からない場合は、検索ワードにCentOS （ご使用のバージョン）とかで探してもらった方が良いかと思います。
apacheのバージョンにも注意してください。**古いバージョンからだいぶ変わっているようです。**

# Ubuntu18.04(LTS)にadiaryを入れた時にハマったapache2の設定
いろいろやったんで原因が色々ありますが、一つずつ切り分けてまとめます。

## 環境
Ubuntu: 18.04
adiary: 3.14a
Webサーバ: apache2
（nginxも対応されたようですが、本記事では扱いません[^1]）

[^1]: ちょっとやってみたんですが、うまくいかなかったので再チャレンジします。

## gitが入ってない
当たり前と言えば当たり前ですが、apt installで入れる必要があります。
apt update & apt upgradeもお忘れなく。
gitを使わずzipをダウンロードする場合は不要です。

## perlのバージョンが古い
apt upgradeしましょう。また、<a href="https://adiary.org/v3man/install2/#k4p2">公式マニュアル</a>にもありますが**perlモジュールもインストールしてください。**

## Webに公開するファイルの場所を変えたい
つまりドキュメントルートを変更したい、という話なんですが初期状態だと/var/www以下を参照しています。
ドキュメントルートを決めているのは/etc/apache2にあるapache2.confやらsite-available/000-default.conf（場合によってはdefault-ssl.confも）です。
変更箇所は、ド直球にDocumentRootとか<Directory /...>とか書いてる項目がありますが、これらを適切に設定します。

## CGIが動かない
まずはgit cloneした.htaccessをコメントアウトしましょう。
調査が大変になります。

その後で参考リンクを参照しつつ、一つずつ順番にやっていきましょう。
一気に設定してapache2 restartとするのはおすすめしません。

### a2enmodとは
色々なところを探すと、apache2.confやsites-available/default.confの話は書いてあっても、a2enmodについては書いてなかったです。
Ubuntu18でCGIを動かす場合、この辺りの設定が必要だったのですが、参考先のような形で明記してあったのはなかったので、こちらでも取り上げました。

さて、a2enmod cgiを実施すると/etc/apache2/mods-enabled/以下にcgi.*でシンボリックリンクが作成されているっぽいですね。
細かいのはwhich a2enmodで実行ファイル探してcgi辺りで追いかければわかりますが、私がperl5を読めないので多分そういう事やってるんじゃないかな、という感覚で見てます。

## .htaccessの見直し
cgiが動くようになれば、.htaccessを見直します。
dot.htaccessとかリネームされている事もあるので、リネームをお忘れなく。
また、ls -laで参照しないと.htaccessが見当たらないので、コマンドにも注意。
普段からlコマンドでやっている人はlaです。

## それでもうまくいかない場合
キャッシュが残っているので、F5で更新しても状態が変わっていない事が考えられます。
ブラウザ自体を再起動すると解消されたので、おかしいな？と思ったらブラウザ自体を再起動してみてください。タブやページだけではダメでした。

# 参考
<a href="https://adiary.org">adiaryの公式</a>
<a href="https://qiita.com/rakuraku0615/items/6af72e5524228d7c0f9b">ubuntuのapache2のドキュメントルート変更</a>
<a href="http://auewe.hatenablog.com/entry/2016/06/13/170457">apache2でcgiがダウンロードされる時のチェック項目一覧</a>

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
ネットワークスペシャリスト　午後解答に出てくる単語を抽出してみた

#きっかけ
pythonを勉強をしていて形態素解析なるものを知り
勉強のサンプルとしてネットワークスペシャリストの午後1,2の解答に出てくる単語のカウントしてみました。

#手順
①IPAサイトからネットワークスペシャリストの午後の解答PDFをダウンロード
※平成24年度～29年度まで

②PDFファイルからテキスト抽出
参考
>　PDFMinerでPDFから日本語テキストを抽出する
　 https://qiita.com/korkewriya/items/72de38fc506ab37b4f2d

　そのままだとPDFにセキュリティがかかっているため
　下記コマンドにて解除

```
qpdf --decrypt --password='' encrypted.pdf decrypted.pdf
```


③上記で抽出したテキストを一つのテキストファイルに纏めて、
さらに手動で【出題趣旨】や図の解答、IPアドレスなど不要なものを削除

参考URL
> 形態素解析をして日本語の文章を単語区切りにする方法
  https://ai-kenkyujo.com/2017/10/02/word/
　※今回は単語数500にして抽出して、どう考えても不必要な単語（）は削除しました。

#結果
意味不明な数字のものや「同」「一」、「プロ」「キシ」のように
単語が分かれてしまっているものもありますが、とりあえずそこはスルーで。
私は試験で漢字が書けるか不安もあるのでその参考にでもなれば。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171677/912aa293-0d63-b478-7343-b0f779db3a77.png)
【Google Home開発】 Dialogflow V2になったWebhook API仕様の変更点まとめ

先日 Dialogflow バージョンが V2 になってて Webhook APIのパラメータ仕様がいろいろ変わってたのでよく使う項目だけ抜粋してまとめました。



# 

Dialogflow を使ってGoogle Homeに喋らせるときにはJSON形式で送ります。

V1の時は以下のような構造で送ってましたが、

```json:V1の最低限のレスポンス
{
  "speech": "レスポンス",
  "displayText": "レスポンス"
}
```
V2になって項目が一つにまとまりました。

```json:V2の最小限のレスポンス
{
  "fulfillmentText": "レスポンス"
}
```

# リクエスト

よく使う項目を抜粋

```json:V1
{
  "result": {
    "source": "agent",
    "resolvedQuery": "user's original query to your agent",
    "speech": "Text defined in Dialogflow's console for the intent that was matched",
    "action": "Matched Dialogflow intent action name",
    "actionIncomplete": false,
    "parameters": {
      "param": "param value"
    },
    "contexts": [
      {
        "name": "incoming context name",
        "parameters": {},
        "lifespan": 0
      }
    ],
    "metadata": {
      "intentId": "29bcd7f8-f717-4261-a8fd-2d3e451b8af8",
      "webhookUsed": "true",
      "webhookForSlotFillingUsed": "false",
      "nluResponseTime": 6,
      "intentName": "Name of Matched Dialogflow Intent"
    },
    "fulfillment": {
      "speech": "Text defined in Dialogflow's console for the intent that was matched",
      "messages": [
        {
          "type": 0,
          "speech": "Text defined in Dialogflow's console for the intent that was matched"
        }
      ]
    },
    "score": 1
  },
  "originalRequest": {
    "source": "google",
    "version": "2",
    "data": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [...]
      },
      "inputs": [...],
      "user": {...},
      "conversation": {...},
      "availableSurfaces": [...]
    }
  },
}
```

```json:V2
{
  "queryResult": {
    "languageCode": "en",
    "queryText": "user's original query to your agent",
    "fulfillmentText": "Text defined in Dialogflow's console for the intent that was matched",
    "action": "action name",
    "allRequiredParamsPresent": true,
    "parameters": {
      "param": "param value"
    },
    "outputContexts": [
      {
        "name": "projects/your-agents-project-id/agent/sessions/88d13aa8-2999-4f71-b233-39cbf3a824a0/contexts/generic",
        "lifespanCount": 5,
        "parameters": {
          "param": "param value"
        }
      }
    ]
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "isInSandbox": true,
      "surface": {
        "capabilities": [...]
      },
      "inputs": [...],
      "user": {...},
      "conversation": {...},
    }
  }
}
```

# 参考

[Dialogflow API](https://dialogflow.com/docs/reference/api-v2/rest)
PHPの定数って日本語使えるんだね

## PHP の定数について

[定数 - PHP マニュアル > 言語リファレンス](http://php.net/manual/ja/language.constants.php)

> 定数の名前は、PHP のラベルと同じ規則に従います。有効な定数の名前は、 文字またはアンダースコアで始まり、任意の数の文字、数字、 アンダースコアが後に続きます。正規表現で示すと次のようになります。 [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

なるほど定数に使えるのは英数字だけなのか :whale2: 

## とみせかけて

```php:定数.php
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(-1);


define('こんにちは', 'Hello');
echo こんにちは . PHP_EOL ;


const さようなら = 'Bye';
echo さようなら . PHP_EOL ;
```

```:出力結果
Hello
Bye
```

わぁい！:whale2:

## 参考と注釈

- [定数](http://php.net/manual/ja/language.constants.php)
- [構文](http://php.net/manual/ja/language.constants.syntax.php)
- [オブジェクト定数](http://php.net/manual/ja/language.oop5.constants.php)
拡張子が間違った画像を、IE11でファイルとして開くと、画像は表示されない


# 環境

* IE11(11.48.17134.0)
* Microsoft Edge 42.17134.1.0
* Firefox 60.0.2 (64 ビット)
* Google Chrome 67.0.3396.79（Official Build） （64 ビット）
* Windows10

# データの準備

* `png.jpg` : PNGだけど拡張子が"jpg"の画像
* `jpg.png` : JPEGだけど拡張子が"png"の画像
* `index.html` : 上記の画像を表示するHTMLファイル

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <h1>PNG画像だけど、拡張子が"jpg"</h1>
  <img src="png.jpg">

  <hr>
  <h1>JPEG画像だけど、拡張子が"png"</h1>
  <img src="jpg.png">
</body>

</html>
```

[リポジトリ](https://github.com/yuji38kwmt/static-page/tree/master/false-images)


# 調べたこと

## 拡張子が間違っている画像をファイルとして表示

IE11で、`index.html`をファイルとして（`C:\xampp\htdocs\false-images\index.html`）開いたところ、画像は表示されませんでした。
また、開発ツールのコンソールには「イメージをデコードできません」というメッセージが表示されていました。

```plain
DOM7009: URL 'file:///C:/xampp/htdocs/false-images/png.jpg' のイメージをデコードできません。
png.jpg
DOM7009: URL 'file:///C:/xampp/htdocs/false-images/jpg.png' のイメージをデコードできません。
jpg.png
```

![image](https://qiita-image-store.s3.amazonaws.com/0/37903/fdc962d8-4c6d-e3c0-2705-4e40dad995ec.png)

どうやらIE11は、拡張子を見ているようです。

### IE11以外のブラウザで確認する
他のブラウザで確認したところ、画像は表示できました。

* Firefox: OK
* Google Chrome: OK
* Microsoft Edge : OK



## 拡張子が間違っている画像を、HTTPで表示

IE11で https://yuji38kwmt.github.io/static-page/false-images/index.html を開いたところ、画像は表示されました。

レスポンスヘッダの"content-type"は、拡張子から推測された値でした。
（"png.jpg"ならば"image/jpeg"）

![image](https://qiita-image-store.s3.amazonaws.com/0/37903/319fa2c3-8446-eba7-d4fd-e729e3065036.png)

"content-type"は間違った値ですが、画像は表示されました。


# まとめ

* 拡張子が間違った画像を、IE11でファイルとして開くと、画像は表示されない
* IE11では、ファイルとして画像を開くときと、HTTPで開くときで、挙動が異なる

これ以上は分かりませんでした。
まあいずれなくなるブラウザだから、調査はこの辺りでよいでしょう。

# 気になったこと

## URLバーに表示される値
ファイルとして開いたとき、URLバーに表示される値が異なりました。

* IE11：`C:\xampp\htdocs\false-images\index.html`
* IE11以外：`file:///C:/xampp/htdocs/false-images/index.html`


## ファイルとして開いたときと、HTTPで開いたときの挙動の違い
IE11以外でも、挙動の違いがありました。

たとえば、Firefoxで「画像の情報を表示」を選択したときの「サイズ」です。

* ファイルとして開いたとき：「不明（キャッシュなし）」
* HTTPで開いたとき：「296.72 KB (303,843 バイト)」

スキーマが"http"と"file"で異なるので、ブラウザの処理も大きく異なるんですかね。よく分かりません。


![image](https://qiita-image-store.s3.amazonaws.com/0/37903/fbbb237f-394f-c44a-3562-fe900dc75d67.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/37903/c8c94b3a-5f50-11b5-8c0d-23ce8ffa9e48.png)