OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu(WSL)のaptで入れたrubyを消し、rbenvのrubyを使う

aptで入っているrubyを倒してrbenvでrubyのバージョンを管理する。

# 環境
- Windows 10 Home
    - WSL(Ubuntu 18.04 LTS)
- fish shell　><))">

# したこと
## 元のrubyを消す
参考
[Ubuntuに最初から入っているRubyをアンインストールする方法](http://portaltan.hatenablog.com/entry/2015/06/30/160832)

```shell
# パッケージ確認
$ dpkg -l | grep ruby
# 削除(設定もすべて
$ apt purge ruby
# 消えているか確認
$ ruby -v
```
予めrbenvとかで設定をしている場合、この時点でrubyが移行完了。
してない人はまだちょっと続く。

## rbenvのインストール
fishermanが入っていない場合、入れておく。

```shell
# rbenvをclone 
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# fisherでインストール
$ fisher install rbenv
```
## pathを通す
参考
[fish shellでrbenvを使う](https://qiita.com/honeniq/items/6b1362dd32b458ef441e)

fishの設定ファイル読み込み順の関係で、以下の設定は`$XDG_CONFIG_HOME/fish/conf.d/`に置く。
(dotfilesをなるべく共通で使いたいので$XDG_CONFIG_HOMEの設定をしています。とくに記憶になければ`~/.config/`で読み替えてください)
参照先では`000-env.fish`というファイル名にしている。

```:000-env.fish
set -U fish_user_paths $HOME/.rbenv/bin $PATH
```
WSL再起動。sourceしてもok。
rbenvの初期設定

```shell
$ rbenv init
```
返ってきたコマンドを`config.fish`に記述して、WSL再起動かsource。

## rubyのインストール
これでrbenvが使えるので、rubyを入れる。

```shell
# 入れられるバージョンの確認
$ rbenv list
# インストール。今回は2.6.1。
$ rbenv install 2.6.1
# 使うバージョンを指定
$ rbenv global 2.6.1
# rubyのバージョン確認
$ ruby -v
```
インストールは10分ぐらいかかる。しくじったかと思ったらそんなもんらしい。
env系を使うのが初めてだったので、globalせずにすったもんだしてしまった。

おわり。
【Unity2D】Physics2D.Raycast利用時に真下にレイを飛ばすやりかた

#レイキャストを使う時に詰まった所
個人的に詰まった箇所をメモ。
プレイヤーの真下にレイを飛ばして、特定のタグの付いたオブジェクトがあればその座標を算出するプログラムです。ミスタードリラー的なゲームを作るのに役立つかも。

#参考:プレイヤーアタッチしているもの
```ruby:Player.cs
        Vector2 StartPosition = transform.position;
        Vector2 EndPosition;

        //移動判定用　衝突するレイヤーはすべて入れる
        int LayerObject = LayerMask.GetMask(new string[] { "Chara", "Wall", "Block" });
        //自身の衝突判定を無くしてPhysics2Dの誤確認を無くす
        boxCollider.enabled = false;
        //Raycastで下方向に特定タグの付いたオブジェクトが無いかを検出
        RaycastHit2D HitObject = Physics2D.Raycast(StartPosition, Vector2.down, 10, LayerObject);
        //衝突判定を戻す
        boxCollider.enabled = true;
        //下方向の空白のスペースの深さ
        int Depth = -(int)HitObject.distance;
        //HitObject.distanceは検出したオブジェクトの長さ
        EndPosition = StartPosition + new Vector2(0, Depth); ;
```
RaycastHit2D オブジェクト名= Physics2D.Raycast(始まりの座標, レイの方向, レイの長さ, 衝突するレイヤー);
上のようなイメージで特定の座標からレイ（光線）を飛ばして、最初にぶつかったものの情報を取得してくれています。下方向に飛ばすのにはVector2.downを使えば良い。


#最初に書いていた駄目なプログラム
```ruby:駄目だったプログラム
        Vector2 StartPosition = transform.position;
        Vector2 RayPosition = StartPosition + new Vector2(0, -1);
        Vector2 EndPosition;

        //移動判定用　衝突するレイヤーはすべて入れる
        int LayerObject = LayerMask.GetMask(new string[] { "Chara", "Wall", "Block" });
        //自身の衝突判定を無くしてPhysics2Dの誤確認を無くす
        boxCollider.enabled = false;
        //Raycastで下方向に特定タグの付いたオブジェクトが無いかを検出
        RaycastHit2D HitObject = Physics2D.Raycast(StartPosition, -Vector2.up, 10, LayerObject);
        //衝突判定を戻す
        boxCollider.enabled = true;
        //下方向の空白のスペースの深さ
        int Depth = -(int)HitObject.distance;
        //HitObject.distanceは検出したオブジェクトの長さ
        EndPosition = StartPosition + new Vector2(0, Depth); ;
```
Vector2 RayPosition でレイの向いている方向を定義しているが「StartPosition + new Vector2(0, -1);」では斜め下にレイが向いてしまい変なオブジェクトを取得していました。
Windows7環境でKubernetesを使えるようにする

# 概要
* Windows7のPCをKubernetesが使えるようにします。
* VirtualBoxが既にインストールされていることを前提とします。
* Docker for Windowsが既にインストールされていることを前提とします。
* minikube(ローカル環境で動作可能なKubernetes)が既にインストールされていることを前提とします。
* kubectl.exeが既にダウンロードされていることを前提とします。

# Kubernetesクラスタの作成
* VirtualBoxに対してハイパーバイザを構築
*  
```postgres:cmd
minikube config set vm-driver virtualbox
```


* Kubernetesクラスタの作成
* 
```postgres:cmd
minikube start
```

* 確認
* 
```postgres:cmd
minikube status
```

* ダッシュボードを起動する
* 
```postgres:cmd
minikube dashboard
```

# デプロイ（Podの作成）
* **deployment.yml作成**
* 
```yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 2  
  template:
    metadata:
      labels:
        app: deployment
    spec:
      containers:  
      - name: nginx
        image: ubuntu
      - name: myapp
        image: ubuntu
```

* **deployment.ymlをminikube.exeが格納してあるディレクトリに格納**

* **ymlの内容を登録（Podのデプロイ、起動）**
* 
```bash
kubectl apply -f deployment-sample.yml
``` 

# 参考資料
[Qiita:ローカル環境（Win7）でKubernetesを動かす](https://qiita.com/mochimoching/items/a709543050329953fee0)
[Qiita:windows7にDockerをインストールした手順まとめ](https://qiita.com/witchy/items/99235291a6bd5fdee054)

# まとめ
* Windows7のPCをKubernetesが使えるようにする手順を紹介しました。
React NavigationのBottomTabNavigatorのLabelを空にする

少しハマったのでメモ程度に..

# 動かなかった例

```
HomeStack.navigationOptions = {
  tabBarLabel: "",
  tabBarIcon: // icon
};

```

とか

```
HomeStack.navigationOptions = {
  tabBarIcon: // icon
};
```

# よい例

```
HomeStack.navigationOptions = {
  tabBarLabel: () => {
    return null;
  },
  tabBarIcon: // icon
};
```

こうするとlabelは非表示になり、Iconのみ表示されます。
* label分のスペースも消えるので、labelありと無しが両方あると変な見た目になるよ！
【AtCoder】CODE FESTIVAL 2016 Final C - Interpretation

# CODE FESTIVAL 2016 Final C - Interpretation

# 問題概要
[C - Interpretation](https://atcoder.jp/contests/cf16-final-open/tasks/codefestival_2016_final_c)

# 解法
愚直に全ての人の間に辺を貼ろうとすると$O(N^2)$となるため間に合わない。そこで、人$i$と言語$L_{ij}$の二部グラフを作り、人$i$が話せる言語$L_{ij}$に対して辺を貼る。このグラフにおいて、全ての人が連結であれば答えはYES、連結でなければ答えはNO。連結判定にはUnionFind等を使えばよい。計算量は$O(N + M)$で十分高速である。

# ソースコード
```cpp
#include <bits/stdc++.h>

using namespace std;

#define llong long long int
#define ldouble long double
#define rep(i, n) for (int i = 0; i < n; ++i)
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define stl_rep(itr, x) for (auto itr = x.begin(); itr != x.end(); ++itr)

const static llong MOD = 1000000000 + 7;
const static llong INF = 1LL << 60;
const static double eps = 1e-6;
const static int dy[] = {0, 1, 0, -1};
const static int dx[] = {1, 0, -1, 0};

template<typename T> T my_gcd(T a, T b) {
    return (a ? my_gcd(b % a, a) : b);
}

template<typename T> T my_lcm(T a, T b){
	return a * b / my_gcd(a, b);	
}

template<typename T> struct UF {
    vector<int> par;
    vector<T> sz;

    UF(int n) {
        par.resize(n);
        sz.resize(n);
        for (int i = 0; i < n; ++i) {
            par[i] = i;
            sz[i] = 1;
        }
    }

    int find_root(int x) {
        return par[x] == x ? x : par[x] = find_root(par[x]);
    }

    bool same(int x, int y) {
        return find_root(x) == find_root(y);
    }

    void unite(int x, int y) {
        x = find_root(x);
        y = find_root(y);
        if (x == y) return;
        
        if (sz[x] < sz[y]) swap(x, y);
        sz[x] += sz[y];
        par[y] = x;
    }

    T size_of_tree(int x) {
        return sz[find_root(x)];
    }
};

signed main (int argc, char *argv[]) {
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n, m;
    cin >> n >> m;
    UF<int> uf(n + m);
    rep(i, n) {
        int k;
        cin >> k;
        rep(j, k) {
            int l;
            cin >> l;
            uf.unite(l - 1, m + i);
        }
    }

    bool flag = true;
    rep(i, n - 1) {
        if (! uf.same(m + i, m + i + 1)) {
            flag = false;
            break;
        }
    }

    if (flag) cout << "YES" << endl;
    else cout << "NO" << endl;
}
```
pythonでheatmap(color map)のgif動画を作成

カラーマップのgif動画を作成するときにはまったので投稿．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/355593/56a2e5af-61d7-cd16-9c62-b4012b4d236a.gif)


## ポイント
pythonで動画を作成する際には大きく分けて2つの方法がある．
1つ目が画像を生成・配列格納を行いつつ，最終的にレンダリングする方法．2つ目が最初に画像を保存し，それらの画像をレンダリングする方法．

前者は計算のろかったので，後者を採用．その際にはまった点を重点的に記述．

ちなみにレンダリングの方法は[ここ](https://qiita.com/hiro9/items/222bea3e77dfed235f0a)を参照した．

## カラーバーが変になる問題
最初に取り組んだ際に生じたのが，カラーバーが複数個画像に載ってしまう現象．更に実行速度が極端に落ちた．

前のプロットをそのまま引き継いだがためのメモリ消費以外ありえないと感じたので，まずは前のプロットを消去する方法を考えた．結論から言うと，「plt.figure()」を挟むことによって解決した．

また，カラーバーの上限と下限を固定したかったので，あらかじめカラーバーの設定を入れることにした．

```py
def plot_heatmap(x, y, dt, level):
  # x, yのメッシュとdt, color barの設定level
  # は不変なので，最初に関数内に保持し，
  # 後に変数のtだけ代入して画像を生成する関数_impを
  # 返す．

  def _imp(t):
    # 前のplotの消去
    plt.figure()

    # カラーマップ取得
    contourf = plt.contourf(x, y, f(x, y, t * dt), level)

    # カラーバーの生成
    plt.colorbar(contourf)

    # 画像の保存
    plt.savefig("test/figure{}.png".format(t))

  return _imp
```

## コード全容
その他の部分は特に問題なし．
上のgif動画は下のコードを実行することで得ることが可能．
ちなみに今回は単純な関数で動画生成を行ったが，実際にはあらかじめcsvにデータをとりためて，それらを行列データとしてimportしたのちにメッシュに区切ったx,yと対応付けた関数として扱った．

その際に使用したコードは[こちら](https://github.com/nabenabe0928/Test/blob/master/poisson_equation/visualize_magnetic.py)．

```py
import numpy as np
import matplotlib.pyplot as plt
import os
from PIL import Image, ImageDraw

def rendering():
  path = os.getcwd() + "/test/"
  files = [path + "figure{}.png".format(t) for t in range(len(os.listdir(path)))]
  images = list(map(lambda file: Image.open(file), files))
  images.pop(0).save("test.gif" ,save_all = True, append_images = images, duration = 100, optimize = False, loop = 0)

def f(x, y, t):
  return np.cos(np.sqrt(x ** 2 + y ** 2) + t)

def plot_heatmap(x, y, dt, level):
  def _imp(t):
    plt.figure()
    contourf = plt.contourf(x, y, f(x, y, t * dt), level)
    plt.colorbar(contourf)
    plt.savefig("test/figure{}.png".format(t))

  return _imp

def make_savedir():
  if not os.path.isdir("test"):
    os.mkdir("test")

if __name__ == "__main__":
  # 定義域を決定
  x_min, x_max, y_min, y_max = -5, 5, -5, 5

  # 各軸の分割数を決定
  num = 50
  
  # 時間ステップの進む速さと終了ステップ数を決定
  dt = 0.1
  T = 20

  # 画像を保存するディレクトリを作成
  make_savedir()
  
  # x, yのグリッドを作成
  x, y = np.meshgrid(np.linspace(x_min, x_max, num), np.linspace(y_min, y_max, num))

  # 関数値の取る最大，最小値を設定
  f_min, f_max = -1, 1

  # 等高線の上限・下限と分割数を設定
  level = np.linspace(f_min, f_max, 10)

  # タイムステップを代入することによって，そのときの画像を
  # 生成する関数が返ってくる．
  img_creation = plot_heatmap(x, y, t_array, level)
  
  for t in range(T):
    img_creation(t)

  # できた画像をレンダリングして動画にする
  rendering()
```
【AtCoder】CODE FESTIVAL 2017 Final B - Palindrome-phobia

# CODE FESTIVAL 2017 Final B - Palindrome-phobia

# 問題概要
[B - Palindrome-phobia](https://atcoder.jp/contests/cf17-final-open/tasks/cf17_final_b)

# 解法
長さ2以上の回文を部分文字列として含ませないためには$S$を$abcabc\cdots$と並べ替えれば良い。
判定であるが、$S$における各文字の出現回数が等しければYES。そうでない場合は各文字の出現回数の最大値と最小値の差が2未満であればYES。これら以外はNO。時間計算量は$S$の長さを$N$として$O(N)$。

# ソースコード
```cpp
#include <bits/stdc++.h>

using namespace std;

#define llong long long int
#define ldouble long double
#define fore(i, n) for(auto &i : n)
#define rep(i, n) for (int i = 0; i < n; ++i)
#define repr(i, n) for (int i = n; i >= 0; --i) 
#define stl_rep(itr, x) for (auto itr = x.begin(); itr != x.end(); ++itr)
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()

const static int mod = 1000000000 + 7;
const static int inf = INT_MAX / 2;
const static llong INF = LLONG_MAX / 2;
const static double eps = 1e-6;
const static int dx[] = {1, 0, -1, 0};
const static int dy[] = {0, 1, 0, -1};

template<class T> bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T> bool chmin(T &a, const T &b) {
    if (b < a) {
        a = b;
        return 1;
    }
    return 0;
}

void solve();

signed main (int argc, char *argv[]) {
    cin.tie(0);
    ios::sync_with_stdio(false);

    solve();
    
    return 0;
}

void solve() {
    string S;
    cin >> S;
    map<char, int> M;
    M['a'] = 0;
    M['b'] = 0;
    M['c'] = 0;
    const int n = S.size();
    rep(i, n) ++M[S[i]];

    if (M['a'] == M['b'] && M['b'] == M['c'] && M['a'] == M['c']) {
        cout << "YES" << endl;
    } else {
        int max_cnt = -1, min_cnt = inf;
        rep(i, 3) {
            chmax(max_cnt, M['a' + i]);
            chmin(min_cnt, M['a' + i]);
        }

        if (max_cnt - min_cnt >= 2) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
}
```
XAMPPにPhalconを入れる時の注意【mac】

おはようございます。

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている者です。

今回はXAMPPにPhalconを入れるときの注意点について紹介します。

##Homebrewとは
まず、macを使用している場合、Homebrewをインストールしておくと非常に便利。これはプログラミング上で必要となってくるパッケージをインストールしたり、アンインストールしたりできるようなパッケージ管理システムである。これをインストールしておけば、便利なアイテムのダウンロードが簡単にできる。
[Homebrew公式サイト](https://brew.sh/index_ja)

##Homebrewを使ってPhalconをインストール

よくphalconのインストール方法を調べた時、下記のようなコードが出てくる。

```
$brew tap homebrew/dupes
$brew tap homebrew/versions
$brew tap homebrew/php
$brew install php56 php56-phalcon
```

しかし、2019年３月4日の時点ではこれらのコードは推奨されておらず、使えない。もしこれらのコードを実行した時、下記のようなエラーがでる。

```
$ brew tap homebrew/dupes

Error: homebrew/dupes was deprecated. This tap is now empty as all its formulae were migrated.

$ brew tap homebrew/versions

Error: homebrew/versions was deprecated. This tap is now empty as all its formulae were migrated.

$ brew tap homebrew/php

Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```

また、下記のサイトによると、phalcon4からはphp7のみのサポート予定なので、php5.5は廃止される。そのため、php7を使用した方が良い。

https://docs.phalconphp.com/3.3/en/installation

そのため、homebrewを使用してphalconをインストールする場合、

```
$ brew tap tigerstrikemedia/homebrew-phalconphp
```
としてあげる。そして、php7.2なので

```
$ brew install php72-phalcon
```
これでphalcon3.4.2がインストールされた。

##phalconをxamppに結びつける
phalconをインストールすると`phalcon.so`というファイルが作られる。インストール先を探すためには`find`コマンドを使用する。

```
$ sudo find / -name phalcon.so
```
そうすると、インストール先が表示される。

```
$ sudo find / -name phalcon.so

/usr/local/Cellar/php72-phalcon/3.4.2/phalcon.so
```

この`phalcon.so`を`php.ini`に設定する。
設定の仕方は`php.ini`ファイルに`extention`を設定する。
`extention`とはphpの機能を拡張するためのモジュール。`php.ini`でphpの起動時にその拡張機能を読み込むことができる。
`php.ini`は`Applications/XAMPP/xamppfiles/etc/`にある。
`php.ini`に`phalcon.so`を追記。

```/Applocations/XAMPP/xamppfiles/etc/php.ini

;Phalcon
extension = /usr/local/Cellar/php72-phalcon/3.4.2/phalcon.so
```

これを追記した後、サーバーを再起動する。
再起動の方法はApache Web Serverをrestartするだけで良い。

##確認方法
phalconがXAMPPに結びついたか確認するには、phpinfoのページで確認する。
手順はまず、
サーバーを起動→localhostでxamppのページを表示→上の欄にあるPHPInfoを開く→`command + f`でphalcontと調べて、下記の様に表示されれば無事にphalconとxamppが結び付けられている。

 phalcon
Web framework delivered as a C-extension for PHP

| phalcon      | enabled    |
|:-----------------|------------------:|
| Author            |              Phalcon Team and contributors |
| Version            |             3.4.2 |
| Build Date            |             Mar 5 2019 13:11:21 |
| Powered by Zephir            |             Version 0.10.14-975ad02db4|

####まとめ
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！

###参考資料
https://qiita.com/f_uto/items/7385cf3e97871577522d
https://qiita.com/Naggi-Goishi/items/391b374305bc41b0d9f3
https://qiita.com/33yuki/items/8621a476533767ccb1c4
https://docs.phalconphp.com/3.3/en/installation
nm + grep でライブラリのシンボルを見つけるときの tips

## 解決したいこと

C/C++ で link 時に undefined symbol になるが, どのライブラリ(.a/.so)に symbol の定義があるか調べたい
(LLVM みたいにライブラリがたくさんあるなど)
 

```
nm *.so | grep SYMBOL 
```

とするととりあえず symbol 名が *.so にあるかはわかるが, どの .so に定義されているかわからない.

## 解決方法

`-A` オプションでファイル名を表示することができます.

```
nm -A *.so | grep SYMBOL
```

## TODO

nm ではない方法でシンボルを見つける方法がないか調べる.
ブレッドボードに5.0V供給する その2

#はじめに
本記事を試す場合は自己責任でお願いします。
前回はワニ口クリップから5.0V供給しました。
今回は「ブレッドボード用マイクロBメスUSBコネクタDIP化キット」というキットを使って5.0V供給しました。

#使用機器
 - ブレッドボード
 - ジャンパーワイヤー
 - 抵抗 1kΩ
 - LED
 - ブレッドボード用マイクロBメスUSBコネクタDIP化キット
 - スマホ用充電器 (マイクロUSB typeB)

![IMG_20190312_155956.jpg](https://qiita-image-store.s3.amazonaws.com/0/246294/d2f7ff3a-c7ed-37be-643f-0f0ace1953d1.jpeg)
↑ ブレッドボード用マイクロBメスUSBコネクタDIP化キット(はんだ付け済)

#回路
![IMG_20190312_160346.jpg](https://qiita-image-store.s3.amazonaws.com/0/246294/0387dd7e-3ffd-11ea-a608-584d9f3f537c.jpeg)
コンセントにさすと光ります。
![IMG_20190312_160400.jpg](https://qiita-image-store.s3.amazonaws.com/0/246294/5b20948b-1cd5-460b-3178-36f27321adfe.jpeg)

#おわりに
DIP化キットは素晴らしい。

#日記一覧へ
[ロジックIC日記 一覧](https://qiita.com/C_Assembly/items/fa1e78643e7a52fe9e4b)
2019-03-12 C++ Builder 10.2 Tokyo > IDE > スクロールが遅い > 対処: Page Up, Page Downを使う | Windows10: No smooth scrolling on Windows 10 

```txt:動作環境
C++ Builder 10.2 Tokyo (Update 3)
Windows 10 v1809
8GB メモリ
```

### エディタのスクロールが遅い

IDEのエディタのスクロールが遅い。
マウスのホイールでの操作時。

- Windows 7 + XE4: 0.5秒
- Windows 10 + 10.2 Tokyo: 5秒

### 対処

とりあえず、Page Up, Page Downキーを使う。

根本解決方法は不明。

### 備考

- 同じWindows10において、秀丸エディタ(v8.79)でのスクロールは遅くはない (0.5秒)
- エディタのスクロール以外にも遅いものがある
    - FormShow時の描画
        - 各コンポーネントの描画が分かるほど遅い
            - 300msec程度の遅延
        - 10.2 Tokyoでビルドした.exeをWindows7で実行すると遅くはない
            - Windows 10の問題か?
        - 2019-03-12
            - Windows Update適用後に改善したかもしれない
            

### 関連情報?

- No smooth scrolling on Windows 10
    - https://superuser.com/questions/956381/no-smooth-scrolling-on-windows-10
    - Windows 10でスクロールがスムーズでなくなったとのこと
    - 日本語版Windows10では「リストボックスを滑らかにスクロールする」
        - Windows 10 v1809
    - **このチェックを外してみたが、効果はなかった**
docker上のubuntu16.04で32bit版パッケージをインストール

docker上のubuntu16.04で32bit版のパッケージをインストールしようとしたときにハマったので備忘録を残す。

# ハマったこと

docker上にubuntu16.04で開発環境を作るため、32bit版のパッケージをインストールしようとしたらこうなった。

```
root@a9e3a8eaf47d:/# apt-get install -y mtd-utils:i386
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package mtd-utils:i386
```

パッケージが見つからないよ！とエラーが出る。

# 解決策

dpkgでマルチアーキテクチャを有効にしてやればいけた。
参考にしたサイト：https://akrabat.com/installing-32-bit-packages-on-ubuntu-14-04/

```
root@a9e3a8eaf47d:/# dpkg --add-architecture i386
root@a9e3a8eaf47d:/# dpkg --print-foreign-architectures
i386
root@a9e3a8eaf47d:/# apt-get update
root@a9e3a8eaf47d:/# apt-get install -y mtd-utils:i386
```
ASP.NET > GraphQL



NuGetの追加 → GraphQL

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/85e60010-0d50-da6b-6f9e-afc2ced1c895.png)


[graphql-dotnet/examples](https://github.com/graphql-dotnet/examples)



# startup.cs

```csharp
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{

    services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
    var sp = services.BuildServiceProvider();
    services.AddSingleton<ISchema>(new VivaSchema(new FuncDependencyResolver(type => sp.GetService(type))));
}
```

# Models

## Sckema


```csharp
using GraphQL;
using GraphQL.Types;

namespace NHLStats.Api.Models
{
    public class NHLStatsSchema : Schema
    {
        public NHLStatsSchema(IDependencyResolver resolver): base(resolver)
        {
            Query = resolver.Resolve<NHLStatsQuery>();
            Mutation = resolver.Resolve<NHLStatsMutation>();
        }
    }
}
```


## Query



## Mutation


## IPlayerRepository


## PlayerType



## 

```
query NHLStatsQuery($id: Int!){
  player(id: $id){
    id
  }
}
```




## PlayerRepository
Hexo備忘録

# はじめに

Hexoでポートフォリオサイトを作っているのですが、毎回コマンドやら設定やらを忘れるので、メモ程度に残しておきます。

# Hexoとは

Jekyllみたいな静的サイトジェネレータ

Node.js製なので、すべてJsで完結する。
中国人利用者が多いイメージ

# 基本操作

### サーバーを立ち上げる

```console
$ hexo server(s)
```

### 記事を作成

```sh
hexo new(n) [layout] "marumaru"
```
| layout       |       説明 |  
|:-----------------|:------------------|
| post             |              記事|
| page           |            固定ページ |
| draft             |              下書き |


### ブログの静的ファイルをpublicフォルダに生成する

```console
$ hexo generate(g)
```

### デプロイ

```console
$ hexo deploy(d)
```

### 静的ファイルの生成とdeploy一気にやる

```console
$ hexo deploy -g
```

# 投稿の削除方法
コマンドでは削除不可能

* source/_postファイル内の削除したい投稿を削除する
* キャッシュファイル(db.json)とpublicファイルを削除。

```console
$ hexo clean
```
* ブログの静的ファイルをpublicフォルダに生成する

```console
$ hexo generate
```
* deploy

```console
$ hexo deploy
```

# Markdownのヘッダに記載するメタ情報について(Front-matter)
こういうの

```yaml
---
title: marumaru
date: 2015-08-01 00:00:00
tags: works
toc: true
photos : marumaru.png
---
```

| setting       |       説明 |  
|:-----------------:|:------------------:|
| title             |              タイトル|
| date           |            作った日にち |
| tags             |              タグ|
|photos|トップページに画像を出したいときに使う|

くわしくは…[公式リファレンス](https://hexo.io/docs/front-matter.html)

## toc
目次のありなしを設定する。
たぶん`hexo-toc`を入れないと使えないとおもう…忘れました

# Githubでバックアップとりながら、GithubPagesにdeployする

masterブランチでプロジェクト全体を管理しながら、gh-pagesブランチにdeployする

* 普通にプロジェクト全体をgit管理する
* コミットする
* Githubでリモートリポジトリを作成し```git remote add origin marumaru.git```でリポジトリを追加する
* プッシュする

* `_config.yml`を書き換える

```yaml
deploy:
  type: git
  repo: git@github.com:fogefoge/fogefoge.git　#originのリモートリポジトリ
  branch: gh-pages #ここ
  message: update
```
* そのまま`hexo deploy`するとgh-pagesブランチがローカルでもリモートでも作られる

# 参考文献

* [所要時間3分!? Github PagesとHEXOで爆速ブログ構築してみよう！](https://liginc.co.jp/web/programming/server/104594)
* [Hexo コマンド](http://hatobane.github.io/hexo/hexo-command/)
* [hexoで投稿を削除する方法](https://codeday.me/jp/qa/20190220/297930.html)
* [HexoブログをGitHubでバックアップ取りつつGitHub Pagesで公開もする](https://tech.qookie.jp/posts/hexo-deploy-github-pages-backup-version/)
PHP&HTML&JS <A>タグを他のform項目とまとめてPOST後、取得する方法（例：ページング処理）

```sample.php
<?php

    // 1頁当たりの表示件数
    const CON_ONE_PAGE_NUM = 100;

    // ■入力値取得：検索キーワードテキストボックス
    $get_act_name = filter_input(INPUT_POST,'act_name');

    // ■入力値取得：ページ番号を取得
    $get_page     = filter_input(INPUT_POST,'page',FILTER_VALIDATE_INT);
    if (empty($get_page)) {
        // パラメータ無し時は1頁目が選択された事とする
        $get_page = 1;
    }
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
function selectedPage( page ) {
    document.form1.page.value=page;
    document.form1.submit();
}
</script>
</head>
<body>

<form  method="post" name="form1" action="sample.php">
    女優名<input type="text" name="act_name" value="<?php echo $get_act_name; ?>" />
    <input type="submit" value="検索">
    <div>
        <!-- ここはPHP処理で(1頁の表示件数 / 全体件数)分だけ以下Aタグを生成すればいい -->
        <a href="" onclick="selectedPage(1);return false;">1ページ</a>
        <a href="" onclick="selectedPage(2);return false;">2ページ</a>
        <a href="" onclick="selectedPage(3);return false;">3ページ</a>
        <a href="" onclick="selectedPage(4);return false;">4ページ</a>
        <input type="hidden" name="page" value="">
    </div>
</form>

<?php echo $get_page; ?>ページを選択しました（←目的の箇所）

<p>ページ番号のリンク押下でも検索フォームの値を維持しながら選択したページ番号を取得するサンプル</p>
<p>この後"$get_page" を検索開始位置のoffsetに使用すれば２頁目、３頁目を表示するといった制御が可能</p>

<?php
    // 開始行位置・終了行位置　offset算出
    $num_record_start = ($get_page - 1) * CON_ONE_PAGE_NUM + 1; // 表示したい開始レコード行位置
    $num_record_end   = $get_page * CON_ONE_PAGE_NUM;       // 表示したい終了レコード行位置
?>

</body>
</html>
```

Qiita初投稿になります宜しくお願いします。長い事プログラムはやっていますがもっぱらsql周りでPHP等のweb周りの言語はまだ始めて間もない事もあり
おかしな部分がありますがご容赦下さい。むしろ指摘下さるとありがたいです。

PHPで検索項目を任意の数だけ設け、その結果件数に応じた頁リンクをずらずらと並べた場合に
入力された検索項目内容を維持しながらどうにか頁番号をAタグから同時に渡せないかと調べていたところ javascriptを利用して押されたリンク内容をpostでまとめて送信する
となんとか形になったサンプルです。

なにせHTML等の知識が古い情報でとまっています、PHPについてはまだ3日分しか知識がありません。
なので同機能をもっとシンプルにスマートにする記述がありましたら教えていただければと思います。 
jQuery等を使えばもっとスマートにできるのかな？

※dmmのWEB APIを使ってえっちな検索システムを作ろうとしたのが発端です。

動作環境：Windows 10 Pro & XAMPP Version: 7.3.2
感嘆符の備忘録

感嘆符について自分自身の備忘録として残しておきます。
## 論理演算子（！）
条件式の前に「！」を付ける
条件式を否定する
ex)
aがfalseの場合true
!a  #-> true

## 二重感嘆符（!!）
返り値をtrueかfalseにする
ex)
!nil             #=> true
!!nil            #=> false
!!(false && nil) #=> false
!!(nil && nil)   #=> false

## 例外を発生させる(create!)
- createやsaveに「！」を付ける
メソッド名に`!`がついてるものは失敗時に例外を発生させる
メソッド名に`!`がついてるものは失敗時にnilを返す
`rescue`で拾える
service内ではrescueしてエラーセットしてコントローラでエラーを元にrenderしてる

## find_byに「！」を付ける(find_by!)
`find_by!`だとnotfoundのexceptionが発生する
`find_by`で見つからない場合は返り値nil

## 比較演算子(hoge != foo)
a != b #aとbが等しくない
[OCI]Windows OS から  OCI File Storage Serviceのマウント

Windows OS から  OCI File Storage Serviceのマウント

OCIのPrivate IPアドレスに通信できるWindows Server 2008 R2, 2012 R2, 2016から OCI File Storage Service にマウントが可能ということで
Windows Server 2016 Standard Editionから試してみた。

#事前準備
####File Storage Serviceとマウントターゲット、Exportsを作成
####セキュリティリストの設定
File Storage Serviceが属しているSubnetのセキュリティリストにWindows Serverが属しているネットワークセグメントからの通信を許可する

- TCP Source Port Range:ALL,Destination Port Range:2048-2050
- TCP Source Port Range:ALL,Destination Port Range:111
- UDP Source Port Range:ALL,Destination Port Range:2048
- UDP Source Port Range:ALL,Destination Port Range:111

#Windows Server 2016での作業
###Windows PowerShellを 管理者として実行

`Start-Process powershell -Verb runAs`

###NFS Clientの入手

`Install-WindowsFeature -Name NFS-Client`
###レジストリの確認（AnonymousGid、AnonymousUid をrootユーザに設定）
レジストリエディタ(regedit)を開き
HKEY_LOCAL_MACHINEのSoftware\Microsoft\ClientForNFS\CurrentVersion\Defaultを開く
AnonymousGidおよびAnonymousUidの値が0にセットされていることを確認
（存在しない場合は新規＞DWORD (32 bit) 値から作成）
###NFS Clientの再起動
コマンドプロンプトを 管理者として実行

`nfsadmin client stop`

`nfsadmin client start`

###File Storageをマウント
コマンドプロンプトを（管理者としてではなく）通常に実行
File StorageのIPアドレス、ExportとマップするWindowsドライブレターを指定してマウント

`mount 10.x.x.x:/fs-export-path X:`

以上でWindowsOSからドライブとして利用可能になった。
サーバーサイドエンジニアがVuetifyで良い感じのポートフォリオを作ってみた

# はじめに
普段はサーバーサイドを中心に業務を行なっており、PythonやGoを中心に使っています。
クラウド大好きで、デザインが苦手でBootstrapに頼ったりするタイプです。

唐突にポートフォリオを作りたくなったので、どう作るか考えました。
CSSはなるべく書かない方向で行きたい...

（ちなみにQiita投稿は2年ぶりくらい)

## 良い感じのCSSフレームワークを探す
ありました。
VuetifyというMaterial Designのコンポーネントのフレームワークです。
React.jsのMaterialUIみたいな感じ。
[公式サイト](https://vuetifyjs.com/ja/)

そんなわけで、のんびりポートフォリオを作りました。
レイアウトの考案も含めて所要時間７時間くらいです。

# 完成物
[こんな感じです](https://canon11.github.io/portfolio/)
![スクリーンショット 2019-03-12 15.41.58.png](https://qiita-image-store.s3.amazonaws.com/0/154121/23a52b50-07d3-a297-eb8f-3508beccd9ab.png)

## アイキャッチ
ページに行くと、まずはタイピングのアイキャッチが現れます。
タイピングのアニメーションは、iTyped.jsを使いました。
めちゃめちゃ簡単にタイピングアニメーションが実装できます。
[公式サイト](https://github.com/luisvinicius167/ityped)

## プロフィール以降
基本的にVuetifyのコンポーネントのみで実装してます。

```Profile.vue
<v-card class="px-2 py-2">
  <div class="display-1 font-weight-regular text-xs-center font-italic">Skills</div>
  <div class="text-xs-center">
    <div v-for="(skill, index) in skills" :key="index">
      <div class="title font-weight-light font-italic mt-3 mb-1">{{ skill.title }}</div>
      <v-chip
       outline
       color="primary"
       v-for="(content, index) in skill.contents"
       :key="index"
      >{{ content }}</v-chip>
    </div>
  </div>
</v-card>
```
こんな感じで、ひたすらVuetifyに用意されたコンポーネントと、クラスを使います。
<code>v-chip</code>とかは使いどころによっては良い感じの見栄えになりそうです。
上記のコードで下記のようなコンポーネントが作れます。
![スクリーンショット 2019-03-12 15.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/154121/048b00f5-bcfe-c48d-5997-0570aca6256f.png)

# さいごに
Material Designをポートフォリオに使う例はあまり聞いたことがありませんが、組み合わせ方によってはポートフォリオでも十分使える印象でした。
そしてデザインが苦手な自分にとっては、パーツを組み合わせるだけで良い感じのサイトが作れてしまうのはやっぱり強いなと...

ソースコードは[こちら](https://github.com/Canon11/portfolio)を参照ください。
GitHub上でのコンフリクト解消の注意点

* GitHubのプルリクからWebのGUI上でコンフリクトの解消が出来る
* ただ、これ改行コードがLFに統一される様子（CRLFのソースを修正したらLFになっていた）
* 改行コードに何かしらの意思がある場合は、GUI上でやらないほうが良いか？（いい方法ご存知でしたら、コメント下さい！！）
[RSpec] 特定の spec / context でのみモジュールを include したい場合の実装と検証

## 背景
下記の2点の要件があるテストを書こうとした
1. 特定の `feature` / `context` / `describe` ブロック内のみ `ActiveJob::TestHelper` を include して有効化したい。
2. そのブロック内でのみテスト対応した `queue_adapter` (`:test`アダプタ?) を利用し、それ以外ではデフォルト (当方の環境では `:delayed_job`) のままにしておきたい

## 問題
そこそこの規模のプロジェクトでテスト書いていたら、どこかで `:delayed_job` アダプタ前提のテストが実装されている可能性があるが、自分で新規に追加したテストでは job queue の検証をしたいため `ActiveJob::TestHelper` のメソッドを呼んだり `queue_adapter` を `:test` に変えたくなった。
そのため他人が書いたコードに影響しないよう、適用範囲を絞ったモジュールインクルードと `queue_adapter` の変更をできる方法を探った。

## 結論
1. module を mixin したいブロックで `include` してあげれば適用範囲がそのブロックに限定されるからOK
2. `ActiveJob::TestHelper` を include すれば明示的に `queue_adapter` を切り替える必要がない。
  `ActiveJob::TestHelper` が適宜 `queue_adapter` を調整して queue テスト可能にしてくれる。

## 検証コード
https://gist.github.com/qpSHiNqp/5f877886120ae722f4273d1c40d7bbf0

```ruby:modules_spec.rb
require 'spec_helper'

describe RSpec, 'module isolation' do
  module Example1
    def hoge
      "example1"
    end
  end
  module Example2
    def hoge
      "example2"
    end
  end

  context '#include Example1' do
    include Example1
    it 'should respond to :hoge and return "example1"' do
      expect(self).to respond_to(:hoge)
      expect(hoge).to eq("example1")
    end
  end
  context '#include Example2' do
    include Example2
    it 'should respond to :hoge and return "example2"' do
      expect(self).to respond_to(:hoge)
      expect(hoge).to eq("example2")
    end
  end
  context '#include nothing' do
    it 'should not respond to :hoge' do
      expect(self).not_to respond_to(:hoge)
    end
  end
end

describe RSpec do
  before { ExampleJob.perform_later }

  context '#include ActiveJob::TestHelper' do
    include ActiveJob::TestHelper

    it 'should be available to call #have_been_enqueued' do
      expect { expect(ExampleJob).to have_been_enqueued }.not_to raise_error
    end

    it 'should be available to call #assert_enqueued_jobs' do
      expect(self).to respond_to(:assert_enqueued_jobs)
      assert_enqueued_jobs 1
    end

    it 'should change queue_adapter to :test' do
      expect(ActiveJob::Base.queue_adapter).to be_kind_of(ActiveJob::QueueAdapters::TestAdapter)
    end
  end

  context 'not #include ActiveJob::TestHelper' do
    it 'should not be available to call #have_been_enqueued' do
      expect { expect(ExampleJob).to have_been_enqueued }.to raise_error(StandardError)
    end

    it 'should not be available to call #assert_enqueued_jobs' do
      expect(self).not_to respond_to(:assert_enqueued_jobs)
      expect{assert_enqueued_jobs(1)}.to raise_error(StandardError)
    end

    it 'should not change queue_adapter to :test' do
      expect(ActiveJob::Base.queue_adapter).not_to be_kind_of(ActiveJob::QueueAdapters::TestAdapter)
    end
  end
end
```
phpのratchet/pawlを使ってwebsocket clientを作る

とあるAPIサービスのクライアントサンプルがtextalk/websocketで書かれていたのですが、
なんかメモリリーク起こしているようで、立ち上げっぱなしにしてると落ちるため、
ratchet/pawlを使って書き直しました。

# composerでratchet/pawlをインストール
composer require ratchet/pawl

# コード
```client.php
<?php

require __DIR__ . '/vendor/autoload.php';

/**
 * 接続
 */
function connectServer($connector, $loop) {
	// 接続先情報（適宜変更）
	$url = "ws://localhost:8080";
	$connector($url)->then(function(Ratchet\Client\WebSocket $conn) use ($connector, $loop) {
		// メッセージ受信イベント
		$conn->on("message", function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) {
			// メッセージ受け取ったときの処理（適宜変更）
			print_r($msg);
		});
		
		// 切断イベント
		$conn->on("close", function($code = null, $reason = null) use ($connector, $loop) {
			$loop->addTimer(1, function() use ($connector, $loop) {
				// 切断されたら自動で再接続させる
				connectServer($connector, $loop);
			});
		});
		
		// 接続できたらテストでサーバへメッセージ送ってみる （適宜変更）
		sendMessage($conn, "hello world.");
	}, function (\Exception $e) use ($loop) {
		// 例外処理（処理停止）
		$loop->stop();
	});
}


/**
 * メッセージ送信
 */
function sendMessage($conn, $msg) {
	$conn->send($msg);
}


/**
 * 本体
 */
$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);
connectServer($connector, $loop);
$loop->run();
```
SwiftでUNIX時間をDate型へ変換する

ググってすぐに出てこなかったので備忘録です。
dynamodbへ文字列でUNIX時間を保存し、swiftでdate型で扱う必要があったので。

#UNIX時間で保存し、swiftで日時として扱う

```
let str = "1552273063375"
var int64 = Int64(str) ?? 0
int64 = int64 / 1000
let timeIterval = TimeInterval(integerLiteral: int64)
let day = Date(timeIntervalSince1970: timeIterval)
```

dynamoDBへ文字列で保存してしまっているので、
int64　> timeInterval > date
と変換しています。
pythonで任意の1変数関数をプロットする方法

任意の関数をプロットしたいけど，どうやってやるんだっけというときのための記事．

グラフ内の矢印を用いたコメントの書き方は[こちら](https://qiita.com/haru1843/items/e85fe45163cd9763023c)を参照．

また，対数スケールは以下で可能．

```py
plt.yscale('log')
```

今回の実行結果が以下のグラフ．

![test.png](https://qiita-image-store.s3.amazonaws.com/0/355593/687127b5-bc77-4268-3ef0-cb20acfeb8f7.png)

そして，以下のプログラムによって，関数の可視化が可能．
$f(x)$ を自分で定義すれば，自分のプロットしたい関数の可視化ができる．めでたし．

```py
import matplotlib.pyplot as plt
import numpy as np

def f(x):
  return np.sin(x)

def g(x):
  return np.cos(x)

def plot_functions():
  # xの定義域を決める
  x_min = -10
  x_max = 10

  # x軸の分割数を決める
  # 荒く(小さい値で)区切るとガタガタな関数になる
  # 細かく(大きい値で)区切ると滑らかな関数になる
  num = 10000

  # xの定義域をnum個に区切ったときの点を格納した配列
  x = np.linspace(x_min, x_max, num = num)

  # xの定義域内の各点における関数の値を取得
  y1 = f(x)
  y2 = g(x)
	
  # yの値域を取得
  y_min = min(y1.min() - 1, y2.min() - 1)
  y_max = max(y1.max() - 1, y2.max() + 1)

  # 図を見やすくするためにグラフの余白幅を計算
  space_x = ( x_max - x_min ) / 100.0
  space_y = ( y_max - y_min ) / 100.0
	
  # 任意のx, yがグラフ内に収まるようにグラフの端を設定
  plt.xlim(x_min - space_x, x_max + space_x)
  plt.ylim(y_min - space_y, y_max + space_y)

  # x軸に平行な直線を引くためにyの値域を細かく分割
  y = np.linspace(y_min, y_max, num = num)

  # プロット
  plt.plot(x, y1, label = "y = sinx")
  plt.plot(x, y2, label = "y = cosx")

  # x軸とy軸のプロット
  plt.plot(x, [0] * num, color = "black")
  plt.plot([0] * num, y, color = "black")

  # 原点のプロット
  plt.scatter(0, 0, color = "black")
  plt.text(0.25, -0.2, r'$O$')

  # 矢印のコメントアウト
  plt.annotate(
               s = 'max', 
               xy = [np.pi / 2, 1], 
               xytext = [1.7, 1.3], 
               arrowprops = dict(
                                 facecolor='gray',
                                 edgecolor='gray')
               )

  # 凡例の設定
  plt.legend()

  # グリッドをつける
  plt.grid()

  # 画像の保存
  plt.savefig("test.png")

  # プロットを可視化
  plt.show()

if __name__ == "__main__":
  plot_functions()
```

## 余談
ちなみに「[np.linspace](https://deepage.net/features/numpy-linspace.html)」では始点と終点の決まった区域を決められた個数に分割した配列を得ることができる．

例：始点 0, 終点 3, 区切り個数 10

```terminal
In [1]: import numpy as np
In [2]: start = 0
In [3]: end = 3
In [4]: num = 10
In [5]: np.linspace(start, end, num = num)
Out[5]: 
array([0.        , 0.33333333, 0.66666667, 1.        , 1.33333333,
       1.66666667, 2.        , 2.33333333, 2.66666667, 3.        ])

```
SQLServer > SSISでバックアップ




SQL Server のエージェントに登録

Stepの追加

種類： Transact-SQL

コマンド欄に以下を登録

```shell
DECLARE @serverpath varchar(50) = N'\\server-name\path$\'
DECLARE @DBNAME varchar(20) = 'db_name'


DECLARE @d datetime = GETDATE()
DECLARE @d1 char(8) = CONVERT(char(8), @d, 112)
DECLARE @d2 char(6) = REPLACE( CONVERT(char(8), @d, 108), ':', '' )
DECLARE @FileFullName varchar(100) = @serverpath + @DBNAME + '_' +  @d1 + '_' + @d2 + '.bak'
DECLARE @Name varchar(100) = @DBNAME + '-日次 データベース バックアップ'

BACKUP DATABASE @DBNAME TO  DISK =@FileFullName WITH RETAINDAYS = 2, NOFORMAT, NOINIT, NAME = @Name, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
```
React Native で画像を require() する時の注意点

不思議な挙動をするのでメモ。

```tsx
import { Image } from 'react-native'

// OK
function MyComponent() {
  return <Image source={require('./assets/image.png')} />
}

// OK
function MyComponent() {
  return <Image source={require('@some/package/assets/image.png')} />
}

// NG
function MyComponent() {
  const imageName = '@some/package/assets/image.png'
  return <Image source={require(imageName)} />
}

// OK
function MyComponent() {
  const imageSource = require('@some/package/assets/image.png')
  return <Image source={imageSource} />
}
```

変数に対して `require` はできない。 こんな感じのエラーになる。

```markdown
error: bundling failed: Error: Unable to resolve module `@some/package/assets/image.png` from `/Users/kazuya/MyComopnent.tsx`: The
 module `@some/package/assets/image.png` could not be found from `/Users/kazuya/`. Indeed, none of these files exis
t:
  * `image.png`
  * `/@some/package/assets/image.png/index(.native||.android.js|.native.js|.js|.android.json|.native.json|.json|.android.ts|.native.t
s|.ts|.android.tsx|.native.tsx|.tsx)`
```

そして驚くべきは、これ。

```tsx
import { Image } from 'react-native'

// OK
function MyComponent() {
  return <Image source={require('@some/package/assets/image.png')} />
}

// NG...!?
function MyComponent() {
  return <Image source={require(`@some/package/assets/image.png`)} />
}
```

違いとしては、  

 `'` 

が


<code>`</code>


になっただけだなのだが、これもエラーになった。

しょうもないケースだが、ちょっとはまった。


# 追記

最近感覚的にわかってきたが、 Facebook 系のツール（React Native CLI, Jest等）は、起動時に全てのモジュールを巻き上げて、 Jest-Haste-Map という場所に格納するようだ。おかげで Webpack より Metro の方が体感速いのだと思われる。（ソースは無い）

起動時に巻き上げるため、動的な `require` はできない。 <code>`</code> 内は (babelなどを介さなければ) 実行時に評価される文字列なので、起動時に巻き上げるのに失敗する。
junit5.4を始める

色々調べる羽目になったので結果をまとめておきます。

# 前提条件
macOS High Sierra
intelij ultimate2018 3.3
maven 3.5.4
java 11.0.1

# pom.xml
引用:https://github.com/junit-team/junit5-samples/blob/r5.4.0/junit5-jupiter-starter-maven/pom.xml

```xml
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <junit.jupiter.version>5.4.0</junit.jupiter.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- JUnit 5 requires Surefire version 2.22.1 or higher -->
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
            </plugin>
        </plugins>
    </build>
```

# 更新

```bash
project_dir$mvn install -Dmaven.test.skip
```
WindowsでLinuxなWSLを使う

## Windows10に搭載されたWSL(Windows Subsystem Linux)
仮想マシンを用意せずともLinuxのUbuntuがWindows10上で動作する！
そんなWSLを導入してみる備忘録です。

間違ったところがあれば指摘してクレメンス

### WSLを有効化する
**管理者権限**のPowerShellを起動して下記のように入力、実行。

```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

再起動を促されるのでそのまま再起動。

* 解説サイトによっては「アプリと機能」で有効化したりそもそもこの手順を飛ばしてたりするのでどっちが正しいのかはよく解らない・・・公式のドキュメントがこのやり方なので一応。

# Ubuntuのインストール

1. MicrosoftStoreを開き「Ubuntu」で検索。そのまま「Ubuntu」をダウンロード。

2. ダウンロードしたUbuntuを起動すると、まず最初にインストール作業が始まります。
この時点でちょっと時間がかかるので注意。

3. インストールが終わると新しいUNIXユーザー名とパスワードを聞かれるのでおもむろに入力。パスワードは見えないけどちゃんと入力されています。

4. インストール完了。
コンソール上に `ubuntu@MYCOMPUTER:~$ `みたいな表示がでたら完了です。
次からは起動するだけですぐにコンソール画面に移行。仮想環境よりずっと早く立ち上がります。

# Ubuntuの初期設定
ここからしてもしなくてもいい作業をするよ

## ダウンロードサイトを日本サーバーに変更

Ubuntuの初期設定だとダウンロードサーバーが海外（イギリスらしい？）になってるらしいのでこれを国内のものに書き換え。

```
sudo sed -i.bak -e 's|http://archive|http://jp.archive|' /etc/apt/sources.list
```

速度が少し早くなればいいくらいの気休め程度なのでやらなくてもいいのかも。
変更し終わったら忘れずに、

```
sudo apt update
sudo apt upgrade
```
でパッケージアプデをしておこう。初回はけっこう時間がかかる。

## 日本語化

言語パックをインストール。

```
sudo apt install language-pack-ja
```
以下のコマンドを入力していったん再起動。

```
sudo update-locale LANG=ja_JP.UTF8
```
これでコンソールが日本語表記になる。
もし文字化けしたら打ち間違いか、フォントが日本語に対応していないだけ（見落としがち）

**まだ完全ではないが、Windows上でかんたんにLinux環境が構築できた。**

## Windows間でファイル共有

実はubuntu内の`/mnt/c/`にアクセスするとWindows側のCドライブの中身がまるごと出てきます。
ここからファイルやフォルダを直接参照できるようになってます。

いちいち`/mnt/c/`と打つのが面倒くさい方はリンクを作っておきましょう。

```
ln -s /mnt/c/Users/Document/ ~/document
```

`cd ~/document`でWindows内ドキュメントフォルダを一発で開けるようになります


Windows側からLinuxにアクセスする方法は一応あるらしいが、そもそもファイルの概念が全く違うので基本はLinuxからWindowsにアクセスするのがベターらしい。
C++ Builder 10.2 Tokyo > エラー > [ilink32 エラー] Fatal: ファイル 'FRXCHART.OBJ' を開けません > 対処

```txt:動作環境
Rad Studio 10.2 Tokyo
```

### エラー

> [ilink32 エラー] Fatal: ファイル 'FRXCHART.OBJ' を開けません

### 対処

```cpp
#pragma link "frxChart"
```

上記の部分を下記のようにする (削除しても良いだろう)。

```cpp
//#pragma link "frxChart"
```
UITableViewでメモリリークした時のメモ

## メモリリーク問題でハマったが解決したので、その時のメモ。
※具体的なソースコードを記載したため更新しました。

### [この記事の経緯]

SwiftやObjective-Cは、以前のように解放処理を一つ一つのオブジェクトに対して明記しなくても自動的にメモリを解放してくれるようになったが、メモリリークしないような動きに自動的にプログラムしてくれるわけではない。iOSアプリ開発をしていてメモリリークしてしまうケースに遭遇したためこの記事を書きました。

### [事象]

UITableViewを動かしていて、deinitをコールしない場合、数十回生成->破棄すると使用中のメモリを逼迫していきOSからKillされる。その際のメモリ使用量はXcodeの左ペイン右から三番目、「Memory Report」から確認。1Gを超えたあたりでクラッシュした。

### [前提条件]
deinit関数がコールされないことが原因で画面遷移分のメモリを保持してしまい、メモリリークが起きる。

### [今回の対象]
UITableViewが実装されている画面に対して、なんども生成、破棄を繰り返す。

### [主な理由]
* クラスを解放する際にdeinitをコールするが、何らかの理由でコールがされない場合に起こる。

* ViewController自身のインスタンス（selfなど）を別Viewに代入したままにしている、宣言が"weak"になっていない、もしくは解放時にnilを代入しないままのため、インスタンスが解放されず残存したままとなっている場合にも起こる

* delegateの宣言が「weak」になっていないため、Viewとのひも付きが解消されず残っているため

以下はdeinit()がコールされない原因がdelegateの宣言によるもの、かつUIViewControllerを変数に保持している場合の解決例

### （修正前）

```before.swift
var transitionDelegate: TransitionDelegate! //デリゲートの宣言 "これでは解放されない!"
var owner: UIViewController! //ViewControllerの宣言 "これでは解放されない!"
```

###（修正後）

```After.swift

class TableViewCell:
    UITableViewCell
{
    weak var transitionDelegate: (TransitionDelegate & AnyObject)? //デリゲートの宣言 "weakのため解放される"
    weak var owner: UIViewController? //ViewControllerの宣言 "weakのため解放される"
    deinit
    {
        debugPrint("TableViewCell called deinit.") //画面遷移の際に呼ばれる
    }
}

class ViewController: UIViewController
{
    func tapBackView()
    {//画面遷移の場合などで破棄処理を行う
        var cells = [UITableViewCell]()
        for section in 0...numberOfSections-1
        {
            for row in 0...numberOfRows(inSection: section)
            {
                if let cell = cellForRow(at: IndexPath(row: row, section: section))
                {
                    cells.append(cell)
                }
            }
        }
        
        for cell: UIView in cells
        {
            if type(of: cell) == TableViewCell.self
            {
                let _cell: TableViewCell = cell as! TableViewCell
                _cell.transitionDelegate = nil
                _cell.owner              = nil
            }
        }
    }
}

```
### [修正する際のポイント]

* 原因だと思う変数や関数をコメントアウトして実行し、deinit()がコールされるか、されないかを確認しながら作業を進めると原因が特定しやすく効率が良い
* オーナーシップを確認する。UIViewControllerを宣言する場合はweakとなっているか
* デリゲートの宣言はweakになっているか
* 上記を解放時にnil代入しているか

### [所感]

Memory Reportで確認したところ、対処後は画面遷移前後でほぼ同じ値に推移しました。

当該関数は正常に解放された際に呼ばれるため、UIViewControllerやUITableViewなど、それ以外にもカスタムクラスを実装していてメモリリークが発生する場合はコールされているか確認しましょう。

### [留意点]
ViewControllerを保持する場合の変数では、weakにすることよって意図しないタイミングで解放されるため、再度参照しないよう注意が必要です。
中間の行に新しい行を挿入するためのMySQL文

マスタデータを新規追加する時に、同じ種類のデータを纏めて表示したい時に、下記のSQL文が使える

```mysql
START TRANSACTION;
UPDATE table SET id = id + 1 WHERE id >= 10 order by id DESC;
INSERT INTO table (id, value) VALUES (10, value);
COMMIT;
```
wemosでマルチタスク

#概要

wemosでマルチタスクやってみた。

#写真

![we.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/449c5c34-2ae0-fda9-f0cb-175bbae98ebf.jpeg)


#使用したライブラリー

https://github.com/ohisama/Arduino-MOS

#サンプルコード

タスクa,b,cが、それぞれ300ms,600ms,900msで動く。

```
#include "MOS.h"

void task_a(PTCB tcb)
{
    MOS_Continue(tcb);
    while (1)
    {
        Serial.print("A ");
        Serial.println(millis());
        MOS_Delay(tcb, 300);
    }
}
void task_b(PTCB tcb)
{
    MOS_Continue(tcb);
    while (1)
    {
        Serial.print("B ");
        Serial.println(millis());
        MOS_Delay(tcb, 600);
    }
}
void task_c(PTCB tcb)
{
    MOS_Continue(tcb);
    while (1)
    {
        Serial.print("C ");
        Serial.println(millis());
        MOS_Delay(tcb, 900);
    }
}
void setup()
{
    Serial.begin(115200);
}
void loop()
{
    MOS_Call(task_a);
    MOS_Call(task_b);
    MOS_Call(task_c);
}

```

以上。
pythonを用いた日本語文字列のデコード

# はじめに
たまに「\xE3\x81\xAA\xE3\x82\x93\xE3\x81...」のような文字列を見かけることがあり、読める文字列に変換する方法を知りたくなったので調べてみました。
ほぼ走り書きのメモレベル。

# 実際のコード

## python2の場合

```python
>>> print '\xE3\x81\xAA\xE3\x82\x93\xE3\x81\x8B\xE6\x96\x87\xE5\xAD\x97\xE5\x88\x97'.decode('utf8', 'ignore')
なんか文字列
```
sjisなら

```python
print '(なんか文字列)'.decode('cp932', 'ignore')
```

でそれっぽく変換できることが分かりました。
ignoreを入れておくことで途中上手く変換できないコードがあってもスルーされます。
(無視されて当該文字は消える)
ちなみに、ignoreは使えませんが、base64も同じ要領でデコードできます。


## python3の場合

```python
>>> b'\xE3\x81\xAA\xE3\x82\x93\xE3\x81\x8B\xE6\x96\x87\xE5\xAD\x97\xE5\x88\x97'.decode('utf8', 'ignore')
'なんか文字列'
```

で変換できます。

# 参考
https://docs.python.org/ja/2.7/howto/unicode.html
https://docs.python.org/ja/3/howto/unicode.html
node.jsでサイトからリスト一覧の画像をダウンロードする

## いきさつ
とあるwordpress案件で、古いサーバーから記事に使っている画像データを、
**ディレクトリ構造を保持したまま**ダウンロードしたかった。
しかし、アクセス権は与えられなかったので、web経由で落とすしかなかった。

Node.jsでなんとか出来ないだろうか。
出来た。

## とりあえず、画像のパス一覧の配列を用意する
これは、どうにかして用意してください。
僕の場合はエクスポートしたデータのxmlから、正規表現でなんとか抽出して作りました。

```javascript:script.js
  // 画像のルート相対パス
const urls = [
  '/wordpress/wp-content/uploads/2017/03/aaa.png',
  '/wordpress/wp-content/uploads/2018/06/bbb.png',
  '/wordpress/wp-content/uploads/2019/04/ccc.png'
];
```
## node.js用のスクリプトを書く
```javascript:script.js
// node -v v10.13.0
const fs = require('fs');
const path = require('path');
const request = require('request');
const async = require('async');

const domain = 'http://hogehoge.jp'; // ダウンロードしたいサイトのURL

const urls = [ // 画像のルート相対パス
  '/wordpress/wp-content/uploads/2017/03/aaa.png',
  '/wordpress/wp-content/uploads/2018/06/bbb.png',
  '/wordpress/wp-content/uploads/2019/04/ccc.png'
];

async.each(urls, (data, next) => { // 同期処理でリストを回す
  const options = {
    url: encodeURI(domain + data), // 日本語のファイル名だとエラーになるのでエンコード
    method: 'GET',
    encoding: null
  };
  request(options, function(error, response, body) {
    if (!error && response.statusCode === 200) {
      // mkdirSyncの「recursive: true」オプションでディレクトリを再帰的に作ってくれる
      fs.mkdirSync(path.dirname(__dirname + data), { recursive: true }, err => {
        if (err) throw err;
      });
      fs.writeFileSync(__dirname + data, body, 'binary'); // 画像をダウンロード
    }
  });
});

```

```
node script.js
```
これを nodeで実行すれば、カレントディレクトリに階層が保持されたままのファイルがダウンロードされている。

## 注意
多用するとサーバーに負荷をかけるので、
案件で必要です、って時以外は使わないようにしてください。
【WinActor】画像マッチングで、ウィンドウサイズが変わるとエラーになる

こんにちは

現在、業務でWinActorを使っており、色々つまづくことも多いので、
備忘録を残します。

###事象
「画像マッチング」ノードを使う際、
シナリオ作成時とシナリオ実行時で、マッチング対象のウィンドウのサイズが変わっていると、マッチしないエラーにハマりました。


①シナリオ作成時のウィンドウイメージ
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/303730/edd2596d-fac0-c614-52d1-e41a58c8b1a3.png)

②実行した時のウィンドウ。
シナリオ作成時より大きいため、検索範囲（上図の緑枠）がズレてしまう。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/303730/9ab88aae-0caf-a945-9742-d67997ffc107.png)

③　①のイメージとマッチする画像が無いためエラー
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/303730/6c358462-6d37-c98d-84ec-ac6df53fed83.png)



###解決策
「画像マッチング」の前に、
「画面サイズ、位置設定」ライブラリ（ユーザーライブラリ⇒「11_ウィンドウ関連」）を使って、ウィンドウのサイズをシナリオ作成時に合わせることで、解決しました。
（設定するサイズ情報は「画面サイズ、位置取得」ライブラリを使えば確認できます。）
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/303730/a4ea65dd-2eab-0f98-2133-f94fd79f311e.png)


###まとめ

「画像マッチング」ノード自体あまり多用しない方がよいとは言われますが、
Webサイト上の操作を行う時など使い勝手が良いので、機能を正しく理解した上で使えたら良いですね。
Docker save→load　export→import　どっち？

##1.save　→　load##

Dockerイメージを save でtarファイルに保存して、load で作成してみる。


ubuntu イメージをダウンロード。

```
$ docker pull ubuntu
```

ubuntu イメージがダウンロードされたことを確認する。

```
$ docker images
```

ubuntu イメージを ubuntuv2.tar で圧縮する。

```
$ docker save ubuntu -o ubuntuv2.tar
```

圧縮され、保存されていること確認。

```
$ file ubuntuv2.tar
```

次に解凍したものとわからなくならないようにするため、一旦既存の ubuntu イメージを削除。

```
$ docker rmi ubuntu
```

ubuntuv2.tar を解凍する。

```
$ docker load -i ubuntuv2.tar
```

イメージが改めて作成されたことを確認する。

```
$ docker images
```



##2.export → import##

Dockerファイル、nginxv2 を nginxv3_tar としてエクスポートします。

```
$ docker export nginxv2 > nginxv3_tar
```

nginxv3_tar が作成されたことを確認します。

```
$ ls -l nginxv3_tar
```

nginxv3_tar を nginx:v3 でインポートします。

```
$ docker import nginxv3_tar > nginx:v3
```

イメージが作成されたことを確認します。

```
$ docker images 
```



##3.どっち？##

saveはイメージを保存、 
exportはコンテナを保存
　という違いがあります。

その上で、両者の違いとして大きいのはメタ情報を保存するかどうかという点です。

Dockerのイメージは、ファイル差分がレイヤが重なるような構成となっており、 
saveはレイヤの情報なども含めた状態で保存されます。
exportはDockerとしての構造やメタ情報は保存されず、ファイルシステムだけが保存されます。