OmniAICreator/Qiita-1.07M huggingface dataset:
SpringのバリデーションはFormとBindingResultの順番が大事だった件

# はじめに
はじめまして、NekoSarada1101です。
Qiita初投稿です。
専門学校でJavaやサーブレットなどの勉強をしています。
現在、独学でSpringフレームワークの勉強をしているのですが、その中で解決に時間がかかってしまったエラーについての記事を投稿しようと思います。

# 本題
Springの勉強のために開発しているWebアプリのログイン画面の入力に対してバリデーションを行うために以下のようなコントローラーを定義しました。

```java
@PostMapping("/auth")
public String postLogin(@ModelAttribute @Validated LoginForm form, Model model, BindingResult result) {
    if (result.hasErrors()) {
        return "login";
    }
    User user = userService.login(form.getId(), form.getPassword());
    model.addAttribute("user", user);

    return "redirect:/menu";
}
```
入力に問題が無ければ次の画面へ、あればログイン画面へ戻ります。
このコントローラーに対してリクエストを送信すると...

```
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Apr 28 14:36:33 JST 2020
There was an unexpected error (type=Bad Request, status=400).
```
上記のエラーが画面に表示されました。

# 原因と解決策
原因はコントローラーの引数の順番でした。
BindingResultはバリデーリョン対象のFormオブジェクトの直後に定義しなければならないようです。

```java
@PostMapping("/auth")
public String postLogin(@ModelAttribute @Validated LoginForm form, BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "login";
    }
    User user = userService.login(form.getId(), form.getPassword());
    model.addAttribute("user", user);

    return "redirect:/menu";
}
```
このように`hoge(Form, BindingResult, Model)`の順番にしなければいけません。

# 終わりに
コンソールにエラーログもでず、引数の順番が原因のエラーが発生したのは初めて。何が問題なのかさっぱり分からず、かなり解決までに時間がかかってしまいました。

それと、冒頭にも書いた通り初投稿でこういったアウトプットにも慣れていないので、何か間違っているところやアドバイスなどがありましたら、優しく教えていただけたら嬉しいです。
[メモ] Go言語でうるう年を判定する

へえと思ったのでメモ。
以下の記事を参考にした。

