OmniAICreator/Qiita-1.07M huggingface dataset:
Spresenseで遊んでみる（その１）

SONYのIoTボードであるSpresenseをゲットしたので、遊んでみた

![C793ACD9-93AA-4874-ACC9-A03E4C60C3C3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/edf8a217-899d-983e-72c6-dd255895f1a1.jpeg)
メインボードの箱。SONYなだけあっておしゃれ。

![570E43B6-8B54-4B39-B364-0EAF3E7C5653.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/0956313e-c957-df9d-61ff-c6e3789a8245.jpeg)
メインボード。
かなり小さい。

# Spresense Arduino スタートガイド

以下のスタートガイドに沿って設定をしていく
https://developer.sony.com/develop/spresense/docs/arduino_set_up_ja.html

## 準備
### 環境
OS:Windows 10

### Arduino IDEをインストール

公式からDL
https://www.arduino.cc/en/Main/Software

手順
https://www.arduino.cc/en/Guide/HomePage#install

今回はVer10.8.1

### USBドライバのインストール

Windows 10用をインストール

### Spresense Arduino board package のインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/250f42f9-a01e-4f00-5fb3-c982aaa3c248.png)

## 確認

### 接続確認


通電していることを証明する青いLEDが光る
![0FCC68C1-894A-4421-984C-431EEE3C1EE5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/90924813-1061-28fa-fb6c-749cdbf6ee76.jpeg)
メインボードの下に付けているのは拡張ボード。
付けていろいろしてたけど、よくよく考えたら今回の作業にはなくても問題なかった。。

### ブートローダーのインストール

初回もしくは最新リリースバージョンの初回なので必要とのこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/2fd40726-efae-3515-387d-ffcb1fd9af62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/43a40ed4-8a80-1b7e-8f6c-136a08511409.png)

### Lチカ

書き込みのテストとしてサンプルを元にLチカ

![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/4118ea8e-e45c-7a52-f702-569784725d83.png)

思ってたところと違うところが光った。。
※青色のLEDが点滅させたりするのかと思ってた。


# メインボードだけでGPSトラッキングしてみる

[チュートリアル](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_gps_%E3%83%88%E3%83%A9%E3%83%83%E3%82%AB%E3%83%BC%E3%82%92%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99)を参考にGPS機能を使ってみる



## シリアルポートの設定

[シリアルターミナル上での動作確認](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/set-up-the-nuttx-environment#_%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E4%B8%8A%E3%81%A7%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/cb433530-55ce-9229-e09c-e8a062c3d0b2.png)

TeraTermで参照する際にちょいハマったので。



## 測位
### 測位待ち
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/f6202b16-52b7-c1e1-70d7-ead2862af3b3.png)
さすがに屋内だと全然測位してくれない

### 測位中
測位できる場所へ移動。

![EE56FE23-79AF-4A7E-AF8D-AA4848F1624E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/c55954e9-bd72-57bc-c0de-9100df5c28a8.jpeg)


### 結果
![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/2bb5da5e-3b40-0096-944e-b362d5d78d84.png)

緯度経度に戻していないけど測位できているような感じ。


# まとめ
+ セットアップはかなり簡単。
+ 測位についても外に出て一定時間待っていればかなり簡単に測位したデータを取得は可能
    + ただしメインボード単体だと内蔵メモリに保存するぐらいしかできないので、リアルタイムに何かに使うとかは無理。
+ 測位した結果の転送などは次回以降に。
+
picoCTF 2019 dont-use-client-side - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b927254f-580b-911f-1835-15e2a1f8d0e0.png)

#解いてみた

サイトに飛んでみると認証画面のようなものができてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7d72687f-8ba9-3f79-0a69-665f3fd633f3.png)

適当に文字を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fb451ff3-0744-c190-43dd-7814fd5a820a.png)

どうにかして正しい文字を入力する必要がありそうです。

ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/62ac243e-91af-88de-82ce-00cd378c11e4.png)

単純なチェック処理がありました。
並び順が前から順番ではないのでうまく並び替えたものが答えになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/87832af6-5b97-9eaa-72f1-507ae2d73bbd.png)
ROLL-A-BALL TUTORIAL #4

#Way to move the camera
#1. Create a component which traces “Player”
It creates a component which trace “Player”. This component has some function following.

1. Get the position of “Player”.
2. Adjust a coordinate of the Player’s position every frame.

So, at first, it creates the “Follow Player” component. Then add “Main Camera” to it.

1. Select “Main Camera” in Hierarchy View.
2. Click the “Add Component” button in Inspector View.
3. Select “New Script” and add “Follow Player”.
4. Move “FollowPlayer.cs”, is under Assets, to Assets/Script folder in Project Browser.

Next, double click “FollowPlayer” to invoke code editor.
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/12ce0448-cb38-1b38-633a-b1df64c2d3bf.png)

#2. Way to trace player
It makes tracing function from getting an object’s position. Write a source code below in “FollowPlayer.cs”.

```FollowPlayer.cs
using UnityEngine;
using System.Collections;

public class FollowPlayer : MonoBehaviour
{
    public Transform target;    // Reference to target

    void Update ()
    {
        // set target’s position to oneself
        GetComponent<Transform>().position = target.position;
    }
}
```
Look component of “Main Camera” and confirm what add term of target in “Follow Player”. Drag & drop “Player” onto this term.
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/3346ab3f-f5f8-b6a3-aca4-d7020487356f.png)
Let’s start the game. Game View shows a view like the below picture as FPS.
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/b4b72b6e-b8c7-6e67-56f1-76f0db50a310.png)

#3. Set offset to a component
Change a camera point like TPS that have an appropriate distance to ball. So, add a function which maintains the distance between “Player” and “Main Camera” when starting the game. The function is created by below sub-functions.

1. Get a relative distance between “Player” and “Main Camera” when starting the game.
2. Set the position of the camera to “Player’s position + relative distance” every frame.

At first, Set the position and rotation to “Main Camera” like a below picture.
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/67cdea52-77a7-7980-1863-b4e080e7dad6.png)

Next, Change a source code.

```FollowPlayer.cs
using UnityEngine;
using System.Collections;

public class FollowPlayer : MonoBehaviour
{
    public Transform target;    // Reference to target
    private Vector3 offset;     // relative distance

    void Start ()
    {
        // Get relative distance between “Player” and “Main Camera”
        offset = GetComponent<Transform>().position - target.position;
    }

    void Update ()
    {
        // Set “Player’s position + relative distance” to oneself
        GetComponent<Transform>().position = target.position + offset;
    }

```
Let's play the game.
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/9e33180c-7fd5-d34f-f11b-312ef55b780f.png)
【勉強用】シェルとシェルスクリプトを初心者視点から

##免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。

##環境
OS：最新版ではないMacOS
VirtualBox：5.2.26
Vagrant：2.2.6
Ubuntu：ubuntu/bionic64 v20181129.0.0


##目次
1. シェルとは
2. シェルスクリプトとは
3. Bashを利用したシェルスクリプト実践

#1. シェル
シェルは、OSとやりとりするためのインターフェースを提供する機能（ソフトウェア）のことです。
「OSの中核となるカーネルを包み込む貝殻」という意味で、シェルと言います。

各OSによってシェルはさまざまにあり、CLIやGUIのどちらの形態のシェルもあります。

例えば、MacOS用のファイルマネージャである「Finder」
がGUI形態のシェルです。 
![macOS-high-sierra-finder-topic-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/81c493fd-477b-388d-ba82-b3385c4deab5.png)

しかし、一般的にシェルというと、CLI形態のシェルを指すことが多いです。

#2. シェルスクリプトとは
シェルスクリプトは、シェルを扱うためのCLI向けスクリプト言語のことです。
LinuxなどUnix系コマンドで記述されたファイルを実行することで、ファイル操作、プログラム実行などの役割をします。
![スクリーンショット 2019-10-26 12.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/2314e7a5-4243-f0f1-dd79-92992e8195fb.png)
（シェルスクリプト)

今回は「Bash」と言うシェルを利用します。

#3. Bashを利用したシェルスクリプト実践
###①シェルスクリプト用ファイルの作成
まずは、シェルスクリプトを記述するファイルを作成します。
ファイル名はなんでも良いですが、拡張子を「.sh」としてください。

###②シェルスクリプトを記述する
ファイルを作成したら、コマンドを書き込んでいきます。

