OmniAICreator/Qiita-1.07M huggingface dataset:
「クラウドへの複数ファイル一括アップロード」を試してみる

##モチベーション
チュートリアルどれくらいの時間で実際のところできるんだろう？
例題で10分と書かれている[クラウドへの複数ファイル一括アップロード](https://aws.amazon.com/jp/getting-started/tutorials/backup-to-s3-cli/?trk=gs_card)を試してみる。

##環境
- RaspberryPi3B+
- Raspbian 9.8

##ステップ 1: AWS IAM ユーザーを作成する
- AWS マネジメントコンソール
- IAM(Identity and Access Management )
- ユーザー
- ユーザーを追加
- ユーザー名：AWS_Admin
- アクセスの種類： プログラムによるアクセス
- 次のステップ
- 既存のポリシを直接アタッチ
- AdministratorAccess を選択
- 次のステップ
- 次のステップ
- ユーザーの作成
- .csvのダウンロード
- credentials.csv が保存される。
- 閉じる

##ステップ 2: AWS CLI をインストールおよび設定する

```
pi@raspberrypi:~ $ pip install awscli --upgrade --user
pi@raspberrypi:~ $ aws configure
AWS Access Key ID [****************DTFA]: xxxxxx(credentials.csvより)
AWS Secret Access Key [****************fl86]: xxxxxx(credentials.csvより)
Default region name [US-EAST-1]: us-east-1
Default output format [json]: json
```

##ステップ 3: AWS CLI と Amazon S3 を使用する
CLIからatsmaru-bucketという名前のbucketを作成する。

```
pi@raspberrypi:~ $ aws s3 mb s3://atsmaru-bucket
make_bucket: atsmaru-bucket
```
CLIでファイルコピー

```
pi@raspberrypi:~ $ aws s3 cp /home/pi/test.jpg s3://atsmaru-bucket
upload: ./test.jpg to s3://atsmaru-bucket/test.jpg
```
S3の画面からuploadされていることを確認しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29032/b484022c-9a02-6a4d-48ad-b6e68e805bec.png)

##結果
30分くらいかかりました。

##おまけ
CLIから作ったバケットの素性を確認
アクセス：公開可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29032/cd0a0a11-16db-30df-9481-a4b4032eaf74.png)
ストレージクラス：スタンダード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29032/182e160a-d114-3294-cb01-03def9166994.png)
パブリックアクセス権：4つともFALSE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29032/e4667151-c6cf-d1b4-2de0-0007814a12ad.png)
MavenでJUnitテストレポートを出力する

MavenでJUnitテストを実行して、テストレポート（HTML）を出力する手順をまとめた。

#### (1) pom.xmlにプラグインの設定を追加する

```xml
<project ...>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
        <configuration>
          <useSystemClassLoader>false</useSystemClassLoader>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.7.1</version>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
        <version>2.22.1</version>
      </plugin>
    </plugins>
  </build>
  ...
</project>
```

maven-surefire-pluginのconfigurationは不具合回避のために必要となる。

参考：https://qiita.com/watanabk/items/16e19e30659d0acca519

その他のプラグインは記載しなくても問題ない。（記載しない場合は最新版が使われる。）

#### (2) mvnコマンドでテスト実行・レポート生成する

```shell
mvn clean \
    test -Dmaven.test.failure.ignore=true \
    site -DgenerateReports=false \
    surefire-report:report
```

テストが実行されて、テスト結果レポートが`target/site/surefire-report.html`に出力される。

各フェーズもしくはゴールの役割は以下の通り。

##### clean (Phase)

ビルド結果（target）を削除する。

##### test (Phase)

テストを実行する。失敗したテストがある場合もレポートを出力するために`-Dmaven.test.failure.ignore=true`を指定する。

##### site (Phase)

本来はプロジェクトサイトを出力するためのビルドライフサイクル。`surefire-report:report`の実行のみではレポートがリンクする画像とCSSが出力されないため、`-DgenerateReports=false`を指定して実行して、画像とCSSのみ出力する。

参考：https://stackoverflow.com/questions/21432663/how-to-get-the-icons-for-the-resulted-maven-surefire-report-plugin

##### surefire-report:report (Goal)

`target/surefire-report`内のJUnit実行結果（XML）からレポート（HTML）を出力する。

参考：https://maven.apache.org/surefire/maven-surefire-report-plugin/usage.html

※ 今回はtestフェーズと同時にsurefire-report:reportゴールをしているため問題ないが、surefire-report:reportゴールを単体で実行する際にはtestフェーズが自動的に実行される。レポートのみ出力したい場合にはsurefire-report:report-onlyゴールを指定する。

参考：http://maven.apache.org/surefire/maven-surefire-report-plugin/faq.
【Rails】関連に同一モデルを含む場合

# これは何？
ユーザーのブロックリスト管理をしようとしたが、
ブロックリストを管理するモデルで二つのユーザーモデルを関連させなければならず、
その時に行き詰まってしまったのでここに記します。

# 何をしたいのか
`user`, `user_block`二つのモデルを利用して、
user_block内で「誰が」「誰を」ブロックしたのかを管理したい。

# モデル作成
`bundle exec rails g model User name:string`

| User |
|:--|
| - name  |

`bundle exec rails g model UserBlock from:references to:references`

この時、migrationファイルに`foreign_key`が自動的に付与されるが、そちらは削除する。

| UserBlock |
|:--|
| - from_id<br>- to_id  |

# 関連
モデルができたので、`from_id`、 `to_id`の二つをUserと関連させていく。

```ruby:user.rb
has_many :user_blocks, foreign_key: :from_id
```

```ruby:user_block.rb
belongs_to :from, class_name: 'User'
belongs_to :to, class_name: 'User'
```

# 呼び出し
```ruby:users_controller.rb
before_action :set_user

def block
 blocked = current_user.user_blocks.where(to: @user)
 blocked || current_user.user_blocks.create(to: @user)
end

def unblock
 current_user.user_blocks.where(to: @user).destroy
end

private
def set_user
 user = User.find(params[:id])
end
```

# 参考
http://www.coma-tech.com/archives/223/
ボタンデザイン基本

##横幅100%
ボタンの高さを50pxで設定しています。

```css:css
a.btn-type-a {
    background: #999;
    color: #fff;
    display: block;
    font-size: 14px;
    line-height: 20px;
    padding: 15px 0;
    text-align: center;
    text-decoration: none;
}
```

##右側に配置したい場合
width を追加し div で囲う。

```html:html
<div class="fx-base fx-rev">
    <a href="" class="btn-type-a">hoge</a>
</div>
```


```css:css
a.btn-type-a {
    background: #999;
    color: #fff;
    display: block;
    font-size: 14px;
    line-height: 20px;
    padding: 15px 0;
    text-align: center;
    text-decoration: none;
    width:200px;
}
```
Code server の Docker image を試した

