OmniAICreator/Qiita-1.07M huggingface dataset:
numpy.fftを使わずにnumpyでfftする

実用上は意味がないのですが、fftのアルゴリズムとnumpyの勉強のためにやってみました。
stockham FFTの周波数間引き型になります。
参考はこちら。
http://www.na.scitec.kobe-u.ac.jp/~yamamoto/lectures/parallelFFT/parallelFFT1.PDF


```
import numpy as np

def fft2sf(data):
	x=np.array(data,dtype=np.complex128)
	n=x.size
	nr=n//2; b=nr; wk=-2.j*np.pi/n
	wn=np.exp(wk*np.arange(nr))
	while b>=1:
		xb=x.reshape(-1,b)
		x0,x1=xb[0::2],xb[1::2]
		y0,y1=x0+x1,x0-x1
		y1*=wn
		x[0:nr]=y0.reshape(nr)
		x[nr:n]=y1.reshape(nr)
		b//=2
		wn=wn[::2].copy()
	return x
```


Intel Core i7-4600U,Windows10では、numpy.fftに対して
データ数2^10個で6倍、2^24個で3.5倍くらい時間がかかります。

任意基数のfftにすると次のようになります。

```
pn=[
	  2,  3,  5,  7, 11, 13, 17, 19, 23, 29,
	 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
	 73, 79, 83, 89, 97,101,103,107,109,113]

def factorise(n):
	pf=[]
	i=0
	while n>1:
		p=pn[i]
		while n%p==0:
			pf.append(p)
			n//=p
		i+=1
		if i==len(pn):
			pf.append(n)
			n=1
	return pf		

def fftnsf(data):
	x=np.array(data,dtype=np.complex128)
	n=x.size
	pf=factorise(n)
	a=1; b=n; wk=-2.j*np.pi/n
	wn=np.exp(wk*np.arange(n))
	for r in pf:
		b//=r; nr=n//r
		ir=np.arange(r)
		iwr=(nr*ir*ir.reshape(r,1))%n
		xb=x.reshape(a,r,b)
		y=np.dot(wn[iwr],xb)
		iw=a*ir.reshape(r,1,1)*np.arange(b).reshape(1,1,b)
		y*=wn[iw]
		x=y.reshape(n)
		a*=r;
	return x
```

データ数が大きく、基数が7〜20くらいのときはnumpy.fftに肉薄する速さになると思います。
MNCTF2018 標的攻撃IV★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6a2a2183-2f62-4635-14f4-1c8fa24ce944.png)

#解いてみた

さっき作成した実行ファイルの中身をbintextを使って見てみましたが、特にURLぽいのはありませんでした。

実行してwiresharkで確認してみます。

やってみると、DNS問い合わせでshinobotps1.comを解決していることはわかったものの、どこのURLにアクセスしようとしているのかよくわかりませんでした。
たぶんhttpsということでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/460fec42-0466-0de2-b3fb-f564de1ae1b1.png)

そして、画面に一瞬だけコマンドプロンプトが表示されて一瞬にして消えます。
この画面にURLが表示されると信じてプリントスクリーンを頑張って取りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/82493c4d-ad94-e437-ed0d-195f41b6b4af.png)

これが答えでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/51887eab-5161-7ebf-4f5a-f6e4096d186e.png)
WSL2の環境構築手順

## 概要

WSL2の環境を構築してみたので、個人的な備忘録として。

※2020年9月17日追記
記事の内容が古くなっているので、ブラッシュアップした内容を投稿しました。
DockerとVSCodeのRemote-Containersを使ってGoの環境を構築する手順も追加しましたので、もしよければこちらの記事を参照してください。
https://qiita.com/poramal/items/11912b5533ec8e7dbaac

## 環境

- Windows10 Home

- バージョン1903 (OSビルド 18362.295)

## 手順

1. Windows Subsystem for Linux（以下WSL）の有効化

1. WSLディストリビューションのインストール

1. Windows10 Insider Preview に登録

1. Windows10 Preview Build のインストール

1. 仮想マシンの有効化

1. WSL1→WSL2への変換

### 1. Windows Subsystem for Linux（以下WSL）の有効化

1. `コントロールパネル` > `プログラムと機能` > `Windowsの機能`ダイアログを開き、`Windowsの機能の有効化または無効化`をクリックしてダイアログを開き、そこで`Windows Subsystem for Linux`にチェックを入れる。

1. 再起動する。

### 2. WSLディストリビューションのインストール

1. `Microsoft Store`を起動する。

1. 検索ボックスに`WSL`と入力し、`Ubuntu`をインストールする。

1. `Ubuntu`を起動し（初回はしばらく待つ）、ユーザー名とパスワードを入力する。※Win10のユーザ名とパスワードと一致させる必要はない

### 3. Windows10 Insider Preview に登録

1. 以下URLの`1.登録`の手順に沿って登録する

    <https://insider.windows.com/ja-jp/getting-started/#register>

    ※4.でも可能っぽいので不要かも？

### 4. Windows10 Preview Build のインストール

1. `設定` > `更新とセキュリティ` > `Windows Insider Program`

1. Insiderの設定：`ファスト`を選択する。

1. 再起動する。

1. Windows Update を行う。（しばらく時間がかかります）

1. 再起動する。

1. `Win+R`で`winver`と入力し、OSビルドが`18917`以上であることを確認する。

### 5. 仮想マシンの有効化

1. `PowerShell`を管理者権限で起動し、以下コマンドを実行する。  

    ```sh
    Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

    Path          :
    Online        : True
    RestartNeeded : False
    ```

1. 再起動する。

### 6. WSL1→WSL2への変換

1. 現在のバージョンを確認する。（VERSIONが1になっている）

    ```sh
    wsl -l -v

        NAME      STATE           VERSION
    * Ubuntu    Stopped         1
    ```

1. `PowerShell`を起動し、以下コマンドを実行してUbuntuをWSL2へ変換する。

    ```sh
    wsl --set-version Ubuntu 2
    ```

    成功すると以下メッセージが表示されます。

    ```sh
    変換中です。この処理には数分かかることがあります...
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    変換が完了しました。
    ```

    以下のメッセージが出る場合は、UEFI(BIOS)の仮想化支援機能が無効になっているので、UEFI(BIOS)を起動して有効にしてください。設定方法は各メーカーの設定方法を参照してください。

    ```sh
    Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。
    ```

1. 変換後のバージョンを確認する。（VERSIONが2になっている）

    ```sh
    wsl -l -v

        NAME      STATE           VERSION
    * Ubuntu    Stopped         2
    ```
Python いまだに現金払い？

#問題
最近は電車もバスも電子マネーが当たり前。
でも、いまだに現金払いで払う人も意外に多いもの。
今回はバスに設置されている両替機を考えます。

この機械では、10円玉、50円玉、100円玉、500円玉の組み合わせに両替することができ、
いずれの硬貨も十分な枚数がセットされています。
（バスの運賃は現金の場合は10円単位になっているため、
1円玉、5円玉は取り扱っていません）

両替する際に、使われない硬貨はあっても構いませんが、
バスの中でたくさんの小銭が出ると困るため、
最大で15枚になるように両替します。
例えば1000円を両替するときに、「10円玉を100枚」という両替はできません。

1000円札を入れたときに出てくる硬貨の組み合わせは何通りあるかを求めてください。
なお、硬貨の順番は区別しないものとします。

```両替のイメージ.
1000
├ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
├ 500, 100, 100, 100, 100, 100
├ 500, 100, 100, 100, 100, 50, 50
└ 500, 100, 100, 100, 100, 50, 10, 10, 10, 10, 10
```

> 引用「プログラマ脳を鍛える数学パズル　著者 長井 敏克」


#回答

```answer_1.py
cnt = 0
for coin500 in range(0, 3):
    for coin100 in range(0, 11):
        for coin50 in range(0, 16):
            for coin10 in range(0, 16):
                if coin500 + coin100 + coin50 + coin10 <= 15:
                    if coin500 * 500 + coin100 * 100 + coin50 * 50 + coin10 * 10 == 1000:
                        cnt += 1

print(cnt)    # 20
```

