OmniAICreator/Qiita-1.07M huggingface dataset:
C#リージョン

```Form1.cs
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace region
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var paths = new GraphicsPath[3];
            var r = 60;
            var s = 80;
            for (var i = 0; i < paths.Length; i++)
            {
                var rad = (Math.PI / 180) * (120 * i + 30);
                var x = (float)(150 + Math.Cos(rad) * r);
                var y = (float)(150 + Math.Sin(rad) * r);

                var path = new GraphicsPath();
                path.AddEllipse(x - s, y - s, 2 * s, 2 * s);
                paths[i] = path;
            }

            {
                var rgn1 = new Region(paths[0]);
                rgn1.Exclude(paths[1]);
                rgn1.Exclude(paths[2]);
                var rgn2 = new Region(paths[1]);
                rgn2.Exclude(paths[2]);
                rgn2.Exclude(paths[0]);
                var rgn4 = new Region(paths[2]);
                rgn4.Exclude(paths[0]);
                rgn4.Exclude(paths[1]);
                var rgn7 = new Region(paths[0]);
                rgn7.Intersect(paths[1]);
                rgn7.Intersect(paths[2]);

                var pic = pictureBox1;
                pic.Image = new Bitmap(pic.Width, pic.Height);
                var g = Graphics.FromImage(pic.Image);
                g.Clear(Color.FromArgb(0x40, 0x40, 0x40));

                g.FillRegion(new SolidBrush(Color.FromArgb(0x00, 0x00, 0xff)), rgn1);
                g.FillRegion(new SolidBrush(Color.FromArgb(0xff, 0x00, 0x00)), rgn2);
                g.FillRegion(new SolidBrush(Color.FromArgb(0x00, 0xff, 0x00)), rgn4);
                g.FillRegion(new SolidBrush(Color.FromArgb(0xff, 0xff, 0xff)), rgn7);
            }

            {
                var rgn = new Region(paths[0]);
                rgn.Xor(paths[1]);
                rgn.Xor(paths[2]);

                var pic = pictureBox2;
                pic.Image = new Bitmap(pic.Width, pic.Height);
                var g = Graphics.FromImage(pic.Image);
                g.Clear(Color.FromArgb(0x40, 0x40, 0x40));

                g.FillRegion(new SolidBrush(Color.FromArgb(0xff, 0x80, 0x00)), rgn);
            }
        }
    }
}
```
![region.png](https://qiita-image-store.s3.amazonaws.com/0/257554/886f23cf-e997-ee17-7981-589187425746.png)
HSQLDBUtilを使ってみる

# はじめに
ASTERIA WARPをインストールすると、インストールディレクトリ配下のフォルダーにhsqldbutil.exeというファイルができています。InternalDataStorage(HSQLDB)のデータ操作や内容を確認するツールのようですがマニュアルに使い方など記載が特になかったので実際に触ってみました。

# 環境
 + OS:Windows Server 2012 R2
 + ASTERIA WARP:1712
 + Java:1.8.0_151

# 事前準備
InternalDataStorageに接続するのでFSMCなどからサービスを立ち上げておきます。
![hsqldbutil01.png](https://qiita-image-store.s3.amazonaws.com/0/180292/078ab00b-20dd-08e0-7104-444015afea37.png)

起動完了後
![hsqldbutil02.png](https://qiita-image-store.s3.amazonaws.com/0/180292/42eb7d16-15d3-be34-8d88-abff6928b063.png)

# 動作確認
## 起動
インストールディレクトリ[INSTALL_DIR]配下の`server/bin/hsqldbutil.exe`をダブルクリックして起動します。

![hsqldbutil03.png](https://qiita-image-store.s3.amazonaws.com/0/180292/1bb8df3a-a475-2d31-9838-f2c030e2fe62.png)

HSQLDBの管理ツール(Database Manager)が起動して接続画面が表示されました。

## 接続

接続先を設定して「OK」ボタンをクリックします。

![hsqldbutil04.png](https://qiita-image-store.s3.amazonaws.com/0/180292/1546bcb1-e7b3-de65-fad9-2cac24d6b692.png)

接続先の情報はTypeは「HSQL DataBase Engine Server」としてURLやUserはASTERIA WARPインストール時に作成されるシステムコネクション「asteria_internal」というコネクション情報を参考にしています。

![hsqldbutil05.png](https://qiita-image-store.s3.amazonaws.com/0/180292/2b2b770f-cd64-60f3-e243-a5dae435fc70.png)

接続に成功するとテーブルの一覧とSQL文を入力する画面が表示されます。

![hsqldbutil06.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9a4381f8-6223-4247-7c20-6df529c17d10.png)

※インストール直後はテーブルなどはないのでテーブル一覧には何も表示されません。

## 画面操作(テーブル一覧)

テーブル一覧画面でテーブルをクリックするとフィールド定義などスキーマ情報が確認できました。

![hsqldbutil07.png](https://qiita-image-store.s3.amazonaws.com/0/180292/b74b9d76-381b-aa22-5f1b-8064eaa607e2.png)

## 画面操作(SQLの実行)

SQL文を入力し、「Execute」ボタンをクリックすると実行結果が表示されました。

![hsqldbutil08.png](https://qiita-image-store.s3.amazonaws.com/0/180292/25fe2835-4025-188b-2a81-3359b479954e.png)

## HSQLDB以外のデータベースに接続

どこまでサポートされているのかは不明でしたが、Typeにはプルダウンリストがあり、HSQLDBだけではなく他データベースについてもツールとして接続はできるようです。

![hsqldbutil09.png](https://qiita-image-store.s3.amazonaws.com/0/180292/2e570357-086c-5584-9eb7-8ff1e84c0dcb.png)

試しにPostgreSQLを選んでConnectしてみました。

![hsqldbutil11.png](https://qiita-image-store.s3.amazonaws.com/0/180292/029e4d90-c49a-403d-7018-7f993d0decf1.png)

JDBCドライバーが読み込めないらしいので、laxファイルのクラスパス指定部分でASTERIAで使用しているjdbcドライバーの配置パス`[DATA_DIR]/system/lib/drivers`を追加してトライしてみます。

```
C:\ASTERIAHOME5\SYSTEM\LIB\DRIVERS
    postgresql-42.1.4.jar
    sqljdbc42.jar
```

```hsqldbutil.lax
#   LAX.CLASS.PATH
#   --------------
#   the Java classpath necessary to run this application
#   Can be separated by colons (Mac OS/Unix) or semicolons (Windows)

lax.class.path=../lib/ext/*;lax.jar;C:/asteriahome5/system/lib/drivers/*
```
接続できました。

![hsqldbutil12.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9c3d9386-58ca-4f0a-303b-503326686904.png)

# 終わりに
InternalDataStorageはそもそも接続確認やサンプルフローの動作確認を行う用途のみで使用するという制限事項があり、PostgreSQLやMySQLなど他のデータベースについては付属のクライアントツールが提供されていると思います。フローを使ってRDBGetやSQLCall、SQLBuilder画面でも確認できるので、ASTERIA WARPサーバー上でこのツールを使ってわざわざ確認する必要性は正直あまり感じません。
しかもlaxファイルを直接編集しないといけないので裏技みたいな感じで自己責任の範囲となってしまうと思います。
ただHSQLDBの管理ツールを操作してみるという点では勉強になり、デザイナー側に配置されていれば、ちょっと何か調べ物したいとかそんな時には使えるのかなとは思いました。

以上です。
Ubuntu 20.10 で Postfix,Dovecot を使う

Ubuntu 20.10 に Postfix と Dovecot をインストールしました。

1) Postfix のインストール

```bash
sudo apt install postfix
```
サーバーの選択は、インターネットを選びました。

設定ファイルの変更は、クライアントの IP アドレスの登録だけです。

```text:/etc/postfix/main.cf
 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 153.211.60.100
```

2) Dovecot のインストール

```bash
sudo apt install dovecot-common dovecot-imapd dovecot-pop3d
```

設定の変更は不要です。

3) 起動していることの確認
インストールするだけで起動しますが、その確認

```bash
sudo systemctl status postfix
sudo systemctl status dovecot
```

4) 送信のテスト
>サーバー内で

>```bash
telnet localhost 25
```

>クライアントから

>```bash
telnet サーバー名　25
```

```text
$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 133-130-124-85 ESMTP Postfix (Ubuntu)
helo example.com
250 113-120-114-65
mail from: uchida@example.com
250 2.1.0 Ok
rcpt to: aaa@target.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Test mail
From: uchida@example.com
Good Afternoon.
.
250 2.0.0 Ok: queued as 0BF36127
quit
221 2.0.0 Bye
Connection closed by foreign host.
```

次のようなスクリプトでもテストが出来ます。

```bash
netcat localhost 25 < in01.txt
```

```text:in01.txt
helo example.com
mail from: uchida@example.com
rcpt to: aaa@target.com
data
Subject: Test mail on Jul/05/2020
From: uchida@example.com
Good Afternoon.
.
quit
```

メールコマンドでのテスト

```text
$ mail -s "Test mail" aaa@target.com
Cc: 
From: uchida@example.com
Hello
Good Evening
Cntrl + D で終了
```

スクリプトにすると

```bash
mail -s "Test mail" aaa@target.com < m01.txt
```

```text:m01.txt
From: uchida@example.com
Hello
Good Evening
```



5) 受信のテスト
　Thunderbird などでメールを受信します。

6) openssl で Dovecot のテスト

```text
$openssl s_client -connect example.com:995 -quiet
(省略)
+OK Dovecot (Ubuntu) ready.
user scott
+OK
pass aaaaaa
+OK Logged in.
list
+OK 4 messages:
1 1212
2 1256
3 1244
4 997
.
```

-------------------------------------------------

この状態で、hi-ho.ne.jp yahoo.co.jp nifty.com などには、メールを送れますが、 gmail.com には送れません。

gmail.com に送ろうとすると、次のエラーが出ます。

```text
host gmail-smtp-in.l.google.com[2404:6800:4008:c01::1b]
    said: 550-5.7.1 This message does not have authentication information or
    fails to pass 550-5.7.1 authentication checks. To best protect our users
    from spam, the 550-5.7.1 message has been blocked.
```

これは、DNS サーバーで、SPF レコード (TXT) を設定すれば解消します。
私は、onamae.com で設定しました。


CentOS 7 の設定はこちらです。
[CentOS7 で Postfix,Dovecot を使う](https://qiita.com/ekzemplaro/items/63ae72d13d15abcc4a3e)
配列のインデックスは0,1,どちらから始まる方が良い？

# 「配列のインデックスってなんで0から始まるの？」という疑問
長さ$n$の配列の最後の要素を$a[n-1]$と書いていたが、 「$a[n]$の方が間違えにくいのになぁ」と思ったので、
多くの言語で配列のインデックスが$0$から始まる理由について調べ、$0$で始まるものと$1$で始まるものの利点や欠点を比較した。

# TL;DR

**0-based indexing について**
・時間や距離に関するベクトルとして利用するには便利
・配列の個数を使ったインデックスの計算で間違い(Off-by-oneエラー)が起きやすいので、注意する必要がある
・$a[-i]$のように逆順でのアクセスができるとき、 $(-2≦k<2)$のように連続した値でアクセスできる。(1-basedでは$a[0]$が不正になる)

**1-based indexing について**
・通常の「数や文字の列」として利用するには便利
・配列の個数を使ったインデックスの計算で間違い(Off-by-oneエラー)が起きにくい

以下は、配列のインデックスが0から始まる理由について、調べてみたもの

# 1. 言語に依る・歴史的経緯より
そもそも配列（みたいなデータ構造）のインデックスが0から始まる言語もあれば、1から始まる言語もある。
例を挙げると、COBOL, PL/I, RPG, FORTRAN, BASIC, R, Lua, Julia　など、は1から始まる

**C/C++の場合、配列の設計にポインタ演算を直接利用しているので、0-based indexing**
（配列は「連続したメモリ空間の先頭アドレス」で実装され、配列へのアクセス演算子[]は「アドレスへの足し算」で実装されている）

# 2. 自然数が0から始まるから
え、自然数って1からじゃないの？よくわかんない。
集合によって自然数を定義する際に、0から始めるとなんかうれしいらしい。

**配列の要素へアクセスするための関数（もしくは文法）で、インデックスの型が自然数と定められている言語はあまりない気が......**
あと、ほとんどの言語がインデックスの型がintなのに負の数をとれないよね......

# 3. ダイクストラ先生の「Why numbering should start at zero」より
[Why numbering should start at zero](http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html)
より、二つの主張がされている。

**1. 自然数の部分列は$(m≦i<k)$と表記するとわかりやすい(ただし、 $m≦k$)**
**2. 1.の表記を採用するとき0-based indexing にすると、長さ$n$の列が$(0≦i<n)$と表記できるのでわかりやすい**

例を挙げてみる。

・まずは普通の例
$2,3,4,...12 ⇔ (2≦i<13)$

・隣り合う部分列について、1.の表記では上限と下限が一致する
$(2,3),(4,5,6) ⇔ (2≦i<4),(4≦i<7)$
$2,3,4,5,6 ⇔(2≦i<7)$

・空の部分列∅も表記できる
$∅ ⇔(k≦i<k)$

**1.の記法は便利！**

**2.の主張がいまいち。1-based indexing にしても$(1≦i<n+1)$と特に不自然ではない気がする。**

# ex1. offsetとcountの違い(Off-by-oneエラーについて)
ものの数え方には、りんごを1,2,3...と、1から順に個数=countを数える方法と、ある地点を0と決めてそこからどれだけ離れているか距離=offsetで数える方法がある。
**offset(距離)とcount(個数)の2つを混同して計算すると、Off-by-oneエラーという計算間違い**が起こる。
[Learning How to Count (Avoiding The Fencepost Problem)](https://betterexplained.com/articles/learning-how-to-count-avoiding-the-fencepost-problem/)

そして、**Off-by-oneエラーは、0-based indexing で起きやすい。**

例えば、$n$個の要素を持つの配列$a$最後の要素$last$を求めたいとき、$last=a[n]$は配列の範囲外に出てしまう。

```:n=6の配列aの例
                     ↓ n=6
count      1 2 3 4 5 6 7 
element    A B C D E F * 
index      0 1 2 3 4 5 6 
                       ↑ a[n=6]は配列の範囲外
```

これは、**配列の要素数$n$がcount**で**配列のインデックスがoffset**なのが原因。
正しくは
$offset = count - 1 (ただし1≦count)$
を利用して、$n$をoffsetに変換し
$last = a[n-1]$

**1-based indexing では配列のインデックスはcountだから、offset-count変換の計算が必要なくなるぞ！（うれしい）**

# ex2. 負の数をインデックスにとれる配列について

$a[-i]$は**「配列の後ろから$i$番目にアクセス」**という意味。

0-based indexing では、
**「負のインデックス$(-i)$でアクセス」と捉えることもできる。**
例えば、 配列$[A,B,C,D]$は、実質的には下記のような循環した列の一部分であると捉えて、その$index = -i$の要素へのアクセスと考えることができる。

```
index   -3 -2 -1  0  1  2  3
element  B  C  D  A  B  C  D
```


1-based indexing では、
**「負のインデックス$(-i)$でアクセス」と捉えることができない。**
もし、無理やりに捉えると$i=0$で穴ができてしまう。

```:index=0は配列の範囲外
index   -3 -2 -1  0  1  2  3  4
element  B  C  D     A  B  C  D
```

###負の数をインデックスにとれる場合は、0-based indexingの方が便利なことがある
例えば、配列 $[A,B,C,D,E,F]$ から配列$[E,F,A,B]$を得たいときは、 $(-2≦i<2)$の範囲を取れば済むからだ。

```:負のインデックスでアクセスと捉える
index   -5 -4 -3 -2 -1  0  1  2  3  4  5
element  B  C  D  E  F  A  B  C  D  E  F
```

1-based indexing では、$i=0$が配列の範囲外となるため、ちょっと面倒。
pythonで多次元リストの引き算をする(備忘録)

(ただの備忘録)
多次元リストの扱いに少々困ったので、残しておきます。
まずは一次元のリストの引き算は以下のように出来ます。

```python
A = [1, 2, 3]
B = [1, 4]
print(list(set(A)-set(B)))
# [2, 3]
```

2次元リストでも同じように行けるかな？と思いやってみると

```python
C = [[1, 1], [1, 2], [1, 3]]
D = [[1, 1], [1, 4]]
print(list(set(C)-set(D)))
```

```bash
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
```
こんな感じで怒られます。

どうすれば良いと思う？
と調べているとmapを使えば出来ました。

```python
E = list(map(list, list(set(map(tuple, C)) - set(map(tuple, D)))))
print(E)
# [[1, 2], [1, 3]]
```

listはunhashableだけど、tupleはhashableなんですね。
知らなかったです。
【基本】EXCELで別表のデータから値を参照する（VLOOKUPの基本的な使い方）

EXCELのVLOOKUPの話題がQiitaにあうかわからないけど、よく聞かれるので、簡単な使い方をメモ代わりに投稿します。

# 概要
* EXCELで別表から値を検索して参照する関数VLOOKUP関数の使い方を丁寧に説明

# 環境
* Microsoft Excel for Mac (バージョン16.13) （windowsでも動きます）

# 手順
## 参照元のシート（データ）作成
* データを作る。1列目に検索するためのデータ（氏名）、２列名以降に参照したいデータを配置するのがポイント

[![https://gyazo.com/ee28449f479b36dc8166a5f63f307cbd](https://i.gyazo.com/ee28449f479b36dc8166a5f63f307cbd.png)](https://gyazo.com/ee28449f479b36dc8166a5f63f307cbd)

## 参照先のシート（印刷シート）を作成
* 適当に作ればOK。とりあえず下図の通り作成

[![https://gyazo.com/62c4d1a091d334e4ace873703241a5b5](https://i.gyazo.com/62c4d1a091d334e4ace873703241a5b5.png)](https://gyazo.com/62c4d1a091d334e4ace873703241a5b5)

## データに名前をつける
* 登録したい範囲を選択する。ここではA-C列を選択します。

[![https://gyazo.com/58f90216270bdb3593626a7d86036d62](https://i.gyazo.com/58f90216270bdb3593626a7d86036d62.png)](https://gyazo.com/58f90216270bdb3593626a7d86036d62)

* 左上を選択して、データに名前をつけてenterキーを押します。(空白無しの半角英字）。ここでは、__datalist__という名前をつけました。

[![https://gyazo.com/d05c6c154389b9be8e343dcc0ece93be](https://i.gyazo.com/d05c6c154389b9be8e343dcc0ece93be.png)](https://gyazo.com/d05c6c154389b9be8e343dcc0ece93be)

* データに名前がついたかどうか確認する

__数式__の__名前の定義__を押す

[![https://gyazo.com/84dc8121663971df2ff6b34823ffab48](https://i.gyazo.com/84dc8121663971df2ff6b34823ffab48.png)](https://gyazo.com/84dc8121663971df2ff6b34823ffab48)

__datalist__というデータが登録されていて__セルの範囲__が__図のようになっていれば__とりあえずOK。

[![https://gyazo.com/f18e57f79b87aead708965ba775836e3](https://i.gyazo.com/f18e57f79b87aead708965ba775836e3.png)](https://gyazo.com/f18e57f79b87aead708965ba775836e3)

## データを参照できるようにする
* VLOOKUP関数を利用してデータを参照できるようにする
  * データ（ここでは__datalist__）
  * データを参照するためのセル（ここでは__C6__セル）
  * 表示したい場所（データないの列番号。列番号とは左から何番目かのこと。ここでは、__2__（国語、２番目）、__3__（算数、３番目））
  * __FALSE__についての詳細な説明はしません。ただし、FALSEを指定してください。TRUEにすると期待する結果を参照できない事があります。

* データから名前を検索して、国語の値を参照したい場合のVLOOKUP関数
  * `=VLOOKUP(C6,datalist,2,FALSE)`
[![https://gyazo.com/68f4b32bbc93cf87e00abc33cca4da84](https://i.gyazo.com/68f4b32bbc93cf87e00abc33cca4da84.png)](https://gyazo.com/68f4b32bbc93cf87e00abc33cca4da84)

* データから名前を検索して、算数の値を参照したい場合のVLOOKUP関数
  * =VLOOKUP(C6,datalist,3,FALSE)
[![https://gyazo.com/9a21fcfc976a7b22ac015dd2d2179073](https://i.gyazo.com/9a21fcfc976a7b22ac015dd2d2179073.png)](https://gyazo.com/9a21fcfc976a7b22ac015dd2d2179073)

こんなかんじになります。（名前が入力されていないのでまだデータは表示されません。）

[![https://gyazo.com/c9b383965dfb78e6a2975f33a2f0151e](https://i.gyazo.com/c9b383965dfb78e6a2975f33a2f0151e.png)](https://gyazo.com/c9b383965dfb78e6a2975f33a2f0151e)

これで準備完了です。

# 使ってみる
名前を入力することで別表のデータから目的の値を自動的に参照できる準備が完全に整いました。
それでは、使ってみましょう。

* 使い方は簡単です。参照したいデータの名前を入力するだけです。たとえば、名前が__B__のデータを参照したい場合は、印刷シートの__C6__セルに__B__と入力して下さい。
    [![https://gyazo.com/b9661b385160b8456264f327eeb1771b](https://i.gyazo.com/b9661b385160b8456264f327eeb1771b.png)](https://gyazo.com/b9661b385160b8456264f327eeb1771b)

下図のようになれば成功です。

[![https://gyazo.com/85c27eb0e33772a57f71b0a4f6e45d91](https://i.gyazo.com/85c27eb0e33772a57f71b0a4f6e45d91.png)](https://gyazo.com/85c27eb0e33772a57f71b0a4f6e45d91)

以上。
【PHP】配列に値が存在するか調べるarray_search()関数。「!==」がポイント

##配列から特定のキーワードを検索した〜〜い！→array_search()を使おう

array_search()関数は、指定した値が存在した場合、**最初に見つけた要素の添字**を返します。存在しなかった場合は、**false**を返します。

ただし、**if文で**array_search()関数を使用する場合には、注意しなければいけないことがあります。それは、要素の添字が０の場合（配列の最初の要素の場合）、if文では「0」はfalseを返すので、正しい結果を得られることができません。そこで、以下のように書きます。

`$data`配列の中から`$keyword`キーワードを検索したい場合、`!==`を使用して以下のようなif文を書きます。

```php
$data = array('aaa','bbb','ccc','ddd','eee','fff','ggg');
$keyword = 'ddd';
$index = array_search($keyword,$data);
if ($index !== false) {
	echo $index;
} else {
	echo "false";
}
```
「とりま、array_search()関数でif文を使うときは、こういう書き方をする」ってテンプレ化すれば良いでしょう。

以下コード全文です。参考文献は「PHP逆引きレシピ」です。

```php:search_array.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>配列に値があるか調べる（array_search）</title>
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<?php 

// まずは任意の配列を定義
$data = array('aaa','bbb','ccc','ddd','eee','fff','ggg');
// 検索したいキーワードを定義しておく
$keyword = 'ddd';

echo "<p>配列：";
// まずは配列の中身を普通に書き出してみる
print_r($data);
echo "</p>";
// 配列を検索してみる
// 出力結果「検索する値：ddd」
echo "<p>検索する値：".$keyword."</p>";
echo "<ul>";
echo "<li>in_array関数の結果";
// 配列の中にまずはキーワードが含まれているかどうか調べる
// ->in_array()関数
// $dataの中に$keywordがあったらtrue
if (in_array($keyword,$data)) {
	echo "true";
} else {
	echo "false";

}
echo "</li>";

echo "<li>array_search()関数の結果：";
// array_search()->指定した値が存在した場合、最初に見つけた要素の添字を返す。存在しなかった場合にはfalseを返す。
// 「最初に見つけた要素の添字」->配列の最初の添字は0.
// if文では、0はfalseと同義とみなされてしまう。
$index = array_search($keyword,$data);
// そこで以下のように書きます。
// !== -> 値が等しくないか、同じ型ではない
if ($index !== false) {
	echo $index;
} else {
	echo "false";
}
echo "</li>";
echo "</ul>";

?>
</body>
</html>
```
出力結果です↓
![ 2018-05-16 7.30.17.png](https://qiita-image-store.s3.amazonaws.com/0/254159/7a6ae8d0-4149-d691-62f8-3dda4e9c4899.png)


###参考文献
PHP逆引きレシピ

現場からは以上です。押忍。
お笑い好きによるJavaScriptの関数宣言まとめ

#誰に向けて
- JS初学者に向けて

#目次
1.関数宣言
2.関数リテラル
3.アロー関数
4.それぞれの違い
5.まとめの表
#1.関数宣言
最もオーソドックスな書き方。

```javascript:pikotaro_func.js
function pikotaro(pen,fruits) {
  return fruits + pen;
}

console.log(pikotaro('pen','apple'));  //->applepen
```


#2.関数リテラル
変数に関数を代入する形式の書き方。

```javascript:pikotaro_lt.js
let pikotaro = function(pen,fruits) {
  return fruits + pen;
}

console.log(pikotaro('pen','apple'));  //->applepen
```

#3.アロー関数
関数リテラルをシンプルにした書き方。
'function'を省略する。

```javascript:pikotaro_arrow.js
let pikotaro = (pen,fruits) => {
  return fruits + pen;
} //処理が1つの場合、{}を省略できる。

console.log(pikotaro('pen','apple'));  //->applepen
```

#それぞれの関数の違い
##1.呼び出しの違い
関数宣言のみ、宣言したら順不同でどこからでも呼び出せる。

```javascript:pikotaro_func.js
console.log(pikotaro('pen','apple'));  //->applepen

function pikotaro(pen,fruits) {
  return fruits + pen;
}

console.log(pikotaro('pen','apple'));  //->applepen
```

関数リテラルとアロー関数は、宣言前に呼び出すと怒られる。

```javascript:pikotaro_lt.js
console.log(pikotaro('pen','apple'));  //->怒られる

let pikotaro = function(pen,fruits) {
  return fruits + pen;
}

console.log(pikotaro('pen','apple'));  //->applepen
```

```javascript:pikotaro_arrow.js
console.log(pikotaro('pen','apple'));  //->怒られる

let pikotaro = (pen,fruits) => {
  return fruits + pen;
} //処理が1つの場合、{}を省略できる。

console.log(pikotaro('pen','apple'));  //->applepen
```

##2.オブジェクト生成の違い
オブジェクトを生成する関数を、
**コンストラクタ関数**と呼ぶ。

オブジェクトはフィールドを持てる。
例えば、コンビオブジェクトは「ボケ」「ツッコミ」などのフィールドを持てる。

関数宣言と関数リテラルでは**コンストラクタ関数を作成できる**。

```javascript:combi_func.js
function Combi(boke,tsukkomi) {
  this.boke = boke;
  this.tsukkomi = tsukkomi;
}

var downtown = new Combi('matsumoto','hamada');
console.log(downtown);  //->Combi {boke: "matsumoto", tsukkomi: "hamada"}
```

```javascript:combi_lt.js
var Combi = function(boke,tsukkomi) {
  this.boke = boke;
  this.tsukkomi = tsukkomi;
}

var downtown = new Combi('matsumoto','hamada');
console.log(downtown);  //->Combi {boke: "matsumoto", tsukkomi: "hamada"}
```

アロー関数では、**コンストラクタ関数を作成できない。**

```javascript:combi_arrow.js
var Combi = (boke,tsukkomi) => {
  this.boke = boke;
  this.tsukkomi = tsukkomi;
}

var downtown = new Combi('matsumoto','hamada');
console.log(downtown);  //->怒られる
```

#まとめ
表にすると以下のようになる。

|                    | 関数宣言           | 関数リテラル | アロー関数   |
|--------------------|--------------------|--------------|--------------|
| **呼び出し**           | どこでも呼び出せる | 宣言箇所以降 | 宣言箇所以降 |
| **オブジェクト生成** | できる             | できる       | できない     |
| **this** | 呼び出し元によって変わる             | 呼び出し元によって変わる       | 宣言した時点で固定     |
【未解決事件】某日、事件は起こった【Paperclip】

#前説
公開の手直しをしていると、paperclip関連でとある事件が起こりました。

#某日、事件は起こった・・・

<img width="487" alt="スクリーンショット 2018-05-16 6.24.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/1257f7dd-79cf-bd30-2aac-e9bf11bd8a9b.png">

paperclipで保存した画像が表示されない問題。


##前提
Imagemagick
rails(4.2.0)
paperclip(6.0.0)->(4.8.0)でも試した
User画像をpaperclipで画像アップロードできる

##今まではできてた？

<img width="484" alt="スクリーンショット 2018-05-16 7.11.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/2f7dec9f-c5ce-74a0-a8d6-5d8c961228d0.png">

そう。ある日突然。
「事件発生後」に更新した画像はもう表示できない。
「事件発生前」の画像は表示されてる。

##Viewでfile_fieldになってる？

出力

```erb
 <%= image_tag  @user.avatar.url %>
```

入力

```erb
<%= f.label :image %><br>
<%= f.file_field :avatar %>
```

なってる


##データベースに格納されてないんじゃないの？

SQLで検索

```sql
select avatar_updated_at, avatar_file_name ,nickname from users;
```

<img width="906" alt="スクリーンショット 2018-05-16 7.21.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/579e8eaf-782c-eb8a-044b-b824b2b38c15.png">


一番下、画像のユーザー「yyyyyy」には何らかの画像が割り当てられています。


##modelとcontrollerはどうなってる？

```ruby:model/user.rb
has_attached_file  :avatar,
             styles: { medium: "300x300#", thumb: "100x100#" },
        default_url: '/default.png'
validates_attachment_content_type :avatar,
 content_type: ["image/jpg","image/jpeg","image/png"]
```


```controller/application_controller.rb
 def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:account_update) do |u|
      u.permit(:email, :password,:password_confirmation, :nickname, :avatar,:field, :birth,:current_password,:tag_list, {:tag_list => []})
    end
    devise_parameter_sanitizer.permit(:sign_up) do |u|
      u.permit(:email, :password,:password_confirmation, :nickname, :avatar, :birth, :tag_list, {:tag_list => []})
    end
  end
```

もし、user画像が保存されていない場合、default.pngが表示される仕組みになっています。

<img width="163" alt="スクリーンショット 2018-05-16 7.08.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/6d2a399d-d8ec-55e4-eb22-2a25d8c06cce.png">

こんな感じ

##ブラウザでnotfound出てるよな？

<img width="743" alt="スクリーンショット 2018-05-16 7.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/4c12694c-e8c4-fbe2-aa45-a2e1c0e61a28.png">

##格納先に行ってみよう

/public/system/users/avatar/000/000/id名

<img width="608" alt="スクリーンショット 2018-05-16 7.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/e4596583-5aad-f420-f9c7-df480acfcd38.png">

「yyyyyy」のidは48。

確かに格納されていない・・・

#やったこと

<img width="577" alt="スクリーンショット 2018-05-16 7.03.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/2a12e5fe-2ece-22c7-4ada-40e50e1a24e2.png">


データベースの画像更新履歴を見てみた。
「5/8 ユーザー名: 一護」に投稿した画像は難なく表示できていた。これが最新の更新成功履歴である。
(5/15はいずれも失敗)

<img width="183" alt="スクリーンショット 2018-05-16 7.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/de024558-9df8-b894-67c3-0cb40a9415b5.png">

##ということは5/8以降に変更した何かが問題を起こしている・・・？

Gitの更新履歴を見る。

<img width="1266" alt="スクリーンショット 2018-05-16 7.27.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/6593b6b8-423b-652e-a025-45278011e1eb.png">

コミットしててよかった。Gitの重要性を再確認。

##う〜ん、この。
よければアドバイスなどが欲しいです・・・

##個人的な推測
paperclipの保存先が悪い？？？
もうすぐリリースされるPython3.7環境をDockerで作る

Python3.7がもうすぐリリースされるようです。

[Release Schedule](https://www.python.org/dev/peps/pep-0537/#release-schedule)

リリース前に[新機能](https://docs.python.org/ja/3.7/whatsnew/3.7.html)を試してみたいと思います。

こういうときはソースからビルドするのが一昔前のやり方でしたが、今時はDockerで簡単に試すことができます。
[Docker Hub](https://hub.docker.com/) では [Pythonのイメージ](https://hub.docker.com/_/python/)が公開されていて、先日公開されたばかりの`3.7.0b4`のタグもあります。

```shell:DockerでPython3.7のインタプリタを実行
$ docker run -it --rm python:3.7.0b4
Unable to find image 'python:3.7.0b4' locally
3.7.0b4: Pulling from library/python
cc1a78bfd46b: Pull complete
:
:
Python 3.7.0b4 (default, May  5 2018, 02:57:38)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

デフォルトのインタプリタだと使いにくいので[IPython](https://ipython.org/)をインストールしたイメージを作成しておくと便利です。

```dockerfile:Dockerfile
FROM python:3.7.0b4

RUN pip install ipython

CMD ipython
```

```shell:イメージの作成
$ docker build . -t tag1216/ipython:3.7.0b4
```

```shell:実行
$ docker run -it --rm tag1216/ipython:3.7.0b4
Python 3.7.0b4 (default, May  5 2018, 02:57:38)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:
```

[PEP 557: Data Classes](https://docs.python.org/ja/3.7/whatsnew/3.7.html#pep-557-data-classes) を試してみます。

```python
In [1]: from dataclasses import dataclass

In [2]: @dataclass
   ...: class MyClass:
   ...:     a: int
   ...:     b: str
   ...:

In [3]: obj = MyClass(1, 'a')

In [4]: obj
Out[4]: MyClass(a=1, b='a')

In [5]: obj.a = 999

In [6]: obj
Out[6]: MyClass(a=999, b='a')
```
1/48シャアザクロボット化(1)

#はじめに
今日、突如友達から「プラモのザクにサーボモータ埋め込んだから動かしてくれ」と依頼され動かしてみました。![20180516_024334.jpg](https://qiita-image-store.s3.amazonaws.com/0/239543/7c74bf29-f5a1-f567-d1dc-910a644c289f.jpeg)
画像が横向き＆背景が汚いのは気にしないでください。
友達曰く卒業制作ver趣味だそうです笑

#サーボモータ搭載箇所
![20180516_024303.jpg](https://qiita-image-store.s3.amazonaws.com/0/239543/ec261731-55a0-d1cb-3128-ca744986c3a2.jpeg)
![20180516_024250.jpg](https://qiita-image-store.s3.amazonaws.com/0/239543/2e8a01ac-901d-f1ed-8e65-cb28de96286c.jpeg)

肩の前後と首の回転です。とりあえず、容赦なく削って埋め込んで瞬着でくっつけてました笑
ついでに目も光らせてくれとの事だったので、LEDも埋め込みました。都合上青色ですが、友達はそれでもいいそう。最近のガンプラはLED埋め込むことを見越して配線用の穴なんかもあってすごいですねえ。

![20180516_024236.jpg](https://qiita-image-store.s3.amazonaws.com/0/239543/fe73d567-e3c0-7f95-5f5e-eea39cc0f5aa.jpeg)

#動作確認
![index.gif](https://qiita-image-store.s3.amazonaws.com/0/239543/2dfaa41b-62fe-41d0-be64-e963db2991c3.gif)

とりあえず適当に動作確認しました。マイコンはArduino UNO使ってます。ソースコードは書くほどのものでもないので割愛します。
肩の前後関節あるとすごいオラついてますね笑

正直肩の前後関節はいらんやろと最初は言ってましたがこれはこれでいいかも。

#感想
首と肩を動かすだけでもやっぱり工作は楽しい。
さくらのレンタルサーバー（ライトプラン）にWordPressをセットアップ

作業記録です。
MySqlへのデータ移行も可能なので、
以前から契約している、さくらのレンタルサーバー（ライトプラン）に、
まずはセットアップしてみることにしました。

http://dogwood.skr.jp/wordpress/sqlite-integration-ja/
を参考にさせていただきました。

##ダウンロード
https://ja.wordpress.org/download/ から
wordpress-4.9.5-ja.zip をダウンロード。


https://wordpress.org/plugins/sqlite-integration/#installation から
SQLite Integration をダウンロード。
※「This plugin hasn’t been tested with the latest 3 major releases of WordPress.」とのことでしたが、物は試しと気にせず作業を続けます。

##アプリ作成
ダウンロードしたファイルをそれぞれ解凍します。
sqlite-integrationを
wordpress\wp-content\pluginsにコピーします。

sql-integration/db.phpを
wordpress/wordpress/wp-content/にコピーします。

wordpress/wp-config-sample.phpを
wp-config.php にリネームします。

https://api.wordpress.org/secret-key/1.1/salt
にアクセスして認証用ユニークキーを取得して
wp-config.php
の該当箇所を差し替え。

ftpでレンタルサーバにアップロード。
※できればセキュアな方法がいいでしょう。

レンタルサーバHOME/wordpress/wp-admin/install.php
にアクセス。

WPインストール画面が表示されるので、必要事項を入力してインストール。

ログイン画面でログイン。

404エラーが表示されたので、
ファイルマネージャ -> 表示アドレスへの操作 -> アクセス設定からindexファイルを追加。
(index.php)

以上でセットアップ終了です。
WindowsでRailsTutorialするときに気をつけること


# 環境
Windows10
Ruby+Devkit 2.5.1-1 (x64)
Rails 5.2

Cドライブ直下にRubyをインストールしています。

# LoadError
WindowsでRailsTutorialを行っていると、下記のようなエラーが出る場合があります。
その場合、Windowsに合わせたsoファイルの作成が必要です。

```
cannot load such file -- bcrypt_ext (LoadError)
cannot load such file -- sqlite3/sqlite3_native (LoadError)
```


# sqlite3のインストール

[こちら](https://www.sqlite.org/download.html)から環境に応じたdllとソースファイルをダウロードして展開
ソースファイル
sqlite-amalgamation-3230100.zip

DLL
sqlite-dll-win32-x86-3230100.zip　または sqlite-dll-win64-x64-3230100.zip

sqlite3.dllをRubyのbinフォルダにコピー

コマンド実行

```
gem install sqlite3 --platform=ruby -- --with-sqlite3-include=C:/sqlite-amalgamation-3230100 --with-sqlite3-lib=C:\Ruby25-x64\bin
```
※ --with-sqlite3-includeにソースフォルダ、--with-sqlite3-libにRubyのbinフォルダを指定してください。

次のパスにsoファイルが生成されます。
C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13\lib\sqlite3\sqlite3_native.so

sqlite3-1.3.13-x64-mingw32がインストールされている場合、こちらが優先されるためファイルをコピーします

```
mkdir C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13-x64-mingw32\lib\sqlite3\2.5
copy C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13\lib\sqlite3\sqlite3_native.so C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13-x64-mingw32\lib\sqlite3\2.5
```

※sqlite3-1.3.13-x64-mingw32をアンインストールしても動きますが、rails newのたびにインストールされるのでコピーを推奨します

## bcryptのインストール

コマンド実行

```
gem install bcrypt --platform=ruby
```

次のパスにsoファイルが生成されます。
C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\bcrypt-3.1.11\lib\bcrypt_ext.so

bcrypt-3.1.11-x64-mingw32がインストールされている場合、こちらが優先されるためファイルをコピーします

```
mkdir C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\bcrypt-3.1.11-x64-mingw32\lib\2.5
copy C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\bcrypt-3.1.11\lib\bcrypt_ext.so C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\bcrypt-3.1.11-x64-mingw32\lib\2.5
```

※bcrypt-3.1.11-x64-mingw32をアンインストールしても動きますが、rails newのたびにインストールされるのでコピーを推奨します
新人エンジニア向けおすすめ記事

#はじめに
自分の知識だとニッチな内容ばかりなので、こんな時期だし新人エンジニアにおすすめ出来る記事をコメントいれつつ紹介。
~~みんなの力をオラに分けてくれ！~~

#コーディング関係
[初級者向けVisualStudio便利機能集Vol.1](https://qiita.com/hart_edsf/items/4d1561751a96d145301a)
使用頻度が高いであろうVisualStudioのTips的な。
この記事自体は比較的古めなのでバージョンは古いですが基本は変わってないので大丈夫だと思います。

[Visual StudioユーザーがReleaseビルドをするときに必ずやってほしい2つの設定](https://qiita.com/lainzero/items/27681ddc96638e33758b)
コメントでは「やるべき／やらないべき」で意見分かれていますが、自分はやります。ファイルがスッキリするので（適当

[あっと驚かせるJavaプログラミング(をやめよう）](https://qiita.com/tatesuke/items/36924274f043f37a391f)
アンチパターン集。javaに限らずあらゆる言語でも同じことが言えると思います。
途中にある「カバレッジ100%」とかやらされたなぁ・・・としみじみ。

[Java初心者時代にコードレビューで指摘された悪しき習慣](https://qiita.com/gengogo5/items/5b038cf0b4034194f63a)
同じくアンチパターン集。被るところもありますが折角なので。
ただし何でも絶対的なことはなく、人や状況次第で意見がわかれるところも結構あるようですね。

#名付け
[プログラミングでよく使う英単語のまとめ【随時更新】](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)
コーディングや設計していると地味に悩んだりする、変数名やメソッド名。
つける際は大抵は英単語の組み合わせが多いと思うので単語の使い分けが出来ているとへんてこりんな名前にならずに済みます。コーディング規約などがあると事情が変わったりもしますが。
何よりも悩んでる時間の短縮が出来ますね。
ちなみに対義語の「start/stop」「begin/end」とか結構混同して「start/end」とかやります。自分もやります。
まあでも大事なのは「他の人に意味が伝わること」だと思います。

[プログラマーが知っておくべきローマ字の基礎知識](https://qiita.com/hypnos/items/4f31dff6241a907fba9b)
日本人にとっては馴染みのなさすぎる英語だったり、そもそも訳しようがない専門用語だったりする場合は日本語読みをそのままローマ字で名前にする場合もあると思います。
ローマ字の基本も知っていて損は無いかと。

[データベース列名の名前付け（英単語での）採用例を集めてみた](https://qiita.com/otagaisama-1/items/4d7e2eb5c274e9fce664)
データベースでテーブルの列名に有りがちな単語集。

#その他
[エンジニア歴20数年の私が、設計書を書く際に心がけていること](https://qiita.com/y-some/items/90651c1e27f7798f87c6)
やっぱ統一感は大事ですね。

[便利技・便利ツール](https://qiita.com/mo4_9/items/1aca9b3837c71ab58ba4)
定番のツール集。
WinMergeにはよくお世話になっています。
普段から便利ツールに慣れすぎると、インストール必須系は支給のPCとか一時的に使用しているPCで入れられなかったりして、使いたいものが使えなくてストレス溜まることも・・・。

[【学習メモ】LinuxCUI初心者が早く知りたかったコマンド(操作も)](https://qiita.com/Hige-Moja/items/44bbfb14868816169978)
知っているとLinux使う時に役立つもの。とかいう自分はLinuxろくに扱っていません・・・。

[不思議の国のSE用語](https://qiita.com/t_nakayama0714/items/478a8ed3a9ae143ad854)
どちらかというとある程度わかっている人が見てみて「あるあるｗｗｗ」ってなるやつ。
無理に覚えなくても、気づいた時には大体頭に入ってます。
やっている仕事によっても使うものも結構違いますが。

[新人さんに議事録の取り方をレクチャーしたときのメモ](https://qiita.com/y_saeko/items/44f3f7054a033960de23)
議事録取る時のイロハとか心得とか紹介してくれます。

#おまけ
[Web廃墟を作るときに心がけるべき7箇条](https://qiita.com/ssdkfk/items/4d62455a15feafc745c6)
※欠片も新人向けではありません
１５年以上前くらい？はまさに「個人ホームページ」ってこんな感じだったから懐かしさをおすそ分け。
リアルweb廃墟も結構いくつも残ってたりしますが。
zplugで管理するzsh環境

## はじめに

エンジニアたるもの、シェルを使いやすくしてなんぼだと思います。
数年`zsh`を使いプラグインマネージャーを`oh-my-zsh`を使ってきました。

しかし、もっさりしているのと気分転換に今回[zplug](https://github.com/zplug/zplug)に乗り換えました。
とても使いやすく、設定もわかりやすかったので、シェルに抵抗のある方もぜひ試してみてください。

## 環境

* Mac OS X 10.13.4

## oh-my-zshのアンインストール

```
$ uninstall_oh_my_zsh
```

> 必要な方だけアンインストールしてください

## 導入

`brew`でインストールを行うのが楽です。

```
$ brew install zplug
```

インストールが終わったら、`which zplug`でパスを確認しておきましょう。
> 自分の場合、`/usr/local/opt/zplug`というパスになっていました。

## .zshrcに設定を記入

`vi ~/.zshrc`で設定ファイルを開きます。

> プロンプトにpureを使っているので、.zshrcを書くまえに`npm install --global pure-prompt`しておいてください

```yaml
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh

autoload -U promptinit; promptinit
# プロンプトを変更
prompt pure

setopt auto_cd

zplug 'zsh-users/zsh-autosuggestions'
zplug 'zsh-users/zsh-completions'
zplug 'zsh-users/zsh-syntax-highlighting'
zplug "mollifier/anyframe"
zplug "mollifier/cd-gitroot"
# zplug "b4b4r07/enhancd", use:enhancd.sh
zplug "zsh-users/zsh-history-substring-search", hook-build:"__zsh_version 4.3"
zplug "junegunn/fzf-bin", as:command, from:gh-r, rename-to:fzf
zplug "junegunn/fzf", as:command, use:bin/fzf-tmux
zplug "supercrabtree/k"
zplug "junegunn/fzf", use:shell/key-bindings.zsh
zplug "junegunn/fzf", use:shell/completion.zsh
zplug "b4b4r07/enhancd", use:init.sh
zplug "paulirish/git-open", as:plugin
zplug "zsh-users/zsh-syntax-highlighting", defer:2
: "cd先のディレクトリのファイル一覧を表示する" && {
  [ -z "$ENHANCD_ROOT" ] && function chpwd { tree -L 1 } # enhancdがない場合
  [ -z "$ENHANCD_ROOT" ] || export ENHANCD_HOOK_AFTER_CD="tree -L 1" # enhancdがあるときはそのHook機構を使う
}

: "sshコマンド補完を~/.ssh/configから行う" && {
  function _ssh { compadd $(fgrep 'Host ' ~/.ssh/*/config | grep -v '*' |  awk '{print $2}' | sort) }
}

# 未インストール項目をインストールする
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi

# コマンドをリンクして、PATH に追加し、プラグインは読み込む
zplug load --verbose
```

上記で編集終わったら、`source ~/.zshrc`を実行するとプラグインのインストールが始まります。

便利なプラグインが[こちら](https://github.com/suin/dotfiles/blob/master/.zshrc)より確認出来るので、みて見てください。

以上です。

## 補足

```
chpwd: command not found: tree
```

以上のようなエラーが出た方は、以下のコマンドを実行することで解決出来ます。

```
$ brew install tree
```

## 参考

* [最小限まで削ったzsh用プロンプト｢Pure｣をインストールする](https://suin.io/565)
* [suinさんの.zshrc](https://github.com/suin/dotfiles/blob/master/.zshrc)
* [zplug](https://github.com/zplug/zplug)
* [zplug日本語ドキュメント](https://github.com/zplug/zplug/blob/master/doc/guide/ja/README.md)
ファイルの中身を見る際に使うコマンド

#何書くの？
今まで自分は、コンソール上でファイルの中身を見る際” cat ”しか知らなかったんですよ。でも他にも使えるものがあったので、メモを残しとこうと思います


#コマンド一覧

    　 |cat  |more  | less |
|---   |---|---|---|
|用途   |全部表示されるので、内容がでかいと見辛い|見易い量の情報をコンソールに表示。<p>エンターを押すごとに次の内容が閲覧できる|スクロール表示される  |

※　lessについてはこの記事が詳しい
https://qiita.com/ine1127/items/64b5b6cf52471c3fe59c


メモだけ
WiFi・GPS機能付き3Gモジュールを作る（前編）

# 何を作ったのか
WiFi・GPS機能付きの3G通信モジュールです。ただ、HWの設計に関する知識を持ち合わせていないので、0からHWを設計したわけではなく、WiFi機能があるモジュール（ESP8266）と、3G通信、GPS機能のあるモジュール（SIM5320J）を組み合わせたモジュールを作ったという話です。（作ったと言うのだろうか？）

# なぜ作ったのか
これを作った当時（2016年くらい）、携帯電波網を利用できる比較的安いArduino向けのモジュールがありませんでした。当時はマイコンによる3G通信で安価なホビー向けの環境は「Raspberry Pi ZERO + 3Gドングル + SORACOM SIM」の選択肢が一般的でした。そんな中「USBドングルでかい、Raspberry Pi ZERO意外とでかい、電源リソース苦しい、Arduino使いたい」という私の我儘を叶えられるモジュールはないかと奔走しましたが、そんな願ったり叶ったりなモノは見つかりませんでした。SORACOMというIoT界の頼れる兄貴が次々と便利な仕組みを作ってくれている中、何とかその波に乗りたいという思いの元、モジュールの自作に踏み切りました。

# オープンソースハードウェアに感謝
### Adafruitとの運命の出会い
安い3Gモジュールが無いかとネットの海を彷徨っていると、OSH（OpenSourceHardware）で有名なAdafruit Industriesの[Adafruit FONA 3G Cellular](https://learn.adafruit.com/adafruit-fona-3g-cellular-gps-breakout/)（以下Fona）という比較的安価（$79.95）なモジュールに出会いました。Arduinoで利用するためのライブラリも提供されています。いたれりつくせりです。しかし技適という壁が立ちはだかり、購入しても日本では使えません。
![FONA](https://cdn-shop.adafruit.com/640x480/2687-01.jpg)

### モジュール部分を技適対応すればよいのでは？
Fonaには3G通信用のモジュールに「SIM5320」が使用されていますが（画像のものはアメリカ向けのSIM5320A）、特定のアンテナとセットで技適が取得されている「SIM5320J」という日本向けのモジュールがありました。モジュールをこれに置き換えて自分で作成してしまえば、日本で使用することが可能です。そしてAdafruitの製品は全てOSH。全ての回路図が[Eagle](https://www.autodesk.co.jp/products/eagle/overview)（基板設計用ソフト）のデータ形式で公開されています。自分で作ってしまっても構わないのだろう？と言わんばかりです。

### 改修内容
FonaはSIM5320の機能を余すことなく使い切るために必要な全ての部品が乗っていました。しかし、3G通信するだけであれば部品点数がグッと減らせそうだったため、以下のような回路に修正することにしました。

- 電話機能用のスピーカー回路削除
- イヤホンジャック削除
- バッテリーは電池駆動を想定したのでリチウム電池用の充放電管理回路を削除

# 後半に続く
Qiita初投稿のため、画像のアップロード上限が2MBしかなく、画像を用いた説明が全然できないので一旦ここで区切ります。後編に実際の制作過程を記載します。
後半作成しました。[こちら](https://qiita.com/nishinohi/items/34b60333add251095ce5#_reference-a23b42fa44e0d6ae30ce)からどうぞ。

# ちなみに
GPSとWiFiはついてないですが、[WioLTE](https://www.seeedstudio.com/Wio-LTE-JP-Version-4G%2C-Cat.1%2C-Espruino-Compatible-p-3018.html)という、もう手軽な携帯通信モジュールは全部こいつで良いんじゃない？的なベストプロダクトが[Seeed](https://www.seeedstudio.com/)さんから提供されています。皆さんこれを使いましょう。ありがとうSeeedさん！
![WioLTE](http://akizukidenshi.com/img/goods/C/M-12855.jpg)
shadergraphとかパイプラインを変更して、ピンクになったときの修正方法

Unity2018.1 で以前のプロジェクトをからコンバートして描画パイプラインをLWRPやHDRPに変更したり、
途中でShadergraph使いたいからLWRPに切り替えたらピンクになった人が多いと思います。

# なぜ起きるのか?
恐らくShaderがパイプラインに対応していなくて
描画できなくなっているからだと思います。

# 解決方法
shader(マテリアル)を対応さえる必要があります。
ピンクになっているオブジェクトのマテリアルのshader項目を確認すると
従来の(Standardとか)マテリアルを使っていると思います。
![shaderChangepng.png](https://qiita-image-store.s3.amazonaws.com/0/240260/a91ce143-c480-1f96-3deb-81d54acd009c.png)
ここを修正します。(一括で自動設定する方法は下に書いてます)
軽量パイプライン(lightweight)を使っているなら、shaderもLightweightPipelineの中から使用してください。
これで描画できるようになります。
基本(Metallic・Occlussionなどが設定できる) 　　　→　Standard(Physically Based)
光を簡単に描画　　→　Standard(Simple Lighting)
光の影響を受けない　→　Standard Unlit
になると思いますが、詳しい違いはちゃんと調べた方がいいですね。

なんにせよ手動で変更するのは面倒で
この変更を一括で行ってくれる機能を準備してくれていました。

**Edit　→　Render Pipeline　→　Upgrade ～～**
![UpgradeShader.png](https://qiita-image-store.s3.amazonaws.com/0/240260/eb5ae375-fa0f-c5b9-f102-404e1bfe2463.png)

プロジェクトごと変換するのか、選択したのだけ変換するのか2パターン準備されてます。


#まだピンク残ってるんだけど...
この機能ではデフォルトのマテリアルを使っているものと、自分で書いたシェーダーが変換されませんでした。
**デフォルトのマテリアルでピンクになっているものは
自分でマテリアルを作成して割り当てるといいです。**
基本図形(Cubeとかsphere)なら、現在のパイプラインに合わせてマテリアルが割り当てられるので削除して再度createすると良い。

**自分で作成したシェーダーは残念ながら自前で対応させるしかないのだろうか・・・**
自分で書き直すのも勉強になって良さそうです　[→サンプルリンク](http://illu.tistory.com/1339)
何かご存知の方がいらっしゃったら参考になるリンクなどご教授いただけると幸いです。
わたしからみたアジャイル

ごきげんよう、🐱です。

アジャイル、してますか？ 最高にCoolなEngineerである諸賢はアジャイルであるに違いない。違うとは言わせない。何故ならこのポエムを読んでいるからだ。

今日はアジャイルのおはなしをしましょう。

#開発のアジャイル
さあ、早速認識をハックするぜ。

**ウォーターフォールはアジャイルだ**。

確か『[アジャイル・サムライ](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560/ref=sr_1_1?ie=UTF8&qid=1526945546&sr=8-1&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB+%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4)』の謂だな。本物のウォーターフォールは実にシンプル、かつ、厳密だ。

定めし品質を満たさなければ、次の工程に進んではならない。

某証券取引所のプロジェクトが大成功したね。ウォーターフォールを徹底したんだ。納得行くまで設計を練って、都度理念に立ち戻って、ヴィジョンに齟齬があれば工程を遡ることも辞さなかった。V&Vモデルとか呼ぶ。

実際、お金や人命に関わるプロジェクトはウォーターフォールが手っ取り早いだろう。試して失敗することを繰り返すコストが高過ぎる。

要するに最も合理的であれば、それがアジャイルだ。

#職場のアジャイル
上機嫌でいるかな？ 最高にCoolなEngineerであるところの諸賢は、自分の振りまく価値に酔い痴れているか？

そうでなければ場所を変えろ。

運命と上手くダンスするコツはね、正しい場所に、正しい時にいることだ。そこに至るには適切な服を着て適切な言葉遣いをすればいい。

最高にCoolなEngineerであるところの諸賢は、自由だ。

どこでも食って行ける。居心地のよいところにひたすら拘れ。そうすると仕事に、自分の振りまく価値に酔い痴れて、ちょっと大変なことになる。

経験則的に限界120%は3ヶ月もつ

経験則的に限界150%は1ヶ月もつ

経験則的に28時間365日働くと半月くらい何も出来なくなる

ギリギリ98%を保ち続けよう。継続的に、過激でいるために。それがアジャイルだ。

#転職のアジャイル
そんなんオープンポジションでドンだよ。何を迷う必要があるんだ？ Green様やBizreach様の最高のサービスがあるじゃないか。人事は人事にアウトソーシングだよ。

それに同意出来ない会社はこっちからお断りだ。そうだろ？ 不要な喧嘩はしない。それがアジャイルだ。

#人生のアジャイル
最高にCoolなEngineerの日常的な業務として、残念なことに、鬱病のケアなどがある。それでいい。

鬱病とパニック症がいは、投薬で必ず治る。🐱の主治医の言葉だ。メンタルはメンタル屋さんにアウトソーシング。

最高にCoolなEngineerであるところの諸賢は、常に感受性をビリビリにしている。リスクにすぐ気付く。そして、人一倍傷付く。

それでいいんだよ。

勝つまで負けるんだ。気高いことだ。とってもとっても勇気のいることだ。そのためにレジリエンスという概念がある。この記事はポエムだから、詩をお贈りする。女傑、茨木のり子さんだ。

駄目なことの一切を
時代のせいにはするな
**わずかに光る尊厳**の放棄
自分の感受性くらい
自分で守れ
ばかものよ

自分の感受性くらい ー 茨木のり子

死に易いが滅ばない。勝てるまで負け続ける。Fail Fast and Retrospective。それがアジャイルだ。

#結びに
後半重たい感じだったね。読んでくれてありがとう。今度は軽めなの行こうね。

My pleasure.
My honour.
see ya soon.
Your faithful 🐱
macOS Xでmglearnがimportできなかったときの話

mac OS：OS X Capitan 10.11.6
Python：3.6

初のQiita投稿ながらだいぶニッチな内容。
機械学習の勉強がてら環境構築をしていて、タイトルの問題に直面。

# <b>状況
`$ pip install mglearn`
でインストールが完了したかと思いきや、

```python:terminal
import mglearn
```

で呼び出すと

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File 
...
RuntimeError: Python is not installed as a framework.
...
```

とか何とか出てしまいエラー。


# <b>対応
自分の環境では主に3つ対応が必要だった。

### <b>1.環境パス設定

下記の内容をそのまま実行。
参考：[pip install したパッケージをimport できないときの対応](https://qiita.com/quvo/items/1f4075203854ced19ec5)
※
自分の場合は参考URLと違い、下記のパスを通した。
`~/.pyenv/versions/3.6.4/lib/python3.6/site-packages`

### <b>2.imageioのinstall

よしパスが通った、ということでいざjupyter notebookで一式importしてみると今度は`imread`で引っかかる。

```python:jupyter_notebook
ImportError: cannot import name 'imread'
```

どうやらscipy1.0以降では`imread`はscipy.miscではなくimageioから参照してほしいとのことらしい。

参考：[scipy.misc.imread](https://docs.scipy.org/doc/scipy-1.0.0/reference/generated/scipy.misc.imread.html#scipy.misc.imread)

`$ pip install imageio`
ということで`imageio`のインストール。
これで`imread`でエラーを吐くことがなくなった。

### <b>3.mglearn配下のファイルを書き換え
今度こそこれで実行出来る、と思いきや`mglearn`配下のpyファイルでscipy.misc経由で`imread`を呼ぶファイルが2つある模様。

```python:~animal_tree.py/~interactive_tree.py
from scipy.misc import imread
```
↓

```python:~animal_tree.py/~interactive_tree.py
from imageio import imread
```
bak作成後にimageioからの呼び出しに書き換えて、対応完了。
試行錯誤の段階で不要なものinstallしすぎた。。
[git] 一つ前のブランチに切り替えるコマンド


一つ前のブランチに切り替えるコマンドです。

```
git checkout -
```

現在のブランチが `branch_A`、直前のブランが `branch_B`だとしますと、
下記のようにこの２つのブランチの間に行ったり来たりしたい時に便利なコマンドです。

![Kobito.lHjAE8.png](https://qiita-image-store.s3.amazonaws.com/0/170309/beae3164-49c4-10fd-9f01-cb69595e05f5.png "Kobito.lHjAE8.png")
Pythonista3 をいろいろ触ってみる


## 0. はじめに

- 最近、Pythonを絶賛勉強中！
- 勉強がてら、iPhoneやiPadで気軽にPythonを扱うことのできる「Pythonista3」に出会う
- 日本語のドキュメント類がないみたいなので、実際に触りながら、いろいろTipsとしてまとめていきたい
- <font color="Red">※個人の勉強ついでにまとめていくので、いろいろ間違いや不備と思いますが、お許し下さいm(_ _)m</font>
	- <font color="Red">※前もって誤っておきます…</font>

## 1. Pythonista3とは？

- iPhoneまたはiPadでPythonスクリプトを扱うことのできる開発環境
- 有料アプリ(※2018/05/15時点で、¥1,200)
- 多くの開発例が紹介されており、例を参考にして自由な開発ができる
	- 例）アニメーション、イメージ操作、カスタムユーザインタフェース、オートメーションスクリプトなど...
- 標準ライブラリに加え、iOS機能との互換作用を広くサポートしている
- コマンドモードでも操作可能
	- ちょっとコマンドを試したい時などにとても便利
- 多種多様なライブラリを使用することができる
- 日本語のドキュメントが少ない
- iPhoneやiPadの標準キーボードでの実装はなかなか大変
	- Bluetoothキーボードなどを使ったほうがやりやすい
- 公式サイト(http://omz-software.com/pythonista/)

## 2. 導入方法

- 以下のサイトにアクセスし、ダウンロードする
	- https://itunes.apple.com/us/app/pythonista-3/id1085978097?ls=1&mt=8
- アプリは有料(※2018/05/15時点で、¥1,200)
- 結構、アプリのレビュー評価は高い
- アプリ単体で約520MB程度喰うので、容量の確保は必須
- 言語はEnglishのみ
	- 日本語対応されるのが待ち遠しい…

![スクリーンショット 2018-05-16 0.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/33479/ce0826a2-9612-bbe8-dc61-441235a18f21.png "スクリーンショット 2018-05-16 0.01.39.png")

## 3.基本的な操作方法

- ダウンロードが完了すると、以下のようなアイコンが表示される

![IMG_0152.PNG](https://qiita-image-store.s3.amazonaws.com/0/33479/d9bef5d5-fed2-ae37-5a33-637d994eaa02.png "IMG_0152.PNG")

- スタート画面は下記のとおり
	- Exampleなども豊富に準備されていて開発しやすい印象
	- Python2とPython3を選択して使用できる


![IMG_0153.PNG](https://qiita-image-store.s3.amazonaws.com/0/33479/4a057173-ff5f-9d12-7b08-28c5dd63ff12.png "IMG_0153.PNG")



- コンソールモードでいろいろ試すことができる
	- コンソールモードにするには、画面の左から右側へスワイプする

![IMG_0154.PNG](https://qiita-image-store.s3.amazonaws.com/0/33479/abd6d4a0-e813-c5d6-f2be-b9a11f8d1623.png "IMG_0154.PNG")

## 4.今後

- まだ触り始めたばかりなので、使い方については勉強中
- ある程度使い方が分かってきたらさらに記事を書いて行く予定

## 5.関連記事

- [Pythonista3 をいろいろ触ってみる_その1](https://qiita.com/Dace_K/items/4d5fa69c02bf5c6d626c)
- [Pythonista3 をいろいろ触ってみる_その2](https://qiita.com/Dace_K/items/f8db8d9cf4935338c2c2)
- [Pythonista3 をいろいろ触ってみる_その3](https://qiita.com/Dace_K/items/11eabdd82841a39816c9)
- [Pythonista3 をいろいろ触ってみる_その4](https://qiita.com/Dace_K/items/9f61608b3a541bf77abb)




## 6.参考文献

- [App Store Pythonista 3](https://itunes.apple.com/us/app/pythonista-3/id1085978097?ls=1&mt=8)
- [Pythonista 3](http://omz-software.com/pythonista/)
- [PyCon JP](https://www.pycon.jp/)
setup.py installはeasy-install.pthを作成する


表題の通り、`sudo setup.py install`を実行すると、/usr/local/lib/python2.7/dist-packages/easy-install.pthが作成されます。
sitecustomize.pyを別に活用している場合は環境が壊れる可能性があるので注意してください。

`sudo pip install .`がおすすめです。
Reactのfunction as childとは何か

[この記事](https://qiita.com/khatada/items/853b0435d238d9e1f603)でReactコンポーネントのchildrenにFunctionを渡していて気になったが、childrenとしてFunctionを渡すパターンがあるらしい

# コード

- propsのchildrenを関数呼び出しするのがポイント
  - TypeScriptで単純にthis.props.childrenを関数呼び出しすると型定義でエラーになった

``` tsx
import * as React from "react";
import * as ReactDOM from "react-dom";

class Container extends React.Component<{}, {}> {
    render(){
        const children = this.props.children as Function;
        return <div>
            {children({foo: "bar"})}　// propsのchildrenを関数呼び出し
        </div>
    }
}

class App extends React.Component<{}, {}> {
    render(){
        return <Container>
            {({foo}) => <div>Content {foo}</div>}
        </Container>
    }
}

ReactDOM.render(<App/>, document.getElementById("root"));
```

# 何に使えるか
- このパターンが[react-motion](https://www.npmjs.com/package/react-motion)や[react-measure](https://www.npmjs.com/package/react-measure)等で利用されてるのを見ると、レンダリングに関する複雑な処理をコンポーネントに押し込め、かつ、その処理結果に基づいてchildrenを描画したい場合に使えそうだ
- [こちら](https://codedaily.io/tutorials/6/Using-Functions-as-Children-and-Render-Props-in-React-Components)では、propsで渡したurlからfetchした結果に基づいて、childrenを描画するコンポーネントの例が示されているので、このような非同期処理等に係るstateの変化をコンポーネントに押し込めるのにも使えそう

# 例：タイマーコンポーネント

すごく人工的な例…
一定時間置きに時間更新するという処理をコンポーネントに押し込め、具体的な描画はchildrenコンポーネントでやる

``` tsx
import * as React from "react";
import * as ReactDOM from "react-dom";

class Timer extends React.Component<{ interval: number }, {}> {
    private timer = null;
    state = {
        now: new Date()
    };

    onTimer = () => {
        this.setState({ now: new Date() });
        this.timer = setTimeout(this.onTimer, this.props.interval);
    };

    componentWillMount() {
        this.onTimer();
    }

    componentWillUnmount() {
        clearTimeout(this.timer);
    }

    render() {
        const children = this.props.children as Function;
        return children({ ...this.state, ...this.props });
    }
}

class App extends React.Component<{}, {}> {
    render() {
        return <Timer interval={1000}>
            {({ now }) => <div>Timer {now.toLocaleTimeString()}</div>}
        </Timer>
    }
}

ReactDOM.render(<App />, document.getElementById("root"));
```

# 参考文献
- [Using Functions as Children and Render Props in React Components](https://codedaily.io/tutorials/6/Using-Functions-as-Children-and-Render-Props-in-React-Components)
サポート業務を1~2割減らすためのナレッジ活用方法

#はじめに

サポートエンジニアになり3年程経ちますが、ナレッジベース（以下、ナレッジ）を活用することで、
ユーザーからのお問い合わせ対応時間を1~2割減らすことができるようになりました。

意外とナレッジを書いて放置したまま、使用していない場合も多いようなので、
サポート業務を1~2割減らすためのナレッジ活用方法について実践したことを書いてみようと思います。
（業務系のちょっと複雑なシステムを想定しています。）

##再利用性を考える
プログラミングでは同じコードを書かないよう再利用性を大切にすると思いますが、
ナレッジとなると何回も何回も同じことを書きがちです。

たとえば、Qiitaのナレッジベースで、
「アイコンの設定方法」「パスワードの変更方法」という記事を別々に作成したとします。

両方とも設定画面にある機能なので,
「画面右上のアイコンのとなりにあるプルダウンタブをクリックします。その後、設定をクリックし設定画面に遷移します。」
などと、単調な手順をそれぞれの記事で案内する必要があります。

このような、重複する文章は別ナレッジに切り出すと捗ります。

例えば「設定画面までの遷移方法」というナレッジを作り、スクリーンショット付きでわかりやすく遷移方法を説明します。
そして、それぞれの記事では、遷移方法を文字で書くのではなく、
「設定画面まで遷移します。（参照リンク：http://）」といったように「設定画面までの遷移方法」記事へのリンクに変更します。

可読性があがりますし、UIに変更があった場合も
「設定画面までの遷移方法」を編集すれば良いだけなので、変更が用意になります。
Qiitaはシンプルですが、業務システムは画面遷移が複雑な場合も多いので再利用できる典型例だと思います。


##メールで案内することを前提とした記事もこっそり作る
ナレッジというとユーザーが検索して、自己解決するためのもの。というイメージが強いのではないでしょうか。
その思い込みを捨てて、お問い合わせが来たときにメールで参照リンクとして記載する用途の記事も積極的に作成するべきだと考えています。

1つ例を上げると、製品サポート用のログは、基本的にはサポートからの依頼がないと取得しないですよね。
なので必然的に手順もメールで送ることが多いです。このような場合ナレッジに追加したものか迷うのですが、
製品サポート用ログ取得手順としてナレッジ化してしまいます。

ナレッジにすればスクリーンショット使ってわかりやすく案内できます。
メール本文に長い手順を書くことは可読性を落としますし、サポート側としても毎回コピペの手間が発生します。
メールに間違いがないかレビューするときも、最低限の確認で済みます。

ただ、このようなナレッジには、サポート窓口から案内があった場合だけ実施して欲しい旨を
記載した方が無難です。


##必ず検証する
ナレッジに間違いがあってはいけません。記憶を頼りにしたり、ほぼほぼ大丈夫だろ、、といった意識でナレッジを書くのはやめましょう。
不特定多数のユーザーの目に触れるものですので、ナレッジに間違いがありデータが欠損した。なんてことになると一大事です。
必ず検証して、間違いが無いように記載することが結果的に一番効率化できます。


##前提条件を記載する雛形をつくる
ナレッジには決まって記載する前提条件などは、雛形として毎回ナレッジの冒頭に書くようにしています。

例：
- 所用時間
- 影響範囲
- 対象の製品バージョン

たまに最後に記載しているナレッジがありますが、
製品バージョンや所用時間などは、このナレッジを見るか見ないか判断する上で重要な情報なので、必ず冒頭に書くようにしています。

##コマンドやクエリの実行は、正常な実行結果も合わせて案内する
ひと手間ですが、コマンドの実行が終わると〇〇というログが出力されます。といったように
正常に実行が終了したことを確認する方法も合わせて記載しています。

作業後の期待する結果を記載しないと、
コマンドを実行後エラーで止まっているのに、エラーメッセージが英語でユーザーの目にとまらず、
1週間待ってもコマンドの実行が完了しないといった、悲しいお問い合わせをいただくことになってしまいます。

##文章はとにかく。で区切る
小説ではないので、一文は短く”。”で区切っています。　
これは技術系の書籍は一文が短いので試しに真似してみたのですが読みやすく、書きやすくなります。

「Qiitaにログインして、画面右上のアイコンのとなりにあるプルダウンタブをクリックした後に、表示された設定をクリックして、設定画面に遷移します。」
よりも
「Qiitaにログインします。画面右上のアイコンのとなりにあるプルダウンタブをクリックします。表示された設定をクリックして、設定画面に遷移します。」
の方が読みやすいのではないでしょうか。

##重複をおそれない
記事が増えてくると、あれ？これと似たような内容むかし書かなかったっけ！？と心配になることもあります。
5分程度で書けるナレッジなら書いてしまった方が早いです！ 同じ内容でも切り口が異なると記事は有用ですし、昔より今の自分の方が良いナレッジが書けるはずです。

##スクリーンショットを多用する
文章で手順を説明するのではなく、とにかくスクリーンショットを使います。
またQiitaの例ですが、「Qiitaにログインします。画面右上のアイコンのとなりにあるプルダウンタブをクリックします。表示された設定をクリックして、設定画面に遷移します。」
よりもスクリーンショット一枚とった方が早くてわかりやすいです。
<img width="428" alt="スクリーンショット 2018-05-15 23.14.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/162167/e507493f-0964-1282-8c21-fcaa22f60133.png">

##まとめナレッジを作る
ある程度ナレッジが溜まってきたら、見てもらいたいのに埋もれてしまうナレッジも出てくるので、
「最低限の設定で始めるスタートアップチュートリアル」とか、「ダッショボードを使いこなす方法」など
テーマごとにリンクを集めてまとめナレッジを作っています。
まとめナレッジは通常よりもわかりやすい場所に表示します。

#番外編

##target blank をつける
文中のリンクには必ずtarget=”_blankを付けて新しいタブで開くようにしています。
ナレッジ読んでいる途中にあとで読もうと思ってリンククリックしたときに、そのまま画面が更新されると絶望します。

#まとめ
以上がサポートを効率化するために行なっているナレッジの運用方法です。
また思い出したら随時更新していこうと思います。
pytestのデコレータに引数を渡す


|pytest|URL|
|:--|:--|
|xdistの-nオプションについて|https://qiita.com/cielavenir/items/3f3319f3fa153c16c703|
|デコレータの作り方|https://qiita.com/cielavenir/items/542f7eaa612c6bb9ed90|
|デコレータに引数を渡す|https://qiita.com/cielavenir/items/2c971ca4bc138c375d17|
|部分テストパラメータの値を使ってテストパラメータを生成する|https://qiita.com/cielavenir/items/ce328313a9f0f498cbcb|
|pytestのfixtureを別の箇所でライブラリとして読み込みたい<br>(当該環境にはpytestが存在しない可能性がある)|https://qiita.com/cielavenir/items/8144774a6ac2eca2e2ce|

デコレータの中身に引数を渡すには、ダミーのフィクスチャを用意し、シグネチャからそのフィクスチャのインデックスを取得、argsを書き換えれば良い。

To pass arguments to pytest decorator, prepare dummy fixture and let the wrapper get the argument index using signature, and overwrite args.

```py:overwrite_fixture.py
import pytest
import decorator

try:
	from inspect import signature
except ImportError:
	from funcsigs import signature

@pytest.fixture(scope='module')
def var1():
	return 1

@pytest.fixture(scope='module')
def var2():
	return 2

def wrap(func):
	def wrapper(func,*args):
		sig = signature(func)
		idx = list(sig.parameters).index('var1')
		arglst = list(args)
		result = []
		for e in [10,20]:
			arglst[idx] = e
			result.append(func(*arglst))
		assert result[1]-result[0]==10
	return decorator.decorator(wrapper,func)

@wrap
def test_0(var1,var2):
	return var1
```