OmniAICreator/Qiita-1.07M huggingface dataset:
Windows7のロック/アンロック時をトリガーにPOSTイベントを投げる

「Windows7のログオン/オフをトリガーにPOSTイベントを投げる」[^2]
では、ロック/アンロックを契機にPOSTできなかった。

以下は、ロック/アンロックを契機にPOSTイベントを投げる方法を記述する。

# TL;DR
タスクスケジューラに「ワークステーション ロック/アンロック時」時に
プログラムを開始を開始するタスクを追加する。
プログラムは、Power Shell ScriptによるInvoke-RestMethodコマンドの実行。

# 環境
Windows 7 Professional SP1 64Bit

# 準備
Power Shell v3.0 をインストールする[^1]

# POSTイベントを投げるスクリプトの作成
任意のエディタで `<ファイル名>.ps1` を作成する。

```
Invoke-RestMethod -Uri "YOUR URL" -Method POST
```

# スクリプト登録
## ファイル名を指定して実行
```
taskschd.msc
```

## 新規タスクを作成
メニューバー【操作】→ 【タスクの作成】を押下し、画像の画面を開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82600/a8857f46-b503-ec8c-b4e1-6741d3af5a83.png)

## タブ「全般、トリガー、操作」を設定
### タブ「全般」
名前： `ログオン時に開始する ほにゃらら スクリプト`

### タブ「トリガー」
【新規】を押下

タスクの開始： `ワークステーション アンロック時`
特定のユーザ: `チェック。(必要があれば、ユーザの変更をしてください)`

### タブ「操作」
【新規】を押下

操作： `プログラムの開始`
プログラム/スクリプト： `powershell`
引数の追加： `-ExecutionPolicy RemoteSigned -File C:\Windows\System32\GroupPolicy\User\Scripts\Logon\<ファイル名>.ps1`

FileのPATHはどこでも良いので絶対PATHで記述してください。
上記PATHは、参照ボタンを押下したときのディレクトリです。


