OmniAICreator/Qiita-1.07M huggingface dataset:
UE4 自作タイムラインマクロ

開発が進むにつれ、管理クラスでもブループリントが一つだと非常に煩雑になるため子ブループリントを作って処理の分散を行うようになる。
しかし、子ブループリントではタイムラインが使えないので、悲しい思いをすることが多々存在する。
そこでDateTime変数が1つあり、ActorComponentを継承していれば使えるタイムラインマクロを作ってみた。

#ブループリントのマクロライブラリを作成
Actor Componentを継承して作成すること
![macro.png](https://qiita-image-store.s3.amazonaws.com/0/64194/4ba8eff5-209e-ea7e-2cae-557e34f02ce7.png)

##時間差分を秒に変換するマクロ
日まで変換するとfloatの精度が低くなってしまう可能性が高いので省略した
![GetTotalSeconds.png](https://qiita-image-store.s3.amazonaws.com/0/64194/89ab6320-4c76-b1a1-0f8b-0e85cfa4769b.png)

##自前タイムライン
入力のDateTime変数をリファレンスにすることが重要
![MyTimeline.png](https://qiita-image-store.s3.amazonaws.com/0/64194/70e71306-a435-6698-da27-53e8fdf906d2.png)


Alphaには0.0～1.0が返ってくる。

##使い方
StartTime変数はマクロ内で使うので、特に初期化等は必要なし
![use.png](https://qiita-image-store.s3.amazonaws.com/0/64194/60530fc6-c70d-d2a4-05a3-d20985ca40d8.png)

##タイムラインのようにカーブを使う
Curveアセットと組み合わせれば簡単。
詳細は[こちら](http://historia.co.jp/archives/2678)
![curve.png](https://qiita-image-store.s3.amazonaws.com/0/64194/df4d2c37-f34f-8db8-af36-f2aaa8b85ed4.png)

![curve2.png](https://qiita-image-store.s3.amazonaws.com/0/64194/af1ba555-0f28-c8a7-1474-215c97aabe27.png)
Androidでblinkタグを使う

AndroidのUIのレイアウトはXMLで記述しますが、**実はここで`<blink>`タグが使用できます！！**

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
```

```xml:layout/activity_main
<?xml version="1.0" encoding="utf-8"?>
<blink xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Hello World!" />

</blink>
```

ピカピカ点滅します。

Androidの`LayoutInflater`のソースを読んでいたら発見しました。761行目付近です。

```java:LayoutInflater
if (name.equals(TAG_1995)) {
    // Let's party like it's 1995!
    return new BlinkLayout(context, attrs);
}
```
面接でFizzBuzzを書けと言われたときにすべきこと


こんなツイートを見つけました。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">IT会社面接官：「数字を列挙し、3の倍数ならfizz、5の倍数ならbuzz、15の倍数ならfizzbuzzを出力するプログラムを書いてください。」<br>面接を受けている人：「では、まずTensorFlowをインポートします…」<a href="https://t.co/UNk2jH5rfn">https://t.co/UNk2jH5rfn</a></p>&mdash; Graham Neubig (@neubig) <a href="https://twitter.com/neubig/status/734946340292067328?ref_src=twsrc%5Etfw">May 24, 2016</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

FizzBuzzにTensorFlowが必要？
ウケる。
もちろんFizzBuzzに必要なのは、`Babel`ですよね。

では、まずBabelをインストールします。

```
$ yarn add --dev babel-cli babel-plugin-fizzbuzz
$ echo '{"plugins": ["fizzbuzz"]}' > .babelrc
```

REPLで実行します。

```
$ yarn run babel-node
>  for(var i = 1; i < 100; i++) { console.log(i) }
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...
```

[![https://gyazo.com/f2340f77fa9668181cba42c8e19132c1](https://i.gyazo.com/f2340f77fa9668181cba42c8e19132c1.gif)](https://gyazo.com/f2340f77fa9668181cba42c8e19132c1)

これで面接のFizzBuzz対策も完璧ですね。

## 何が起きていますか？

```js
for (var i = 1; i < 100; i++) {
  console.log(i)
}

      ↓ ↓ ↓ ↓ ↓ ↓

for (var i = 1; i < 100; i++) {
  console.log(
    i % 15 === 0 ? 'FizzBuzz' : i % 3 === 0 ? 'Fizz' : i % 5 === 0 ? 'Buzz' : i
  )
}
```

## どうやっていますか?
console.logを問答無用でFizzBuzz出力マシーンに変換にします。

```js
// @flow weak
import looksLike from 'babel-looks-like'
// import blog from 'babel-log'

const consoleLogPath = {
  node: {
    callee: {
      type: 'MemberExpression',
      object: { name: 'console' },
      property: { name: 'log' },
    },
  },
}

const CREATED = Symbol('CREATED')

export default ({ types: t, template }) => {
  const builder = template(`
  console.log(ID % 15 === 0 ? 'FizzBuzz' : ID % 3 === 0 ? 'Fizz' : ID % 5 === 0 ? 'Buzz' : ID)
  `)

  return {
    name: 'fizzbuzz',
    visitor: {
      CallExpression(nodePath) {
        if (nodePath[CREATED]) {
          return
        }

        if (!looksLike(nodePath, consoleLogPath)) {
          return
        }

        const { node: id } = nodePath.get('arguments.0.name')
        nodePath.replaceWith(builder({ ID: t.identifier(id) }))
        nodePath[CREATED] = true
      },
    },
  }
}
```

## おわりに
もしこれを面接でやって落ちても一切の責任は取りません。

[**akameco/babel-plugin-fizzbuzz**<br>Babel Plugin for fizzbuzz](https://github.com/akameco/babel-plugin-fizzbuzz)


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">面接でFizzBuzzを聞かれたときのためにBabelPluginを用意しといたで！これで面接対策も完璧や！  <a href="https://t.co/nElT463Hig">https://t.co/nElT463Hig</a> <a href="https://t.co/hCsrW0ldDY">pic.twitter.com/hCsrW0ldDY</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/926024323432816640?ref_src=twsrc%5Etfw">November 2, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 関連
[JavaScriptのfloatで正確な比較を行う - Qiita](https://qiita.com/akameco/items/019e1a0875ad236e859c)

もしより邪悪なBabelPluginについて知りたければ以下の記事もご覧ください。

[**さよならボイラープレート。s2sによる高速reduxアプリケーション構築**<br>https://qiita.com/akameco/items/e1489c6bbf3439ec6ca4](https://qiita.com/akameco/items/e1489c6bbf3439ec6ca4)
git rev-parse --abbrev-ref HEADでheadsが付加される

# git rev-parse --abbrev-ref HEADでheadsが付加される

## 期待
```
$ git rev-parse --abbrev-ref HEAD
branch_name
```

## 現実
```
$ git rev-parse --abbrev-ref HEAD
heads/branch_name
```

## why？
branchと同名のtagが存在する場合にこの表記となるようです。
私の場合はtagが不要だったため、tagを消したら期待動作しました
Firebaseでデプロイしたサイトを削除する方法

## 環境
* Windows 10
    * Git Bash

``` bash
$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

```

## 問題と解決方法
### 問題
FirebaseのHostingサービスを触ってみて、サンプルをいじって、お手軽にデプロイして遊んでました

一通り遊んだ後に、勝手にアクセスきたら困るしとりあえず削除しよっと思って、Firebase Consoleから探したところ、あれ？ない？

ググっても中々出てこなかったのでシェアです！

### 解決方法
コマンドラインから

```firebase
firebase hosting:disable
```
と打つことでデプロイしたサイトを削除することが出来ます

※エラーが出る場合は

```firebase
firebase hosting:disable -y
```
とするといいと思います

ちなみに`-h`オプションでヘルプ出ます
2017年11月1週のGoogle速報

# 今週のGoogle速報です。

## GCP公式まとめ
まずはこれを読もう。
https://cloudplatform-jp.googleblog.com/2017/11/Google-Cloud-Platform-Monthly-post-2017-10.html

## 世界
インドでGCPが使えるようになりました。使えなかったとは知らなんだ
https://cloudplatform.googleblog.com/2017/10/GCP-arrives-in-India-with-launch-of-Mumbai-region.html

## マシン
1つのVMインスタンスに最大8つのネットワークインターフェース
https://cloudplatform-jp.googleblog.com/2017/10/with-multiple-network-interfaces-connect-third-party-devices-to-GCP-workloads.html

## 開発
開発サプライチェーンGrafeas
https://cloudplatform-jp.googleblog.com/2017/10/introducing-grafeas-open-source-api-.html
コーディング→
ビルド→
テスト→
デプロイ→
という一連の流れを我々開発者は毎日毎日やってるわけですけれども、
その結果で生じるすべてのメタデータを集計してなんかやるシステム、らしいんですけれども・・・。

ついにファイアーウォールが!!
https://cloudplatform-jp.googleblog.com/2017/10/App-Engine-firewall-now-generally-available.html
これはありがたいですね。
ただ、プロジェクトごとに変えられるともっとありがたいですね。

## オープンソース Protobuf / Golang / Kubernetes
今週とくになし

## 機械学習
自動マスキング of 機微データ
https://cloudplatform.googleblog.com/2017/03/discover-and-redact-sensitive-data-with-the-Data-Loss-Prevention-API.html
機微データの発見と置換を同時に行えるAPI!?
2017年3月に既にあっただと?
リンク先のgifを見るだけでも軽く衝撃。

# 論文引用
noisy short text
http://sentic.net/sentire2017meisheri.pdf
noisy short text、つまりtwitterの文章を感情データに変換する変換器。
この論文、tcsから出てますが、これはTATAのことです。
TATAってこういう論文出すんですね。すげーな

音素予測
https://arxiv.org/pdf/1710.09617.pdf
ひさびさに、Googleから出た論文の紹介しますよー。RNN-Tの応用。
Google Homeもこういうのでできてんのかな?

break text-based CAPTCHAs
http://science.sciencemag.org/content/early/2017/10/25/science.aag2612
科学界トップ論文誌サイエンスからです。
機械学習でCAPTCHAが破れたそうです。でも、昔からCAPTCHAを破るという研究分野はあるそうです(!)
Recursive cortical networkは生成モデルぽいです。

## イベント
終了してましたが、こういうイベントもあるんですね〜。
https://gaeja.connpass.com/event/68702/
macのnodejsでforeverしようとしたらエラーが起きた


#エラー
macのplistでforeverを使った時、以下のエラーが出た。

```
env: node: No such file or directory forever
```
#解決策
```
/usr/local/bin/forever app.js
↓↓↓↓↓↓change↓↓↓↓↓↓↓↓↓
/usr/local/bin/node /usr/local/bin/forever app.js
```
macでnodejsのデーモン化(foreverを使う)

#macでplistを作成してnodejsのデーモン化を行なった。
まずはnodejsとnpmは入ってる前提で話進めます。
入ってないひとは[こちら](h)
linuxならrc.localに入力すればいいけどmacはそれができない。
plistを使ってあげましょう。

#まずはforeverをインストール

```
npm install -g forever 
```
#plistの作成
username は適当に自分のを入力

``` ~/Library/LaunchAgents/com.example.test.test.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>UserName</key>
        <string>username</string>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>com.example.test.test</string>
        <key>ProgramArguments</key>
        <array>
                <string>sh</string>
                <string>/Users/username/start_forever.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    <key>StandardOutPath</key>
    <string>/path/to/standard.log</string>
    <key>StandardErrorPath</key>
    <string>/path/to/error.log</string>
</dict>
</plist>
```
#shスクリプト
これで保存nanoかvi、vimでファイルを作成

```bash:bash
nano /Users/$USER/start_forever.sh
```

```nano:/Users/$USER/start_forever.sh
/usr/local/bin/node /usr/local/bin/forever /path/to/app.js
```
モノクロで1日過ごしてみた話

# モノクロで1日過ごしてみた話
Webデザインを勉強していて、
「明度のみで、サイトの強調部分が強調されているとユーザーに伝わりやすい。」、
「モノクロで見ると明度のみの表現になるので確認しやすい。」とあり、
試しにブラウザをモノクロ表示して1日過ごしてみて、得られたものを投稿いたします。

## どんな世界か
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/a66a74a6-d611-3e34-5e26-adda5e586908.png)


## 色に溢れている世界
モノクロのブラウザを見つめ続けた後、ふと顔を上げると、現実世界があらゆる色に彩られていることに気づきます。むしろ、彩られ過ぎとも感じます。

## 意外と認識できる
「モノクロにすると、情報を得づらいのでは、理解しづらいのでは」と懸念していましたが、これが意外と問題ありません。
これは、おそらく、デザインの４原則（近接、整列、反復、強弱）がどのサイトにも適用されているからなのではないかと思います。また、テキストだけでなく画像による情報の発信も要因かと思います。

## 色への感度が上がる
今まで、何気なくみていた、色への感度が上がります。
色には、抽象的なイメージ、物理的なイメージがあるのですが、それらを強く感じられるようになります。

例えば、「赤」の興奮するイメージ、「青」の落ち着くイメージが良く理解できると思います。（これらは、抽象的なイメージです）

## 配色が気になる
色への感度が上がったためか、
「なぜこの色が使用されているのか」、「なぜこの人はこの色を選んだのか」あらゆるモノの配色に関して疑問を持つことができます。
また、それは、webサイトでも同様です。

「この配色は、分かりづらいな。」など配色に関して、改善点を見出すことができます。
製作中に一度モノクロで見てみて、リセットすることによって客観視しやすくなるのではないでしょうか。

## おすすめする方
- Webディレクター
- Webデザイナー
- Webエンジニア

基本的にデザインを勉強されている方全員にオススメです。
デザインを勉強していないWebエンジニアの方も、デザインに興味を持てるキッカケになるかと思います。

## モノクロにする方法
chromeの拡張機能「unclrd」を導入します。

## 注意
長時間行うと、吐き気を催す場合があります。
真似する方は、体調の良いタイミングでおこなってください。
C++ Builder XE4, 10.2 Tokyo > 複数コンポーネントの登録と使用 > TObjectList の使用

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

処理を外部ソース化する時、フォーム上の多数のコンポーネントのポインタをどう渡すか。

TObject *型で渡す例を実装してみた。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TEdit *Edit1;
	TCheckBox *CheckBox1;
	TComboBox *ComboBox1;
	TButton *B_register;
	TButton *B_use;
	void __fastcall B_useClick(TObject *Sender);
	void __fastcall B_registerClick(TObject *Sender);
private:	// ユーザー宣言
	void __fastcall doRegister(TObject *objs[], int numObj);
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
	__fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static TObjectList *s_list;
static int s_numObject;

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	s_list = new TObjectList();
   	s_numObject = 0;
}
__fastcall TForm1::~TForm1()
{
	delete s_list;
	s_list = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::doRegister(TObject *objs[], int numObj)
{
	for(int idx=0; idx < numObj; idx++) {
		s_list->Add(objs[idx]);
	}
	s_numObject = numObj;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_useClick(TObject *Sender)
{
	for(int idx=0; idx < s_numObject; idx++) {
		TObject *objPtr = (TObject *)s_list->Items[idx];
		TComponent *cmpPtr = (TComponent *)objPtr;
		OutputDebugString(cmpPtr->Name.c_str());
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_registerClick(TObject *Sender)
{
	TObject *objs[] = {
		Edit1,
		CheckBox1,
		ComboBox1,
	};
	int numObj = sizeof(objs) / sizeof(objs[0]);

	doRegister(objs, numObj);
}
//---------------------------------------------------------------------------
```

### 備考

TObject *でなく、TComponent *で登録するかは用途に依存する。

TObjectListというのは初めて意識した。
http://docwiki.embarcadero.com/Libraries/XE4/en/System.Contnrs.TObjectList
「今さら」 PostgreSQL 10の変更点

## はじめに
2017年10月5日にPostgreSQL 10がリリースされました。
完成度が高いと評判だったので、リリースノートを読んでみました。

## PostgreSQL 10の主な変更点
### ロジカルレプリケーションの導入
ロジカルレプリケーションは分散データベースシステムにおけるデータの複製のためのpublish/subscribeフレームワークです。
テーブル単位での複製や、異なるバージョン間で複製ができます。
publish/subscribeと呼ばれているので、IoTのその仕組みに近いようです。
複製元のWALを加工して複製先に送信することで複製をします。

### パーティション構文の導入
今までPostgreSQLでパーティションを作成するためにはトリガ関数を書いたりしなければなりませんでしたが、10からはパーティション構文が用意されました。
これにより、パーティションを簡単に作れるようになり、メンテナンスも簡単になりました。
しかも、トリガを利用してパーティションを作成するよりも高速にデータを挿入することができます。

### パラレルクエリの改善
並列実行できる処理を増やすことによって、並列実行の性能が向上しました。

* B-treeインデックススキャン
* ビットマップヒープスキャン
* マージ結合
* 相関の無いサブクエリの処理
* データの事前ソート(性能改善)
* PLファンクション(性能改善)

### 同期レプリケーションにおけるクォーラムコミットの実装
クォーラムコミットは、プライマリデータベースとリモートレプリカのデータに一貫性を持たせる仕組みの１つです。
そもそも、プライマリデータベースとリモートレプリカの間にデータに高い一貫性を持たせると、可用性が低下するというトレードオフがあります。
例えば、全レプリカからデータの複製が成功したという通知を受け取るまで、プライマリは待ち続けるプロトコルがあるとします。
一貫性は必ず保たれるが、レプリカが故障していた場合などはプライマリは永遠に動作しなくなってしまいます。
クォーラムコミットは、ある一定数のレプリカからデータの複製が成功したという通知をプライマリが受け取れば、データの複製が完了したことにします。
すなわち、一貫性を低下させることで、可用性を向上させています。
https://qiita.com/everpeace/items/632831371da5ff215995

## まとめ
今度は実際にPostgreSQL 10を触ってパーティション作ったり、レプリカ作って動作確認してみます。
Google Compute EngineでHubotを動かす

私的メモ

## Compute Engineのインスタンス作成
- OSは「Debian GNU/Linux 9 (stretch)」にしました。

## Node.jsをインストール
### apt-getを最新にする

```bash
$ apt-get update
```

### Node.jsをインストール

```bash
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ apt-get install -y nodejs
```

### npmを最新にする

```bash
$ npm install -g npm
```

## Hubotをインストール
### npmでモジュールをいれる。

```bash
$ npm install -g hubot yo generator-hubot coffee-script
```

## Hubotの設定

```bash
$ yo hubot
```

## Hubot起動

```
$ ./bin/hubot
```

# 参考記事
- [SlackのBot(hubot)を作ってみる](https://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a)
- [初心者がHubotを使ってHeroku上で動くSlack bot作ってみた（導入編）](https://qiita.com/susuwatarin/items/019e0e701754161f7c4c)
Realm Object Server 2.0 をCentOS6.9にインストール

Realm Object Server が2.0になったので、バージョンアップしてみました。

エクセルソフトさんのハンズオン参加用にインストールしていたRealm Object Serverをアンインストールしてバージョンアップを実行。

ドキュメントを見ると
>npm install -g realm-object-server

だけなのですが、実際は条件がありました。
ほんとは基本なのかもしれませんが、
>node-gyp

が必要で、node_moduleのビルドが行われるので、開発環境も一通り入っている必要があります。

>ros init xxxx

で、プロジェクトを作っても実行時に
>Error: Compilation of μWebSockets has failed and there is no pre-compiled binary available for your system. Please install a supported C++11 compiler and reinstall the module 'uws'.

となります。
CentOS6.9は
>$ gcc -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)

で C++11　とするならversion 4.8　以降が必要なようです。

なので devtools-2.repo を追加して、gccをバージョンアップしてなんとか起動できました。
Google Telework Loungeで仕事してみました。

# Google Telework Loungeで仕事してみました。

六本木ヒルズノースタワーにグーグルがテレワーク・スペースをオープンしたので、仕事しに行ってみました。

https://www.womenwill.com/japan/googletelework

11/1-11/30の期間限定オープンで、個室やオープンスペース、会議室まで完備されています。
あと、美味しいコーヒーが無料で飲めます。

## 内装はこんな感じです。

![IMG_20171102_140035.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/d196beb7-a080-7eb9-d588-45c9730a5820.jpeg)

![IMG_20171102_134045.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/8b75e8ad-86f6-d12d-cae4-f4319e079651.jpeg)

![IMG_20171102_134016.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/2d09ebae-1ea0-9923-5db9-695aca024984.jpeg)


![IMG_20171102_125328.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/514d13e1-9804-d3a7-a9f8-2ce4d068ed2b.jpeg)


![IMG_20171102_125332.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/1da6b85c-92a0-dae1-d68e-ad3705e8a243.jpeg)


![IMG_20171102_125318.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/fdac0ebc-7036-59d8-843f-e9b9de7e9766.jpeg)


## 仕事してみた感想

半個室（ドアのない個別スペース）で一日仕事してみました。
開場初日ということで人の出入りが多かったですが、自分に話しかけられることはないので気になりません。
むしろ誰にも作業をインターセプトされないぶん、事務所で仕事するより集中できました。

これまでリモートワークで自宅や喫茶店で仕事することはありましたが、初めての場所で環境が変わると気分が変わるようで、ちょっとリフレッシュになった気がします。
あと会場の天井が高いおかげか、他人の話し声もほとんど聞こえてこないんですよね。この点は喫茶店との大きな違いです。

まあ何回も行くと気が変わるかもしれませんが、はじめて使ってみた感想としては満足でした。
ANSIエスケープシーケンス チートシート

ANSIエスケープシーケンスを駆使すれば、
こんな感じでターミナルの出力に色を付けたり
![2017-11-02_18h13_43.png](https://qiita-image-store.s3.amazonaws.com/0/31393/d7988e07-7dea-31b0-2aa3-91e1ad1cb798.png)

出力した内容を書き換えたりできる。
![escape.gif](https://qiita-image-store.s3.amazonaws.com/0/31393/5450f73d-7c30-4cbd-7596-f29b1f0ffc09.gif)



[[PHP]ゲーム作成初心者がPHPでテト〇ス風ゲームを作ってみた](https://qiita.com/PruneMazui/items/617e1af1a4b4577eed1f)
上記記事にて出力されるブロックの色を変更したり、出力内容を上書きしたりするのに使った。

# 記法

指定がない限り、太字の部分が可変となる箇所。

## カーソル移動

|記法|内容|
|:---|:---|
|\e[**n**A |上に**n**移動|
|\e[**n**B |下に**n**移動|
|\e[**n**C |右に**n**移動|
|\e[**n**D |左に**n**移動|
|\e[**n**E |**n**行下の先頭に移動|
|\e[**n**F |**n**行上の先頭に移動|
|\e[**n**G |現在位置と関係なく左から**n**の場所に移動|
|\e[**n**;**m**H<br>\e[**n**;**m**f |現在位置と関係なく上から**n**、左から**m**の場所に移動|

## コンソールスクロール

|記法|内容|
|:---|:---|
|\e[**n**S |**n**行分コンソールを次にスクロール|
|\e[**n**T |**n**行分コンソールを前にスクロール|

## 出力消去

|記法|内容|
|:---|:---|
|\e[**n**J |画面消去<br>**0（or省略）**・・・カーソルより後ろを消去<br> **1**・・・カーソルより前を消去<br>**2**・・・画面全体を消去|
|\e[**n**K |行消去<br>**0（or省略）**・・・カーソルより後ろを消去<br> **1**・・・カーソルより前を消去<br>**2**・・・行全体を消去|

## 出力文字の変更

注：ターミナルによって対応してる/してないが分かれる

|記法|内容|
|:---|:---|
|\e[**0**m |指定をリセットし未指定状態に戻す（0は省略可）|
|\e[**1**m |太字|
|\e[**2**m |薄く表示|
|\e[**3**m |イタリック|
|\e[**4**m |アンダーライン|
|\e[**5**m |ブリンク|
|\e[**6**m |高速ブリンク|
|\e[**7**m |文字色と背景色の反転|
|\e[**8**m |表示を隠す（コピペ可能）|
|\e[**9**m |取り消し|

## 出力色の変更

先述した `\e[0m` でリセット可能。

|文字色|背景色|色|
|:---|:---|:---|
|\e[**30**m|\e[**40**m |黒|
|\e[**31**m|\e[**41**m |赤|
|\e[**32**m|\e[**42**m |緑|
|\e[**33**m|\e[**43**m |黄色|
|\e[**34**m|\e[**44**m |青|
|\e[**35**m|\e[**45**m |マゼンダ|
|\e[**36**m|\e[**46**m |シアン|
|\e[**37**m|\e[**47**m |白|

## 出力色の変更（拡張）

注：ターミナルによって対応してる/してないが分かれる

|文字色|背景色|内容|
|:---|:---|:---|
|\e[38;5;**n**m|\e[48;5;**n**m |nを0～255のカラーコードを指定|
|\e[38;2;**r**;**g**;**b**m|\e[48;2;**r**;**g**;**b**m |RGBでのカラーコードを指定<br>（対応端末少ない）|



# サンプル

サンプルは Windows10 + Cygwin で表示された内容

### 出力文字

```bash
for ((i = 1; i <= 9; i++)); do
    printf '\e[%dm%d\e[m ' $i $i
done
```

![2017-11-02_16h32_26.png](https://qiita-image-store.s3.amazonaws.com/0/31393/8a02a8df-4a96-ebc9-7854-d737a75a797d.png)

ブリンクはしなかった。

### 文字色

```bash
for ((i = 30; i <= 37; i++)); do
    printf '\e[%dm%d\e[m ' $i $i
done
```

![2017-11-02_16h13_32.png](https://qiita-image-store.s3.amazonaws.com/0/31393/43469a23-a1e2-bf33-6345-5618487e3e52.png)

### 背景色

```bash
for ((i = 40; i <= 47; i++)); do
    printf '\e[%dm%d\e[m ' $i $i
done
```
![2017-11-02_16h15_20.png](https://qiita-image-store.s3.amazonaws.com/0/31393/285427bc-113d-3ea5-7059-b767c4246050.png)

### 文字色（拡張）

```bash
for ((i = 0; i < 16; i++)); do
    for ((j = 0; j < 16; j++)); do
        hex=$(($i*16 + $j))
        printf '\e[38;5;%dm0x%02X\e[m ' $hex $hex
    done
    echo "";
done
```
![2017-11-02_16h16_52.png](https://qiita-image-store.s3.amazonaws.com/0/31393/5c09daee-e19d-c573-33d5-697612393900.png)

### 背景色（拡張）

```bash
for ((i = 0; i < 16; i++)); do
    for ((j = 0; j < 16; j++)); do
        hex=$(($i*16 + $j))
        printf '\e[48;5;%dm0x%02X\e[m ' $hex $hex
    done
    echo "";
done
```
![2017-11-02_16h17_54.png](https://qiita-image-store.s3.amazonaws.com/0/31393/51cfae9e-1f2c-2b1f-e26c-00af0a3c5f32.png)
fetch-mockでnodeでのfetch入りモジュールをテストする

# nodejsでfetchが入っているモジュールの単体テスト

nodejs上でfetchを使い、別のサーバーにRESTコールを投げる場合があります。
そのようなコードを単体テストする際に、実際に他のサーバーに処理を投げると他サーバーに引きずられてテストが不安定になるため、モックにしたいところです。
そこで、[fetch-mock](http://www.wheresrhys.co.uk/fetch-mock/quickstart) というライブラリを利用してモックする手順についてまとめました。

# fetch-mock

fetch-mockはfetchを独自のモックに置き換え、指定したレスポンスを返すように設定できるライブラリです。

## グローバルfetchを使う場合の使い方
fetch-mockのデフォルトの挙動では、グローバルオブジェクトに登録されているfetchを置き換えてくれます。[公式サイト](http://www.wheresrhys.co.uk/fetch-mock/quickstart)にも載っているサンプルを元に説明します。
nodeではネイティブでfetchがglobalオブジェクトには紐付いておらず、この方法は使えません。nodeでは別途後述するsandboxメソッドを使わないとだめですが、挙動はほぼ変わらないので、まずはfetch-mockの本来の使い方について触れます。

```make-request.js
module.exports = function makeRequest() {
  return fetch("http://httpbin.org/get").then(function(response) {
    return response.json();
  });
};
```

`httpbin.org/get`に対してgetリクエストを出して、そのレスポンスをJSONパースしてオブジェクトとして返します。`httpbin.org/get`のエンドポイントは実在していて、モックせずにfetchするとちゃんとしたレスポンスが返ってきます。
このソースコードに対するテストとして下記のようなテストを書きます。

```test.js
var fetchMock = require('fetch-mock');
var makeRequest = require('./make-request');

// Mock the fetch() global to always return the same value for GET
// requests to all URLs.
fetchMock.get('*', {hello: 'world'});

makeRequest().then(function(data) {
  console.log('got data', data);
});

// Unmock.
fetchMock.restore();
```

`fetchMock.get`によりグローバルのfetchオブジェクトをfetchMockが作ったモックに置き換えています。
第一引数は対象のURLを示しており、このサンプルでは`*`にしているため、全てのURLが対象になります。
第二引数はレスポンスを示していて、`{hello:'world'}`というJSONをレスポンスとして返します。
この状態でfetchを呼ぶと、どのURLに対してアクセスしても第二引数のレスポンスが返ってきます。
実際に実行すると下記のようになります。

```bash
$ node mocked.js
'got data' { hello: 'world' } 
```

## 非グローバルなfetchを使うやり方

nodeを使っている場合、前述した通りfetchはグローバルオブジェクトには紐付いておらず、node-fetchなどを持ってくる必要があります。。`make-request.js`でいうと、例えば下記のようなコードになります。

```make-request-node-fetch.js
var fetch = require('node-fetch')
module.exports = function makeRequest() {
  return fetch("http://httpbin.org/get").then(function(response) {
    return response.json();
  });
};
```

ここで使うfetchはグローバルなものではないので、fetchMockでmockしても置き換わってくれません。
そこで、sandboxというメソッドを使ってモックを作り出します。作り出したモックは任意のスタブ組み込みライブラリで組み込む必要があります。
ここでは[proxyquire](https://github.com/thlorenz/proxyquire)をスタブ組み込みライブラリとして使用します。

```test.js
var fetchMock = require('fetch-mock');
var proxyquire = require('proxyquire')

var myMock = fetchMock.sandbox().mock('*',{hello: 'world'});
var makeRequest = proxyquire('./make-request-node-fetch',{
  'node-fetch': myMock
});

makeRequest().then(function(data) {
  console.log('got data', data);
}).catch((e) => { console.log(e.message)});
```

proxyquireを使ってmake-request.js内での`require('node-fetch')`で返ってくるfetchメソッドをモックしています。
proxyquireは今回ちょろっと紹介しただけですが、これも非常に便利なのでテストに多用できると思います。
MPOS・NOMP

#マイニングプールを作る際に最初に決める事
ユーザ登録ありのプールにするか、ユーザ登録なしのプールにするか。
##ユーザ登録ありのプールにする場合

**MPOS(Mining Portal Open Source)**

本家githubはこちら

**[https://github.com/MPOS/php-mpos](https://github.com/MPOS/php-mpos)**

先人のみなさまが公開して下さっているmining-pool構築方法は、主にこちら。
##ユーザ登録なしのプールにする場合
**NOMP(Node Open Mining Portal)**

本家githubは（おそらく）こちら。

**[https://github.com/zone117x/node-open-mining-portal](https://github.com/zone117x/node-open-mining-portal)**

ユーザ登録がいらないのでお気軽に採掘可能。
しかし、詳しい作り方をまとめているサイトがない。。。

---
**YiiMP(yaamp fork)**

と思っていたら、稼働中のNOMPプールの方から以下のgithubを紹介して頂けました。

**[https://github.com/tpruvot/yiimp](https://github.com/tpruvot/yiimp)**

さらに、YiiMPの自動構築スクリプト的なものを見つけたのでご紹介。

**[https://github.com/poolnine/yiimp_install_scrypt] (https://github.com/poolnine/yiimp_install_scrypt)**

なお、動作チェックまでは出来ていない、、、

---

2018年12月30日追記

BitZeny Discordにて、yiimpではなくYiiMPのほうが適切な表現とのご指摘を頂きました。
cryptonさん、ありがとうございます。

YiiMPの開発者、tpruvot氏によるプールにて、全てYiiMPの表記で統一されているとの事です。

**[http://yiimp.eu/](http://yiimp.eu/)**

---

**Z-NOMP(Zcash and Zclassic - Node Open Mining Portal)**

githubはこちら。

**[https://github.com/z-classic/z-nomp]
(https://github.com/z-classic/z-nomp)**

2018年2月現在、最も開発が進んでいる（BugFixが進んでいる）
NOMPがこちらになります。

---

**ZNY-NOMP（BitZeny - Node Open Mining Portal）**

BitZeny対応版のNOMPは、こちらが奇麗にまとまっている気がしてます。

**[https://github.com/ROZ-MOFUMOFU-ME/zny-nomp/](https://github.com/ROZ-MOFUMOFU-ME/zny-nomp/)**

もふもふ

---
rubyでcp932(shift-jis)なcsvを扱う


```hoge.rb
require 'csv'

# csvデータの作成


# temp_dirにCSVを作る
Dir.mktmpdir do |dir|
  CSV.open("#{dir}/hoge.csv", "w", encoding:"cp932") do |csv|
    csv << ["動物", "count", "price"]
    csv << ["狐", "1", "$90.00"]
  end
end

#csvを読む
csv = CSV.read("hoge.csv", encoding: "CP932:UTF-8")

#hashで読む
csv = CSV.read("hoge.csv",encoding: "CP932:UTF-8", headers:true)

#csvなstringをそのまま書き出す
File.write("../hoge.csv", csv, encoding: "CP932")

#日本語ファイル名でsend_dataする
send_data csv, filename:ERB::Util.url_encode("日本語ファイル名.csv") 
```
PythonのWikipediaAPIを使って遊ぶ

# PythonのWikipediaAPIを使って遊ぶ

PythonモジュールにWikipediaモジュールがあるのを知ったので遊んでみる。

詳しいことは以下のURLに書いてあるが、内部ではちゃんとMediaMiki　APIというWikipediaが公式に配布しているAPIを使ってるそうなので大丈夫。
APIがあるものはAPIを使いましょう。
https://pypi.python.org/pypi/wikipedia

### 早速いじってみる

インストールは省略。
表示はJupyter notebookを使っています。
使用言語の設定をし、、、

<img width="366" alt="スクリーンショット 2017-11-02 15.40.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/5d101c0c-354c-8c9d-8240-f42b67cd8bf0.png">

適当に投げてみる
<img width="579" alt="スクリーンショット 2017-11-02 15.40.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/0a22693d-b466-879d-088e-c5c9314b4969.png">

複数候補があるとリストで表示される。
一番上がやっぱりよい候補
ところどころ「月曜日のたわわ」とか、なんで引っかかったのかわからない候補あるけど。。。
（TrySailさんはミリオンのほうだし…）

何はともあれ簡単な使い方はわかったのでTwitterとかでつぶやけそうな感じに関数化

喋り方は某パークの~~無能~~案内ロボを意識したつもり…
<img width="724" alt="スクリーンショット 2017-11-02 16.13.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/3bca5516-8b0d-ecbe-9574-3e8b1714bd9a.png">

コードはGitHubに
https://github.com/ftamon/search_wiki

以上。

前に簡単なTwitterBot作ったしこれを組み込んでみるのも面白いかも、と画策中
GO並列処理：Goroutine

Goroutine

ci := make(chan int) //bufferなし
cj := make(chan int, 0) //bufferなし
cs := make(chan int, 100) //bufferあり

1.bufferなしの場合、先に書き込み、あとで取る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/6a076656-83b3-d676-ea07-6fa6e200ef71.png)

```go
 chan <- 1 
 <-chan
```

2.bufferある場合（データを保存する場合）、先に取る、あとで書き込み
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/635ce58c-8395-5516-1f99-2940b6f23c3e.png)

チャンネルで止める
最後の数で判断するではなく、同時で進行してるから、もしかしたら、最後のやつ一番最初に実行しちゃうかもしれない。(10回の場合)チャンネルの容量を１０に設定し、１０回やりとりするのが正しい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/c2e9f479-c15c-88f4-7ba0-dc95621bcb04.png)

syncで止める
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/bf505b2a-9c54-a6e3-f7ad-faeb387cfe5c.png)

##select:どっちのcaseが終わったら終わり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/e7594f29-42ae-c3f0-5898-52fbe5c718bc.png)

```go
ch := make (chan int, 1)
ch <- 1
select {
case ch <- 2:
default:
    fmt.Println("channel is full !")
}
```
容量１であるので、ch<-1入ったらもう満員の状況です、なので、case ch<-2 実行しない。


注意するところ：
time関数
closure関数、引数として渡さないと、GOは自動的にアドレス渡しちゃうので、 『{1,2,3}->3』 
 最後の値しか出力しない。引数として内部closureに渡せば問題です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/ebb73d06-17b3-e387-38a3-b7d2e8cf0cfb.png)
CodeIgniter: Create Connect Multiple Databases

In order to use multiple database connections in your CodeIgniter project, you just need to create multiple configuration arrays that simplify working with multiple databases.

The Default Configuration Array

Following is the structure of the default Codeigniter database configuration array:

```
$db['default']['hostname'] = 'localhost';

$db['default']['username'] = 'root';

$db['default']['password'] = '';

$db['default']['database'] = 'cloudwaysdb';

$db['default']['dbdriver'] = 'mysql';

$db['default']['dbprefix'] = '';

$db['default']['pconnect'] = TRUE;

$db['default']['db_debug'] = FALSE;

$db['default']['cache_on'] = FALSE;

$db['default']['autoinit'] = FALSE;

$db['default']['stricton'] = FALSE;

$db['default']['cachedir'] = '';

$db['default']['char_set'] = 'utf8';

$db['default']['dbcollat'] = 'utf8_general_ci';

$db['default']['swap_pre'] = '';
```

So in order to create another database connection, you should create another configuration array. This array has to follow the same structure. Here is an example of the array:

```
$db['anotherdb']['hostname'] = 'XXX.XXX.X.XXX';

$db['anotherdb']['username'] = 'another_user';

$db['anotherdb']['password'] = '';

$db['anotherdb']['database'] = 'anothercloudwaysdb';

$db['anotherdb']['dbdriver'] = 'mysql';

$db['anotherdb']['dbprefix'] = '';

$db['anotherdb']['pconnect'] = TRUE;

$db['anotherdb']['db_debug'] = FALSE;

$db['anotherdb']['cache_on'] = FALSE;

$db['anotherdb']['cachedir'] = '';

$db['anotherdb']['char_set'] = 'utf8';

$db['anotherdb']['dbcollat'] = 'utf8_general_ci';

$db['anotherdb']['swap_pre'] = '';

$db['anotherdb']['autoinit'] = FALSE;

$db['anotherdb']['stricton'] = FALSE;
```

Read full article at: https://www.cloudways.com/blog/connect-multiple-databases-codeigniter/
[Tutorial] Deploy a load balanced, multi-container application to multiple Kubernetes environments on GKE?

Kubernetes is a Production grade container orchestration platform with automated scaling and management of containerized applications. It is also open source, so you can install Kubernetes on any cloud like AWS, Digital Ocean, Google Cloud Platform, or even just on your own machines on premises. Kubernetes was started at Google and is also offered as a hosted Container Service called GKE. With Shippable, you can easily hook up your automated DevOps pipeline from source control to deploy to your Kubernetes pods and accelerate innovation.

In this blog, we demonstrate how to deploy a load balanced, multi-container application to multiple Kubernetes environments on GKE. The deployment occurs in multiple stages in a Shippable defined workflow.
![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/154485/19903906-c895-b440-9d58-adc77643dc9c.png)


This tutorial below should help you,

Originally shared on Shippable, [check out!](http://blog.shippable.com/kubernetes-tutorial-deploying-a-load-balanced-docker-application)
Boostの導入時のエラー回避（VC2013)

VisualStudio 2013でBoostを使おうとして下記URLをでインストールしようとしたところ、私の環境では上手く行かなかったので、上手く行った方法をメモ。

> https://qiita.com/takuya-ki/items/3555ab17f9cea534e13b 
> https://boostjp.github.io/howtobuild.html

# ダウンロード

> こちらから Downloads->windows->boost_1_65_1.7zもしくはboost_1_65_1.zipをダウンロード
> http://www.boost.org/users/history/version_1_65_1.html

![スクリーンショット 2017-11-02 15.35.16.png](https://qiita-image-store.s3.amazonaws.com/0/76058/a770cc0f-9fd4-12f1-45c5-fcfb6f589ad4.png)


# bootstrap.bat

**bootstrap.bat**を実行すれば良いのですが、この部分でエラーが出ました。

```error
C:\WINDOWS\system32>cd C:\Users\XXX\Downloads\boost_1_65_1

C:\Users\XXX\Downloads\boost_1_65_1>bootstrap.bat
Building Boost.Build engine

Failed to build Boost.Build engine.
Please consult bootstrap.log for further diagnostics.

You can try to obtain a prebuilt binary from

   http://sf.net/project/showfiles.php?group_id=7586&package_id=72941

Also, you can file an issue at http://svn.boost.org
Please attach bootstrap.log in that case.
```

原因はパス関係のようですが、調べてみた所、
**C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts**
にある、**開発者コマンド プロンプト for VS2013**
というやつで**bootstrap.bat**を実行すると通りました。

```
cd (解凍したディレクトリ)
bootstrap.bat
```

![fpnxa4was3o3l3di.png](https://qiita-image-store.s3.amazonaws.com/0/76058/c2d5061f-2899-3cc2-59d4-bb528eb70cf0.png)

後は下記のURLと同じ方法で通ります。

> https://qiita.com/takuya-ki/items/3555ab17f9cea534e13b 
続けて下記も実行

```
b2.exe toolset=msvc-12.0 link=static runtime-link=static,shared --build-dir=build/x86 address-model=32 -j5 install --includedir=C:\boost_1_65_1\include --libdir=C:\boost_1_65_1\lib\x86
b2.exe toolset=msvc-12.0 link=static runtime-link=static,shared --build-dir=build/x64 address-model=64 -j5 install --includedir=C:\boost_1_65_1\include --libdir=C:\boost_1_65_1\lib\x64
```

Cの直下にboost_1_65_1というディレクトリにBoostが入ります。

# 使用方法

プロジェクトを開いて（あるいは新たに作成して）、
**プロジェクト->(プロジェクト)のプロパティ->構成プロパティ->C/C++->追加のインクルードディレクトリ**
に以下を追加

```
C:\boost_1_65_1\include\boost-1_65_1
```

**プロジェクト->(プロジェクト)のプロパティ->構成プロパティ->リンカー->追加のライブラリディレクトリ**
に以下を追加

```
# 32bit用
C:\boost_1_65_1\lib\x86
# 64bit用
C:\boost_1_65_1\lib\x64
```

# 修正
バージョンの記述が間違っておりましたので修正。
ActiveRecord で merge の中で joins を実行すると 挙動が変わる

# 状況
(Rails 5.0.0 にて確認)

```Ruby
class A
  belongs_to :B
end

class B
  has_one :A 
  has_one :C 

  scope :with_c, -> { joins(:c) }
  scope :without_c, -> { left_outer_joins(:c).merge(C.where(id: nil)) }
end

class C
  belong_to :B 
end
```
```
> B.with_c.to_sql
SELECT "bs".* FROM "bs" INNER JOIN "cs" ON "cs"."b_id" = "bs"."id"

> A.joins(:b).merge(B.with_c).to_sql
SELECT "as".* FROM "as" INNER JOIN "bs" ON "bs"."id" = "as"."b_id" LEFT OUTER JOIN "cs" ON "cs"."b_id" = "bs"."id"
```
:thinking: 

```
> B.without_c.to_sql
SELECT "bs".* FROM "bs" INNER JOIN "cs" ON "cs"."b_id" = "bs"."id" WHERE "cs"."id" IS NULL

> A.joins(:b).merge(B.without_c).to_sql
ActiveRecord::ConfigurationError: Can't join 'A' to association named 'c'; perhaps you misspelled it?
from /path/to/activerecord-5.0.0/lib/active_record/associations/join_dependency.rb:231:in `find_reflection'
```
:anger: 

# 質問
INNER JOIN か OUTER JOIN かで致命的に挙動が変わってしまうロジックを書こうとしてるのですが、そういうクエリ内容を安定させたい場合みなさんどうしてるんでしょう？

## 今思いついている解決案
1. 素で使う時と、 merge で使う時に使う scope を使い分ける
    - 使い分けるのだるいし事故りそう
1. まず B の集合を求めて、それから C を求める(クエリを分割する)
    - ケースによっては(今回は両方 has_one なので)　B の集合が小さいのでそれでもいいかな感
1. scope　内のクエリを自分で書く
    - `scope :without_c, -> { joins("LEFT OUTER JOIN cs ON cs.b_id = bs.id").merge(C.where(id: nil)) }` 
    - 動作の安定性では一番な気がするけど、リファクタリングと称して　left_outer_joins(:c)　にあっさり変えられそう。コメント必須。あとeager_loadとかいろいろ混ざって複雑なクエリになるとダメかも。
1. B基準でクエリを組み立てなおす。
    - 要件にもよるけど、 JOIN の階層が深くならずに済むので素直なクエリにでき、挙動の変化に悩まされることもない。Bのリストが取れるが、Aのリストが欲しい場合はBのリストから取りましょうということで。

## 正解？
https://gemnasium.com/gems/activerecord/versions/4.0.0 に

```
The solution is to build JoinAssociation when two relations with join information are being merged. And later while building the Arel use the previously built JoinAssociation record in JoinDependency#graft to build the right from clause. Fixes #3002.
```

と書かれているのですが、 how to build JoinAssociation がわからなかった :angel:
Androidアプリで音量キーを使ったロックパターンを作ってみた。Fragment編

###音量ボタンを使って、5秒以内にコマンドを打ち込むとロックが解除されるコードを書きました。
```
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {

    //音量変更時のコマンドの初期化
    mCommandTime = 0;
    mSuccessCommand = "";

    final View v = inflater.inflate(R.layout.fragment_recording, container, false);

    v.setOnKeyListener(new View.OnKeyListener() {
      @Override
      public boolean onKey(View v, int keyCode, KeyEvent event) {


        if (mCommandTime==0) {
          //一回押されたら5秒後にmCommandTimeが0にリセットされるまではtimerが起動しない
          mCommandTime++;

          final Handler handler = new Handler();
          handler.postDelayed(new Runnable() {
            @Override
            public void run() {
              Log.d(TAG, "5秒経ったからopenPassを初期化");
              mSuccessCommand = "";
              //タイマーがonの時だけ値を文字列(mSuccessCommand)に追加できる
              Log.d(TAG, "5秒経過したからtimerを起動できる");
              mCommandTime= 0;
            }
          }, 5000);

        }else{
          Log.d(TAG,"comandTimeが"+mCommandTime+"で、5秒をすぎてるからtimerは使えない");
        }

        if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP){
          mSuccessCommand=mSuccessCommand+"1";
          Log.d(TAG,"Commandに+1、今のcommandは"+mSuccessCommand);


        }else if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN){
          mSuccessCommand=mSuccessCommand+"0";
          Log.d(TAG,"Commandに+0、今のcommandは"+mSuccessCommand);

        }

        if (mSuccessCommand.equals("01101")) { 
          Log.i(TAG,"life コマンドが解除された");
     
          Toast.makeText(getActivity(), "ロックが解除されました。", Toast.LENGTH_SHORT).show();
          
          //ここでロック解除時の処理をする
      }
    });
    // View#setFocusableInTouchModeでtrueをセットしておくこと、重要
    v.setFocusableInTouchMode(true);
    return v;
  }
}

```
###ここには書いてないんですが、KeyEventは「Down」と「Up」の2回呼ばれるので、「Down」の時だけ入るif文とかを作るといいです。

###個人的には、
今後SNSとかを作ってく中で、音量ボタンのロック解除でアプリの透明具合とか調整したいなーって思ってます。楽しそー
シンプルなPHPの開発環境 on Docker

以前調べたLaradockはよくできているから、それでも良いけれど、もっとシンプルなのがないかなぁと思って調べてみた。

# 個人のどなたかが作ったPHP開発向けのDocker

- [【超簡単】Docker でモダンな PHP 開発環境を作る (PHP, MySQL, PHP-FPM, nginx, memcached) - koni blog](http://koni.hateblo.jp/entry/2017/01/28/150522)
- [GitHub - koni/docker-php-nginx-mysql-memcached: Environment for PHP, PHP-FPM, nginx, MySQL](https://github.com/koni/docker-php-nginx-mysql-memcached/)

コレ、シンプルで良さそう

もっと素な感じのが、こっちかな？
でも、ちゃんとDockerのことを知っていないと、逆に難しそうw

- [Docker for MacでPHPの開発環境を起動する - Qiita](https://qiita.com/reoring/items/933acc80eb55e6855c57)

# PHPDocker

こっちは、ポチポチ、ブラウザで選択するだけで、docker-compose.xmlと各種ミドルウェアのconfigなどを自動生成してくれるジェネレーターで、なかなか良さそうだけど、これを使いこなせるほど、Dockerをまだ理解できていない... orz

- [PHPDocker.io - PHP and Docker development environment generator](https://phpdocker.io/)

# KUSANAGI Runs on Docker

で、KUSANAGIのon Dockerてのがあったので、コレはっ！と思って調べたけれど、どうも、うまくない

- [KUSANAGI Runs on Docker – KUSANAGI](https://kusanagi.tokyo/cloud/kusanagi-runs-on-docker/)

公式の解説が、Docker Toolbox前提で書かれているような気がする...
docker-machineコマンドで、VirtualBoxかAzureにマシンを作成とあるが、Docker for Macはそれが不要なはず... なので、???となってしまった...

- [KUSANAGI RoD をmacに構築 | フリーランス | Engineer-pin-blog](https://www.engineer-pin-blog.com/single-post/2017/07/11/KUSANAGI-RoD-%E3%82%92mac%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [[WordPress] KUSANAGI Runs on DockerでLet’s EncryptのSSL付きマルチサイトを立ち上げる │ revdev](https://revdev.work/c0d3man/posts/ie25vg3snbjo6wh4je7f)

公式以外の構築例を見ても、なんか違和感...

唯一、以下のエントリーでは、docker-machineとmacの仮装技術を識別している風の書き方をしているので、それを参考にすると、たぶん、docker-machineをせずに、ダイレクトにdocker-compose upすれば良いのではないかと思われる。

> MacBookの環境を極力汚さないようにDocker Machineを使いましたが、Mac上でもできます。その場合は、Docker machine上でまで読み飛ばして、Docker MachineをMacに置き換えて進めてください。
> cf. [Mac & Docker MachineでKUSANAGI on Dockerを試す | water color](https://watercolor.wpblog.jp/article/2017-08-18/375#on-dockermachine)

docker-machineをせずに、docker-composeでやってみたんだけど、途中でエラーも出ずに固まった... よくわからなくなったので中断

よくよく調べると、KUSANAGI Runs on Dockerは、WordPressのモードしかサポートしていないので、思っているのと違った...

# まとめ

なので、結局、わかりやすかったのは、Laradockか、何処かの誰かが作成された以下。

- [GitHub - koni/docker-php-nginx-mysql-memcached: Environment for PHP, PHP-FPM, nginx, MySQL](https://github.com/koni/docker-php-nginx-mysql-memcached/)

結果、手順を確立できているLaradockでいっかなぁーってなっている。

# おまけ

## Docker for Mac と Docker Toolboxの違い

- [結局Docker for MacはDocker Toolboxと比べてどこが良いのか - Qiita](https://qiita.com/kmagai/items/a5023bcbae5ae9f4b046)
    - Macの仮装環境 Hypervisor Framework を利用する HyperKitで動く
    - ローカルと仮装の間でファイルの変更を検知できる
- [これからは Docker Toolbox よりも Docker for Mac を使おう - koni blog](http://koni.hateblo.jp/entry/2017/01/28/010643)
    - docker-machineを使わない
PATHは電気羊の夢を見るか


見ませんね
今読んでいる本のタイトルを真似してみました

本記事はLinuxでのPATHの書き込み方法と削除方法についてです！
アンドロイド全然関係ないです！！かっこつけただけです！！！！！！
動作環境は Ubuntu16.04 です！！！！！！！！！！！！！！！！！


##参考資料様
大変お世話になっております。
1 ) <a href="http://yusuke-ujitoko.hatenablog.com/entry/2017/03/10/000000" target="_blank">CUDA 8.0とcuDNN 5.1をUbuntu 16.04にインストールする</a>
2 ) <a href="https://qiita.com/ironsand/items/10e28d7589298090ec23" target="_blank">$PATH から特定のパスだけを削除する</a>



##PATHの書き込み方法
　さぁはりきって書き込んで行きましょーーう！
　PATHの設定はどうやら ~/.bashrc に書き込んでいくようですな！

　ここでは export で
「 /usr/local/cuda-8.0/bin: 」と
「/usr/local/cuda-8.0/lib64:」というPATHを追加しますよ〜

```sh:~/.bashrc
# PATHとLD_LIBRARY_PATHに追加
echo 'export PATH=/usr/local/cuda-8.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc

# .bashrcの読み込み
source ~/.bashrc 
``` 

　PATHがわからない時は、下記を実行してみてね！

例）pythonのPATHを知りたいとき

```
which python
```


　書き込んだあとは書き込みされたか確認してみましょーう

```
echo $PATH
echo $LD_LIBRARY_PATH
```

　以上で書き込みは終了！簡単だね！！




##PATHの削除方法 〜一部削除〜
　PATHの一部削除方法ですよ！追加したら消さなきゃいけなくなる！それが宿命！！！！
　関数を追加して、その関数を利用して消しますよ！考えた人すごいね！！！！！！！！！

　ではでは、関数を追加しましょう


```sh
#削除の関数追加(PATH用)
path_append ()  { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove ()  { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
```


　とうとう削除であります。人生は無常でありますな。盛者必衰でありますな。

```sh
# .bashrcの読み込み？
. ~/.bashrc

#PATH削除
path_remove /usr/local/cuda-8.0/bin:
```

　削除したあとも確認してみましょーう

```
echo $PATH
```

　できた〜〜〜
　LD_LIBRARY_PATHの一部削除方法は軽く調べてみたのですが不明だったので、次項の全削除を行ってください。。。。。。。





##PATHの削除方法 〜全削除〜
　全削除はもっと簡単！

```sh
#全削除
unset PATH
unset LD_LIBRARY_PATH
. ~/.bashrc

#消えたか確認
echo $PATH
echo $LD_LIBRARY_PATH
```
 

　※PATHをunsetで削除するときは気をつけてねー！ほんとに全部消えちゃうからねー！！！
　
　


以上！PATHの書き換え・削除方法でしたー

※11月2日に一部変更しました。altさんご指摘ありがとうございました！
minimistはオプション値に数字を含むと挙動が変わるので注意

Node.jsのコマンドラインツールを今作っているんですが、
引数のオプション処理に、[minimist](https://github.com/substack/minimist)というライブラリを使ってます。

例えばこんなプログラムを書くと、

```js:args.js
const argv = require('minimist')(process.argv.slice(2), {
  alias: {
    u: 'username',
  }
})

console.log('username: ', argv.username)
```

以下の5通りの実行方法で、どれも同じ結果を出してくれます。
便利ですねー。

```shell-session
$ node args.js -uUser1
$ node args.js -u User1
$ node args.js -u=User1
$ node args.js --username User1
$ node args.js --username=User1
username:  User1
```

しかし、 **1文字オプション** かつ **オプション後にスペースを空けない** 場合、
渡す文字列によっては失敗する場合があるのです。

例えばこちら、意図しない挙動になります。

```shell-session
$ node args.js -uAdmin
username:  true
```

試しに`argv`配列全体も出力してみましょう。

```js:args.js
const argv = require('minimist')(process.argv.slice(2), {
  alias: {
    u: 'username',
  }
})

console.log(argv)
console.log('username: ', argv.username)
```

```shell-session
$ node args.js -uAdmin
{ _: [],
  u: true,
  username: true,
  A: true,
  d: true,
  m: true,
  i: true,
  n: true }
username:  true
```

わかりますね？以下の2つは同じ意味になっちゃうのです。

```shell-session
$ node args.js -uAdmin
$ node args.js -u -A -d -m -i -n
username:  true
```

ではなぜ最初の例ではうまくいったかというと、
オプションに渡す文字列に**数字が含まれていたから**です。

```shell-session
$ node args.js -uUser1
{ _: [], u: 'User1', username: 'User1' }
username:  User1
```

「オプションが数字1文字」はあり得ないので、
2文字目以降に数字が含まれる場合に限り、オプション値と見なすようですね。

軽くハマったので、メモでした〜。
gmail > 巨大な画像ファイルありのメール > 返信メニュー(右側)が画面に表示されない > 新規タブで開く

2017年11月2日現在のgmail。

巨大な画像ファイルを添付したメールを受けるとする。
gmailのメール一覧からメールを開くと、右側にある返信メニューが画像のサイズのために画面の外に行く。

メール一覧から`Ctrl + 左クリック`で「新規タブで開く」と、横幅の制限がかかり、右側にある返信メニューが見えるようになるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/56bfdcbb-d392-3d40-8212-45c33c3f2450.png)
composer.jsonのrequireを直接編集してはいけない

Composerで依存関係を追加する際に「`composer.json`を編集して`require`に追加してください」といった作業指示が時折見られますが、それはバッドノウハウです。

## 原則

* 依存関係を追加・削除するときはコマンドラインから
    * `composer require vendor/package` で追加
    * `composer remove vendor/package` で削除
    * `composer require --dev vendor/package` で開発時に必要なものを追加
    * `composer remove --dev vendor/package` で開発時に必要なものを削除
* 本番運用環境と同じバージョン・近い環境で実行する
    * さもなくば、依存パッケージのバージョンを自分で特定しなければならなくなる
* 依存関係をアップデートするときに引数なしで `composer update` **してはいけない**
    * マイナーバージョンを上げるとき： `composer update vendor/package`
    * 最新のメジャーバージョンに上げるとき： `composer require vendor/package`
    * 固定のバージョンに依存するとき： `composer require vendor/package：1.2.3`
        * 強い理由がなければ特定のバージョンには**固定しないでください**
* `composer.json` は `composer v` (validate) でチェックできます

*(それぞれの根拠は気が向いたらちゃんと書きます)*
MAYAのMELいろいろメモ-セパレータ

※Maya MELのメモ。MAYAのバージョンは2017等を使用しています。

# シェルフへのセパレーターの追加
↓これをシェルフに追加する方法。

![separator.jpg](https://qiita-image-store.s3.amazonaws.com/0/183392/3c2ed7ea-7e04-35fd-c401-4f781c7be52d.jpeg)

デフォルト機能では、このセパレータをシェルフに追加するボタンなどは無い。

##### **ボーナスツールを使う**

maya2016あたりから、ボーナスツールをインストールすることで使えるようになる。

ボーナスツールは、公式サイトから無料でDL可能。（オートデスクアカウントが必要）
インストールされると、メニューに項目が追加される。

![BonusTools.jpg](https://qiita-image-store.s3.amazonaws.com/0/183392/e436e278-fc35-1480-9cb2-520fa2805f66.jpeg)

Separator on Shelf を実行すると、今開いているシェルフの最後尾にセパレーターが追加される。
位置を変更したい場合は、シェルフの歯車アイコンから「シェルフエディタ」を選んで編集。

##### **MELに直接書き込む**

MELを直接編集して追加することもできる。
シェルフはMELで記述されており、MELファイルはどこかのフォルダに置かれています。

↓デフォルトで入っているものは概ね下記のあたり。

```
C:\Program Files\Autodesk\Mayaバージョン\scripts\shelves
```

↓自分で作成したものであれば、日本語環境だったらおおむね下記あたり。

```
ドキュメント\maya\バージョン\prefs\ja_JP\prefs\shelves
```

ファイル名は、`shelf_（シェルフ名）.mel`

該当するファイルを開くと、ボーナスツールで追加されたセパレーターは、こんな感じで書かれている。

```
    separator
        -enable 1
        -width 12
        -height 35
        -manage 1
        -visible 1
        -preventOverride 0
        -enableBackground 0
        -style "shelf" 
        -horizontal 0
    ;
```
`-width`　の数字を大きくすると、セパレーターの両側の空間が広くなる。
`-height`　はセパレータの縦の長さ。
他には特に触ることは無さそうですが、`separator`はMAYAのUI全般に使われているコマンドで、見た目のバリエーションも、オプションの種類もいろいろある様子。

ちなみに、デフォルトで使用されているセパレーターは以下のように書いてありました。

```
addShelfSeparator();
```
ボーナスツールで追加されるものと同じセパレーターが、この一行で楽々追加できます。

ちなみに、MELを直接編集した場合、MELファイルを保存しただけでは、シェルフの見た目は更新されません。
MAYAを再起動しても更新されません。
シェルフの歯車ボタンから、一度そのシェルフを「削除」して、次に「ロード」すると、編集内容が反映されたシェルフが表示されます。
Xcode PlaygroundでUnit Testを走らせる

# 概要

iOS開発でUnit Testを書くとき、これはこう書けるかな？と試したいときがあります。
その時は以下のように書くと保存→実行を即時に行えます。

```swift
import UIKit
import XCTest

class ViewController {
}

class ViewControllerTests: XCTestCase {
    func testInitialize() {
        let vc = ViewController()
        XCTAssertNotNil(vc)
    }
}

ViewControllerTests.defaultTestSuite.run()
```

`XCTest`をimportして、テストを実行したいタイミングで`ViewControllerTests.defaultTestSuite.run()`を呼んであげればOKです。

Xcode PlaygroundのConsoleにテスト実行結果が表示されます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/10057/3003b81c-dbfd-fbf2-31ec-6ca66e3bf9da.png)

## 実行環境

* Xcode 9.0
* Swift 4.0
覚え書き Vue.jsでjsonpを使ってみる

htmlコーダーがフロントエンドを学ぶ記録。
まだまだ初心者だから間違えながら覚えていくぞ！

#jsだとapi弾かれがち
vue.jsで簡単なwebアプリが作れるようになり、
apiを試してよくぶち当たったのが
"access-control-allow-origin" 周りのエラー。
jsonpってのを使わないと回避できないクロスドメインのエラーのよう。

でも、vueでjsonpを扱ってる記事って見つからない…。
jqueryはいっぱい出てくるのに！

#vueにもあったjsonp
これだ。
https://github.com/LancerComet/vue-jsonp

vue-cli と 単一ファイルコンポーネントでやってる環境前提で。
まずはインストールしましょう。

```ruby:terminal
$ npm install --save-dev vue-jsonp
```

で、使いたいコンポーネントの中でインポートします

```ruby:hoge.vue
import Vue from 'vue'
import VueJsonp from 'vue-jsonp'
Vue.use(VueJsonp)
```

使い方はざっくりこんな感じのよう。
Vueコンポーネント内だとthisになるのね。

```
Static function: Vue.jsonp(url, dataObj, timeout)
In Vue component: this.$jsonp(url, dataObj, timeout)
```

あとはこんな感じで

```ruby:hoge.vue
data() {
  return {
    jsonData:''
  }
},
methods: {
  getData (apiUrl) {
    this.$jsonp(apiUrl, { keyword: 'キーワード' }).then(json => {
      // Success.
      this.jsonData = json
    }).catch(err => {
      // Failed.
    })
  }
}
```

ってな感じでaccess-control-allow-origin回避できそうです！
いろいろ試してみよ。
Swift 備忘録 その2

# 備忘録その2

## 分割
よくやるプログラム．
2->3へ変わるときに大きく変わったらしいから3->4も変わっている．

- スペースで分割

```
let Str1: String = "book note pen bag"
let Arr1: [String] = Str1.components(separatedBy: " ")

print(Arr1[0])
print(Arr1[1])
print(Arr1[2])
print(Arr1[3])
```

- "/"で分割

```
let Str2: String = "2017/10/9"
let Arr2: [String] = Str2.components(separatedBy: "/")

print(Arr2[0])
print(Arr2[1])
print(Arr2[2])
```

- 猫ちゃんで分割せよ！

```
let charSet = CharacterSet(charactersIn: "🐱")
let animals = "猫🐱魚🐟";
let arr4 = animals.components(separatedBy: charSet)

//へい、わかりゃした。にゃん
print (arr4[0])
print (arr4[1])
```

- 旗の場合

```
let Str3: String  = "分割方法が，Swift2から変わった．よくあることです，はい．"

let StrArray = Str3.characters.split{$0 == ","}.map(String.init)

print(StrArray[0])
print(StrArray[1])
print(StrArray[2])
print(StrArray[3])

let flag = "🇺🇸 🇯🇵 🇫🇷"

let flags = flag.characters.split{$0 == " "}.map(String.init)

print(flags[0]) // "🇺🇸"
print(flags[1]) // "🇯🇵"
print(flags[2]) // "🇫🇷"
```