```ファイル名.sh
#!/bin/bash
date
echo 'Hello World'
echo '名前を入力して下さい'
read name
echo your name is $name
```
1行目の、

```
#!/bin/bash
```

は、「シバン（shebang）」といい、bashを使用したシェルスクリプトであることを宣言しています。

2行目以降の、

```
date
echo 'Hello World'
echo '名前を入力して下さい'
read name
echo your name is $name
```
は、
はじめに、dateコマンドを実行した後に、
echoコマンドを実行しターミナルに
'名前を入力して下さい'と表示させるという処理です。
readコマンドは、値が入力されるのを待ち、入力された値がnameに代入されます。
さいごにechoコマンドを実行し、
your name isの後に、nameに代入された値が表示されます。
####※シェルスクリプトの変数
シェルスクリプトの変数は以下のように記述します。

```
number=100
name='taro'
```

###③シェルスクリプト用ファイルの実行
ファイルの中身が書けたら、ターミナルに

```
./ファイル名.sh
```
と入力します。
すると、
![スクリーンショット 2019-10-26 13.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/4382ea1e-6568-56ce-5b91-4e1a30f18479.png)
と表示されると思います。
そこで、名前を入力すると、
![スクリーンショット 2019-10-26 13.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/86e838b2-8bab-f47d-3e65-0bb535fec22a.png)
このような表示になりました。

以上がシェルスクリプトです。
今回は簡単にコマンド入力だけを実行しましたが、うまく命令を使いこなせるようになるとファイルの作成などは高速に行えるようになり、業務が効率化されるらしいです。

####※Linuxのファイル権限について
Linux環境で、./ファイル名.shと入力したとき、

```
bash: ./ファイル名.sh: Permission denied
```
と表示されるかもしれません。
これは、Linuxのファイルには権限管理がなされているからです。
その場合は以下のコマンドをターミナルに入力してみてください。

```
chmod a+x ファイル名.sh
```
以上のコマンドは、指定したファイルがいかなるユーザーであっても実行できるようにファイルの権限を設定しています。

##参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「初心者向けシェルスクリプトの基本コマンドの紹介」
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
【備忘録】Go言語のパッケージをMacで使用しようとして躓いた

# はじめに
　Go言語には便利なパッケージというものが用意されているらしく、使ってみたいと思って使ってみた。今回は、エンジニアであれば、多くの人が利用するgithubのgoパッケージを利用してみた。
　しかし、普段PythonやCなど違う言語を使用してきた人間からすると、特にパッケージの利用で躓くと思いました。そこで、githubに公開されている、GithubのGoパッケージgo-githubを例にパッケージの利用について書きたいと思います。

# 環境
macOS Mojave
go 1.13.3

# 作業ディレクトリ
　他の言語と異なる点は、作業ディレクトリだと思います。以下のサイトを参考に、ディレクトリを作ってください。GOPATHのsrcに入っていないと上手く動きません。
　https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4

# パッケージ依存関係管理ツール dep
　今回は、パッケージの依存関係ツールを使います。これは、以下のサイトを参考に入れてください。
　https://qiita.com/Azizim_A/items/66564b5dc7597717932b

```
go get -u github.com/golang/dep/cmd/dep
```

で入ります。

# 動かしてみる
　今回使うgo-githubのexampleがgithubに転がっているので、それを引用。
　以下から手に入る。
　https://github.com/google/go-github/tree/master/example/simple

　さっき作った作業ディレクトリ直下にmain.goとか適当に作って、さっき手に入れたコードのスクリプトをコピペなりして、main.goへ書く。
　
　その後、作業ディレクトリ（main.goがあるところ）で

```
dep init
```

　とすると、main.goを読んで勝手にパッケージを読んでくれる、その後

```
dep ensure
```

　で、パッケージをインストールし

```
go build
```

でビルド完成
picoCTF 2019 caesar - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/40e4d70c-5ba3-217d-80a7-6befdfe30ebf.png)

#解いてみた

ファイルをダウンロードして中身を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b39d37a3-8a2d-baa4-754a-39ffcf8d66ac.png)

！
さすがに答えではありませんでした。
問題文的にこれがシーザー暗号なので、復号する必要があるということです。
CyberChef使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d37f1c07-5cd4-da4b-d016-0d57023bffb7.png)

1から順に進めていくと3のときに少し読める単語になったのでそれを入力してみると答えでした。
Blawn言語をMacでビルドしてみたメモ


# 準備

## XCode＆コマンドラインツールをインストール

XCodeをインストールしていないときはインストールする。

## LLVMのインストール

```
$ brew install --with-clang --with-lld --with-python --HEAD llvm
```

PATHも通しておく。

> 参考：
> [mac osでLLVMの環境を構築してみる](http://moapp.hateblo.jp/entry/2017/01/14/230409)
> [osx – XcodeとともにLLVMライブラリをインストールする](https://codeday.me/jp/qa/20190227/322896.html)

## Flex＆Flexのヘッダーを新しくしておく

```
$ brew install flex
$ brew link flex --force
```

[https://raw.githubusercontent.com/westes/flex/master/src/FlexLexer.h](https://raw.githubusercontent.com/westes/flex/master/src/FlexLexer.h)をダウンロードして、
```find /Applications/Xcode.app/ -name "FlexLexer.h"```を実行して確認したFlexLexer.hと置き換える。


> 参考：[Xcodeでflexつかうとエラーになる時のメモ](http://e.rusk.to/kosikata/?p=1791)

# ソースの書き換え

## std::filesystem

Mac OS 10.14だとstd::filesystemがうまく動かないようなので、std::filesystemを使っているところを適当に書き換えた。

## テンポラリファイル

Blawn実行ファイルの存在するディレクトリの中にtmpというディレクトリを作って、そこで作業している（？）ようなので、ちょっと書き換え。


# 出来たもの

[https://github.com/JunSuzukiJapan/Blawn](https://github.com/JunSuzukiJapan/Blawn)


# ビルド方法

srcディレクトリに移動して

```$ make -f Makefile.osx```


ビルド中にエラーが出る場合は、

```$ make -f Makefile.osx clean```

を実行してからもう一度ビルドするといけるかも？
picoCTF 2019 Resources - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9e892d11-960f-4715-d1aa-073f8aa29050.png)

#解いてみた

よくわかりませんが、リンクに飛んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/52f81e9a-e5ba-19cc-5e57-b51a25b89a80.png)

？

画面下の方に普通に書かれています。
2019の方を入力してみると正解でした。

何を問う問題？
picoCTF 2019 OverFlow 0 - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ce00bb59-61c9-d3da-102b-711b85b30ee8.png)

#解いてみた

sourceを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7d67c74e-c65f-f075-8525-111fc665d8bf.png)

問題のタイトルのとおりオーバーフローさせる問題です。
これと一緒の問題のようです。
https://qiita.com/CTFman/items/a84d848156603c520454

shellでパスを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/388f0174-935e-fdb7-4363-7a7133a32d64.png)

フラグを表示する処理を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fc1cba5c-9f51-08ac-597c-3961a409e8ee.png)

呼び出し元を確認すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b4efe77d-7823-9c52-bde8-f046c5484d68.png)

でした。
この前解いた時も詳細がよくわからなかったんですが、とりあえずオーバーフローさせればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0c15e4ea-6b41-f336-ec6b-0f33a1bec26c.png)

ここの処理で128文字以上がbufに入るとオーバーフローを起こします。
inputは実行時に引数で渡せるので、128文字以上の文字列を渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8cfcac4e-8e52-80b7-361c-437d7962ed5d.png)

130文字入れてみましたが、ダメでした。
ここら辺がイマイチよくわかってません。

もっと長い文字を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/71f55c44-ee1e-dc08-c2af-372c9a2687f9.png)

できました。
何文字入れればよかったのかぎりぎりを調べてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/61b7ca72-bc25-47b2-99db-cb8674d51f81.png)

ということで、133文字まではダメで134文字以降はいけました。
なんで？
Proxy環境下でのMacでJMeter

# 前提
- プロキシ環境下
- MacにJmeterがインストールされている状態

# 起動コマンド
```bash
jmeter --proxyHost ホスト名 --proxyPort ポート番号
```
# HEAPメモリが足りない場合
```bash
export HEAP="-Xms4096m -Xmx4096m"
```
環境変数を設定してHEAPのメモリサイズを調整
調べたこと 2019/10/25

## これはどういう記事か