```answer_2.py
import itertools

coins = [10, 50, 100, 500]
cnt = 0

for i in range(2, 16):
    for coin_set in itertools.combinations_with_replacement(coins, i):
        if sum(coin_set) == 1000:
            cnt += 1

print(cnt)    # 20
```

```answer_3.py
import copy
cnt = 0

def change(target, coins, usable):
    coin = coins.pop(0)
    if len(coins) == 0:
        if target / coin <= usable:
            global cnt
            cnt += 1
    else:
        for i in range(0, int(target / coin + 1)):
            change(target - coin * i, copy.copy(coins), usable - i)

change(1000, [500, 100, 50, 10], 15)
print(cnt)    # 20
```

#つまづいたところ
今回の問題はスムーズに解けたような気がしますね。

はじめの`answer_1.py`が1000円となる小銭とその枚数を単純に繰り返し求めています。
次の`answer_2.py`では、1000円札や2000円札、5000円札を使うこと、
1万円との両替なども考慮した拡張性のあるものとなっています。
最後の`answer_3.py`ではさらに再帰も使ったものになっています。

特徴として、
`answer_1`では、500円から順に0枚から各小銭の最大使用枚数まで、
for文をひたすら回しまくっていますね。
金額を変更するとその分for文を追加／変更したりなど拡張性に乏しいです。

`answer_2.py`では、`itertools`モジュールを使用しています。
`for coin_set in itertools.combinations_with_replacement(coins, i):`で、
変数coin_setの中には配列coinsからi個の要素を使ったタプル型が返されます。
例えばi = 2の時、`(10, 10), (10, 50), (10, 100),・・・`のように
配列coinsの中から2個の要素を使ったタプル型が返されます。
この時、`(10, 10)`のように要素の重複があるものも返されます。
あとはsum関数を使い、タプルの要素を足した合計数が1000となった時だけ、
変数cntに1を加えます。

`answer_3.py`では、`copy`モジュールを使用しています。
再帰の時に引数coinsに渡す際に`copy`を使っています。
これは再帰が実行されることによって、
関数change中のcoins、for文に影響を与えないようにしているのかなーと思います・・・
自信ないです、すみません。

スムーズに解けたわりには締まらない終わり方となってしまいましたが、
ご拝読ありがとうございました。
nginx 設定備忘録

# location
```
location / {
    [設定A]
}

location = / {
    [設定B]
}
```


| = | 完全一致 |
|:--|:--|
| ^~ | 前方一致 |
| ~ | case-sensitive*1な正規表現 |
| ~* | case-insensitive*2な正規表現 |
| なし | 前方一致 |

## 正規表現

括弧( )で囲うことにより後方参照。例ではphpのファイル名を設定Aの中で"$1"として参照可能。

```
location ~ ^/example/(.*\.php)$ {
    [設定A]
}
```
MNCTF2018 標的攻撃III★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d8547d29-13f0-c8cc-5b56-76503f77be24.png)

#解いてみた

前回の問題同様マクロを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1faa239b-91a8-a4cf-942d-a5c080802115.png)

簡単に処理を説明すると

- さっきの答えのURLにアクセスしてファイルをダウンロードする。
- ダウンロードしたファイルはcert.pemという名前で保存する。
- certutilでデコードしてcert.exeというファイル名で保存する。
- cert.exeを実行する。

という流れです。

手動でURLにアクセスしてダウンロードしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5c4da524-369f-d720-bdc6-e7b503bf5b68.png)

こんな感じの文字列を取得できました。
引き続きcertutilでデコードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a6114c71-d108-8874-ea13-4f3691eee83f.png)

できました。
このファイルが最終的に作成されるファイルなので、これのsha256を取得します。
CyberChefを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/63c8e8e4-1424-6872-ccfa-b4be6fdd7ce5.png)

これが正解です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f0d21564-6c79-da0e-fba5-75be6b54544c.png)
Python勉強の記録_190816

#今日やったこと



#学び
- listメソッド


- 三項演算子

```py
#普通に書くと
n=1
if n==1:
    print("yes")
else:
    print("no")
#yes
```

```py
#三項演算子
n=1
print("yes" if n==1 else "no")
#yes
```

- *でパック

```py
a, *b, c = "sample"
print(b)
#['a', 'm', 'p', 'l']
```
しかし他にも[いろいろな使い方](https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380)があるようで、よく分からない……
UUIDとGUIDのオーダーについて

多くのシステムでは、UUIDをBig-Endianとしてエンコードするが、
Microsoftの.NETで採用されているCOMなどをはじめとするシステムでは、
GUIDとして解釈するためMixed-Endianとしてエンコードするらしい。

## それぞれのエンコード例

`00112233-4455-6677-8899-aabbccddeeff`
このUUIDを例として説明。

### Big-Endiganとしてのエンコード例

Big-Endianなのでそのまま
`00 11 22 33` `44 55` `66 77` `88 99` `aa bb cc dd ee ff`という
オーダーとしてエンコードする。

### Microsoft関連システム上でMixed-Endian(GUID)としてエンコードする例

最初の3つのコンポーネントをLittle-Endianとして解釈し、最後の2コンポーネントをBig-Endianとして解釈するらしい。

つまり、
`33 22 11 00` `55 44` `77 66` `88 99` `aa bb cc dd ee ff`
というオーダーで解釈される。

## 参考文献

- https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding
MNCTF2018 標的攻撃II★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/65c72360-b0ee-6235-f62c-8b096a85a914.png)

#解いてみた

さっきの問題のExcelファイルを開いてマクロ画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/aa027fa8-5d38-e684-c077-4fe56200383c.png)

これが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f437604e-96e0-eaef-7692-e6041f202324.png)
MNCTF2018 標的攻撃I★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d4ecf39b-ee29-6762-bfd2-c1213b3c4aa6.png)

#解いてみた

ファイルをダウンロードしてxlsファイルを開きます。
一応危険なファイルなのでマクロはoffにしておきます。

そしてマクロの画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6fee71f5-849c-73e1-413c-ec71ec6cb718.png)

マクロを見るとif文でC列の値とユーザ名を比較していることがわかりました。
ExcelのC列を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/33fd637f-dcd6-9c89-ecf5-92c0f847e2c3.png)

一瞬ないのかと思ってしまいますが、つぶれているだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cb1a58d1-88b3-54d4-930f-a77e06285850.png)

白い文字で見づらいですが、ちゃんと書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8409e4f1-5d5c-1f2e-35fc-1092928b47af.png)
SmartGit 19にアップデートした結果、Hotfixが作れなくなった時の対処法

GitツールにはSmartGitを好んで使っているのですが、バージョン19.1にアップデートしたらGit-flowでHotfixが作れなくなりました。
よくみるとHotfixは1つしか作れないようです。
複数のHotfixをつくるにはFinishするかオプションを変える必要があるとのことです。

```
Start Hotfix: There is an existing hotfix branch 'xxx'. Finish that one first.; to work with multiple hotfixes at the same time, configure Git config option 'gitflow.multi-hotfix=true'.
```

なぜこんなことになっているのかはわかりませんが、Hotfixを複数作りたいときもありますよね。
デフォルトでそうなっているだけで、メッセージの通りコマンドで設定を変えればOK。
※ちなみにRC版のときはアップデートのたびに設定がリセットされてるっぽかったけど、今後もリセットされてしまうのだろうか。

Git管理しているディレクトリで以下のコマンドを実行します。（GitBashとかで実行）

```
git config --add gitflow.multi-hotfix true
```

グローバルに設定する場合は以下のようになります。（GitBashとかで実行）

```
git config --global --add gitflow.multi-hotfix true
```

SmartGit 19では、Gitflowにgit-flow AVH Edition（AVH = A Virtual Home）を採用しているらしいです。
https://smartgit.userecho.com/communities/1/topics/409-add-support-for-gitflow-avh
https://github.com/petervanderdoes/gitflow-avh


## 2020.05.15 Releaseブランチも複数作れなくなっていたことに今更気づく

https://www.syntevo.com/blog/?p=4767

1年前にちゃんと記載されていた。。。
というこうで以下で複数リリースブランチを有効化します。

```
git config --global --add gitflow.multi-release true
```
Jupyter環境で.envを環境変数としてロードする方法

# 要点