[^1]: [Windows Power Shell 3.0 を Windows7 にインストールする手順](https://qiita.com/busonx/items/9e88804e6b85432e827a)
[^2]: [Windows7のログオン/オフをトリガーにPOSTイベントを投げる](https://qiita.com/byuu/items/1ed1aa654a74fb158530)
[^3]: [Powershellを楽に実行してもらうには](https://qiita.com/tomoko523/items/df8e384d32a377381ef9)
Windowsでルート設定変更

IPアドレス制限をしている場合に、VPNを使ってルーティング情報が変更されてアクセス元が変更された場合に接続ができなくなることがないように設定変更をする。

## コマンド

```
route -p add aaa.bbb.ccc.ddd MASK 255.255.255.255 172.16.0.1 METRIC 1 IF 19
```

## 注意点

* 管理者権限が必要である
* aaa.bbb.ccc.ddd は、アクセス先
* アクセス先にはドメイン名は指定できないかも
* 172.16.0.1 は、ゲートウェイ
* METRIC は、大体 1 を指定？
* IF 19 の 19 は、`route print` で出力されたデバイスの一覧から該当するデバイスのIDを引用
* -p で再起動後も設定を保持
(a == 1 && a == 2 && a == 3) を演算子オーバーロードで常に真にする C#編

[(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8) が話題になっていたような気がしたのでC#で解いてみます。
getterで++使えば一瞬やで！

…と思ったら[先人](https://qiita.com/Marimoiro/items/983a966a01da23e2fdea)がいたので別解を目指します。

# 演算子のオーバーロード

C#も演算子のオーバーロードを使うことができるのでこちらを用います。

とりあえず次のようなクラスを作成します。

```C#:MagicNumber
public class MagicNumber
{
    public MagicNumber(int n)
    {
        Value = n;
    }

    public int Value { get; set; }
}
```

このMagicNumberに常にtrueとなる`==`演算子を実装すれば何とかなるわけです。
演算子は`public static int operator +(MagicNumber a, int b)`のような形で実装できます。

しかし`==`演算子は単独では実装できません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147093/18fb1da3-6f97-d504-c217-47c8e75fd3b8.png)

`!=`演算子も一緒に実装してやる必要があります。

```C#:MagicNumber
public class MagicNumber
{
    public MagicNumber(int n)
    {
        Value = n;
    }

    public int Value { get; set; }

    public static bool operator ==(MagicNumber a, int b) { return true; }

    public static bool operator !=(MagicNumber x, int y) { return true; }
}
```

これで`==`でも`!=`でも常にtrueを返す演算子が作れました。

…といいたいところですが、このままでは警告が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147093/12ef265d-dad5-7b7c-742f-85ca99cf27a3.png)
`==`演算子と`!=`演算子を実装するには`Equals()`と`GetHashCode()`も実装することが推奨されるようです。

そんなわけで最終的にはこうなりました。

```C#:MagicNumber
public class MagicNumber
{
    public MagicNumber(int n)
    {
        Value = n;
    }

    public int Value { get; set; }

    public static bool operator ==(MagicNumber a, int b) { return true; }

    public static bool operator !=(MagicNumber x, int y) { return true; }

    public override bool Equals(System.Object obj) { return true; }

    public override int GetHashCode() { return Value ^ Value; }
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147093/e3d40638-ab56-bb48-e3c0-7e6d225d11ff.png)
やったね。

# 参考
[演算子のオーバーロード (++C++; // 未確認飛行 C)](http://ufcpp.net/study/csharp/oo_operator.html)
[Equals() と演算子 == のオーバーロードに関するガイドライン (C# プログラミング ガイド)](https://msdn.microsoft.com/ja-jp/library/ms173147%28v=vs.90%29.aspx)
Arduino,Ardublock でアンダースコアが表示されない on Ubuntu Linux

ワークショップ用のPCを用意したい。WindowsだとメンテナンスコストがかかりすぎるのでLinuxで運用したいが、ちょっと問題が。

Ubuntu 16.04で確認した現象。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/9a1d5a7f-7f6a-3078-7592-090ee5122cf5.png)

これは、「under_score」という変数名であるが、アンダースコアが表示されていない。


Ardublockについても同様だ。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/e96c4279-e2b6-242a-9e9e-a2f138f4f99a.png)

これの直し方。

# ArduinoIDE
 

「ファイル」→「環境設定」で、「エディタの文字の大きさ」が標準では12になっているのを変更する。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/1fa2244d-8021-1e54-254a-bc74b965d625.png)

13にしたところ、表示されるようになった。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f9bd4f3e-4f15-f623-cd81-dd3f19eb528e.png)

しかしながら、20とかだと表示されない。フォントサイズ0-25の範囲で調べてみたら、

0-1,6-12,16-20 ×
2,5,13,14,15,21-25 ◯

だった。

なお、フォント名を変更するには、
ファイル→環境設定
で、
「以下のファイルを直接編集すれば、より多くの設定を行うことができます。
/home/(username)/.arduino15/preferences.txt」
とある。
ポータブル環境などでは、こうなる。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/2b8944d3-dc12-f91b-722a-57a9107b690b.png)

該当箇所をエディタで開き、
editor.font=Monospaced,plain,12
となっているのを変更する。

# Ardublock

これは設定ファイルなどは見つけられなかったので、コードを修正する。
コンパイルについては、こちらの通り。
https://qiita.com/nanbuwks/items/dde4270eade41f8b75ec

このうち、
OpenBlocksの


./src/main/java/edu/mit/blocks/renderable/BlockLabel.java

中、

```

    public final static Font blockFontSmall_Bold = new Font("Monospaced", Font.BOLD, 7);
    public final static Font blockFontMedium_Bold = new Font("Monospaced", Font.BOLD, 10);
    public final static Font blockFontLarge_Bold = new Font("Monospaced", Font.BOLD, 12);
    public final static Font blockFontSmall_Plain = new Font("Monospaced", Font.PLAIN, 7);
    public final static Font blockFontMedium_Plain = new Font("Monospaced", Font.PLAIN, 10);
    public final static Font blockFontLarge_Plain = new Font("Monospaced", Font.PLAIN, 12);
    private LabelWidget widget;
```


blockFontLarge_Bold
blockFontLarge_Plain
これをそれぞれ13にして、コンパイルし直し。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/f76c2c9b-a86b-1dbd-aee1-231d233bd5e1.png)

表示されるようになった。

# 解決していない問題

単体で実行時には問題ないのだが、ArduinoからArdublockを呼び出した場合編集中にボックスがホワイトアウトしてしまう。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/0c1c9234-e2d6-d271-eb36-66665ad07ec2.png)
ArduinoJson Assistant

Arduinoの開発環境でJsonを扱うライブラリは何種類かあるようですが、私は[「Prototyping Lab」](https://www.oreilly.co.jp/books/9784873117898/)でも出てきたので、ArduinoJsonライブラリを使用しています。
Jsonフォーマットのデータ構成をプログラムするのですが、データがネストしてくると確認が面倒になってきます。
ArduinoJson Assistantという公式ツールを使うと、このあたりの準備が簡単にできたので、ここにメモしておきます。

ArduinoJsonの基本的な使い方は公式サイトを参考にしてください。　→　http://arduinojson.org/doc/
ArduinoJsonを使用する際に必要な準備は以下となりますが、ArduinoJson Assistantを使うことでコードが自動で生成できます。

ArduinoJsonの準備手順

1. ヘッダインクルード
2. JsonObject用のメモリー確保
3. JsonObjectの作成(以下のどちらか)
    1. JsonファイルをパースしてObjectを作成する方法 
    2. JsonObjectを作成して、要素を追加していく方法
　　

以下のSample.Jsonファイルから、ArduinoJson Assitantを使用してコードを生成してみます。

```Sample.json
{
  "sensor": "gps",
  "time": 1351824120,
  "data": [
    48.75608,
    2.302038
  ]
}
```

・まずはArduinoJson Assistantを開きます。
http://arduinojson.org/assistant/

・開いたページの[Input]という欄に先ほどのJsonファイルをコピペします。(今回のデータは公式サンプルなので最初から入っています。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165672/278ef4e8-adfa-7ce7-961f-6aa7d5a1e099.png)

入力すると、[JsonBuffer size]、[Parsing program]、[Serializing program] の中に必要な情報が出てきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165672/0a5a763a-ad1a-5989-94fd-1f9f2fe11225.png)

それぞれ
[JsonBuffer size]　　　確保すべきメモリー量
[Parsing program]　　　JsonフォーマットからJsonObjectを生成するコード　最初に書いた手順の(3.1)に相当するコード
[Serializing program]　JsonObjectから、データ構成を生成するコード　最初に書いた手順の(3.2)に相当するコード

ここで生成されたコードを組み込めば、ArduinoJsonでデータを扱う準備ができます。
データの構成ができたら、[「API Reference」](http://arduinojson.org/api/)などを参考に、set(),get()等でデータを扱えます。
こういったツールで簡単にデータ構成を構築できるのはとても便利ですね。
【FileMaker】続・ユーザマスタからログインする定番な方法〜ログインユーザを表示したい

様々な方からご覧いただいている、「[ユーザマスタからログインする定番な方法](https://qiita.com/tyuma/items/7913c6ef208f2ba40bcc)」、コメントでお題をいただきましたので、続編として掲載します。

このファイル、まだあるのかな〜？と思ってフォルダを検索したら、まだありました。
えらい、私。
FileMaker 13バージョンで作成しましたが、MacOSをアップデートしたら新しいOSで13バージョンが起動できなくなったので、14にてお送りします。

お題は、「ログインしたユーザ情報を表示したい」です。

では、先のページのファイルに追加していきます。
というか、すでに追加されてました。
その後、編集したらしい私、ますますえらい。

# 動き
FileMakerにログインした際、ダイアログボックスにログインユーザ名とともにwelcomeメッセージを表示し、表示したレイアウトにログインユーザ名を表示する、という流れです。

<img width="523" alt="20180123_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/fb3d79ed-8030-590b-9292-db7eaa5d428f.png">

#　実装
では、実装を見ていきます。

ログイン後のユーザ情報を保存するフィールドを、ユーザマスタにグローバルフィールドで設定します。
<img width="581" alt="20180123_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/afbe7c4b-9c2e-a5a2-6485-cf1cb0631d4f.png">
ちなみに、必ず同じユーザマスタでないとだめ、ということはありません。
システムでログインしているユーザ情報をいくつか持ち歩く必要がある場合は、別にテーブルを作った方が見やすいし管理しやすいと思います。

表示したいレイアウトに、マージフィールドなどで新規追加したユーザ情報のフィールドを配置します。
<img width="516" alt="20180123_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/64f20e39-51a2-f1e9-5560-1140b8fadb01.png">
単にフィールドを配置したまま、入力可能な状況になっている場合は、改ざんされてしまう可能性が高いので、いじられたくないフィールドは、入力不可にするか、マージフィールドを使うといいですよ。

ログイン時に起動するスクリプトに、ログイン情報を保存する処理を入れます。
<img width="583" alt="20180123_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/8e1c61a6-bbf8-2802-b4e9-4b7830cada31.png">

作成したスクリプトを、ファイルオプションのスクリプトトリガのOnFirstWindowOpenで指定します。
<img width="520" alt="20180123_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/726f52fd-1ab1-d400-2540-2900cf118355.png">
このトリガは、最初にファイルを開いたときに動くスクリプトを指定するので、ログイン直後になります。

もし、最初に表示したいレイアウトがある場合は、同じくレイアウトも指定します。
<img width="524" alt="20180123_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/958ad0d4-212a-e279-c9d6-718df0d8a40e.png">
これは、メニュー画面を表示するときなど、システムの入り口にしたい場合に設定すると、見られたくない作業中のレイアウトなどを見られずに済みます。

# その他思ったこと
FileMakerのセキュリティ管理を使ったログイン管理は、やり方の一つです。
関数も用意されているので、容易に実装できます。
ただ、システムを使用するユーザが増えると、セキュリティ管理にたくさんの名前がズラーっと並ぶことになり、セキュリティ管理とユーザマスタの管理が煩雑になるかもしれません。
やり方によっては、セキュリティ管理を最小限に使ったやり方などもあり、FileMakerから提供されいている機能を使って頭をフル回転させると、「あぁ、こういうやり方もあるね！」とアハ体験ができます。

皆さんもぜひ、ログインのやり方に限らず、やりたいことの実装方法を多方面からみて実装してみてくださいね。（私含む）
EC-CUBEのSymfony検証ブランチで困った時に見るissue/PRメモ

# 概要
EC-CUBEのSymfony検証ブランチで困った時に見たissue/PRをメモしていこうと思います。

# インストール機能が実装されたPR（インストール手順あり）
[WIP] Use the Symfony #2698
https://github.com/EC-CUBE/ec-cube/pull/2698

# config関連の変更をまとめたissue
Symfony への移行に伴う config 関連の変更を整理する #2703
https://github.com/EC-CUBE/ec-cube/issues/2703

# 論理削除、物理削除について
論理削除の見直し #2314
https://github.com/EC-CUBE/ec-cube/issues/2314

# Entity/Form拡張関連
エンティティ/フォーム拡張の自動出力タグを埋め込み #3242
https://github.com/EC-CUBE/ec-cube/pull/3242

# E2Eテストについて
E2Eテストと共にあらんことを #3048
https://github.com/EC-CUBE/ec-cube/pull/3048

# 受注ステートマシンについて
受注ステートマシンの実装 #3325
https://github.com/EC-CUBE/ec-cube/pull/3325

# CSS, SCSSを修正したい時
スタイルガイドの統合 #2720
https://github.com/EC-CUBE/ec-cube/issues/2720#issuecomment-367960367

SCSS のビルド環境構築 #2863
https://github.com/EC-CUBE/ec-cube/pull/2863

# テンプレートへの介入方法
テンプレートへの介入方法の見直し #2440
https://github.com/EC-CUBE/ec-cube/issues/2440
【R】windows10 RStudio 外部ディスプレイのスケーリング

# serfacePro4(win10) × RStudio × 外部ディスプレイの相性

何人かの方が、表題の組み合わせで困っているみたいです。

[Windows 10 Scaling Issue](https://support.rstudio.com/hc/en-us/community/posts/206542168-Windows-10-Scaling-Issue)
[Windows 10 external monitor Scaling](https://support.rstudio.com/hc/en-us/community/posts/115008694048-Windows-10-external-monitor-Scaling)
[RStudio too small in Windows](https://www.reddit.com/r/rstats/comments/5giu1c/rstudio_too_small_in_windows_10/)


![スクリーンショット 2018-01-23 午前10.08.53.png](https://qiita-image-store.s3.amazonaws.com/0/143058/f71baa07-2678-eeeb-f9f0-88b950bb7196.png)

スクリプトを外部ディスプレイで編集したいときに、手元のwindowと外部ディスプレイのwindowのスケーリングが大きく異なってしまい、非常に使いにくくなってしまう場合があります。
(文字が小さすぎる・大きすぎる)

特にserfaceで長いコードを書くときは、外部ディスプレイは個人的に重要でした。


# 解決策


<strong>[Windows10 アプリを互換モードで実行する](https://pc-karuma.net/windows-10-apps-compatibility-mode/)</strong>

>互換モードとは、「Windows Vista」「Windows 7」「Windows 8」といった従来の Windows OS と互換性のあるモードでアプリを実行できる機能のことです。Windows 10 で実行したアプリの挙動が不安定で、おかしいなぁーと感じたら「互換モード」を使ってみましょう。


RStudioの<strong>プロパティ</strong>から、互換性のtabを選んで、以下の枠にチェックをいれます。

![互換性.png](https://qiita-image-store.s3.amazonaws.com/0/143058/8281fd45-7478-d5ab-cbaf-3c84280258aa.png)

これでディスプレイのスケーリングの問題は解決するかと思います。


参考にしていただければ
AWS負荷試験申請における注意点

今回負荷試験申請でいろいろ苦労したので、
AWSサポートに確認した内容をメモ。

**AWSのオフィシャルとしては全ての負荷試験に申請は必要。**

申請される際は下記注意点がある。
=========================================
• 申請できるテスト実施期間は最長48時間となる。
• テストの承認には最低2週間かかる。(余裕を持った申請が必要)
• DoS攻撃やそれに類するテストは許可されていない。
• 以下のインスタンスタイプ、インスタンスクラスをテストで利用することはできない。
**EC2: t2.nano, t1.micro, m1.small RDS: nano, micro, small**

また、負荷をかける側と受ける側で別のアカウントの用意も必要となりますので
実際に申請いただく際は2週間以上余裕を持って調整いただくことを推奨。
EC-CUBEのSymfony検証ブランチでcacheをclearする

# 概要

EC-CUBEではSymfony検証が行われています。
EC-CUBE3.0からcacheの削除方法が変わりましたのでメモしておきます。
EC-CUBE自体のインストール方法については[こちら](https://qiita.com/okazy/items/cf21ba1022f2284ba0d6)の記事をご覧ください。

# 方法1

consoleを利用

```shell
bin/console cache:clear --no-warmup
```

`--no-warmup` オプションがないとメモリサイズが足りないと怒られます。

# 方法2

`var/cache/` 配下を削除
AndroidアプリでLineのトーク履歴バックアップのインテントを受け取る

###概要
ラインのトーク履歴をテキストファイル（.txt）として別のアプリで受け取る方法

###目的
-　容量少なく履歴を保存する
-　バックアップとして保存しておく
-　ラインのバックアップでバックアップできない状況に保存する（osの変更、複数人のチャットの保存）

###ラインでのバックアップの仕方（Android）
トークリスト　->　設定表示　->　トーク設定　->　トーク履歴をバックアップ　->　テキストでバックアップ　->　目的のアプリを選ぶ

###方法
・Manifest
intent-fileterをインテントを受けるアクティビティ内に入れる。ラインがアクションを"android.intent.action.SEND_MULTIPLE"、mimeTypeを"text/*"で送ってくるので対応する。

```AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <data android:mimeType="text/*" />
</intent-filter>
```


permissionの設定をする（バージョンがJELLY_BEAN（１６）より上の場合の設定もアクティビティで行う）。

```AndroidManifest.xml
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```

・activity

マイムタイプとアクションが正しいのを確認してuriリストを入手する。リストの最初のアイテムがテキストファイル。Unchecked castの警告が出るので@SuppressWarnings("unchecked")で対応する。

```MyActivity.java
if (mimeType.equals("text/plain")){
　　if (Intent.ACTION_SEND_MULTIPLE.equals(i.getAction())){
            @SuppressWarnings("unchecked")
            ArrayList<Uri> uriList = (ArrayList<Uri>) i.getSerializableExtra(Intent.EXTRA_STREAM);
            Uri uri = uriList.get(0);
　　}
}
```

・その他
getPathでパスを得て、FileInputStreamなどを使ってトークヒストリーを使いたいように使う。
Drupal8のCKEditorで改行の挙動を入れ替える（PとBR）

Drupal8.4.4

変更前 193行目

```/core/assets/vendor/ckeditor/ckeditor.js
this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}},CKEDITOR.event.implementOn(CKEDITOR.command.prototype),CKEDITOR.ENTER_P=1,CKEDITOR.ENTER_BR=2,CKEDITOR.ENTER_DIV=3,CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"\x3c!DOCTYPE html\x3e",bodyId:"",bodyClass:"",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl("contents.css"),
```

変更後

```/core/assets/vendor/ckeditor/ckeditor.js
this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}},CKEDITOR.event.implementOn(CKEDITOR.command.prototype),CKEDITOR.ENTER_P=1,CKEDITOR.ENTER_BR=2,CKEDITOR.ENTER_DIV=3,CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_BR,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_P,docType:"\x3c!DOCTYPE html\x3e",bodyId:"",bodyClass:"",fullPage:!1,height:200,contentsCss:CKEDITOR.getUrl("contents.css"),
```

enterMode:CKEDITOR.ENTER_BR
shiftEnterMode:CKEDITOR.ENTER_P
に書き換えています。
AWSのサポートに入ってみた

# 前提条件

AWS を月に$20,000ぐらい使っていて、使用開始をしてそろそろ5年
その間に色んなサービスが出ては消えて、何が何だか分からなくなってきた
また、ここ数年AWS が頑張りすぎてて、新しい機能を十分に使えてるとは限らない状態
AWSサポートを導入しての迅速なサポートを受けたいのと、コスト削減をしたくなった

# 導入の障害

予算。。。

# プランの比較検討

https://aws.amazon.com/jp/premiumsupport/compare-plans/

|| 開発者| ビジネス | エンタープライズ |
|-----|-----|-----|-----|
|メリット|安い|中間なので日本人的に選択しがち|TAMとやりとり出来る。|
|デメリット|サポートケース作成者が一人だけ。AWS Trusted Advisorが4項目だけ|中間なので日本人的に選択しがち|高い|

# 月額料金の比較

![スクリーンショット 2018-01-23 10.22.26.png](https://qiita-image-store.s3.amazonaws.com/0/200155/0b94896f-45fa-6cfc-e297-57c55f135c82.png)

月額 20,000USD のアカウントとして計算

| 開発者| ビジネス | エンタープライズ |
|-----|-----|-----|
|600USD|2,000USD|15,000USD|

## 注意事項

> デベロッパーサポートプラン、ビジネスサポートプランまたはエンタープライズサポートプランにサインアップしたときに既存のリザーブドリソースがある場合、予約期間で案分計算されるリザーブドリソースに対する 1 回限りの料金 (前払い) が、AWS サポートの最初の月の料金計算に含まれます。

月額料金、今の金額だけで比較すると罠が仕組まれているので、
リザーブドリソースがないかどうかは確認した方が良い
ちなみに弊社は買ってなかった。。。。

# サポートに対する弊社技術陣の要望

+ AWSを使用してる人は誰でもサポートと連絡取りたい。AWSと繋がってる人を経由するのは時間が勿体無い
+ 日本語で回答しれくてると嬉しい
+ 一次回答はなるべく早め（出来れば当日中）に欲しい
+ [AWS Trusted Advisor](https://aws.amazon.com/jp/premiumsupport/trustedadvisor/)を全項目みたい

# これって。。。

要望をまとめると、エンタープライズだと十分すぎて、開発者プランだと足りない
もはやビジネスプラン一択な状態。。。
比較検討の余地もない。。。

そんなわけでビジネスプランに加入してみました

# 加入して最初にやったこと

まずは[AWS Trusted Advisor](https://console.aws.amazon.com/trustedadvisor/home?region=us-east-1#/dashboard)ですよね

画面開いたらまずこの表示が出てきました

![____________________________2017-12-22_13.59.53.png](https://qiita-image-store.s3.amazonaws.com/0/200155/7790481d-70ce-6c8e-8742-8876f2867929.png)

早くも4,000USDの節約。。。。

2,000USDのために色々検討したのにこれですよ。。。


皆様、ぜひ[サポート](https://aws.amazon.com/jp/premiumsupport/)に加入しましょう！
BASP21 でSMTP送信の注意点

▼備忘録
昔懐かしいシステムで送信エラーが発生しました。
原因は、smtpサーバーのセキュリティの変更だと思います。

BASP21 フリーソフト チェックすべきところは、

ポートを指定しているか
SMTPサーバーで587ポートを指定するには、
```smtp.hogehoge.com:587
```

接続パスワードの設定をしているか？です。

接続パスワードは、送信メールアドレスの後ろに Tab で区切って記述します。

```wkFrom = "<" & gMailAddr & ">" & vbTab & gAccountName & ":" & gPassWord
SendMail(gSMTPSV, subTo, wkFrom, subSubj, subBody, subFiles)
```

いまどき、BASP21なんて使わないと思うけど、まだメンテナンスしているユーザーがいるので、忘れないように記述しておきます。

▼BASP21 の メソッド一覧
http://www.hi-ho.ne.jp/babaq/basp21.html

---
▼Accessを使って、「Accessをクラウドで運用する方法」をブログで発信しています。
よろしければ、お立ち寄りください。

汎用データベース「カードボックス BARI」
http://access-cloud.hatenablog.com/entry/cardbox-bari
UI案、イラレやパワポで作るくらいなら、『Figma』

#Figmaとは

UIのプロトタイピングで名を馳せているSketchというアプリケーションがあるのは、アプリケーションやWEB開発に携わっていれば、知っている人も少なくないと思います。
しかし、SketchはMacOS専用で、Windowsユーザーでは、このソフトを使うのは障壁が高いと思います。
（というか、私が使ってみたいもののWindowsユーザーなので、とっつきにくかったです）

Figmaは、ブラウザ上でも編集可能でありながら、Sketchと同じような感覚でUI案を作れます。
**必要なのはGoogle chrome　ブラウザだけ！** (Windowsのアプリケーションもあります）
本格的にデザイナーへ投げる前に、要件の洗い出しのためのイメージ共有の際に、使えるツールになるのかな、と思います。

（この記事は、初めて知る人が10分後には使用開始できるお手軽感を目指しています。　
　やれること全て網羅する説明書的なものにはならないと思います。）

#Figmaで出来ること

※Sketchなどを使ったことない人向けのため、「Sketchよりも～～」というような視点はまったくありません。
単純にFigmaを使っていて、こんな風にやる、という方法をいくつかまとめておこうと思います。

徹底比較などを見たい方、以下などが参考になります。（thinkitに飛びます）
https://thinkit.co.jp/article/11619

##準備

下記の公式ページにアクセス。
（※GoogleでFigmaと検索するとキュートなフィギュアメーカが引っかかります）
https://www.figma.com/

Googleアカウントでパスワード設定するだけなので、すぐに触り始めることが出来ます。

公式ページの説明や動画で大体つかめるかもしれませんが、簡単につかい方を紹介します。

##初手から簡単なフレームをつかえる

これは主にスマートフォンアプリなどのデザインの際に有効です。
イラレでアートボードを、それぞれの端末のサイズにするのは、慣れていれば大して面倒でもないように思いますが、初心者がやるにはひと手間かかるかと思います
（私はアートボードという概念にたどり着くまで少し時間を要しました）


![figma1.png](https://qiita-image-store.s3.amazonaws.com/0/200222/f96d2cd9-bc1b-3f6b-c480-a8c86fd1500a.png)

![figma2.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/29249935-c169-bf82-ceca-00d6e1ce4b53.png)


![figma 3.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/018a561a-22a9-b327-4fb1-4e2bcb28dff8.png)

**直感的で簡単！**



##パワポみたいに操作子を配置していける
余談ですが、私は学生時代、ゼミ資料や報告書で使う実験器具の図などは、Microsoft製品やOpenOfficeの図形機能で、積み木のようにグループ化して作っていたこともあり、現在でもそのような方法で作りがちです。
ですので、figmaなどのツールを知る前は、パワーポイントでワイヤーフレームみたいなものを作っていました。
（パワポは工夫すればアニメーションの組み合わせでプロトタイプ的に動かすことも出来、その点では重宝していましたｗ）

![foigma4.png](https://qiita-image-store.s3.amazonaws.com/0/200222/ae2bb0d5-b883-2904-60ec-537b16b5c41a.png)

![figuma 5.png](https://qiita-image-store.s3.amazonaws.com/0/200222/1b7e12f1-c2c3-5956-7cb1-9639bde2f1a2.png)



##ベクトル図形変形

さらに、ベクトル図形をぐいぐいっと引っ張って好みの形に変形することも出来ます。
![figma6.png](https://qiita-image-store.s3.amazonaws.com/0/200222/cf726e42-e9a0-051a-33b5-c3c3ca21e7d9.png)

![Figma 7.png](https://qiita-image-store.s3.amazonaws.com/0/200222/b5ea57fb-ea3b-1843-ccbc-d2056507d182.png)
**■丸の図形を上に引き伸ばしています。**

![figma8.png](https://qiita-image-store.s3.amazonaws.com/0/200222/bc0be9f7-a2b7-34a3-f54f-8b08e5654887.png)
**■曲線の編集**


イラレで資料作っていた時は、ペンツールになじめず苦労しましたが、これはかなり簡単でした

##画面遷移をプロトタイピング
![figma 9.png](https://qiita-image-store.s3.amazonaws.com/0/200222/4facdd1a-2c74-7ff8-774e-5ad0b3c2991b.png)

**■どのボタンを押すと、どんな画面へ飛ぶかなど、フローで簡単に書くことができます。**

##プレビュー

![Figma10.PNG](https://qiita-image-store.s3.amazonaws.com/0/200222/8cf8ecd9-d460-2ca1-5500-f04b6749f7ff.png)

再生ボタンを押すとプレビュー開始。
プレビューでは、ボタンを押したりすることで、画面遷移をさせることが出来ます。

パワポでリンクとかを貼るよりはるかに分かりやすく簡単です。


##そのほかできること

絵を使ったりの説明はしませんが、補足として。

●マルチオペレータで編集可能。複数人同時にアクセスすることで、リアルタイムで動かしあったり出来ます。
●パーツのコンポーネンツ作成。一度作ったボタンなどを簡単に使いまわせます。
●スライスの作成。デザイン要素を書き出す際に使えます。
●ZEPLINへの書き出し。コーディングする人によっては、便利機能としてつかうことが出来ます。


#終わりに

ブラウザで使えるとはいえ、細かい画面遷移の際のアニメーションや、凝ったデザインの作成には物足りないとは思います。

しかし、デザイナーではない人が、どんな風にしたいかを伝えるには十分な機能を兼ねそろえていると言えるのではないでしょうか。


**イラストレータやパワーポイント、Visio　などをいちいち立ち上げずとも、Chromeのお気に入りからサクサクデザイン共有！**
つかい方によってはかなり有力なツールだと思います。


#追記

とても分かりやすく、他ツールとの違いや利点、使い方を紹介している方がおりました
https://qiita.com/hikaru_tayama/items/49373412ec1a515ff05d

是非こちらもお読みください！
docker buildに失敗したimageへのアクセス方法

docker build時に失敗した場合に中身がどの状態なのかを確認したい場合

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amasok/test         1.1                 f0f37a3e695b        30 minutes ago      1.131 GB
amasok/test         1.0                 507b9f361bdd        About an hour ago   612.3 MB
<none>              <none>              ab29bda5a4a3        2 hours ago         551.1 MB
```