[オンプレでVS Code as a Serviceできるcode-serverを試す](https://qiita.com/m5d215/items/f5ae82ad9a3726519904) を読んでついに来た! となった．
Github の [codercom/code-server](https://github.com/codercom/code-server) を見ると，以下のコマンドにより `docker` でも試せるらしい．
せっかくなので `docker-compose` してみた．
今のところ `root` ユーザでしかコーディングできないっぽいので，強い人による `Dockerfile` 更新が待たれる．
`environment` で任意のユーザーを作れるようになったら実用しようかな．

# docker で code-server

公式に載ってる． `code-server --allow-http --no-auth` をつけてると少なくとも Firefox ではセキュリティ的にアウトで弾かれる．

```sh
docker run -p 127.0.0.1:8443:8443 -v "${PWD}:/root/project" codercom/code-server code-server --allow-http --no-auth
```

# docker-compose で code-server

以下の `docker-compose.yaml` を作成後， `sudo docker-compose up` して，ログに出てくるパスワードを入力 (よって `-d` オプション不可)．
二度目以降の起動時は `-d` をつけても OK．
`--allow-http --no-auth` はコメントアウトした．

永続化により，projectディレクトリ以下はホストに保存されるが，ホストによる編集にはルート権限が必要．

```{docker-compose.yaml}
version: "3"
services:
  code:
    image: codercom/code-server
    restart: always
    ports: 
      - "8443:8443"
    # command: code-server --no-auth --allow-http
    volumes:
      - ./project:/root/project
```
Blenderでオブジェクトを円形に配置する(2021/12/5, blender 3.0)


Blenderでオブジェクトを円形に配置する手順をまとめました。
ポイントは3.のモディファイアの設定です。

## 期待結果
![スクリーンショット 2021-12-05 15.43.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/78d02003-67f1-34cb-d7ec-a7b40c3423fd.png)

## 手順動画

手順の動画も用意しました。動画で全体の感じをつかんでから手順を読むとわかりやすいかもしれません。

https://twitter.com/kabosu3d/status/1467364489725378562

## 手順
### 試行環境
- Mac OS 12.0.1 Monterey
- blender 3.0

### 1. キューブを作成し、「編集モードで」y方向に中心からずらす
![スクリーンショット 2021-12-05 15.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/1196e544-863d-b2a8-b583-b053846b2585.png)

かならず編集モードで行ってください。

### 2. Emptyを一つ作成し、原点に置いたままにする

### 3. キューブに配列複製モディファイアを追加し下記のように設定する

- 数: 12
- オフセット(倍率): チェックを外す
- オフセット(OBJ): チェックを入れ、2.でつくったEmptyを入れる

![スクリーンショット 2021-12-05 15.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/c28101d1-1e64-cf4f-06ed-1b71eecf9864.png)

### 4. Emptyのトランスフォームで、Z回転を30°にする

![スクリーンショット 2021-12-05 15.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/2d14d408-2226-8a14-b53f-b3bd7d7b23be.png)


以上です。

### 参考
Blender Array Modifier
https://www.youtube.com/watch?v=H2pYHI_-iWo



## 参考: 以下は2019/3時点の調査結果です。

Blenderでオブジェクトを円形に配置する方法を検索して色々試しましたが、現時点でうまくいかない手順が多かったので、今成功する手順をまとめました。

ポイントは3.のモディファイアの設定です。

## 期待結果
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/198108/748caae7-6155-e59c-e7c7-553c967d8693.png)

## 手順
### 試行環境
- Windows 10
- blender 2.79b

### 1. キューブを作成し、「編集モードで」y方向に中心からずらす

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/198108/0d979971-3444-bdb0-32b1-efa12477a5a0.png)

かならず編集モードで行ってください。

### 2. Emptyを一つ作成し、原点に置いたままにする

### 3. キューブに配列複製モディファイアを追加し下記のように設定する

- 数: 12
- オフセット(倍率): チェックを外す
- 一定のオフセット: チェックを入れる
- オフセット(OBJ): 2.でつくったEmptyを入れる

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/198108/2ed324cb-ac09-3d00-eaf3-841ad1bed5e9.png)

### 4. Emptyのトランスフォームで、Z回転を30°にする

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/198108/748caae7-6155-e59c-e7c7-553c967d8693.png)

以上です。

### 参考
Blender Array Modifier
https://www.youtube.com/watch?v=H2pYHI_-iWo
Visual Studio CodeでSSL証明書エラーを無視して拡張インストール

会社のプロキシが余計なことをして、Visual Studio Codeの拡張機能インストール時に証明書エラーが出たので回避策をメモしておきます。
Visual Studio Code本体の更新時も同じです。

コマンドラインで起動する場合に`--ignore-certificate-errors`をつければ、その起動中は証明書の異常を無視してくれるようになります。

```bash
code --ignore-certificate-errors
```

# 備考

調べてみると`--ignore-certificate-errors`はChromiumにあるオプションなんですね。
electron製のアプリは共通で入っているんですかね。

# 参考