## やりたいこと
Jupyter環境下で、.envファイルの内容を、**環境変数**として、できるだけ**シンプルなコード**でロードしたい。

## 実現方法
1.`python-dotenv`のインストール

```sh
# pipやpipenvなどお好みのツールで
pipenv install python-dotenv
```

2.ディレクトリ内に.envファイルを設置

```.txt
#.envの例
DATA_ROOT=./data
```

3.Notebook内で、.envを読み込み、環境変数としてロードする

```.ipynb
%load_ext dotenv
%dotenv

#環境変数として読み出し
DATA_ROOT = os.environ.get('DATA_ROOT')
```

# 背景など
Git等を用いて、他人とコードを共有しつつ作業を進める場合、`API_KEY`といった秘密にすべき情報や`PATH`のような自身の環境依存的な情報は、共通リポジトリには含めるべきでないとされています。そのやり方の一つとして、このような情報をまとめて`.env`ファイルに記述し、`.gitignore`で`.env`を指定してバージョンコントロールから除外するやり方があります。
`.env`に記述された変数情報は、例えばpipenvを使用している場合、仮想環境の構築と同時に環境変数として自動でロードされます。しかし、Jupyter実行時には`.env`の変数情報は自動ではロードされません。今回は、`python-dotenv`というPackageを用いることで、Jupyter実行環境中に`.env`の情報をできるだけシンプルなコードでロードしました。

# Reference
 [python-dotenv:Github](https://github.com/theskumar/python-dotenv#ipython-support)
MNCTF2018 種類特定★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2e867508-58bf-b0ba-d1a2-c3811c97e501.png)

#解いてみた

ファイルをダウンロードしてみると、pcapファイルでした。wiresharkで開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c0905a84-1057-f807-96ff-96672f31cfd6.png)

かなり少なめです。
4番の通信が明らかに怪しいので、この文字列でgoogle検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f94b0f95-9690-7554-2e14-7f91466e4998.png)

これですかね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/331aaaac-8489-9adf-b7a0-42548b7c6985.png)

結構 運要素が高い気がします。
本来どうやって解くんでしょうか？
plunkerでdrag

#概要

plunkerでdragやってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/94e69f96-5039-4dbe-eb18-68edcc691606.png)


#成果物

https://embed.plnkr.co/6eQrKphboawprVjVr4MN/

以上。
MNCTF2018 大量不正★★☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/29d6e31f-43e4-30df-64f5-44e164c1dfd7.png)

#解いてみた

添付ファイルをダウンロードして解凍して中を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/311a7869-05ab-0eec-b628-e6648b3c1ddf.png)

ファイルが100個もあります。
適当に一つ中身を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ca4b4135-6c88-74da-87b2-3583ed9009d9.png)

こんな感じの数字がたくさん書かれているファイルでした。
類似といえばssdeepでしょうか？

ssdeepやってみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bfd30d1e-1e67-4124-b9fc-a80ba10adbf9.png)

というような感じになりました。
この中から同じものを探します。
ファイルにいったん出力してソートしたら見つけやすかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/de826e1f-f651-b3e3-8ad3-79f0acf0f6e7.png)

これが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fb0ce440-9af1-bb47-3917-52730c79a128.png)
UNION とUNION ALLの違い

UNION と UNION ALL の違いをご説明します。

UNION ALL は、名の通り、UNION の 兄弟みたいなものです。
なので、まずは、UNIONの話をします。

# UNION とは
2つのSQLの実行結果を縦方向に合体(連結)させる機能。

具体的には、こんな感じです。

- 1個目のSQLの実行結果

|test_pk|test_val
|---|---
|1|a
|2|b

- 2個目のSQLの実行結果

|test_pk|test_val
|---|---
|2|b
|10|a2
|11|b2
|13|c2

- UNIONで合体(連結)させた実行結果
 
|test_pk|test_val
|---|---
|1|a
|2|b
|10|a2
|11|b2
|13|c2

- UNIONを使ったSQL

```
select test_pk, test_val from test1
union 
select test_pk, test_val from test2
```

2つのSQLの実行結果を縦方向に合体(連結)させる機能です。

## 特異機能
合体(連結)させるときに、あることをやっています。
それは、「重複の削除」。

1個目と2個目の実行結果で、同じ行（重複行）は、省いて表示します。
例で言いますと、以下が1個目と2個目で、重複しています。

- 1個目と2個目のSQLで重複している行

|test_pk|test_val
|---|---
|2|b

重複なしであれば、2行表示されますが、重複を削除しているので、1行で表示されます。

## 注意点
- 2つのSQLの項目（test_pk, test_val）の「数」、「型」が、一致しないとNG。

# UNION ALL とは
UNION の特殊機能（重複の削除）を止めた機能です。

- UNION ALLで合体させた実行結果

|test_pk|test_val
|---|---
|1|a
|2|b
|2|b
|10|a2
|11|b2
|13|c2

- UNION ALLを使ったSQL

```
select test_pk, test_val from test1
union all 
select test_pk, test_val from test2
```

以下が1個目と2個目のSQLで、重複していますが、UNION ALLの実行結果も重複しています。

- 1個目と2個目のSQLで重複している行

|test_pk|test_val
|---|---
|2|b


- UNION ALLで合体(連結)させた実行結果

|test_pk|test_val
|---|---
|1|a
|2|b
|2|b
|10|a2
|11|b2
|13|c2

# 個人的な使いどころ
UNION ALLは、調査でデータを抽出したいときに、良く使います。
2つのSQLを2回実行して、Excelでソートするという手もあるのですが、
1回で実行して、ついでに並び替えしたいとか。
そういうときによく使います。

UNIONは、正直使う機会がありませんでした。
調査で使うので、重複している行も確認したいことが多かったので。
vue-qrcode-readerをとりあえず使う

# vue-qrcode-readerをとりあえず使う

<img width="414" alt="IMG_3866.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/d7d923a7-f978-a4ec-5134-dddc81bb80e2.png">