docker buildに失敗すると、上記のようにREPOSITORYとTAGが<none>のものが作られる。
IMAGE ID`ab29bda5a4a3`にログインしたい場合は以下のコマンドで可能


```sh
# docker run --rm -it <IMAGE ID> sh
docker run --rm -it ab29bda5a4a3 sh
```
Pythonで文字列がJsonフォーマットに則しているか判別する方法

関数が受けた文字列や読みだしたファイルがJsonフォーマットであるか判定したい場合。

例外はjson.JSONDecodeErrorで捕まえられます。
ValueErrorでもキャッチできますがほかの例外もまとめられてしまうので基本的にはjson.JSONDecodeErrorで例外処理を行いましょう。

```python3:json_exception
def isJsonFormat(line):
    try:
        json.loads(line)
    except json.JSONDecodeError as e:
        print(sys.exc_info())
        print(e)
        return False
    # 以下の例外でも捕まえるので注意
    except ValueError as e:
        print(sys.exc_info())
        print(e)
        return False
    except Exception as e:
        print(sys.exc_info())
        print(e)
        return False
    return True
```

print(sys.exc_info())の出力
\<class 'json.decoder.JSONDecodeError'>
JSONDecodeError('Extra data: line 1 column 5 (char 4)',)
\<traceback object at 0x000002228CEAF1C8>

