OmniAICreator/Qiita-1.07M huggingface dataset:
複数の多次元配列を指すポインタの配列

先日、複数の多次元配列を指すポインタの配列を実装しようとして手こずったので備忘録がてら記事を書く。

## 達成したかったこと
複数定義された多次元配列に変数操作でアクセスしたい。
例えば下図に示すように、PtrArray[0]とすれば配列aにアクセスでき、PtrArray[1]とすれば配列bにアクセスできるといった具合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389843/a1613f31-e6f0-2e81-f618-fb8072f8c90a.png)

## 実装
```c
#include <stdio.h>

const unsigned char a[2][3] = {{0, 1, 2}, {3, 4, 5}};
const unsigned char b[2][3] = {{10, 11, 12}, {13, 14, 15}};
const unsigned char c[2][3] = {{100, 110, 120}, {130, 140, 150}};

// unsigned char型のデータを指し示すポインタの配列（配列のアドレスを格納）
const unsigned char *PtrArray[3] = {
    a,
    b,
    c,
};

int main(void)
{
    unsigned char (*p)[3];
    p = PtrArray[1];       // 右辺の要素番号で指し示す配列を切り替える。この場合は配列bを指し示すようにする。

    // 配列bから値14を取得する
    printf("val: %d\n", *(p[1]+1));

    // もちろん、単純にこれでもOK(突然の+4は困惑するかもしれない。)
    printf("val: %d\n", *(PtrArray[1]+4));
}
```
PHPエラー出力

#はじめに
こちらではphpのエラーを出力するやりかたを紹介できればと思います。
コードを書く上でミスを絶対にしないなんてありえないでしょう。
小さなミス・初歩的なミスから動かないなんていうのもザラだと思います。
その上でエラーを表示させるのは重要な問題解決になります。

#環境
Cent0S
PHP 7.3.17
Apache/2.4.6


#やりかた
まずphp.iniを設定します

xampp
C:\xampp\php\php.ini

Linux
/etc/php.ini

今回はわかりやすく画面に表示させるようにしたいと思います。
変更点

```ini:php.ini
#display_errors=Off
display_errors=On
```

apacheを再起動します。

#実行結果
では試しに

```php:test.php

   <?php
    echo "<div class=red>";
    echo "エラー部分"
    echo "</div>";
   ?>
```

画面に

```
Parse error: syntax error, unexpected 'echo' (T_ECHO), expecting ',' or ';' in /var/www/html/test.php on line 4
```

エラーが表示され４行目周辺が怪しいと出ているのがわかるとおもいます。（今回はその前の行に；（セミコロン）がないためのエラーでした。）


#まとめ
いかがだったでしょうかコードを書く上で何が原因かわからないときエラー（エラーログ）を表示させれるようにしていきましょう。（英語ですが。。。）
PythonでABC159-Dを解く

### はじめに
Boot camp for Beginnersを解きます。

###[ABC159-D Banned K](https://atcoder.jp/contests/abc159/tasks/abc159_d)

**考えたこと**
$O(N)$くらいに抑えないと通らないので、それぞれの$k$に対してコンビネーションを計算していては間に合わない。
少し考えてみると、種類の違う数字の組合せは独立であることが分かる。例えば、取り除かれたボールが1のとき、1以外の組合せの総和は変化しない。では、取り除かれた数字の組み合わせはどう変化するのかを考える。$n$個から2個選ぶ組合せは$\frac{n(n-1)}{2}$で、$n-1$から2個選ぶ組合せは$\frac{(n-1)(n-2)}{2}$になるから差を取ると$n-1$となる。
あとは、Counterで個数を調べて全体の組み合わせを調べて計算する。

```python
from collections import Counter
n = int(input())
a = list(map(int,input().split()))

c = Counter(a)
key = c.keys()
comb = 0
for i in key:
    comb += (c[i]) * (c[i]-1) // 2 #禁止されていない状態の組み合わせを調べる

for i in a:
    ans = comb - (c[i]-1) #a[i]が禁止されている状態の組み合わせ
    print(ans)
```

