OmniAICreator/Qiita-1.07M huggingface dataset:
macbookを買い換えて環境移行後にWiFiに繋がらない場合の対処

macbookを今年の頭に買い換えて環境移行して使っているが、数ヶ月に一回ぐらい遭遇するので、書いておく。

どうも条件は

- 買換え前のmacbookで接続したことがあるWiFi
- WiFiのパスワードがその当時から変わっている

であり、このAPに対して新しいMacbookで接続しようとすると、パスワードを入力するプロンプトが出るまでもなくエラーで蹴られる。

対処方法は、記録されてるAPの情報を消す。

![スクリーンショット 2019-10-17 15.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6047/016ef40b-12db-bb65-9b2f-8884329f3a83.png)

これで、正常フローに遷移可能になる。
AWS Cloud9 に Jest で JS のテスト環境をセットアップしてみた

Cloud9 で JavaScript のテスト環境をセットアップしてみました。

# テスティングフレームワーク

今回は Jest を利用します。

Jest
https://jestjs.io/en/

# Jestのインストール

下記そのままです。
https://jestjs.io/docs/en/getting-started

```bash
$ npm init
$ npm install --save-dev jest
```

package.json に jest のテスト実行を追加します。

`"test": "jest --watchAll --coverage"`

```package.json
{
  "name": "kintone_js_test",
  "version": "1.0.0",
  "description": "",
  "main": "hello.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "jest --watchAll --coverage"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "jest": "^24.9.0"
  }
}
```

# テストファイルの準備

テストされるコードを書きます。

```hello.js
function hello(){
    return "hello"
}
module.exports = hello
```

テストファイルです。

```hello.test.js
const hello = require('../hello')
describe('jest 実行を確認するテスト', () => {
    test('失敗するテスト', () => {
        expect(1+1).toBe('2')
    })
    test('成功するテスト', () => {
        expect(1+2).toBe(3)
    })
    test('成功するテスト hello', () => {
        expect(hello()).toBe("hello")
    })
})
```

# テスト結果

テストが実行出来ました。

<img width="569" alt="スクリーンショット 2019-10-17 14.58.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/5c5b53c6-3776-216a-26d7-28a18975240c.png">
PHPの落とし穴 1: foreachと参照の組み合わせ

次の PHP のコードを見てください

```php
<?php

function f1($array)
{
    foreach ($array as &$item) {
        // noop
    }
    foreach ($array as $item) {
        // noop
    }

    return $array;
}

$data = [1, 2, 3, ];
$result = f1($data);

echo 'result = ' . json_encode($result) . PHP_EOL;
```

`f1` は渡された配列 `$array` を
特になにもしない 2 回のループをくぐらせて
そのまま与えられた配列 `$array` を返す関数です。

このコードの実行結果はどうなるでしょうか？

## 結果

この結果は以下になります:

```
result = [1,2,2]
```

何もしてないのでこれは `[1,2,3]` だろうって予想してしまったのですが
これは予想に反して `[1,2,2]` となります。

## 確認

動作を確認するために
逐一、値を `var_dump` するようにしてみます:

```php
function f2($array)
{
    echo '# first loop begins.' . PHP_EOL;
    foreach ($array as &$item) {
        var_dump($array);
    }
    echo '# second loop begins.' . PHP_EOL;
    foreach ($array as $item) {
        var_dump($array);
    }
    echo '# loops end.' . PHP_EOL;

    return $array;
}
```

この結果は以下です:

```
# first loop begins.
array(3) {
  [0]=>
  &int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  &int(2)
  [2]=>
  int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
# second loop begins.
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(1)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}
# loops end.
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(2)
}
```

一回目のループでは配列内の値は特に変化してませんが (参照されてるくらいですね)
二回目のループでは配列の最後の値が変化しはじめています。

ここから二回目のループが配列の値を変更していることがわかります。

## 更に確認

```php
function f3($array)
{ 
    foreach ($array as &$item) {
        // noop
    }
    var_dump($array, $item);
    foreach ($array as $item) {
        // noop
    }

    return $array;
}
```

```
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
int(3)
```

一回目のループと二回目のループ間に変数 `$item` が生存していて
まだ参照が残っていることに注目してください。

さらに

二回目のループで `foreach ($array as $item)` をするときに
`$item` に `$array` の要素が代入されていってるようすなのがわかりますね。

すなわち

```php
function f4($array)
{
    $item = &$array[0];
    $item = &$array[1];
    $item = &$array[2];
    $item = $array[0];
    $item = $array[1];
    $item = $array[2];

    return $array;
}
```

のような動作をしています。

1回目のループで使用した参照が生きていて
2回目のループで参照経由で値が代入されるのが原因ということがわかります。

## つまり

PHP においては変数がブロックスコープを持ったりしないことに注意して

```php
function f1($array)
{
    foreach ($array as &$item) {
        // noop
    }
    unset($item);
    foreach ($array as $item) {
        // noop
    }

    return $array;
}
```

参照を持つループの一時変数を `unset` するか

```php
function f1($array)
{
    foreach ($array as &$itemRef) {
        // noop
    }
    foreach ($array as $item) {
        // noop
    }

    return $array;
}
```

ループごとに変数名を変更して自明かつ変更があっても
困らないようにする必要があるわけでした。

単純なふうに見えて注意しないと予想外の動作をするコードでした。

---

落とし穴 2 に続くかは未定です:heart:
Docker for WindowsのKitematicをProxy環境下使用する為の設定方法

#Proxy環境下とは
大きな会社は大抵環境下にある。
Docker for windowsは設定があって、指定すれば動くけど
Kitematic 0.17.9はそこは見ないから動かない

なお設定項目はない模様なので度々報告が上がっている模様。
https://github.com/docker/kitematic/issues/321

#設定の仕方
古来よりある伝統のシステム環境変数に以下を設定する。
スタートのサーチから「システム環境変数の編集」を探して起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/2f28a597-8090-0168-ffdd-dc1925e7c246.png)

環境変数(N)...をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/b359401e-b7d6-d324-b259-d7b080601a0c.png)

システム環境変数(S)の新規(W)をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/bca8deed-e13a-7c89-44c0-104af55be48c.png)

HTTP_PROXYの設定　変数値には実際のProxy設定(プロキシ自動設定ファイル（PACファイル）の場合でもそのままのアドレスで設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/5e0ca44e-bc5b-d4e1-5ecb-9ade605c610e.png)

HTTPS_PROXYの設定 変数値は大体HTTP_PROXYと同じ値になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/86e45986-d171-7507-88ae-8cb44369da00.png)

**設定したら全部OKを押して環境設定画面を閉じてPCを再起動する**

#確認方法
おすすめコンテナが出たら成功。でなかったら諦めるか設定を見直す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/8818be11-635d-00ea-2407-8007ce5d763e.png)

#感想
おすすめが出たときは感動した。
pacファイルとか知らんかったので、そのまま指定できるか不安だったけど普通に動いた。

#追伸
wikiに書いてあった。
https://github.com/docker/kitematic/wiki/Common-Proxy-Issues-&-Fixes
**Make the proxy settings 'sticky'**

システム環境設定の画面(英語)だけど。
検索で出るようになると嬉しい。
Helm環境でConfigMapの更新を検知してPodを自動デプロイする方法