[SSL error when checking for updates. No action option to connect anyway. #30871](https://github.com/Microsoft/vscode/issues/30871)
プロジェクト・マネジメント概要

#はじめに
現在勉強しているプロジェクト・マネジメントを自分への忘備録および後学の人のわずかな助けになればと概念をまとめました。

#プロジェクトとはなにか
プロジェクトとは固有な生産品やサービスを、主に時間的制約によって決められた期間内の努力によって生み出し、設定された目標を満たし、多くの場合それによって有益な変化をもたらすもの。

特に重要なのは時間的制約です。時間的制約はプロジェクトの開始以前に明確に設定されていなければならず、多くの場合人的資源や資金などの制約よりも設定を優先されます。

#プロジェクトマネジメントとは
設定された目標の達成のために発生する日常的、技術的問題を対処するために、
・計画
・組織
・意欲を起こさせること
・資源の管理
・手段
・規約
などを処理し実行することです。

#規約による三すくみ
最終的な成果物の品質は時間、機能、経費の三すくみの擦りあいの中心にあり、すべての影響を受けます。それゆえに規約の管理は品質の管理にもつながります。

```規約.md
     -機能 -
   /    |   \
　/   -品質-  \
/  /        \  \
時間---------経費
```

#プロジェクト・マネジメントにおける二つのパラダイム
* ウォーターフォール (計画優先)
* アジャイル (反復的漸増的)

##ウォーターフォール

ウォーターフォールは先ほどの三すくみのうち機能に最も焦点をあてて、最終的なディプロイにいたるまで一方通行の方法です。

プロジェクトの計画→必要条件の画定→分析→設計→コーディング→試験→ディプロイ

この方法において機能は固定のものでその達成のために費用や時間は引っ張られます。
現在ではウォーターフォールはあまり使われないようですが、公的なプロジェクトなどでは、すべての段階が機能達成にむけて満足しうるまで行われるために得られる強いガバナンスを理由にしばしば採用されるようです。

<B>ウォーターフォールにおけるメリットとデメリット

メリット
・プロジェクト開始の時点で仕様が明白に文書化できること
・段階ごとにやらなければならないことが明白であること
・目標と求められる結果が明白であること
・小規模な開発では強力な統率力をもつこと
デメリット
・プロジェクトの最終段階にはいるまで実際のソフトウェアができないこと
・不確定要素やリスクが浮上する可能性が高いこと
・技術、仕様上の変更に弱く対応力に著しく欠けること
・求められる市場などのスコープが途中で変わるとプロジェクトの終焉にもつながること
・ソフトウェアの最終的な統合を一度に行うため作業が膨大になること

プロジェクトが失敗に終わる確率が高いため少なくとも資料に使った<https://explore.versionone.com>のアンケートに答えた海外の企業ではほとんど使われていません。

##アジャイル

アジャイルは時間に最も焦点をあてており、
プロジェクトの計画→必要条件の画定→分析→設計→コーディング→試験→ディプロイの段階を完成まで繰り返します。それぞれの段階において達成される機能は小さくその積み重ねで決められた時間内での最終的なディプロイを目指します。
アジャイルは仕様の変更に強く、問題にも比較的柔軟に対処できるため現在では支配的な手法です。

<B>アジャイルの四大要素

1. 繰り返し積み重ねて行う手続きと処理
2. ソフトウェアを動かしながら包括的な文書化を行う
3. 顧客との共同作業である
4. 計画に沿ううえでの変更に対応する

<B>アジャイルにおける12の指針

アジャイルを支える指針3つに分類されます。
1. ソフトウェアの定期的な送り出し
2. チームのコミュニケーション
3. デザインの秀逸性

1.1 ソフトウェアを早期から定期的に提供することで顧客を満足させることを優先する
1.2 数週間規模の小さな時間枠で動作するソフトウェアを繰り返し提供する
1.3 プロジェクトの進展度合いを動作するソフトウェアから判断する
1.4 持続的な開発を繰り返すために、依頼主、開発者、ユーザーが足並みをそろえること

2.1 営業関係者と開発者がプロジェクトを通して日々共同すること
2.2 開発チームに必要な情報を最も効率よく効果的に提供する方法は顔を突き合せた会話である
2.3 最良の構造、要望、設計は自己管理されたチームから生まれる
2.4 熱意を持った個人の集まりによってプロジェクトを進めること。彼らが仕事をすすめるために必要な環境とサポートを用意し、信頼すること
2.5 繰り返しのなかでチームはより効率的になり姿勢もまた調和していくこと

3.1 技術やデザイン面での秀逸性へ意識を向けることで対応力を伸ばすこと
3.2 簡素化が最重要、つまり未完了の作業の量を最大化すること
3.3 たとえ開発の後期に入っていても変更の要求を受け入れること。顧客の競争を有利にさせるためにアジャイルは変更を制御すること


#まとめ
概要なので本当にそもそもの定義の広いところのみを書いたつもりです。
のちの投稿ではより詳しくスクラム、エクストリームプログラミングなどのアジャイル手法に焦点をあてて紹介するつもりです。
YUV422とMJpegの画質の違い

左がYUV422, 右がMJPEG。肌の色が明らかに違う。
![Screen Shot 2019-03-08 at 6.28.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/39529/aff8361c-1df9-8471-a8c7-02277b54a4ba.png)

左がYUV422, 右がMJPEG。色が明らかに違う。
加えて、左の画像では、髪の毛がギザギザしている。
![Screen Shot 2019-03-08 at 6.30.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/39529/c6cc040f-831e-d012-ce4d-2229888751e5.png)

YUV422のが画質が悪いのは、UとVを2ピクセルで共通して使っているせい。
そのまま見る分には気にならないけど、画像処理をして、ここからマスクを作ったりするには不向き。
![Screen Shot 2019-03-08 at 6.35.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/39529/2de7181e-40b0-711c-46c8-e45358611df6.png)
オンラインカードゲームのサーバーサイドを作った [目次]

記事が増えてきたので、目次を作りました。

1. [オンラインカードゲームのサーバーサイドを作った①](https://qiita.com/Kakky/items/0d2509ebcae12e3376b6)
2. [オンラインカードゲームのサーバーサイドを作った②](https://qiita.com/Kakky/items/c40d20251fe6f8f5d250)
3. [オンラインカードゲームのサーバーサイドを作った③](https://qiita.com/Kakky/items/1f260b4061bde6e0a0b9)
4. [オンラインカードゲームのサーバーサイドを作った④](https://qiita.com/Kakky/items/1f260b4061bde6e0a0b9)
5. [オンラインカードゲームのサーバーサイドを作った⑤](https://qiita.com/Kakky/items/19937f419a7699ff024e)
6. [オンラインカードゲームのサーバーサイドを作った⑥](https://qiita.com/Kakky/items/5bea0a1ac2410797e613)
ShellScriptで先頭や末尾を除く

シェルを書いてると`head`や`tail`コマンドで絞り込むことが良くあるんですが、先頭から数行除く、末尾から数行除くを毎度忘れるのでまとめておきます。


# 結論

```bash
head -n -N # 末尾からN行除いて表示
tail -n +N # 先頭からN行除いて表示
```

参考というか、丸々持ってきてしまった感じですが

[Linuxでファイルから先頭・末尾の数行を除外する 俺的備忘録 〜なんかいろいろ〜
](https://orebibou.com/2016/12/linux%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%85%88%E9%A0%AD%E3%83%BB%E6%9C%AB%E5%B0%BE%E3%81%AE%E6%95%B0%E8%A1%8C%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B/)




# 元ファイル


```test.text
1
2
3
4
5
6
7
8
9
```

# 先頭から数行表示(普通にhead)

普通に先頭3行を表示

```bash
$ head -n 3 test.text 
1
2
3
```

# 末尾から数行除いて表示(head -n -N)

以下の場合は末尾3行を除く

```bash
$ head -n -3 test.text 
1
2
3
4
5
6
```

# 末尾数行表示(普通にtail)

普通に末尾3行を表示

```bash
$ tail -n 3 test.text 
7
8
9
```

# 先頭から数行除いて表示(tail -n +N)

ちょっとややこしいのが、**3行目から表示する**という意味になること
3行除くではない

```bash
$ tail -n +3 test.text 
3
4
5
6
7
8
9
```

# 参考

[Linuxでファイルから先頭・末尾の数行を除外する 俺的備忘録 〜なんかいろいろ〜
](https://orebibou.com/2016/12/linux%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%85%88%E9%A0%AD%E3%83%BB%E6%9C%AB%E5%B0%BE%E3%81%AE%E6%95%B0%E8%A1%8C%E3%82%92%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B/)
Unity初心者やってみた1

次回：https://qiita.com/akagane99/items/cd1603ef4c3bddac86ed
一覧：https://qiita.com/akagane99/items/2dd005511a8d50f5634d

### まえがき

普段はWeb系プログラマー。
業務も落ち着いてきたので、何か別の事をやってみたい。
ゲームは好きだ。けどゲームを作った事はない。
Unityはどうやらゲームが作れるらしい位の知識。

### 目的・目標

* 目的
    * Unityってゲーム作れるらしいけど、よく知ならない。チョットデキル位になりたい。願望
    * アウトプット出して、出来る事をアピールする
        * もし仕事に繋がったらいいよね。楽しいかも。
        * アウトプットは当記事。
* 目標
    * 週2時間程度、計20時間できればUnityの知識もチョットデキル程度につくだろう。
        * 続かない事もあるだろう。でもまぁ、とりあえずやってみる。
        * 続かなくてもOK。続いたらもっとOK。
        * 週2時間程度、計20時間はこの記事の「20時間の法則」の影響
            * https://note.mu/shu223/n/n234455f6d09e
            * あってるのか。自分にあうのか。とりあえずやってみるチャレンジ。

### Q1.何を作ろう

### A1.とりあえず記事を参考にコイン落としゲーム（コインプッシャー）

Unity 5でコインプッシャーゲームを作ろう（前編） | Think IT（シンクイット）
https://thinkit.co.jp/story/2015/07/22/6223

これを作って、まずはUnityになれてみる。

#### A1-メモ1 エディタのレイアウトは［Default］に変更

https://thinkit.co.jp/story/2015/07/22/6223
> Unityの基本操作を学ぶ（画面の見方、操作方法）
> ゲーム製作を進める前に、Unityの基本的な操作を解説します。まず、エディタ画面の右上にあるボタンが> ［Default］になっているかどうかを確認してください（図4）。ここでUnityのエディタのレイアウトをどのようにするか選ぶことができます。

初期はdefaultになってなかったので変更。
defaultレイアウト見やすい。

### Q2. Unityのバージョンは何をつかう？

### A2. windows7(32bit)ならUnity 5.x, windows10(64bit)ならunity hub

* windows7(32bit)ならUnity 5.xエディター(32-bit)、アーカイブからダウンロード
    *  Unityの32bit版は5.xが最後
    *  https://unity3d.com/jp/get-unity/download/archive
* windows10(64bit)ならunity hubから最新版。日本語化がらくだった。
    * https://unity3d.com/jp/get-unity/download

### Q3. Unity プロジェクトの削除方法

### A3. フォルダごと削除
https://jpn.itlibra.com/article?id=20754
> プロジェクトの保存先フォルダをまとめて削除しましょう。
> Unity起動時にプロジェクトが認識されなくなります。

### Q4. 3D or 2D？

### A4. 3D

Unityはどうも3Dと2Dがあるようだ。
Q.1 のコインプッシャー記事は3Dだったので、3D。
こだわりなし。

### // 行動予定・行動結果

* 行動予定
    * Unity本を探して買う、1冊かなぁ
    * 記事投稿日は、随時更新
    * Unityで作った途中経過をWebで公開する。
* 行動結果
    * 1時間行動した（1時間/20時間）
iPhoneのキーボードの設定。

#iPhoneのキーボードの設定。
キーボードの設定はコロコロ変えるものでもありませんが、クリーンインストールなどで必要になった時にどの設定がどの項目だったか忘れてる事が多いのでメモしました。

- **キーボード**  
キーボードの追加や削除ができます。

---
- **ユーザ辞書**  
辞書をの追加や変更ができます。

---
- **片手用キーボード**  
片手でキー入力したい時にはキーボードを右や左に寄せることができます。

---
- **自動修正**  
誤字を自動修正してくれます。

---
- **スマート句読点**  
「--」が「—」、「''」が「‘’」、「""」が「“”」に変換されるます。
句読点て「、」や「。」なのになぜ**スマート句読点**という名前にしたのか気になります。

---
- **文字プレビュー**  
タップしたキーの上部にプレビューが表示されます。

---
- **音声入力**  
音声入力のオン/オフ
キーボードにマイクのアイコンが表示されます。

---
- **音声入力言語**  
音声入力の言語を設定します。

---
- **フリックのみ**  
かな入力で同じキーを連続してタップすると「あ」>「い」>「う」>「え」>「お」と変化しますが、**フリックのみ**をオンにするとフリック入力しかできなくなります。

---
- **自動大文字入力**  
英語入力で単語の頭だけを大文字で入力できるように自動で⬆️を押した状態になります。

---
- **スペルチェック**  
英単語の後ろに空白か改行を入力すると**スペルチェック**され、おかしな単語に赤線が引かれます。

---
- **Caps Lockの使用**  
通常は⬆️キーをタップしても1文字で解除されますが、ダプルタップするとロックできるので何文字でも大文字入力ができます。

---
- **予測**  
キーボードの上部に予測された単語が表示されます。

---
- **ピリオドの簡易入力**  
単語の終わりに［space］をダブルタップすると「. 」が入力される。
かな入力の［空白］では機能しない。
イラレのフォント名からCSSのfont-weightに何を指定すればいいのか

こんにちは、[stmkza](https://twitter.com/stmkza)です。
イラレとかAdobe XDを見てCSSにするという作業、よくありますよね。
その時に、フォントが↓のような表示になっているのでかなり困りませんか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120731/0a97371e-3326-d3c3-603f-81c1747c053a.png)
正直DBとかってあっても、何を指定すればいいのか分かりませんよね。
目視でfont-weightに何を指定したら同じ見た目になるかチェックしてもいいのですが、正直面倒ですよね？
そこで、対応表を作りました。どうぞご利用ください。

# 対応表
| font-weight | W? | ISO表記 | その他の表記 | その他の表記 | 備考 |
|:--|:--|:--|:--|:--|:--|
| 100 | W1 | UL(Ultra Light) |  |  |  |
| 200 | W2 | EL(Extra Light) | SL(Super Light) |  |  |
| --- | -- | 2B |  |  | モトヤのみ |
| 300 | W3 | L(Light) |  |  |  |
| 400 | W4 | SL(Semi Light) | R(Regular) |  |  |
| 500 | W5 | M(Medium) |  |  |  |
| 600 | W6 | SB(Semi Bold) | DB(Demi Bold) | D(Demi Boldの略) |  |
| 700 | W7 | B(Bold) |  |  |  |
| --- | -- | DE(Demi Extra Bold) |  |  | タイプバンクのみ |
| 800 | W8 | EB(Extra Bold) | E(Extra Boldの略) |  |  |
| --- | -- | H(Heavy) |  |  | モリサワ・タイプバンク |
| --- | -- | EH(Extra Heavy) |  |  | モリサワのみ |
| 900 | W9 | UB(Ultra Bold) | U(Ultra Boldの略) |  |  |
| --- | -- | SU(Super Ultra Bold) |  |  | タイプバンクのみ |

* モトヤの`1`、`2`・・・は`W1`、`W2`・・・にそれぞれ対応します
* タイプバンクのタイポスは目視確認するしかないようです
* font-weightが`---`になってる場合は、たぶんfont-weightなどでは表せないので、デザイナーさんと相談して`---`になっていない太さに変更するか、文字を画像化してください
PHPでWebAPIを叩くモジュール作ってみた

# はじめに
PHPでWebAPIを叩くモジュールをクラスとして作ってみました。
PHPでAPIを叩きたいときは、クラスのソースをコピペ&継承してご利用いただくと良いと思います。

# 環境
PHP 7.2

# モジュール
※ レスポンスbodyのみ取得することを想定しています。

```php:ApiClient.php
<?php
class ApiClient
{
    /**
     * リクエストヘッダ
     */
    protected const HEADERS
        = [
            "Content-Type: application/json",
        ];

    /**
     * リクエストパラメータをクエリに変換
     *
     * @param array $requestParameters
     *
     * @return string
     */
    private static function toQueries($requestParameters = [])
    {
        return '?' . http_build_query($requestParameters);
    }

    /**
     * API通信
     *
     * @param string $url
     * @param string $method
     * @param array  $requestParameters
     * @param array  $requestBody
     *
     * @return array|mixed|object
     */
    protected static function execute(
        string $url,
        string $method,
        array $requestParameters = [],
        array $requestBody = []
    ) {
        if ( ! empty($requestParameters)) {
            $url .= self::toQueries($requestParameters);
        }
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        if ( ! empty($requestBody)) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($requestBody));
        }
        curl_setopt($curl, CURLOPT_HTTPHEADER, static::HEADERS);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, true);

        $response = curl_exec($curl);

        $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $body        = substr($response, $header_size);
        $result      = json_decode($body, true);
        curl_close($curl);

        return $result;
    }
}
```

# サンプル
サンプルとして、GETとPOSTメソッドを使用するパターンをご紹介します。

```php:sample.php
include_once ('./ApiClient.php');

class Sample extends ApiClient {
    /**
     * ヘッダ
     */
    protected const HEADERS
        = [
            "User-Agent: Test API Client",
            "Content-Type: application/json",
        ];

    /**
     * ベースURL
     */
    private const BASE_URL = 'https://test.com';

    /**
     * ユーザー一覧取得 GET
     */
    public function getUsers()
    {
        $url                = self::BASE_URL . '/api/v2/users';
        $request_parameters = ['clientname' => 'test'];
        $result             = parent::execute($url, 'GET', $request_parameters);

        return $result['data']['users'];
    }

    /**
     * ユーザー登録 POST
     */
    public function registerUser ()
    {
        $url                = self::BASE_URL . '/api/v2/users';
        $request_parameters = ['clientname' => 'test'];
        $request_body       = ['name' => 'Taro', 'age' => 22];
        $result             = parent::execute($url, 'POST', $request_parameters, $request_body);

        return $result['data']['user'];
    }
}
```
osmdroid を使ってAndroid の OpenStreetMap 地図の場所をブックマークする

[osmdroid を使って OpenStreetMap を Android に表示する](https://qiita.com/ohwada/items/c3741fb14a5142035314)
の続きです

場所を選ぶ方法は２つある。

###  方法1 地図の長押し

```
MapEventsOverlay events = new MapEventsOverlay(new MapEventsReceiver() {
    @Override
    public boolean longPressHelper(GeoPoint p) {
        // タイトルと説明を入力するダイアログを表示する
                showDialog(p);
                return true;
    }
});
mMapView.getOverlayManager().add(events);
```

### 方法2 Location Manager

GPS や WiFi から現在地を知らせてくれる便利なもの

https://developer.android.com/reference/android/location/LocationManager

```
public void onResume() {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0l, 0f, this);

public void onPause() {
            mLocationManager.removeUpdates(this);

public void onLocationChanged(Location location) {
        // 場所を記憶する
        mCurrentLocation = location;
```
### ブックマークする

ブックマークは、SQLie を使用する。
タイトルと説明を入力するダイアログを表示する

```
  // SQLiete に追加する
    BookmarkRecord r = new BookmarkRecord( title, description, latD, lonD  );
    long id = mHelper.insert(r);
```

###　CSV ファイルのインポートとエクスポート

OpenCSV と FilePicker を使用する

- http://opencsv.sourceforge.net/
- https://github.com/Angads25/android-filepicker

### スクリーンショット

地図とマーカー
![9_markers.png](https://qiita-image-store.s3.amazonaws.com/0/64075/373f4f5a-ddf8-52dc-6c85-4a652bebf215.png)

タイトルと説明を入力するダイアログ
![9_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/64075/1d78a265-d04e-30f3-8303-94a2dfe38b5b.png)

github にサンプルコードを公開した

https://github.com/ohwada/Android_Samples/tree/master/Osmdroid9
Dockerfileの書き方 ~Multi Stage Build~

# Dockerfileとは
**Dockerイメージの中身**を定義する設定ファイルになります．
Vagrantを利用した方がある方は，Vagrantfileを思い出して頂くとイメージしやすいかも知れません．
# 題材
https://github.com/tozastation/gRPC-Training-Golang
を使って説明していきます．APIサーバのイメージ作りです．
## Dockerfileに記載する流れ
1. ベースとなるイメージの指定
2. プログラムを動作するのに必要なパッケージの導入
3. ポート開放
4. プログラム起動コマンド

## Dockerfile(Multi Stage Build)
以下Dockerfileの例になります．
`FROM`が2箇所あると思います．
イメージを２個取得していることになりますが，これには理由があります．
`golang:latest`というイメージの中にはGoの実行環境が入ってる訳だが，これが**772MB**というサイズを要する．今後，コンテナをポコポコ立てて行くとなると，なるべく起動を軽量化したいとなると思います．
そこで，**Multi Stage Build**です．

```dockerfile
# Build Container
FROM golang:latest as builder
WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
COPY . .
# Set Environment Variable
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
# Build
RUN go build -o app main.go

# Runtime Container
FROM alpine
RUN apk add --no-cache ca-certificates
COPY --from=builder /go/src/github.com/tozastation/gRPC-Training-Golang/app /app
ENV CONNECTION_STRING=Data Source=127.0.0.1:1433;Initial Catalog=Weather;User ID=SA;Password=Test@1234
ENV VENDER=mssql
ENV OPENWEATHER_URL=http://api.openweathermap.org/data/2.5/weather
ENV OPENWEATHER_CREDENTIAL=&APPID=1e16e8941ce99bdd844d129d5179d98a
EXPOSE 3001
ENTRYPOINT ["/app"]
```

### Multi Stage Build
これは，ビルド環境から成果物を生成し，実行に必要な成果物のみを超軽量のベースイメージに移すことで，
Dockerイメージの容量を最小限にすることができます．
先ほどの`golang:latest`は**772MB**でしたが，今回作成したイメージは**21.2MB**になります．圧倒的ですね．

### Go言語との相性
Goのコンパイルは，**シングルバイナリ**になります．
排出される1ファイルのみを運べば，実行可能な環境が整います．
Runtime用の特殊なパッケージを用意する必要もなく，`alpine`という軽量なLinuxイメージのみで動きます．
Dockerとの相性もバッチリ

### 書き方(やっと)
基本的なDockerfileの構文は，以下のキーワードのみです．
Linux環境をShellコマンドで整えたことがある方はすんなりいけるかもしれません．
使いそうな順に書いています．大体これで作れるので，他にも知りたい方は[公式サイト](https://docs.docker.com/engine/reference/builder/)を参照ください！

```docker
FROM ベースイメージの取得
# FROM golang:latest 
WORKDIR 作業ディレクトリの指定(存在しない場合は自動で作ります．)
# WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
ADD ローカルファイルをDockerイメージ内にコピーする(圧縮ファイルが自動解凍される)
# ADD: . .
COPY 同上(圧縮ファイルが自動解凍されない)
# COPY: . .
RUN Shellコマンドの実行
# RUN apt-get install -y vim
ENV 環境変数を定義
# ENV PORT=3306
EXPOSE 開放するポート番号
# EXPOSE 3306
ENTRYPOINT 実行するコマンドを指定
# ENTRYPOINT ["/app"]
```
※ Multi Stage Buildで必要な項目は，FROMをビルド用と実行用で２つ用いる事，実行用イメージに成果物を`COPY`で移すことくらいと手軽にできますので説明は割愛します．
Vue.js on Docker

- vue-cliを利用した環境構築。
- 今回は設定把握のためManually selectを選択。
- Router、Vuex、Unit Testingは利用したいが後ほど。

```:Dockerfile
FROM node:8.15.0-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm && \
    npm install -g @vue/cli

RUN apk add git vim tig less

CMD ["/bin/sh"]

```

```:docker-compose.yml
version: '3'
services:
  front:
    build: .
    ports:
      - 1234:8080
    volumes:
      - .:/app
    stdin_open: true
    tty: true
```
```
# コンテナを起動
docker-compose up -d
```
```
# コンテナにログイン
docker exec -it コンテナID sh
```

```
/app # vue create front
# デフォルトのyarnのレジストリは遅いので、タオバオ社が提供しているnpmレジストリを使用する(大文字Yでenter)
?  Your connection to the default yarn registry seems to be slow.
   Use https://registry.npm.taobao.org for faster installation? (Y/n)
```

```
Vue CLI v3.4.1
# パッケージをデフォルト設定（babel/ESlint）か手動設定かを、上下キーで合わせenter
? Please pick a preset: (Use arrow keys)
  default (babel, eslint)
❯ Manually select features
```

```
#「1」〜「9」キーでチェックのON/OFF
# 「a」キーで全選択・全解除、「i」キーでチェックのON/OFFの反転
# 選択してenter
? Please pick a preset: Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◯ Router
 ◯ Vuex
 ◯ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
```

```
# 構文チェックをどのタイプにするかを上下キーで合わせenter
? Pick a linter / formatter config:
❯ ESLint with error prevention only
  ESLint + Airbnb config
  ESLint + Standard config
  ESLint + Prettier
```

```
# 構文チェックをテキスト保存時とコミット時どのタイミングで保存するか。
? Pick a linter / formatter config: Airbnb
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◉ Lint on save
 ◯ Lint and fix on commit
```

```
# モジュールを管理するための定義をどこでするか。
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? (Use arrow keys)
  In dedicated config files
❯ In package.json
```
```
# 設定内容を保存しておくかをyを押してenter
? Save this as a preset for future projects? (y/N) y
```
```
# どこに保存しておくか。保存先パスを指定してenter
? Save preset as: ./setting
```
```
# インストール時に使用するパッケージマネージャに何を使うかを上下キーで合わせenter
? Pick the package manager to use when installing dependencies: (Use arrow keys)
❯ Use Yarn 
  Use NPM
```

```
# 作成されたプロジェクトのディレクトリに移動し。サーバーを起動
cd front
yarn serve
```

```
# ブラウザからローカルホストで指定したIPからアクセス
http://localhost:1234
```
MariaDBについて

おはようございます、こんにちわ、こんばんわ

初歩的なことですが学んだこと連携します、少しでも役に立てれば＾＾
#MariaDBとは

データベースです。データを記憶する為の器として使用します。
MariaDBはリレーショナルデータベースの一つです、
リレーショナルデータベースは今までのデータベースとは異なり
データを一番簡単な２次元の表で持っているので
それを扱う言語のSQLも文法が簡単で命令数も少なく、システム作りの生産性が劇的に改善された優れ物です。

#インフラエンジニア観点でのDBサーバー

データベースの構築、管理の観点からインフラまわりをどう見るか？です
インフラの関係上制約がかかることもあれば
データベースの物理設計する上でインフラを無視できません。
データベースの性能の確保のためにインフラのボトルネック箇所の調査・診断と打てる手を探る必要もあるでしょう。


以上です。
閲覧ありがとうございました
rails s 時のデフォルトのポート番号を変更する

#はじめに
複数のrailsアプリを立ち上げる時はポート番号が被らないように`rails s -p 4000`のようにサーバーを立てた時にポート番号を指定するが、このアプリはデフォルトで3500番で起動したいなぁって時にどうやるのかを書いてみます。

#環境
rails: 5.2.2

#手順
railsアプリ内の`config/puma.rb`の12行目を変更する。

```ruby:config/puma.rb
# Puma can serve each request in a thread from an internal thread pool.
# The `threads` method setting takes two numbers: a minimum and maximum.
# Any libraries that use thread pools should be configured to match
# the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum; this matches the default thread size of Active Record.
#
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
#
port        ENV.fetch("PORT") { 3000 } #ここに好きなポート番号を指定する

# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch("RAILS_ENV") { "development" }

# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked webserver processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
#
# workers ENV.fetch("WEB_CONCURRENCY") { 2 }

# Use the `preload_app!` method when specifying a `workers` number.
# This directive tells Puma to first boot the application and load code
# before forking the application. This takes advantage of Copy On Write
# process behavior so workers use less memory.
#
# preload_app!

# Allow puma to be restarted by `rails restart` command.
plugin :tmp_restart

```

ここで3500と指定すると`rails s`だけでもポート番号:3500で起動してくれる。
超謎なエラーだったけど、実はAPIのresponseのdataの取り方が悪かった話

# はじめに
結論から言うと、ただのAPIの取り方が悪かっただけでした。
初心者あるあるかなと思い共有したかったです。

# バージョン
ngRx 7.3.0
Angular7
Ionic 4.10.3
# 経緯
Ionic + NgRx + Angularで何かアプリを作ろうと思って、
外部でAPIを作成して、

* AngularのService
* AngularのComponent
* NgrxのEffect
* NgrxのReducer
* NgrxのAction
* NgrxのSelector
* Model(Interface)

まで用意して、いざ、 ` ionic serve ` をした時のことでした。

# エラーが治らんとよ！

## Google Chromeの検証のConsoleで表示されていた内容
```typescript
ERROR TypeError: Cannot read property 'id' of undefined
    at selectId (entity.js:455)
    at selectIdValue (entity.js:104)
    at addOneMutably (entity.js:123)
    at addManyMutably (entity.js:137)
    at addAllMutably (entity.js:152)
    at Object.operation [as addAll] (entity.js:92)
    at reducer (project.reducer.ts:19)
    at combination (store.js:115)
    at store.js:152
    at ScanSubscriber.reduceState [as accumulator] (store.js:409)
```


## reducerの一部

```typescript
switch (action.type) {
    case ProjectActionTypes.LOAD_PROJECTS_SUCCESS: {
      return adapter.addAll(action.payload.projects, state);
    }
```

## ` action.payload.projects ` のinterface

```typescript
export interface Project {
  id: string;
  title: string;
  body: string;
}
```

## 起こっていること
actionから流れてきたdataを、引数にして、reducerでaddAllすると上記のerrorが出ること。

### そもそもeffectsからreducerにdataを送れてないのでは
いえ、送れてるんです。


console.logを確認すると、

```typescript
case ProjectActionTypes.LOAD_PROJECTS_SUCCESS: {
      console.log(action.payload.projects);
      return adapter.addAll(action.payload.projects, state);
    }
```

中身

```
projects: Array(2)
0: {id: "xxx" , title: "XXXXXXXXX", body: "XXXXXXX", area: Array(1), …}
1: {id: "xxx" , title: "XXXXXXXXX", body: "XXXXXXX"
```

### Google Chromeのtranspileされたjsを調べてみると、、、


#### entity.js

```javascript
var __values = (undefined && undefined.__values) || function (o) {
    var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
    if (m) return m.call(o);
    return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
};
```

どうも、実引数oにはdataが入っているが,
 ` o[Symbol.iterator] ` で []が返ってきてないっぽい。

てことは配列とかネスト周りが原因だなと気づく。

### service周りを調べてみる

#### Service

```typescript
public getProjects(): Observable<Project[]> {
    const url = 'XXXXXX';
    return this.http.get<Project[]>(url).pipe(
      map(projects => {
        console.log(projects);
        return projects;
      })
    );
  }
```

#### logの中身

```
{projects: Array(2)} projects: (2) [{…}, {…}]__proto__: Object
```

### 結果
参照するネストが一個浅かっただけでした。

```typescript
public getProjects(): Observable<Project[]> {
    const url = 'XXXXXXX';
    return this.http.get<Project[]>(url).pipe(
      map(projects => {
        return projects['projects'];
      })
    );
  }
```
graphene-django-jwtを使ったsnapshot test

使用技術
[graphene-django](https://github.com/graphql-python/graphene-django)
[graphene-django-extras](https://github.com/eamigo86/graphene-django-extras)
[graphene-django-jwt](https://github.com/flavors/django-graphql-jwt)

Djangoでの認証を作る際に今まではfirebaseを使っていた為、自前でmiddlewareを書いて都度tokenを確認に行く様にしていた。
これに対してテストを書くときはDummyMiddlewareとしてtestuserに対してuidをうまく返していた。

今回djangoで完結できる機能要件のものに対応する為にgraphene-django-jwtを採用した。
かなり良くできていて、middlewareの設定とdecoratorでほぼ実装は終わる。


```python:mutation/create_foo_user.py
class CreateFooUser(graphene.Mutation):
    foo_user = graphene.Field(FooUserType)

    class Arguments:
        email = graphene.String(required=True)
        password = graphene.String(required=True)
        foo_id = graphene.String(required=True)

    @superuser_required
    def mutate(self, info, **kwargs):
        user = FooUser.objects.create_user(**kwargs)
        return CreateFooUser(foo_user=user)

```


また、これをtestする時にgraphene-django-jwtはJSONWebTokenTestCaseを作成しており、middlewareの差し替え、またはdecorator剥がしなどせずに綺麗に書ける。

またgraphene-djangoでのtestは基本的にsnapshot testで行う為JSONWebTokenTestCaseとsnapshottest.TestCaseの両方を使う。

結構綺麗に書けてgraphene-django-jwtいいなと思った。

```python:tests/basic_mutation_test.py
from snapshottest import TestCase
from graphql_jwt.testcases import JSONWebTokenTestCase


class FooBasicMutationTestCase(JSONWebTokenTestCase, TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create(
            email='test@admin.com',
            password='testadminpass',
            is_active=True,
            is_superuser=True,
        )
        self.client.authenticate(self.user)

    def test_create_foo_user(self):
        foo = FooFactory()
        query = '''
        mutation FooUser($foo_id: String!) {
          createFooUser(email: "test@test.com", password: "password", fooId: $foo_id){
            FooUser {
              user {
                email
              }
            }
          }
        }
        '''
        variables = {
            'foo_id': foo.id,
        }
        self.assertMatchSnapshot(self.client.execute(query, variables).to_dict())

```

```python:snap_test_basic_mutation.py
snapshots['FooBasicMutationTestCase::test_create_foo_user 1'] = {
    'data': {
        'createFooUser': {
            'FooUser': {
                'user': {
                    'email': 'test@test.com'
                }
            }
        }
    }
}
```
【Xcode】Assistant Editorの行折り返し設定を解除する方法

メニュー
Xcode 
　→ Preferences 
　　→ Text Editing 
　　　→ Indentation 
　　　　→ Line wrapping のチェックを外す。

<img width="790" alt="スクリーンショット 2019-03-09 9.56.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/c24524d8-ab18-eb41-bd03-08412ac0e329.png">

お疲れ様でした。
Vueコンポーネント再描画の方法

# 再描画が必要なケース
- データが更新されても、バインドしているコンポーネントのサイズが最適化されない
- 画面レイアウトの動的変更に最適化されない

# 具体例
- データを更新して文字列が長くなったが、Textareaのサイズが変わらず、文字切れが発生する
- 隣り合うコンポーネントの動的表示／非表示により、もう一方のコンポーネントの幅が伸縮されたが高さが変わらないため、文字切れまたは余分な空白が発生する。

# 対応方法
- コンポーネントのkey属性を変更する

```Sample.vue
<template>
 <v-textarea
   :value="Value"
   :key="RenderKey"
 >
 </v-textarea>
</template>

<script lang="ts">
import Vue from 'vue';
import { Getter } from 'vuex-class';
const namespace: string = 'sample';

export default class Sample extends Vue {
  @Getter('Value', {namespace}) public Value!: string;
  @Getter('RenderKey', {namespace}) public RenderKey!: number;
}
</script>
```

```types.ts
export interface SampleState {
    Value: string;
    RenderKey: number;
}
```

```index.ts
import { Module } from 'vuex';
import { actions } from './actions';
import { mutations } from './mutations';
import { getters } from './getters';
import { SampleState } from './types';
import { RootState } from '@/store/types';

const namespaced: boolean = true;

export const state: SampleState = {
    RenderKey: Math.random(),
    Value: '',
};

export const sample: Module<SampleState, RootState> = {
    namespaced,
    state,
    actions,
    mutations,
    getters,
};
```

```getters.ts
import { GetterTree } from 'vuex';
import { SampleState } from './types';
import { RootState } from '@/store/types';

export const getters: GetterTree<SampleState, RootState> = {
    Value(state: SampleState): string {
        return state.Value;
    },
    RenderKey(state: SampleState): number {
        return state.RenderKey;
    },
};
```

```actions.ts
import { ActionTree } from 'vuex';
import { SampleState } from './types';
import { RootState } from '@/store/types';
import axios from 'axios';

export const actions: ActionTree<SampleState, RootState> = {
    SetTextValue({commit}, payload: string) {
        axios({
            method: 'POST',
            url: "https://xxx",
            data: payload,
        })
        .then((res) => {
            commit('SetTextValue', res.data.value);
            commit('ReRenderTextArea');
        }).catch((err) => {
        
        }).finally(() => {
        
        });
    },
};

```

```mutations.ts
import { MutationTree } from 'vuex';
import { SampleState } from './types';

export const mutations: MutationTree<SampleState> = {
    SetTextValue(state, payload: string) {
        state.Value = payload;
    },
    ReRenderTextArea(state) {
        state.RenderKey = Math.random(); //または何らかの一意の値
    },
};
```

# 参考
- [The correct way to force Vue to re-render a component](http://michaelnthiessen.com/force-re-render/)

# 感想
- key属性は重要
メールの署名テンプレート

## はじめに
SNSやSlackで連絡することが増えましたが、
まだまだメールでのやりとりもあるかと思います。

メールでは文末に署名を入れることがありますが、
さり気なく技術者アピールできる署名はいかがでしょうか。


### よくある署名
```
双葉商事株式会社
営業2課 係長
野原ひろし
103-0027 東京都中央区日本橋猫町12-1
E-mail: hiroshi@xxx.co.jp
Tel: 03-1234-5678 Fax: 03-2234-5678
携帯: 090-3234-5678
```

### javascriptな署名
``` js
/**
 * @company 双葉商事株式会社
 * @title 営業2課 係長
 * @author 野原ひろし
 * @address 103-0027 東京都中央区日本橋猫町12-1
 * @email hiroshi@xxx.co.jp
 * @tel 03-1234-5678
 * @fax 03-2234-5678
 * @mobile 090-3234-5678
 */
 ```

### C#な署名
``` xml
<signature>
    <company>双葉商事株式会社</company>
    <title>営業2課 係長</title>
    <author>野原ひろし</author>
    <address>103-0027 東京都中央区日本橋猫町12-1</address>
    <email>hiroshi@xxx.co.jp</email>
    <tel>03-1234-5678</tel>
    <fax>03-2234-5678</fax>
    <mobile>090-3234-5678</mobile>
</signature>
```

### Pythonな署名
``` py

"""
company: 双葉商事株式会社
title: 営業2課 係長
author: 野原ひろし
address: 103-0027 東京都中央区日本橋猫町12-1
email: hiroshi@xxx.co.jp
tel: 03-1234-5678
fax: 03-2234-5678
mobile: 090-3234-5678
"""
```

あまり凝った署名にすると
一般の人には何が書いているのか分からなくなってしまいますね。
私はJsDoc形式のものを使っています。
みなさんおすすめのテンプレートがあったら教えてください。
Polybar設定に関して便利だと思った知識をまとめる

## 最小フィールド幅指定
記法：%フィールド名:フィールド幅%

| 幅指定 | 表示結果(_は空白) |
| ------ | -------- |
| %upspeed%   | 4 KB/s |
| %upspeed:6% | 4 KB/s |
| %upspeed:7% | _4 KB/s |
| %upspeed:8% | __4 KB/s |
| ... | ... |
| %upspeed:15% | _________4 KB/s |


## まとめ
適宜追加していきます。
zshの数値範囲指定の正規表現を使った

#はじめに
シェルスクリプトのCase文で数値の範囲指定が使えないか検索してみたら，Zshの拡張正規表現ではそれが可能ということがわかったので，いろいろ試してみた．
#環境
Zsh 5.6.2
#使い方
###文法
```
<x-y>
```
これでx以上y以下の数値を指定できる．Zshのマニュアルによれば，xとyはそれぞれ省略可能，故に``<->``はあらゆる数にマッチする．
###使用例
```zsh
#!/bin/zsh

foo=5

case "$foo" in
    <0-10> ) echo "aaa" ;;
    <11-20> ) echo "bbb" ;;
    <-> ) echo "ccc" ;;
esac
#=>aaa

temperature=40

case "$temperature" in
    <38-> ) echo "flu" ;;    # 38以上
    <-> ) echo "normal" ;;
esac
#=>flu

age=18

case "$age" in
    <-18> ) echo "child" ;;    #18以下
    <-> ) echo "adult" ;;
esac
#=>child
```
ちなみに負の数には対応していない模様．

```zsh
#!/bin/zsh

water_temp=-30

case "$water_temp" in
    <-0> ) echo "solid" ;;
    <1-99> ) echo "liquid" ;;
    <100-> ) echo "gas" ;;
esac
#=>(何も表示されない)
```
負の数を判別したいなら，次の方法で行うという手がある．

```zsh
#!/bin/zsh

negative_number=-30

case "$negative_number" in
    -<1-> ) echo "negative." ;;
    0 ) echo "zero." ;;
    <1-> ) echo "positive." ;;
esac
#=>negative.
```

また，正規表現であるゆえ，使用場面はCase文に限らない([1])．
#参考元
[1]zsh で「<>」を使って数値による範囲指定を行う - ablog
https://yohei-a.hatenablog.jp/entry/20090824/1251099682
[2]shell - case + how to implement equal or less or greater in case syntax - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/65310/case-how-to-implement-equal-or-less-or-greater-in-case-syntax
【超危険な】JavaScriptの組み込みオブジェクトのプロトタイプを書き換える【小ネタ】

```js:dangerous.js
const str="hello dengerous world";
console.log(str.slice(6, 15));

String.prototype.slice=function(){ return "hello world"; }

console.log(str.slice(6, 15));
```
実行結果

```
dengerous
hello world
```
JavaScriptの仕様から言って当然の結果
今回は`String.prototype.slice`を使ったがなんでもできるはず
これができるということは好き放題されるということ信頼できないJSは実行しない。信頼できないライブラリは使わないが重要
あと気軽に`prototype`を触るのも危険
ディジタル署名

#ディジタル署名
[一方向ハッシュ関数](URL)では、「改ざん」検知が
[メッセージ認証コード](URL)では「改ざん」と「なりすまし」の検知が可能でした。
ディジタル署名では「改ざん」と「なりすまし(完全な防止ではない)」、「否認防止」の検知が可能になります。

#ディジタル署名の流れ
(1)送信者(署名をしたい人)は公開鍵と秘密鍵のペアを作成する。
(2)送信したいメッセージをハッシュ化し秘密鍵で暗号化し、メッセージと暗号化したハッシュ値受信者へ送信する。
(3)受信者はハッシュ値を複合し、メッセージをハッシュ化する。ハッシュ値が一致していれば検証成功。

#なぜハッシュ化するのか
公開鍵暗号方式は暗号化にかなり時間がかかります。
そのため、長いメッセージを暗号化するより一定の値になるハッシュ値の方が暗号化するうえで効率が良いのです。
(ハッシュ化せずにメッセージを複製し暗号化することもあります)

#何故なりすまし対策になるのか
秘密鍵は本人のみしか持っていないという前提があるためです。
そのため公開鍵暗号ではなく秘密鍵で暗号化しています**。
このなりすまし対策は2人しか鍵を持っていないという前提のあるメッセージ認証コード(MAC)でもいえることです。
しかし、ディジタル署名の場合公開鍵は公然と知られているためman-in-the-middle攻撃の対象にはなります。

#ディジタル署名に対する攻撃
**man-in-the-middle攻撃(MITB)**
前述しましたが、MITBを完全に防ぐことは難しいです。
流れを解説します。
(1)送信者は公開鍵と秘密鍵のペアを作成し、メッセージと署名した暗号文を受信者へ送信する。
(2)攻撃者はこの攻撃を盗聴します。受信者より先に送信者のメッセージを受信しメッセージの検証を行います。
　　公開鍵は公然と知られている鍵であるため、攻撃者でも複合は可能です。
(3)攻撃者は新たなメッセージを作成or改ざんし、攻撃者用の鍵ペアを作成しメッセージの署名を作成し、受信者に送信します。
(4)受信者は送信者から「送信されてきたものだ」と認識し、攻撃者の公開鍵を使用しメッセージを検証します。

これが一連の流れです。
攻撃者は送信者には受信者に見えるように、受信者には送信者に見えるようになりすましています。
送信者の公開鍵を利用すればいいじゃん！と思うかもしれませんが、それが本当に送信者の公開鍵かは送信者本人にしかわかりませんよね。
これが、ディジタル署名の完全ななりすまし対策にならない理由です。

#ディジタル署名でできないこと
前述しましたが、なりすまし対策が完全ではないことです。
解説サイトによってはなりすまし対策が可能と記述されているところもありますが、それは完全ではないという所を認識しておきたいです。
**なりすましの対策ができないと否認防止も、改ざん検知も成り立ちません。**
これの対策は公開鍵を第3者によって認証を行うディジタル証明書です。
arduinoでマルチタスク

#概要

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

#写真

![mos.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/708bed7a-23a0-72b2-c72d-e676dffc8bde.jpeg)


#使用したライブラリー
https://github.com/ohisama/Arduino-MOS

#サンプルコード

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

```
#include "MOS.h"

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


```


以上。
Python virtualenvのインストールとプロファイルの読み込み

# 環境
Windows10 64bit
で試しています。

# インストール
## Python
執筆時点で最新のPython3を適当にPATH通してインストールする。

## virtualenv
 `pip install virtualenv`

# 環境構築
## virtualenv
### プロファイルの作成

```text
cd <virtualenvのプロファイルを管理しているディレクトリ>
virtualenv <仮想環境名>
```

```text:例)
cd D:\python\env
virtualenv leading_innovation
```

### プロファイルの読み込み

```text:例
<カレントパスから、virtualenvのプロファイルディレクトリへのPATH>\Scripts\activate
cd D:\python\projects\inspire_the_next
../../env/leading_innovation/Scripts/activate
```

### バージョンの切り替え

まず、入れ替える対象のバージョンのpythonをインストールします。
インストールパスが必要になるので確認できるようにしておくこと。

pythonをインストールしたら、以下のコマンドで対象のバージョンを有効化したプロファイルを作成します。
**プロファイルを読み込み済みの場合はdeactivateしてください**

```text:バージョン切り替えコマンド
cd <virtualenvのプロファイルを管理しているディレクトリ>
virtualenv <仮想環境名> --python=<対象バージョンのpython.exeへのフルパス>
```

私の環境では以下でした。

```text:例
virtualenv <仮想環境名> --python=C:\Users\<username>\AppData\Local\Programs\Python\Python36\python.exe
```

あとは、前述のプロファイル読み込み手順で対象のプロファイルをactivateすればOKです。
activate後、pythonコマンドでバージョンを確認しましょう。

```text:バージョン確認
(profile) > python
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(profile) >
```
Mac でウィンドウをDockにしまう / 元に戻すショートカット



# しまう

`Command + M`

黄色ボタンを押したのと同じ動作

最初化だと思っていたけど「しまう」と呼ぶらしい

# すべてしまう

Command + Option + H + M

# もとに戻す

嘘だろ、なんだよこの操作。でも出来た。

>「Command + Tabでアプリを選択した後、Optionキーを押してCommandキーを離す」

[【Tips】Macのタスク切り替えで、最小化されたウィンドウを表示する方法 | ソフトアンテナブログ](https://www.softantenna.com/wp/mac/osx-activate-invisible-window/)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/705








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UniRxでボタンの長押しを検知

## 概要
何番煎じだ？　って感じなのですが、ネットのサンプルがなんかいまいちほしいやつじゃないので書きます。

- ボタンを押している間のOnNextの間隔を指定したい
- ボタンを離した瞬間を取得したい
- Observableを一時変数にとっておいたりしないで一発でさくっと書きたい


## コード

### 間隔：Update

```c#
_button.OnPointerDownAsObservable()
    .SelectMany(_ => _button.UpdateAsObservable())
    .TakeUntil(_button.OnPointerUpAsObservable())
    .DoOnCompleted(() =>
    {
        Debug.Log("released!");
    })
    .RepeatUntilDestroy(_button)
    .Subscribe(unit =>
    {
        Debug.Log("pressing...");
    });
```

###  間隔：1秒
```c#
_button.OnPointerDownAsObservable()
    .SelectMany(_ => Observable.Interval(TimeSpan.FromSeconds(1)))
    .TakeUntil(_button.OnPointerUpAsObservable())
    .DoOnCompleted(() =>
    {
        Debug.Log("released!");
    })
    .RepeatUntilDestroy(_button)
    .Subscribe(time =>
    {
        Debug.Log("pressing..." + time);
    });

```

### おまけ：ポインターの出入りを検知

```c#
_button.OnPointerEnterAsObservable()
    .SelectMany(_ => Observable.Interval(TimeSpan.FromSeconds(1)))
    .TakeUntil(_button.OnPointerExitAsObservable())
    .DoOnCompleted(() =>
    {
        Debug.Log("out");
    })
    .RepeatUntilDestroy(_button)
    .Subscribe(time =>
    {
        Debug.Log("in");
    });
```


## まとめ
`SelectMany`の引数に与えるオペレータを変えれば間隔は如何様にもできます。
`Button`が`Destroy`されたときにも`DoOnCompleted`が来ちゃうので、それが困る場合は`DoOnCompleted`を追加しないで`OnPointerUpAsObservable`を別に追加してください。


## 参考
[【Unity】【UniRx】TakeXxx系のオペレータまとめ](http://light11.hatenadiary.com/entry/2018/11/12/223634)
[【Unity】【UniRx】Repeat系のオペレータまとめ](http://light11.hatenadiary.com/entry/2018/12/14/231013)
FLOCSSで迷うcomponentとprojectの違いをオブジェクト指向にあてはめて考えるとスッキリする

# どゆこと？
簡単に言えばcomponentがクラスでprojectがインスタンスです。

componentはそれ自体が色情報や幅情報などは__もたず__、どんなものであるか__しか__定義しません。

一方で、projectは色情報や幅情報を__もつ__し、どんなものであるか__も__定義することがあります。

__で、なにがスッキリするって？__

# オブジェクト指向に当てはめて考える
例えばc-buttonみたいなcomponentを定義したとしたら、projectと併用される場合、

```html
<span class="c-button p-ArticleForm__button">記事投稿</span>


<span class="c-button p-CommentForm__button">コメント送信</span>
```
みたいに記事の投稿ボタン、コメントの送信ボタンのclassを書くときに使うと思います。

これをオブジェクトっぽく扱うと、
Buttonクラス(※componentに相当)があったとして、

```rb
Button.new(name: 'article', width: '100px', backgroud-color: 'black') 
※projectに相当

Button.new(name: 'comment', width: '50px', backgroud-color: 'blue')
※projectに相当
```

みたいな感じです。

これをCSSで書くとこんな感じになる。

```scss
.c-button{
  display: block;
  border-radius: 10px;
}

.p-ArticleForm__button{
  width: 100px;
  background-color: black;
}

.p-CommentForm__button{
  width: 50px;
  background-color: blue;
}
```

以上、オブジェクト指向にあてはめるとcomponentとprojectの違いがスッキリするよって話でした。

# 余談
初めはprojectだけを使うと割り切るくらいのほうがとっつきはよくなります。
そんでそのときに心がけといたほうがいいのは命名の仕方で、

```html
<span class="c-button p-ArticleForm__button">記事投稿</span>
```

みたく、` p-Block__element`のelement部分がcomponentの名前にそのままできるようにしておくと、リファクタリング時にcomponentとして切り出すときに楽です。

ていうか切り出しが楽ってよりも` element `の命名に迷わなくなりますね。

Blockの命名についてはこちらが非常に役に立ちました。感謝。
https://necomesi.jp/blog/tsmd/posts/152

あと、FLOCSSの創始者が書いた電子書籍あるんでこれ絶対読んだほうがいい。
https://booth.pm/ja/items/1033385

# 以上です！
jsでオブジェクトから特定のキーを検索


# 前提
忘れないためのメモです。
以下のようなオブジェクトがあるとします。

```javascript
const events = {
  '2019-03-09':
  [
    {
      id: 1,
      title: 'お出かけ',
      detaile: 'イオンでお買い物',
    },
    {
      id: 2,
      title: '勉強',
      detaile: 'javascriptの勉強',
    },
  ]
  '2019-03-10':
  [
    {
      id: 3,
      title: 'お留守番',
      detaile: '自宅警備員',
    },
  ]
  // ...予定色々
}
```
このオブジェクトから2019年03月9日の予定を検索して抜き出します。


## ループでやってた

オブジェクトのキーのみを抜き出して、ループさせます。

```javascript
  const eventDates = Object.kyes(events);

  for(let i = 0; i < eventDates.lenght; i++){
    if(eventDates[i] === '2019-03-09'){
      const event = events[eventDates[i]];
    }
  }
```
可読性も悪く良いコードとは言い難いですね。

## forは使わなくても良い

```javascript

  if(!!events['2019-03-09']){
    const event = events['2019-03-09'];
  }
```
~~これでいけるらしいです。。。~~

上記の場合キーが存在していたとしても、値が空文字や０の場合false判定されてしまいます。

### in演算子を使う
in演算子を使用すればキーの存在有無を確かめることができます。

```javascript

if ('2019-03-09' in events){
  const event = events['2019-03-09'];
}
```
falseの場合はundefindが返ります。

```javascript

if ('2019-03-33' in events){
  const event = events['2019-03-33'];
} else {
  console.log("存在しない");
  // undefind
}
```