print(e)の出力
Extra data: line 1 column 5 (char 4)
MavensMateでError initializing project: inactive organizationのエラーがでるときの対処法

久しぶりに改修依頼があったので、修正しようとしたらMavensMateで
[ERROR]: Request to the local MavensMate server failed. Error initializing project: inactive organization
のエラーとなったので、その対処法のメモ。

## 状況
MavensMateでEdit Projectをしようとしたら以下のエラーに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/12d9445f-1940-f251-a7c8-9e2f3b2a786a.png)


## 原因
多分Sandの環境をリフレッシュしたからだと思われる。

## 対応策
config以下にある.settingのinstanceUrlを変更した

```.setting
{
    "projectName": "XXXXX",
    (省略)
    "loginUrl": "https://login.salesforce.com/",
    "instanceUrl": "https://cs58.salesforce.com", <-もともとcs57だった
    "workspace": "C:\\Users\\NaotoKoyama\\workspace",
    (省略)
    ]
}

```
Go 言語でも (a==1 && a==2 && a==3) を true にしてみたい（クソリプ編）

元ネタ： [javascript - Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflow](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)

これに対する Qiita 記事のまとめが以下。

- [(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ - Qiita](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)

**結論から言うと思いつきませんでした** `orz` 理由は [Go言語]では演算子をオーバーライドできないし暗黙的な型変換もできないため。まともでないやり方なら何かあるかもしれないが思いつかなかった。

ただ [Perl での解](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)で

```perl
use strict;
use warnings;

my $a = 1;
my @a = (1, 2);
sub a { 3 };

if ($a == 1 and @a == 2 and &a == 3) {
    print "True!\n";
}
```

というのを見かけたので，こういう記述が許容できるのなら何とかなりそうである。すなわち channel を使って

```go
package main

import (
	"fmt"
)

func main() {
	a := make(chan int)
	go func() {
		for i := 1; ; i++ {
			a <- i
			i %= 3
		}
	}()

	if <-a == 1 && <-a == 2 && <-a == 3 {
		fmt.Println("True!")
	}
	if <-a == 1 && <-a == 2 && <-a == 3 {
		fmt.Println("True!")
	}
}
```

と[すればよい](https://play.golang.org/p/bEQbqJoQ54v) [^op]。お後がよろしいようで。

[^op]: 余談だが `a <- i` の `<-` は channel への送信を表す送信構文（send statement）のトークンで for 構文内の `<-a` の `<-` は channel からの受信を表す受信演算子（receive operator）である。演算子なので式（expression）に含めることができる。

[Go言語]: https://golang.org/ "The Go Programming Language"
会社で少し盛り上がった Project Euler をやってみる 002

# Problem 002
```
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
```

---

# Answer 002 (Python)

よりよい解答を[@shiracamus](https://qiita.com/shiracamus)さんからコメント欄に頂いていますのでそちらをご覧頂くのが良いと思います！

```python3
import numpy as np

class Problem2:

    LIMIT = 4000000

    def main(self):
        data = np.array([1, 2])
        i = len(data)
        while(True):
            item = self.fibo(data[i-2], data[i-1])
            if item > self.LIMIT: break
            data = np.append(data, [item])
            i = i + 1
        print(np.array([i for i in data if i % 2 == 0]).sum())


    def fibo(self, a1, a2):
        return a1 + a2


if __name__ == '__main__':
    p = Problem2()
    p.main()
```

---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
MVCのMとVとCの分け方について考えてみる

最近、MVCでM(モデル)とV(ビュー)とC(コントローラ)の境界が
自分の中で曖昧になっているなと思うので、
どのように分離されるべきかをこの記事に随時追記していくことにする。

2021/01/05 追記
おそらく、MVC自体は、
アプリケーションのイベント通達や処理フローの一連の流れを決定するもので、
それぞれの境界がどこかというのは、また別の話なのかもしれないです。
DDDやクリーンアーキテクチャをやっているうちに、私の中で考えがまとまったものだと思います。
なので、このタイトル自体すこし、気持ち悪いニュアンスなのかもしれないです。
ただ、私がそうだったように、
MVCでアプリケーションを作るってなったときに、
これはどっちに書くべきなのだろうという疑問が幾度となく出てきて、
悩んでしまう人に、すこしでもヒントになれば良いかなと思いタイトルはそのままにしておきます。
悩んで自分なりの答えをだせるのなら、その方が良いともおもったり。
（そもそも全然まだ記載できてないですが。）


また、MVCだけでなく、MVVMやMVPでも分ける単位的には対してはあまりどのアーキテクチャにしても、
影響はしないのではないかと思います。
それぞれ、CをVM,Pに置き換えれば、同じことが言えるのではないかと。


筆者環境 ```Java```,```SpringBoot```,```Thymeleef```

#MとV
スマートUIにならないように気をつける。
→http://d.hatena.ne.jp/minekoa/20100116/1263657955
##1.ビューに```==```は使わない。
例えば、Stateというenumがあって、

```html
<div th:if="${model.state == State.SUCCESS}">成功しました！<div/> 
```

とするのであれば、

```html
<div th:if="${model.isSuccess()}">成功しました！<div/> 
```
とした方が良いのではと思う。

でないと、
```model.state```と```State.SUCCESS```が一致した時、成功であるという、
ビジネスロジックがビューに染み出ているのではないかとおもいます。
そんなことはビューは知らなくて良いと思います。

##2.判断、加工はモデルに、表現の方法はビューに(WIP)

#MとC
##1.バリデーションの実行はビジネスロジック？コントローラー？（WIP）
バリデーションの持ち場所って難しいなとは思うのですが、
基本的にはバリデーションを行うのはプレゼンテーション層(View or Controller)で良いかなと思っています。
バリデーションで使用する、判断ロジックがドメイン固有のものなのであれば、
その処理だけをドメイン側(model)にもってくるというのが、
僕の中で今の所しっくり来てるんですよね。
ちなみにエラーを表示するのはViewで、エラーハンドリング、エラー画面へ遷移はControllerですね。
TODO：サンプル記載
UnityのNativePluginにNSStringをstringで返す方法

Objective-C++でUnityのNativePluginを作り始めたが、stringの返却でUnityごとクラッシュしてしまう問題に遭遇した。その原因と解決方法を記しておく。

追記：コメントでご教授頂いたのですが、この方法だと**メモリリーク**するようなので商用などデプロイする予定の開発では絶対に真似しないでください。機会があれば修正後のコードも出そうかと思いますが、多分先駆者がいると思うのでひとまずこのままで…。
（マネージド側で変換してくれるのでてっきり解放までしてくるのかと思いきや :sweat_drops: ←ちゃんと調べましょう）

# 原因
Objective-C++は`init`で始まる変数名を除いて基本的にautoreleaseされる。これにより、関数から返される`const char*`がアクセスできずにUnityごと落ちてしまうようだ。
NSStringを使って文字列を作った場合は要注意だ。

# 解決方法
`strdup()`を使って新たにメモリを確保すれば解決できる。自前で`malloc()`を使っても良いが、その必要があるケースは思いつかなかった。

```objc:MyUnityPlugin.mm
#import <Foundation/Foundation.h>

extern "C" {

    const char * StrdupWay() {
        NSString *result = @"subdup()を使ってUnityに文字列を返す";
        return strdup([result UTF8String]);
    }

    const char * MallocWay() {
        NSString *result = @"malloc()を使ってUnityに文字列を返す";
        char* result_p = (char*)malloc(result.length + 1);
        strcpy(result_p, [result UTF8String]);
        return result_p;
    }

}
```

```csharp:UnityNativePluginScript.cs
using UnityEngine;
using System.Runtime.InteropServices;

public class UnityNativePluginScript : MonoBehaviour {

    [DllImport("MyUnityPlugin")]
    private static extern string StrdupWay();

    [DllImport("MyUnityPlugin")]
    private static extern string MallocWay();

    // Use this for initialization
    void Start () {
        Debug.Log(StrdupWay());
        Debug.Log(MallocWay());
    }

}
```

# 参考文献
* https://qiita.com/tkyaji/items/74d485a021c75ed10bca
* http://hamasyou.com/blog/2010/10/12/objective-c-retain-release/
* https://stackoverflow.com/questions/3187014/when-converting-a-nsstring-to-a-char-using-utf8string-how-to-retain-it
swagger-codegenでAPIクライアントを生成するメモ

# swagger-codegenとは

[swagger-codegen](https://github.com/swagger-api/swagger-codegen)とは、[OpenAPI](https://github.com/OAI/OpenAPI-Specification)で書かれたAPI定義ファイルから、
APIクライアント(サーバスタブ)を生成するものです。

# どんなコードが生成されるの？ / 何の言語に対応してるの？

[template](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources)を見ましょう。

# 生成の仕方 （例: PHP）

## 1. インストール

https://github.com/swagger-api/swagger-codegen#compatibility
※ OpenAPIのバージョンに対応するバージョンをインストールしましょう。

## 2. 設定可能なconfigを確認し、jsonファイルで記述

### 確認
`swagger-codegen config-help -l`**`php`**

### 記述

```json:config.json
{
  "modelPackage" : "Model",
  "apiPackage" : "Api",
  "variableNamingConvention" : "camelCase"
  "artifactVersion" : "1.0.0",
  "hideGenerationTimestamp" : "true"
}
```

## 3. 元テンプレートをカスタマイズ

[template](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources)で、自分の使う言語のものをローカルにコピー, カスタマイズしましょう。

## 4. 生成しましょう

```bash
swagger-codegen generate \
  -l php \
  -i ./your-swagger-file.yml \
  -o ./ \
  -c ./config.json \
  -t ./templates
```

# 生成されたコードのライセンスについて

https://github.com/swagger-api/swagger-codegen#license-information-on-generated-code

> Generated code is intentionally not subject to the parent project license
> When code is generated from this project, it shall be considered AS IS and owned by the user of the software. 

とあるので、生成した本人のものになると理解しています。
【cpuminer】コンパイル環境とか

#gccのパフォーマンス比較とか
「Ryzen Compiler Performance: Clang 4/5 vs. GCC 6/7/8 Benchmarks」
https://www.phoronix.com/scan.php?page=article&item=gcc8-clang5-znver1&num=1
開発中のGCC8が古く、Ryzen向きのアップデートがあったのが１１月
https://www.phoronix.com/scan.php?page=news_item&px=GCC-8-Features
そういえば「AMD、RyzenのSEGV問題を認める」
https://srad.jp/story/17/08/09/098243/
という問題もあったけど、多分私のは修正後版なのだろう。

#コンパイルオプションチューニング：Threadripper用
「BitZenyをRyzen Threadripper 1950Xで採掘する時の良い環境とオプションを探しました」
https://www.ncaq.net/2018/01/09/20/32/42/
16スレッドより24スレッド動作の方がハッシュレートが高い。
ただ、私の見解としては、伸びがそれほどでもないのと、Nonceがスレッドに均等に割当られているようなので、今まで通りコア数（１６）スレッド推奨。
コンパイルオプションで「march=native」をしては駄目なのを確認している。
これはコンパイラが古く、アーキテクチャをbdver4と解釈するため。SMTとかキャシュ構造とか全然違うのでznver1と解釈してくないのであれば使ってはいけない。
「-mxop」を付けると実行時にエラーが出る。Ryzenから無くなったようだ。
https://en.wikipedia.org/wiki/XOP_instruction_set
＞However AMD removed support for XOP from Zen
「-O3」：「-Ofast」でも変わらない。
「-msse2」：SSE2を有効にする
「-msse4.1」：「march=native」を外すとBulldozer以降対応しているSSE4.1を使用しなくなり、Warningが出るので。
「-flto」：リンク時最適化
「-msha」：SHA計算のハードウェアを使う
https://github.com/Libitina/cpuminer
　＊現状（2018/2/19唯一のCPU Extensions対応マイナーのはず）
「-funroll-loops」：ループを展開
「-fomit-frame-pointer」：フレームポインタ無し（関数コールの効率化）
「--param l1-cache-line-size=64」：L1命令キャシュ64KiB
「--param l1-cache-size=32」：L1データキャッシュ32KiB
「--param l2-cache-size=512」：L2キャッシュ512KiB


#gcc7.2化
Ubuntu上のmingwを使っていたが、gccのバージョンが古い(5.4)。
mingWからのセットアップとか試したが、結局MSYS2（ http://www.msys2.org/ ）からパッケージでインストールするのが一番楽だった。
Ubuntu環境だとlibcurlを自前ビルドしているが、MSYS2ならパッケージインストールしたライブラリで対応できる。
pthreadは、CPU Affinity対応版では無かったので、自前が必要。
13.43kh/s→12.45kh/sに速度低下
原因はMSYSのオーバーヘッドか？
→Linux SubSystemのUbuntu16.04じゃなくてVMwareとかVirtualBOX上にUbuntu17.10入れてクロスコンパイルしてみる。
→Ubuntu17.10.1のmingw-gccは6.3.0、13.04kh/s 「march=nativeすると11.5kh/s」
→7.2をインストール、13.05kh/s「march=nativeすると12.13kh/s」

#冷却性能向上
水冷の排熱をケース下から排気するようにしているが、エアフローが良くないため冷却能力が低い。
CPU温度がBoostクロックの制約になっているため冷却能力の向上で処理能力が上がる。
mining速度がCPUクロックに比例するのは確認済み。
＊つまり、メモリー帯域やキャッシュが性能の制約になっていない。１６スレッドで消費メモリサイズ４０MBに対してL3キャッシュが３２MBあるから・・・
熱交換器へ片側送風からサンドイッチにして、ケース下の空間を広げた。うるさくなったが、3600MHz前後から3700MHz前後に若干アップ。
12ｃｍファンｘ２の熱交換器を使っているが、ｘ３はケース内に収まらないのがネック。もっとホースを長くしてくれればいいのに。
エアフロー的にはサンドイッチにするとファンの負荷が上がるので、片方は熱交換器との間に隙間を開けたい。ネジを買ってこよう。
→電源のファンから異音が（まだ一ヶ月しか動かしてないのに・・・、幸いファンの回転数下げたら音しなくなったが、冷却サボると部品寿命が短くなる）
（2/19追記）CPUクロックがベースの3.4GHz張り付きになった。CPUのグリス塗り直しが必要と思われる。水冷キットに気泡起因と思われるノイズ有り。
フレッツIPv6(IPoE)環境下の自宅VPNサーバー公開方法

自宅のネット接続環境
VDSL<->光電話ルータ（RT400KI）<->Wi-Fiルーター（ブリッジ接続で使用）<->家庭内LAN
IPoE導入以前はインターネット接続の為に、PPPoEでインターネットに接続して、家庭内LANにSoftEtherでL2TP/IPSecなサーバーをRaspberry Piせたてていたが、IPoE環境下では、ポート開放できるポートが限定されるようになり、L2TP/IPSecなサーバーにアクセスするようにポート開放できなくなってしまった。なのでIPoE下ではL2TP/IPSecによるVPNは断念し、使用ポートを変えられるOpenVPN互換にして運用することにした。
基本的にIPoE環境下でポート開放、サーバー公開できないんじゃないのというツッコミについては、IPoE環境下では、光電話ルータのWebインターフェースがリモートでいじられて通常の手段では静的MAPT設定が出来なくなっている。ただ、[配信済事業者ソフトウエア](http://192.168.1.1:8888/t)にアクセスすることでIPv4の設定が出来るようになっている。そこで、静的NAPT設定にて、ポート開放出来るようになるが、前述の通り、解放可能ポートがかなり制限されている。開放できるポートについては、IPv4設定ページ表示時に、利用可能ポートとして、表示されている。そこに載っているポート以外を解放しようとした際には、設定時に使用できないポートだよと注意されるものの、設定自体は出来てしまうのが罠ポイント。まあ、設定出来たところで注意されたとおり使えないので無駄ですが。

SoftEtherで既にL2TP/IPSecで運用できている場合には、vpncmdにて、OpenVPN 互換サーバー機能を有効化するOpenVpnEnable
コマンドを実行して使用するポートを設定、その際デフォルトの1194は利用可能ポートに含まれていないため、別ポートに設定する必要があります。設定後OpenVPN 互換サーバー機能に接続可能なサンプルの OpenVPN 設定ファイルを生成するOpenVpnMakeConfigコマンドで適当なファイル名を指定すると、カレントディレクトリにファイル名.zipと言う物が出来ているので、その中に2つの.ovpnと言う拡張子の設定ファイルとreadme.txt,pdfが入っていますが、iOSやAndroidで必要なのは、xxx_openvpn_remote_access_l3.ovpnの方の設定です。xxx_openvpn_site_to_site_bridge_l2.ovpnの方を読み込ませると使えません的なメッセージが接続時にでると思います。
私の場合、vpn使用の目的について自宅で上げている[pi-hole](https://pi-hole.net/)(広告除去用DNS)を使いたいというのもあったため、remote_access_l3.ovpnの中に
```
ｐush "dhcp-option DNS 192.168.1.XX"
push "dhcp-option DNS 8.8.8.8"
```
のようなものを追加していDNSサーバーの指定を追加しています。
ちゃんとdhcpでDNSが渡るようになっていれば不要です。
Swiftで(a==1&&a==2&&a==3)を常にtrueにする

[(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)を見て、Swiftでも書いてみました。

## get副作用版

```Swift
var i: Int = 0
var a: Int {
    if i == 3 { i = 0 }
    i += 1
    return i
}

print(a == 1 && a == 2 && a == 3)   // true
print(a == 1 && a == 2 && a == 3)   // true
```

## ==オーバーロード版

```Swift
extension Int {
    static func ==(lhs: Int, rhs: Int) -> Bool {
        return true
    }
}

var a: Int = 0

print(a == 1 && a == 2 && a == 3)   // true
print(a == 1 && a == 2 && a == 3)   // true
```
Raspberry Pi 3をZabbix3.0で監視する（サーバー構築とエージェント設定編）



##前提条件
|各項目|※以下の値以外は設定せず。|
|:--|:--|
|IoT|Raspberry Pi3|
|OS|Raspbian GNU/Linux 8 (jessie)|
|ネットワーク|自分のローカルネットワークにRaspberry Pi3をWifiで接続。SSH接続を有効にしている状態。|
　　　　　　　

##監視サーバー（Zabbix3.0）を構築する
AWSのEC2インスタンスにZabbix3.0をインストールします。
ここの記事を参考にさせていただきました。
ありがとうございます。
https://qiita.com/kazumax55/items/44eed57a60c02893fd29

インスタンス構築時の情報

|各項目|※以下の値以外は設定せず。|
|:--|:--|
|インスタンスタイプ|t2.micro|
|EBS|30GB|
|EIP|紐づけ済み|
|security group|自分のGlobal IPのみ80と22と443ポートから接続|

###構築したときに躓いたこと
インストール後ブラウザからZabbixに入ろうとすると403 Forbiddenで接続できず。
調べてみると、こんなログが見つかった。

```
[Tue Jan 23 06:50:52.704362 2018] [authz_core:error] [pid 2741] [client XXX.XXX.XXX.XXX:53575] AH01630: client denied by server configuration: /usr/share/zabbix/
```

権限がないから接続できないっぽい・・・

####原因
構築時にApacheのバージョンを2.4で、アクセス制御の記載方法が2.4では違うためだった。
####対策
`/etc/httpd/conf.d/zabbix.conf` の `<Directory "/usr/share/zabbix">` の項目を以下に変更してやるとアクセスできた。

```
<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Require all granted <=ここがもとは「Order allow,deny」「Allow from all」の2行だった。
```

参考：
https://blog.77jp.net/authz_coreerror-apache-2-4-error

## Zabbix Agent のインストール

Raspberry Pi3を監視するため、Zabbix-agentをインストールする
Zabbix Serverが2.2の場合は、apt-getでそのままインストールできるが、今回はZabbix-serverが3.0のため、
Zabbix-agentも3.0をインストールしようと思う。

#####前提
> raspberriy pi3 が自分でIPを保持していて、外部からアクセスが可能な状態
> Zabbix Server と通信するため、ポートが10050と10051を開けている。

raspberrypi3はCPUがARMなので専用にコンパイルした物が必要だが、
apt-getでは、2.2までしかインストールができないため、以下のサイトを参考にしてファイルを入手する

> https://github.com/imkebe/zabbix3-rpi

上記から、「zabbix-agent_3.0.2-1+jessie_armhf.deb」をダウンロードしておく。
だがそのままでは依存関係を自力で修正する必要があるため、debian系ではおなじみの「gdebi」をあらかじめインストールする。
`sudo apt install gdebi -y`
インストールが完了したらいったん再起動し、SSH SCPなどでRaspberry PIにダウンロードしたZabbix-agentをアップロードする
※自分の場合はTeratermを使用してアップロードした。

再起動及びログインあと、以下の流れでインストールする

```
sudo su -  ※rootユーザーになっておく
cd /home/＜zabbixagentアップロードフォルダ＞

dpkg -i zabbix-agent_3.0.2-1+jessie_armhf.deb

systemctl start zabbix-agent.service
systemctl status zabbix-agent.service
● zabbix-agent.service - LSB: Start zabbix-agent daemon
   Loaded: loaded (/etc/init.d/zabbix-agent)
   Active: active (exited) since 金 2018-01-26 12:38:43 JST; 4min 47s ago

 1月 26 12:38:43 raspberrypi systemd[1]: Starting LSB: Start zabbix-agent daemon...
 1月 26 12:38:43 raspberrypi systemd[1]: Started LSB: Start zabbix-agent daemon.
 1月 26 12:42:35 raspberrypi systemd[1]: Started LSB: Start zabbix-agent daemon.
 1月 26 12:43:16 raspberrypi systemd[1]: Started LSB: Start zabbix-agent daemon.
```

あとは`/etc/zabbix/zabbix_agentd.conf`に構築したZabbixのサーバーのアドレスやら、ホスト名などを入力する
Xcode 9のBotでpod installする方法（小ネタ）

## Xcode 9 + Xcode Server

Xcode 9でのCI (Continuous Integration) がかなりこなれてきたということで、試しにローカルでBotを立ててみました。
従来別途macOS Serverアプリ（OS X Serverとも呼ばれてた？）が必要だったXcode Serverが、Xcode 9に統合されてるのがよいですね。

設定方法は他の方がすでに記事を書いておられますので、参考にしましょう。

- [XCode9のBotを使ってみる](https://qiita.com/eKushida/items/2923e8badd0fa4efbf5e)
- [[iOS 11] Xcode 9で“だいぶまとも”に！新機能をまとめてみた](https://dev.classmethod.jp/smartphone/iphone/xcode-9-new-features/#toc-xcodexcode-server)
- [Xcode9 + Xcode Server = Comprehensive iOS Continuous Integration](https://medium.com/xcblog/xcode9-xcode-server-comprehensive-ios-continuous-integration-3613a7973b48)

## Bot上でpod installを実行
で、今回困ったのはCocoaPodsをコマンドラインで実行するところでした。
というのも、今回対象のリポジトリにはCocoaPodsでインストールされるファイルを入れないという方針だったので、リポジトリからcloneした後は必ず pod install を実行してやる必要があったのです。

色々試した挙句、結局以下のようなBotの設定で pod install をビルド前に実行することができました。

1. ⌘9 でReport Navigatorを表示し、Botを選択（マシン名の下に隠れているかも）
2. 右上の Edit Bot... ボタンを押す
3. Triggers タブを選択
4. 左下の＋ボタンを押し「Pre-Integration Script」を選択
5. 適当に名前をつけて、右側のエディタ部分に以下を入力

```.sh
#!/bin/sh

cd "${XCS_PRIMARY_REPO_DIR}"   # リポジトリのディレクトリに移動

if [ ! -e Pods ] ; then        # Podsディレクトリが存在しなければ
    /usr/local/bin/pod install # pod installを実行。フルパスじゃないとダメっぽい。
fi
```
参考記事: [Pod Install in XCode Bots Trigger](https://stackoverflow.com/questions/39521369/pod-install-in-xcode-bots-trigger)
6. Done を押して完了

---

以上、何かしらの助けになれば幸いです！
”psql: could not connect to server: No such file or directory"となりPostgresqlに接続できない

Macのローカル環境でサーバーに接続できなかったので、そのときの対処方法です。

まず、ローカルサーバーを立ち上げようとすると下記のようなエラー画面に。

<img width="1195" alt="スクリーンショット 2018-01-23 3.18.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/9956/9b4505cd-b5dd-90d7-25a6-d17607233581.png">

どうやらサーバーに接続できていない様子。

ターミナルでも同じようなエラーメッセージが表示されました。

```
$ psql -l
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

以下の記事を参考にさせていただきました。
[RailsでPostgreSQLを使うまでの設定](http://taise.hatenablog.com/entry/2013/10/13/162546
)

```
$ cd /usr/local/Cellar/postgresql
$ curl -o fixBrewLionPostgresql.sh http://nextmarvel.net/blog/downloads/fixBrewLionPostgres.sh
$ chmod 777 fixBrewLionPostgresql.sh
$ ./fixBrewLionPostgresql.sh
$ pg_ctl -D /usr/local/var/postgres start
```
順番に実行していくと問題なく表示されるようになりました。
よかった・・。
cheerio-httpcli でログインした後にファイルをダウンロードする

# cheerio-httpcli でログインした後にファイルをダウンロードする

`cheerio-httpcli`というスクレイピングライブラリを使って、会員制のアップローダーにログインした後にファイルをダウンロードしたかったけど、ライブラリ自体にはダウンロード機能がなくて躓いたので、ここにメモを残しておきます。

ライブラリ自体の使い方の説明はしないので、大雑把に雰囲気をつかみたい人は、[作者の紹介記事](https://qiita.com/ktty1220/items/64168e8d416d6d8ffb45)、詳しい使い方を知りたい人は、[README.md](https://github.com/ktty1220/cheerio-httpcli/blob/master/README.md)を読んで下さい

## ログインする

```js
const client = require('cheerio-httpcli')

client.fetch('http://example.com/login').then(result => {
  result.$('form[name=login]').submit({
    user: 'hoge',
    pass: 'fuga',
  }, (err, $, res, body) => {
    // フォーム送信後に移動したページ取得後の処理
  })
})
```

普通にログインするだけで、[作者の紹介記事](https://qiita.com/ktty1220/items/64168e8d416d6d8ffb45#form-elementsubmit-param-callback-)や、リポジトリにも[サンプル](https://github.com/ktty1220/cheerio-httpcli/tree/master/example)があるので説明は割愛。

## ファイルをダウンロードする

前提としてログインしないと、ファイルがダウンロードできず、エラーページに飛ばされるのでCookieをセットする必要があるので、`res.cookies`でCookieを取得して、リクエスト時にヘッダーにつける。

```js
const fs = require('fs')
const request = require('request')
// ～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
    // フォーム送信後に移動したページ取得後の処理（続き）
    const cookies = res.cookies
    request({
      url: 'http://example.com/example.zip',
      headers: {
        Cookie: Object.keys(cookies).map(e => e + '=' + cookies[e]).join('; '),
      },
      timeout: 60000,
      encoding: null,
    }).pipe(fs.createWriteStream('./example.zip'))

```

ポイントとしては

- Cookieが変わっても動作するように直指定ではなく、全てのCookieをつなげている
- バイナリデータを返すようにするために`encoding: null`を指定している
UbuntuだとLaravelのルーティングが死んだ


# すぐなんでも詰まる。UbuntuとLaravelは相性悪いのか？

ルーティングが機能しない。
<img width="684" alt="スクリーンショット 2018-01-23 2.24.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/186784/d52cef21-dae6-add0-ce1c-970a4c9c3b50.png">

ちなみに、トップは表示されるが「.env」が正しく反映されてないのはなんとなく理解できた。

## ルーティングを解決する。

どうやら、apacheは特に記載がなければ.htaccessを無視するとのことで、書き込んで置く必要があるっぽい。

```000-default.conf
<Directory /var/www/gloops/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
```

```
sudo a2enmod rewrite
```

ダメだった。

## .htaccessを書き換えるとうまくいくっていう噂

どうやら、これもよさそう

```htaccess.
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```

だめだった。

## apache2.conf書き換えたら行けた

```
sudo a2enmod rewrite && sudo service apache2 restart
```

まずこれ実行。その後

```apache2.conf
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All  // Noneから変更
        Require all granted
</Directory>
```

いけた。わーいわーい


## 参考

https://stackoverflow.com/questions/24784606/laravel-routes-not-working-apache-configuration-only-allows-for-public-index-ph
(a == 1 && a == 2 && a == 3)を常にtrueにする系コードゴルフのようなもの(Python2: 37byte or 32byte)

[(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)という記事に対して、いくつか記事を書いたので、最後の仕上げとしてコードゴルフのようなことをします。

基本的には、[Python2で(a == 1 and a == 2 and a == 3) を常にTrueと等しくする魔法の一文(演算子はいじらない系)(ソース4行)](https://qiita.com/aimof/items/abc8a5859c928b198dfc)これの変形です。

## ソースコード

```python
True=a=0;print(a==1&a==2&a==3)==True
```

いつの間にかandがbit演算子(&)になっていますが、bool型同士の演算ならandと一緒だから……。

ちなみにインタラクティブ実行環境なら、

```python
True=a=0;(a==1&a==2&a==3)==True
```

32byteまでいけます。

制約条件が分かりづらいので競技としては成立しませんが、まあ、なんか短くなったよってことで。
C++でもコンパイル時にa == 1 && a == 2 && a == 3をtrueにしてみたい

> [(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)

とかいうよくわからん記事がでている。流行りに乗ってみるか。

# 独自の縛り

- コンパイル時に評価
- C++11

# コード

まあコンパイル時と言ってもただのoperator overloadだ。

```cpp
struct A { bool a; };
constexpr bool operator==(A, int) noexcept { return true; }
constexpr A a{};
static_assert(a == 1 && a == 2 && a == 3, "");
int main(){}
```

他の言語しか知らない人のために解説しておくと、`static_assert`は第1引数が偽のとき、第2引数の文字列を含むコンパイルエラーを出すものだ。エラーが出なければtrueになったといえる。

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>
UbuntuでMySQLが動かん時。「could not find driver 」「pdo drivers shows no value」で起こるやつ。

```
could not find driver (~~~)
```

<img width="1018" alt="スクリーンショット 2018-01-23 2.06.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/186784/a36bb996-5003-2a61-fadc-0dcfe9f774e3.png">

# MySQL全然動かないと思ったらこいつか。

phpinfo()で表示して見ると、novalueって書いてあって、ここが問題なのはなんとなく分かった。

## 早急なチェック方法

多分、この記事を読んでるあなたも、ここが問題だけど、目で確認するといい。

IPアドレスまたはドメインをURLに打ち込んだ時に表示されるディレクトリ(いわゆるドキュメントルート）で↓のコードを実行。

```
echo "<?php phpinfo() ?>" > phpinfo.php
```

これで、ディレクトリ下に、「phpinfo.php」というファイルができる。
http://example.com/phpinfo.phpでアクセス！

## とりあえず、依存関係が足りない場合を疑おう

```
sudo apt-get install php-mysql
```

で解決することもあるらしい。僕はダメでした。

```
sudo apt-get install php5-mysql
```

```
sudo apt-get install php7-mysql
```

のように、バージョン別でも可能。


## enabledを調整するらしい。

何をしてるのかは良くわからない。けど、php7.1の僕の環境ではこれで解決した。

```
sudo apt-get install php7.0-mysql
sudo phpenmod pdo_mysql
sudo service apache2 restart 
```

Laravelは同時にパーミッションでもエラー出まくってて、いつまでたってもデプロイできない。。。

## 参考

[How to activate PHP7.0 PDO in 16.04 LTS?](https://askubuntu.com/questions/824485/how-to-activate-php7-0-pdo-in-16-04-lts)
設計レビューのノウハウ

# はじめに
社会人として年数を重ねるにつれて、設計をする側だけでなく、レビュータスクも増えてきました。
しかし、うまく問題検出ができる時と、脱線しっぱなしになったりする時とがあったりしました。
設計レビューのノウハウを学ぶために読んだ書籍から、ノウハウ集的な感じにまとめようと思います。

ここでのレビューはエンジニアが実施する「ピアレビュー」にターゲットを合わせています。

# レビューは必要な形態を選ぶ
レビューには「ウォークスルー」「インスペクション」「テクニカルレビュー」があります。  
それぞれのレビュー形態と、目的を知って、今するべきレビュー形態を選択します。

## ウォークスルー
設計者が主導する、必要なレビューアのみを招集したカジュアルなレビューです。  
目的は、設計における設計者の悩みの解消と、チーム内の認識合わせです。
ドキュメントは完成していなくても構いません。認識齟齬は早い段階で減らしていきましょう。
カジュアルであるため、話が脱線したりして無駄に時間がかかりがちです。
ゴールは明確にしておきましょう。

## インスペクション
ウォースルーの対極の、フォーマルなレビューです。
観点や、レビューア、進行役、記録係などを事前にがっちり決めて行います。
レビューアに役割（プログラマだったり、顧客）を持たせたりする場合もあります。
レビューアは事前にドキュメントを確認し、問題を検出しておく必要があります。
網羅的なレビューをしたい場合は選択を検討します。
デメリットとして、準備が多いので工数負荷が高まりやすいことです。

## テクニカルレビュー
ウォークスルーとインスペクションの間くらいのレビューです。
リーダー（進行役）、レビューア、設計者で開催します。
インスペクションほどではないですが、観点は事前に決めておいて、問題検出をしておきます。
インスペクションより自由度が高いのはメリットでもありますが、レビューア間の話題に任せてしまいがちなので、
話の脱線には注意しましょう。

# レビューのステップを知る
レビューには4つのプロセスがあります。
基本的なこの4つのプロセスを守ることで、型化したレビューを行う手助けをします。
テクニカルレビューを元に、リーダー、レビューア、設計者を登場人物としていますが、
状況によってはレビューアや設計者がリーダー（進行役）を担ったりすると思うので、適宜読み替えてください。

## 準備
リーダーは検出すべき問題を把握しておき、観点を出してレビューアに観点を割り振ります。
リーダーは、レビューの場とメンバーを確保しましょう。
レビューアは与えられた観点で、優先度を決めます。優先度は、後工程での問題発覚による修正工数が多いものが高くなります。
設計者は、ドキュメントを作成します。レビューアの負荷を減らすためにも品質が高くなるよう努めましょう。

## 問題の検出
レビューアは、与えられた観点から、問題の検出を行います。どうやって検出したかを説明できるようにしておきましょう。

## 問題の指摘
レビューアは検出した問題を設計者に指摘します。
設計者は、指摘された問題を理解し、記録します。

## 修正・フォロー
リーダーは、レビューでドキュメントの問題が解消されたかを判断します。
必要があれば、再レビューの場を用意します。
設計者は、指摘された問題を早めに修正します。指摘内容を忘れないためです。
レビューアは、修正されたドキュメントを確認します。指摘内容について設計者から相談があればフォローしましょう。

# レビューのべからずを知る
レビューでついついしがちなことの中で、気を付けたほうがいいことみたいなのを紹介します。

## レビュー対象者のべからず

### 誤字脱字をするべからず
当たり前っちゃ当たり前なんですけど、レビューア目線だと誤字脱字が多いとレビューのモチベが下がります。
また、誤字脱字の指摘に追われて重大な問題の検出が疎かになったりすることもあります。
レビューまでに近くの人に軽くチェックして頂くだけでも効果があります。不安であれば実践しましょう。

### 指摘を文句と勘違いするべからず
指摘を受けると、文句を言われた気分になり、頭にきたり、逆に落ち込んでしまったりしていませんか？
指摘は自分に対しての批判ではなく、ドキュメント・設計の品質向上を願ってしています。
感謝をもって受け入れられるとよいと思います。

## レビューアのべからず 

### 私情を持ち込むべからず
キライな人にはきつい言葉で、無駄に指摘出したりしてませんか？
そこには価値は生まれないので、システムの価値に照準を合わせるようにしましょう。仕事ですよ。

### 作成者気分になるべからず
例として、「ミスばかり目に付くな。。。全部指摘するより自分が作り直した方が早いわい」みたいな。
自分が作ったら誰がレビューするの　って話もあります。
重大な問題を説明する力をつけるチャンスと思いましょう。
本当に作り直しが必要なら打ち合わせを設けましょう。

### 脱線するべからず
レビューをしていると、別の問題が浮かんで話が脱線することがあります。
重大な問題のための脱線もあると思いますが、本来のシナリオがないがしろになることを避けるようにしましょう。
重大な問題でないならなおさら脱線は避けるようにしましょう。

### 個人を責めるべからず
「こんな設計だなんて、基本ができてない」とか。
どちらもモチベや雰囲気悪くなっちゃうので、生産的な話をするようにしましょう。

### 意図的な見逃しをするべからず
設計者が技術力高い時に起こりがちな、信頼しているから大丈夫だろうという見逃しです。
協力して品質高くしていきましょう。

# 振り返りを行う
プロジェクトなどは振り返りを行うことがありますが、レビューについても振り返りを行いましょう。
振り返る内容は、後工程で発生した問題はレビューで検出できたかと、再発防止策です。
レビューの質を継続的に高めていくことで、レビュー負荷は下がり、システムの価値は高くなります。

## 観点を減らす
観点を増やすだけではなくて、減らすことも考慮に入れましょう。
重大な問題を検出できない観点を減らすことで、重大な問題を検出できる観点に費やす時間が増えます。
結果として、より精度の高いレビューができるうえ、観点が減る分レビュー負荷が減ります。

# おわりに
正直インスペクションみたいなかしこまったレビューはあまり経験ないのですが、
どのレベルで何をレビューされたいか、するべきかを考えると、どういったレビューを開催すべきかも選択すべきと思いました。

以上です。お疲れ様でしたー。
   
# 書籍
[なぜ重大な問題を見逃すのか？間違いだらけの設計レビュー](https://www.amazon.co.jp/dp/B01683BFJM/)