## ゴール
こちらの「[vue-qrcode-reader](https://github.com/gruhn/vue-qrcode-reader)」を自身のレンタルサーバでとりあえず使用できる状態にします
都合上windows環境で行っているのですが、多分mac環境ならもっとすんなり行くかと思います

[完成品サンプル](https://shioharu.minibird.jp/dist/)

## 環境

### 開発環境

- Windows10最新
- Vagrant最新
- VirtualBox最新

### 本番環境(ソース公開場所)

- スターサーバー(ライトプラン) 無料SSL化済み

## 手順

### cmd起動

管理者権限で行ってください

### vagrant起動

```
vagrant up
```

### ssh接続

```
vagrant ssh
```

### node.jsインストール

マウントフォルダ以外の任意の場所でnode.jsをインストール(例はvagrantのhomeでやってます)

```
$ cd /home/vagrant
$ sudo yum install https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
$ sudo yum install nodejs -y
```

vagrant再起動のため、vagrantユーザーで　```$ exit```
cmdにて ```vagrant reload```

もう一度、```vagrant ssh```

以下のコマンドでバージョンが表示されればOK

```
$ node -v
$ npm -v
```

### vue-cliインストール

```
$ sudo npm install -g @vue/cli
```

vagrant再起動のため、vagrantユーザーで　```$ exit```
cmdにて ```vagrant reload```

もう一度、```vagrant ssh```

以下のコマンドでバージョンが表示されればOK

```
$ vue -V
```

### Vue.jsのプロジェクト作成

```
$ cd /home/vagrant/
$ vue create my-project
```

defaultでよいです。
作成できたらプロジェクト内へ移動。

```
$ cd /home/vagrant/my-project
```

サーバ起動

```
$ npm run serve
```

ブラウザで http://localhost:8080/
もしくは http://vagrantのIP:8080/
vue.jsのデフォルトのホームが表示されればOK

### vue-qrcode-readerのインストール

```
$ cd /home/vagrant/my-project
$ sudo npm install vue-qrcode-reader
```

### .vueファイル作成

```
$ vi /home/vagrant/my-project/src/Qr.vue
```
こちらの[Source](https://gruhn.github.io/vue-qrcode-reader/demos/DecodeAll.html) をそのままコピペします。

### main.js書き換え

デフォルトのやつを流用しちゃいましょう

```
$ vi /home/vagrant/my-project/src/main.js
```

以下のように書き換え

```main.js
import Vue from 'vue'
import Qr from './Qr.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(Qr),
}).$mount('#app')
```

### build実施

```
$ npm run build
```

ここでnpm run serveして確認すると「ERROR: Stream API is not supported in this browser」になっているはず。
ポートなしlocalhost、オレオレssl化済みなvagrant環境であればここでもうvue-qrcode-readerの使用ができるかも。

### buildしたソースをvagrant環境からwindows環境へ

distフォルダを全てコピーします。(故にfaviconなど不要なものも入ってます)
windows環境へ持ってこれる場所ならどこでも良いです。

```
sudo cp -r /home/vagrant/my-project/dist /vagrant/
```

### サーバにdistフォルダをアップロード

distをまるごとサーバに置きます

### パスを修正する

アクセスすると当然と言えば当然ですが、jsやcssのパスが通っていないのでdistフォルダのindex.htmlのパスを修正します。
パスを修正すれば正常に起動するかと思います。
あとは起動が確認できたソースを好きに弄って自分の使いたいようにすればよいと思います！
無いとは思いますがSSL化されていなかったり、カメラの無い端末で確認したりしないようにお気をつけてｗ

## あとがき

お盆休み前にvue-qrcode-readerを使用できないかと調査を依頼され、苦戦したので書いてみました。
Vue.jsは初めて使用したので無駄なことをしている部分は多いかもしれませんがとりあえず動かしてみたい人は参考にしてみてください。
MNCTF2018 新人奮闘V★☆☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5329f9b5-e0a8-047e-68bf-04de6d52216a.png)

#解いてみた

さっきの問題の答えからIPアドレスは分かっているので、それをwhoisします。

[Whois search – APNIC](https://www.apnic.net/about-apnic/whois_search/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0784191e-e809-d304-c049-c816f05c2f53.png)

これが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/554e977a-f658-76bc-aaaa-a14015d5a0a5.png)
匿名クラス(無名クラス)

##匿名クラスとは

その場一回だけしか使わないようなクラスを作る場合に用います。

普通はインターフェースを実装したクラスを宣言し、そのクラスのインスタンスを生成しメソッドを呼び出しますが、匿名クラスだとインターフェースの宣言とメソッドの利用を同時に行えます。


##匿名クラスを利用しない場合
今回はoutputというメソッドを持つ自作インターフェースを用いました。

```java:IPrint
public interface IPrint {
	void output();
}
```

IPrintインターフェースを実装したクラスを作り、メソッドに処理詳細を記述します。

```java:PrintImpl
public class PrintImpl implements IPrint{

	@Override
	public void output() {
		System.out.println("aaa");
	}
}
```

実行クラスで呼び出します。

```java:Main
public class Main {

	public static void main(String[] args) {
		
		IPrint ip = new PrintImpl();
		ip.output();//コンソールに"aaa"と出力される
	}
}
```


##匿名クラスを利用した場合

インターフェースを実装したクラスを作らずに、実行クラスでIPrintのメソッドを利用することができます。

```java:Main
public class Main {

	public static void main(String[] args) {
		
		IPrint ip = new IPrint() {
			@Override
			public void output() {
				System.out.println("aaa");
			}
		};
		ip.output();
	}
}
```

さらにラムダ式で行数を短縮できます。

```java:Main
public class Main {

	public static void main(String[] args) {
			
		IPrint ip = () -> System.out.println("xxxx");
		
		ip.output(); // "xxxx"と出力される
	}
}
```



インターフェースにないメソッドを新たに追加する場合は、インスタンス生成時にインターフェース型の変数で受けません。

```java:Main
public class Main3 {

	public static void main(String[] args) {
		
		new IPrint() {
			@Override
			public void output() {
				System.out.println("aaa");
			}
			
			public void output2() {
				System.out.println("bbb");
			}
		}.output2();
	}
}
```
Power BIのページを分析用とレポート出力用に分ける方法

#はじめに
Power BIのダッシュボードをPDF出力する場合、ビジュアルのサイズが小さいと、スクロールバーが表示されて全てのデータが見れないことがあります。
Power BIのページを分析用とレポート出力用で使い分けてみました。

##分析用ページ
- インターラクティブに分析、可視化できるダッシュボード
- スライサーによるフィルターを利用（UIで操作することを想定）
- 画面表示向けのレイアウト

![Population_Analysisi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/5216d879-6e77-9a0a-43b4-60c5f8c23dea.gif)

 
##レポート用ページ
- レポート出力向けの静的なダッシュボード
- ページまたはビジュアルごとのフィルタ設定を利用
- 印刷向けレイアウト(A4縦等)  →ビジュアルのサイズをスクロールバーが表示されないよう調整
 
![Population_Report2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/537be637-1028-e63e-a227-2e16b3b154b3.gif)


## ページ設定
1) 分析用のページは、pdfに出力されないよう、非表示とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/5bb2c2a8-4f34-af62-5033-21efcbdbc966.png)
2) レポート用ページのページサイズをカスタムで設定します
ここでは、A4縦を想定し、幅1280ピクセル、高さ1810ピクセルに設定
参考 A版の比率　1:1.414（横:縦)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/51b95cc1-887c-aeb4-042f-faf02b9be7bf.png)

#参考
Power BI ドキュメント
https://docs.microsoft.com/ja-jp/power-bi/desktop-export-to-pdf
CentOS系 + openssl-devel 導入でてこずった件

# はじめに

## 環境
・Windows10 Professional バージョン1903 OSビルド18362.295
・Asianux7 SP3（試用版）※CentOS7.6相当
・VirtualBox 6.0.10
・Vagrant 2.2.5

## この記事の目的
rbenv（Rubyバージョン管理システム）を導入するためにopenssl-develをインストールする必要があったのですが、依存性関連で苦労したので備忘録として残すために書きました。（ほぼ自分用）
通常のCentOSを使っている限りは遭遇しないトラブルです。

# 経緯的なもの
## rbenvに必要なパッケージ

rbenvインストール時に必要なパッケージの一つが``` openssl-devel ```です。
※rbenvインストールについては別途記事を起こしたいと思います。

## 依存性エラー 

普通に```yum install``` でopenssl-develを入れようとしましたが、バージョンが合わないみたいです。

```
# yum -y install openssl-devel
（中略）
エラー: パッケージ: 1:openssl-devel-1.0.2k-16.el7_6.1.x86_64 (updates)
             要求: openssl-libs(x86-64) = 1:1.0.2k-16.el7_6.1
            インストール: 1:openssl-libs-1.0.2k-16.0.1.el7.AXS7.x86_64 (@anaconda/7)
                openssl-libs(x86-64) = 1:1.0.2k-16.0.1.el7.AXS7
            利用可能: 1:openssl-libs-1.0.2k-16.el7.x86_64 (base)
                openssl-libs(x86-64) = 1:1.0.2k-16.el7
            利用可能: 1:openssl-libs-1.0.2k-16.el7_6.1.x86_64 (updates)
                openssl-libs(x86-64) = 1:1.0.2k-16.el7_6.1
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
```

openssl関係で入っているrpmパッケージを確認するとAsianux用に特別にパッケージングされているバージョンの様です。
openssl-libsが重要なライブラリなのですが、このバージョンが合わないとopenssl-develが入れられないみたいです。
同じ1.0.2kなのに・・・

```
# rpm -qa | grep openssl
openssl-1.0.2k-16.0.1.el7.AXS7.x86_64
openssl-libs-1.0.2k-16.0.1.el7.AXS7.x86_64
```

# 失敗例

## openssl-libsを削除したら大変なことに

openssl-develをAsianux7sp3専用リポジトリからインストールすれば全く問題ないはずなのですが、試用版なので製品登録していません。
CentOS7用のリポジトリ―からインストールするために一旦opensslとopenssl-libsを削除すれば良いと考えました。
しかしこれは浅はかな考えでした。
良い子はマネをしてはいけません。

### yumで削除してみよーん

```
# yum remove openssl
（あっけなく削除できる）
# yum remove openssl-libs
（他のパッケージが依存しているので「保護される」旨のメッセージが出て削除できない）
```