先輩エンジニアと雑談してて知らない単語や聞いたことあるけどよくわかってない単語がいくつかあったので調べて、せっかくなのでここにまとめてみる。
正確で網羅的な情報を目指すのではなく、ざっくりと、でも間違ってはないし全く知らないとうわけではない程度の理解を目指す。

## webpack

「**webpackはモジュールバンドラー**です。」って説明が多い。
いや、モジュールバンドラーってなんぞ。。。
調べてみると、どうやらライブラリ管理ツール的なやつっぽい。macでいうhomebrew的なことなのかな。
違うっぽい。ライブラリじゃなくてjs, css, scssファイルを管理するっぽい。

### webpackまとめ

- ライブラリの依存関係が把握しやすい
- ファイル数が減ることでアクセス回数が減る → 読み込み速度向上


## wagtail

**wagtailはDjangoベースのCMSライブラリのひとつ。**
DjangoベースのCMSライブラリは他にもいくつかあるみたい。そのうちの一つがwagtail。
Djangoはわかるけど、CMSってなに？wordpress的な？wordpress的なツールをDjangoで作れるの？合ってるっぽい。
wagtailの公式サイトに使われてる画像がまさにwordpressっぽい。

![screenshot-wagtail.io-2019.10.26-11-59-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238922/d270a3a6-2ece-47fe-e504-e77415932428.png)

> 画像はwagtail公式サイトより引用 https://wagtail.io/

おもしろそうだから今度実際に使ってみよう。

## rfid

> RFID（英: radio frequency identifier）とは、ID情報を埋め込んだRFタグから、電磁界や電波などを用いた近距離（周波数帯によって数cm～数m）の無線通信によって情報をやりとりするもの、および技術全般を指す。
>
>wikipediaより引用 https://ja.wikipedia.org/wiki/RFID

遠距離で使えるsuicaみたいな感じか。
おおきなくくりでいうと非接触ICって感じかな。
IoTも普及してるし非接触ICは可能性あってたのしいよね。
こうなってくると必然的にセキュリティの知識の重要度も上がってくるね。セキュリティ勉強したい。

## ギャル電

どんな話の流れか忘れたけど、おもしろいギャルがいるって話してた。大五郎（でっかいお酒）をLチカさせてバイブスぶち上げてるとか言ってた気がする。まったく意味わかんないけどおもしろそう。
ワクワクさんとコラボしててウケる。

https://youtu.be/45HiyGrbm5w

こういうテクノロジーの使い方好きすぎる。

## Jenkins

自動化ツール。
GitHubにプッシュしたら自動でテストとかデプロイとかできるようにするツール。便利そう。使いたい。

## GitHub Actions

GitHub製のCI/CDツール。
リリースしたばかりっぽい。
CI/CD流行ってるなー。

## あとがき

気になった用語って調べるんだけどすぐ忘れてしまう。忘れること自体は全く悪いことではないし脳の正常な働きなんだけど、もう少し覚えておきたいとも思う。
こうやって雑でもアウトプットするのはとてもアリだな。今後も随時やっていきたい。
閾値による二値化処理を用いた疑似アスキーアート生成器

#初めに(^ω^)
アスキーアートって知ってますかね？
![yaruo_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515390/90a2761f-bd59-b779-fcfb-f42a5cd5f01a.gif)
こんなやつです。こんなやつをAIの力だけで作りたいのですが難しいので画像処理の技術を使ってそれっぽいのを作ってみました。
難しかったです（KONAMI）
#作成したソースコード

```Python
#-----------------------------------------
#閾値による二値化処理を用いた疑似アスキーアート生成器(つよい)
#-----------------------------------------
import numpy as np
import cv2

#保存先指定
hoge = './'
file = './text10.txt'

#グレースケールで読み込み
img2 = cv2.imread(hoge+'shigure.png',0)

#Numy配列に保存
im = np.array(img2)

#閾値設定による二値化処理
Threshold = 127
im[im < Threshold] = 0
im[im >= Threshold] = 1

#テキスト出力
np.savetxt(hoge+file, im, fmt="%0.0f", delimiter=",")

#配列出力
print (im)

#画像出力
cv2.imwrite(hoge+'gray.png', im)

#作成したテキストファイルを縮小表示すると画像が現れます
```

#結果
![shigure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515390/27edfb4b-0914-a473-8ff1-c9ead3cf99e6.png)
これが
![無題2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515390/a9ff22c6-1618-cc3e-3c5a-179583150583.jpeg)
こうなった！


#コード解説
##①閾値ってなんだ


```Python
#閾値設定による二値化処理
Threshold = 127
im[im < Threshold] = 0
im[im >= Threshold] = 1
```

簡単に言ったらここから大きいのが０、小さいのが１のように分ける基準
境目みたいなもの

#参考文献
ないなぁ

