OmniAICreator/Qiita-1.07M huggingface dataset:
JMPで描く「散布図」

「データ分析の必要性を感じていても、どこから始めれば良いのか分からない」という方を対象に、さまざまなグラフの作成法をご紹介しているこのシリーズ。

今回は「散布図」の描き方です。

[※散布図（分布図）は、縦軸と横軸にそれぞれ別の量や大きさ等をとり、データが当てはまるところを点でプロットしたもので、2つの量の関係性を見るのに優れたグラフです。]

利用可能なデータが社内に存在するのに、それを十分に活用できていないのはもったいないですよね。いくつかのグラフの作成法を知っていれば、状況に応じた適切なデータ分析が可能になります。今回も一緒に頑張りましょう！

■ セットアップ
JMPを起動します（まだインストールしていない方は[**こちら[トライアル版]**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)からダウンロードしてください）。
■ 散布図（２つの変数）
１、対象データを開きます（今回はサンプルデータを使用します）。
「ヘルプ」>「サンプルデータライブラリ」と進み、「Car Physical Data.jmp」を選択します。
<img width="800" alt="asset1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/81674b83-703a-ed25-9471-c04a4eb8e01b.jpeg">
<img width="800" alt="asset1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/9f5db2b1-14e7-3ae4-a11d-ea78e2596ca1.jpeg">
２、メニューから「分析」>「二変量の関係」を選択します。
<img width="800" alt="asset2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/e7d1314c-ba35-837d-a332-8d3893e7e174.jpeg">
３、列の選択ボックスから、連続尺度（青い三角のアイコン）の目的(従属)変数を選択し、「Y, 目的変数」をクリックします。この例では「馬力」を選択します。
４、列の選択ボックスから、連続尺度の説明(独立)変数を選択し、「X, 説明変数」をクリックします。この例では「排気量」を選択します。
<img width="800" alt="asset3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/b6f18012-e217-eec0-e222-e4077c148c49.jpeg">
５、「OK」をクリックすると、排気量と馬力の関係を表す散布図が表示されます。
<img width="600" alt="asset4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/da3f20ba-0a76-77e5-e7dd-313d4240dda2.jpeg">

■ 散布図（3つ以上の変数）
１、続けて、同じサンプルデータから３つ以上の変数を用いた散布図を作成してみましょう。このように、複数の変数がある場合に、全ての2変数同士の組み合わせで散布図を作成し、それらを行列の形式に並べたものを「散布図行列」と呼び、複数の変数の相関関係を視覚的にとらえることができます。

２、メニューから「グラフ」>「散布図行列」を選択します。
<img width="800" alt="asset5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/95ecda2f-ac16-7e6c-6d62-56835e525b05.jpeg">
３、分析したい連続尺度の列（青い三角のアイコン）をすべて選択し（今回は「車両重量」、「最小回転半径」、「排気量」、「馬力」、「燃料タンク容量」を選択）、「Y, 列」をクリックします。
<img width="800" alt="asset6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/ed653428-488f-eb7c-091d-ee7eec88f1f7.jpeg">
４、「OK」をクリックすると、散布図行列が表示されます。
<img width="600" alt="asset7.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/ba17eef4-a1ba-c9f2-da8e-75e2b631eb98.jpeg">
なお、散布図および散布図行列は、「分析」>「多変量」>「多変量の相関」、または「グラフ」>「グラフビルダー」からも作成できます。

■ 動画（英語版）
実際の操作を見て、復習してみましょう。
※動画では、更に細かい設定についても説明していますので興味のある方はご覧ください。