openssl-libsはいろいろなパッケージから参照されているみたいです。
例えばyumコマンドもそうです。yumも依存しているという事は・・・

### rpmコマンドで削除してみよーん

今考えると恐ろしい行為です。
普通に```rpm -e```しても依存性チェックではねられるので、```--nodeps```という禁断のオプションを付けてopenssl-libsを強制的に削除してみました。
あっさり削除できました・・・

```
# rpm -e --nodeps openssl-libs-1.0.2k-16.0.1.el7.AXS7.x86_64
```

### 何が起こるか
yumコマンド、curlコマンド、wgetコマンド、sshコマンドなどssl通信を行うコマンドが軒並み利用不能になりました。
rpmパッケージがダウンロードできません。
scpも使えないのでこのシステムにファイル転送する手段が思い当たりません（素のftpコマンドだったらいけるかも）

## リカバリ

とりあえず、vagrant環境の作り直しです。
個人的なテスト環境なので誰にも迷惑をかけなかったことは不幸中の幸いでした。
vagrantなら下の2行でもとどおり初期状態に復活します。

```:コマンドプロンプト
> vagrant destroy
> vagrant up
```

# 成功例
うまく行ったやりかたです。

## openssl-libsはアップデートで
openssl-libsを削除すると大変なことになることを身に染みてわかったので、アップデートで行きます。

### opensslの削除
これは失敗例と同じで```yum remove openssl```でOKです。

### フォースのちから
openssl-libsのrpmファイルはターゲットのバージョンを適宜ダウンロードします。
そしてopenssl-libsを強制的にアップデートします。
「ルーク、フォースの力を信じるんだ！」

```
# curl -O http://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/Packages/openssl-libs-1.0.2k-16.el7_6.1.x86_64.rpm
# rpm -Uvh --force openssl-libs-1.0.2k-16.el7_6.1.x86_64.rpm
```

### opensslとopenssl-develをインストール

```
# yum -y install openssl openssl-devel
```

### インストールしたパッケージの確認
無事にopenssl-develをインストールできました。

```
# rpm -qa | grep openssl
openssl-devel-1.0.2k-16.el7_6.1.x86_64
openssl-libs-1.0.2k-16.el7_6.1.x86_64
openssl-1.0.2k-16.el7_6.1.x86_64
```

# おわりに

rpmコマンドの--forceオプションについて学ぶことができました。
また下手にパッケージを消すと大変なことが起こることを身をもって体験できたのはよかったです。
冒険は個人的なテスト環境でやるようにしましょう。
MNCTF2018 新人奮闘IV★☆☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b2ed5533-2bd5-041e-6781-831746ac9078.png)

#解いてみた

ログを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d71ecba9-9274-2440-442a-bb59750ffa4d.png)

こんな感じのが延々続いています。
さっきの問題の答えにユーザ名があったので、それで検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/de16715c-e574-b269-e0d8-b83d69e9c7a1.png)

1件だけヒットしたのでこれが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8ffbbd46-4a8c-4ebb-21a8-b8aeacbf601d.png)
仕事を爽やかにスタートさせるバッチファイル


#はじめに

毎朝、Outlookを立ち上げて〜、OneNote立ち上げて〜、勤休システムをWebブラウザで開いて〜、なんてことを繰り返していたので、少しでも効率化しようと思ってバッチファイルを作成しました。

ちょっと調べるだけで、意外と簡単にできました。よかったら参考にしてください。


#完成版のバッチファイル
```
@echo off

set TARGET_OUTLOOK="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE"
set TARGET_ONENOTE="C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE"
set TARGET_OFFICEHP="https://www.office.com"
set TARGET_INTRAHP="勤怠システムURL"
set TARGET_FILE="ファイルパス"
set TARGET_FILEPY="C:\Users\XXXX\Documents\Python"


start "" "%TARGET_OUTLOOK%"
start "" "%TARGET_ONENOTE%"
start "" "%TARGET_OFFICEHP%"
start "" "%TARGET_INTRAHP%"
start "" "%TARGET_FILE%"
start "" "%TARGET_FILEPY%"
start "Anaconda Prompt - jupyter notebook" C:\Users\XXXX\AppData\Local\Continuum\anaconda3\Scripts\activate.bat C:\Users\XXXX\AppData\Local\Continuum\anaconda3
start "Nodejs Prompt" cd C:\Users\XXXX\Documents\Nodes
```

やっている内容は、以下の通り。

* Outlookの起動
* OneNoteの起動
* Office365のスタート画面を表示
* 社内勤怠システムの画面を表示
* 作業用フォルダを表示
* Python作業用フォルダを表示
* Anacondaプロンプトを起動
* Nodejs用コマンドプロンプトを起動


#変数の設定

バッチファイルでは、変数の設定に「set」を使います。

```
set 変数名 = 変数の値
```

変数の値を参照するには、「%変数名%」で確認できます。

```
echo %変数名%
```

今回のバッチファイルでは、必要なフォルダパスなどの情報をこれらの変数に入れて使いました。


#アプリケーションの呼び出し

startコマンドを使うと、他のバッチファイルやアプリケーションを呼び出すことができます。

```
start ["タイトル"] [オプション] [アプリケーション／バッチファイル名]
```

タイトル部分には、ウィンドウのタイトルを指定することができます。

オプション部分には、以下のようなオプションを指定することができます。

* /min : ウィンドウを最小化状態で起動する
* /max : ウィンドウを最大化状態で起動する


ちなみに似たコマンドに「call」というものもありますが、主な違いは呼び出したアプリケーションの終了を待つか待たないかです。

* start : 呼び出したアプリケーションの起動終了を待たない
* call : 呼び出したアプリケーションの起動終了を待つ


今回のバッチファイルの内容は、特に前後関係がないので、startを使うことにしました。


#Outlookの起動

Outlookを起動しているのは、以下の記述部分です。

```
set TARGET_OUTLOOK=C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE
(中略)
start "" "%TARGET_OUTLOOK%"
```

Outlookのexeファイルが置かれている場所を変数に設定し、その後、startコマンドで起動します。

exeファイルは、環境やバージョンで異なると思いますので、自分の環境に合わせて変更してください。

OneNoteも同じ要領で起動できます。


#Webブラウザを起動

Webのブラウザを起動してるのは、以下の記述部分です。

```
set TARGET_OFFICEHP="https://www.office.com"
(中略)
start "" "%TARGET_OFFICEHP%"
```

先ほどは、startコマンドでOfficeのexeファイルを指定していましたが、Webブラウザを表示したい場合は、その部分を開きたいWebページのURLにすればOK！

startコマンドでは、自動的に起動に使用するアプリケーションを判定してくれるので、URLを指定するだけでWebブラウザを立ち上げてくれるんですね。

さすがです。


#フォルダのエクスプローラを起動

フォルダのエクスプローラを起動しているのは、以下の記述部分です。

```
set TARGET_FILE="ファイルパス"
(中略)
start "" "%TARGET_FILE%"
```

エクスプローラを開きたい場合は、開きたいファイルパスを指定するだけ。簡単です。



#コマンドプロンプトを起動

最後にコマンドプロンプトの起動方法です。

私の作成したバッチファイルでは、以下の部分でコマンドプロンプトの起動を行なっています。

```
start "Nodejs Prompt" cd C:\Users\XXXX\Documents\Nodes
```

コマンドプロンプトを起動した後、いつもNode.jsのお勉強用に使用しているフォルダへcdコマンドで移動しています。

コマンドプロンプトのタイトルは、「Nodejs Prompt」と表示されます。


#まとめ

使用したコマンドは、「set」「start」くらい。これだけで、朝の日課がかなり楽になりました。特に、勤怠システムのページが毎回自動で開くので、勤怠の入力忘れが激減しました。

バッチファイルはあまり最近は人気がないような気がしますが、ダブルクリックで簡単に誰でも使える、という点はやっぱり大きい。

日々のちょっとした作業の効率化には、欠かせない存在なのでは？
MNCTF2018 新人奮闘III★☆☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/514a2cda-1541-c618-a11d-ef6deb392c3e.png)

#解いてみた

bintextで文字列を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a6efb3f1-9dc9-c5db-7594-44a06220de0b.png)

コマンドありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b1a74f8b-6179-d901-1c2d-92121138fca4.png)
MNCTF2018 新人奮闘II★☆☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a94d6be2-54e4-4a2a-861b-8f84ba5e40e5.png)

#解いてみた

リンクにアクセスしてみると、解析レポートがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b581c0be-026d-ae5f-c991-dcf0f4d315cb.png)

項目は

- ファイル情報
    - ファイル名
    - MD5
    - SHA1
    - SHA256
    - ファイルサイズ（バイト）
    - ファイルタイプ

- PE情報
    - コンパイル日時(UTC) YYYY/MM/DD hh : mm : ss形式

- Import関数
    - 関数名
    - DLL名

結構たくさん答えないといけません。
この中でファイル名とファイルタイプはすでに埋められていたのでとだ君が頑張ってくれたんだと思います。
Import関数も少し書かれています。

それでは一つずつ解いていきます。

MD5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b217243f-e242-8f54-f82b-39b6f40f37c2.png)

SHA1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/43c87f16-98df-4d34-04bb-cc2f80a52371.png)

SHA256

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2fe4002c-f19d-8657-c999-cc0bdfc693d1.png)

ファイルサイズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ffc5dd96-705e-999e-f11a-a6cb79652066.png)

コンパイル日時

PEviewを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/541cf425-cd5a-644e-9e09-7e6147aea955.png)

関数名とDLL名

PEviewを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/72475490-b350-da97-706f-4928141d6a1d.png)

ということで全部埋めると、画面上部に答えが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/59145499-65c3-6fce-b3ff-1c1bff201336.png)

これが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7cdddfa4-b13b-d408-f7dd-cb7e7435a999.png)
pandasでクラスラベルを整数にエンコーディングする方法

0. やりたいこと
任意のクラスラベル(ここではclass1,class2)を整数に変換をしたい
class1 => 0 
class2 => 1


1. pandasデータフレーム定義

```encoding.py
import pandas as pd
df = pd.DataFrame(
    {'color':['green','red','blue'],
    'size':['M','L','X'],
    'price':[10.0,12.0,15.3],
     'classlabel':['class1', 'class2', 'class1']
    }
)
```
2.エンコーディング前のデータフレーム

```py
print(df)
#   color  size  price  classlabel
# 0  green   M   10.1      class1
# 1    red   L   13.5      class2
# 2   blue   X   15.3      class1
```
3.エンコーディング実行

```python
import numpy as np
class_mapping = {label:idx for idx, label in enumerate(np.unique(df['classlabel']))}

df['classlabel'] = df['classlabel'].map(class_mapping)
```
4.エンコーディング後

```py
print(df)
#   color  size  price  classlabel
# 0  green   M   10.1      1
# 1    red   L   13.5      2
# 2   blue   X   15.3      1
```
MNCTF2018 新人奮闘I☆☆☆

#問題

http://mnctf.info/mnctf2018/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0d8f18ae-ce03-299f-8b10-422b09151e18.png)

#解いてみた

ファイルをダウンロードします。
ハッシュ値の求め方はたくさんありますが、CyberChef使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/15c588c3-e765-391d-7402-5c4b4ff12b08.png)

sha256で検索すると一瞬なくて困りますが、sha2の中に入ってました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d174d2e0-be1b-397b-f0a8-ce5fc2d65728.png)
[Swagger] OpenAPI3.0 で記述したAPIドキュメントからapisproutを使ってモックサーバーを構築する

# Intro

OpenAPI（Swagger）でAPI定義を記述をすると、簡単にAPIドキュメントを作成し、API仕様をコード管理できるメリットがあります。

もう一つのメリットとして記述したAPI定義からAPIのモックサーバーも簡単に生成することができます。モックサーバーを開発の初期段階に簡単に用意できることで、ドキュメントファーストな開発ができます。（以下、開発フローのイメージです）

![62347593-2c249580-b535-11e9-9b61-e846bb034751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38342/cea1e88e-1d76-a80d-bfdf-78286613c627.png)