[Golang : How to determine if a year is leap year?](https://www.socketloop.com/tutorials/golang-how-to-determine-if-a-year-is-leap-year)

うるう年を判定するロジックを愚直に実装している記事は見かけるが、  [Time.YearDay](https://golang.org/pkg/time/#Time.YearDay) を使えば年間の日数が返ってくるため、うるう年かどうかが判定可能という事だった。
こちらの方が標準パッケージのロジックを再利用できてよさそう。

```go
year := time.Date(y, time.December, 31, 0, 0, 0, 0, time.Local)
days := year.YearDay()

if days > 365 {
        return true
} else {
        return false
}
```
PMP試験に出てくるNPVを計算してみよう！

# NPVとは
Net Present Valueのことである。「正味現在価値」と訳される。
期間ごとに現在価値に換算する！

# NPVの例
プロジェクトコスト：1000万円
1年目の利益:100万円
2年目の利益：200万円
3年目の利益：300万円
利率：５%
の場合のNPVは-464.2万円

## 計算方法
```
NPV=
-1000万円/(1.05)^0
+100万円/(1.05)^1
+200万円/(1.05)^2
+300万円/(1.05)^3
=-464.2万円
```

# pythonで確認
```python3
$ python3
Python 3.7.3 (default, Mar  6 2020, 22:34:30) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> -1000 + 100/1.05 + 200/(1.05**2) + 300/(1.05**3)
-464.204729510852
>>> 

```

----
よかったよかった
Flutter BlurHashを使った画像読み込み中のぼかし効果


### BlurHash

[BlurHash](https://blurha.sh/)とは画像のプレースホルダーとして使うぼかし表現のことです。

<img width="1215" alt="Screen Shot 2020-04-28 at 10.42.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236405/aa631aa0-1daa-0fbb-0f39-70f41f0fdab8.png">
(公式サイト例)


### Flutterでの導入

pubspec.yamlに必要なプラグインを追加します。
flutter_testの依存関係が原因でflutter_blurhashの最新版と競合してしまうので最新版を使いたい場合にはflutter_testを外す必要があります。flutter_blurhashの古いバージョンで試したらぼかし画像が表示される位置がずれた、不具合かな？

```yaml

dependencies:
  # 画像からblurhashの値を作成
  blurhash_dart: ^0.2.3
  # blurhash値からぼかし画像Widgetを作成
  flutter_blurhash: ^0.4.0
  # 画像読み込みとローディング中のPlaceholderなどの設定用
  cached_network_image: ^2.1.0+1
dev_dependencies:
  # flutter_test:
  #   sdk: flutter
```

flutter_blurhashの最新版だとコンパイルに失敗する場合はこちらで多分いける

```yaml

  flutter_blurhash:
    git: 
      url: https://github.com/rydein/flutter_blurhash.git
      ref: fix/runtype
```

### 画像ファイルのblurhash値を作成

まずは画像ファイルのblurhash値を求める必要があるのでFileからエンコードする処理を用意します。ImagePickerを使ってアルバムから写真を選択する例です。
blurhash値を取得できたら画像をアップロードして保存する際に一緒にこの値も保存するようにし画像のURLとエンコードした値をセットで保持するようにすると良いですね。

```dart

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:blurhash_dart/blurhash_dart.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:image/image.dart' as img;
import 'package:image_picker/image_picker.dart';
import 'package:cached_network_image/cached_network_image.dart';

    // ImagePickerで写真を選択する
    File file = await ImagePicker.pickImage(
      source: ImageSource.gallery,
      imageQuality: 80,
    );

    Uint8List fileData = file.readAsBytesSync();
    img.Image image = img.decodeImage(fileData.toList());
    final blurHash = encodeBlurHash(
      image.getBytes(),
      image.width,
      image.height,
    );
    print("$blurHash");
```

### 画像の表示

Firebase firestoreやサーバーのAPIから画像URLとblurhashを取得したら表示する画像を用意します。画像の `url` と `blurhash` を取得したらCachedNetworkImageを使ってプレースホルダーに設定します。

```dart

  CachedNetworkImage(
    imageUrl: url,
    width: width,
    height: height,
    placeholder: (context, url) {
      return BlurHash(
        hash: blurHash,
      );
    },
    fit: BoxFit.cover,
  );
```

これでURLの画像を読み込んでいる間は画像のぼかし画像が変わりに表示されていい感じの表示になります。

以上です。
vimで編集したファイルがreadonlyだったけど保存したい

どーも、ふぎとです。
今回は「**vimで編集したファイルがreadonlyだった、でも
編集内容を保存したい**」問題について。

#何の気なしに編集

（新米エンジニアのふぎとくん。
きょうはvimでファイルを編集したみたい。）

「**あれ、編集した内容が保存できひん**」

~~~
E45: 'readonly' option is set (add ! to override)
~~~

#先輩に相談

「先輩、編集内容が保存でけへんのですが」
「あーふぎと君、これreadonlyのファイルやからな、
　原則は編集できひん仕様やねん」
「ほんまですか？ほな書き直さなあかん…？？」
「いやいや安心せえ」
「『**原則**』言うてるやろ？」
「上のメッセージよく読んでみい」
「えーっと…　"**add ! to override**"？」
「あ、なんか"！"マークつけたら設定変えれるってことですか？」
「せや、そん通りや」
「readonlyファイルでも編集内容を強制的に保存（上書き）する
　コマンドがあるんや」

##編集内容の強制保存
「これがそのコマンドや」

~~~
:w !sudo tee %
~~~

「えらいシンプルですね」
「せやろ」
「**いま開いとるファイル（％）に対して"sudo tee"で
　編集内容を強制的に上書きしとる**んや」
「ほへ～そうなんですか」
「あ、それやったらsudo権限は必須てことですね」
「せやな」
「そればっかりはしゃーない」
「ほんで強制保存したら **:q!** で終了する」
「こんだけや」
「あっという間ですやん」
「どうもありがとうございました(´ω｀)」

#パク…参考にした記事

→https://hacknote.jp/archives/12412/
→http://tm.root-n.com/unix:command:vim:readlonly_write

今日はここまで。ではでは。
Microsoft GraphAPIをつかってみよう。-- 実践 編--

#はじめに#
前回、Microsoft Graph APIを利用するためのアプリ登録手順についてお話ししました。
今回は登録したアプリを使って **PowerShell** で GraphAPI を利用し、情報取得するまでを例を用いて解説します。
※前回記事：[Microsoft GraphAPIを使ってみよう。-事前準備 編-](https://kurattyodiary.hatenablog.com/entry/MSGraphapiExample)


**※本記事は、はてなブログに移行しました。
　記事は最新化しています。よろしければそちらをご覧ください。**

　[Microsoft GraphAPIを使ってみよう。-実施編](https://kurattyodiary.hatenablog.com/entry/MSGraphapiExample)
TouchDesigner でデバッグするときに役立つこと

## print() じゃなくで debug()

`print()`はPythonで使う出力の方法ですが、TouchDesignerでは`print()`が使えるところでは代わりに`debug()`という関数を使うことができます。
`debug()`は出力と共に、どこからどのオペレータのどの行で呼び出したのかを確認することができます。
TouchDesignerでデバッグをする大体の場合に有効です。

- printとdebugの比較
![debug.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/5c50304b-f625-2b57-17e0-7db2e28e0fc6.jpeg)


[Troubleshooting_in_TouchDesigner#Command:_debug](https://docs.derivative.ca/Troubleshooting_in_TouchDesigner#Command:_debug)


## 開けなくなったり初期不良のあるファイルには CrashAutoSave

無限ループを書いてしまったり、何かわからないことでファイルがクラッシュしたり、開けなくなることがたまにあります。
クラッシュした際に自動で `CrashAutoSave.toe` が生成されますが、自分が作成したtoeファイルもファイル名の頭に `CrashAutoSave.` をつけるとsafe モードで起動することができます。
safe モードで起動すると、プロジェクトないでは一切処理を走らせずに中身を確認・修正することができます。中身を修正したら、 `CrashAutoSave.` をファイル名から外して保存しファイルを開き直すことで開けなかったファイルを修正することができます。

`CrashutoSave.` の付いたファイルを開くと最初に以下の画像のようなダイアログが出ます。
![SafeModeDialog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/c63a390c-d708-4914-3de4-9525eda3be53.jpeg)

OKを押してTouchDesignerが起動すると、タイムラインが走らず、画面中央にSafeModeという文字が乗ります。
この状態でオペレータなどの編集ができるので、不具合のある所を修正したり、必要な部分だけ取り出してほかのファイルにコピペするなどします。
![SafeMode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/92de6708-43e6-783c-bb6d-dfc5417fe51b.jpeg)


[Troubleshooting_in_TouchDesigner#Crash_Auto_Save](https://docs.derivative.ca/Troubleshooting_in_TouchDesigner#Crash_Auto_Save)
[Safe Mode](https://docs.derivative.ca/Safe_Mode)


## Error DAT and Error Dialog

プロジェクト内のエラーや警告を一覧表示してくれる

- [error DAT](https://docs.derivative.ca/Error_DAT)
![errorDAT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/0ac422a5-1e45-facc-9c55-8cabfa5ce743.jpeg)

- [error Dialog]()

`Dialogs -> Errors`
![errorDialog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/677a3157-b1b3-d15a-2048-005947185d8a.jpeg)

## op Find DAT

プロジェクト内のオペレータをフィルターなどを指定して検索ができる
取ってこれる値も多い

- [op Find DAT](https://docs.derivative.ca/OP_Find_DAT)
![opFindDAT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/e13faae3-49d5-b1a8-21c3-2616044fc11a.jpeg)



## non-Commercial モードで開く

ワークショップなどでライセンスを持っていない人向けに、サンプルファイルなど配布する際にNon-Commercialでも動作するかを確かめる際に使えます。
ライセンスの入れ替えがパッとできないので、スクリプトから制限をかけると楽です。

```python:ノンコマーシャルライセンス制限
app.addNonCommercialLimit('password')  # 制限
app.removeNonCommercialLimit('password') # 解除
```
```python:解像度制限
app.addResolutionLimit(1280, 720, 'secret123') # 制限
app.removeResolutionLimit('secret123') # 解除
```
詳しくはこちら→https://docs.derivative.ca/App_Class#Methods

## 参考になるリンク集

- [公式Wikiトラブルシューティング](https://docs.derivative.ca/Troubleshooting_in_TouchDesigner)
- [TouchDesignerのパフォーマンス測定](https://qiita.com/satoruhiga/items/1f9cdd309f65f769c3c3)
- [TouchDesigner pythonスクリプトとCHOP Executeの実行順序](https://qiita.com/shks/items/4d3e89349de1c155e13e)
ssh接続が勝手に切れて欲しくない時    (CUI)

#ssh接続が勝手に切れて欲しくない時 (CUI)

~/.ssh/config　を書き換えるといいみたい。
「config」とは「設定」という意味。

しかし、私の .sshの中にconfigが無かったので作成する必要があった。

    vi config
で、configを作成と同時に編集。中身は

    # ~/.ssh/config
    
    Host 任意なホスト名（自分で勝手に決めていい）
        HostName ホストのアドレスかIPアドレス
        User ログインユーザ名
        #Port
        ServerAliveInterval 180
        ServerAliveCountMax 60
        IdentityFile ~/.ssh/id_rsa
        IdentitiesOnly yes
と書いた。これで、
ssh 任意なホスト名
と打つだけで入れる。

　今回の目的のssh接続切れなくするための部分は
ServerAliveInterval 180
ServerAliveCountMax 60
応答がなくなってから、180秒ごとに信号を送り、最大60回まで送るので、1時間半は勝手に接続切れないはず。
多分、CountMaxを設定しなかったら延々送り続けるみたい。

IdentityFile
IdentitiesOnly
で公開鍵を自動で認識してくれる。
ただ、パスワードの方はconfigで設定できないから、毎回打つしか無いみたい。セキュリティー上そちらの方が良い。

Portは、なんとなく入れておいた（コメントアウトで意味無いけど）。デフォルトは22らしい。


※あとは、パソコン自体の省エネ設定で、「ディスプレイがオフのときにコンピュータを自動でスリープさせない」にチェックを入れておけば完璧（Mac)。




参考にさせて頂いたURL（もっと色々記載されている）
https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1
https://qiita.com/seiyaan/items/d9030538833b3903f795
https://qiita.com/oohira/items/7deae31469cfbbd740c1
https://qiita.com/passol78/items/2ad123e39efeb1a5286b
PMP試験に出るPMBOKの10の知識エリアはPMBOKガイドのどこに記載があるのか！

# PMPの知識エリアはどこに記載があるのか
PMBOKガイド(6th Edition)の23ページ `1.2.4.6 PROJECT MANAGEMENT KNOWLEDGE AREAS`に`10の知識エリア`の記載があるぞ！

# The 10 KNOWLEDGE AREAS (１０の知識エリア)
各知識エリアは４章から13章までの10章にまとめられているぞ！

- 4章 [Project Integration Management](https://qiita.com/Yumenoshima/items/81eab7a0000302341abd)
    - プロジェクト統合管理
- 5章 [Project Scope Management](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)
    - プロジェクトスコープ管理
- 6章 [Project Schedule Management](https://qiita.com/Yumenoshima/items/dda09f6a93dfa194ea18)
    - プロジェクトスケジュール管理
- 7章 [Project Cost Management](https://qiita.com/Yumenoshima/items/90cb9ee6dd97401a67d7)
    - プロジェクトコスト管理
- 8章 [Project Quality Management](https://qiita.com/Yumenoshima/items/0eb4d0934d5802417bf7)
    - プロジェクト品質管理
- 9章 [Project Resource Management](https://qiita.com/Yumenoshima/items/341ab512bd1da1f7646d)
    - プロジェクトリソース管理
- 10章 [Project Communications Management](https://qiita.com/Yumenoshima/items/5a0ba8aee9ef1f0a7ac5)
    - プロジェクトコミュニケーション管理
- 11章 [Project Risk Management](https://qiita.com/Yumenoshima/items/813db94b854cb63a2bf6)
    - プロジェクトリスク管理
- 12章 [Project Procurement Management](https://qiita.com/Yumenoshima/items/624460129ee11af3e65e)
    - プロジェクト調達管理
- 13章 [Project Stakeholder Management](https://qiita.com/Yumenoshima/items/01cc1239ec8b2c1c2c5a)
    - プロジェクトステークホルダー管理

わからなくなったらPMBOKガイドを見ればいいね！

----
よかったよかった
Windows10にVirtualBoxをインストール

# 概要
自宅で簡単に複数のLinux(CentOS, Ubuntu, KaliLinux ...)を切り替えて使用したい。
会社にはESXiとかあるけど、自宅にはWindows10しかない。

そんな人(私)のために、(既にたくさん情報があるのを承知の上で)VirtualBoxのインストールした記録を残しておきました。

<!--
Oracleがやだという人には、VMware Workstation Player版も書いてみました。
-->
VMware Workstation Player版はこちら
[VMware Workstation Playerインストール](https://qiita.com/HirMtsd/items/dd867000aa1e6a77f99b)

# ダウンロード
2020/04/28時点での最新版は、ver6.1.6(2020/04/14リリース)

まずは、WEBブラウザで以下のURLにアクセス。
https://www.virtualbox.org/


![11VirtualBox_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/fbbc0fdc-68d3-89b9-4a68-047232cfc941.png)
中央の[Download...]ボタンを押下。

![11VirtualBox_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/deb29a7d-dd75-81db-b2d7-5d50f422fc72.png)
[VirtualBox 6.1.6 platform packages]-[Windows hosts]リンクを押下。

**VirtualBox-6.1.6-137129-Win.exe**のダウンロードが始まる。
106,593,800 バイト

念のために、チェックサムを確認しておく。

先のダウンロードサイトの[Windows hosts]リンクの7行くらい下にある、[SHA256 checksums]リンクを押下。
![11VirtualBox_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/4633bc4e-95b2-76fb-66e3-e2232f84e72c.png)
ダウンロードした**VirtualBox-6.1.6-137129-Win.exe**のチェックサムを確認しておく。

コマンドプロンプトを起動し、以下のコマンドを実行

```
certutil -hashfile (ダウンロードしたファイル) sha256
```

![11VirtualBox_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/78942b2c-f754-e8d1-2861-82dafad2f14e.png)

チェックサム(ハッシュ値)が一致することを確認する。

# インストール
ダウンロードしたVirtualBox-6.1.6-137129-Win.exeを実行する。

![11VirtualBox_101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/70a808e7-264e-af96-bc8a-f3dbafecd571.png)
[Next >]ボタンを押下。

![11VirtualBox_102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/6a59a5f0-6089-ba10-f51b-05d6fda7bb16.png)
[Next >]ボタンを押下。

![11VirtualBox_103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/9c30400e-1784-c21f-e98a-56da10224faf.png)
[Next >]ボタンを押下。

![11VirtualBox_104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/3e1ae92f-df79-903d-a092-c7fbd67b33b0.png)
[Yes]ボタンを押下。

![11VirtualBox_105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/b6ef4d04-9e0d-b97c-6990-c67a0fd197d5.png)
[Install]ボタンを押下。

![11VirtualBox_106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/2526ddd2-8392-0ae2-c590-dd1b417f0592.png)
インストールが始まる。
機器の性能によるが、おおむね2～3分で完了する。

![11VirtualBox_107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/798da4ad-9dd8-f507-8e6b-83dfa6499036.png)
途中で、このようなダイアログが表示された場合は、
["Oracle Corporation"からのソフトウェアを常に信頼する(A)]をチェックし、
[インストール(I)]ボタンを押下。

![11VirtualBox_108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/48b54574-3c0a-c2c6-b096-64c08336e136.png)
このダイアログが表示されたら、インストール完了。
[Finish]ボタンを押下。

![11VirtualBox_109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/3bb29a76-8941-acea-8b7e-ca8af5b82e79.png)
インストール完了

# 更新
Windows10用のVirtualBoxをインストールしてから、しばらく経過して更新案内のダイアログボックスが表示された場合の対応を、以下に記録しています。
[Windows10にインストールしたVirtualBoxをアップデート](https://qiita.com/HirMtsd/items/9aeae4e3d3e4365ed8bc)
AsciiDocの執筆環境を用意する

AsciiDocで文章を書く際に使うプレビュー機能を持つ（拡張機能が存在する）テキストエディターについて2つ紹介します。

- Visual Studio Code
- Atom

※Windows10でのみ確認しています。

## Visual Studio Code

Visual Studio Codeには、いくつかAsciiDoc関連の拡張機能があります。
今回インストールする拡張機能を使うことで、このような執筆環境が整います。

![](https://i.imgur.com/B5VAoBc.png)


### 手順
１. [Visual Studio Code](https://code.visualstudio.com/download) をインストールします。

２. Visual Studio Codeに拡張機能をインストールします。
今回インストールする拡張機能の識別子は、`joaompinto.asciidoctor-vscode`です。慣れた方法でインストールしてください。

* コマンドラインでのインストール

```powershell
code --install-extension joaompinto.asciidoctor-vscode
```

* 実行結果

```powershell
PS C:\Users\akinasu> code --install-extension joaompinto.asciidoctor-vscode
Installing extensions...
Installing extension 'joaompinto.asciidoctor-vscode' v2.7.15...
Extension 'joaompinto.asciidoctor-vscode' v2.7.15 was successfully installed.
```

３. Visual Studio Codeを再起動します。

### 使い方
１. 拡張子が`.asciidoc`または`.adoc`のファイルを作成し、Visual Studio Codeで開きます。
※拡張子は`.ad`、`.asc`でも構いません。
２. ファイルを開いたら、`Ctrl + k, v`を入力すると右側にPreviewが表示されます。

![](https://i.imgur.com/vGega4E.png)


実際に、入力してみましょう。入力した内容をリアルタイムにPreviewします。

* 入力例

```AsciiDoc
== レベル 1
Text.

=== レベル 2
Text.

==== レベル 3
Text.

===== レベル 4
Text.

.データ形式はCSV, 各カラム幅は表示域の15% (60 ÷ 4 = 15)
[format="csv",width="60%",cols="4"]
[frame="topbot",grid="none"]
|======
1,2,3,4
a,b,c,d
A,B,C,D
|======
```

* 出力結果

![](https://i.imgur.com/ZrG8riS.png)

他にも試したければ、[チートシート](http://www.venus.dti.ne.jp/~iisaka/DocSys/cheatsheet-ja/asciidoc-869/asciidoc-869.html)を参考にお試しください。

他にもいくつか機能があり、詳細は拡張機能の説明文[AsciiDoc](https://marketplace.visualstudio.com/items?itemName=joaompinto.asciidoctor-vscode#how-to-use)を読んで頂ければと思います。

- Syntax highlight
- code snippets
- HTML、PDF、DocBookへの出力
- 画像の貼り付け

HTMLの出力などは`F1`でコマンドパレットを開いて`asciidoc`と入力して選択します。
![](https://i.imgur.com/AhbJoPx.png)

Ctrl + Alt + vで、画像の貼り付けできるのは知りませんでした！便利ですね！
![](https://i.imgur.com/xwtQGXl.png)

### Visual Studio Online
ちなみにAzureサブスクリプションなどが必要みたいですが、こちらでも同じ機能が使えます。
![](https://i.imgur.com/1vszw08.png)


## Atom
Atomは、GitHub製のテキストエディターです。

Visual Studio Codeと似たような手順と使い方です。
今回インストールする拡張機能（パッケージ）を使うことで、このような執筆環境が整います。
![](https://i.imgur.com/6QTLQvZ.png)


### 手順

１. [Atom](https://atom.io/)をインストールします。
２. Atomに拡張機能（パッケージ）をインストールします。慣れた方法でインストールしてください。

* コマンドラインでのインストール

```cmd
apm install asciidoc-assistant
```

* 実行結果

![](https://i.imgur.com/OZnKh7j.png)

３. Atomを再起動します。
Atomを再起動すると、ポップアップが出るので`Yes`をクリックし、依存関係のあるパッケージを入れます。
![](https://i.imgur.com/8EzLqhE.png)


### 使い方
１. 拡張子が`.asciidoc`または`.adoc`のファイルを作成し、Atomで開きます。
※拡張子は`.ad`、`.asc`、`.adoc.txt`、`.txt`でも構いません。
２. ファイルを開いたら、`Ctrl + Shift + a`を入力すると右側にPreviewが表示されます（`asciidoc-preview`の機能です）。

実際に、入力してみましょう。

![](https://i.imgur.com/R0eRGD9.png)


Ctrl + ｖで、画像の貼り付けが出来ます（`asciidoc-image-helper`の機能です）。
`images`フォルダを掘ってくれますし、ファイル名の付け方も好みです。
![](https://i.imgur.com/xGrv75k.png)

## おわりに

今回、2つだけですがAsciiDocの執筆環境（テキストエディターの拡張機能）について紹介しました。

ちなみにもうひとつ、[AsciidocFX](https://asciidocfx.com/#trueinstall-on-windows)というAsciiDocに特化したエディターを紹介したかったのですが時間切れになりました。
4年前の2016年に使ったときは、理由は忘れたのですが使いづらい印象がありました。
ですが、いまだにアップデートされているようなので改めて使ってみようと思います。
RSpecでparams.require(:user).permitエラー

```users_equest_spec.rb
# 省略
  post users_path, params: { user: FactoryBot.build(:user) }
  expect(is_logged_in?).to be_truthy
# 省略
```

これで実行すると

```
  params.require(:user).permit...#省略
  undefined method `permit' for "#<User:0x00007fb5c2fba480>":String
```
エラー

コントローラのストロングパラメータで使うpermitが定義されてない。
え。。

# やったこと

attributes_for
を使う。

コントローラの方はミスないっぽかったのでオブジェクトの方がおかしいと思ったので
rails cで調べてみた。

```
$ user = FactoryBot.build(:user)
$ user.class
=> User
```
Userクラス。コントローラにはハッシュを送らなければいけなかった。

```
$ user2 = FactoryBot.attributes_for(:user)
$ user2.class
=> Hash
```
なので

```users_equest_spec.rb
# 省略
  post users_path, params: { user: FactoryBot.attributes_for(:user) }
  expect(is_logged_in?).to be_truthy
# 省略
```

これで通った。
【備忘録】React + Firebaseセットアップ

# What

Reactのアプリ内でFirebaseを使うときにハマらずに環境構築するためのメモ
(2019年4月28日　初稿)

OS: macOS Catalina 10.15.4

# Why

公式ドキュメントや他の記事を見ながらもハマったことが何度もあるのでここにまとめておく

# Who

趣味でReact + Redux + Firebaseあたりでwebアプリを作っている人です。

# 構築方法

##Firebase側

Firebase console 
-> プロジェクトを追加 
-> アプリを追加 
-> webアプリを選択 
-> (Cloud Firestoreを使う場合) [Database]
-> [データベースの作成]
-> [本番環境で開始]
-> **ロケーションは"asia-northeast1"を選択**

##React側

`npx create-react-app project-name` 
-> `cd project-name`
-> (Material-UIを使う場合) `yarn add @material-ui/core`
-> `firebase init` 
-> 使うものを選択(functions, firestore, hostingなど) 
-> SPAにするをYes 
-> hosting用のディレクトリを`build`に指定
-> 「Firebaseの既存のプロジェクトを使用」でさっき作ったFirebaseのプロジェクトを指定する
-> 完了

->

-> yarn add firebase axios (axiosはなくてもいい)
-> **srcディレクトリ内に** `firebase_config.js`を作成

```js:firebase_config.js
import firebase from 'firebase/app';
import 'firebase/firestore';
import 'firebase/functions';
import 'firebase/analytics'

const firebaseConfig = {
    apiKey: "****************************",
    authDomain: "****************************",
    databaseURL: "****************************",
    projectId: "****************************",
    storageBucket: "****************************",
    messagingSenderId: "****************************",
    appId: "****************************",
    measurementId: "****************************"
  };

firebase.initializeApp(firebaseConfig);
export default firebase;
export const db = firebase.firestore();
```

firebaseConfigの部分は
firebase console
-> プロジェクト
-> [設定]
-> [プロジェクトの設定]
-> 下のほうにある「Firebase SDK snippet」
-> [構成]に表示を切り替える
-> `firebaseConfig`の中身をコピー

### Functionsを使う場合

トップディレクトリから**functionsディレクトリ**に移動 `cd functions`
-> `yarn add cors` (corsのアラートがでるのを防ぐ)
-> `index.js`にて(以下はテンプレート)

```js:index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const cors = require('cors')({origin: true});

exports.addRecord = functions.region('asia-northeast1').https.onRequest((req, res) => {

    cors(req, res, () => {
        admin.firestore().collection('posts').add({
            name: req.body.name,
            createdAt: new Date().toISOString(),
            likes: 0,
        })
        .then(() => {
            return res.status(201).json({message: "success"})
        })
        .catch((err) => {
            return console.error(err);
        });
        return null;
    });
});
```

###デプロイ時

Functionsだけ
-> `firebase deploy --only functions`


hostingしたい
->`yarn build`
->`firebase deploy --only hosting, firestore`
【初心者向け】GitHubに初めてコードを上げたいけどどうしたらいいか分からない人へ

# 書いてる人ってどんなやつ？
プログラミング未経験から勉強してる人。
GitHubにコード上げたいな〜と思ったけどターミナル触るのが初めてで意味不明だったし色々苦労したので、備忘録として書きます。
なお、私自身はMacを使用していてWindowsで作業する場合との間で違いがあっても分かりませんので、Mac向けの記事になっています。

何か根本的な間違いなどがあったらすみません。教えてください。

#前提条件
Gitをダウンロードしてあって、GitHubでアカウントを作ってある人向け
（MacはGitが標準でインストールされてます）

# プッシュするまでの処理の流れ
そもそもGitがよく分かっていなかったのは、ブランチやらコミットやらプッシュやらの横文字に翻弄されて、「結局何がどう起こってるの！？」と処理の流れ自体をよく理解できていなかったからでした。



GitHubにプッシュするまでの大まかな流れはこうです。
`1.「git init」でローカルリポジトリを新規作成`
`2.「git add」でステージングエリアへ追加`
`3.「git commit」でローカルリポジトリに変更を記録`
`4.「git push」でリモートリポジトリにプッシュ`

この流れさえ理解できれば、プッシュするのは意外と簡単です。
この後一つ一つ説明します。

# 1.git init
まず、「cd」や「ls」というコマンドを駆使しながら、GitHubにコードを上げたいと思っているディレクトリまで移動します。
私みたいに初めてターミナル触る人向けに説明すると、cd＝移動できるコマンド、ls＝自分が今いる場所にどんなファイルがあるかを教えてくれるコマンドって感じです。
詳しくは調べてみてね。

```コマンド:ターミナルのコマンド
git init
```


で、ディレクトリまで移動できたら、git initコマンドを打ってEnterを押します。
この時点で.gitというディレクトリが自動的に作られます。
Gitの変更情報なんかが記録されてるものみたいです。

#2.git add
```コマンド:ターミナルのコマンド
git add .　　　//ディレクトリ内のファイルが全て追加される
```
```コマンド:ターミナルのコマンド
git add index.html　　//指定した「index.html」というファイルのみが追加される
```
「git add」コマンドでステージングエリアへ追加することができます。
ステージングエリアってなんやねん。って感じなんですが、リモートリポジトリに移動する前の待機場所をイメージしてます。

「git add」の後ろにつくオプションは他にも色々あるのでよかったら調べてみてください。

#3.git commit
```コマンド:ターミナルのコマンド
git commit -v 　 //-vをつけることで変更点を確認してコミットすることができます
```
「git commit」コマンドで何をどう変更したのかを記録することができます。
ちなみにcommitの後の「-v」は「verbose」の略らしいです。へぇ〜〜

上記コマンドを打つと、vimと言われる画面に切り替わります。
使い方が特殊で、初心者には意味のわからない恐ろしいやつです。
半角英数字に切り替えて「i」を打つと、書けるようになります。

```コマンド:vimのコマンド
initial commit
```
vimでコミットメッセージを書きます。
２回目以降のコミットでは「ここを修正しました」とかっていうのを書くんですが、
とりあえず初めてのコミットなので「initial commit」とかって書いてコミットしてみます。
vimでは、保存して終了するとき、エスケープボタン（esc）を押した後に「:wq」と打ってEnter押す必要があります。

#### 補足：vimの顔を見ることなく、コミットできる方法もあります。

```コマンド:ターミナルのコマンド
git commit -m"initial commit"
```
-mの後にコミットメッセージ書くだけ。
この１行で完了します。便利。ちなみに-mはmessageの略です。

他にもいろんなオプションがあるので調べてみてください。
以下は英語で書かれていますが、個人的には「こんなに沢山あるんだ〜〜」と勉強になりました。
[Git公式ドキュメント（git commit）](https://git-scm.com/docs/git-commit)

#4.git push
GitHubにプッシュするために、まずはGitHubにログインしてNew repositoryを作ります。
New Repositoryの作り方は調べたらすぐ見つかると思うので、詳しくは調べてみてください。

```コマンド:ターミナルのコマンド
git remote add origin git@github.com:ユーザー名/作ったNew repositoryの名前.git
```
New reposirotyが作れたら、ユーザー名とNew Repositoryの名前部分だけ各々変えてもらってた上で、上記のコマンドを打ってEnterしてください。


最後に以下のコマンドを打ってEnterして完了です。


```コマンド:ターミナルのコマンド
git push -u origin master
```
これで出来上がってるはずなので、GitHubから確認してみてください。
無理だったらエラーコードからググってみたり、参考に載せている動画を見たらできると思います。

# 参考
[Git：はじめてのGitとGitHub](https://www.udemy.com/course/intro_git/)
Gitに悩んでいた私を救ってくれた、素晴らしく分かりやすい動画です。
この記事の内容が5割増で理解できると思います。無料で視聴可能です。


では、ここまでお読みいただきありがとうございました。
Mac Catalina に compass をインストールする方法

従来の Ruby Sass を Mac Catalina にインストールする方法です。

環境： macOS Catalina バージョン 10.15.4
シェル : zsh

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


環境：macOS Catalina

1.Xcode Command Line Tools のインストール

```
xcode-select --install
```
2.Sass のインストール

```
sudo gem install -n /usr/local/bin sass
```

3.Compass のインストール

```
sudo gem install -n /usr/local/bin compass
```

4.Listen のインストール
```compass w``` で Listen warning が出た場合

```
sudo gem install -n /usr/local/bin listen
```



おしまい。

---
以下、検索用のエラー文言


``` compass w ``` した際に出たエラー文言

```
[Listen warning]:
  Listen will be polling for changes. Learn more at https://github.com/guard/listen#polling-fallback.
```


---
### アンインストール



```
$ sudo gem uninstall -n /usr/local/bin sass
```

```
$ sudo gem uninstall -n /usr/local/bin compass
```

```
$ sudo gem uninstall -n /usr/local/bin listen
```
ESP8266 WiFiManager

最近ESP8266でWiFiを使うときに、SSIDをコード内に埋め込まなくていいようにするWiFiManagerってのを見つけたので実装してみました。
自分のメモみたいな投稿です。

###ライブラリの追加
https://github.com/tzapu/WiFiManager
Arduino IDE に追加しました。

###参考サイト
参考にさせていただきました。ありがとうございます。とても助かりました。
・[IoTラボ ESP8266 WI-FI SSID、パスワードのオンライン設定](https://takehikoshimojima.tumblr.com/post/138820924644/esp8266-wi-fi-ssid%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E8%A8%AD%E5%AE%9A)
・https://qiita.com/tomorrow56/items/8c2dfdf61d4741ba91de

###実装
ほとんど、スケッチ例のまんまですが、再設定させたくて、webにして、resetコマンドをつけました。
直接URLに記載する方式です(^^)
また、DHCPでIPがわかんない問題をクリアするため、mDNS responder で、IPアドレスでなく名前でつなげるようにしました。

```
http://sample.local/cmd?CMD=reset
```
いきなりリセットしちゃうので、ちょっと危険かも・・・。
BASIC認証くらいはつけたほうがいいかも・・・



```
#include <FS.h>
#include <DNSServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> 

#define SERIAL_SPEED 115200

// Web page (Port 8080) 
ESP8266WebServer server(8080);
static const char* cpResponse200 = "<HTML>"
 "<BODY style='background-color:#ffffde;font-family:sans-serif;font-size:40px;'>"
 "CONTROL WEB<br/><br/>"
 "<a href=/cmd?CMD=dummy>DUMMY</a><br/>"
 "</BODY></HTML>\r\n";

 
void setup() {
  Serial.begin(SERIAL_SPEED);
  Serial.println("");
  
  //WiFiManager
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  if (!wifiManager.autoConnect("AutoConnectAP", "password")) {
    Serial.println("failed to connect, we should reset as see if it connects");
    delay(3000);
    ESP.reset();
    delay(5000);
  }

  Serial.println("");
  Serial.println("WiFi Connected.");
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("");
  Serial.println("");

  // Set up mDNS responder:
  if (!MDNS.begin("sample")) { // sample.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  Serial.println("");

  // WebServer
  server.on("/cmd", WebCommand);
  server.begin();

  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 8080);
}

void WebCommand() {
  String cmd = server.arg("CMD");
  if (cmd == "dummy")  {
    // hogehoge...
  }
  else   if (cmd == "reset")  { //　resetコマンドでWiFi再設定
    WiFiManager wifiManager;
    delay(1000);
    Serial.println("");
    Serial.println("WiFi Reset !");
    Serial.println("");
    wifiManager.resetSettings();
    delay(3000);
    ESP.reset();
  }
  server.send(200, "text/html", cpResponse200);
}

void loop() {
  MDNS.update();
  server.handleClient();
}
 
```

###使い方
まっさらなマシンだったら、例えば、iPhoneなどで、「AutoConnectAP」のSSIDをみつけ、パスワード＝passwordで接続すると、設定画面がでますので、それに入力すればOKです。

一度、設定すると、覚えてますので、次はそのままつながっちゃいます。
Sketchを入れ直しても、覚えてました。
なので、前述のWEBコマンドで、設定をリセットしてあげます。
Railsの７つのアクションとその設定方法

# ７つのアクションとは
結論から言います。以下の表をみてください。

| アクション | 役割 
|:--------|:---------------------
| index   | 一覧表示ページを表示 |
| new     | 新規投稿ページを表示 | 
| create  | データ投稿に伴って動く |
| show    | 個人詳細ページを表示 | 
| edit    |  編集ページを表示 |      
| update  |  編集に伴って動くもの |
| destroy | データ削除に対して動くもの |

各アクションを設定することで、各アクションに定義された動きを表すことができます。

#7つのアクションの設定方法
結論から言うとresourcesメソッド、onlyオプションを使います。
以下のように記述します。
`routes.rb`

```ruby
Rails.application.routes.draw do
  root to: 'posts#index'
  resources :posts, only: [:index, :new, :create]
end
```
こうなります。**これはindex,new,createアクションのみ使うよ！**という記述です。これは便利なので絶対理解しておいた方がいいです。
※なお、余談ですがexceptオプションもあります。
`routes.rb`

```ruby
Rails.application.routes.draw do
  root to: 'posts#index'
  resources :posts, except: :index
end
```
**これはindexアクション以外全てのアクションを使うよ！**という記述です。
こちらも併せて理解しておきましょう。
色指定に迷ったらhslにしよう

## はじめに

みなさんはCSSでの色指定、どのようにされてるでしょうか？

- rgba
- rgb
- キーワード(black, whiteなど)
- 16進数

などでしょうか。
デザイナーから細かい指定がある場合などはrgb値が明記されていてその通りに書けば済むことも多いですが、デザインに疎い人間がざっくり色指定しなければいけない場合には色味の調整が難しいですよね。


## hslとは
そこで今回紹介するのは（筆者の観測範囲では）あまりみないhslという指定方法についてです。

rgbaは「red」「green」「blue」「alpha」の頭文字ですが、hslは

- h : Hue(色相)
- s : Saturation(彩度)
- l : Lightness(輝度)

となります。
指定方法の具体例をみてみましょう。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="ririli" data-slug-hash="YzyQNbN" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="hsl-sample">
  <span>See the Pen <a href="https://codepen.io/ririli/pen/YzyQNbN">
  hsl-sample</a> by ririli (<a href="https://codepen.io/ririli">@ririli</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


ここですね。

```
hsl( 207, 100%, 50%);
```

左から色相、彩度、輝度となってます。

それぞれどんな値を入れれば良いのかみていきます。

### 色相
色相には色相環と呼ばれるものの角度を指定します。[色相環について](https://ja.wikipedia.org/wiki/%E8%89%B2%E7%9B%B8)
そのため取りうる値は0~360です。

0が赤、180で青、360で赤というようになってます。
また、角度になっているので360を超えるような値、例えば420などを入れた場合は420-360で60を指定したことと等しくなります。
SCSSなどで繰り返す場合はこれを覚えておくと便利かも。

### 彩度
彩度には100分率の値を指定します。
取りうる値は0%~100%です。

彩度が低いほど暗く重く、高いほど明るく軽い色になります。

彩度100%がその色相における純色扱いです。
彩度0%はもう元の色はわかりません。

## 輝度
輝度も100分率の値を指定します。
こちらも取りうる値は0%~100%です。

彩度とは異なり、50%がその色相における純色の扱いになっています。
これが100%に近づくと人の目にとって輝いて見えように白くなっていきます。
逆に0%に近づくと全く輝いて見えないように黒くなっていきます。



## hslのなにがいいわけ？

ここまでhslの指定方法についてみてきましたが、hslにすると何が嬉しいんでしょう？
個人的な観点ですが、似た色を簡単に作れることだと思ってます。

二つ目のサンプルをみてみましょう。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="ririli" data-slug-hash="RwWgpOY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="RwWgpOY">
  <span>See the Pen <a href="https://codepen.io/ririli/pen/RwWgpOY">
  RwWgpOY</a> by ririli (<a href="https://codepen.io/ririli">@ririli</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

hoverとactiveに輝度だけを変えた色を指定しました。
CSS上での一覧性も高いし、rgbで若干薄い同系色を作るのも若干手間なので輝度のパーセントだけを変えれば良いhslはパッと同系色を作るのにとても便利。
Python パッケージのバイナリ配布のメモ

# 背景

`pip install xyz` として, ビルドが走りビルドエラーになってつらい :cry:
バイナリパッケージがないと, 環境の再現がめんどい(とくに Windows + GPU 環境)

windows, macOS, linux バイナリでパッケージ配布してほしい


## PyPI

いわゆる pip でインストールできるたぐい.

twine でバイナリ wheel アップロードすればよいが, ビルドまでするのであれば cibuildwheel が有益


cibuildwheel で python bwheel(C++ モジュール含む) を CI で一括ビルドし PyPI へアップロードするメモ
https://qiita.com/syoyo/items/97f35b4d5c40761cc314

### bintray or 野良ホスティング

pip では URL 指定してのネットワークインストールができるので, パッケージを bintray にホスティングしたり, AWS S3 などにアップロードする手もある.


## conda forge

https://conda-forge.org/

Conda 用(?) `conda install` のときに, `-c conda-forge` を指定する.

pyopencl など, PyPI では Windows バイナリ未対応であるが, conda-forge だと Windows バイナリがある.

https://conda-forge.org/docs/maintainer/adding_pkgs.html

を参考にしてパッケージ追加すればよさそうだが... T.B.W.
in_arrayとDateTimeクラス、DateTimeImmutableクラスのわな


```php5

$a = (new \DateTime("2020/5/1"))->setTime(0,0,0, 0);
$array = [(new \DateTime("2020/5/1"))->setTime(0,0,0,0)];
var_dump(in_array($a, $array)); // -> true
var_dump(in_array($a, $array, true)); // -> false

$a = (new \DateTimeImmutable("2020/5/1"))->setTime(0,0,0, 0);
$array = [(new \DateTimeImmutable("2020/5/1"))->setTime(0,0,0,0)];
var_dump(in_array($a, $array)); // -> true
var_dump(in_array($a, $array, true)); // ->false
```
node v12でのnode-gyp rebuildでのエラー

## 環境
macOS Catalina(10.15.4)
node.js v12.16.2

## 発生した問題
`gatsby new`をしようとしたところ以下のようなエラーが発生。

```
error /Users/gedyra/blog/node_modules/sharp: Command failed.
Exit code: 1
Command: (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
Arguments:
Directory: /Users/gedyra/blog/node_modules/sharp
Output:
info sharp Using cached /Users/gedyra/.npm/_libvips/libvips-8.7.0-darwin-x64.tar.gz
(中略)
In file included from ../../nan/nan_converters.h:67:
../../nan/nan_converters_43_inl.h:22:1: warning: 'ToBoolean' is deprecated: ToBoolean can never throw. Use Local version. [-Wdeprecated-declarations]
X(Boolean)
(省略)
/Users/gedyra/Library/Caches/node-gyp/12.16.2/include/node/v8.h:2663:3: note: 'ToBoolean' has been explicitly marked deprecated here
  V8_DEPRECATED(\"ToBoolean can never throw. Use Local version.\",
(省略)
```


## 解決策

どうやらnode v12では、すでにdeprecatedだったいくつかの関数が削除された模様。
https://kokufu.blogspot.com/2019/11/node-ffi-node-12.html

`nvm use lts/dubnium`などでnode v10以下を使えば解決しました。
https://github.com/nodejs/node-gyp/issues/1941
Horizon7 デスクトッププールの削除

#１．デスクトッププールを削除
マシンはディスクからも削除を選択した場合

<h3>
マシンをログオフさせるとディスクからも削除される

<h3>
強制電源OFFでは削除されずにインベントリに残る

ドキュメントにも書いてある


#２．デスクトッププールのステイタスがプール無効の状態の時
マシンが電源OFFでデスクトップ無効の状態で削除した場合
マシンはDiskからも削除される

マシンは前回電源OFFにするときログオフ操作したのかは不明
また、replica-ecd・・・・UUIDのようなファイルはプールを削除できた　今まで消せなかったのは リンククローンの共通ファイルのためか？
PHPによる簡易的な図書管理システム作成(制作中)

#PHPによる簡易的な図書管理システム作成(制作中)
独学によりPHPに関して一通りの学習が終了したので、復習もかねて簡易的な図書管理システムを作成しました。
githubにて制作過程を公開中　https://github.com/shimada-ryusuke/book
現在はユーザー情報及び図書の登録、編集、削除まで実装済です。(4月28日時点)
#制作の経緯
PHPとデータベースを駆使したサービスとしてオーソドックスなものがないか考え、今回は一般的な市民図書館などで使用されているようなシステムを作成してみようと思いました。
#機能紹介
～編集中～(4月28日時点)
１．ユーザーログイン画面
メールアドレスとパスワードを入力してログイン後、マイページへ進みます。
<img width="736" alt="ユーザー登録画面.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/0f0f9f5f-d9d9-7e1f-99a9-4f5397005cdf.png">
マイページ画面
![マイページ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/5634117f-9fab-a9d0-51d7-d7c656005ff4.png)
２．新規書籍登録
タイトルはボックスに入力、出版年はダイアログから選択、著者はデータベースに登録済みの中からプルダウンから選択
![図書新規登録画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/888e5614-e3e0-5956-a528-1afc002250ce.png)
内容を入力して登録ボタンを押す
![図書新規登録画面　登録手順①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/4ce64304-982b-e2cc-aca1-ae21eaeab1e5.png)
内容がデータベースに格納されます。
![図書新規登録画面　登録手順②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/a13ccf64-1741-dd58-6553-d4a06f9a7737.png)
３．書籍一覧画面
現在登録されている書籍の一覧が表示されます。
![書籍一覧画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/89f5b857-bbb0-a60f-95f2-60fd20cd2f47.png)
４．詳細画面
書籍一覧のタイトルをクリックすると詳細画面が表示され、編集・削除・貸出(実装中)の作業が出来ます。
![書籍詳細画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/a7c6e7ca-456d-7aed-3db1-f5483e92684b.png)
５．編集画面
登録済みの内容を編集できます。
![書籍編集画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/97dc505d-6800-982d-8a04-a3b2ce18b349.png)
↓ここでは出版年を２０２０年から２０１９年に変更しました。
![書籍編集画面②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/d11c09b8-8910-8a8f-3b5a-bc5a04bc5cf4.png)
↓情報を更新したと表示されます。
![書籍編集画面③.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/0a5d98a3-09a4-fbd8-4fd8-7852d0225c52.png)
６．削除画面
登録済みの内容を削除します。
![書籍削除画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/c34d1d6e-4946-f297-a35b-652880f1ad13.png)
削除が確認されたと表示されます。
![書籍削除完了画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600711/a391c5ff-d11d-8d96-9ec0-db13c73d0760.png)




#今後の改善点
著者の登録機能、レンタル中の書籍一覧表示、貸出・返却機能...等々
Common Data Service のカスタムエンティティには、きちんとロールに権限を付与しよう！

# カスタムエンティティ

Common Data Serviceって、基本的に元々あるエンティティで
事足りるって感じではありますが
まぁ追加でオリジナルなエンティティが欲しい！
ってことありますよね。
でも、作ったはいいけど
いざ共有しても
「おいー　アプリ使えないじゃねーかよー」
みたいなことになってしまいます。

カスタムエンティティは
作成しただけでは、作成者にしかアクセス権がありません
なので、作成後に共有をする場合は
アクセス権を付与してあげる必要があります。

# まずはロールを作成しましょう

## ロールの作成方法

[Power Platform 管理センター](https://admin.powerplatform.microsoft.com/)にアクセスし
対象の環境の設定を開きましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/447b9639-bb19-25c6-4e6b-fa0806f6896b.png)

ここの、セキュリティロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/32c4e12a-3bc6-bb84-ed78-eeb5fe49b031.png)

をクリックします。

別タブでセキュリティロールが出てきますので
新規をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/22eebbe0-8b82-47d5-633f-e0185a2e938f.png)

別ウィンドウで新規セキュリティロールが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/e29ca3b3-8272-cea7-98b4-587b9a5d4a9a.png)

ユーザー定義エンティティタブをクリックすると、エンティティの一覧が出てきますので
権限を操作毎に指定します。

## アクセス権限

権限は以下の5種類が存在します。

|権限|内容|
|:--|:--|
|選択なし|操作不可|
|ユーザー|ユーザーもしくはチームの所有・共有されているレコードのみ操作可能|
|部署|ユーザーが所属する部署のユーザーが所有するレコードのみ操作可能|
|部署配下|ユーザーが所属する部署及びその配下の部署のユーザーが所有するレコードのみ操作可能|
|組織全体|すべてのレコードが操作可能|

## レコード操作

操作は以下の7種類が存在します。

|操作|内容|
|:--|:--|
|読み取り|レコードを読み取る（取得する）|
|書き込み|レコードを作成・更新する）|
|割り当て|レコードを別のユーザーに割り当てる|
|追加|レコードに別のレコードを添付する|
|追加先|レコードを別のレコードに添付する|
|共有|レコードを別のユーザーもしくはチームに共有する|
|削除|レコードを削除する|

# アプリ共有時に作成したロールを割り当てる

ロールを作成すると、アプリ共有時にユーザーに対して
作成したロールを割り当てることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/2c0a5b69-2479-7ac0-fcf4-17c3b8bbc427.png)
snapchat cameraを使ってwebex meetingの自分の顔を変えてみた

#はじめに
オンライン会議をする上で自分の顔を映したくないけどカメラを使わなきゃいけない時にsnapchatを使って顔を変えてしまおうというものです(既存のsnapchatを使っているため時々顔認証がされないことがありますがまぁ仕方ない)。以下のURLを参照しているので気になった人はチェックしてみてください。
https://www.theandroidsoul.com/snap-camera-filters-for-zoom-microsoft-teams-more-download-how-to-use-tips/

#1.snap cameraをインストールする
##1.1ダウンロードページに進みます。
https://snapcamera.snapchat.com/download/　
##1.2ダウンロードページに進んだらメールアドレスを入力し,自身のデバイスに合わせてダウンロードします。
![www.theandroidsoul.com-download-and-setup-snap-camera-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/84c2b6ae-ac73-5573-067a-1ef9cea675ba.png)

##1.3ダウンロードされたインストーラの指示に従って設定を行います。
<img width="614" alt="スクリーンショット 2020-04-28 12.02.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/0e0586a1-f09b-a947-7b69-ad6d0c54e0b6.png">
インストールするディスクの選択を行います。
<img width="613" alt="スクリーンショット 2020-04-28 12.03.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/3d7c3fdb-d6af-9a24-5958-b3539b6f0e06.png">
<img width="604" alt="スクリーンショット 2020-04-28 12.03.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/d6df260e-fa7b-22a9-c313-c8d878a94d9b.png">
無事にインストールされると以下のような画面が映し出されます。
<img width="605" alt="スクリーンショット 2020-04-28 12.04.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/9e853ea2-60b5-d687-74e4-f9fd23d67c99.png">
<img width="933" alt="スクリーンショット 2020-04-28 12.04.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/30943bf4-fc00-21f5-37b1-09a6c2ea1ef4.png">

#2.Cisco Webexでsnap cameraを使用する
##2.1 Cisco Webexを起動して設定をクリックします。
![www.theandroidsoul.com-setup-snap-camera-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/77e3dec6-79f0-e5d2-25ff-74fd718c4330.jpeg)
##2.2　webex内でビデオの設定を既存のものからsnap cameraに変更すれば終了です。
実際にこのように使用できれば成功です。
<img width="691" alt="スクリーンショット 2020-04-28 12.37.38 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624557/ca9e257c-06eb-a3d8-f7d2-8efa7033f4b9.png">
これで会社の会議で自分のプライバシーを守れます!!やったね!!!!

#おまけ
zoomに関してですが過去に行うことができたようですが現在はセキュリティ上のアップデートで使用できなくなっているようです。今後に期待しましょう。
Clang で Hello World

## Clang とは

Clang は C や C++ などのC言語系のコンパイラ。

[Clang C Language Family Frontend for LLVM](https://clang.llvm.org/index.html)

> The Clang project provides a language front-end and tooling infrastructure for languages in the C language family (C, C++, Objective C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project. Both a GCC-compatible compiler driver (clang) and an MSVC-compatible compiler driver (clang-cl.exe) are provided. You can get and build the source today.

## 今回の動作確認環境

macOS Catalina + Apple clang version 11.0.3

```
$ clang -v
Apple clang version 11.0.3 (clang-1103.0.32.59)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.4
BuildVersion:	19E287
```

## C で Hello World

以下の hello.c ファイルを用意。

```c
#include <stdio.h>
int main(int argc, char **argv) {
  printf("Hello, world,\n");
}
```

コンパイル・リンクして実行。

```
$ clang hello.c
$ ./a.out
Hello, world,
```

## C++ で Hello World

以下の hello.cpp ファイルを用意。

```hello.cpp
#include <iostream>
int main(int argc, char **argv) {
  std::cout << "Hello, world." << std::endl;
}
```

コンパイル・リンクして実行。

```
$ clang++ hello.cpp
$ ./a.out 
Hello, world.
```

## 参考資料

- [Clang \- Getting Started](https://clang.llvm.org/get_started.html)
[漏洞预警]CVE-2020-1952/Apache IoTDB (incubating) 由于错误配置JMX RMI导致远程代码执行

### 漏洞描述
近日由奇安信云影实验室安全研究员`Wu﻿Xiong`提交给`Apache IoTDB (incubating)`的漏洞被披露.在其配置文件中默认启用JMX监视服务并将对公网监听一个`31999`的RMI端口,且无需进行任何身份验证,配合JMX RMI将会导致远程代码执行.亚信安全网络攻防实验室在第一时间研究并复现该漏洞,确认该漏洞真实存在.

### CVE编号
CVE-2020-1952

### 漏洞威胁等级
高危

### 影响范围
0.9.0 
0.9.1 
0.8.0
0.8.2

### 漏洞验证
使用受漏洞影响的版本进行验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/7a411783-0543-4187-7f23-05da6224bc3e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/c14d63a7-ff8f-7528-1249-eba87d4d5494.png)

### 修复建议
1.禁止`31999`的RMI端口对外开放
2.升级至0.9.2

### 时间轴
[0] 2020/04/28 亚信安全网络攻防实验室研究并复现该漏洞发布漏洞预警

### Reference
https://nvd.nist.gov/vuln/detail/CVE-2020-1952
https://seclists.org/oss-sec/2020/q2/73
Oracle Linuxのメリット、デメリット

#はじめに
不人気ディストリビューションであるOracle linuxですが、メリットも多いのでみんな使うといいよー

RHELクローンであり、操作性含めRHELと差がありません
私は業務でも利用していますが、特有のトラブルは発生したことがありません

#メリット
①RHELと完全互換性があると、オラクルは申しておる
　RHELと同じカーネルを利用
　/etc/redhat-releaseを見てもred hat enterprise linux～と出てくる(OSを確認するソフト対策？)
　Oraclelinuxのバージョンが知りたい場合、/etc/oracle-releaseを確認
　Unbreakable Enterprise Kernel？そんなものは知らない

②CentOSよりリリースが迅速
　Redhatが修正をだしてから、1日とかでOracleも追従する
　CentOSは結構時間がかかることも

③無償で使え、必要に応じてサポート契約を締結できる
　検証環境は無償、本番環境はサポート契約するという使い方ができる
　本番はRHEL、検証でCentOSを利用するという突っ込まれポイントを回避
　※サポートを利用した事がないので品質は不明です。。。

④RHELよりサポート費用が安い
　Redhatの半額程度

⑤RHELからコンバート可能
　下記リンク通り、コンバートスクリプトが提供されている
　https://linux.oracle.com/switch/

#デメリット
Oracle製である

#結論
デメリットはでかい
テスト自動化「いいものもある、だけど悪いものもある」まとめ


テストをすべて自動化するとバラ色の人生が待っているように思えますが、
「美人は3日で飽きる」というように（← 例えが変、、）
[「いいものもある、だけど悪いものもある！」](https://youtu.be/3N4IOg3AcQw)（← from スネークマンショー、古い！）
というのが現実です。

つまりは、自動テストと手動テストの特徴を理解して、ただしくどちらで実行するべきか、を判断する必要があります。

<h2>自動テストと手動テストの比較表</h2>
元ネタはこちら[Automation Testing Vs. Manual Testing: What’s the Difference?](https://www.guru99.com/difference-automated-vs-manual-testing.html)
わかりやすいように若干意訳してます。

| 比較内容 | 自動テスト | 手動テスト | 個人的な補足 | 
|:--|:--|:--|:--|
| 作業時間 | 手動テストよりも高速で実行できる| 時間がかかり、人的リソースが必要 | 必ずしも自動テストの方が高速でテスト実行できるとは限らない。内容によっては手動でやった方が早い場合もある | 
| 探索的テスト | 向いてない | 可能。向いている |手動テストのでの効果はテスターのスキルにも依存する|
| 初期投資 | 初期投資は高くつくが、長期的にみると費用対効果は優れている | 初期投資は自動テストに比べると少なくすむ。費用対効果は長期的に自動テストと比較すると低くなる |
| 信頼性 | ツールやスクリプトで実行される為、信頼できる結果を得られます.テストによって疲れることもない | 人的ミスが発生する場合がある為、正確ではない場合がある |
| UI変更 | 少しのUI変更でも自動テストスクリプトを修正する必要があります | 少しのUI変更は手動テストの実行を妨げません |
| 投資 | 自動テストツールと、自動テストエンジニアへの投資が必要 | 人的リソースへの投資が必要 |
| 費用対効果 | 少量のリグレッションテストを自動化した場合は費用対効果が悪い | 大量のリグレッションテストを実行する場合、費用対効果が悪い |
| 結果の見易さ| 自動テストでは、関係者全員が自動テストシステムへログインし、結果を確認することができる | 手動テストでは通常、ExcelやWordに記録され、テスト結果はすぐに確認できません |手動テストもgoogleスプレットシートとか使えば関係者全員がいつでもすぐに結果を確認できないこともない|
| 定性的な評価 | 自動テストは定性的な評価は含まれません。その為、使いやすさや顧客満足度を評価することはできない | 手動テストは定性的な評価を可能にし、ユーザーフレンドリーなシステムの開発に貢献するかもしれない |
| 性能試験 | ロードテスト、ストレステスト、スパイクテストなどの性能試験は自動で実行できるツールを使うのが一般的 | 手動テストでは、性能試験はできません |テスターを何千人も用意すれば手動でもできないこともないかもしれませんが、現実的ではない|
| 並行実行 | 自動テストは例えば、異なるブラウザを同時に並行して実行するなど、並行実行が可能 | 手動テストは並行実行が可能だが、人的リソースが必要でコストもかかる |
| バッチによるテスト実行 | 複数のテストスクリプトをバッチ処理し、毎晩実行することができます | 手動テストではバッチによるテスト実行はできません |
| プログラミング知識 | 自動テストではプログラミング知識は必須です | 手動テストではプログラミングする必要はない | 自動テストもGUIだけで実現できるものもありるので、必ずしも自動テストでプログラミングスキルが必要、というわけでもない|
| セットアップ | 自動テストではそれほど複雑ではないが、テスト実行設定が必要 | 手動テストは自動テストより簡易的な設定が必要 |複雑か、簡単か、はその人のスキル、主観にもよる|
| エンゲージメント | ツールで行う為、正確でうんざりすることがない | 繰り返し実行すると、うんざりした気持ちになりミスを起こすこともある |
| 理想的なアプローチ | 同じテストケースを頻繁に実行する場合、最適です | テストケースを1-2回の実行で良い場合、最適です |
| ビルド時のテスト | 自動テストはビルド時のテストに貢献します | 手動テストには向いてなく、やったとしても時間がかかります |
| 締め切り | 自動テストは事前に決めた締め切りを見逃すリスクはない | 手動テストは事前に決めた締め切りを見逃すリスクがある |自動テストも、実行するのを人が忘れる、または実行をセットアップしておくのを忘れる、というリスクもないことはない|
| フレームワーク | 自動テストは、データドリブンやキーワード、ハイブリッドなどのフレームワークを使用し、効率的に進めることができる| 手動テストはフレームワークを使わないが、ガイドライン、チェックリスト、ルール化したプロセスなどを利用し、効率的にするこはできる |
| ドキュメンテーション | 自動テストはドキュメントとしても機能し、特に、ユニットテスト自動化の為のトレーニング資料としても価値を提供する。新規で開発者がJoinした際、ユニットテストケースを確認すると、コードベースを素早く理解することに貢献する | 手動テストのテストケースはトレーニング資料としての価値は提供しない|
| テスト設計 | 自動テストでの単体テスト設計はテスト駆動開発の中で行う | 手動テストでの単体テスト設計はコーディングプロセスの中では行わない |
| DevOps | 自動テストはビルド検証テストに役立ち、DevOpsサイクルの不可欠な部分です | 手動テストは、DevOpsの自動化されたビルドの仕組みを崩壊させます |
| いつ使う？ | 自動テストは、回帰テスト、パフォーマンステスト、負荷テスト、また、何度も繰り返す機能テストケースに適しています。 | 手動テストは、探索的テスト、ユーザビリティテスト、およびアドホックテストに適しています。 テスト対象が頻繁に変更される場合にも使用する必要があります。 | つまりはこの項目に判断材料は集約されている気がする・・・|


<h2>参考文献</h2>
* [Automation Testing Vs. Manual Testing: What’s the Difference?](https://www.guru99.com/difference-automated-vs-manual-testing.html)
ORACLEの空文字の扱いにハマった話。


# とあるアプリの構築時に出してしまったバグ。
* 以下のSQL/SELECTで、メアドの有無が正しく拾えない。

``` SQL
(
  CASE
    WHEN  e_mail_address    IS NOT NULL
          AND
          e_mail_address    != ''
    THEN  1
    ELSE  0
  END
)                       AS has_e_mail_address
```
  
# 調べてみたら、こんな記事が見つかった。
* [http://blog.livedoor.jp/i_am_best/archives/7870002.html](Oracle では文字長 0 の文字型カラム値は勝手に NULL になってしまう!?)
  * どうやらORACLEは、「''」をNULLとして扱うらしい。

# 検証してみる。

  ```
  SELECT
       (CASE WHEN TRIM(' ')            = ''    THEN 1 ELSE 0 END)  AS TRIM_SPACE_EQUAL_EMPTY,          -- 0
       (CASE WHEN TRIM(' ')            = NULL  THEN 1 ELSE 0 END)  AS TRIM_SPACE_EQUAL_NULL,           -- 0
       (CASE WHEN TRIM(' ')            IS NULL THEN 1 ELSE 0 END)  AS TRIM_SPACE_IS_NULL,              -- 1
   --  (CASE WHEN TRIM(' ')            IS ''   THEN 1 ELSE 0 END)  AS TRIM_SPACE_IS_EMPTY,             -- ERROR
       (CASE WHEN REPLACE('A','A','')  = ''    THEN 1 ELSE 0 END)  AS REPLACE_TO_EMPTY_EQUAL_NULL,     -- 0
       (CASE WHEN REPLACE('A','A','')  IS NULL THEN 1 ELSE 0 END)  AS REPLACE_CHAR_TO_EMPTY_IS_NULL,   -- 1
   --  (CASE WHEN REPLACE('A','A','')  IS ''   THEN 1 ELSE 0 END)  AS REPLACE_CHAR_TO_EMPTY_IS_EMPTY,  -- ERROR
       NULL                                                        AS dummy
   FROM
       DUAL
  ```
* ヒントを元に考えると、この書き方が正しい様子。テスト結果もOKになった。

```
NVL2(TRIM(e_mail_address), 1, 0)
```
  
# 雑感
* こんなん、他のDB触ってた人は絶対間違えるがな…。
ソフトウェアテスト教科書 JSTQB Foundation 第4版 シラバス2018対応の参考文献一覧 

# はじめに
JSTQBの教科書に時々参考とした、あるいは参考にしたほうが良い文献がちらほらと出てくるが
巻末にまとめられておらず、後々いざ調べようとした時に何を参考にすると良いのだっけ？とわからなくなりそうなため　
リスト化することにした。
被ってたら許してくれめんす

文献の詳細は省略す。

参考文献が一つでもあるのであれば
巻末にまとめてくださいお願いしますなんでもし...

# 参考文献リスト
◆1章 テストの基礎
・[基本から学ぶソフトウェアテスト -- テストの「プロ」を目指す人のために](https://www.amazon.co.jp/%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88-Cem-Kaner/dp/4822281132)

・[ソフトウェアエンジニアリング基礎知識体型 -SWEBOK V3.0](https://www.amazon.co.jp/dp/4274505219/ref=cm_sw_r_tw_dp_U_x_QT5PEbTY8HKRP)

◆2章 ソフトウェア開発ライフサイクル全体を通してのテスト
・[高信頼化ソフトウェアのための開発手法ガイドブック](https://www.amazon.co.jp/dp/4990536398/ref=cm_sw_r_tw_dp_U_x_qW5PEbFR61M9M)

◆3章 静的テスト
・[ピアレビュー 高品質ソフトウェア開発のために](https://www.amazon.co.jp/dp/489100388X/ref=cm_sw_r_tw_dp_U_x_fZ5PEb95DT4FT)

・[ソフトウェアインスペクション](https://www.amazon.co.jp/dp/4320097270/ref=cm_sw_r_tw_dp_U_x_RZ5PEb2PHJV7N)

・[The effectiveness of software development technical reviews: A behaviorally motivated program of research](https://www.researchgate.net/publication/3188056_The_effectiveness_of_software_development_technical_reviews_A_behaviorally_motivated_program_of_research)

◆第4章 テスト技法
・[ソフトウェアテストの技法 第2版]
(https://www.amazon.co.jp/dp/4764903296/ref=cm_sw_r_tw_dp_U_x_I35PEbHGW3PEW0)

・[ISTQBテスト技術者資格制度Advanced Levelシラバス(日本語版) 「テストアナリスト」](http://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TA_Version2012.J01.pdf)
(PDF注意)

・[ステップアップのためのソフトウェアテスト実践ガイド 改訂版](https://www.amazon.co.jp/dp/4822229998/ref=cm_sw_r_tw_dp_U_x_P65PEbSM7EYZ3)

・[ソフトウェア・テスト PRESS vol.1](https://www.amazon.co.jp/dp/4774123978/ref=cm_sw_r_tw_dp_U_x_S75PEbK5DZ4PD)

◆第5章 テストマネジメント
・[基本から学ぶテストプロセス管理 コンピュータシステムのテストを成功させるために](https://www.amazon.co.jp/dp/482228199X/ref=cm_sw_r_tw_dp_U_x_R95PEb7ZPB5FG)

・[Foundation Level Extension シラバス アジャイルテスト担当者 日本語版](http://jstqb.jp/dl/JSTQB-SyllabusFoundation-AgileExt_Version2014.J01.pdf)
(PDF注意)

・[熊とワルツを リスクを愉しむプロジェクト管理](https://www.amazon.co.jp/dp/4822281868/ref=cm_sw_r_tw_dp_U_x_9.5PEb6772N0X)

・[リスク分析工学 FTA,FMEA,PERT,田口メソッドの活用法](https://www.amazon.co.jp/dp/4621076027/ref=cm_sw_r_tw_dp_U_x_4a6PEb4RR8EB0)

・[体系的ソフトウェアテスト入門](https://www.amazon.co.jp/dp/4822282074/ref=cm_sw_r_tw_dp_U_x_hc6PEbM02ZHM90)

おわり
[Linux][初期設定][Flutter] まとめ

[[android] AVDがpermission deniedで使えない時](https://qiita.com/osorezugoing/items/77d3d4dad1507089dc3d)

[[flutter] sdkmanagerの入れ方](https://qiita.com/osorezugoing/items/a16517660d2b29347f8b)

[]()

[]()

[]()

[]()