#目次のようなもの
[Re：ゼロから始める機械学習生活（深層学習もあるよ）](https://qiita.com/KengoKudou/items/0973ee8f98315460b195)
ここに進捗状況等を載せてます。
今まで書いたものを一覧にしていたりするので見てみてください！
Docker初心者未満向け

#はじめに
- 自己紹介：UbuntuでPythonを書いてデータ分析とか異常検知してます
- CUDAのバージョン管理のためにDockerをやろうと思った
- 専門用語が多すぎて脳が混乱したので用語集を作った
- これからDockerを始めたいけどガチで何もわからないという人向けにまとめた
- PCで見てほしい(スマホQiita勢、いるのか…?)

#Dockerことはじめ
- いろんな仮想環境構築が簡単にできて嬉しいシステム
 - 仮想環境とは：好きなOS+好きなソフトと思っとけばOK
- 今までの仮想化(ホストOS型仮想化)の悪いところ
 - 仮想環境がホストOSや仮想化ソフトウェアのバージョンに依存してしまう
        - DockerはホストPCの中に全く別のPCを用意する様なものなのでホストの環境に依存しない
        - つまり、いつ誰が使っても同じ結果になる=これを「冪等性」という
        - 冪等性がなくてつらいことになる例
            - web系の人：開発環境と本番環境が違って動かない
            - 機械学習の人：CUDAとかミドルウェアのバージョン管理が死ぬほどめんどくさい
 - 動作がもっさり、ファイル容量が大きいので共有が大変
        - Dockerは仮想環境(Container)の型(Image)を保存・配布する方式なので、管理や共有が楽

#Docker運用の流れ
- ホストPCにDockerをインストール
- Dockerfileを書く
- Dockerfileを元に、Docker Imageを作る(build)
- Docker Imageを元に、Docker Containerを作り、仮想環境を有効にする(run)
- 仮想環境内でなんやかんや好きなことをする
- 終わったらContainerを停止させ(stop)、削除する(rm)
- 「この前と同じ仮想環境作りたいな〜」と思ったら、同じImageを元にContainerを作る(run)
- Tips
 - Imageは基本的に削除しないけど、もう使わないものがあまりに増え過ぎたら消してOK
 - Docker HubというGithub的なリポジトリから既存のImageをダウンロードできる(pull)

#用語集(超基礎)
- Dockerfile
 - 拡張子のないテキストファイル。~~DSLという~~Docker用言語を使って「どんな仮想環境を作りたいか」を書くもの
 - 「DSL」はDomain Specific Language(あるドメインに特化した固有言語)という意味でした。すみません(2020/2/13追記)
 - ~~DSL言語~~Dockerfileで使うコマンドの例
       - FROM：どのOSやミドルウェアの環境を作るか
       - RUN：Imageを作る時に、どういうコマンドを実行するか
       - COPY：どのファイルをホストPCからコンテナに移動させるか
- Docker Image
 - Dockerfileを基に作られるもの。後述のContainerの型のようなもの
 - Imageを作ることをbuildと言う
 - オブジェクト指向的に言えばクラス
 - Docker Hubで公開されてるImageをDLしてきてもOK。これをpullという
- Docker Container
 - Docker Imageを基に作られる仮想環境そのもの
 - オブジェクト指向的に言えばインスタンス
 - Containerを作り実行することをrunという
 - Imageの形で保存・配布して、仮想環境を作りたくなったらContainerにしてね〜という感じ
 - やりたい事が終わったら消す。Imageは残しておき、同じ環境が作りたくなったらまたrunさせる

#用語集(ちょっとむずかしい)
- Docker Engine
    - 常駐アプリ。Dockerシステムの親玉
- Docker Compose
    - yml形式のテキストファイル
    - 1個のホストPC上で複数個のコンテナを動かす時、その方法を指示する
    - 複数個のコンテナをいっぺんに起動とかもできて便利
- Docker Machine
    - 「Dockerを持つホストPC」の中に「Dockerを持つPC」環境を作れる
    - クラウド上にDocker環境作る時に便利
- Docker Swarm
    - 複数台のホストPCがある時、それらをまとめて制御できる
    - 例えば、ホストをまたいだコンテナ間の通信をどう制御するかなど
    - これを「オーケストレーションシステム」という
- Service
    - ホストPCが1台&コンテナが1個 → container runコマンドでコンテナを起動
    - ホストPCが1台&コンテナが1個 → Composeを使ってまとめてコンテナを起動
    - ではホストPCが複数台のときは? → Serviceというコンテナのまとまりを作って起動
    - 1つのアプリしか扱えない
- Stack
    - Serviceのまとまり
    - 複数のServiceを扱うことで、複数のアプリを扱うことができるようになる
- Kubernetes
    - Swarmと同じく、オーケストレーションシステムの1つ
    - Compose, Swarm, Stackを合わせたような便利なやつ

#Dockerにおけるデータ管理
- データ管理関連
 - 仮想環境作ってからいちいちデータをダウンロードしてたらめんどくさい
 - ホストPC上にデータを管理して、それをコンテナにマウントする手法が取られる
- データ通信関連
 - コンテナ間で通信できるし、ホストをまたいで通信する事もできる

#Dockerを勉強しててひっかかったところ
- 「Dockerfile」という名前の情報のなさ
    - Dockerfileという固有名詞があると最初わからなかった
    - Docker関係のファイル全般のことだと思ってた
- Docker Imageもコンテナっぽいこと
 - Imageに「OS+ミドルウェア+アプリ」を放り込むんだからコンテナ感あるよね
 - あくまでContainerは仮想環境の実体、Imageはその型

#おわりに
- 自分の理解が進んだら随時追記します
- 「ここがわからなかった」「ここがまちがってる」「わかりやすかった」などコメントお待ちしてます

#参考
- https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc
- http://docs.docker.jp/index.html
- https://www.amazon.co.jp/dp/4297100339/ref=cm_sw_r_tw_dp_U_x_2r8SDbYBBZ8K3 
- https://qiita.com/9en/items/f4eab2f61485a9f3885a
- https://www.slideshare.net/Oshima0x3fd/runc
- https://www.youtube.com/watch?v=5d8O7jm7Q5c
フロントエンドのテストの種類と効果についてのメモ

# 対象者

* フロントエンドのテストをどう書こうか迷っている人
* 現在のフロントエンドのテストがちゃんと効果があるか不安に思っている人
* フロントエンドの種類とその使い分けを把握したい人

## フロントエンドのテストの種類

よく、テスト設計だとテストピラミッドの図を想像すると思いますが、
今回はフロントエンドに絞った話で以下に分類しました。

1. snapshotテスト
2. assertionテスト
3. E2Eテスト

## snapshotテスト
### 概要
特定のコンポーネントやページに対して生成されるHTMLを専用のスナップショットファイルに吐き出し、テスト実行時にそのファイルHTMLとテストで生成されたHTMLの差分を比較する。
差分が発生している場合は、テストが失敗する。もし、意図してHTMLを変更している場合はスナップショットテストを更新する。

### メリット
* テストの管理が非常に簡単。
* HTMLでどう表示されるかがある程度保証されるので、ロジックの実装に集中できる。

### デメリット
* パッケージ依存で、テストが壊れる場合がある
* フロントエンドのフレームワークの描画タイミングなどに精通しておかないといけない。

### ありがたみを感じる時
SPAのように、１ページに機能が複数あり、UIが動的に変化するケースが多い場合。
また、どこかリアルタイムデータベースと接続していて、そのデータを元に描画更新するなども有用

## assertionテスト
### 概要
常に書いている普通のunit testの事。　値を比較したり、意図したエラーがthrowされるかなどをチェックする。

### メリット
* ロジック関連の挙動できる。
* テストを元に、動作を把握でき、ドキュメントとして機能する。

### デメリット
* テストケースをキチンと考えないと、無駄なテストまて実装してしまいがちになる。

### ありがたみを感じる時
* 複雑な分岐を元に表示を変更する場合
* レガシーコードでもテストがある程度あれば、動作を把握できる。

## E2Eテスト
### 概要
ブラウザ環境を用意して、実際にページにアクセスしHTMLの要素やページの遷移、スクリーンキャプチャなどを元にテストする。

### メリット
* 一番ユーザーに近い状態でテストするので、詳細にテストできる。
* ブラウザ依存などのバグも検知できる。

### デメリット
* ちょっとデザイン変更でテストが壊れる
* テスト実行が一番遅い
* 保守がされなくなることが多い

# 気をつけるべきこと
第一に自分のページがどういったページであるかを把握すること。
第二にページに合わせて上記のテストの組み合わせを選択すること。

例えば、社内システムのCSVアップロードするフォームのみのページの場合にスナップショットテストやE2Eテストを実装しても効果はあまり多くない。
それよりも、CSVのバリデーションや不正チェックのロジックに対してテストを行う方がいい。

逆に、firebaseなどと疎通して、表示をリアルタイムに組み替える場合は、描画が複雑になるため、snapshotテストが有効であるし、firebaseからの値のチェックや描画の分岐のために、複雑なロジックを持つ場合があるので、assertionテストも有効と考えられそう。

E2Eは、上記のsnapshotでもassertionでもテストが行えず、且つ重要度が高いものにのみ絞る。保守が難しいし、テストも壊れやすい上、時間もかかる。

目的に合わせて、採用するテストを考えないと、無駄なテストが積み重なって保守されず、開発の効率を下げるだけになりかねない。

# 最後に
目的から逆算して、テスト観点を絞って選択しよう。
無駄なテストは、実装の時間、保守の時間、CIを回す時間などゴリゴリと時間を奪われる(反省)。
OutSystemsで2段組(下段はサムネイル)のCarouselを実現する


Carousel一般についてはこっちを参照してください。
[OutSystemsのCarousel Widgetの使い方](https://qiita.com/jyunji_watanabe/items/d22fa868a7b518ff134d)

# サンプル

[Forgeにアップロードしました](https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7064&ProjectName=HousesoftSampleTraditional.oml)

ThumbnailCarousel Screenです。

# 作る画面の仕様

画面の上にメインのCarouselが、下には、サムネイル一覧が表示される画面を作ってみます。Traditional Web使用。

![qCarousel2_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7c4ff3b4-0915-db39-7c4e-364ed17dff79.png)


サムネイルをクリックすると、上のカルーセルで同じ位置の画像を表示させます。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.2)
OutSystemsUIWeb(Version 1.7.9)

# 実装方針の検討
Carouselを2つ配置して無理やり実現しようかとも思いましたが、設定だけで行けました。
Carousel Widgetが内部で利用している[tiny-sliderにnavAsThumbnailsというOption](https://github.com/ganlanyuan/tiny-slider#options)があるのでこれを利用します。

# 画面設計
今回は静的な画像配置にしてみました。
![qCarousel2_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a793a854-fcc3-ce4f-ebbd-a1acddb614e5.png)

## CarouselMain
Carousel Widget。Items Placeholderに大きい画像を配置。

## Thumbnails
Container Widgetを配置して、サムネイル画像を配置しておきます。
Carouselから参照するのでName(ここではThumbnails)をつけておきます。

# ロジック
試してみたら設定だけで行けたので、ロジックというほどのものではないですが。
navContainerでサムネイルを配置しておいたContainerのIdを渡しています。
(OutSystemsでは、NameをつけたWidgetの.Idにアクセスすると、ブラウザ上でタグとして表示されたときのId属性を取ることができます)。

navAsThumbnailsにtrueにすれば、画像移動用のコントロールを、「●」でなくサムネイル画像で表示させる設定になります。

`"{ navContainer: '#" + Thumbnails.Id + "', navAsThumbnails: true }"`
[mac] 新OS Catalina にアップデートした際に、Visual Studio Codeが起動しない

## 現象

Catalina にアップデート後、Visual Studio Code をインストールしたが、以下のようなメッセージが表示され、開けなかった。

<img width="420" alt="スクリーンショット 2019-10-26 12.10.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/ab78c02e-444b-a5d4-a2d4-164a10a7f04d.png">

## 解決策

vscodeのissueを参考にしました。
https://github.com/microsoft/vscode/issues/74782

## 手順

以下の表示が出たら、 `OK` ボタンを押してください。

<img width="420" alt="スクリーンショット 2019-10-26 12.10.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/ab78c02e-444b-a5d4-a2d4-164a10a7f04d.png">

`システム環境設定 > セキュリティとプライバシー`
に移動し `一般` タブを押すと、右下に　`このまま開く`　ボタンが表示されているので押してください。

<img width="665" alt="スクリーンショット 2019-10-26 12.12.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/a3501fa5-c016-d049-4fcc-32e08c7a4d87.png">

先ほどとは違い `開く`　ボタンが表示されるので、これを押すと無事、起動します。
<img width="477" alt="スクリーンショット 2019-10-26 12.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/583e84e3-e880-da07-04f4-d45c6bc4464f.png">

## 参考
https://github.com/microsoft/vscode/issues/74782
Git

# 共有リポジトリ

共有リポジトリは、チームメンバーで共有するリポジトリで、ソースコードのメインヴァージョンが格納されている。開発者はここにあるソースコードをpull/fetchで取り込める。

# ローカルリポジトリ

作業者のマシンの上にあるリポジトリです。ローカルマシンでの作業内容が保存される。pushにより共有リポジトリに変更内容を反映する。

#インデックス

ローカルリポジトリへ反映する変更を一時的に貯めておく場所。インデックスの内容はcommitによりローカルリポジトリへ反映される。

#作業ツリー

ローカルリポジトリ上にある現在の作業ファイル。作業ツリーの変更点はaddによりインデックスに追加される。



##流れの例

作業ツリー　add index commit ローカルリポジトリ push 共有リポジトリ


###コマンド

リポジトリを作成する
git initまたはgit clone URL


----------------------------------------------------------
SQL小技集
https://qiita.com/ool/items/75da830e7373138c8125
UTCとJST
https://qiita.com/ool/items/6be9cc290c8ad9e0f5bc
今流行りの量子コンピューター
[量子コンピューター]Qisikitでアダマールゲートを実装する
https://qiita.com/ool/items/1a5041edddc11b14efc0
[Qiskitのアカウント認証の仕方]Qiskit IBMQ プロバイダー
https://qiita.com/ool/items/e80c1266cda68984a103
Qiskitの使い方
https://qiita.com/ool/items/2227d2d515caa5087752
[量子コンピューター]Qiskit Tutorials
https://qiita.com/ool/items/2a5038df1471635d442c
Laravel のFTP接続で FTP_USEPASVADDRESS を false にする

## 経緯
Laravel の Storage ファサードを使ってFTP操作をしようとした際に以下のようなエラーが出た。

```
>>> Storage::disk('ftp')->files()
PHP Warning:  ftp_rawlist(): php_connect_nonb() failed: No error (0) in /*****/vendor/league/flysystem/src/Adapter/Ftp.php on line 570
```

[PHPからFTPSで接続したときのエラー対応](https://qiita.com/tomi_linka/items/6f31a8f42dc678b4ccb0)

この記事を参考にして調べたところ、自分が接続しようとしている環境でも `ftp_set_option()` で `FTP_USEPASVADDRESS` を `false` にすれば正常に動作する事が分かった。

## Laravel での設定方法
[Laravel 公式ドキュメントの設定例](https://laravel.com/docs/6.x/filesystem#driver-prerequisites) にはそれらしいオプションは見当たらなかったが、ソースを追ったところ[設定している箇所](https://github.com/thephpleague/flysystem/blob/b850583e09184d75e483d759d1475376bc3a386d/src/Adapter/Ftp.php#L170-L172)を発見し、`ignorePassiveAddress` というオプションがある事が分かった。

これを `config/filesystems.php` に設定してやると `FTP_USEPASVADDRESS` が設定され、FTP操作ができるようになった。

```php
'ftp' => [
    'driver' => 'ftp',
    'host' => 'ftp.example.com',
    'username' => 'your-username',
    'password' => 'your-password',
    'passive' => true,
    'ssl' => true,
    'ignorePassiveAddress' => true, // FTP_USEPASVADDRESS を false にするには true を指定する
],
```

## おまけ
後から知ったが、[League\Flysystem のドキュメント](https://flysystem.thephpleague.com/docs/adapter/ftp/) のサンプルコードには `ignorePassiveAddress` の記述があった。

その他設定可能なオプションを調べたい場合は `\League\Flysystem\Adapter\Ftp::$configurable` を参照すると良い。

```php
    protected $configurable = [
        'host',
        'port',
        'username',
        'password',
        'ssl',
        'timeout',
        'root',
        'permPrivate',
        'permPublic',
        'passive',
        'transferMode',
        'systemType',
        'ignorePassiveAddress',
        'recurseManually',
        'utf8',
        'enableTimestampsOnUnixListings',
    ];

```
Javascript基礎

```html:javascript1
<!doctype html>
<html lang="ja">
<head>
　<meta charset="utf-8">
</head>

<div id="id1">新宿</div>
<div id="id2"></div>

<input type="button" onclick="sample(1)" value="実行">

<script>
// alert(1);

// 変数 可変の値の入れ物
const value = '東京';
console.log(value);

// 配列 変数に複数の値を設置できる。前から順に0、1、2･･･とインデックスがつけられる
const items = ['東京', '埼玉', '神奈川'];

// for文。配列をループし展開できる
for (let i = 0; i < items.length; i++) {
  console.log(i, items[i]);
}

// for文の別の書き方　値を取得
for (const item of items) {
  console.log(item);
}

// for文の別の書き方　インデックスを取得
for (const i in items) {
  console.log(i);
}

// if文 
for (const i in items) {
  if (i == 1) {
   console.log('if', items[i]);
  } else if (i == 2){
   console.log('else if', items[i]);
  } else {
   console.log('else', items[i]);
  }
}

// オブジェクト
const obj = {prefectureId: 1, city: [{1: '新宿'}, {2: '池袋'}]};
const prefecture = {1: '東京'};

console.log(obj);

for (const i in obj) {
  // 配列かどうか
  if (Array.isArray(obj[i])) {
    for (const city of obj[i]) {
      // オブジェクトのキーを取得
      const cityId = Object.keys(city);
      console.log(city[cityId]);
    }
  } else {
    console.log(prefecture[obj[i]]);
  }
}

const id1 = document.getElementById('id1').innerHTML;
document.getElementById('id2').innerHTML = id1 + '-池袋';

// 関数。繰り返しでる処理をライブラリにする
function sample (val) {
  alert(val);
}

</script>

</body>
</html>

```
TypeScriptでタプル型をインターセクションに変換する

## 結論

```ts
// https://qiita.com/suin/items/93eb9c328ee404fdfabc
type UnionToIntersection<U> =
  (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;

declare const boxedBrand: unique symbol;
type Boxed<T> = { [boxedBrand]: T };
type BoxedValueOf<T> = T extends Boxed<infer U> ? U : never;

type TupleToBoxedTuple<T> = { [K in keyof T]: Boxed<T[K]> };
type TupleToBoxedUnion<T> = TupleToBoxedTuple<T>[keyof T];
type TupleToIntersection<T> = BoxedValueOf<UnionToIntersection<TupleToBoxedUnion<T>>>;

type A = TupleToIntersection<['hoge', string]>;
// A = "hoge"
```

## 解説

型変換は、調べると「タプルからユニオン」とか「[ユニオンからインターセクション](https://qiita.com/suin/items/93eb9c328ee404fdfabc)」は出てくるのですが、「タプルからインターセクション」に変換する方法はなかなか見つかりません。
（ググラビリティの問題？）

いやでも待てよと、「タプルからユニオン」「ユニオンからインターセクション」に連続して変換すればタプルからインターセクションが出てくるじゃん！と思った私は騙されました。
次のような場合に想定しないことになってしまいます。

```ts
type A = UnionToIntersection<TupleToUnion<[string, 'hoge']>>;
// A = string
// 実際に得られる型

type B = string & 'hoge';
// B = "hoge"
// 本来ほしいのはこの型
```

なぜならば、一度`'hoge' | string`というユニオンに変換された時点で`string`という型になってしまうからです。
`'hoge'`や`0`といったリテラル型は、`string`型や`number`型のようなより広い型に吸収されてしまうようです。

そこでなんとかリテラル型が吸収されないようにしながらユニオンに変換し、そのあとにインターセクションに変換するという手順を踏みます。

まずは、次のような型を用意します。

```ts
declare const boxedBrand: unique symbol;
type Boxed<T> = { [boxedBrand]: T };
```

これは型をラップするための型で、こいつを使うとユニオンを用いても型が吸収されるのを防げます。

```ts
type A = Boxed<'hoge'> | Boxed<string>;
// A = Boxed<"hoge"> | Boxed<string>
```

`Boxed<T>`型から`T`型を取り出すための型も用意しておきます。

```ts
type BoxedValueOf<T> = T extends Boxed<infer U> ? U : never;

type A = BoxedValueOf<Boxed<'hoge'>>;
// A = "hoge"
```

ポイントはこの`BoxedValueOf<T>`で、もはやネタバラシではありますが次のような型の取り出しが可能です。

```ts
type A = BoxedValueOf<Boxed<{ hoge: true }> & Boxed<{ fuga: true }>>
// A = {
//   hoge: true;
// } & {
//   fuga: true;
// }
```

`Boxed<A> & Boxed<B>`という型に対して`BoxedValueOf<T>`を適用すると、`A & B`というインターセクションが得られます。

すなわち、

> 「タプルからユニオン」「ユニオンからインターセクション」

このフローではなく**「タプルからBoxedユニオン」「BoxedユニオンからBoxedインターセクション」「Boxedインターセクションから生のインターセクション」**という流れで型を変換することで、求めていた「タプルからインターセクション」の型変換を行うことができます。

まとめると、次のようなコードで「タプルからインターセクション」の型変換が可能です。

```ts
// https://qiita.com/suin/items/93eb9c328ee404fdfabc
type UnionToIntersection<U> =
  (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;

declare const boxedBrand: unique symbol;
type Boxed<T> = { [boxedBrand]: T };
type BoxedValueOf<T> = T extends Boxed<infer U> ? U : never;

type TupleToBoxedTuple<T> = { [K in keyof T]: Boxed<T[K]> };
type TupleToBoxedUnion<T> = TupleToBoxedTuple<T>[keyof T];
type TupleToIntersection<T> = BoxedValueOf<UnionToIntersection<TupleToBoxedUnion<T>>>;

type A = TupleToIntersection<['hoge', string]>;
// A = "hoge"
```
USBについて

USBについて

# １．USBの基本


# ２．コネクタの形状

## ２－１．TYPE-A

## ２－２．TYPE-B

## ２－３．TYPE-C(USB-C)
56kΩ抵抗やeMarker、パワールール

# ３．USBの規格


## ３－１．USB2.0

### ３－１－１．転送速度
480Mbps

## ３－２．USB3.0
USB 3.1 Gen 1と同じ。

## ３－３．USB3.1 Gen1
旧名称でUSB3.2 Gen1と同じ。

## ３－４．USB3.1 Gen2
旧名称でUSB3.2 Gen2と同じ。


## ３－５．USB3.2　Gen1

### ３－５－１．転送速度
5Gbps
SUPERSPEED

## ３－６．USB3.2　Gen2

### ３－６－１．転送速度
10Gbps
SUPERSPEED+


## ３－７．USB3.2　Gen2×2

### ３－７－１．転送速度
20Gbps
SUPERSPEED++

## ３－８．Thunderbolt 3

### ３－８－１．転送速度
間違いのないSSH鍵を対話応答なしで作成する

Githubのドキュメントに従った強度をもつSSH鍵を、面倒な対話応答なしで作成します。

参考
[お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
[Github公式](https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)

# 環境
次の環境で確認しています。
A. Windows10
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
B. Ubuntu18.04
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017

# コマンド
ssh-keygenが使える環境で次のコマンドで作成します。
（コメントにはユーザ名やメールアドレスを入れる事が一般的と思います）

```sh
ssh-keygen -t rsa -b 4096 -C "<コメント>" -f <秘密鍵のファイル名> -N ""
```

直ちにカレントディレクトリに次のファイルが作成されます。
./<秘密鍵のファイル名>
./<秘密鍵のファイル名>.pub  （公開鍵）

### オプションの説明
| オプション | 説明 | 備考 |
|:---|:-------------|:-------------|
| -t | 鍵の種類を指定 | **rsa: 一般的、bit数は2048以上が必須**<br />dsa: 古く脆弱なため非推奨<br />ecdsa, ed25519: rsaより短く安全だが古いクライアントでは使えないかもしれない
| -b | 鍵のbit数を指定 | rsaなど可変長の鍵のbit数を指定する<br />**Githubのドキュメントでは4096** |
| -C | 鍵に付与されるコメントを指定 | 空欄でも問題ないが、githubなどでは管理画面に表示されるので**何か入れておいた方が便利です** |
| -f | 作成する鍵のファイル名を指定 | この名前で秘密鍵と、.pubの拡張子がついて公開鍵が作成される
| -N | パスフレーズを指定 | 今回は""としてパスフレーズ無しを指定。省略すると確認応答が表示されます。**使う場合は11字以上を推奨**(5文字程度の場合数秒でクラックされてしまうようです。[参考](http://freak-da.hatenablog.com/entry/20100901/p1))|
docker-composeでBundler::GemNotFoundになる

# docker-composeでBundler::GemNotFoundになる
たまに起こって毎回アレッって思うのでメモ

## docker-compose upするとGemNotFound
railsプロジェクトで、いつも通りdocker-compose upをすると、たまに`Bundler::GemNotFound`のエラーとなり起動できないことがある。

`bundle install`しても解決はしない

## docker-compose build しなおす
`docker-compose build` でビルドしなおし、再度docker-compose upをすると正常に起動する。
Google ColabにPyTorch Geometricをインストールする

## はじめに
Google ColabにPyTorch Geometricをインストールを試みましたが，一筋縄ではいきませんでした．いろいろ調べてみてもインストールする方法は書かれていなかったので，覚書として残しておきます．

### Google Colaboratoryとは
Google Colaboratory(Google Colab, Colaboratoryとも)は，Googleが提供するクラウド上で実行できるJupyter Notebook環境です．なんといっても無料でTesla K80 GPUを使える点がすばらしい．研究機関や企業に属さない個人がGPUを利用したいときには最適な環境といえます．
使い方などは[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)に詳しくまとめられています．

### PyTorch Geometricとは
[PyTorch Geometric](https://github.com/rusty1s/pytorch_geometric)(PyG)は，PyTorchベースのGraph Neural Network系ライブラリです．[GCN](https://arxiv.org/abs/1609.02907)や[GAT](https://arxiv.org/abs/1710.10903)をはじめとするGraph Neural Networkや，[Node2vec](https://arxiv.org/abs/1607.00653)などのGraph Embedding手法の実装が提供されています．

PyTorch Geometricを利用するためには，torch-geometricのほかに4つのライブラリ(torch-scatter, torch-sparse, torch-cluster, torch-spline-conv)をインストールする必要があります．が，この4つのライブラリをインストールすることが悩みの種となりました．

## インストール...できない
PyTorch scatterなど，PyTorch Geometric以外のライブラリがインストールできません．たとえばtorch-scatterをインストールしようとすると，このようなエラーメッセージが出てきます．

```
Collecting torch-scatter
  Downloading https://files.pythonhosted.org/packages/30/d9/1d5fd4d183dabd9e0a1f7008ecf83318432359f4cc27480e3f2212f44d9c/torch_scatter-1.3.2.tar.gz
Building wheels for collected packages: torch-scatter
  Building wheel for torch-scatter (setup.py) ... error
  ERROR: Failed building wheel for torch-scatter
  Running setup.py clean for torch-scatter
Failed to build torch-scatter
Installing collected packages: torch-scatter
    Running setup.py install for torch-scatter ... error
ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ttwepv79/torch-scatter/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ttwepv79/torch-scatter/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-e9z1yo5h/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.
```

### なぜ？
どうやら原因として

- ハードウェアアクセラレータがGPUに設定されていない
- gcc，g++のバージョンが適切ではない
- CPATHが通っていない

の3点があげられます．

## 解決方法

1． 編集＞ノートブックの設定＞ハードウェアアクセラレータでGPUに変更
2． gcc, g++のversionを5にさげる．CPATHを通す．

  ```bash
  !apt install gcc-5 g++-5 -y

  !ln -sf /usr/bin/gcc-5 /usr/bin/gcc 
  !ln -sf /usr/bin/g++-5 /usr/bin/g++

  !export CPATH=/usr/local/cuda/include:$CPATH
  ```

3． Pytorch Geometricと付随するライブラリをインストールする

```bash
!pip install torch-scatter
!pip install torch-sparse
!pip install torch-cluster
!pip install torch-spline-conv 
!pip install torch-geometric
```

## 最後に
PyTorch GeometricがColab上で動くようにはなったけど...インストールに結構時間かかるなぁ…
以上です！

## 参考リンク

- [Pytorch Scatter](https://github.com/rusty1s/pytorch_scatter)
- [CPATH is empty #64](https://github.com/rusty1s/pytorch_scatter/issues/64)
docker-composeでWordpressの構築 (Windows)


## 概要
- 手元のPCでWordpressを軽く触りたい
- 手元のPCにPHPやDBをインストールしていない（環境設定とか面倒）
- MAMPのような導入に便利なパッケージあるけど、やっぱり手元のPC環境はきれいなままにしたい
- そもそも、Wordpressで本格的に何かを開発するのではなくて勉強程度に触れるだけ

...ってな時にはDockerで試してみるのもありですね！

## 環境
 - Windows 10 pro
 - Docker version 19.03.2
 - docker-compose version 1.24.1

## 準備
- 下記ファイルを用意

```yml:docker-compose.yml
version: '3.4'
networks: { intr: { external: true } }
volumes:
  wp_db_data: { driver: "local" }
services:

  wp:
    image: wordpress
    networks: [ "intr" ]
    volumes:
    - ./www:/var/www/html
    environment:
      WORDPRESS_DB_HOST: wp_db:3306
      WORDPRESS_DB_PASSWORD: pass
    ports: [ 8001:80 ]

  wp_db:
    image: mysql:5.7
    networks: [ "intr" ]
    volumes:
     - wp_db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
```

## 構築

`docker-compose.yml`を置いたディレクトリで下記のコマンドを実行

```sh:cmd
docker network create intr
docker-compose up -d
```

## 動作確認

[フロント画面]：http://localhost:8001
[管理画面]：http://localhost:8001/wp-admin

## 補足

`docker-compose.yml`に定義した内容の補足

- networks
 - 将来的に別の`docker-compsoe.yml`で定義したコンテナからのアクセスを考慮し、共通リンク用のネットワークを作成してからコンテナを立ち上げるようにしています。（不要の場合は削除してよいです。）
 - そのため、`docker-compose up -d`の前に、`docker network create intr`を実行して事前にネットワークを作っています。
 - `docker network ls`で既存のnetworkの一覧を確認できます。
- volumes
 - データを永続化させるためにトップレベルに`data volumes`を指定しています。
 - そのため、コンテナを再構築することになっても`data volumes`さえ消さなければデータは無事です。
 - 今回、Docekr for Windowsを標準のまま利用しているので、Mysqlに登録されたデータは`Hyper-V`で作成した仮想マシン`MobyLinuxVM`にマウントされています。
 - `docker-compose down -v`を実行すると`data volumes`も消えるのでデータは消失します。
 - `docker volumes ls`で 既存のvolumes一覧を確認できます。
- services
 - Wordpress(wp)とMysql(wp_db)のコンテナを立ち上げています。
 - wpではホスト側のエディタ等を使用してWordpressのカスタマイズが出来るようにコンテナ内の`/var/www/html`をマウントしてます。
 - wpではホスト側の`8001番ポート`とコンテナ側の`80番ポート`をマッピングしているので、`localhost:8001`でブラウザからアクセスして動作を確認することができます。
 - wp_dbのコンテナの中には以下のコマンドで入ることができます。
 - `docker-compose exec wp_db sh`
 - コンテナの中に入ったら、下記のようなMysqlのコマンドでDBの参照等を行うことができます。
 - `mysql -uuser -ppass wordpress`


以上です！
PoweShellでエクセルのワークシートに配置されたActiveX コントロールの状態を取得する

ここを見よ
officeデベロッパーセンター - OLEObjects オブジェクト (Excel)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.oleobjects

業務で使う大量のエクセルがあり、チェックボックスがON(True)の場合、特定の処理がしたかったのでPowerShellでつらつら。
しかしチェックボックスがActiveXコントロールのだったため悩む。
ActiveXがOLEObjectsっぽいことに気がついて行き着きました。

例文がほとんど
　Sheets("Sheet1").CheckBoxes(1)
等でフォームコントロール対象だったため1時間くらい悶々としてました。
VBAのお作法を知らないので余計にですね。

```
#ActiveXコントロールの CheckBox1 の状態取得
$isOn = $Targetsheet.OLEObjects("CheckBox1").object.value
```


OLEObjects("CheckBox1")からのobjectは自力では辿り着かなかったでしょう…

```hoge.ps1
# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application

# 不可視化する
$excel.Visible = $false

# 既存のExcelファイルを開く
$TargetBook = $excel.Workbooks.Open("hoge.xlsx")

# シートを取得
$Targetsheet = $TargetBook.Worksheets.Item("シート名")

#CheckBox1 の状態取得
$isOn = $Targetsheet.OLEObjects("CheckBox1").object.value

if ($isOn){
    #何らかの処理
}

# 上書き保存
$TargetBook.Save()

# Excelを閉じる
$excel.Quit()
```

ちなみに下記のように適当にワークシート.チェックボックスで打ち込んでも何も表示されないだけでエラーは出ない。
これも混乱したもとでした。

```console
[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1

[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1.name

[DBG]: PS Microsoft.PowerShell.Core\FileSystem::\\foo\bar>> $Targetsheet.CheckBox1.hight
```
【自分備忘録】Nuxt.js(Pug + Stylus使用)＋Storybookでコンポーネント一覧を作る（仮）

こっちで書こうと思ったけど、個人のほうでしっかりまとめちゃったので、URL貼り付けときます。
https://rainymoment0616.qrunch.io/entries/rlR1tjTJvHVsGJN7

## ざっくり概要だけまとめ
`./storybook/weboack.config.js`内に、PugとかStylusのコンパイルエラーが起きないように設定を書き込んでいく！

**Pugを使ってる場合**

* pug-plain-loader
    * NuxtでPug使えるようにしてるなら、既にモジュールをインストールしてるはず

**Stylusを使ってる場合**

* vue-style-loader
* css-loader
* stylus-loader
    * NuxtでStylus使えるようにしてるなら、既にモジュールをインストールしてるはず
* style-resources-loader
    * stylusで使用する変数とか共通のものを別ファイルにしてassetsディレクトリとかに置いてる場合は、これを使ってインポートしてくれば、使えるようになる
Kotlin#1:覚えた技術を日々書き留める

#BoxInsetLayout
円形ディスプレイにコンポーネントを配置した場合でも、見切れないように表示するためのもの

#padding
viewのbackgroundの中での距離

・paddingTop 上からの距離
・paddingBottom 下からの距離
・paddingStart 左端からの距離
・paddingEnd 右端からの距離

#margin
view間の距離

・marginTop 上のViewからの距離
・marginBottom 下のViewからの距離
・marginStart 左端のViewからの距離
・marginEnd 右端のViewからの距離
Splunkを使用したインシデント対応関連情報

[Splunk Answer validated best practice](https://answers.splunk.com/topics/validated_best-practice.html)
にいろいろと上がっている。

[Splunk Enterprise Security](https://www.splunk.com/ja_jp/software/enterprise-security.html)を使用してというのが少し辛いけど。

なおggってみると
[Splunk for Security Investigation: Threat Detection](https://www.splunk.com/en_us/resources/videos/splunk-for-security-investigation-threat-detection.html)
[finding bad splunk](https://www.sans.org/reading-room/whitepapers/critical/finding-bad-splunk-37482)
なるものもある。

とりあえずは[絶対理解しておくもの](https://www.jpcert.or.jp/research/20160628ac-ir_research.pdf)


Boss Of the SOCへの忘備録として
Native Lazyloadを特定のページで無効にする方法

# Native Lazyload とは？

WordPress のプラグインで Google が作成した [Native Lazyload](https://ja.wordpress.org/plugins/native-lazyload/) というものがあります。
Chrome ではブラウザ側で Lazyloading 機能に対応しているので、Chrome の場合はこれを有効に、それ以外のブラウザはフォールバックスクリプトを動かして、WordPress 内の画像、iframeの遅延読み込みを有効にさせるプラグインです。

# とても便利。でもページ内アンカーがあると・・・・・・

プラグインを有効にするだけで Lazy loading が有効になるのでお手軽便利なプラグインなのですが、ページ内アンカーがあり、ページ内に画像を使っていると、アンカーポイントがずれてしまいます。
原理として、スクロールに応じて画像を読み込むため、ブロック内に画像の高さが計算されていません。
何も表示されていないところに、スクロールされて初めて画像読み込みが開始されるので、読み込み完了後に画像の高さ分、ブロックが作られます。そのため、一気にページ内を移動するアンカーとの相性が悪いです。
（実際の操作感として、一気に移動後、画像読み込みに応じて画面が下にずれていく感じです）

# ページ内アンカーがある場合のみ無効にしたい

アンカーで目的の項目に移動したつもりなのに、実際に移動できないのは、とてもストレスです。UI として失格です。
そのため、ページ内アンカーがあるページのみ無効にしたくなります。
functions.php に以下記述で対応します。

```functions.php
define('SKIP_LAZY_PAGE', ['menu', 'price']);

/**
* 特定のページでNative Lazyload を無効に
* Native Lazyload に用意されているフォールバックを特定のページに適用
*/
function disable_per_page_plugin() {
    if(is_page(SKIP_LAZY_PAGE)){
        add_filter( 'native_lazyload_fallback_script_enabled', '__return_false' );
    }
}
add_action( 'parse_query', 'disable_per_page_plugin' );


/**
* 特定のページでNative Lazyload を無効に
* マッチしたら、 add_action で the_content に skip-lazy を適用
*/
function skip_lazyload()
{
    if(!is_page(SKIP_LAZY_PAGE)) return false;
    add_action( 'the_content', 'content_add_class_skip_lazy');
}
add_action( 'wp', 'skip_lazyload' );

/**
* 本文内から画像タグを見つけて skip-lazy クラスを付与
*/
function content_add_class_skip_lazy($content) {
    if(strpos($content, "<img ") === false) return $content;
    return str_replace('<img ','<img class="skip-lazy" ', $content);
}
```

`native_lazyload_fallback_script_enabled ` というフォールバックが用意されているので、これをページ単位でまず適用させます。
これを実行すると、他ブラウザで適用させるためのスクリプト展開が止まります。
実行タイミングは `is_page` が実行される早めのタイミングで行います。
`init` とかだと早すぎたです。

これだけだと Chrome 用のネイティブなのが動いてしまうので( loading="lazy" )、これに対応する方法をいろいろ探していましたが、`class="skip-lazy"` を付与すると無効になるようだったので、これに対応させるため、本文内の画像タグに対して加工します。
ただ、固定ページ、なおかつ class 付与のされていないことを前提にしているので、 class 付与されている事を考慮する場合は丁寧な正規表現の記述が必要です。。
Cassandraデフォルトではリモートからアクセスできない

#はじめに
Cassandraデフォルトではリモートからアクセスできないため、インストールした後、設定ファイルを修正してから起動する必要があります。

#Cassandraインストール
##Dockerからインストール
```shell
docker pull cassandra

#起動
docker run --name some-cassandra -d cassandra:latest
```

参考ページ：　https://hub.docker.com/_/cassandra

##yumでインストール
###リポジトリ情報を登録する
```shell
vi /etc/yum.repos.d/cassandra.repo
```

下記内容を追記して保存。

>[cassandra]
name=Apache Cassandra
baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.apache.org/dist/cassandra/KEYS


###yumでインストール実行
```shell
yum -y install cassandra

#再読み込みする
systemctl daemon-reload

```

インストール完了です。

###起動する
systemctl start cassandra

###停止する
systemctl stop cassandra

###再起動する
systemctl restart cassandra

###起動ステータス確認する
systemctl status cassandra

###設定変更
cassandra.yamlファイルにlisten_addressとrpc_addressを修正

####listen_address
>Address or interface to bind to and tell other Cassandra nodes to connect to. You _must_ change this if you want >multiple nodes to be able to communicate!
>
>Set listen_address OR listen_interface, not both.
>
>Leaving it blank leaves it up to InetAddress.getLocalHost(). This will always do the Right Thing _if_ the node is >properly configured (hostname, name resolution, etc), and the Right Thing is to use the address associated with the >hostname (it might not be).
>
>Setting listen_address to 0.0.0.0 is always wrong.
>
>Default Value: localhost

デフォルトはlocalhost（127.0.0.1）なので、ほかのサーバからPrivateIPでアクセスできません。
listen_address=xxx.yyy.zzz.www
のようにPrivateIPを設定。

####rpc_address
>The address or interface to bind the native transport server to.
>
>Set rpc_address OR rpc_interface, not both.
>
>Leaving rpc_address blank has the same effect as on listen_address (i.e. it will be based on the configured hostname of the node).
>
>Note that unlike listen_address, you can specify 0.0.0.0, but you must also set broadcast_rpc_address to a value other than 0.0.0.0.
>
>For security reasons, you should not expose this port to the internet. Firewall it if needed.
>
>Default Value: localhost

リモートからできるようにPrivateIPを設定したほうがよいです。
rpc_address=xxx.yyy.zzz.www


設定ファイルの詳細：http://cassandra.apache.org/doc/latest/configuration/cassandra_config_file.html

以上
DonkeyCar デルのゲーミングデスクトップPCにubuntuを入れて訓練

#PC購入
消費税増税前のキャンペーンでRTX2070の入ったデスクトップPCを購入．
G52090，約17万円
Windows10homeがプリインストール済み．
#SSD増設
2.5インチサイズのSSDを増設してデュアルブートとする．
#ubuntuをインストール
８GのUSBを用意．
Ubuntu Desktop 18.04.3 LTS をダウンロードして起動するも立ち上がらない．
RTXのドライバーが入っていない為らしい．
Ubuntu Desktop 19.10 でインストール成功．
#Donkeyソフトウェアのインストール
gitが入っていないのでエラー
sudo apt-get install git
が必要だった．
本家の手順通りだがGithubのソースが3.1.0から３.1.1にアップデートされた．
車の方は3.1.0なので
git checkout master
は
git checkout ３.1.0
とした．
#訓練
まずCPUで試す．
プロセッサのスペックは
第9世代 インテルR Core i7 9700K 8-コア/8-スレッド, 12MB キャッシュ
, Overclocked 最大 4.6 GHz まで可能 on all cores)
訓練の処理時間は約2分

次にRTX2070で試すため以下をインストール．
conda install tensorflow-gpu==1.13.1
訓練の処理時間は約20秒

同じ教師データではないが，
いつも使っていたmacmini のCore i7 ６コアで10分程度．
AzureのGPU有り標準VMで２分程度．

#運用
ミニタワーなので気楽に持ち歩けない．
外からはVPNでL2TP接続（ヤマハルータ）
ウチの場合ネット回線がADSLなので，データのアップロード、ダウンロードの時間が待たされる．
【女子受け抜群】CSS:before:after（擬似要素）で超可愛い隠れミッキー

女子受け抜群です。

<img width="111" alt="スクリーンショット 2019-10-26 2.39.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447711/b8352a42-05ae-48a6-2767-f89980e59d81.png">



```page.html


  <label id="mickey"><span></span></label>


```

```page.css

#mickey {
  position: relative;
  display: inline-block;
  width: 52px;
  height: 52px;
  vertical-align: middle;
  margin-right: 0;
  background-color: orange;
}

/* ミッキーの真ん中 */
#mickey span {
  position: absolute;
  left: 6px;
  bottom: 0;
  width: 40px;
  height: 40px;
  background-color: white;
  border-radius: 50%;
  display: block;
  content: '';
  cursor: pointer;
}

/* ミッキーの耳２つの形 */
#mickey span:before,
#mickey span:after {
  position: absolute;
  width: 24px;
  height: 24px;
  background-color: white;
  border-radius: 50%;
  display: block;
  content: '';
  cursor: pointer;
}

/* ミッキーの左耳の位置 */
#mickey span:before {
  top: -10px;
  left: -6px;
}

/* ミッキーの右耳の位置 */
#mickey span:after {
  top: -10px;
  right: -6px;
}

```

spanが本体で、基準位置のrelative。

:before、:afterで耳を作ってabsoluteにしてポジションを整える。

下記のURLでサンプルがみれます。

https://jsfiddle.net/xk291rdh/

ミッキーマウスでスマホメニューを作ってみた記事は下記。

http://poppotennis.com/css_spmenu_micky/



女子受け抜群のはずなのに、受けたことがありません。

プログラミングって、不思議ですね。