## 参考リンク
+ [What Is OpenAPI?](https://swagger.io/docs/specification/about/)
+ [Swaggerファイルを分割してAPIドキュメントを管理する](https://qiita.com/godgarden/items/be420a8c165f4a0f3ad8)
+ [OpenAPI3.0で記述したAPI仕様書をHTMLとして出力する](https://qiita.com/godgarden/items/be420a8c165f4a0f3ad8)

# APIモック（mock）サーバーを作る
[swagger-codegen](https://github.com/swagger-api/swagger-codegen) でコードを生成してモックサーバーを立てる方法もありますが、今回は以下のAPI定義から [apisprout](https://github.com/danielgtaylor/apisprout) を使いモックサーバーを立ててみます。

```openapi.yml
openapi: 3.0.0
info:
  version: 1.0.0
  title: Swagger sample
paths:
  /users:
    get:
      summary: Usersを取得するAPIです。
      responses:
        '200':
          description: HTTPステータスコード200と以下の情報を含むJSONオブジェクトを返します。
          content:
            application/json:
              schema:
                type: object
                properties:
                  user_id:
                    type: string
                    example: 1234567
```

## Usage
### go get

`apisprout` は Goで作られているので `go get` コマンドでインストールも可能です。

起動方法はこれだけ。 `apisprout opeapi.yml` めちゃ簡単ですね。

```
go get github.com/danielgtaylor/apisprout
apisprout opeapi.yml

🌱 Sprouting Swagger sample on port 8000
```

```
curl localhost:8000/users
{
  "user_id": 1234567
}
```

### Docker
```
docker pull danielgtaylor/apisprout
docker run -p 8000:8000 -v $FULLPATH/openapi.yml:/openapi.yml danielgtaylor/apisprout /openapi.yml

🌱 Sprouting Swagger sample on port 8000
```

```
curl localhost:8000/users
{
  "user_id": 1234567
}
```

# 最後に
OpenAPI（Swagger）で記述することで、APIドキュメントやモックサーバーを簡単に用意することができました。APIドキュメントファーストの開発をすることで、開発の生産性もあがりそうです。

簡単に導入し試すことができるので機会があれば、トライしてみてください。:raised_hand:
Doc な メモ にゃ （自分用）

## 目的

 ツールのコマンド忘れるので、メモ


## Comand Lines

### hugo

```sh
# 初期化
$ hugo new site <dir name>

# ページ追加
$ hugo new <path_to_dir>

# 確認
$ hugo -c conf.toml
```

### jsdoc

```sh
$ npx jsdoc -r src/js/ -d <distnation dir>
```

### documentation.js

```sh
$ npx documentation src/js -f html -o <distnation dir>
```

### (TODO) remarkjs, impress, reveal

https://remarkjs.com/#1

### (TODO) openapi
boto3のSessionについて

# 動機

boto3のclientやresourceって、以下のように生成しますよね。

```python
ecs = boto3.client('ecs')
dynamodb = boto3.resource('dynamodb')
```

これに対して、「1つの接続を使い回すべき」と言われ、以下の書き方を勧められたことがありました。

```python
session = boto3.Session()
ecs = session.client('ecs')
dynamodb = session.resource('dynamodb')
```

これについて、**ちょっとだけ**調べてみたので、記事を書いてみます。（詳細をご存知の方がおりましたら是非教えて下さい！）

## 結論

元の書き方で問題無さそう。

```python
ecs = boto3.client('ecs')
dynamodb = boto3.resource('dynamodb')
```

## 理由

まず、boto3.Sessionが何者なのかをコードのコメントで調べてみました。

> A session stores configuration state and allows you to create service clients and resources.
> （設定の状態を格納し、サービスクライアント及びリソースを作成できるようにするためのセッション。）

おそらくAWS SDKの認証情報のページにあるような、環境変数とかプロファイルとかから取得した認証情報を格納する**だけ**のクラスに見えます。つまり、この時点では通信や接続は行っていないと考えられます。

そして、clientやresourceを生成する箇所のコードを見てみると、

```python
def resource(*args, **kwargs):
    return _get_default_session().resource(*args, **kwargs)

def _get_default_session():
    if DEFAULT_SESSION is None:
        setup_default_session()
    return DEFAULT_SESSION

def setup_default_session(**kwargs):
    global DEFAULT_SESSION
    DEFAULT_SESSION = Session(**kwargs)
```

となっていました。clientやresourceを生成する時、初回はDEFAULT_SESSIONにSessionをセットしてから生成し、2回目以降はそのSessionを使い回して生成しています。勧められた方法をboto3が内部でやっていてくれたんですね。

また、このコードより、プロファイルなどを指定したclientやresourceの生成方法も分かりますね。

```python
boto3.setup_default_session(profile_name='ttkiida')
dynamodb = boto3.resource('dynamodb')
```

今まで以下のように書いていましたが、わざわざSessionを持ち出す必要は無かったということです。

```python
session = boto3.Session(profile_name='ttkiida')
dynamodb = session.resource('dynamodb')
```

これで実装が大きく変わることはありませんが、色々整理されて少しスッキリしましたｗ
Rails 6に上げると”DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper, and ActionText::TagHelper.”のような警告が出る

## 2021-2-18追記：新しく記事を書き直しました

この警告に対処する最新の知見を以下のページに書き直しました。
今後はこちらのページを参照してください。

[【Rails】Initialization autoloaded the constants ActionText::ContentHelper and ActionText::TagHelper 警告の解決パターン \- Qiita](https://qiita.com/jnchito/items/c72fd6bea81eb5417e3f)

ここから下の内容はRails 6.0リリース当初に書いた古い知見なので、これを参考にするのは筆者として推奨しません。

## 対応不要なRails本体のissue
Rails 5.2のアプリケーションを6.0.0に上げて、テストを実行したところ、以下のような警告が出ました。

```
DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper, and ActionText::TagHelper.

Being able to do this is deprecated. Autoloading during initialization is going
to be an error condition in future versions of Rails.

Reloading does not reboot the application, and therefore code executed during
initialization does not run again. So, if you reload PageDescription, for example,
the expected changes won't be reflected in that stale Class object.

`config.autoloader` is set to `classic`. These autoloaded constants would have been unloaded if `config.autoloader` had been set to `:zeitwerk`.

Please, check the "Autoloading and Reloading Constants" guide for solutions.
 (called from <main> at /Users/jnito/dev/private/cb/config/environment.rb:5)
```

結論から先に言うと、この警告はRails本体側のissueなので対応は不要です。

[Misleading deprecation warning when referencing ActionController::Base · Issue \#36546 · rails/rails](https://github.com/rails/rails/issues/36546)

**Rails 6.0.0では発生しますが、おそらくこの先のアップデートで修正され、近い将来この警告は出なくなるものと思われます。**

### 警告の原因はRails 6で導入された新しいオートロードシステムの影響
なお、この警告はRails 6から導入された、Zeitwerk（ツァイトベルク）という新しいオートロードシステムの影響で発生します。

[Autoloading and Reloading Constants \(Zeitwerk Mode\) — Ruby on Rails Guides](https://guides.rubyonrails.org/autoloading_and_reloading_constants.html)

## 修正が必要な場合
ただし、警告メッセージにActionText::ContentHelper と ActionText::TagHelper 以外の定数（クラス名）が出力されている場合は修正が必要になります。

```
# Fooというクラスも表示されている
DEPRECATION WARNING: Initialization autoloaded the constants Foo, ActionText::ContentHelper, and ActionText::TagHelper.
```

僕のRailsプロジェクトでは`app/models`以下に置いていたActiveRecordではない、ただのRubyクラスを`config/initializers`で呼びだしているのが原因でした。

```ruby:app/models/foo.rb
# ActiveRecordではない、プレーンなRubyクラス
class Foo
  def self.do_something
    # ...
  end
end
```

```ruby:config/initializers/foo.rb
# app/models以下に置いた、ただのRubyクラスをconfig/initializersで呼びだすと警告が出る
Foo.do_something
```

### 修正方法

`Rails.configuration.to_prepare`でinitializersの処理を囲むと直ります。

```ruby:config/initializers/foo.rb
Rails.configuration.to_prepare do
  Foo.do_something
end
```
How to Uninstall Anaconda on Mac [Full Removal Guide]

Anaconda is a free and open-source distribution of the Python and R programming languages for scientific computing (data science, machine learning applications, large-scale data processing, predictive analytics, etc.), that aims to simplify package management and deployment. It actually makes a faster and easier way for users to set up and install the tools and libraries that you will be needing on your Mac.

But can you completely uninstall Anaconda from MacOS Mojave and revert back to the original Python? If you've tried using **conda-clean -yes** probably you'll get failed in half way. In this Qiita article, we are going to show you in this article: how to uninstall Anaconda on Mac in an effective and proper way.

1. First, quit the Anaconda app. 
2. Open the Terminal.app or iTerm2 terminal application, and then remove your entire Anaconda directory, which has a name such as anaconda2 or anaconda3, by entering **rm -rf ~/anaconda3**
3. Using Anaconda-Clean to full uninstall Anaconda > Install the Anaconda-Clean package from Anaconda Prompt (Terminal on Linux or macOS)
4. Remove all Anaconda-related files and directories with a confirmation prompt before deleting each one: **anaconda-clean**
5. After using Anaconda-Clean, follow the instructions in Step 1 to completely uninstall Anaconda on your Mac.
![anaconda-clean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483316/d77c64e3-5432-aad1-82cc-dadb4bd27d40.png)

Here is a list of useless remains of Anaconda:
~/anaconda3
~/.bash_profile-anaconda3.bak
~/.condarc
~/.conda
~/.anaconda

To clean them up thoroughly, you'll need an expert Mac App Uninstaller program, such as [Omni Remover](https://www.minicreo.com/omni-remover/). Or you can follow this quick [Anaconda Uninstall](https://www.minicreo.com/mac-uninstaller/uninstall-anaconda-mac.html) guide to start.
plunkerで桜吹雪

#概要

plunkerで桜吹雪やってみた。

#参考にしたページ

https://actyway.com/demo/sakura.8222.7.html

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5e460947-d297-5478-5c43-ce6abb561c68.png)


#成果物

https://embed.plnkr.co/QXnYjqgbC3B9TCsQJOmB/


以上。
【備忘録】ngrokの使い方

# 前提条件
ngrokダウンロード済み



# 使い方
1. Flaskでローカルサーバー立ち上げ
2. ngrokを起動
3. コマンドを打つ `ngrok http 5000`
4. ローカルサーバーが外部公開される（下図参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/bda2c14c-5c84-74da-688e-61a94b34297e.png)


```python:app.py（テスト用コード）
# coding: utf-8

from flask import Flask


app = Flask(__name__)


@app.route('/')
def index():
    return 'ngrok test.'


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)
```
matplotlibでlogスケールのグラフの目盛を消す方法

# はじめに
機密事項等の関わりでグラフの軸の情報を消さなければならないということは，企業に関わるプロジェクトでは散見されるのではないでしょうか．
今回logスケールの目盛を消そうとしたのですが，情報が少なく調べるのに時間がかかってしまったので備忘録の意味も含め記事化しました．

# 結論
logスケールのグラフにおいて目盛を消すには，追加のキーワード引数の設定が必要となります.

```
ax.tick_params(which="both", left=False)
```
whichの部分が追加で必要となる引数です．leftの部分は[top, bottom, right, left]の中から消したい軸目盛の位置を指定します．

# なぜ追加オプションが必要なのか?
適当なデータを生成してオプションの有無を比較します．以下のサンプルデータを生成し，プロットをおこなうコードを実行します．

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

a = np.logspace(1, 10, 50, base=2)
fig, ax = plt.subplots()
ax.plot(a)
ax.set_yscale("log")
```
グラフは以下のようになります．
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161847/bb8e3c7e-8bcd-bfd7-73a3-8d32c0a8a1c6.png)
`ax.set_yscale("log")`により，y軸がlogスケールになり，対応して目盛が変化していることがわかります．

ここで先程のコードの最後に目盛を消すために`ax.tick_params(left=False)`を追記して実行すると，以下のようなグラフが得られます．
![download-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161847/45cf6416-21e6-420e-a31e-c04dc39078c8.png)
一見何も変わっていないように見えますが，軸ラベルが振られている箇所の目盛が消えています．ラベル間にある細かい目盛は消えていません．
これは，logスケールのグラフでは`major`，`minor`の2つの軸を利用していますが，`ax.tick_params`におけるキーワード引数`which`のデフォルト値は`major`になっているからです．

したがって`major`，`minor`の2つの軸を対象とするように指定する`ax.tick_params(left=False, which="both")`のようにすると，軸目盛をすべて消すことができます．結果は以下の図のとおりです．
![download-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161847/41c42e43-150d-a601-f8cc-b6544fdb8292.png)

# まとめ
matplotlibにおいて，logスケールのグラフは`major`，`minor`の2つの軸を使用しているため，追加オプションが必要となっています．

# 参考
http://matplotlib.1069221.n5.nabble.com/log-scale-plots-ignore-tick-params-td39345.html
Kerasのテキスト前処理 Tokenizerについて

KerasのTokenizerを用いたテキストのベクトル化についてメモ。

Tokenizerのfit_on_textsメソッドを用いてテキストのベクトル化を行うと、単語のシーケンス番号（1～）の列を示すベクトルが得られる。

```Python
from keras.preprocessing import text 
texts = ["I have a pen.", "I have an apple", "You have pen and apple."]
tokenizer = text.Tokenizer()
tokenizer.fit_on_texts(texts)
list_tokenized = tokenizer.texts_to_sequences(texts)
print(list_tokenized)

#出力結果
[[2, 1, 5, 3], [2, 1, 6, 4], [7, 1, 3, 8, 4]]
```
参考：https://keras.io/ja/preprocessing/text/


しかし、このままでは各文の長さが異なり扱いにくいため、固定長に変換するのが通常。

```Python
from keras.preprocessing import sequence
list_sequence = sequence.pad_sequences(list_tokenized, maxlen=10)
print(list_sequence)

#出力結果
[[0 0 0 0 0 0 2 1 5 3]
 [0 0 0 0 0 0 2 1 6 4]
 [0 0 0 0 0 7 1 3 8 4]]
```

以上。
Spring Boot2 x Doma2のハマったこと備忘録

## このページについて
Spring Boot2 x Doma2で開発するにあたって少しだけハマったことがいくつかあったので備忘録として残しておこうと思います。

## 当方のスペック
Spring Boot 2.1.7
Java11
IntelliJ 2018.3
DOMA doma-spring-boot-starter:1.1.1
MySQL 5.7
gradle 5.4.1

## [DOMA4019] SQLファイルが クラスパスから見つかりませんでした
以下のようにSQLをファイルを正しいディレクトリ構成でおいてもこのエラーが出る場合があります。

例) -- SQLファイルの置く場所は間違っていない
UserRepostory findOneメソッド
src/main/xxx/domain/repository/UserResotiory.java
src/main/resources/META-INF/xxx/domain/repository/UserResotiory/findOne.sql

#### 解決策)
build.gradleに以下を追加

```
processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources
```
参考: https://github.com/domaframework/simple-boilerplate/blob/master/build.gradle

## ビルド時にRepository(Dao)インターフェースの実装がないと怒られる
以下みたいなエラー
required a bean of type xxxxxRepository that could not be found.
Consider defining a bean of type xxxxxx

#### 解決策)
1.IntellJで以下の設定をしていることが前提(Lombok入れていればやっているはず)
Preference > Build,Execution,Deployment > Annotation Processorsで
Enable annotation processing をON

2.Repository(Dao)インターフェースに ConfigAutowireableアノテーションをつける

## DomaConfigの作り方
未知のカラムがあってもスルーしてほしい場合、DomaのConfigクラスを作りUnknownColumnHandlerをオーバーライドする必要がある。(他にもConfigが必要なケースはあるはず)
公式ドキュメントだとSingletonConfig を使うやり方が一番上にあるがSpring Bootの場合はフレームワークに合わせたAdvanceな方法が必要。

#### 解決例)

```DomaConfig.java
@Configuration
public class DomaConfig implements Config {


    @Autowired
    private DomaAutoConfiguration domaAutoConfiguration;

    @Autowired
    private DataSource dataSource;

    @Override
    public DataSource getDataSource() {
        return dataSource;
    }

    @Override
    public UnknownColumnHandler getUnknownColumnHandler() {
        return new UnknownColumnHandler() {
            @Override
            public void handle(Query query, EntityType<?> entityType, String unknownColumnName) {
                // オーバーライドして潰している
            }
        };
    }

    @Override
    public Dialect getDialect() {
        return domaAutoConfiguration.dialect();
    }

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource primaryDataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }
}
```

### 備考
Spring Boot2のORMだとMyBatisが一般的ではあると思いますが以下の理由からDoma2を使ってみました。

1. JavaとSQLを分離したい
2. XMLを書かないで済む
Command Line入門

プロゲートのCommand Lineで学んだコマンドを備忘録代わりに書きます。

##ファイル作成  
-touch ファイル名

##ファイルの中身の確認
-cat ファイル名

##ディレクトリ作成
-mkdir ディレクトリ名
make directory

##ディレクトリの移動
-cd 移動先
-cd ..
一つ上のディレクトリに移動
-cd
ルートディレクトリに移動

##現在のディレクトリの表示
-pwd
print working directory

##ディレクトリの中身表示
-ls
listの略

##コピー
-cp コピー元ファイル　新しいファイル
-cp -r コピー元ディレクトリ　新しいディレクリ

##移動（ファイル名変更）
-mv 移動させるファイル名　移動先のディレクトリ
-mv 移動させるディレクトリ名　移動先のディレクトリ
-mv 元ファイル名　変更後のファイル名
-mv 元ディレクトリー名　変更後のディレクトリ名

##除去
-rm ファイル名
-rm -r ディレクトリ名
TextViewの表示を中央にする方法

#やりたいこと
デフォルトだとしたの画像のように左上に表示される文字を中央に揃えたい
![as_tyuuou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410295/d7483901-f80f-20e0-57ea-8ad717a53dad.png)


#やりかた
1.コードを直接書く
2.attuributesをいじる
簡単なので2を説明

All Attributesを開く
![as_tyuuou(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410295/4319bcfc-4150-1d36-ad3a-ce1f40d5a48b.png)

gravityを開く
![as_tyuuou(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410295/a046ca3e-2cc5-9375-549c-a48619ee5019.png)

center_horizontalとcenter_verticalをチェック
![as_tyuuou(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410295/c2272750-c059-f1d4-c8c3-65881466078a.png)
ソフトウェア開発とは、テストを書くことである


自動テストを知った開発者が、なぜ「テスト！」「テスト！」と連呼するようになるのか見てみましょう。



![テスト依存の良循環.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/309c9271-918f-2615-d70b-d5d2f9df47aa.png)



画像は [悪循環画像ジェネレータ](https://furandon-pig.github.io/fpig_sample/hobby/bad_spiral/) を使用して作成いたしました。
ありがとうございます。


# ソフトウェア開発とは、テストを書くこと

ソフトウェア開発において、一番時間と手間がかかるタスクはなんでしょうか？


それはテストです。

つまり、ソフトウェア開発とはテストをすることなのです。


# エンジニアの矜持

我々はソフトウェアエンジニアであるからして、時間と手間をコンピュータの力によって解決せねばなりません。


# 自動的に動くテストを作ろう

テストを自動化するのです。

Excelとにらめっこしてスクショ撮ってる場合ではないのです。


# テストを作りやすい環境を選ぼう

テスト作りは大変です。
大変な仕事をするのですから、なるべく楽ができる環境（プラットフォーム、言語、フレームワーク等）を選びましょう。

* 言語やフレームワークのマニュアルにテストの作り方が書いてあるか？
* 先人の知恵がたまっているか（ぐぐらびりてぃが高いか）



# 参考リンク

* [SQLiteのテストコードは4567万8000行！ 本体のコードは6万7000行](https://www.publickey1.jp/blog/10/sqlite45678000_67000.html)
* [僕たちがテスト駆動開発をする理由](https://qiita.com/yuno_miyako/items/f5cd4c376d1323d5721d)
* [テスト駆動開発したくてもうまく行かない時に（入門者向け）](https://qiita.com/MiNaLi/items/67f6dc718e6653b5d6f6)