### まとめ
2ヶ月前の自分が解けなかった問題が解けるようになっていて成長を感じました。ではまた。
余談ですが、今日は[あーだこーだー](https://www.youtube.com/watch?v=845D24zOJQA)がありますよー。
gitのcloneで「the remote end hung up unexpectedly」になった時の対処法

```
この記事はmacOS Mojave バージョン10.14.6
gitのバージョン2.21.0を前提に書いています。
```

gitのcloneをしようとしたところ以下のようなエラーとともに失敗してしまったので解決方をメモします。

```
fatal: the remote end hung up unexpectedly
```

とーーっても時間がかかった挙句失敗したので、
対象のリポジトリが大きかったのが原因かなと思ました。
最新の状態さえ取得できればよかった(過去の履歴は不要)だったので、まずは以下の方法を試しました。


#最新のコミットのみを取得するが失敗

```
git clone --depth 1 ttps://your-repository
```

これで試してみると、さっきよりはるかに早く処理が終わりましたが、また失敗。

#gitの設定変更でうまくいった

ググってみるとリポジトリが肥大化しhttp.postBufferの設定を超えてしまっているというような情報があったので、以下を試してみました。

```
git config –global http.postBuffer 2M
```

再びgit clone --depth 1で試したところ今度はちゃんとcloneできました！


参考にさせていただいた記事
https://qiita.com/usamik26/items/7bfa61b31344206077fb
https://dream-target.jp/2019/03/17/git_remote_end_hung_up/
読み込んだテキストファイルの固有表現をラベルに置き換える(GiNZA使用)

それなりに苦戦したので一応載せておきます。
もっと良いやり方があるかもしれません。
私と同じ初学者の方は参考にしてください。

環境はpython3.6.9とUbuntu 18.04.4です。

```python:change_NER.py
# coding:utf-8
import spacy

with open('input.txt','r') as f:
  nlp = spacy.load('ja_ginza')
  data = f.read()
  doc = nlp(data)

with open('output.txt','w') as f:

    text = list(data)                               # 1文字ずつリストに格納
    entity = [ent.label_ for ent in doc.ents]       # 固有表現のラベル
    start = [ent.start_char for ent in doc.ents]    # 何文字目から固有表現か
    end = [ent.end_char for ent in doc.ents]        # 何文字目まで固有表現か
    num = 0                                        
    stop = False

    for i in range(len(text)):
        if i == start[num]:
            f.write(entity[num])
            if num < len(start) - 1: # out of rangeの防止
                num += 1
            stop = True

        elif stop == True:
            if i < end[num-1]: # 固有表現の文字数分だけ
                continue　　　　# iを消費する
            elif i == end[num-1]:
                stop = False
                f.write(text[i])

        else:
            f.write(text[i])
```
Airpods ProがWindows PCで接続できないときの対処法

「設定」のBluetooth管理画面からペアリング済みのAirPods Proを接続しようとすると、一瞬だけ「接続済み」になるが、すぐに「ペアリング済み」に戻って接続が途切れてしまう。以下の手順を踏むことで解決できた。
試してはいないが、おそらく無印版AirPodsでも同様な方法で解決できると思われる。

## 手順

1. デバイスマネージャーを開く
2. ヒューマン インターフェイス デバイス > Bluetooth HID デバイス をダブルクリック
3. 表示されたプロパティ画面 > 「電源の管理」タブ > 「電力の節約のために、コンピュータでこのデバイスの電源をオフにできるようにする」のチェックを外す
4. コンピュータを再起動
LinuxでURLのQRコードを作成する

自分のホームページやサイトなどのURLをQRコードに作成する方法を説明します。

# LinuxシェルからQRコードを生成する
 対象URLは「 https://fx.askbox.net 」と出力画像ファイルは「 askbox.net.png 」とします。

```sh
$ qrencode "https://fx.askbox.net" -o askbox.net.png
```

# 作成されたのQRコードの結果
![https://fx.askbox.netのQRコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263312/e01b6bec-726b-255f-8fc4-9d1459f4aa5d.png)

# Ubuntuにqrencodeをインストール
```sh
$ sudo apt install qrencode
```

# archlinuxにqrencodeをインストール
```sh
$ sudo pacman -S qrencode
```

# Ubuntuのバージョンの確認
```sh
$ uname -a
Linux meme_test 4.15.0-88-generic #88-Ubuntu SMP Tue Feb 11 20:11:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic
```

# archlinuxのバージョンの確認

```sh
$ uname -a
Linux arch.local 5.6.11-arch1-1 #1 SMP PREEMPT Wed, 06 May 2020 17:32:37 +0000 x86_64 GNU/Linux

$ lsb_release -a
LSB Version:	1.4
Distributor ID:	Arch
Description:	Arch Linux
Release:	rolling
Codename:	n/a
```
この解決策→nvm:854: no such file or directory: /Users/suin/.nvm/nvm-exec

Homebrewでインストールしたnvmで下記のようなエラーが出た場合、

```
nvm:854: no such file or directory: /Users/suin/.nvm/nvm-exec
```

シンボリックリンクを作り直すと治る:

```bash
mkdir -p ~/.nvm
cd ~/.nvm
ln -s $(brew --prefix nvm)/nvm.sh
ln -s $(brew --prefix nvm)/nvm-exec
```

## バージョン情報

```
nvm --version
0.35.3
```
next_permutationを用いてABC150 C問題を解く

競技プログラミングの備忘録用
C++のnext_permutationを用いて順列を列挙してABC150 C問題を解く．

[C - Count Order](https://atcoder.jp/contests/abc150/tasks/abc150_c)

###問題
大きさ$N$の順列 (($1,2, ..., N$)を並び替えてできる数列) $P,Q$があります。大きさ$N$の順列は$N!$通り考えられます。このうち，$P$が辞書順で$a$番目に小さく、$Q$が辞書順で$b$番目に小さいとして、$|a−b|$を求めてください。

###制約
- $2≤N≤8$
- $P, Q$は大きさ$N$の順列である。
- 入力は全て整数である。

###方針
$P,Q$のそれぞれについて順列を辞書順に全て列挙し，入力した数列がそれぞれの順列内で辞書順に何番目であるかを求める．順列を列挙する際にはnext_permutationを用いる．昇順ソートした配列をnext_permutationに渡すことで辞書順に順列を列挙してくれる．

###next_permutationの使い方
例えばPという数列の順列を全て列挙したいとする．
ここでPはvector<int>型と仮定

```c++
sort(P.begin(),P.end());
do{
    for(int i=0; i<P.size(); i++){
        cout << P[i] << " ";
    }
    cout << endl;
}while(next_permutation(P.begin(),P.end()));

```

まず初めにsortを用いてPを昇順ソートしている．
続いて，do-while文を用いて全ての順列を列挙している．next_permutationは全ての順列を列挙し終えたら-1を返却するため，do-while文から抜けることができる．

今回は以上の方法で順列を列挙し，$P,Q$それぞれの順番を$a,b$に保存しておき最後に$a-b$の絶対値を出力すればよい．

###解法コード
```c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef vector<char> VC;
typedef vector<double> VD;
typedef vector<double> VL;
typedef vector<string> VS;
typedef vector<PLL> VP;
typedef vector<ll> VLL;
const static int INF = 1000000000;
const static int MOD = 1000000007;
#define rep(i,n) for (ll i=0; i<(ll)(n); i++)
#define repd(i,n) for (ll i=n-1; i>=0; i--)
#define rept(i,m,n) for(ll i=m; i<n; i++)
#define stl_rep(itr, x) for (auto itr = x.begin(); itr != x.end(); ++itr)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
#define PF push_front
#define PB push_back
#define SORT(V) sort((V).begin(), (V).end())
#define RVERSE(V) reverse((V).begin(), (V).end())
#define paired make_pair
#define PRINT(V) for(auto v : (V)) cout << v << " "

int main()
{
    int N;
    cin >> N;
    VI P(N),Q(N);
    VI PS(N), QS(N);
    rep(i,N){
        cin >> P[i];
        PS[i]=P[i];
    } 
    rep(i,N){
        cin >> Q[i];
        QS[i]=Q[i];
    }
    sort(all(P));
    sort(all(Q));
    ll a=1; 
    ll b=1;
    bool judge=true;
    do {
        rep(i,N){
            if(P[i]!=PS[i]){
                judge=false;
            }
        }
        if(judge){
            break;
        }
        else{
            a++;
            judge=true;
        }
    }while(next_permutation(all(P)));
    do{
        rep(i,N){
            if(Q[i]!=QS[i]){
                judge=false;
            }
        }
        if(judge){
            break;
        }
        else{
            b++;
            judge=true;
        }
    }while(next_permutation(all(Q)));
    cout << abs(a-b) << endl; 
}

```
Laravelでリダイレクトを使う

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

# Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにredirect1メソッド、redirect2、redirect3メソッドを追記

```
    public function redirect1(Request $request)
    {
        return view('sample.redirect1');
    }

    public function redirect2(Request $request)
    {
        return redirect('sample/redirect3')->withInput();
    }

    public function redirect3(Request $request)
    {
        return view('sample.redirect3');
    }

```

redirect('sample/redirect3')でsample/redirect3にリダイレクトするRedirectResponseクラスのインスタンスが返ってきます。これをreturnするとリダイレクトされるのですが、
さらに、redirect2へのリクエストデータをredirect3でもold関数で使えるようにするためにwithInputを呼んでいます
withInputを実行すると、入力値が次のユーザーリクエストの処理中だけ利用できるフラッシュデータとしてセッションに保存されます

(2) /sample/routes/web.phpに下記を追記
`Route::get('sample/redirect1', 'SampleController@redirect1');
Route::post('sample/redirect2', 'SampleController@redirect2');
Route::get('sample/redirect3', 'SampleController@redirect3');`


# viewの作成
(1) /sample/resources/views/sample/redirect1.blade.phpファイル作成

```redirect1.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>

        <form action="{{ url('sample/redirect2') }}" method="post">
            @csrf
            <div>a<input type="text" name="a" value="{{ old('a') }}"></div>
            <div>b<input type="text" name="b" value="{{ old('b') }}"></div>
            <div>c<input type="text" name="c" value="{{ old('c') }}"></div>
            <input type="submit" >
        </form>

    </body>
</html>

```

(2) /sample/resources/views/sample/redirect3.blade.phpファイル作成

```redirect3.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>

        <div>{{ old('a') }}</div>
        <div>{{ old('b') }}</div>
        <div>{{ old('c') }}</div>

    </body>
</html>

```


# 動作確認
`http://localhost/laravelSample/sample/redirect1`

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/65d511b8-d3af-064b-157b-e95cf7b85d9b.png)

a、b、cに何か値を入力して送信ボタンクリック

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238103/ffbed227-2db5-5a07-8c57-0b7f2320858d.png)

sample/redirect3にリダイレクトされました
htaccess 外部転送と内部転送

# 概要
- 転送処理は、.htaccessという設定ファイルを用いることが多い
- 配置ディレクトリとその配下にのみ適応される

# 外部転送

- アドレスバーのURLを**書き換えて**、別のディレクトリや別ページ（外部サイト）に転送
- RewriteRule の設定行末に、**[R]フラグ**を付与する
- 301にしたい場合は[R=301]、[R] と省略すれば [R=302] と同義になる
- 上記の [R] フラグを利用するときは、**必ず[L] を併記する**必要がある

# 内部転送

- アドレスバーのURLは**書き換えず**、内部で表示先を変更する
- RewriteRule の設定行末に、**[L]フラグのみ**表記する

# HTTPステータスコード

- 301は恒久
    - 検索エンジンからの総合評価を、元のURLから引き継ぐことができる。
- 302は一時的
    - メンテナンス時など元のURLに復帰することを前提とする

# リダイレクトの書き方例
```
# 外部転送301リダイレクト
RewriteRule ^2020-4.php$ https://www.www.www/news/2020-5.php [R=301,L]
# 内部転送
RewriteRule ^news([0-9]*).php$ index.php?month=$1 [L]
RewriteRule ^news([0-9]*)-([0-9]*).php$ detail.php?month=$1&id=$2 [L]
```
- $1:ひとつ目のカッコの内容
- $2:ふたつ目のカッコの内容


# 参考記事
http://www-creators.com/archives/248#R301

# 正規表現参考
http://www-creators.com/archives/4278
Javaのデバッグ実行【Java初心者向け】

#はじめに

この記事では、既にJavaの環境構築が済んでいる状態で、デバッグ実行の手順について説明しております。

まだ環境構築がお済みでない方は、下記の記事で流れを説明しているのでご覧ください。
[Java開発環境構築　OpenJDK 11をインストールして実行までの流れ](https://qiita.com/gatchan03/items/618f867d7447afa50379)

OS： macOS Catalina バージョン10.15.4
テキストエディタ：Visual Studio Code- Insiders(VSCode)

#デバッグ実行


ではさっそくデバッグ実行していきます。
VSCodeを開いてください。

<img width="1244" alt="スクリーンショット 2020-05-13 11.29.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/1cef6c67-88d7-ffb1-316a-bae59448498b.png">


上図では、予め、Hello.javaというファイルを作成して、
以下のコードを書いています。

```Hello.java

public class Hello
{
  public static void main(String[] args) {
    System.out.println("おはようJava!!");
    int a = 1;
    int b = 3;
    System.out.println("aの中身は" + a);
    System.out.println("bの中身は" + b);
    b = a;
    System.out.println("aの中身は" + a);
    System.out.println("bの中身は" + b);
  }
}

```

下図のように、試しに6行目の左に赤丸のマークをつけます。
（「６」の左をクリックすると赤丸マークをつけられます）
そして、Debugをクリックします。

<img width="1245" alt="スクリーンショット_2020-05-13_11_34_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/a7c54310-f014-cc42-b28b-24777c3b0d84.png">

すると、ターミナルが開いて、緑の枠で囲っているやつが表示されます。

そして次に　Step Over　をクリックすると、
７行目へと移動します。
<img width="1241" alt="スクリーンショット_2020-05-13_11_49_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/1c57d0f2-1e0b-b809-ac92-371dc270417d.png">

Step Over をカチカチ押していくと、
7行目や８行目が実行されて、ターミナルにも表示されると思います。

そして、１０行目まで進めていくと、ようやくこのデバッグの恩恵を受けられた気持ちになるでしょう。
下図をご覧ください。
<img width="1244" alt="スクリーンショット_2020-05-13_11_56_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/0b850717-3f5a-f8a4-86f2-afa768854184.png">

９行目が実行されて、
bの値が３から１になる瞬間が見れます。

最後の行まで進めると、bの値が変更されて表示されているのがわかりますね。
<img width="1240" alt="スクリーンショット_2020-05-13_13_10_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/f089f74e-44d1-8676-2790-fa6e1d23d9b2.png">


##ちょっと補足
<img width="245" alt="スクリーンショット_2020-05-14_15_01_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447783/f8b2ecdc-6b6c-7aff-2313-ec67d13e8d94.png">
デバッグ実行している時に出てくるこの "Step into" を押すと、
実行されるメソッドが属するクラスファイルが開かれて一段階ずつ実行されます。
"Step into"で入った場所から抜けたい時は、"Step out"で抜けることができます。

**WATCH**
デバッグ実行時にVSCodeの左側に現れますが、
これは、変数の値の推移を監視し続ける機能です。
ある変数の値を追っていきたい時にずっと表示してくれます。

**CALL STACK**
関数の呼び出し経路の履歴を表示します。

**BREAK POINTS**
現在設定されているブレークポイント（赤丸）の一覧表示です。

---
いかがでしたか？
値を色々変更しながら、デバッグ実行するとより理解が深まると思います。
ありがとうございました☕️
rubyにおける文字列操作

# rubyにおける文字列操作


オンラインプログラミングの問題を解いているときに用いた，文字列操作のメソッドについてのメモ

# 目次
1. [tr 置き換え](#anchor1)
2. [slice 抜き出し](#anchor2)
3. [concat 連結](#anchor3)
4. [to_s(2) 数値を2進数の文字列に変換](#anchor4)
5. [size 文字列の長さを取得](#anchor5)
6. [count 文字列中の特定の文字の数を取得](#anchor6)
7. [insert 挿入](#anchor7)
8. [chars 1文字ずつ区切って配列に代入](#anchor8)
9. [join 配列に格納された文字列を結合する](#anchor9)


<a id="anchor1" name="anchor1"></a>

# tr 置き換え

*string*.tr("置き換え元", "置き換え先")

```ruby:tr.rb
a="abc"
a.tr("a","x") #aをxに置き換える．
# => "xbc"

a="abc"
a.tr("abc","xyz") #aをxに，bをyに，cをzにそれぞれ置き換える．
# => "xyz"
```

<a id="anchor2"></a>

# slice 抜き出し

*string*.slice(i,j)
文字列の先頭から数えてi番目からj番目を抜き出す．

```ruby:slice.rb
a="0123456789"
a.slice(1,3) #文字列の先頭を0番目として，1~3番目を抜き出す．
# => "123"

a="0123456789"
a.slice(5) #文字列の先頭を0番目として，5番目をsort抜き出す．
# => "5"
```

<a id="anchor3"></a>

# concat 連結

*string1*.concat(*string2*)

```ruby:concat.rb
a="abc"
a.concat("def")
# => "abcdef"
```

<a id="anchor4"></a>

# to_s(2) 数値を2進数の文字列に変換

*int*.to_s(2)

```ruby:binary_string.rb
a=3
a.to_s(2)
# => "11"
```

<a id="anchor5"></a>

# size 文字列の長さを取得

*string*.size

```ruby:size.rb
a="123456789"
a.size
# => 9
```

<a id="anchor6"></a>

# count 文字列中の特定の文字の数を取得

*string*.count(*string*)

```ruby:count.rb
a="aaabbc"
a.count("a")
# => 3
```

<a id="anchor7"></a>

# insert 挿入

*string*.insert(i, *string*)
i番目の後に挿入

```ruby:insert.rb
a="0123456789"
a.insert(3,"x") #先頭から数えて3番目の後に"x"を挿入
# => "012x3456789"
```

<a id="anchor8"></a>

# chars 1文字ずつ区切って配列に代入

*string*.chars

```ruby:chars.rb
a="abcd"
a.chars
# => ["a", "b", "c", "d"]
```


<a id="anchor9"></a>
# join 配列に格納された文字列を結合する

*array*.join

```ruby:join.rb
a="cat"
a=a.chars
# => ["c", "a", "t"]

a=a.join
# => "cat"

puts a
# =>cat
```
Spring Boot+Thymeleaf 処理を別々に分けたい場合

Thymeleaf を使って、「こういう使い方があったのか」と感じたので、それについて記述します。


例えば下記のようにformの指定先が同じ('/reservations/' + ${date} + '/' + ${roomId}}")
だけど、処理を別々に分けたい場合があるとします。


```html:index.html
<form th:action="@{'/reservations/' + ${date} + '/' + ${roomId}}" method="post"
					sec:authorize="${hasRole('ADMIN') or #vars.user.userId==#vars.reservation.user.userId}">
					<!-- th:if="${user.userId==reservation.user.userId}" -->
					<input type="hidden" name="reservationId" th:value="${reservation.reservationId}">
					<input type="submit" name="cancel" value="取り消し">
</form>

<form th:action="@{'/reservations/' + ${date} + '/' + ${roomId}}" method="post">
		<input type="text" name="userId">
		<input type="submit" name="search" value="検索">
</form>
```

inputタグのオプションにname="XXXX"を用意して、
Controllerの@GetMappingもしくは@PostMappingのオプションに(params="XXXX")を指定することによって、
処理を分けることができます。

##例
```html:index.html
<input type="submit" name="search" value="検索">
```

```java:Controller.java
@PostMapping(params="search")
	public String search(@RequestParam("userId") String userId, Model model) {

		List<Reservation> lists = reservationService.find(userId);
		model.addAttribute("list", lists);
		return "test";
	}
```
NestJS+jestのテストでHTTP通信部分をモックする

NestJSで実装したコントローラで、HttpServiceを使ってHTTP通信をしている処理があったのだが、テストを書く際にHTTP通信部分をどうにかする必要があった。
Dockerでローカルにサーバーを立てることも考えたが、jestでモックできたのでメモとして残しておく。

```typescript
import { HttpService, INestApplication } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { AxiosResponse } from 'axios';
import { of } from 'rxjs';
import * as request from 'supertest';

describe('controller test', () => {
  let app: INestApplication;
  let module: TestingModule;
  let httpService: HttpService;

  describe('hoge endpoint', () => {
    beforeAll(async () => {
      module = await Test.createTestingModule({}).compile();

      app = module.createNestApplication();
      await app.init();

      httpService = module.get<HttpService>(HttpService);
    });
    afterAll(async () => {
      await app.close();
      await module.close();
    });

    it('hoge', async () => {
      const params = {
        hoge: 'hoge',
        fuga: 'fuga',
      };

      const generatePostRequest = () =>
        request(app.getHttpServer())
          .post('/hoge/endpoint');

      jest.spyOn(httpService, 'post').mockImplementationOnce(() =>
        of({
          data: {
            hoge: '1',
            fuga: 2,
          },
        } as AxiosResponse),
      );

      await generatePostRequest()
        .send(params)
        .then((response: any) => {
          expect(response.body.success).toBe(1);
          expect(response.body.data).toBeTruthy();
        });
    });
  });
});
```

mockImplementationOnceで期待している戻り値を返却するようにモックすればOK.
wordpressでドキュメントの有効期限切れ対策

# 現象
POSTで検索結果を送信した後にブラウザバックするとこれが出る。
<img width="699" alt="スクリーンショット 2020-05-13 13.11.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207589/17daa21b-ee0f-e5d0-664b-0dee583e84cd.png">

# 対策
## バージョン
wordpress 5.4.1

## 対策方法
これをfunctions.phpに貼り付けたら終わり。

```php
function add_header_session() {
	header("Cache-Control: private");
	header("Pragma: no-cahce");
	header("Expires: ");
	header("Last-Modified: ");
}
add_action( 'send_headers', 'add_header_session' );
```

#備考
調べると以下のような対応方法も出てきますが、wordpressだとうまくいかないです。

```php
session_cache_limiter("none");
// or
session_cache_limiter("private_no_expire");
// をsession_start()の前につける
```
Javascript で前ゼロを表現する

正数限定です。変数などで桁指定できます。
```Number([数値]).toPrecision([桁数]).split('.').sort().join('')```

・Number([数値]) で toPrecision を使えるようにします。
・toPrecision([桁数]) で、たとえば "123.00" のような表現になります。ここで文字列になります。
・次の split('.') で ["123", "00"] になります。ここで配列型になります。
・sort() で["00", "123"]になります。
・最後の join で連結します。"00123"
Metabase 日付型の変数のデフォルトを相対的にする

metabaseのクエリには`{{変数名}}`と記載することで変数を利用して任意の値を入力し、データを表示することができる。
この機能は変数ではデフォルトの値を設定することができる。

しかしデフォルトの機能では変数の日付型は、固定の日付しか設定することができず、**直近1週間** というような範囲指定ができない。
これをSQLを工夫することで解決する方法を提示する。

## 前提条件
MetabaseのデータソースのDBMSはPostgreSQLを利用

## デフォル期間を表すSQL
coalesceとcurrent_dateを利用して、変数が設定されていない場合にはcurrent_dateを利用する

対象の箇所を抜き出したSQL

```sql
s.created_at 
  BETWEEN 
    coalesce([[{{from_date}},]] current_date - '1 week'::interval)
  and
    coalesce([[{{to_date}},]] current_date) 
```

上記を利用した日付ごとにまとめたSQL例

```sql
select 
    sum(user_id) ,
    date_trunc('day', created_at) as day
from
  a_table
where 
    created_at BETWEEN coalesce([[{{from_date}},]] current_date - '1 week'::interval) and coalesce([[{{to_date}},]] current_date) 
group by date_trunc('day', created_at)
order by date_trunc('day', created_at)
```

ref: https://www.wantedly.com/projects/432393?fbclid=IwAR1_jZ0-xxi2jSl3CIlA-j9PDLZOz-msEGEWc5ekeMxPQB38fIbw5fsyBD4
さくらのVPSにSSH接続+最低限のセキュリティ対策

## 初期設定+rootユーザー作成
- コンパネにログイン
- 「各種設定」>「OSインストール」
- CentOS7を選択
- rootユーザー用のパスワードを設定(作成)

rootユーザーでssh接続。デフォルトでは鍵認証では無く、パスワードでの認証が設定されています。

```zsh
$ ssh root@xxx.xxx.xxx.xxx #ipアドレス

The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx.xxx)' cant be established.
ECDSA key fingerprint is SHA256:+CMQV+bQVjTp+CJcpoj1u+J6LS24dAUWjv3tkxFYBSE.
Are you sure you want to continue connecting (yes/no)? #yesを入力

Password? # 先ほど作成したパスワードを入力
```

```zsh
$ yum update
```

## 一般ユーザーを作成

```zsh
$ adduser vpsuser
$ passwd vpsuser
Changing password for user vpsuser.
New password: #パスワードを設定
$ exit
```

一般ユーザーでログイン

```zsh
$ ssh vpsuser@xxx.xxx.xxx.xxx #ipアドレス
```

## ポート変更&rootユーザーでログインできないようにする
この設定をしないと、一晩で3万件くらいの不正アクセス(の試み)を受けてびっくりすることになります。

```zsh
$ su - # rootユーザーに切り替え
$ vi /etc/ssh/sshd_config # sshdの設定を編集
```
```diff:/etc/ssh/sshd_config
rootユーザーでログインできないようにする
- #PermitRootLogin yes
+ PermitRootLogin no

ssh接続のポート番号を変更 ※ウェルノウンポート以外のポート(49152〜65535)を指定
- Port 22
+ Port 50022
```
```zsh
$ systemctl restart sshd.service # 上記の変更を反映
```

一度ログアウトして

- デフォルトのポートではログインできないこと
- rootユーザーでログインできないこと
- 一般ユーザーで50022のポートを指定するとログインできること

を確認

```zsh
$ exit
$ ssh vpsuser@xxx.xxx.xxx.xxx #ipアドレス
ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused
$ ssh root@xxx.xxx.xxx.xxx -p 50022
permission denied...
$ ssh vpsuser@xxx.xxx.xxx.xxx -p 50022
SAKURA Internet [Virtual Private Server SERVICE]
```

## Firewallの設定
```zsh
$ su - # rootユーザーに切り替え 
$ vi /usr/lib/firewalld/services/ssh.xml # ssh接続のポート番号変更に対応
```
```diff:/usr/lib/firewalld/services/ssh.xml
- <port protocol="tcp" port="22"/>
+ <port protocol="tcp" port="50022"/>
```
```zsh
$ systemctl start firewalld #firewallを起動
$ systemctl enable firewalld.service #firewallの自動起動設定
$ firewall-cmd --list-all # 許可されている接続を確認
$ firewall-cmd --add-service=http --permanent #http接続を許可
$ firewall-cmd --add-service=https --permanent # https接続を許可
$ firewall-cmd --reload #　設定を反映
$ firewall-cmd --list-all
```

```zsh
$ systemctl reboot #OSを再起動
```

## SSHキーペアでログインできるようにする
ローカルでキーペアを作成

```zsh
$ cd .ssh
$ mkdir sakura_vps
$ cd sakura_vps
$ ssh-keygen -f id_rsa
```

公開鍵をサーバーに登録

```zsh
$ cat ~/.ssh/sakura_vps/id_rsa.pub | pbcopy
$ ssh vpsuser@xxx.xxx.xxx.xxx #ipアドレス
$ cd .ssh # or mkdir .ssh → cd .ssh
$ vi authorized_keys # クリップボードにコピーした公開鍵を登録
$ chmod 600 authorized_keys
$ chmod 700 ~/.ssh
```
`vi`コマンドは、指定したファイルがあれば開き、なければ新規作成してくれます。
クリップボードにコピーした公開鍵の記述を`autorized_keys`に貼り付けて保存しましょう。

次に鍵を使ったログインの確認です。

```zsh
$ exit
$ ssh -i ~/.ssh/sakura_vps/id_rsa vpsuser@xxx.xxx.xxx.xxx -p 50022
```

最後に、ssh-configに記述を追加して、ssh接続時のコマンドを簡略化します。

```zsh
$ exit
$ vim ~/.ssh/config
```
以下の記述を追加

```zsh:~/.ssh/config
Host sakura_vps
 HostName xxx.xxx.xxx.xxx # ipアドレス
 Port 50022
 User vps_user
 IdentityFile ~/.ssh/sakura_vps/id_rsa
```
接続確認

```zsh
$ ssh sakura_vps
```
Prestoのクエリーで同一テーブルの差分を求める

今回は、データベース毎にデータの差分クエリーを投稿します。
（備忘録として…）

#1.何のために差分するのか？

私が新人の頃は、ソースを修正する際に先輩方から「コンペアするといいよ」と教わりました。

最初は、コンペアの意味すら分からなかったが、つまり差分を求める意味だと理解してから、
新旧のソースコードをダウンロードして、ディフツールで修正箇所の差異を確認するようになりました。

#2.それから年月が流れて…

多少エンジニアとして経験を積み、新基幹システムのデータベースの設計業務に携わる身になってからは、
新システムへ移行する際に必要な旧システムのデータとの差異を日々確認していました。

それ以降は並行稼働を確認する際、差分の関数を使うようになりました。（当時は、Oracleを使用していました）

##3.クエリーによる差分確認

最近は、データ基盤を使用するようになったのでPrestoの書き方を記載しました。（ほぼOracleは忘れている、、、）

## oracle
Oraceの場合、MINUS関数を使用して差分を取得します。

```
select * from test_a
MINUS
select * from test_b
```


## Presto

OracleのMINUSが拡張である一方、PrestoのEXCEPTはANSI準拠になっています。

```
select * from test_a
except
select * from test_b
```

特に気を付けなければいけない事は、***test_aのSELECT結果からtest_bのSELECT結果を除外***するため、
test_aに存在するレコードのみが返ってきます。

ここは、順番が逆にならないように気を付けてください。
BigQueryテーブルデータよ。戻ってこい🙏

BigQueryのテーブルデータが壊れた！！！
という時や、１時間前に、昨日に、数日前に戻したいときのメモ。


[GCPリファレンス: FOR SYSTEM_TIME AS OF](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax?hl=ja#for_system_time_as_of)


### SQL
```sql:1時間前のデータを取得
SELECT *
FROM table
  FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR);
```


```sql:24時間前のデータを取得
SELECT
  *
FROM
  `project_name.database_name.table_name`
 FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR);
```

#### 最大値
**167HOUR** (6.95日)までは実行できるみたいなので、およそ1週間前までのデータは復元できそうです！
JavaはSmartArt図形をPowerPointに追加

SmartArtグラフィックは、テキスト情報の視覚的表現であり、強力な組版機能を備えています。この記事では、Javaコードを使用してスライドにSmartArtグラフィックを作成し、そのレイアウトをカスタマイズする方法を示します。

**使用ツール：** Free Spire.Presentation for Java（無料版）

**インストール方法1：** [Free Spire.Presentation for Java](https://www.e-iceblue.com/Download/presentation-for-java-free.html)パッケージをダウンロードして解凍します、次に、libフォルダーから、Spire.Presentation.jarパッケージをJavaアプリケーションにインポートします。

**インストール方法2：** Mavenウェアハウスを介してインストールおよびインポートします。詳細な操作手順については、リンクを参照してください：
https://www.e-iceblue.cn/licensing/install-spirepdf-for-java-from-maven-repository.html


**Javaコード例**

```java
import com.spire.presentation.FileFormat;
import com.spire.presentation.ISlide;
import com.spire.presentation.Presentation;
import com.spire.presentation.diagrams.*;

public class AddSmartArt {

    public static void main(String[] args) throws Exception {

        //PowerPointドキュメントを作成する
        Presentation presentation = new Presentation();

        //最初のスライドを取得
        ISlide slide = presentation.getSlides().get(0);

        //スライドに組織図「'Organization Chart'」を作成する
        ISmartArt smartArt = slide.getShapes().appendSmartArt(60, 60, 500, 300, SmartArtLayoutType.ORGANIZATION_CHART);

        //SmartArtのスタイルと色を設定する
        smartArt.setStyle(SmartArtStyleType.MODERATE_EFFECT);
        smartArt.setColorStyle(SmartArtColorType.DARK_2_OUTLINE);

        //既定のノードを削除する（SmartArtのグラフィック）
        for (Object a : smartArt.getNodes()) {
            smartArt.getNodes().removeNode(0);
        }

        //親ノードを追加する
        ISmartArtNode node1 = smartArt.getNodes().addNode();

        //親ノードの下に4つの子ノードを追加する
        ISmartArtNode node1_1 = node1.getChildNodes().addNode();
        ISmartArtNode node1_2 = node1.getChildNodes().addNode();
        ISmartArtNode node1_3 = node1.getChildNodes().addNode();
        ISmartArtNode node1_4 = node1.getChildNodes().addNode();

        //ノードのテキストとテキストサイズを設定する
        node1.getTextFrame().setText("本社");
        node1.getTextFrame().getTextRange().setFontHeight(14f);
        node1_1.getTextFrame().setText("投資管理部");
        node1_1.getTextFrame().getTextRange().setFontHeight(12f);
        node1_2.getTextFrame().setText("財務部");
        node1_2.getTextFrame().getTextRange().setFontHeight(12f);
        node1_3.getTextFrame().setText("営業部");
        node1_3.getTextFrame().getTextRange().setFontHeight(12f);
        node1_4.getTextFrame().setText("技術部");
        node1_4.getTextFrame().getTextRange().setFontHeight(12f);

        //ドキュメントを保存します
        presentation.saveToFile("SmartArt.pptx", FileFormat.PPTX_2010);
        presentation.dispose();
    }
}
```
**SmartArt効果を追加する：**
![smartart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0892a83e-6886-b9fe-851d-111245776b98.png)
【簡潔】Timeオブジェクト, Dateオブジェクトの生成方法~フォーマット文字列~

###概要
この記事ではTimeオブジェクトとDateオブジェクトについて学ぶことができます。
今回はターミナルのpryを利用して見ていきます。


###Timeオブジェクト

TimeオブジェクトはTimeクラスにnewメソッドを使用することで生成ができます。

```ターミナル
[128] pry(main)> datetime = Time.new(2018, 2, 1, 12, 34)
=> 2018-02-01 12:34:00 +0900
```
<br>
また、`strftime`メソッドを使うことで任意のフォーマットで日時を生成することができます。

```ターミナル
datetime.strftime("%Y年 %m月%d日 %H時%M分")
=> "2018年 02月01日 12時34分"
```

`%Y`などの見慣れない文字はフォーマット文字列の一つです。
`strftime`メソッドに引数として出力したい形式を表す文字列を指定します。

少しだけフォーマット文字列も紹介します。

###フォーマット文字列
|文字列|表示内容|
|:--|:--|
| %A | 曜日の名称(Sunday, Monday　など) |
| %a | 曜日の省略名(Sun, Mon　など) |
| %B | 月の名称(January, February など) |
| %b | 月の省略名(Jan, Feb など) |
| %c | 日付と時刻 |
| %d | 日(01~31) |
| %H | 24時間の時(00~23) |
| %M | 分(00~59) |
| %m | 月を表す数字(01~12) |
| %Y | 西暦を表す数 |
| %y | 西暦の下2桁(00~99) |

上の表を参考にしながら見ていきます。

```ターミナル
[140] pry(main)> Time.now.strftime("%c")
=> "Wed May 13 12:01:51 2020" 
```

`now`メソッドで現在の時間を取得しています。
そして`strftime`メソッドで任意のフォーマットで出力できるようにしています。
ここでは`%c`を使っていますね。

表を見てみると

|文字列|表示内容|
|:--|:--|
| %c | 日付と時刻 

なので日付と時刻が表示されています。


###Dateオブジェクト

Timeクラスから時刻を引いたDateクラスを使用して生成できるオブジェクトです。
Rubyの環境ではDateクラスをいきなり使用することができません。
ですので、以下のようにすることでDateライブラリを読み込んでDateクラスを使用することができるようになります。

```ターミナル
[131] pry(main)> require "date"
=> true
```

まとめると以下の感じです。

```ターミナル
[1] pry(main)> Date         #いきなり使用できない
NameError: uninitialized constant Date
Did you mean?  Data
from (pry):1:in `__pry__'

[2] pry(main)> require "date"  #requireでDateライブラリを読み込む
=> true

[3] pry(main)> Date　　　#Dateクラスが使用できるようになる
=> Date

```
<br>
Dateクラスは`today`メソッドを使うことで今日の日付を取得できます。

```ターミナル
[4] pry(main)> Date.today
=> #<Date: 2020-05-13 ((2458983j,0s,0n),+0s,2299161j)>

```

<br>
DateクラスもTimeクラスと同様に任意のフォーマットで出力できます。

```ターミナル
[135] pry(main)> Date.new(2019, 2, 3).strftime("%Y年%m月%d日")
=> "2019年02月03日"
```



この記事を読んでいただきありがとうございました。
Ruby : ファイルの標準入出力について

# ファイルをリダイレクトで標準入力する

```
$ ruby example.rb < sample1.txt
```

# ファイルをリダイレクトで標準出力する

```
$ ruby example.rb > sample2.txt
```
pまたはputsで出力した結果がファイルに保存される。

# ファイルのリダイレクトによる標準入出力を同時に行う

```
$ ruby example.rb < sample1.txt > sample2.txt
```

# 標準入力で受け取ったファイルの内容を1行ずつ表示する
- 対象ファイル

```meibo.txt
john	m	18
paul	m	20
alice	f	15
dabid	m	17
jasmin	f	17
```

- rubyプログラム

```example1.rb
while line = gets
  p line
end
```

- 出力結果

```
$ ruby example1.rb < meibo.txt
"john\tm\t18\n"
"paul\tm\t20\n"
"alice\tf\t15\n"
"dabid\tm\t17\n"
"jasmin\tf\t17"
```

# 標準入力で受け取ったcsvファイルの内容を1行ずつ表示する
- 対象ファイル

```meibo.csv
"john","m","18"
"paul","m","20"
"alice","f","15"
"dabid","m","17"
"jasmin","f","17"
```

- rubyプログラム

```example2.rb
require 'csv'

CSV(STDIN).each do |line|
  p line
end
```

- 出力結果

```
$ ruby example2.rb < meibo.csv
["john", "m", "18"]
["paul", "m", "20"]
["alice", "f", "15"]
["dabid", "m", "17"]
["jasmin", "f", "17"]
```
結果は配列で返ってくる。

# 標準入力で受け取ったjsonファイルの内容を1行ずつ表示する
- 対象ファイル

```meibo.json
[{"name":"john","gender":"m","age":"18"},
 {"name":"paul","gender":"m","age":"20"},
 {"name":"alice","gender":"f","age":"15"},
 {"name":"dabid","gender":"m","age":"17"},
 {"name":"jasmin","gender":"f","age":"17"}]
```

- rubyプログラム

```example3.rb
require 'json'

people = JSON.parse(STDIN.read)

people.each do |person|
  p person
end
```

- 出力結果

```
$ ruby sample3.rb < meibo.json 
{"name"=>"john", "gender"=>"m", "age"=>"18"}
{"name"=>"paul", "gender"=>"m", "age"=>"20"}
{"name"=>"alice", "gender"=>"f", "age"=>"15"}
{"name"=>"dabid", "gender"=>"m", "age"=>"17"}
{"name"=>"jasmin", "gender"=>"f", "age"=>"17"}
```
結果はhashで返ってくる。
【Go言語】２つの日付間の日付リスト／月リスト／時刻リストを作成する

最近は（個人的な趣味により）分析タスクの前処理など、できるだけGoで書くようにしています。
PythonやRではかんたんに書ける処理ですしGoのベーシックな処理なので今更感もありますが、検索してすぐに見つからなかったので自分用のメモを兼ねて。

もっと良い方法があればコメントいただけると幸いです。

# 日付リストを出力

開始日と終了日を指定し、その間にある日付リストを表示します（開始日・終了日を含む、以降同様）。

```golang
start, _ := time.Parse("2006/01/02", "2020/04/18") // 開始日
end, _ := time.Parse("2006/01/02", "2021/05/05") // 終了日

for d := start; !d.After(end); d = d.AddDate(0, 0, 1) {
    fmt.Println(d.Format("2006/01/02"))
}

// 2020/04/18
// 2020/04/19
// 2020/04/20
// ...
// 2021/05/03
// 2021/05/04
// 2021/05/05
```
判定を !d.After(end) としているのは、d.Before(end) だと未満の判定となってしまう為。

# 月リストを出力

開始月と終了月を指定し、その間にある月リストを表示します。

```golang
start, _ := time.Parse("2006/01", "2020/04") // 開始月
end, _ := time.Parse("2006/01", "2021/05") // 終了月
for d := start; !d.After(end); d = d.AddDate(0, 1, 0) {
    fmt.Println(d.Format("2006/01"))
}

// 2020/04
// 2020/05
// 2020/06
// ...
// 2021/03
// 2021/04
// 2021/05
```

# 時刻リストを出力

開始日時と終了日時を指定し、その間にある時刻リストを表示します。

```golang
start, _ := time.Parse("2006/01/02 15:04", "2020/04/18 22:00") // 開始日時
end, _ := time.Parse("2006/01/02 15:04", "2020/04/21 13:00") // 終了日時
for d := start; !d.After(end); d = d.Add(time.Hour) {
    fmt.Println(d.Format("2006/01/02 15:04"))
}

// 2020/04/18 22:00
// 2020/04/18 23:00
// 2020/04/19 00:00
// ...
// 2020/04/21 11:00
// 2020/04/21 12:00
// 2020/04/21 13:00
```

# 実装例

開始日文字列と終了日文字列から、日付文字列のリストを返す関数の実装例です。

```golang
package main

import (
    "fmt"
    "time"
)

// Days is function to get days between start and end.
func Days(start string, end string) ([]string) {
    st, _ := time.Parse("2006/01/02", start)
    en, _ := time.Parse("2006/01/02", end)

    var days []string
    for d := st; !d.After(en); d = d.AddDate(0, 0, 1) {
        days = append(days, d.Format("2006/01/02"))
    }

    return days
}

func main() {
    for _, d := range Days("2020/04/18", "2020/05/10") {
        fmt.Println(d)
    }
}
```

# 余談

余談ですが、R言語にはseq(開始, 終了, 刻み方)というリスト生成のための便利関数があります。日付型にも対応しているので開始日時、終了日時を与えるとちゃんと月や閏年を考慮した日付リストなどを返してくれます。

参考：[R言語で年齢や月齢を計算する](https://qiita.com/YuukiMiyoshi/items/b2fc8d4c83837f204e24)
Deno を Windows 10 にインストール

Windows 10 に Deno をインストールしてみました

## PowerShell を管理者権限で開きます

## インストールコマンドを実行すると、程なくして処理が完了します
```powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> iwr https://deno.land/x/install/install.ps1 -useb | iex
Deno was installed successfully to C:\Users\UserName\.deno\bin\deno.exe
Run 'deno --help' to get started
```

## Example を実行します
```powershell
PS C:\WINDOWS\system32> deno run https://deno.land/std/examples/welcome.ts
Download https://deno.land/std/examples/welcome.ts
Compile https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕
```


　
ようこそ！🦕
簡単ですね
Jupyter Notebook (IPython) でセルの出力をリッチにする

みなさん、SymPyは使ってますか？Jupyter NotebookでSymPyを使用すると、出力された式が美しく成形されて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/c201e453-a4d0-7692-64fe-3d27c6f6f095.png)
こんな感じですね。こんな風にリッチな出力ができるオブジェクトはどのように作るかご存じでしょうか？

[IPythonのドキュメント](https://ipython.readthedocs.io/en/stable/config/integrating.html)に書いてありました。`_repr_*_`という形式の名前のメソッドを実装することで実現できます。この`*`に当てはまるものは、

* svg
* png
* jpeg
* html
* javascript
* markdown
* latex

があります。SymPyはおそらくLaTeXで実装されているのだと思いますが、今回は分かりやすいSVGを使ってみましょう。

```python
Face() + Eye(35, 40) + Eye(65, 40) + Mouth(50, 75)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/242f5dc2-b39d-1c7e-7d83-ba62e1d23d55.png)

実装は以下の通りです。

```python
class Component():
    def __init__(self, items = None):
        self.items = items or [self]
    def __add__(self, target):
        return Component(self.items + target.items)
    def _repr_svg_(self):
        return ''.join([
            '<svg width="100" height="100">',
            *map(str, self.items),
            '</svg>'
        ])
    
class Face(Component):
    def __str__(self):
        return '<circle cx="50" cy="50" r="45" fill="none" stroke="black" stroke-width="1" />'

class Eye(Component):
    def __init__(self, x, y):
        super().__init__()
        self.x, self.y = x, y
    def __str__(self):
        return f'<circle cx="{self.x}" cy="{self.y}" r="5" fill="black" />'

class Mouth(Component):
    def __init__(self, x, y):
        super().__init__()
        self.x, self.y = x, y
    def __str__(self):
        return f'<path d="M{self.x} {self.y} l15 -5 h-30 Z" fill="none" stroke="black" stroke-width="1" />'
```
【Docker】 ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running?

# 初めに

AWSのEC2(AmazonLinux2)にてDockerを使おうとすると<br>
`ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running?`
というエラーが出たので、その時の対処です。

## 原因

今回は権限などの関係でエラーが出ていたようです。

Dockerをインストールするときにグループが作成されるのですが、
グループに入っていないと実行ができないので現在のユーザーに権限を付与します。
(グループが分からない方は「Linux グループ」で検索!)

## 解決策

Dockerとdocker-composeにそれぞれ権限を付与します。
以下のコマンドを実行
(ちなみに`$USER`は現在のユーザーです、気になる方は試しに`echo $USER`を実行してみたりしてください。)

~~~
$ sudo usermod -aG docker $USER
$ sudo chmod +x /usr/local/bin/docker-compose
~~~

実行した後は一旦サーバーからログアウトしましょう。<br>

~~~
$ exit
~~~

一旦ログアウトしないと権限の変更が反映されないみたいです。<br>
(私はここで結構つまづきました>_<)

## 終わりに

これでもう一回ログインすると、`docker-compose build`などのコマンドが通ると思います。
「はじめてのDart言語(0)」 ~私文男子の格闘第5話~

#はじめに
(2020/5/13投稿)

こんにちは。この頃ゼミが忙しいながらも楽しめている私文男子です。

本日は、Flutterで使用されるDart言語について調べたことと、簡単な処理について書こうと思います。
コードを実際に自分で書くのは初めてなので緊張しましたが、温かい目で見守ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/fb30746c-b320-d45b-5b57-7af93fa279df.png)


#Dart言語とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/90686bb8-a918-248c-5b43-eabb39ec6ce0.png)
Googleのオープンソースで開発されている言語。
立ち位置はJavaScript<=Dart<Javaくらいらしい。

**FlutterはDartで開発する**ので覚える必要がある。

#まずは環境を作る
環境を作ると言っても、特にインストールなどはいりません。
Dartpadとよばれるクラウド上にある環境を使います。今回は学習用なので、早く実行ができるDartpadを選びました。

https://dartpad.dev/

リンクにアクセスすると、以下のような画面が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/a754a26e-b198-b3c2-721e-8dd57f68d259.png)
エンジニアっぽくてかっくいいですよね(まだ言ってる)

画面のセクションは
エディタ(左)  :ここにDartのコードを書く
コンソール(右上)   :プログラムの出力結果や、エラーが出る
ドキュメント(右下)   :カーソルを合わせた部分の説明が出る
RUNボタン:プログラムを開始する

という感じです。プログラムはmain(){}の中かっこの中に書きます。
デフォルトで書いてあるものをRUNボタンを押して実行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/742d716e-4587-7362-fe5d-3bb8076e392d.png)

このようにエディタに書いたプログラムを実行してコンソールに出力する、という流れでやっていきます。

書き方がわかったところで、今回は切ります！
次回、簡単なプログラムと、関数などをやってみたいと思います！
RDS for PostgreSQLからAurora にデータを移行する

# RDS for PostgreSQLからAuroraにデータを移行する

RDS for PostgreSQLからAuroraにデータを移行するには以下のような方法が挙げられます。

- RDSのスナップショットから直接移行
- Auroraリードレプリカを使用
- pg_dump/pg_restoreを使用

今回はRDSのスナップショットから直接移行する方法を試してみます。


# RDSのスナップショットから直接移行

RDSのスナップショットから直接移行する手順は以下に記載されています。

- [RDS PostgreSQL DB スナップショットを Aurora PostgreSQL DB クラスターに移行する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Migrating.html#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Import.Console)


## DBスナップショット作成

スナップショット作成前にtest01テーブルを作成し、1レコード作成しておきます。

```
create table test01(
  id numeric,
  txt varchar(10)
);

insert into test01 values(1, 'aaa');
```


移行元のRDSのスナップショットを作成します。

データベースからスナップショットを作成するDBインスタンスを選択した後、以下の画面から「スナップショットの取得」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/470e8d8f-976a-f84e-490a-fc84bc9e117b.png)

次の画面でスナップショット名を入力し、「スナップショットの取得」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/08b554a8-2d96-2ff0-f46b-cf9e124457b3.png)

スナップショットの一覧画面に遷移するので、後はスナップショットの作成が完了するまで待つだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/7203f7b6-00f2-6ebb-8139-604f93615786.png)


## スナップショットからAuroraへ移行

先ほど作成したスナップショットからAuroraのクラスタを作成します。

方法は簡単でスナップショットの一覧から、「スナップショットの移行」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/c00c37ac-7cc9-2035-2ee8-92da73023ec9.png)

Auroraクラスタのインスタンスクラス等を選択してクラスタを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/fcf7fefc-1bc4-9a62-7bc9-f3e17d8ac621.png)

クラスタの作成はこれだけで、psqlで接続しtest01テーブルを検索すると1レコードが抽出され、RDS for PostgreSQLからAuropraへ移行できたことを確認できます。

```
$ psql -h database-1-migrated-cluster.cluster-XXXXXXXXX.ap-northeast-1.rds.amazonaws.com
Password for user postgres: 
psql (12.1, server 11.6)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> select * from test01;
 id | txt 
----+-----
  1 | aaa
(1 row)
```


# 最後に

スナップショットを用いてRDS for PostgreSQLからAurora にデータを移行してみましたが、簡単に実行することができました。
注意点としては、PostgreSQLのメジャーバージョンは揃えておかなければなりません。v12のRDSからv11のAuroraへの移行はできないようです。
v10のRDSからv11のAuroraへ移行する場合は、事前にスナップショットのアップグレードを実行しておけばよいはずです。


# 参考

- [RDS PostgreSQL DB スナップショットを Aurora PostgreSQL DB クラスターに移行する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Migrating.html#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Import.Console)
【kubernetes】Secretリソースを削除するには

#概要

- Kubenetesのリファレンスを読んだが、作成コマンドの記載は見つかったが、削除方法が明記されていなったのでここに記載しました。
- 個人的備忘メモのレベルで恐縮です。


#Secretリソースの作成/削除

## 作成
作成方法の詳細は[リファレンスのこちら](https://kubernetes.io/docs/concepts/configuration/secret/#creating-a-secret-using-kubectl)をご参照ください。

```--from-literal``` オプションで作成する場合は以下の形となります。（公式サイトの記載を引用）

```
kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb='
```

作成しなおそうと同じコマンドを実行すると以下の様にエラーが発生し、実行できません。

```
Error from server (AlreadyExists): secrets "dev-db-secret" already exists
```

削除する場合は、以下の様に行います。

## 削除

```
kubectl delete secret mongo-secret
```

- delete Secret名 とするだけです。
- 何気にリファレンスから探し出せなかったので、ちょっとはまりました。
awsの権限設定、ポリシーを作ろう


#プロローグ
awsではポリシーにより、アクセス権限を制御できます。
個人で使っている人の中には、ルート権限やIAMユーザに全権限を付与して使ってしまっているという人も多いのではないでしょうか。

awsのIAMベストプラクティスにも下記のようにあります。
>最小権限を付与する
>AWS 管理ポリシーを使用したアクセス許可の使用開始
>インラインポリシーではなくカスタマー管理ポリシーを使用する

ということで、カスタマー管理ポリシーを作成してみます。

#手順
IAMの画面にある、ポリシーを開きます。
上部にある「ポリシーの作成」を押下します。
<img width="803" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/8b058723-2854-8c7b-c76f-684dc12ed8f8.png">

サービスで許可するawsサービスを選択します。
これは事前にどういうことをしたいのか業務の要件を決めておく必要があります。
<img width="813" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/cfc00264-16c7-a896-f812-05e0120a1a02.png">

アクションを選択します。
詳細に設定したければ、「読み込み」など個別に設定が可能です。
画像は「すべて」を選択しています。
<img width="815" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/5852316a-e99b-84a6-9f02-8b45936ccb91.png">

アクションを選んだ段階ではリソースの警告が多量に出ています。
リソースもそれぞれ適切な設定にすることで警告が解消されますが、「すべてのリソース」を選択することで、まとめて解消もできます。
<img width="791" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/6982b12b-99b9-e9c8-8d35-afaa61305aab.png">

必須ではないですが、リクエスト条件を設定できます。
MFAの必須指定や送信元IPなどを設定したければ、チェックを入れておきます。
他にも追加したいawsサービスがある場合は右下にある「さらにアクセス許可を追加する」を押下して、ほかのawsも追加できます。
<img width="760" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/2f83c6c0-c9e1-25d9-9c08-9ecb8dc0d70a.png">

追加するawsサービスも同様に入力していきます。
<img width="792" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/6d37755d-ef49-1d9a-a23e-c1f694c020d1.png">

ちなみに、余談ですがブラウザでedgeを使っているのですが、追加していると「さらにアクセス許可を追加する」のボタンが隠れてしまいます。。
パーセントを小さくすると現れました。
<img width="770" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/eb359e6f-bce4-76bb-2429-1a7e50ecd5cb.png">

必要なawsサービスを登録できたら画面右下の「ポリシーの確認」を押下します。

任意の名前と説明を入力します。
画像では「Operation」としました。
選択したサービスに問題がなければ、「ポリシーの作成」を押下します。
<img width="769" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/eba7734c-cbf8-ff9c-516b-2171c3688f2b.png">

ポリシーのフィルタに作成した名前を入れたら、「ユーザによる管理」として登録されたことが確認できます。
<img width="770" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/66305254-e6d9-5276-15c8-034b3b378341.png">

#おわり
これでポリシーの作成は完了です。
ポリシーはロールと紐づけなければ効果がありませんので、IAMロールへのポリシーの紐づけも別記事でやりたいと思います。
入力した文字をリアルタイムで反映させる方法

個人的メモです
フォームに入力した文字を反映させる方法
## 📗 完成形
![14d0bba3e8c58537da2713088cc039ca.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/a814c296-6a13-9942-a053-60570fa5e317.gif)

## 📗 コード

HTMLの構造

```html
  <form id="form_test">

    <div id="input_value_box"></div>   //inputされた情報が入る場所

    <input type="text" name ="input_value" value="">
 </form>
 ```

```javascript:jsファイル
//inputに入力したらdivタグに文字が反映される


const formTestInputValue = document.forms.form_test.input_value; //document.formsでformの中身を取得,さらに後ろの記述で細かく指定できる


formTestInputValue.addEventListener('input',()=>{     //formTestInputValueにinputがされたら
  let inputValueBox  = document.getElementById('input_value_box');//input_value_boxのidを検索して
  inputValueBox.textContent = formTestInputValue.value  //inputValueBoxのtextcontentにformTestInputValueのvalueをくっつける
})
```

## 📗 おまけ【文字じゃなくて入力数を表示したいとき】

![3aa0260a7a089112401821da3e9934d4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/e7789bbc-d46f-75c7-252e-636ea1400077.gif)

JSの一番下の出力の最後にlengthとつけると文字数をカウントしてくれます。

```javascript
inputValueBox.textContent = formTestInputValue.value.length
```
テスト駆動開発とは？ 1

#はじめに
「テスト駆動開発」という言葉を教えて頂く機会があったので、調べてみました。
様々な記事を参考に、自分なりの解釈・言葉に置き換えました。
間違った認識をしていましたら、ご教授頂けますと幸いです。


## テスト駆動開発とは？
- Test-Driven Development: TDD　と言います。
- テストファーストな開発方法
- プログラムの実装（コード書き込む）前に、まずテストコードから書いちゃう。
- そのテストコードに合うように実装を進めていく。

*~心の声~*
*斬新というか、すごい工数（手間）がかかりそう。*
*なんのためにTDDってあるの？*


## TDDをする目的は？

- コード（設計）を綺麗にすること
 - テストと実装を一緒にするので、汚いコードになりにくいようです。 
- フィードバックの高速化
 - 実装前にテストコードを書いているので、記憶も新しいし、すぐ対応できる。 


*~心の声~*
*すごく良いこと尽くしではないか！*
*他にメリットはあるのかな？*

## こんなメリットがある！
- 後工程にバグやエラーを持ち越しにくい！
- デバック対応が短くなる！
- 案件（システム要件）についての理解が深くなる！
- 回帰テストができる！

#### 後工程にバグやエラーを持ち越しにくい！
- テスト　→　実装　→　リファクタリングの流れを**細かく**繰り返す。
- したがって、バグを見つけやすく、修正することができる。

#### デバック対応が短くなる！
- バグを見つけて、修正までの**間隔**が短いので、デバックの時間も短くなります！

#### 案件（システム要件）についての理解が深くなる！
- 必要なシステム要件を細くリストアップし、漏れがなく、かつ仕様を理解することができます！

#### 回帰（リグレッション）テストができる！
- テストファーストでテストコードを作っているので、リグレッションテストにも役立つ！

**私のイメージは・・・**
①テストファーストではない場合、バグが出そうな箇所のテストコードを書き足す必要がある。
②テストファーストのテストコードは全体を網羅しつつ、細かいところまでテストコードを作っているので、機能の追加やバグの修正をした際に、修正と無関係な部分を壊していないかチェックすることができる。


*~心の声~*
*大きいサービスでは、テストの質次第で、最悪の損失を生む可能性もある・・・*
*テストは絶対しないといけないし、先にするか後にするかならば、テストファーストで開発していくのもありと思えてきた！！*

*でもデメリットはやっぱりございます？*



## デメリットはこんな感じ・・・
- 慣れが必要だヨ・・・
- コーティング時間が伸びちゃうヨ・・・
- そもそもテストできんヨ・・・
- テストコードを保守する必要あるヨ・・・

#### 慣れが必要だヨ・・・
- すごくわかる。慣れが大事だと。
- TDDへの理解も重要みたいだ。

#### コーティング時間が伸びちゃうヨ・・・
- これは違うなと思いました。
- テストファーストをやめた　→　バグいっぱい出ました　→　修正時間かかる・・・
- 上記流れの方が長くなりそうだし、なんといっても**辛い**（泣）

#### そもそもテストできんヨ・・・
- データベース周りは難しい？そもそもできない？

#### テストコードを保守する必要あるヨ・・・
- リグレッションテストに使うために仕方がないことではあるが・・・
- 通常より保守するコード量が増える。
- そして、大きな変更があった場合には多くのテストを修正しなければならないこともある。


### 次はTDDの流れと注意点をまとめてみます！

#さいごに
日々勉強中ですので、随時更新します。ご覧いただきありがとうございました！
React JSXファイルでif分岐を作成した際にreturnの記述を誤った

メモです。

JSXファイルでif分岐を作って、returnする際に返却するDOMの記述方法で少し躓きました。

`NGパターン`

```jsx:index.jsx
{(() => {
  if (status == 'hoge') {
    // returnするDOMが複数の親要素を持ってしまっているのでNG
    return (
      <div className="hoge1">
        <p>fuga1</a>
      </div>
      <div className="hoge2">
        <p>fuga2</a>
      </div>
    );
  } else {
    // returnするDOMが複数の親要素を持ってしまっているのでNG
    return (
      <div className="hoge3">
        <p>fuga3</a>
      </div>
      <div className="hoge4">
        <p>fuga4</a>
      </div>
    );
  }
})()}
```

このような記述ですと、

`JSX 式には 1 つの親要素が必要です。`

という制約に引っかかってしまい、エラーになってします。
そこで以下のように1階層上のDOM要素を用意する事で回避することが出来ます。


`OKパターン`

```jsx:index.jsx
{(() => {
  if (status == 'hoge') {
    // returnするDOMが1つの親要素なのでOK
    return (
      <div className="parent1">
        <div className="hoge1">
          <p>fuga1</a>
        </div>
        <div className="hoge2">
          <p>fuga2</a>
        </div>
      </div>
    );
  } else {
    // returnするDOMが1つの親要素なのでOK
    return (
      <div className="parent2">
        <div className="hoge3">
          <p>fuga3</a>
        </div>
        <div className="hoge4">
          <p>fuga4</a>
        </div>
      </div>
    );
  }
})()}
```

テンプレエンジンは種類によって癖がありますが、慣れてしまえば非常に便利でいいですよね。
【RuboCop】RSpecのsubject使用時の規約違反とRuboCopの違反の種類について


#はじめに
RSpecでsubjectを使用して、DRYにしようとする中で、

```ruby
subject { get '/api', params: params, headers: headers; response }
```

このように書くと
RuboCopの警告を受けた。

> Do not use semicolons to terminate expressions. (convention:Style/Semicolon)

↓
> 終了の表現にセミコロンを使用しないでください。(規約:スタイル/セミコロン)

#対処
じゃあ、使わない場合はどうするか、、

```ruby
 subject do
   get '/api', params: params, headers: headers
   response
 end
```
こうすると、無事警告が消えました。
`subject do ~~ end`として、2行に分けることでセミコロンでコードの終端を表現する必要がなくなった、ということですね。

#RuboCopの警告の種類
ずっと、RuboCopの指摘の事を警告、とだけ呼んでしたが、これをきっかけに調べると、
今回の、`convention`は規約違反。
段階があり以下の通りとなっています。

| 種類     |    意味 |
|:-----------------:|:------------------:|
| Clean|違反なし |
| Convention|慣習違反|
| Warning |警告
|  Error|エラー
| Fatal |致命的

下に行くほど重大、ということですね。
勉強になりました。


###参考にさせて頂いた記事
- [Rubocopについて](https://qiita.com/t-vinn/items/fe57b5d6440712016742)



###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。