また[**JMP 14.2のマニュアル**](https://www.jmp.com/support/help/ja/14-2/eg-scatterplot-matrix.shtml#)にも設定方法の記載があります。


[**Scatterplots（動画）**](http://players.brightcove.net/1872491364001/default_default/index.html?videoId=5541676846001)


■さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。

さあ始めましょう。ダウンロードはダウンロードは[**コチラ**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)！

■JMPについて
JMP（ジャンプ）は世界中のエンジニア、データアナリストに選ばれているインタラクティブで可視的なデータ分析ツール。SAS のビジネスユニットです。

＜ SNSで様々な情報をお届けしています ＞
[**Facebook**](https://www.facebook.com/JMPjpn)
[**Twitter**](https://twitter.com/JMP_Japan)
vscodeでリモートにつなげる初期設定



vscodeの拡張プラグインを使用する。


1.拡張入れる

2.コマンドパレットで下記のコマンドを実行。

win:Ctrl+Shift+P
mac:Cmd+Shift+P




## SSH FSプラグインを使用


```
SSH FS: Create a SSH FS configuration
```



## RemoteSSHプラグインを使用

IdentityFileにキーのパスを入れる。
※ パスに日本語を使わないこと。



# 参照

https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs


https://ippu-biz.com/development/wordpress/remote-ssh/
PsychoPyのRoutine（ルーチン）のコピーと貼り付け

[PsychoPyで画像の印象評定](https://qiita.com/kurokida/items/c4d5b6055ae4c610eca6)で、実験プログラムとしてはだいたい完成していますが、このままではひとつの質問しかたずねることができません。複数の質問について回答させるにはどうしたらよいでしょうか。

その方法はいくつかあると思いますが、ここでは既存のルーチンをコピーして貼り付ける方法を説明したいと思います。

stimulusルーチンを開き、**Routineのコピー**をします。

<img width="388" alt="スクリーンショット 2019-10-03 15.18.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/97478473-384d-41e2-8f40-629700507ccf.png">

その後、**Routineの貼り付け**をします。以下の図のように stimulus_2（別の名前でも問題ないです）ができればOK。

<img width="554" alt="スクリーンショット 2019-10-03 15.19.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/0a014d89-f64b-7e6e-1406-c8b9199cb520.png">

ルーチンをコピーして貼り付けるメリットは、苦労して配置したコンポーネントを再利用できる点です。新しく作成したルーチンに、image, rating, textコンポーネントがすでに含まれていることを確認してください。

textコンポーネントの文字列を変更して、２つ目の質問を記入してください。

<img width="624" alt="スクリーンショット 2019-10-03 15.44.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/19ac9d1c-a3a7-062c-0376-dc16a5801098.png">

#Routineを挿入
新しくルーチンを作成することはできましたが、実はまだ、実験には組み込まれていません。実験に組み込むには、FlowのRoutineを挿入をクリックします。

<img width="607" alt="スクリーンショット 2019-10-03 15.47.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/1eb2d643-21fc-bbe8-dc3b-748e8c18d39e.png">

新しいルーチンstimulus_2を挿入しますが、その場所が重要です。**既存のstimulusの直後、そしてループの中**です。下の図の赤矢印で示している部分です。

<img width="603" alt="スクリーンショット 2019-10-03 15.20.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/ce6785fd-5e1e-76f9-d1d7-c6f8f1c502ac.png">

下の図のようなフローになれば成功です。これで、１つの画像について２つの質問が表示されるようになります。質問を３つに増やすときも同様の手順です。実験結果も確認してください。

<img width="765" alt="スクリーンショット 2019-10-03 15.51.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/8c6f97df-c48e-9420-181c-805aedfc2559.png">
量子計算のための回転行列

参考: 
- https://en.wikipedia.org/wiki/Rotation_operator_(quantum_mechanics)
- http://www.appi.keio.ac.jp/Itoh_group/spintronics/pdf/QC2005/QI-School-2005-5.pdf

#導入
量子回路に必要な演算子である，$R_x$, $R_y$, $R_z$の形を備忘録
### 記号
$X$, $Y$, $Z$: pauli行列
$I$: 単位行列

#準備
$$
X^n =
\begin{cases}
    I \;\;(n\rm{:even}) \\\
    X \;\;(n\rm{:odd}) \\\
\end{cases}
$$
$Y$,$Z$も同様．

#`RX`
テイラー展開を行うと，

```math
R_x(\theta) \equiv e^{-i\theta X/2} = \cos\frac{\theta}{2}I -i\sin\frac{\theta}{2}X =
\begin{pmatrix}
\cos(\theta/2) & -i\sin(\theta/2) \\
-i\sin(\theta/2) & \cos(\theta/2) 
\end{pmatrix}
```

#`RY`

```math
R_y(\theta) \equiv e^{-i\theta Y/2} = \cos\frac{\theta}{2}I -i\sin\frac{\theta}{2}Y =
\begin{pmatrix}
\cos(\theta/2) & -\sin(\theta/2) \\
\sin(\theta/2) & \cos(\theta/2) 
\end{pmatrix}
```
###例
$\theta=\pi/2$ のとき

```math
\begin{pmatrix}
\cos(\pi/4) & -\sin(\pi/4) \\
\sin(\pi/4) & \cos(\pi/4) 
\end{pmatrix}
= \frac{1}{\sqrt{2}}\begin{pmatrix}
1 & -1 \\
1 & 1
\end{pmatrix}
```

#`RZ`

```math
R_z(\theta) \equiv e^{-i\theta Z/2} = \cos\frac{\theta}{2}I -i\sin\frac{\theta}{2}Z =
\begin{pmatrix}
e^{-i\theta/2} & 0 \\
0 & e^{i\theta/2}
\end{pmatrix}
```

---

### 生成子

$X/2$, $Y/2$, $Z/2$, などを回転行列の**生成子**と呼ぶ．ちなみに物理のローレンツブーストでも同じような計算が出てくる．（ただし，$\cos, \sin$が$\cosh, \sinh$になる．)
参考: [量子力学選書　場の量子論　坂本眞人](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwj3uYnEnrjoAhXnyosBHcWUBZkQFjAAegQIBRAB&url=https%3A%2F%2Fwww.amazon.co.jp%2F%25E5%25A0%25B4%25E3%2581%25AE%25E9%2587%258F%25E5%25AD%2590%25E8%25AB%2596-%25E4%25B8%258D%25E5%25A4%2589%25E6%2580%25A7%25E3%2581%25A8%25E8%2587%25AA%25E7%2594%25B1%25E5%25A0%25B4%25E3%2582%2592%25E4%25B8%25AD%25E5%25BF%2583%25E3%2581%25AB%25E3%2581%2597%25E3%2581%25A6-%25E9%2587%258F%25E5%25AD%2590%25E5%258A%259B%25E5%25AD%25A6%25E9%2581%25B8%25E6%259B%25B8-%25E5%259D%2582%25E6%259C%25AC-%25E7%259C%259E%25E4%25BA%25BA%2Fdp%2F4785325119&usg=AOvVaw3ZkkrAjufiidrmXU8-Bc2W) p.132
【C#】【文法】LINQ

・Langage INtegrated Queryの略
統合開発クエリ。

・下記例ではコレクションに対してしか行っていないが、
データベースやXML文書に対しても統一的な記載ができるらしい。

・foreachで扱えるクラスであれば(=IEnumerableでイテレータの使用が可能であれば)
　LINQは使用可能。

・下記以外にも様々なメソッドが用意されている。(集合の和，積など）

・WhereとFindAllの違い
  ⇒ WhereはIEnumerableを実装していれば使える。
　⇒ FindAllはList型にのみ存在する。内部的にはおそらく.Where().toList()の
　　　ようにしているため実質Whereと同じと考えてよい。


```csharp
 　 // LINQ
    // 簡単に言うとforeachの強化版
    // データ集合に対しての検索や集約を簡潔に記述できる。
    // javaのstreamと同様。
    class Practice10_2
    {
        static void Main(string[] args)
        {
            var intList = new List<int> { 5, 1, 3, 4, 2, 1, -1, -3};
            IEnumerable<int> iIte;
            
            // Where (3以下の値を取り出す)
            iIte = intList.Where(s => s <= 3);
            Show(iIte);

            // Select (データを加工する)
            iIte = intList.Select(s => s * s);
            Show(iIte);

            // Distinct (重複削除)
            iIte = intList.Distinct();
            Show(iIte);

            // Order By (並び替え 昇順降順)
            iIte = intList.OrderBy(s => Math.Abs(s));
            iIte = intList.OrderByDescending(s => Math.Abs(s));
            Show(iIte);

            // 全てを複合できる。
            // 実行順序は上からになる。
            iIte = intList
                .Distinct()
                .Where(s => s <= 3)
                .OrderByDescending(s => Math.Abs(s))
                .Select(s => s * s);
            Show(iIte);



            // Sum 合計値
            int sum = intList.Sum();
            // Average 平均値
            double ave = intList.Average();
            // Count 要素数
            int count = intList.Count();
            // Max 最大値
            int max = intList.Max();
            // Min 最小値
            int min = intList.Min();

            Console.Write("合計値: " + sum + " 平均値: " + ave + " 要素数 : " + count + " 最大値 : " + max + " 最小値 :" + min);
        }

        static void Show(IEnumerable<int> itereator) 
        {
            foreach(int i in itereator)
            {
                Console.Write(i);
                Console.Write(" , ");
            }
            Console.WriteLine();
        }
    }
```
【C#】【文法】デリゲード，ラムダ式


delegate : 関数を変数に保持するための定義。
匿名メソッド : deletgateの関数を変数に代入する手間を省き直接定義できるように。
ラムダ式 : 匿名メソッドをもっとシンプルに定義できるように。

```csharp 

// デリゲート
    class Practice10_1
    {

        // デリゲート (Cでいう関数ポインタのようなもの)
        // 戻り値と型が同じなら代入できる。
        delegate void EventPart(string s);

        static void Main(string[] args)
        {
            // デリゲード
            Show1();
            
            // 匿名メソッド
            Show2(delegate(string name) { Console.WriteLine(name + "エフェクトを発生させる。"); });
            
            // ラムダ式
            Show2((String name) => Console.WriteLine("name + エフェクト発生"));
        }

        // デリゲード
        static void Show1()
        {
            EventPart eventParts;
            var eventManager = new EventManager();

            // 複数のメソッドを登録する。
            eventParts = eventManager.Wait;
            eventParts += eventManager.Action1;
            eventParts += new EventPart(eventManager.Action2); // new演算子を使った書き方も可

            // 追加した全てのメソッドを実行する。
            eventParts("");

            // 削除もできる。
            eventParts -= eventManager.Action1;

            eventParts("");
        }

        // 匿名メソッド
        static void Show2(Action<string> action)
        {
            action("");
        }

    }

    class EventManager
    {
        public void Action1(string name)
        {
            Console.WriteLine(name + ":文字を表示する。");
        }
        public void Action2(string name)
        {
            Console.WriteLine(name + "キャラクターを移動させる。");
        }
        public void Wait(string name)
        {
            Console.WriteLine(name + "待ち時間");
        }
    }
```
golangの画像処理まわり

## Composite

[image/draw](https://golang.org/pkg/image/draw/)のDrawを使う。
マスクをかけるときはDrawMask。

## Scale

[golang.org/x/image/draw](https://godoc.org/golang.org/x/image/draw)を使う。image/drawのスーパーセットになっている。
Scale用にScalerというinterfaceが定義されていて、BiLinearとかCatmullRomとかいくつかアルゴリズムが提供されている。

[func (*Kernel) Scale](https://godoc.org/golang.org/x/image/draw#Kernel.Scale) でscaleする。

## pngとかjpeg

[image/png](https://golang.org/pkg/image/png/)や[image/jpeg](https://golang.org/pkg/image/jpeg/)のDecode, Encodeを使う。
以下のように`image/png`や`image/jpeg`をblank importしておくと画像フォーマットをよしなにデコードしてくれる。

```go
import (
    "image"
    _ "image/jpeg"
    _ "image/png"
)

func decode(src io.Reader) {
    im, t, err := image.Decode(src)
}
```

## pixel値取得

[image.Image](https://golang.org/pkg/image/#Image) interfaceの```At```を使う。

```go
r, g, b ,a := im.At(x, y).RGBA()
```

## pixel値設定

[image.RGBA](https://golang.org/pkg/image/#RGBA) 等は[Set](https://golang.org/pkg/image/#RGBA.Set)メソッドがあるのでこれでpixel値を設定できる。
`image.Image` interfaceにはSetがないので`png.Decode`等で得たあとは

```go
type Setter interface {
	Set(x, y int, c color.Color)
}

if sim, ok := im.(Setter); ok {
    // ...
}
```

というようにinterface定義して型アサーションをかける。


## Crop
[image.RGBA](https://golang.org/pkg/image/#RGBA) 等は[SubImage](https://golang.org/pkg/image/#RGBA.SetRGBA)メソッドがあるのでこれでCropできる。
`image.Image` interfaceにはSubImageがないので`png.Decode`等で得たあとは

```go
type SubImager interface {
	SubImage(r image.Rectangle) image.Image
}

if sim, ok := im.(SubImager); ok {
    // ...
}
```

というようにinterface定義して型アサーションをかける。
【C#】【文法】ジェネリック

```csharp

    // 自前のジェネリッククラス
    class Practice9_2
    {
        static void Main(string[] args)
        {
            var s = new Sample<int, float>(15, 20.0f);
            s.Show();
            s = new Sample<int, float>();
            s.Show();
        }
        
    }

    // ジェネリックなクラスを定義する。
    class Sample<T1, T2>
    {
        private T1 _item1 { get; set; }
        private T2 _item2 { get; set; }

        public Sample()
        {
            this._item1 = default(T1);
            this._item2 = default(T2);
        }

        public Sample(T1 t1, T2 t2)
        {
            this._item1 = t1;
            this._item2 = t2;
        }
        public void Show ()
        {
            Console.WriteLine(_item1.ToString());
            Console.WriteLine(_item2.ToString());
        }

        public (T1, T2) getT()
        {
            return (_item1, _item2);
        }
    }
```
【C#】【文法】Enum列挙型

```csharp
    // enum
    class Practice9_1
    {
        static void Main(string[] args)
        {
            // Enum -> 数値
            long i = (long)Season.Autumn;
        
            // 数値 -> Enum型
            Season s = (Season)Enum.Parse(typeof(Season), i.ToString());

            Console.WriteLine(i);
            Console.WriteLine(s);
        }
    }

    enum Season : long
    {
        Spring = 1,
        Summer = 2,
        Autumn = 3,
        Winter = 4
    }
```
【C#】【文法】オーバーライド，is, asによるキャスト

```csharp

    // new, virtual - override, abstruct , is, as
    class Practice8_3
    {
        static void Main(string[] args)
        {
            Parent p = new Child();
            p.Show();
            p.Run();

            // Is - newしたクラスと一致するかどうか。
            if (p is Child)
            {

            }

            // As - ダウンキャストに失敗した場合，nullになる。
            // 通常のキャスト (ClassXX)ではキャスト失敗時に例外が発生する。
            var x = p as Sister;
        }
    }

    abstract class Parent
    {
        public void Show()
        {
            Console.WriteLine("parent");
        }

        // オーバーライドを許可
        public virtual void Run()
        {
            Console.WriteLine("親が走る。");
        }

        // オーバーライドを強制
        public abstract void Jump();
    }

    // sealedで継承不可にする。(javaでいうfinal)
    sealed class Child : Parent
    {
        // Overrideできない。(原則使用禁止。)
        public new void Show()
        {
            Console.WriteLine("child");
        }

        // Overrideが可能。(しなくてもよい)
        public override void Run()
        {
            Console.WriteLine("子が走る。");
        }

        // Overrideが必須。
        public override void Jump()
        {
            
        }
    }

    class Sister : Parent
    {
        public override void Jump()
        {
        }
    }

```
【C#】【文法】インデクサ

インデクサはプロパティの配列版で、
配列への参照，アクセスした際の挙動を特殊なメソッドに定義できる。

```csharp

    // インデクサ
    class Practice8_2
    {
        static void Main(string[] args)
        {
            // プロパティを介してprivateな変数にアクセスできる。
            Sample s = new Sample();
            s.Param1 = 10;
            int n = s.Param1;

            FreeArray array = new FreeArray(10);
            array[3] = 10;
        }
    }

    class FreeArray
    {

        // プロパティの配列版
        // 配列にアクセスした際の挙動を決める。
        private int[] _list;
        public int this[int index]
        {
            set
            {
                this._list[this.GetIndex(index)] = value;
            }
            get
            {
                return this._list[this.GetIndex(index)];
            }
        }

        public FreeArray(int size)
        {
            this._list = new int[size];
        }

        // 引数で渡したインデックスの次のインデックスを返却する。
        private int GetIndex(int index)
        {
            return ++index;
        }
    }
```
【C#】【文法】プロパティ

```csharp

    // プロパティ
    class Practice8_1
    {
        
        static void Main(string[] args)
        {
            // プロパティを介してprivateな変数にアクセスできる。
            Sample s = new Sample();
            s.Param1 = 10;
            int n = s.Param1;
        }
        
    }

    class Sample
    {
        private int _param1;

        // SetterとGetterを定義する。
        public int Param1
        {
            set
            {
                this._param1 = value;
            }
            get
            {
                return this._param1;
            }
        }

        // 自動プロパティ
        public int Param2 { get; set; }
        // 読み取り専用
        public int Param3 { get; private set; }
    }
```
git checkout を叩いたら git switch か git restore 使わないの？って言われるようにした

`git checkout` というコマンドは多機能である。故に2.23で2つのコマンドにするべきではという話になり、実際別れた2つのコマンドが実装された。

詳しくはそれぞれ調べてもらうとして、以下の2つに別れたわけである

| switch | restore |
| :-: | :-: |
| ブランチの切り替え | ツリーファイルの巻き戻し |

単機能、つまりシンプルなのはいいことである。ただ念の為言っておくと一応実験的実装であり、かつ checkout は非推奨になったわけではない。

ただ新しい物好きなら食いつきたいところである。しかし使おうにもついついコマンド入力で `git checkout` と入力してしまうので、注意してくれるような環境を用意した。

## やったこと

git の機能には git hooks というものがあり、特定のコマンドが実行されたときに設定された処理が実行されるというものである。ただしコマンドによって発動タイミング（コマンド後or前）やそもそも発動できるかが決まっている。

checkout には post_checkout というものがあり、checkout実行後に発火するものがあったのでこれを使った。サンプルなどを使わず1から入れる場合、

 0. 適当なところに `post-checkout` のファイル名で実行するスクリプトを書く（おおよそ `~/.git/hooks/` 下。コンフィグファイルを別にまとめているならそこでもいいと思うがファイル名は `post-checkout` で置き場所は hooks というディレクトリの中に置く必要がある
 1. `git config --global init.templatedir=~/.git/` を実行する（上記と違うところにファイルを作った場合 `hooks` ディレクトリが見える場所を指定する
 2. 各リポジトリ下で `git init` コマンドを実行する

としてあげればいい。

最後の `git init` を忘れてしまうと出てこない。また実行ファイルの名前と置き場所hooks下と決まっているので注意。拡張子は付けられないが perl や ruby のスクリプトでも実行できるようなのでそこはお好みで。

```shell:hooks/post-checkout
#!/bin/bash

echo -e ""
echo -e "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
echo -e "@     WHY DON'T YOU USE 'git switch' or 'git restore'?     @"
echo -e "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
echo -e ""
```

単純に使わないの？だけならこういうのでいい。若干主張が激しいが。

## 実行するとこんな感じになる

```
$ git checkout .
Updated 0 paths from the index

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WHY DON'T YOU USE 'git switch' or 'git restore'?     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$
```
【C#】【文法】ref, out, tuple, 匿名型

ref    : プリミティブ型の参照渡し (C++の&)
out    : メソッドの戻り値を複数設定したいときに。
tuple  : 複数のデータを手軽に１つにまとめたいときに。
匿名型  :  tupleと似ているが、readonlyで値は変えられないよ。

```csharp
   class Practice7_2
    {
        // ref, out , tuple, 匿名型
        static void Main(string[] args)
        {
            // 参照渡しの場合はrefを書く。(C++の &に相当)
            int n = 10;
            Increment(ref n);

            // 戻り値のデータを書き換えることで配列の値も変わる。
            var data = new int[] { 10, 20, 30 };
            int data_0 = Decrement(data);
            ref int data_1 = ref Decrement(data);
            data_1 = 40;



            // out引数による戻り値の設定。
            int n1 = 100;
            int n2 = 100;
            Devide(out n1, out n2);



            // tupleによる戻り値の設定。
            (int x, int y, int z) r = ReturnTupple();
            (var x1, var y1, var z1) = ReturnTupple();
            var (x2, y2, z2) = ReturnTupple();

            // tupleによる代入
            var axis = (100, 200, 300);
            int sum = axis.Item1 + axis.Item2 + axis.Item3;



            // 匿名型(名前付きtupleのようなものでreadonly)
            var tokumei = new { param1 = 1, param2 = "2" };
            // tokumei.param1 = 10; // エラーになる。
        }

        // 値の参照渡し
        static void Increment(ref int n)
        {
            n++;
        }

        // 戻り値の参照渡し
        static ref int Decrement(int[] data)
        {
            data[0]--;
            return ref data[0];
        }

        // outによる複数の戻り値の設定。
        static void Devide(out int n1, out int n2)
        {
            n1 = 10;
            n2 = 20;
        }

        // tupleによる複数の戻り値の設定。
        static (int r1, int r2, int r3) ReturnTupple()
        {
            return (10, 20, 30);
        }
    }
```
【JavaScript】変数・関数の命名規則はまずキャメルケース(camelCase)を使おう

## はじめに
とにかくコードを書くことが勉強の始まりですが、コードを書くのに慣れてきたら「より良いコードを書く」ことも意識するようにしましょう。

もっとも簡単に意識して覚えられるのが命名規則で、いくつも種類があるわけですがどれを使えばいいでしょう？という話。

## 最初にオススメする命名規則
**プログラムは人に読まれることを考えて**書きます。
変数名・関数名を決めるときは以下4つのことを基本にしましょう。

- 変数・関数共に基本**キャメルケース(camelCase)**を用いる
- 関数名は**「動詞+目的語」**
- 一目見て関数が**何をしているのかわかるような動詞**を割り当てる
（値の取得ならget, オブジェクトを作成するならcreateなど）
- **x,y**など安直で読み返したときに**何の変数か分からないような名前は使わない**

```javascript:例えば
function createUserAccount(引数){
...      // 中身
}
```

まずはこの4つを基本的な命名規則として考えながら、コードを書いていきましょう。

## まとめ
命名規則は実際の開発でも重要視されているポイントで、コードの品質に関わってくるためどんなに小さいコードを書くときもできるだけ意識するようにしましょう。

また、より詳しい命名規則については「リーダブルコード」読んで学習するのがオススメされているので、ぜひ一度は読んでおきたい書籍です。

## 参考
[リーダブルコード(Amazon)](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)
この記事は「CodeShip」内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
CSSで作ってみた(第1弾)

## 甘いものの摂取制限がかかった・・・。
体調都合により糖類の摂取制限がかかっているため、CSSで食べ物を作って満足させようと思いやってみました(´・ω・`)

## というわけでとりあえず作ってみた

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


美味しそうに見える色合いや形って難しいですね・・・。食べ物ネタで投稿している方のセンスってすごいなぁと改めて実感。

基本的にはposition:absolute;を使い各部品を重ねていってます。
共通的なとこ結構あるのでSCSS使えばよかったなと後悔。
CSSで食べ物作ってみたの第1弾なので色々書いていってこれから改善していこうと思います。
各部品の説明はそのうち更新出来たらします。

生クリームはやっつけで作ったので、どなたか良い案ある方いたらコメントいただけると嬉しいです。
あと、美味しそうに見える改良案も募集しています(´・ω・`)
【C#】【文法】ローカル関数

メソッド内をスコープとするメソッドを定義できる。
処理が短ければラムダ式で事足りるので、使う機会はそんなにないはず。

```csharp
    class Practice7_1
    {
        void callLacalMethod()
        {
            int x = Sum(1, 2);
          
　　　　　   // ローカル関数
            int Sum(int a, int b) { return a + b; }
        }
    }
```
Firebase Resize Imagesを使ってみた

# Firebase Resize Imagesとは
先日Firebase Extensionsのベータ版使えるようになりました。
<img width="1423" alt="Screen Shot 2019-10-03 at 14.06.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/ed0b211a-d810-07c3-35d7-53cfbe92d92b.png">

> Resizes images uploaded to Cloud Storage to a specified size, and stores both the original and resized images.

どうやら元画像とリサイズされた画像の両方を保存する拡張機能のようです。

# インストール
インストールボタンをクリックすると、いくつか確認や入力を求めらる画面に遷移します。

このステップまできたら、

- Deployment location
- Cloud Storage bucket for images
- Size of resized images
- Cloud Storage path for resized images

を入力します。
※ `Cloud Storage bucket for images`にバケット名を入力するために、あらかじめ作成しておく必要があります。
![Screen Shot 2019-10-03 at 14.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/dbc954f8-67df-f693-704d-7805eff2c140.png)


インストールが完了すると、このような表示に変わります。
<img width="981" alt="Screen Shot 2019-10-03 at 14.16.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/8d926713-8437-5f2b-828d-c5ea7bd234ce.png">

# 使ってみる
使ってみるボタンをタップし、数分待ちます。
完了すると下記の画面が表示され、簡単な使い方が表示されます。

![Screen Shot 2019-10-03 at 14.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/e8779445-42ef-f49b-8062-8f21768f3bc0.png)

どうやら指定したバケットに画像をアップロードするだけでいいみたいですね。

## 画像をアップロード
この画像をアップロードしてみます。
<img width="400" alt="golang.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/68f039d3-3b61-cc1b-bf91-615b4e8f1888.png">
アップロードが完了すると...
![Screen Shot 2019-10-03 at 14.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/079ddc15-2aa6-1f9a-1a86-2a6e56949280.png)
元画像とは別に、最初に指定した`resized_images`というディレクトリが自動で作成されました。
中を見てみると...
![Screen Shot 2019-10-03 at 14.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112715/d9782c48-0d39-6ccb-2384-c3d71d590ff2.png)
3つの画像がアップロードされています。
これは、最初に指定した`Size of resized images`の数だけ、元画像とは別にアップロードされるようです。

# まとめ
とても簡単に`Resize Images`を試すことができました。
今後は他のExtensionsも触れてみようと思います。

元画像からそこまで縮小している訳ではないのに、リサイズ後のファイルサイズがかなり削減されているのが非常に気になります。。。
ガウシアンナイーブベイズによる聴牌判定

# ※この記事は2020年に作成しました
#概要
ハードコーティングで作成した聴牌判定で手牌の聴牌ラベルをつけ、ガウシアンナイーブベイズで判定するプログラムを作成した。

#結果
test_size（テストデータに使用するデータの割合）を変更したときの各精度を示す。

| test_size   |       精度(%) |
|:-----------------:|:------------------:|
| 0.10       |             91.9 |
| 0.20     |       92.1      |
| 0.30            |       92.0 |
| 0.40      |     91.9|

#作成したプログラム

```python
from sklearn import datasets                           # データロード用
from sklearn.model_selection import train_test_split  # 学習/テストデータ作成用
from sklearn import metrics                            # 精度評価用
from sklearn.naive_bayes import GaussianNB             # ガウシアンナイーブベイズ実行用
import numpy as np
np.set_printoptions(threshold=100000000)

# データ用意
data = 101437
X = np.zeros((data,34), dtype='float32')# Xは手牌
with open('C:/sqlite/tehai.csv', 'r') as fr:
    for i,row in enumerate(fr.readlines(),start=0):
        if i <data:
            X[i] += np.array(list(map(np.float,row[:34])))

dahai = np.zeros((data,1), dtype='float32')#打牌読み込み
with open('C:/sqlite/tenpai.csv', 'r') as fr:
    for i,row in enumerate(fr.readlines(),start=0):
        if i <data:
            dahai[i] += np.array(list(map(np.float,row[:1])))

Y = dahai.flatten()
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,test_size=0.4,random_state=0)


# ガウシアンナイーブベイズ実行
model = GaussianNB()              # インスタンス生成
model.fit(X_train, Y_train)       # モデル作成実行

# 予測実行
predicted = model.predict(X_test) # 予測実行
acc = metrics.accuracy_score(Y_test, predicted) # 精度計算

print(acc)
#print(predicted)

```
MySQL ORDER BY句　並べ替え

1．SELECT * FROM my_items ORDER BY id ASC・・・my_itemsテーブルをidカラムで昇順に並べ替える。
2． SELECT * FROM my_items ORDER BY id DESC・・・my_itemsテーブルをidカラムで降順に並べ替える。

1．Ascendig 昇順 ASC(デフォルト省略可)
2．Descending 降順 DESC

TEXT型のカラムでORDER BY句を使用する場合はひらがな、カタカナは分けて50音順に並べられる。
漢字は読み方まで判別できないので漢字も含めて並べ替えたい場合は読み仮名用のカラムを用意する。
この時ひらがなならばひらがな、カタカナならばカタカナというように入力形式を統一して読み仮名を入力する。

売り上げ1位、2位、3位...といったような相手がいて自分の位置が決まる情報の事を相対情報という。
相対情報のカラムを作ってしまうと例えば売り上げランキング等だと売り上げランキングが変動した際、ズレた順位のデータ全てを編集する必要が出てきてしまう。
その為売り上げ順に並べたい等の場合は売上ランキングではなく売り上げ数でカラムを作成すると望ましい。
売り上げ数のように相手がどのような状態であっても自分の状態が決まってくる情報の事を絶対情報という。
絶対情報を使用してカラムを設計するよう心掛けよう。
Pythonでnanの扱いにハマったので、その備忘録。。

# はじめに
Pythonにてデータ処理をしていたある日、ループ回数がおかしいことに気づく。
ループ回数が異常に多い原因がnanの値が格納されているためと気づき、nanとなった時にループを抜けるという方法の実装に、馬鹿みたいに時間を要したので、その備忘録的なあれです。
（※対処方法はいくつかあると思いますので、その一例を示します。）

#１．とりあえず、結論！
次のコードで判定することが可能でした。(**判定したい値=nanでTrue**)

```python:code.py
import math
math.isnan("判定したい値")　# nanの時True
```

#２．nanって何？？
「nanって何？」って話なのですが、数みたいなものです。

**どんな時に発生するか（例）**
・計算不能になった時
・値の入っていないデータを取り込んだ時

、、、他にもいろんな場面で発生すると思います。
プログラム経験者であれば、何度かこの手の処理を扱ったことがあるのでは？と思います。
実際、自分も過去に対処した方法を試みたのですが、Pythonでは上手くいきませんでした。

#３．if 値 !="nan" ではダメな理由
まず、単純に判定したい値がnanであるかどうかを判定してみました。

（追記:@konandoiruasa 様に"=="ではなく"is"を使えば、value is np.nan でtrueとなるとのことを教えていただきました。ありがとうございます。)


```python:code.py
import numpy as np

value=np.nan
print(value == "nan")
print(value == np.nan)
print(value is np.nan)
```

```python:Result
False
False
True
```

一つ目は、nanという予約語で判定を行いました。(C言語とかはこれでいけるはず)
二つ目は、代入値と同じ値で判定を行いました。

見ての通りですが、いずれもTrueと返ってこない。。
なんで？？って感じでした。

「あれ？ "nan" って 何型？文字なのか数値なのか？」 ふとそんな疑問が浮かびました。
もし文字なら、文字で判定を行えるのでは？とかそんなこと思いましたが、

```python:code.py
import numpy as np

value=np.nan
print(type(value))
```

```python:Result
float
```

って、まぁそりゃそうよな、って感じでfloat型という想定内の結果に。

nanを代入した変数の型 → float型
nan同士( np.nanを代入したもの と np.nan )での比較　→　false

これを見る限り、Pythonではnanに**一意の値が振られていない**ように見えますね。
自分はてっきり**一意の値が振られていると思い込んでいた**ため、この判定に苦労しました。
みなさんも気を付けてくださいね。

#４．Pythonでのnanのイメージ

結局、Pythonでのnanって何？ってところに戻りますが、
「数みたいなもの」と表現するしかなさそうです。
ちなみに、Pythonではnanを**非数**というようです。

ただ一つ重要な性質として、
**非数と非数が比較されたときにはFalseを返す**という規則が存在することです。

したがって、nanの判定には**変数の型**（扱うデータがfloat型でない場合は、float型=nanと識別可能）
または、冒頭の**math.isnan()**を使うのが良さそうですね！
Che7 で NEM (NIS1) のノードを立ち上げるための devfile.yaml

# TL;DR 殆どの人には役に立ちません。

NEM を使ったブロックチェーン・アプリケーションの開発は、公開された API サーバを使うのが一般的です。クラウド IDE のワークスペース中で NIS を立ち上げる動機は、よほど限られたケースに限られるのではと思います。

また、現存する Eclipse/Che のホスティングサービス [^hosting] は、ユーザからの操作が一定時間無い場合にはワークスペースに紐付いたコンテナを全て落としますので、メインネットの同期まで、NIS ノードを立ち上げておくことも困難です。

[^hosting]: che.openshift.io や camino.pizzafactory.jp 

ただし、独自にデプロイした Che インスタンスをお持ちの場合は、役に立つ…かも。

`devfile.yaml` は、過去に breaking change を起こした実績があり、まだ仕様が確定したと安心できる感じでもありません。Che7 にデプロイしても動かない場合には、このファイルをおいてある [GitHub リポジトリ](https://github.com/pizzafactory-contorno/nem-nis1) も参照してみてください。

```
metadata:
  name: nem-nis1-sample
components:
  - id: che-incubator/typescript/latest
    memoryLimit: 512Mi
    type: chePlugin
  - mountSources: true
    endpoints:
      - name: nodejs
        port: 4100
    memoryLimit: 512Mi
    type: dockerimage
    alias: nodejs
    image: 'quay.io/eclipse/che-nodejs8-centos:nightly'
  - mountSources: false
    endpoints:
      - name: wallet
        port: 7777
      - name: NIS
        port: 7890
      - name: servant
        port: 7880
      - name: NCC
        port: 8989
    memoryLimit: 2048Mi
    type: dockerimage
    volumes:
      - name: nem
        containerPath: /home/nem
    alias: nem-nis1
    image: pizzafactory0contorno/nem-nis1
apiVersion: 1.0.0
```
Raspberry PiでMAX31855を使って熱電対でデータ取得

# 必要なもの

- Raspberry Pi
    - Raspberry Pi 3 model B+を使用しています
- K型熱電対アンプモジュール(MAX31855使用)
    - 秋月電子で購入可能 http://akizukidenshi.com/catalog/g/gM-08218/
- K型熱電対
    - MiSUMiとかで買えます https://jp.misumi-ec.com/vona2/detail/110500113720/
- ブレッドボードおよびジャンパーワイヤ
- はんだとはんだこて

# K型熱電対モジュールについて

- Adafruit社の熱電対を使って温度を取得できるモジュール
    - https://www.adafruit.com/product/269
- K型の熱電対のみ使用可能
- -200〜1350℃の範囲を0.25℃刻みで出力可能、ただしK型熱電対の精度は±2℃から±6°C程度
- SPIでデータ出力
- 詳しい情報はデータシートを参照
    - https://strawberry-linux.com/pub/MAX31855_jp.pdf

# モジュールの準備とRaspberry Piとの接続

買ったままのモジュールはピンと熱電対をつけるコネクタが付いていないので、はんだ付けする必要があります。
![DSCN0693.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/7719c8cf-4a4a-d7b2-bb13-11907ad82cef.jpeg)
![DSCN0694.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/b0e42988-abb1-662a-c95f-94a84c8aa4a8.jpeg)


次にK型の熱電対を取り付けます。
基盤には「Yellow +」と「Red -」と書いてありますが、おそらく熱電対は赤(もしくは緑)と白になっていると思います。
これはJIS C 1602でK熱電対は赤(+)と白(-)と決められているためです。
一方、アメリカのASTM E230では黄(+)と赤(-)となっているので基盤はこの表記に従っていると考えられます。
同じ赤が+だったり-だったりしてややこしいので気をつけてください。
（間違えて配線しても壊れることはありません。温度上げても出力結果が下がるだけです。）

Raspberry Piとモジュールをブレッドボードを使って接続します。

- MAX31855(Vin) ⇔ GPIO1(3.3V)
- MAX31855(GND) ⇔ GPIO6(Ground)
- MAX31855(DO) ⇔ GPIO21(MISO)
- MAX31855(CS) ⇔ GPIO29(BCM5)
- MAX31855(CLK) ⇔ GPIO23(SCLK)

（Raspberry PiのGPIOピン配置は https://pinout.xyz/ などを参照）
![DSCN0695.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/7c7ccffe-1c67-c98e-4bf0-bba3fccb9946.jpeg)


fritzingで書いた配線図は以下です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/c2cfa355-229c-f679-b376-63ce3f74cf78.jpeg" width=50%>


# Raspberry Piの準備とプログラムでの読み出し

使用しているRaspberry PiのOSバージョンは以下の通りです。

```bash
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
```

SPIを有効化します。

```bash
$ sudo raspi-config
-> 5 Interfacing Options
--> P4 SPI
```

MAX31855のライブラリをインストールします。
Adafruit社から提供されているCircuitPythonというものを使用します。

```bash
$ sudo pip3 install adafruit-circuitpython-max31855
```

Pythonのプログラムは以下の通りです。

```python:max31855.py
# -*- coding: utf-8 -*-

import board
import busio
import digitalio
import adafruit_max31855

spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
cs = digitalio.DigitalInOut(board.D5)
max31855 = adafruit_max31855.MAX31855(spi, cs)

print(max31855.temperature)
```

実行すると温度が表示されます。

```bash
$ python3 max31855.py
23.75

# K熱電対の先端を指で少し触って実行すると、温度が上がることが確認できます。
$ python3 max31855.py
28.0
```

熱電対を使って温度を測りたいときにご活用ください。

<!--
# 熱電対について

熱電対って何？って人向けに簡単に説明します。

金属の種類によって
２種類の金属を接触させると接触部に電位差（熱起電力）が生じる。
これをゼーベック効果

２種の金属の種類と熱起電力の大きさ、片側の接点の温度がわかれば、もう一方の接点の温度がわかるということになります。

## 熱電対の種類

JISで規格化(JIS C 1602)されているのはK, J, T, E, N, R, S, Bの８種類です。
それぞれどんな種類の金属が使われているのかは調べてみてください。

K熱電対の場合は、ニッケルおよびクロムを主とした合金（クロメル）とニッケルおよびアルミニウムを主とした合金（アルメル）でできています。
測定温度範囲は-200〜+1200℃です。
-->
シーケンス図


- startuml & enduml 

```
@startuml

@enduml

start or ebd + uml
```

- title

```ruby
title: Sequence of API
```

## 登場人物

- actor

```ruby
actor User

```

- participant

```ruby
participant View
participant System
participant SDK
participant ooAPI
control ControllerName
database DB
```

## 仕切り

- group

- alt 
　- 条件分岐
　- オプション（特定の条件がある時だけ）　like payment_method_changed?
　
## メモ

- note

```
note right ←ここは、メモを
end note
```

## 遷移のさせ方

```ruby
どこから -> どこまで :何をする

View -> SDK :request to display SDK Button

```


記事
https://www.sejuku.net/blog/87396
FunctionComputeで.NET Coreが使える話 (2)

前回は[こちら](https://qiita.com/cube8080/items/ceb7147d5cd43702b194)

今回は、実際に.NET Core2.1ランタイムを使って、Function ComputeでC#が使えるか試してみました。
公式ドキュメントの内容に沿って、Httpトリガーを作成し「hello world」が表示されるまでです。

## 事前に準備したもの
* Visual Studio 2019(Windows10環境)
* [公式ドキュメント](https://jp.alibabacloud.com/help/doc-detail/112379.htm)

## Step.1
**HTTPトリガー**の関数を作成するため、Visual Studioで空のコンソールアプリプロジェクトを作成します。
公式ドキュメント内ではHttpハンドラーの例を読んでいくとASP.NET Core WebアプリケーションのAPIプロジェクトを作成すると記載がありますが、今回は**Single関数**を使用するため**コンソールアプリ(.NET Core)**で進めていきます。
![FunctionCompute2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/4ddc0da9-24ce-d545-643c-c36364fa5333.png)

## Step.2
`Aliyun.Serverless.Core`と`Aliyun.Serverless.Core.Http`をNuget経由で導入します。
操作手順の2に記載のある.csprojの<ItemGroup>への手動での追加は不要となりますが、導入後確認してみてください。

![FunctionCompute5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/8e9917d1-293c-4efa-4d68-6e20590274bf.png)
※画像は導入後のため↓アイコンが付いています

## Step.3
FcRemoteEntrypoint.csをプロジェクトに追加。
公式ドキュメントのSingle関数の例をコピーして貼り付ける。
その際、**namespace**まで変更しないように注意してください。
このサンプルコードでは、

* Logに`method`、`requestPath`、`requestBody`が出力
* Headerに`customheader`が追加されその値として`v1`を出力
* Bodyに`hello world`が出力

されます。

## Step.4
ビルド構成を「Release」にしてビルドが通ったら、プロジェクトを発行します。
プロジェクトを右クリックして「発行」を選択します。
今回は発行先を**ローカル**のフォルダに設定して発行します。

発行が上手くいくと、プロジェクトのディレクトリに`bin\Release\netcoreapp2.1\publish`ができ、その中にdllファイル等が生成されます。
この時に、`プロジェクト名(もしくはソリューション名).dll`が作成されていることを確認してください。

## Step.5
ここでは、作成した関数のzipファイルを作成します。
私は地味にここで躓いていました・・・。
公式ドキュメントではコマンドで作成しているのですが、Windows上でzipを作成する場合は階層が深くなってしまったりするため注意が必要です。
publishディレクトリを表示している状態で、全ファイルを選択し、右クリックでzipを作成しました。
私は7-Zipを使っているので右クリック後に「"〇〇〇.zip"に圧縮」を選択してzipファイルを作成しました。
作成されたzipファイルの中を見ると、直下にdllファイル等が置かれている状態かを確認してください。
階層がずれたものを使用すると、502エラーでdllファイルがありませんとなります。

## Step.6
ここからAlibaba Cloudのコンソールに戻ります。
`Http関数`を選択して「次へ」を押します。
以下の設定に注意してください。(お試し用なので承認などは適宜変更してください)

* ランタイム：dotnetcore2.1
* 関数コード：zipファイルのアップロードを選択し、Step.5で作成したzipファイルを指定
* 関数ハンドラ：公式ドキュメントにも記載がありますが、'プロジェクト名(もしくはソリューション名).dllファイル名::namespace名.クラス名::関数名'を設定します。
　`例)FunctionComputeDemo.dllの場合、FunctionComputeDemo::FunctionComputeDemo.FcRemoteEntrypoint::HandleRequest`
* 承認：anonymous
* メソッド：GETとPOST

名称などは適宜設定をして、関数を作成します。

## Step.7
関数が作成出来たら、デバッグしてみましょう。
Alibaba Cloudのポータル画面でデバッグが出来ます。
画像はPOSTで確認したものです。
`Status`、`Body`、`Logs`の値を確認してみましょう。

![FunctionCompute6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/8c9f47bd-b4e0-7526-0d27-9ab9340a4a1c.png)
![FunctionCompute7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/7272e148-9c3e-8a30-5a8e-20122afb751a.png)

`customheader`の値はポータル画面では見えなかったのでPostmanを使って確認してみました。
![FunctionCompute8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254932/5e99984d-8cc4-f9d0-3721-b42d42dbd2f1.png)


## まとめ
zipファイルを作るところ以外はシンプルに出来た印象です。
bundler: failed to load command: puma 

## エラー内容
pumaを起動すると`bundler: failed to load command: puma`と言われる。

```console
$ bundle exec puma -t 5:5 -p 3000 -e development -C config/puma.rb
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
bundler: failed to load command: puma (/PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma)
Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `initialize'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `open'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `write_pid'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:106:in `write_state'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/single.rb:103:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:186:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/cli.rb:80:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/bin/puma:10:in `<top (required)>'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma:23:in `load'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma:23:in `<top (required)>'
```

## 解決策
以下2つのディレクトリを作成する。

```console
$ mkdir tmp/sockets
$ mkdir tmp/pids
```

起動した。

```console
$ bundle exec puma -t 5:5 -p 3000 -e development -C config/puma.rb
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
iOS13&Xcode11で通知が受け取れなくなった話

# 環境
* iPhone8
* iOS13.1.2
* Xcode11.1 GM

# 原因
* Objective-cの下記のコードで渡るdeviceTokenの中身が変わっていた

```Objective-c:SampleAppDelegate.m
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // iOS12:<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>
    // iOS13:{length = 32, bytes = 0x00000000 00000000 00000000 00000000 ... 00000000 00000000 }
    NSString *token = deviceToken.description;
}
```

# 対応
```Objective-c:SampleAppDelegate.m
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [self hexadecimalStringFromData:deviceToken];
}

-(NSString *)hexadecimalStringFromData:(NSData *)data {
    NSUInteger dataLength = data.length;
    if (dataLength == 0) {
        return nil;
    }

    const unsigned char *dataBuffer = data.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02x", dataBuffer[i]];
    }
    return [hexString copy];
}
```
Lookの基本構成について


Lookerのダッシュボードの最小単位は**Look**と呼ばれていまして、実際の業務で利用する場合は、複数のLookを組み合わせて運用することが多いと思います。

今回はこの**Lookの基本構成である３つの要素（FILTERS, VISUALIZATION, DATA）**を紹介していきます。

## FILTERS
**・データの表示対象を指定値で絞る機能。**

用途としては、
・特定の日付範囲のデータを抽出する
・特定の値を超えたものだけを抽出する
など、様々な角度でデータを絞る事でデータの傾向を探索する場合などに利用可能です。


![Looker_filters_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/414084ad-31a2-75a6-312e-91b77ea53836.png)


## VISUALIZATION
**・グラフ表示機能**

登録されている好きなグラフをワンクリックで切り替え可能
また、追加すればサンキーダイアグラムなど様々なグラフも用意されている。
![Looker_visualization_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/31aaa66f-fbef-1959-8ed2-68656cd75051.png)


## DATA
**・グラフを構成する実データの表示機能**
LookMLによる自動生成されたSQLも確認可能
![Looker_data_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/dac334c7-0964-5492-73ac-f7e6e01782ab.png)


## Lookの特徴とまとめ
・フィルタ項目の追加、削除が簡易（データベースに取りこんである項目であれば、ほぼワンクリックで追加削除可能）
・FILTERS, VISUALIZATION, DATAは全て折り畳める。
例えば、VISUALIZATIONを大きく表示したい。と行った場合は、**▽FILTERS**と**▽ DATA**をクリックする事で対応可能。
![Looker_クリックで折畳める.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/a0c082f1-9d39-d4ce-0bdd-c5429bc6278f.png)

上記のような特徴がある為、MTGなどでデータをインタラクティブに変更しながら、議論に活用するのに適していると思います。
Vive Input Utility For UnityをOculus Go/Questと使う(Oculus Go対応修正済み)。

#はじめに

Vive Input Utilityは、Unity+SteamVRやVive WaveでのVR内ボタン入力などをサポートしてくれる便利なツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/a76d89bd-1a8b-3981-1945-041cec65c5f2.png)




このツール、[Github上](https://github.com/ViveSoftware/ViveInputUtility-Unity)の最新のコミット(0cebb42418336213451fb52267b9fc47449bc737)ではOculus GoやQuestもサポートするようになっています。まだ正式版ではないですが、試してみる価値はあるかと思います

#インストール

公式のGithubページから[最新のプロジェクト](https://github.com/ViveSoftware/ViveInputUtility-Unity)をダウンロードしてください。また、AssetStoreからOculus Integrationをダウンロードしてください。なお、Vive Focus Plus用のWave SDKはOculus Integrationと相性が悪いので消しておいた方が良いです。

プロジェクトを開いたら、Unity内のPreferenceでSupporting Deviceを選ぶ必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/addb7928-2eb5-60e7-06fa-dc2fdfc64954.png)
Oculus Android Packageをインストールしたら、Oculus Androidにチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7b1b1ef0-0291-dab9-3a08-95dd6438f0db.png)
すると、「推奨設定」を選ぶウィンドウが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/c221ea62-dd1a-35f7-5bec-6cc5e18ab501.png)
"Use Oculus Mobile Recommended Quality Settings"で"Use recommended"を選ぶとエラーが出てしまうので、それは無視して、それ以外は"Use recommended"を選んでください。

ビルドする際は、さらにAndroid Manifestを作る必要があります。無いとエラーになります。Oculus Integrationをインポートしていれば、Unityエディタ内でManifestを作るメニューがあるので使ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/9a52ac6e-1887-dc25-5c2d-cfa7d29f63b0.png)

最後に、Quest向けにビルドする場合は、Oculus Project ConfigでTarget Device TypesをQuestにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7423130f-2d9e-1079-3ea8-e7e20d4677e8.png)

#入力を取る

基本的な使い方は[Vive Focus Plusなどと同じ](https://qiita.com/yanosen_jp/items/1ef94b3d32abb4dd0bf2)です。Vive Focus Plus用に作ったプロジェクトでも、基本、変更なしで動きます。ただ、Vive Input Utility付属のViveInputクラスを用いてOculus Goのタッチパッドを触っている位置を取ることがどうしてもできませんでした。　Oculus Questに関しては問題ありません。なので、Goについては ```Input.GetAxis("HTC_VIU_UnityAxis4")```や ```Input.GetAxis("HTC_VIU_UnityAxis5")```でとることになります。Vive Focus Plusなどとは別に判定させなければならないので面倒くさいですね。リリース版では改善されることを期待しましょう**（v1.10.5で修整済み）**。

##追記

 v1.10.5で修整済み　→　Githubに[issue](https://github.com/ViveSoftware/ViveInputUtility-Unity/issues/144)を出していたところ、解決策が提案されました。以下の通りOculusVRModule.csを追記、修正してください。これでGoのタッチパッドもViveInputクラスから入力を取れるようになります。

```OculusVRModule.cs

///中略

case OVRPlugin.Node.HandLeft:
    {
        var ctrlState = OVRPlugin.GetControllerState4((uint)OVRPlugin.Controller.LTrackedRemote);
        currState.SetAxisValue(VRModuleRawAxis.TouchpadX, ctrlState.LTouchpad.x);
        currState.SetAxisValue(VRModuleRawAxis.TouchpadY, ctrlState.LTouchpad.y);

///中略

case OVRPlugin.Node.HandRight:
default:
    {
        var ctrlState = OVRPlugin.GetControllerState4((uint)OVRPlugin.Controller.RTrackedRemote);
        currState.SetAxisValue(VRModuleRawAxis.TouchpadX, ctrlState.RTouchpad.x);
        currState.SetAxisValue(VRModuleRawAxis.TouchpadY, ctrlState.RTouchpad.y);

///以下略
```
AndroidのORマッパー「Orma」のセットアップ方法(Kotlin)

## 「Orma」とは？

SQLite用のORマッパーです。
SQLiteの操作を簡単に行えるようになります。

2019/10/03現在では、「[Room](https://developer.android.com/jetpack/androidx/releases/room)」という公式のSQLite用ORマッパーが存在するため、Ormaを新規プロジェクトで採用することは減ったかもしれません。
しかし、Web上に記事が多いことなどの理由で、Ormaを使うこともあると思います。

## 環境

- OS：macOS Mojave 10.14.3
- Android Studio：3.5
- JRE：1.8.0_202-release-1483-b49-5587405 x86_64
- JVM：OpenJDK 64-Bit Server VM by JetBrains s.r.o
- Kotlin：1.3.50
- Android Gradle Plugin：3.5.0
- Orma：6.0.2
- RxJava：2.2.12

## セットアップ

appフォルダ配下の「build.gradle」にOrmaとRxJavaの依存関係を追加するのみです。

```diff_groovy:/app/build.gradle
dependencies {
    ext {
+         orma_version = '6.0.2'
+         rxjava_version = '2.2.12'
    }
…
+     // Orma
+     kapt "com.github.maskarade.android.orma:orma-processor:$orma_version"
+     implementation "com.github.maskarade.android.orma:orma:$orma_version"
+     // RxJava
+     implementation "io.reactivex.rxjava2:rxjava:$rxjava_version"
}
```

Javaの場合、 `kapt` の代わりに `annotationProcessor` を使用してください。

OrmaはRxJavaを使っているため、RxJavaを記述しないと、 `Completable` や `Single` などのシンボルを見つけられませんのビルドエラーが発生します。

## おわりに

これでOrmaを使ってSQLiteを操作することができるようになります！

## 参考リンク

- [maskarade/Android-Orma: An ORM for Android with type-safety and painless migrations](https://github.com/maskarade/Android-Orma)
社内で機械学習勉強会を挫折せずにやりきるための工夫３つ

機械学習は難しい…！

機械学習は説明する必要もないくらいトレンドで、全エンジニア必修にしなければいけないくらい大事なものですが、とにかく**挫折しやすい**です。
アルゴリズムや数式の沼にハマると簡単に**自分のちからのなさを思い知り**、入門書をそっ閉じしたくなります。

そこで、スクラムで（みんなで協力して）勉強すれば諦めずにやりきれるのではないか、と思うのですが、**みんなでやりきるのはもっと困難**だったりします。
なので今回は、私が社内でやった有志の機械学習勉強会にて、めげずに最後までやりきるためのTipsをまとめます。

## 1. 勉強会では（意外と）ビデオ学習が向いてる
最近はエンジニア向けビデオ学習サービスがたくさんあります。
本やWEBのほうが効率いいでしょ？とか言わずに、食わず嫌いせずにやってみましょう。意外と個人よりも、団体での学習に向いています。

今回私は「Coursera」というサービスを使い、
「○月○日までに、Courseraの機械学習系のこのコースに、みんなで取り組んで、おわらせましょう！」という形式の勉強会を開きました。
各自でアカウントを取得して、おのおのビデオ学習していくことになります。

Courseraはエンジニアリング分野に限ったものではないですし、~~UIも微妙に独特で使いにくい部分もありますが~~、参加者みんなのモチベーションを維持するのに向いている部分もあります。
（他の学習サービスでも類似した機能はあるかもしれません。Courseraを選んだのは半分たまたまです）

#### 1. 進捗度が明確

アカウント画面に、あと何時間かかりそうかとか、どこまでおわったかとか出ます。先が見えるので助かります。

|![2019-10-03_11h25_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167339/46a92508-1734-983c-ba70-281822b95489.png)|
|:-:|

#### 2. 進捗が遅いと（ちゃんと）焦らせてくれる

はじめに目標期日を設定して、（おせっかいにも）Googleカレンダー登録までしてくれます。
遅れると、「もういちど目標日を決めて頑張ろうね」って言って、期限をリセットしてくれます。

|![2019-10-03_11h22_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167339/10318767-27b5-142c-7f13-bb029697336e.png)|
|:-:|

#### 3. 修了証が出る
完了すると、大学のそれのような「修了証」をPDF出力できるようになります。
「Coursera」は大学をリプレイスする的な理念から作られたので、ここらへんには力を入れているようです。
**参加者に達成感が生まれる**ので、意義はあるかなと思います。

|![2019-10-03_11h33_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167339/d94cf0b6-fe2d-dc8d-124c-13f845971031.png)|
|:-:|

それ以外にも、ここらへんの機能は便利だと思いました。

- 通勤中でも仕事中でもスマホアプリで見れる
- メモ機能・字幕書き起こし機能がある（まとめノートとかつくりやすい）


## 2. Slackと定例MTGで励まし合う
今回は6人の社内有志エンジニアで勉強会を始め、一ヶ月かけて、各メンバーがコースを受講するという形式にしました。
受講するコースは計20時間くらいあるので、毎日仕事終わりに視聴するのも骨が折れます。
気持ちを途切れさせないための対策が必須となるので、

- 週一回参加者が集まり、進捗や質問を交換しあう場を作る（雑談でもよい）
- Slackチャンネルを作り、「俺はもうおわったぜ！」と自慢したり、時には遅れているひとを~~ののしる~~励まし合う場所を作る

ということにしました。

質問交流は特に大事で、遅れているひとも、詰まるポイントを事前に知る事ができて、**メンタルの負荷も和らぐ**と思います。

## 3. はじめから業務展開をスコープに入れる
こういう自学系の取り組みは、業務が忙しいととかく後回しにされがちです。
それを防ぐため、「今後必ずこの技術を業務に応用する」という意識が肝要だと思います。
実際に一部参加者は、単にコースを受講するのではなく、受講しながら並行して実データ等でモデリングを始めるということをしましたが、
単に視聴するよりも**脳みそに入るスピードが段違いになる**ので、大変お勧めです。

## まとめ
勉強会というのは、人を集めたり、モチベーションを維持したり、運営に気を使ったり、とにかく面倒くさい面もたくさんあります。
ですが、**「ひとのチカラを借りて勉強できる」**というのは、大変メリットがあります。
ひとりでは心がめげるから勉強会を開くわけですし、なにより皆でやるほうが楽しいです。
人材育成などの面でも取り組めると思います。

### おまけ
Googleの回し者ではないですが、Googleが定期的に開催している機械学習プログラムは、初学者からビデオ学習でMLをキャッチアップできるので、おすすめです（今回弊社でも利用しました）
[ML Study Jams Vol.3 : Machine Learning トレーニングプログラム](https://events.withgoogle.com/ml-study-jams-japan/)
【Kotlin】for文、forEach文のインデックス（に限らずラムダの引数）はimmutable

内容はタイトルの通りです。
以下の記事を書いた時に気になったので調べました。

- [【Java8】拡張for文、forEach文のインデックスをimmutableにする \- Qiita](https://qiita.com/wrongwrong/items/124089f7faec58e801e4)

# ソースコード
以下の通りです。
これに限らず、ラムダの引数は確認した限り`immutable`です。

```kotlin
for (i in 1..4) {
    i = 0 // 再代入不可でコンパイルエラー
}

(1..4).forEach {
    it = 0 // 再代入不可でコンパイルエラー
}
```

## デコンパイル結果
デコンパイルしてみると以下のようになりました。
当たり前っちゃ当たり前ですが`Java`側で`final`宣言されていたりはしません。

```kotlin:元コード
fun main() {
    for (i in 1..4) {
        println(i)
    }

    (1..4).forEach {
        println(it)
    }
}
```

```java:デコンパイル結果（一部省略）
public final class KtrTestKt {
   public static final void main() {
      int i = 1;

      for(byte var1 = 4; i <= var1; ++i) {
         boolean var2 = false;
         System.out.println(i);
      }

      byte var7 = 1;
      Iterable $this$forEach$iv = (Iterable)(new IntRange(var7, 4));
      int $i$f$forEach = false;
      Iterator var10 = $this$forEach$iv.iterator();

      while(var10.hasNext()) {
         int element$iv = ((IntIterator)var10).nextInt();
         int var5 = false;
         boolean var6 = false;
         System.out.println(element$iv);
      }

   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}
```

# 感想
こういう部分が最初から`immutable`なのは安心感が有っていいですね。
というか`Kotlin`に触れてから`Java`の`Stream`処理に触れたので、`Java`のラムダの引数が素で書くと`mutable`だということを想像だにしていませんでした。