## 概要
以前書いた[GKEでArgoを使ったカナリアリリースを実現する（完結編）](https://qiita.com/syogun/items/c4f61a787558df18bf22)でArgoとHelmを使用したカナリアデプロイをご紹介しました。
これと同等の構成を別環境で構築した際、`ConfigMap`の更新が反映されてないぞ？ ということがあり、ハマったのでご紹介します。

## ハマったこと
GKE上でNginxを動かす要件ができたため、[kubernetesで動かすソフトウェアの設定をConfigMapで記述する](https://qiita.com/petitviolet/items/ee4b1bdba2670a1d6a12)を参考に、`ConfigMap`にNginxを設定を入れておき、Nginx用のPodがMountする方式を取ることにしました。
ConfigMapの設定を書き換えてGitHubにPushすると、Argoが更新を検知してConfigMapが更新され、
さらにそれをMountしているNginx用PodのNginx設定も動的書き換わっていることが確認できました。

ちなみにConfigMapを参照する方法として、`VolumeでMountする方法`と`環境変数として渡す方法`の2通り方法があります。
`VolumeでMountする方法`は、一定期間ごとに変更を確認し、ConfigMapに変更がある場合は動的に反映させます。
一方、`環境変数として渡す方法`は、動的な反映はしないようです。
詳細は、[KubernetesのConfig＆Storageリソース（その1）](https://thinkit.co.jp/article/14139?page=0%2C2)が分かりやすかったです。

一見、`VolumeでMountする方法`でPodのNginx設定は反映されているように見えますが、
起動しているNginx Podは、一つ前のNginxの設定で起動したものであり、新しいNginx設定を反映させるには、Podの再デプロイが必要となります。

もちろん手動で再デプロイやることは可能ですが、Pod数が増えてきたりするとあまり現実ではないので、
ConfigMapの更新を検知してPodを自動デプロイする方法を調査しました。

## 実現方法
Helmを使用している場合、以下のようなannotationを入れることで、自動デプロイが実現できました。

```
kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
```

[Automatically Roll Deployments When ConfigMaps or Secrets change](https://github.com/helm/helm/blob/master/docs/charts_tips_and_tricks.md#automatically-roll-deployments-when-configmaps-or-secrets-change)によると、sha256sum関数を使用して、指定したConfigMapのManifestファイルのHash値が更新されることにより、annotationに更新がかかります。そして、その差分を検知したArgoがPodを再デプロイといった感じでしょうか。

## まとめ
Helm使ってない場合はどうするんだ？という疑問が。
手動で入れ替えるしかないのかな？知ってる方がいたら教えてください。
Filebeatでログファイルを最初から読み込ませる（転送完了位置の記録をリセット）

# 概要
Filebeatはログファイルの転送完了位置をRegistry Fileに保存している。
すでに転送したログファイルを最初から読み込ませたいなら、Registry Fileを削除すれば良い。

Directory layout(インストール方法によって異なる)
https://www.elastic.co/guide/en/beats/filebeat/current/directory-layout.html

# コマンド
```
# rpmでインストールした場合
rm -rf /var/lib/filebeat/registry
```

# 参考:Registry Fileの内容
``` registry/filebeat/data.json
[{"source":"/tmp/logstash-tutorial.log","offset":24464,"timestamp":"2019-10-17T13:27:30.836707149+08:00","ttl":-1,"type":"log","meta":null,"FileStateOS":{"inode":1179665,"device":64769}}]
```

``` registry/filebeat/meta.json
{"version": "0"}
```
脱出ゲームの作り方　３

###戻るボタンを作成

◇ボタン

ProjectのプレファブにあるTriggerButtonを、canvasの下にドラッグアンドドロップしてボタンを作成する



ボタンの位置とサイズを調節する（W100 H100）
画像を設定する（Arrow）
矢印の向きが逆なので、Scaleのxを‐1にすると反対向きになる
名前をBackTriggerButtonとする


:point_up:
※今まではボタンに直接画像を設定していなかったというより、白い四角の画像ファイルだった。
※クリックしたらパネルを表示/非表示にする機能のボタンとして、同じ構造
※クリックして操作するパネルは、別のパネルなので、矢印画像とは関係ない。




◇スクリプト
ボタンを押したらパネルをすべて非表示にする

GameManagerスクリプトに下記を追加する

```csharp
    // ボタンを押したらパネルを全て非表示
    public void OnClickBackTrigger()
    {
        lightStandPanel.SetActive(false);
        drawerPanel.SetActive(false);
        pcPanel.SetActive(false);
    }
```
◇ボタンに関数を設定
InspectorでBackTriggerButtonのButtonコンポーネントの On Click() にGameManagerオブジェクトをセットして、
GameManagerに表示される関数をからOnClickBackTrigger()を設定する



##教材
**Unityゲームスタジオ スタジオしまづ**
**【Unity】初心者からの脱出！？　脱出ゲームの作り方　その３**
https://youtu.be/S8G9LE0LNq8
さくらVPSにkusanagiを入れてlaravelをinstallする

さくらVPSの管理画面で事前にサブドメインを作成しておく
サブドメイン：yoyaku.clover-room.com

```
$ kusanagi provision --lamp yoyaku
ターゲットディレクトリは /home/kusanagi/yoyaku です。

Webサイトで使用するホスト名(FQDN)を入力してください。 例) kusanagi.tokyo
yoyaku.clover-room.com

yoyaku のプロビジョニングは完了しました。yoyaku.clover-room.com にアクセスし、lampをインストールしてください!
完了しました。
```


これで　yoyaku ディレクトリが完成している。

```
$ cd yoyaku
$ ll
drwxrwxrwx. 2 kusanagi kusanagi  6 10月 17 13:44 DocumentRoot
drwxr-xr-x. 4 kusanagi kusanagi 30 10月 17 13:44 log
```

wordpressの場合は、DocumenRoot配下に納めたが、laravelは、DocumentRootと同じ位置にlaravelディレクトリを作りインストールする






```
$ pwd 
/home/kusanagi/yoyaku
$ composer create-project laravel/laravel laravel dev-master --prefer-dist
```

```
vi /etc/nginx/conf.d/yoyaku.conf
```
rootを下記の内容に書き換える

```
root  /home/kusanagi/yoyaku/laravel/public;
```

ssl使用する際はssl_confも書き換える
```
vi /etc/nginx/conf.d/yoyaku_ssl.conf
```

```
root  /home/kusanagi/yoyaku/laravel/public;
```

nginx 再起動

```
kusanagi nginx
```
crowiで検索が上手く動作しないときは

オープンソースのwikiであるcrowiをインストールして検索ができなくてハマったのでその時のメモですにゃん😸。こんなアフォはワイくらいかもしれんけどおんなじようなアフォの子がいたら参考にしてほしいにゃん。

### 環境
- CentOS 7.7
- crowi 1.7.9
- JDK8
- ElasticSearch 6.8.3 (yumで入れただけ)
- ElasticSearchのプラグインkuromojiは入れた

#### 設定内容はこんな感じ
```
$ cat /etc/sysconfig/crowi
PORT=3000
NODE_ENV=production
MONGO_URI="mongodb://crowi:(あなたのパスワード)/crowi"
REDIS_URL="redis://localhost:6379"
ELASTICSEARCH_URI="http://localhost:9200"
PASSWORD_SEED="あなたのパスワードシード"
FILE_UPLOAD=local
```
結論からいうと設定は上記で間違ってなかったです。

### 症状
- crowiの検索以外の機能は正常に動作している。
- crowiの検索バーはページトップに表示されていて検索はできる。
- 検索するとすぐにもどってきて「No page found with (検索キーワード)」みたいに表示される。検索結果が一つもヒットしない。
- crowiの管理画面から「管理＞検索管理＞BUILD INDEX」は実行したが症状は変わらない。


### 原因を調べてみる

crowiはnodejsで動いているのでデーモンとしてではなくコマンドシェルから起動してみればstderrにログが表示される。そこでsshでサーバにログインしてcrowiをrootで起動してみる。

```
$ sudo su
# systemctl stop crowi   (デーモン起動しているcrowiをいったん止める)
# PORT=3000 NODE_ENV=production \
  MONGO_URI="mongodb://crowi:(あなたのパスワード)/crowi" \
  REDIS_URL="redis://localhost:6379" \
  ELASTICSEARCH_URI="http://localhost:9200" \
  PASSWORD_SEED="(あなたのパスワードシード)" \
  FILE_UPLOAD=local \
  /usr/local/bin/node app.js
```
上記を実行して、

    Listening port 3000...

と出てくればcrowiは起動している。

この状態で少し待ってみると、ElasticSearchまわりのエラーで、

    Error: index crowi-current already exists

みたいな感じのエラーが出ました。

crowiはcrowi-currentという検索インデックスを作るようですが、過去にcrowiを強制終了したりして既にこのインデックスが存在するとこのエラーが出るようです。
しかしcrowiのブラウザ画面上には何にもエラーが表示されないのでこのエラーでElasticSearchと接続できていないことがブラウザ画面で見ている限りユーザーにはわかりません。（ここで素人はお手上げにゃん😸）

### 解決方法

上記の通りElasticSearchのインデックスが競合していることが原因なので、インデックスを消してしまえ。

以下のコマンドを実行

    $ curl -XDELETE http://localhost:9200/crowi-current?pretty=true

更にcrowiをデーモンで再起動

    # sudo systemctl start crowi

crowiの管理画面にログインして再度、検索設定のBUILD INDEXを押す。

これで検索が正常に動作するようになりましたにゃん😸。

めでたしめでたしにゃん😸。

---
ps. crowiを公開して下さっているCrocosさんありがとうありがとう。使わせていただいてます。
paranoiaで論理削除済みのリレーションも取得したい 

# やりたいこと
論理削除されたリレーションのカラムも使いたい。

gemのparanoia使って論理削除したレコードは↓みたいにすれば取れるらしいけど、
子レコードから親のカラムの値を取りたいけと親レコードが論理削除されている時って、どうすればいいんだ

```ruby
Account.with_deleted
```

↓こうなってしまうんだ。

```
# 削除済みのアカウントのログを取る
irb(main):001:0> log = Logs.where(account_id: params[:account_id]).first
```

```
# ログは取れるけど、アカウントは削除されているので取れない
irb(main):002:0> log.account.name
  Account Load (0.9ms)  SELECT  "accounts".* FROM "accounts" WHERE "accounts"."deleted_at" IS NULL AND "accounts"."deleted_at" IS NULL
 AND "accounts"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
Traceback (most recent call last):
        1: from (irb):2
NoMethodError (undefined method `name' for nil:NilClass)
```

# バージョン
* Ruby

```
$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
```
* Rails

```
$ rails -v
Rails 5.2.3
```
* paranoia

```Gemfile.lock
paranoia (2.4.2)
```


# Relation

Accountがあって、Accountが何か操作をするたびにLogを保存している。

```ruby
class Account < ApplicationRecord
    has_many :logs

    acts_as_paranoid
end
```

```ruby
class Log < ApplicationRecord
    belongs_to :account
end
```

# よく見たら本家に書いてあったわ
GitHub
https://github.com/rubysherpas/paranoia



# 結論
こんな感じにすれば取れるようになった。

```ruby
class Log < ApplicationRecord
    belongs_to :account, -> { with_deleted }
end
```

```
irb(main):001:0> log = Logs.where(account_id: params[:account_id]).first
irb(main):002:0> log.account.name
  Account Load (0.6ms)  SELECT  "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
=> "管理者ユーザ"
```

Logクラス側で、親のaccountは削除したものも取ってきてねって設定すれば良かったのね。
通信プログラム②

```Java:client.pde
import processing.net.*;

Client c;

void setup() {
  size(800,800);
  c = new Client(this, "localhost", 8888);
}

void draw() {
}

void mouseMoved() {
    c.write(mouseX + "," + mouseY + "," + color(255,255,0) + '\n');
}

void clientEvent(Client c) {
}
```

```Java:server.pde
import processing.net.*;

Server s;

void setup() {
  size(800,800);
  noStroke();
  s = new Server(this, 8888);
  println("server ip:" + s.ip());
}

void draw() {
  
  Client c = s.available();
  if (c != null) {
    String str = trim(c.readStringUntil('\n'));
    String[] data = str.split(",");
    int x = parseInt(data[0]);
    int y = parseInt(data[1]);
    int col = parseInt(data[2]);
    fill(col);
    rect(x,y,5,5);
  }
}

//  frameRate(120);
```
正規表現って一体何なのか？ ハッキリさせる

前振りはなしです。
正規表現なんて言葉はそもそも聞いたことがないという人は、まだ読まなくても構いません。

## 正規表現ってなに？
一言で言えば、様々な文字列から**「共通するパターン」**を識別し、表現する方法です。

例えば以下のようなデータから「郵便番号として有効な部分だけ」抜き出すことができます。


郵便番号の要件として

- 3桁の整数値で始まる
- ハイフンで区切る
- 4桁の整数値で終わる

こととしましょう。

```:郵便番号が混じっている文字列
529-0439
2519-3613
848-013
028-0061
198-01764
4627084
```

```javascript:サンプルコード

const pattern = /^\d{3}-?\d{4}$/;
const result1 = "529-0439".match(pattern);
console.log(result1); //["529-0439", index: 0, input: "529-0439", groups: undefined]
const result2 = "2519-3613".match(pattern);
console.log(result2) //null
...
```

- 正規表現パターンは`/表現/`と定義します。
- **\dは「数値」**を表します。\d一つで一文字です。
- {3}は直前の表現の3回の繰り返しという意味です。\d{3}で**「数値のちょうど3回の繰り返し」**という意味になります。
- ^と\$はそれぞれ**「^の直後の表現で始まる」****「$の直前の表現で終わる」**ことを意味します。
- これにより余分に長い数字列の途中で偶然このパターンにマッチングする(“198-01764”のうち“198-0176″ の部分が偶然マッチしてしまった)場合を除外することができます。
- `文字列.match(パターン)`により、文字列がパターンにマッチしていたら結果が代入され、マッチしていないならnullになります。

これによりマッチしている番号候補とそうでないものを分けて処理を行うことができますね。

正規表現は非常に汎用性が高く、これを習得することで実現できることが飛躍的に増加します。
<br>

## 参考
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
MySQL8.0でMySQL5.7のデータベース構造を比較する

# コマンド

## テーブル構造をダンプする

mysqldumpコマンドを使ってダンプします。

```
mysqldump -d -uroot -h127.0.0.1 -P3306  -p DB_NAME  --skip-create-options  --skip-column-statistics > dump_a.sql
```

### MacのMySQLWorkbench8を使ったやり方
```
/Applications/MySQLWorkbench.app/Contents/MacOS/mysqldump -d -uroot -h127.0.0.1 -P3306  -p DB_NAME  --skip-create-options --skip-column-statistics > dump_a.sql
```


| 項目  | 説明 | 
| :--: |:--: | :--: |
| -d | テーブル構造だけダンプするオプション |
| -u | ユーザ名 |
| -h | DBホスト名|
| -P  | DBポート番号 | 
| -p  | DBパスワード | 
| DB_NAME | ここにデータベース名(スキーマ名)を入れる |
| --skip-create-options | AUTO INCREMENTの値などのテーブルのオプションのを出力しない ※１ |
| --skip-column-statistics | MySQL8 から過去のバージョンのDumpを行うときに必要これがないとエラーになる※2 |     
| dump_a.sql | ダンプ先ファイル名 お好みで変えてください | 


## テーブル構造を比較する

普通にdiffコマンドでいけます。

```
diff dump-a.sql dump-b.sql
```


# バージョン情報

| software  | version | 
| :--: |:--: | :--: |
| mysql server | 5.7 |  |
| mysqldump(MySQL Workbench for Mac) | mysqldump  Ver 8.0.16 for macos10.14 on x86_64 (MySQL Community Server - GPL) |  | 

今回は、macにインストールしたMySQLWorkBenchに付属しているmysqldumpを利用していますが、
mysql clientが入っているマシンであれば、mysqldumpも入っているので、それを利用してもいいです。

# 参考

https://hacknote.jp/archives/4278/

# 補足

#### ※1 `--skip-create-options`をつけないときとつけた時の差分

```diff
> ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
1861c1861
< ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

#### ※2 `--skip-column-statistics`をつけないときに発生するエラー

```
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
```
通信プログラム①

#通信プログラム①
```Java:client.pde
import processing.net.*;

Client c;

void setup() {
  c = new Client(this, "localhost", 8888);
}

void draw(){
}

void mouseClicked() {
  c.write("abcあ");
}

```


```Java:server.pde
import processing.net.*;

Server s;

void setup() {
  size(800,800);
  s = new Server(this, 8888);
  println("server ip:" + s.ip());
}

void draw() {
  Client c = s.available();
  if (c != null) {
    String str = c.readString();
    fill(random(255),random(255),random(255));
    text(str,random(width),random(height));
  }
}

```
[Rails][PostgreSQL] A-1, B-2 のように文字列と整数を結合した文字列で ORDER BY したい

# バージョン情報

```
$ psql --version                                                                                                                                                                                                                             
psql (PostgreSQL) 11.3

$ bin/rails -v
Rails 6.0.0
```

# やりたいこと

```rb
Item.pluck(:code)
#=> ["A-1", "B-10", "B-1", "A-10", "A-2", "B-2"]
```

これを ORDER BY 句を使って

```rb
["A-1", "A-2", "A-10", "B-1", "B-2", "B-10"]
```

の順番に並べたい。

ただ `order(:code)` を呼ぶだけだと

```rb
["A-1", "A-10", "A-2", "B-1", "B-10", "B-2"]
```

となってしまう :sob:

# 方法

split_part 関数を使う。

> split_part(string text, delimiter text, field int)
> string を delimiter で分割し、その結果から （1 から始まるように数える） 指定したフィールドを返します。 

また、整数の部分は `::` を使って string から integer にキャストする。

```rb
Item.order(Arel.sql("split_part(code, '-', 1), split_part(code, '-', 2)::integer")).pluck(:code)
#=> ["A-1", "A-2", "A-10", "B-1", "B-2", "B-10"]
```

もっと効率のよい方法がありそうな予感。他にいい方法があれば教えてください :bow:

# 参考

* [PostgreSQL 11.5文書 » 第9章 関数と演算子 » 9.4. 文字列関数と演算子](https://www.postgresql.jp/document/11/html/functions-string.html)
React-Reduxを使って簡単なTodoアプリを作成

###目標
React-Reduxを全く使ったことない状態から、半日かけて簡単なTodoアプリを作成すること。今回は限られた時間の中でアプリを形にしてみることに集中しました。

###参考になったサイト
React.jsで開発を始めるための環境構築のやり方がわかりやすくまとめられています。
https://note.mu/natsukingdom/n/n2dd88d531f22

React+Reduxを使ったTodoアプリの作成手順が解説されています。
https://webbibouroku.com/Blog/Article/react-redux-todo


###つまずいたところ
- Reactに関する用語の理解が作成する中で追いつかなかったこと。reducerとかstoreとかstateとか全然理解してない状態で作業進めてました。
- 半日でやることに執着しすぎて、ほとんど参考サイトのコードをコピペするばかりになってしまったこと。
- エラーを解決する際に、単にエラーメッセージをググるだけでなく、知らない用語であればそれが何なのか分解して調べてみること。

###今後の目標
- Reactに関する用語や仕組みの理解をすること。
- Todoに削除機能を付けること。
色々備忘録

# Web フロント系
## stylesheet
### 縦位置中央表示に困ったら
* http://unitopi.com/css-centering-2/

### 画像（要素）を三角形（多角形）に切り抜きたい
* clip-pathを使用すれば色々な形に切り抜ける
* 参考サイト：[画像をCSSで好きな形に切り抜けるclip-pathプロパティって知っていますか？ SVGのパスで自由にクリッピングできちゃうので、おしゃれサイトの演出などにとても重宝しそうです。](https://www.webprofessional.jp/introducing-css-clip-path-property/)

### VScode+saas "@import"を記述すると、拡張機能が終了する
* 「拡張機能のホストが予期せずに終了しました。」と表示され、  
拡張機能が機能しなくなる。
* 「Color Highlight」という拡張機能との相性が悪いらしく、  
Color Highlightを無効、またはアンインストールすると解消できる。
* [参考サイト](https://ja.stackoverflow.com/questions/55159/vscode%E3%81%A7scss%E3%81%ABimport%E3%81%AE%E8%A8%98%E8%BF%B0%E3%82%92%E3%81%99%E3%82%8B%E3%81%A8%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%81%8C%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B)
EmbulkのプラグインをRubyでつくる。2019-10-17

# 概要
EmbulkのプラグインをRubyでつくる、ときに知っておいた方がよさそうなことについて書きます。
「EmbulkのプラグインをRubyでつくる入門」的な内容は他にもたくさんあるので割愛します。
やってみて自分がつまづいたところを書きます。

# `embulk bundle install`

依存するgemがある場合は `bundle install` ではなく **`embulk bundle install`** を使う

# `embulk run -I lib config.yml`

開発中のプラグインの場所を `-I` オプションで指定することで読み込んで `run` や `preview` が行えます。
ただし、 `embulk bundle install` で依存するgemをインストールした場合は、`Gemfile` が置いてあるディレクトリにて `run` や `preview` をしないとgemがnot foundになります。

**と、いう状況でしたが環境が悪かっただけでした。コメント欄を参照してください**

# `(LoadError) no such file to load -- bundler/dep_proxy`

```
(LoadError) no such file to load -- bundler/dep_proxy
```

上記のエラーが出た場合は以下のコマンドで `embulk` の持っている `bundler` をアップグレードすれば解決しました。

```
% embulk gem install bundler
```

# まとめ

EmbulkのプラグインをRubyでつくる、ときに「いくつかつまづいたところ」と「どのような対応をおこなかったのか」を書きました。
RubyでOpenCVする新しい方法 Red OpenCV をつかってみた

# はじめに

RubyのOpenCVバインディングはruby-opencvが有名です。ruby-opencvは完成度が高く多くの人が使用していました。

* [ruby-opencv](https://github.com/ruby-opencv/ruby-opencv)

しかしここ数年の更新がやや滞りがちなのは否めません。
ここでは第３[^1]のバインディングであるRed OpenCVを使ってみます。

* [Red OpenCV](https://github.com/red-data-tools/red-opencv)

# インストール

下記のサイトに従ってインストールします。

* https://github.com/red-data-tools/packages.red-data-tools.org

Ubuntuの場合だと下記のような感じです

```sh
sudo apt install -y -V apt-transport-https

sudo apt install -y -V lsb-release
sudo wget -O /usr/share/keyrings/red-data-tools-keyring.gpg https://packages.red-data-tools.org/$(lsb_release --id --short | tr 'A-Z' 'a-z')/red-data-tools-keyring.gpg
sudo tee /etc/apt/sources.list.d/red-data-tools.list <<APT_LINE
deb [signed-by=/usr/share/keyrings/red-data-tools-keyring.gpg] https://packages.red-data-tools.org/$(lsb_release --id --short | tr 'A-Z' 'a-z')/ $(lsb_release --codename --short) universe
deb-src [signed-by=/usr/share/keyrings/red-data-tools-keyring.gpg] https://packages.red-data-tools.org/$(lsb_release --id --short | tr 'A-Z' 'a-z')/ $(lsb_release --codename --short) universe
APT_LINE
sudo apt update
```

しかし、https://packages.red-data-tools.org/ubuntu/dists/ を見ると2019年10月17日時点で、19.04 disco 用のファイルはないようです。そこで下記のようにbionicに変更してみました。

/etc/apt/sources.list.d/red-data-tools.list

```
deb [signed-by=/usr/share/keyrings/red-data-tools-keyring.gpg] https://packages.red-data-tools.org/ubuntu/ bionic universe
deb-src [signed-by=/usr/share/keyrings/red-data-tools-keyring.gpg] https://packages.red-data-tools.org/ubuntu/ bionic universe
```

OpenCV GLib をインストールします。

```sh
sudo apt install -y -V libopencv-glib-dev
```

Red OpenCVをインストールします。せっかくなので、リポジトリから最新版をインストールします。

```
# gem install specific_install 
gem specific_install https://github.com/red-data-tools/red-opencv
```

## 使ってみる

Exampleを実行してみます。まずはGTKのサンプルです。

```sh
ruby ruby sample/gtk-integration.rb 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/1158e487-d686-21b9-8e8a-b50b5c8ca33b.png)

Webカメラで、自分自身のウィンドウを撮影すると、合わせ鏡のような画像が得られて大変おもしろいですね。

話は変わりますが、人は鏡を見た時に、自分のことを自分であると認識することができます。頭の中で「自分はいま〜と考えているな」と考えることもできます。そんな風に、

```
{
 {
  {
   {
    {自分}
   のことを考える自分}
  のことを考える自分}
 のことを考える自分}
のことを考える自分}
```

とやっていくと、頭のよい人はmaxで5人ぐらいまで認識できると言われています。その状態の人の頭の中身が、だいたい上図のような感じになっていると思われます。ちなみ私は3人で限界です。

顔認識のサンプルも実行してみます。

```sh
ruby sample/face-detect.rb 
```

うまく動いているようです。下記はGoogle画像検索で face dataset で検索したディスプレイをWeb Cameraで撮影したものですが、解像度の低い画像にもかかわらず、よく認識されていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/57ccd669-df1d-c64e-393f-943eaab97f01.png)

駆け足でしたが、この記事は以上です。

[^1]: OpenCVのバインディングには他にもあって、[ropencv](https://github.com/D-Alex/ropencv) はffiを使用しているのが特徴です。
IoT @ Loft #4 IoTのプロダクト開発 （セキュリティ、デバイス管理、量産化…】を受講したよ!（2019年10月16日実施）

IoT @ Loft #4 IoTのプロダクト開発 （セキュリティ、デバイス管理、量産化…】を受講したよ
ちなみに、私にとっては、この会は、ここ数年のセミナーで１，２を争うほど価値のあるものでした。

##量産フェーズを見据えたセキュリティ設計と開発コスト(仮)
竹内 創太朗 氏
モバイルアプリ/FWエンジニア
Qrio株式会社

![IMG_0644.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7d08bbb7-2356-645a-0e37-62be8ed8ee33.jpeg)
![IMG_0643.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/311e64ed-0177-6fd1-e7f2-fcca40652fe3.jpeg)
###暗号鍵問題
生データを渡すわけにいかない
 
- 書き込みPCの準備

###モジュール選定
- ワンタイムフラッシュ?
- 書き換え可能??
 ワンタイムだとストレスフルである

コミュニケーションのとりやすさ?

##ソフト屋とハード屋は異業種で文化も考え方も違う
###ひとつずつ丁寧なコミュニケーションを!

###<font color="Red">重要です</font>

![IMG_0647.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c173683-d824-42d5-ff7f-7f9766d473f6.jpeg)

##クラウドやってる人に知ってほしいハードウェアのあれこれ
日野 圭 氏
DMM.make AKIBA テックスタッフ
合同会社DMM.com

- 量産するための事業の設計が必要
- そのプロダクトで一番大事なものがぶれてはいけない
- クラウドファンディングはコンテキストが大事

####<font color="Red">広報重要</font>

![IMG_0649.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3708f579-0d72-8daf-3518-577bda93d351.jpeg)

###OTAで修正前提でも修正できない
###ex)うんこボタン

###セキュリティ

- リバースエンジニアリングされる前提で考慮する

##めざせプロダクションレディなIoT！ ＠スマートエクステリアの場合
佐々木 義 氏
主査 IoTクラウド専任
株式会社LIXIL Housing Technology エクステリア事業部 エクステリア商品開発部 第三商品開発室 開発3G

###でもやめません

##IoT製品の量産化および運用を効率化させるためのAWS サービスの使い方
飯田 起弘
###「PoC完了で「できた！」と思ってしまう」問題

![IMG_0651.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c09bdbe2-e38a-f5d2-1cb5-55053eb6d3cb.jpeg)
![IMG_0652.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/16189d1e-7c4f-2bcd-36d0-5b228a4da7f9.jpeg)
![IMG_0653.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bd4a2780-53fa-ffe7-8689-b2608b5fc684.jpeg)
![IMG_0654.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fc0cd66a-5723-ab12-05c6-c01a84390f71.jpeg)
![IMG_0655.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8e1cb7cc-45ee-355a-4104-1efbbd806b44.jpeg)
初めてのSlack ワークフロービルダー

#Slackが新しくリリースしたワークフロービルダーをさっそく使ってみた

##ワークフロービルダーとは

2019年10月15日にSlackが新しく発表したサービス。
ノンプログラマーでも簡単に作れ、業務効率化を図れるサービスです。

**使ってみた感想としては、非常に直感的に操作でき、サクサク作れました！**

##作ったもの
人事に問い合わせするための人事ヘルパー

今まで人事ヘルパーという、人事に相談する機能がポータル上にあったのですが、いちいちポータルに移動するのが面倒ということでSlack版で作れないかという依頼が来ていました。
そこで、タイミングよくリリースとなったこの機能を使い作ってみました。


##作り方
まず、ワークフローからアクションを選択します。
![スクリーンショット 2019-10-17 11.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/0ff60a1a-dee2-d9ba-ff6a-e13e73f04786.png)

絵文字をトリガーにすることもできるのですが、今回はよりわかりやすいだろうアクションメニューを選択。

![スクリーンショット 2019-10-17 11.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/8508851a-eddd-8a00-4ec7-fd1b254dd455.png)

ワークフローを作りたいチャンネルの選択と、名前を決定！
![スクリーンショット 2019-10-17 11.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/b0eced26-f355-f17d-b23f-0eecf36d89e2.png)

メッセージ送信なのか、フォームを作成するのかを選択。
今回はフォームを選択します。

![スクリーンショット 2019-10-17 11.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/54614d07-3bac-b96b-20d2-27a82d0918c9.png)

ここに項目を追加していきます。
今回は問い合わせ機能を作成したので、名前や相談内容などの項目を作成しました。

![スクリーンショット 2019-10-17 11.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/32a76a06-2de5-bfb6-d15c-ca0100e4b133.png)

ちなみに、名前は自分でタイプするのではなく選択式でできないの？というFBをもらってから見返して気づいたのですが、ここでメンバーを選択するというオプションもありました。
簡単すぎて見落とすというあるあるですね！笑

今回は、このフォームの後にもう一つ、誰が問い合わせ対応するのかというフォームを追加しました。

そして、その後に問い合わせ担当者の名前をお知らせするメッセージを追加し、アクションから含めると４段階のフローを作成しました。

ちなみにメッセージを送る先は変数で「フォームを提出したメンバー」というのが選択でき、選択されたメンバーに直接Slackbotを通してメッセージを送ることができます。

![スクリーンショット 2019-10-17 12.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/9d3fe83c-b1e6-c2e0-9440-05312c513de2.png)



そして、最後に右上の「公開する」ボタンを押せば完成です！

![スクリーンショット 2019-10-17 12.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467139/56ec4eb7-4018-a9c2-c42e-4db34c989194.png)



めっちゃくちゃ簡単でしたね！

エンジニアでなくても誰でも作れますし、いろいろ応用もききそうです！

まだリリースされたばかりですので、今後またアップデートされていくのも楽しみです。
React ビギナーズガイド時点からReact v16 までの差分

[React ビギナーズガイド](https://www.oreilly.co.jp/books/9784873117881/)を読んでいるのだけれど、Reactのバージョンが古いせいでよくわからんので、違いをまとめることにした。

# React ビギナーズガイド時点からDeprecationになった機能や差分
 - `React.PropTypes` ~15.5.0 Deprecated  16.0.0 Removed
 - `React.createClass` ~15.6.0 Deprecated 16.0.0 Removed
 - `React.DOM` ~15.6.0 Deprecated 16.0.0 Removed
 - `React.createMixin` ~15.6.0 Deprecated
 - `react-with-addons.js`  16.0.0 Removed -> you can install browser version via npm
 - `componentDidReceiveProps`  16.1.0~ non-existent. occur warning.
 
> If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate()
from [link](https://github.com/facebook/react/pull/11479)


# React ビギナーズガイド時点から追加された機能
 - `getDerivedStateFromProps()` 16.3.0~
 - `getSnapshotBeforeUpdate` lifecycle 16.3.0~
 - `Hooks` 16.8.0~

最終更新：2019/10/17
DockerでNuxt開発環境を構築してfirebase loginできるようにしてみる

DockerでNuxt開発環境を構築して、Firebaseへデプロイするために`firebase login`を実行したところコマンドが認識されなかったり、ログインできなかったりしたので解決するまでの流れです。

【関連記事】
[DockerでNuxt開発環境を構築してホストのブラウザから接続する](https://qiita.com/mikansei-lab/items/f711db7ae13199d549ea)


# 環境など

Windows 7 に VirtualBox を入れて、そこでUbuntuの仮想マシンを動かしています。
ubuntu内にdockerでnuxt開発環境を構築して、docker環境から`firebase login`を実行します。

# 手順

ここからの作業はUbuntuでおこないます。
今回は以下の流れでNuxt開発用のDockerコンテナを起動しています。
ポイントとしては以下の2点です。

 - `firebase`コマンドを使えるようにするため、`yarn global add firebase-tools`を追加。
 - `firebase login`の結果を受け取れるようにするため、docker起動時に`-p 9005:9005`を追加。

```
$ vim Dockerfile
FROM node:lts

RUN apt-get update && \
    apt-get upgrade -y && \
    yarn global add @vue/cli && \
    yarn global add @vue/cli-init && \
    yarn global add firebase-tools

EXPOSE 3000

$ docker build -t [image_name] .
$ docker run -d -it -p 3000:3000 -p 9005:9005 -v $(pwd):/work [image_name]
$ docker exec -it [container_name] bash
```

ここからの作業はDocker環境とUbuntuを併用しておこないます。

Dockerに接続したターミナルで以下のコマンドを実行して問いかけに対して"Y"と入力すると、URLが表示されて認証待ちとなります。

```
$ firebase login
```

UbuntuのブラウザでそのURLへアクセスするとGoogleへのログインを求められるので、firebaseに登録したアカウントでログインします。

ログインに成功するとメッセージが表示され、ターミナルへ処理が戻ります。docker起動時に9005ポートを指定していないとGoogleのログイン後に処理が戻らずブラウザ上にエラーが表示されます。

ログアウトしたい場合は、ターミナルで次のコマンドを実行してください。

```
$ firebase login
```

以上です。
【メモ】Power BI (Analysis Services DAX)における通貨換算方式の整理


# Azure 多通貨展開に向けて

## 本記事について
　現在、関連メンバーで議論をしながら、本記事を整理しているため、本記事の更新を定期的に行います

## 概要
　通貨換算の方式を整理

## データの保持方針
#### 1.通貨別のレコードの挿入により対応する方針（別テーブルで保持も含む）

- メリット
  - 集計を簡単に行える
- デメリット
  - レコード数が肥大化する可能性がある
  - 通貨のフィルターが常に必要となる


#### 2.列の追加により対応する方針（通貨マスタとの結合による集計も含む）

- メリット
  - 集計を簡単に行える
- デメリット
  - レコード数が肥大化する可能性がある

## 集計タイミング
- キューブ（PowerBi）より前で、処理
- キューブ（PowerBi）移行で、処理

### 通貨換算方法
- 1つの通貨換算値で集計
- 2つの通貨換算値（複数の条件に基づく場合）で集計
  - 日付と通貨で集計
 
###パターン
  - 最新
  - 期首
  - 期末
  - 始まり値
  - 終わり値
  - ・・・

## 集計方法
### 1.レコードの追加により対応する方針（別テーブルで保持も含む）
　該当列の集計のみでよい。
### 2.列の追加により対応する方針

#### 1. １つのメジャーに、複数の通貨を含ませる
  - メリット
    - 通貨の切り替えを、ディメンションによって実施できる
  - デメリット
    - 表示形式（￥000、$000.00等）を適切に実施できない 
    - 多通貨のメジャー


#### 2. 通貨別のメジャーを作成する
  - メリット
    - 表示形式（￥000、$000.00等）を適切に実施できる
  - デメリット
    - 表示形式（￥000、$000.00等）を適切に実施できない



##参考リンク
[Currency conversion in DAX for Power BI and SSAS](https://www.kasperonbi.com/currency-conversion-in-dax-for-power-bi-and-ssas/)
[How to create a highly performant multi-currency solution in SSAS](https://medium.com/@roudgenoeg/how-to-create-a-highly-performant-multi-currency-solution-in-ssas-69e6c6cb81c0)
ruby2.2.7が急に動かなくなった

再インストールすると、こんなエラーがでた。

```
ruby-build: using openssl from homebrew
Downloading ruby-2.2.7.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.bz2
Installing ruby-2.2.7...

WARNING: ruby-2.2.7 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.


ruby-build: using readline from homebrew

BUILD FAILED (OS X 10.14.5 using ruby-build 20191004)

Inspect or clean up the working tree at /var/folders/q0/0nfw3bls4z1fs4xd3sb7pkqw0000gn/T/ruby-build.20191017114431.855
Results logged to /var/folders/q0/0nfw3bls4z1fs4xd3sb7pkqw0000gn/T/ruby-build.20191017114431.855.log

Last 10 log lines:
installing capi-docs:         /Users/user_name/.rbenv/versions/2.2.7/share/doc/ruby
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Configure options used:
  --prefix=/Users/username/.rbenv/versions/2.2.7
  --with-openssl-dir=/usr/local/opt/openssl@1.1
  --with-readline-dir=/usr/local/opt/readline
  CC=clang
  LDFLAGS=-L/Users/user_name/.rbenv/versions/2.2.7/lib -L/usr/local/opt/openssl/lib
  CPPFLAGS=-I/Users/user_name/.rbenv/versions/2.2.7/include -I/usr/local/opt/openssl/include
```
エラーをもとに、下のコマンドを試したところインストールできた。

```
RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.2.7
```
Railsで今日から2ヶ月前までのレコードを取得する方法

Railsで日付の範囲検索をした際に、「今日〜2ヶ月前まで」みたいな記述を探したが、見つからなかったので自分用のメモとして残します。



## 実現したいこと
今日から2ヶ月前までに作成されたレコードを取得したい

例) 
今日：2019/10/10
2ヶ月前：2019/08/01

上記の例だと、作成日が 2019/08/01 から 2019/10/10 までのレコードを取得したい。

## 結論

日付の設定

```ruby
start_month = 2.months.ago.all_month.first
end_month = Time.current
```

ActiveRecordのwhere

```ruby
where(created_at: start_month..end_month)
```


### 以下は、自分のまとめです。

#### プログラム

2ヶ月前の日付(Range)を取得(上記の例だと、2019/08/01~2019/08/31)

```ruby
2.months.ago.all_month
```

今月の日付を取得(上記の例だと、2019/10/10)

```ruby
Time.current
```

#### つまづいた所
いざ、上の記載(プログラムの段落)でプログラムを組んでも、`bad value for range`エラーが出るばかりでうまくいかず、帰宅途中に、`2.months.ago.all_month` はその月の初日と末日を含んでいるため、rangeの書き方がおかしいことに気付く。

そして、結論の記載に至る
結局まだまだPython3.6が具合良さそうなお話。

# Python 3.8を入れてみたは良いものの...

動かないライブラリ多数。具体的には`OpenCV`周り。なので画像分類とかは動きません。というのも`cv2`はPython3.6までしか対応していないようだ。

致し方なくPython3.8系はアンインストールする羽目に。皆様もくれぐれもご注意ください。

# すでに入れてしまったPythonのダウングレード

```
$ brew unlink python
$ brew install --ignore-dependencies https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb
$ brew switch python 3.6.5_1
```

一行目が`Homebrew`でインストールしてしまったPython3.7系との関連を切るためのコマンド、2行目がPython3.6.5をインストールするコマンド、3行目がPython3.6.5をデフォルトで利用するためのスイッチコマンド。
PromiseLike<T>型からT型を取り出すUtilityTypeを書いてみた

# TL;DR;
* 色々試したものの、コメントでよりスマートな方法を教えていただいたのでそちらを参照された方がよいかと思います。

# 元
async Functionに対してReturnType的なことをやろうとしたものの、
PromiseLike<T>型からT型を取り出すいい感じの方法が見つからなかったので、
勉強も兼ねて[公式のUtilityTypeの実装](https://github.com/microsoft/TypeScript/blob/v3.6.3/lib/lib.es5.d.ts)を参考にしつつ書いてみた。


# 成果物
``` typescript
type Promised<T extends { then: (...args: any) => any }> = Parameters<Exclude<(T extends { then: (onfulfilled: infer P, ...args: any) => any } ? P : never), null | undefined>>[0];

//使用例
type t = Promised<Promise<string>>;
//t は string型
```

# 作る上でのメモ

## genericsでPromiseLikeを受けられるようにする
PromiseLikeの定義は以下の通り。

``` typescript
interface PromiseLike<T> {
    /**
     * Attaches callbacks for the resolution and/or rejection of the Promise.
     * @param onfulfilled The callback to execute when the Promise is resolved.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of which ever callback is executed.
     */
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;
}

```
要するにthenというpropertyに何らかの関数があれば(``T extends { then: (...args: any) => any }``)OK。
正確にはもっときちんと定義をしっかり付けるべきなのだろうけれども、実用上大きな問題ではないのでこの程度で妥協。

この定義からTを引っこ抜くためには、thenの第一引数(``onfulfilled?``)が存在する時の引数が一番早そうなので、その作戦で取りに行くことにする。

## PromiseLike.thenから第一引数のonfulfilledの型を取ってくる
``` typescript
T extends { then: (onfulfilled: infer P, ...args: any) => any } ? P : never
```
ParametersやConstructorParametersを参考に書いた部分。
いわゆる[ConditionalType](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html)を使う。
infer P でonfulfilledについて型推論した結果をPに入れることが出来る。
(よって``P=(value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null``)

never部分は到達しないけれども書き方的に仕方ないので。

## PからTを取り出す。
PからTを取り出すのは既存のUtilityTypeの組み合わせで十分

### Excludeでundefinedとnullを抜く
``` typescript
Exclude<(T extends { then: (onfulfilled: infer P, ...args: any) => any } ? P : never), null | undefined>
```

Pは　``(value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null``
要するに ``{欲しい関数} | undefined | null``なので、Union型からundefinedとnullを抜いてやればいい。
Union型から特定の要素を抜くのはExcludeで可能。

### 関数から引数の型を取得する
これで、 `` (value: T) => TResult1 | PromiseLike<TResult1>)``が型として取れたので、
後は引数の型を取得すればOK。
Parametersを利用すれば関数の引数の型を配列で取得できる。(``[T]``が返る)
第一引数が欲しいので添え字``[0]``でアクセスすれば目的のTが取得可能。
Ruby 継承とは

# 目的

- 継承について概要を知る。

# そもそも継承とは？

- クラスを新規作成するときにすでに存在している親クラスをもとに子クラスすること。
- 新しくクラスを一から作成することは面倒なので、その時に楽をするためのものである。
- 継承されるものは「インスタンス変数」と「インスタンスメソッド」の二つである。

# 書き方の例

- 親クラスを継承して子クラスを定義する方法を記載する。

```ruby
class 子クラス < 親クラス

end
```
Rails6 のちょい足しな新機能を試す97（truncate編）

# はじめに

Rails 6 に追加された新機能を試す第97段。 今回は、 `truncate` 編です。
Rails 6 では、 `truncate` は、常に freeze されていない文字列を返すようになりました。

Ruby 2.6.5, Rails 6.0.0 で確認しました。

```shell
$ rails --version
Rails 6.0.0
```

今回は、スクリプトを書いて確認します。

# Rails プロジェクトを作る

```
$ rails new rails_sandbox
cd rails_sandbox
```

# 簡単なスクリプトを書く

freeze した文字列に対して、 truncate メソッドを呼び出すスクリプトを書いて試してみます。

```scripts/truncate.rb
str = -'truncate test'
s1 = str.truncate(str.length)
s2 = str.truncate(str.length - 1)
p s1.frozen?
p s2.frozen?
```

# 動作確認する

実行してみます

```shell
$ bin/rails runner scripts/truncate.rb
false
false
```

Rails 6 では、どちらの場合も false になります。


# Rails 5 では

Rails 5 では、以下のようになります。

```shell
$ bin/rails runner scripts/truncate.rb
false
true
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try097_truncate

# 参考情報

* [Frozen truncate](https://github.com/rails/rails/pull/36109)
Linux基礎(文字コードについて)

#文字コード
文字コードとは、コンピュータ上で文字を利用するために各文字に割り当てたバイトコードのこと。

|文字コード|説明|
|---|---|
|ASCII|7ビットで表現される。128種類の英数字、記号、制御コードで構成される。|
|Unicode|32ビットで表現される。1つの文字コード体系で多言語処理を可能にするための文字コード|
|UTF-8|Unicodeを使用した文字コード。1文字を1バイトから6バイトで表示する。|
|EUC-JP|UNIX環境で標準的に使用していた日本語の文字コード|
|Shift-JIS|WindowsやMacOSで使用される日本語の文字コード|
|ISO-2022-JP|電子メールなどでよく使用される日本語の文字コード(JISコード)|
|ISO-8859|ASCIIを拡張した8ビットの文字コードで256種類の文字を表現できる。|

多くのディストリビューションでは、文字コードとしてUTF-8を使用している。日本ではいくつかの文字コードが混在しているのでWindowsで作成したファイルをLinuxで開くと文字化けすることがある。また、ディストリビューションによってはUTF-8以外の文字コードを使用しているものもあり、文字コードを変換させる必要がある。

文字コード変換コマンド
iconv [オプション] [ファイル名]

|オプション|説明|
|---|---|
|-l|変換できる文字コードの一覧を表示|
|-f 入力文字コード|変換元の文字コード。from|
|-t 出力文字コード|変換後の文字コード。to|
|-o ファイル名|文字コードを変換した文字列を出力するファイル名|

```shell
# EUC-JP で作成された「test.txt」を、UTF-8に変換してファイルを「text_v2.txt」として保存
$ iconv -f eucjp -t utf8 test.txt > text_v2.txt
```

#文字コードの詳細の話
ASCIIというコードが、7ビットの1バイト弱で表現されるシンプルな仕様。アメリカで標準化された規格であり、英語に使われる文字しか入っていない。つまり、漢字を使う日本やアルファベットにアクセント記号をつける欧州の言語には適さない。かつ漢字のように何千文字もあるような文字体系は、1バイトのコードではどうしても網羅することが不可能。

漢字に対応するためには、2バイトコードの開発が不可欠だった。1バイトでは256文字しか入らないが、2バイトであれば、65,536文字まで入る。ただ、2バイトコード開発には、プログラムのコンパイラやインタプリタなどは、相変わらずASCIIをベースとして動くわけなので、過去の資産との互換性も求められた。

そこで、1バイトコードと2バイトコードを組み合わせる技法が開発された。よく知られているShift_JISやEUCといったコードはそうしたものの一種。

|文字コード|方式|
|---|---|
|Shift_JIS|「日本の1バイトコードJIS×0201」と「2バイト漢字コードJIS×0208」とを組み合わせて運用する方式|
|EUC|「ASCII」とJIS×0208を組み合わせて運用する方式|

更に、情報通信技術が発達して国際的な活動が増えたことにより、国や地域別に作られていた文字コードをまとめて国際的な統一文字コードを作ろうということになった。
そこで開発された国際文字コードが「ISO/IEC 10646」、一般的には「Unicode」として知られる。Linuxのディストリビューションでもデフォルトの文字コードとして利用されている。

もっと深掘りしていく予定
VSCodeのGitLensのエディタグループツールバーを非表示にする

エディタグループツールバーという言葉にたどり着くのにとても苦労しましたが下記のことです。
![エディタグループツールバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/0d0e1b5a-f0ba-c7f1-f682-fe489fd3aa6c.png)

# 下記の画像の赤丸のところから、コメントを頂いたような設定をすればOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/2760d0dc-012a-908a-b4ef-93ba727b3756.png)

全部隠したいなら↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/7fcd03b5-2067-3d2b-82ad-50b24c84cb4e.png)


# 別のパソコンで久しぶりに設定しようとしたら下記の画面が見当たらない！
設定を無効にするのは、下記のチェックボックスを外します
![git lens setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/585ed59d-638c-7cb3-ac0b-ad0df4a23e0a.png)

設定したら、セーブボタンもないので、そのままにして、vscode自体を再起動したら反映しました。
JUMANとKNPをJavaから利用できるクラスを作ってみた

JavaからJUMANとKNPを使えるようにライブラリを作ってみました。

https://github.com/mychaelstyle/java-juman-knp

共に1クラス、コマンドラインでjuman,knpを実行して結果をパース、JSON(Jackson)のオブジェクトにして出力するだけの簡易クラスです。

下書きから復活。
Juman++のサーバーモードにも対応しているのでそれなりに使えるかと。
【ニコニコ動画】niconicoコンテンツ検索APIで様々なフィルター条件でコンテンツの検索を行う

# はじめに

[niconicoコンテンツ検索API](http://site.nicovideo.jp/search-api-docs/search.html)で様々なフィルター条件を利用してニコニコ動画のコンテンツ検索を行った際のメモ。

# プログラム

## `jsonFilter`を利用した検索（Python）

```nico_jsonFilter.py
import json
import urllib.request

url_format = 'http://api.search.nicovideo.jp/api/v2/%s/contents/search'
url_live = url_format % 'live'
url_video = url_format % 'video'

jsonFilter = """{
  "type": "or",
  "filters": [
    {
      "type": "range",
      "field": "startTime",
      "from": "2017-07-07T00:00:00+09:00",
      "to": "2017-07-08T00:00:00+09:00",
      "include_upper": false
    },
    {
      "type": "range",
      "field": "startTime",
      "from": "2016-07-07T00:00:00+09:00",
      "to": "2016-07-08T00:00:00+09:00",
      "include_upper": false
    }
  ]
}"""

params = {
    'q':'初音ミク',
    'targets':'title,tags',
    'fields':'contentId,title,startTime,channelId',
    '_sort':'startTime',
    '_context':'nico_jsonFilter',
    '_limit':3,
    'jsonFilter':jsonFilter
}

req = urllib.request.Request('{}?{}'.format(url_video, urllib.parse.urlencode(params)))
res = json.loads(urllib.request.urlopen(req).read())['data']

print(json.dumps(res, ensure_ascii=False, indent=4))
```

```sh
$ python nico_jsonFilter.py

[
    {
        "title": "【初音ミク】死に至る病【オリジナル】",
        "contentId": "sm31529802",
        "startTime": "2017-07-07T23:57:42+09:00",
        "channelId": null
    },
    {
        "title": "【初音ミク】CHiCO with HoneyWorks／プライド革命【カバー】",
        "contentId": "sm31529674",
        "startTime": "2017-07-07T23:50:13+09:00",
        "channelId": null
    },
    {
        "title": "右肩の蝶 EXTREME perfect 達成率兼スコアタ 【Project DIVA Arcade】",
        "contentId": "sm31529638",
        "startTime": "2017-07-07T23:27:32+09:00",
        "channelId": null
    }
]
```

## `filters`クエリパラメータのNOT検索

たとえば、channelId が 2525 の動画を除外した結果を得る場合は、下記のように指定を行う。

`filters[-channelId][0]=2525`

channelId が 2525 は「ニコニコニュースチャンネル」である。下記にAPIのリクエスト例を示す。

■ニコニコニュースチャンネルを除外しない検索

http://api.search.nicovideo.jp/api/v2/video/contents/search?fields=contentId,startTime,channelId,title,tags&_sort=startTime&targets=title,tags&_limit=10&q=ニコニコニュース

■ニコニコニュースチャンネルを除外する検索
http://api.search.nicovideo.jp/api/v2/video/contents/search?fields=contentId,startTime,channelId,title,tags&_sort=startTime&targets=title,tags&_limit=10&q=ニコニコニュース&filters[-channelId][0]=2525

jsonFilterで指定する場合は下記のようになる。

http://api.search.nicovideo.jp/api/v2/video/contents/search?fields=contentId,startTime,channelId,title,tags&_sort=startTime&targets=title,tags&_limit=10&q=ニコニコニュース&jsonFilter={"type":"not","filter":{"type":"equal","field":"channelId","value":2525}}

※本「`filters`クエリパラメータのNOT検索」の内容はドワンゴにAPI仕様を問い合わせた際の回答を載せている。公式APIガイドにも同内容を記載もしてもらうように要望したので、そちらに記載された場合はここから消すかも。

以上
SwaggerをDocker-composeで動かすまでをまとめてみた

##はじめに
未来電子テクノロジー(https://www.miraidenshi-tech.jp/intern-content/program/)
でインターンをしているrayaと申します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##今回の内容
Docker-composeを導入したDjangoプロジェクトで、Swaggerを動かすまでをまとめてみました。

##Swaggerとは
Swaggerとは、OpenAPIを使用するためのツール群のことです。
OpenAPIとは、REST APIsを簡単に作成するためのフォーマットのことです。
↓REST APIについてはこの記事が参考になります。
https://qiita.com/masato44gm/items/dffb8281536ad321fb08

Swaggerのツールには大きく以下のものがあります。
これらのツールを用いて、``Swagger Spec``を操作します。
``Swagger Spec``とはJSONかYAML形式で記述されたSwaggerの仕様書を指します。

・Swagger Editor
ブラウザ上で操作できるエディターです。Open APIsの仕様を記述できます。

・Swagger UI
Open APIsの記述（Swagger Specで定められた仕様）をレンダリングします。

・Swagger Codegen
Open APIsの記述からserver stubsやclient librariesを生成します。
server stubsはサーバーがデータを受信した際の挙動をテストするためのものです。
client libraryは、特定の機能を持った一連のコードのことで、開発中のプロジェクトに追加することで機能を追加できます。


##Docker-composeを導入
以下の記事をご覧ください。
[Docker-composeをDjangoにセットアップしてみた](https://qiita.com/breakthrough/items/9929eefd11eefa255530)
開発環境を汚さずに、お手軽にSwaggerを使えるので、Docker環境で行うと良いかもしれません。

##DockerでSwaggerを起動

今回はSwagger UIをDocker環境に取り込んで、起動させます。
https://hub.docker.com/r/swaggerapi/swagger-ui/

まずはSwagger UIを仮想環境に取り込みます。

```
$ docker pull swaggerapi/swagger-ui
```

Docker-composeを起動します。

```
$ docker-compose up　-d
```

Swagger UIを起動します。

```
$ docker run -d -p 80:8080 swaggerapi/swagger-ui
```

##終了する
終了する場合は、Dockerで起動したコンテナを停止させます。
そのために、``docker ps``コマンドで``CONTAINER ID``を表示させます。
今回は適当にaaaaaaaaaaaaとしています。

```
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
aaaaaaaaaaaa   
```
次に、``docker stop``コマンドで先ほどの``CONTAINER ID``を指定します。
これでコンテナが終了します。

```
$ docker stop aaaaaaaaaaaa
aaaaaaaaaaaa
```

##参考
・https://swagger.io/docs/specification/about/
・https://qiita.com/aucfan-engineer/items/5532fcf69b4f4dcd1c41
・https://qiita.com/hiyuzawa/items/81490020568417d85e86
JIRAワークフロー：起票時にサブタスクを自動作成して期限を３日後に設定する

###起票時にサブタスクを自動作成する
トランジションCreateの『事後操作』にて「Create issues and subtasks」を使用する。

注意事項としては、作成するサブタスクで必須項目と定義されているものに対しては、必ず値を入れる必要がある（そうしないとサブタスクが自動作成されない）。親のタスクから必須項目として値を入れるか、後述のSet Fieldsで値をセットする必要がある。

####「Create issues and subtasks」での設定####

・**Issues to be created**で、「Only one」を選択（今回１つだけのサブタスク作成）
・**Issue Type**で「Selectes Issue Type」を選択し、サブタスクを選択（今回既存Issue流用する）
・**Parent Issue**で「Current Issue」を選択（今回起票タスクを親タスクとする）
・**Summary**で「advanced」を選択、下記の記述を行いサブタスクの要約名定義をする
　例：`【事前作業実施】+ %{00000}`
　　　※{00000}は、親タスクの要約名(Summary)のフィールドID
　　　※サブタスクの要約は、『【事前作業実施】親タスクの要約名』という形になる
・**Description**で、サブタスクの説明文を記載する。（今回記載していない）
・**Set Fields**で、親タスクからコピーしたい項目をセットする。
　　Field to be set:にてサブタスクにセットしたい項目を選択、Addボタン押下
　　Value Type：は「Field in current issue」
　　source field in current issue：で元になる項目(親タスク項目等)を選択し、Saveボタン押下
　　　※サブタスクで必須となる項目がある場合、設定が必要です。
　　　　親タスク項目を使用する場合、親タスクも必須項目として設定しましょう。
・**Issue Links**で、必要に応じてリンクのタイプを選択する。
・**Conditional execution**で、必要に応じて実行条件のロジックを記述する。
　　例：`%{nnnnn} ="システム変更依頼” and`
　　　　`count(filterByPredicate(subtasks(), ^%{00000}=("【事前作業実施】"+%{00000}))=0`
　　　　フィールドID{nnnnn}の値が「システム変更依頼」の場合、
　　　　且つ同名サブタスクが存在しない場合だけ自動作成を行う。

上記設定を保管して、ワークフロー定義の発行を行えば有効になる。
※起票時だけでなく、ワークフローのステータス変更時に上記処理を組み込むことは可能です。

###自動作成したサブタスクの期限を3日後に設定する
上記設定での「Create issues and subtasks」の「Set Fields」で以下の設定を行う。
・**Set Fields**
　　Field to be set:にて「Due date」を選択し、Addボタン押下
　　Value Type：は「Math/Time expression」を選択
　　Math/Time expression:にて以下の記述を行い、Saveボタンを押下
　　`addDaysSkippingWeekends({00057},3,LOCAL)`
　　　※addDaysSkippingWeekendsは土日の日数カウントを除外します
　　　※{00057}は、現在の日付(Current date and time)のフィールドID
　　　※「3」は日数。「LOCAL」はタイムゾーンを示します。


*JIRA Softwareバージョンは7.12.1*
Mac OS X(10.9)にMecabとCabochaをいれて形態素解析から係り受けまで

こちらの記事を参考にいれたのですが文字化けにはまったので共有しておきます。

http://qiita.com/betahikaru/items/8d2867fb39624e1fa48a

最初のポイント

+ mecabも辞書もともにutf8を指定してconfigureする必要がある

```shell-session:command
wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar zxvf mecab-0.996.tar.gz
cd mecab-0.996
./configure --enable-utf8-only
make
make check
sudo make install
```

IPA辞書もいれます。

```shell-session:command
wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
make check
sudo make install
```

動作確認は参照元の記事をご覧ください。
mecabコマンドで文章の形態素解析がおこなえるようになります。
【メモ】 「１つ以上存在してはならない」の違和感、というか、誤り。

生産的な内容ではないですが。

「単一責任の原則」がいまいちピンとこなくて、
今やってるアプリ開発にどう反映していけばいいんだろうか、、、
と、色んなトコを調べてまわってるんですが、
めちゃめちゃ気になるのが、

「クラスを変更する理由は、__１つ以上存在してはならない__」

って書いてるトコ。（が、割とたくさんあるコト。）

１つ以上～、ってコトは、ゼロしか許されなくないですか。
それはもう
「クラスを変更する理由は存在してはならない→クラスを変更してはならない」
と同義じゃないですか。

日本語の揚げ足取りをして上から目線で何か物申してやろう
ってほどの気概があるワケじゃないんですが、

「クラスを変更する理由は、__１つ以上存在してはならない__」

って書いてるトコがあまりに多く目に付くもので、、、
皆さん、自分の語ってる言葉の意味を正確に理解していらっしゃるのかなぁ、と。

（だって、この業界、「以上」とか「未満」とか「を超える」とかの意味合いって、
　めちゃめちゃ大事なコトじゃないですか。）

少なくとも、そういう書き方をしてるトコの内容はあんまり信用しないコトにしました。

という、メモでした。
GCPでデプロイしたWordpressのパーマリンクにindex.phpが付いてしまう

#陥ったこと
無事GCPでWPを立ち上げたと思ったら、パーマリンクがうまく行かない。固定ページを表示するとindex.phpが入らないと表示出来ない。調べると普通ならhtaccessでリダイレクト設定するが、GCPはhtaccessを使用していないらしい。

#解決方法
下記のページに解決方法が載っていた。
[Wordpress permalinks on Google Cloud Platform don't work
](https://stackoverflow.com/questions/44530798/wordpress-permalinks-on-google-cloud-platform-dont-work)