OmniAICreator/Qiita-1.07M huggingface dataset:
Elixir mixでテスト書いてみる

# Elixir mixでテスト書いてみる
## 動作環境
* debian 8
* Elixir 1.6.3

## はじめ
自宅でElixirを書いているんですが、テスト書いているので備忘録的にまとめていきます。

## ElixirでのTest
### ExUnit
ElixirのTest frameworkです。これを使ってTest書いていきます。

### mixでのTest

まずはmixでプロジェクトを作成し、ひな形を作ります。

```
mix new example
```
mixで作成したプロジェクトにはデフォルトで`test`ディレクトリができています。

```
test
 |- example_test.exs
    test_helper.exs
```
`example_test.exs`の`example`は`mix new example`で作成したプロジェクト名になります。
そして、`test_helper.exs`が実際にテストを行います。

test_helper.exs```
ExUnit.start()
```

`example_test.exs`に実際にテストを書いていきます。

### 簡単なテストを書く
テストする関数は足し算するだけの関数をテストします。

```
defmodule Example do
  @moduledoc """
  Documentation for Example.
  """

  @doc """
  sum method
  """
  def sum(a, b) when is_integer(a) and is_integer(b) do
    a + b
  end
end
```
`sum`関数をテストしていきますので`example_test.exs`でテストコードを書いていきます。

example_test.exs

```
defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  test "sum def" do
    assert Example.sum(1, 2) == 3
    refute Example.sum(1, 2) != 3

    assert_raise FunctionClauseError, fn ->
      Example.sum("1", 2) == 3
    end
    assert_raise FunctionClauseError, fn ->
      Example.sum(1, "2") == 3
    end
    assert_raise UndefinedFunctionError, fn ->
      Example.sum(1) == 3
    end
  end
end
```
テスト内容をみていきます。
#### assert
`true`か`false`をテストし結果が`true`であることをテストします。

```
assert Example.sum(1, 2) == 3 # pass
assert Example.sum(1, 2) == 4 # failures
```

#### refute
`assert`同様、`true`か`false`をテストするのですが、結果が`false`であることをテストします。

```
refute Example.sum(1, 2) != 3 # pass
refute Example.sum(1, 2) == 3 # failures
```
#### assert_raise
テストする内容が`exception`を投げるかどうかテストします。
第一引数では`exception`のエラー内容を指定します。第二引数では実行する関数を指定します。

```
# pass
assert_raise FunctionClauseError, fn ->
  Example.sum("1", 2) == 3
end
# pass
assert_raise UndefinedFunctionError, fn ->
  Example.sum(1) == 3
end
```

## 終わりに

簡単なアサート系のテストを書いてみました。
`ExUnit`モジュールではアサート以外でも`Callbacks`や`CaptureIO`などあるので、
もっと色々と試してみようと思います。
簡単なTCPサーバー2

複数スレッドで複数ポートからの接続を待ち受けられるようにしてみた

```c#
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;


namespace SampleTCPServer
{
    class Program
    {
        readonly static string IP_ADDRESS = "192.168.0.1";
        readonly static int OPEN_PORT1 = 60000;
        readonly static int OPEN_PORT2 = 60001;
        readonly static int OPEN_PORT3 = 60002;
        readonly static int READ_PACKET_NUMBER = 100;

        static void Main(string[] args)
        {
            callTcpConnected(OPEN_PORT1);


            Task<bool> task1 = Task.Run<bool>(() =>
            {
                callTcpConnected(OPEN_PORT1);
                return true;
            });

            Task<bool> task2 = Task.Run<bool>(() =>
            {
                callTcpConnected(OPEN_PORT2);
                return true;
            });

            Task<bool> task3 = Task.Run<bool>(() =>
            {
                callTcpConnected(OPEN_PORT3);
                return true;
            });

            // とりあえず一番始めに起動したスレッドが終わるまで待つ
            var wait1 = task1.Result;

            Console.WriteLine("何かのキーを押すと終了");
            Console.Read();
        }

        /// <summary>
        /// 指定のポートで受信待ちをする
        /// </summary>
        /// <param name="open_port">開くポート番号</param>
        private static void callTcpConnected(int open_port)
        {
            IPEndPoint ip_end_point = new IPEndPoint(IPAddress.Parse(IP_ADDRESS), open_port);
            TcpListener listener = new TcpListener(ip_end_point);

            listener.Start();
            TcpClient client = listener.AcceptTcpClient();

            if (client.Connected)
            {
                listener.Stop();
                NetworkStream net_stream = client.GetStream();

                string file_name = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + "_" + open_port.ToString()
                                    + "_" + DateTime.Now.ToString() + ".log";

                StreamWriter writer = new StreamWriter(file_name);

                int counter = 0;

                do
                {
                    if (net_stream.CanRead)
                    {
                        byte[] recive_byte = new byte[client.ReceiveBufferSize];
                        net_stream.Read(recive_byte, 0, (int)client.ReceiveBufferSize);

                        writer.WriteLine(recive_byte);
                        counter++;
                    }

                    Thread.Sleep(10);
                } while (client.Connected && counter < READ_PACKET_NUMBER);
                client.Close();
                writer.Close();
            }
        }
    }
}
```
WindowsでElectronからNative Moduleを使えるようにする

[Using Native Node Modules](https://github.com/electron/electron/blob/master/docs/tutorial/using-native-node-modules.md)によると、
ElectronでNative Moduleを使用する場合には再ビルドが必要なようなのですが、
windowsではいろいろ準備しないと動かなかったのでやったことをメモしておきます。

追記　2019/10/28
最近のNode.jsのインストーラでは以下のような設定項目があり、チェックをつければ自動で設定してくれるようです。動作確認まではできていないですが、これでできるなら一番楽そうですね。
![WS001204.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153576/214dac48-2b47-a2f5-b09a-a6023b2d3f9d.jpeg)

試したところ、上記のチェックでは「3. python2.7をインストールしてパスを通す（古い手順）」までをほぼ自動でやってくれるようです。
ただ、Visual Studio InstallerからBuild Toolの言語パック（英語）を手動インストールしないと、vcpkgを使うときにエラーになりました。（そのくらい自動でやってほしい…）

# 1. Visual C++をインストール
Native ModuleはC++で書かれたモジュールのことなので、C++をコンパイルできる環境を準備しなければいけません。
2018/03/18現在では、[Visual Studio Community](https://www.microsoft.com/ja-jp/dev/products/community.aspx)をインストールすることになります。
vs_Community.exeをダウンロードしてC++関連の機能をインストールします。
私はどの機能がどこに関係しているかを完全に理解していないので、C++っぽい機能をすべてインストールしておきました。

# 2. windows-build-toolsをインストール
nodejsからVisual C++を使えるようにするために必要なようです。
コマンドプロンプトで以下のコマンドを実行するとインストールできます。

```
npm -g i windows-build-tools
```

# 3. python2.7をインストールしてパスを通す（古い手順）

追記(2020/07/06)
Python2.7は2020/01/01にEOLとなっています。
Pythonのパスが通らない場合はPython3のパスを指定しましょう。
※windows-build-toolsのリポジトリを見る限り内部で使われるPythonは3系に更新されているようです。

~~windows-build-toolsのインストール時にpython2をインストールしているようなのですが、
パスを自力で通す必要があるようで、通し方が分からなかったので別でインストールしてしまいました。
2018/03/18現在では、[miniconda](https://conda.io/miniconda.html)が便利です
インストールしたらAnaconda2ディレクトリを環境変数"Path"に追加しておきます。~~

~~追記
npm config set python=
だとうまく行きませんでしたが
%USERPROFILE%\.windows-build-tools\python27
を追加してしまえばminicondaは不要です。
python3ユーザとしてはめんどいですが。~~

# 4. vcpkgをインストールして必要なモジュールを追加する
3.を完了した時点でビルドできる場合もあるのですが、
Native ModuleがVisual C++に初期で入っていないモジュールを内部で使用しているとビルドエラーが出ます。私はcouchbaseモジュールをビルドしたところopensslが見つからないと言われました。
そこでVisual C++にモジュールを追加するために[vcpkg](https://github.com/Microsoft/vcpkg)を利用します。
git cloneしてきて、readmeの通りにbatを実行するとvcpkgがインストールできます。
インストールが終わったら

```
vcpkg.exe integrate install
```

でVisual C++と統合します。今回はopensslがないと言われていたので以下のコマンドでインストールします。

```
vcpkg.exe install openssl:x64-windows
```

ファイルシステムがNTFSでないと失敗するバグがあるようなので気を付けましょう。私はそれで1時間無駄にしました。

# 5. electron-rebuildを実行する
ここまできたら[electron-rebuild](https://github.com/electron/electron-rebuild)で再ビルドができるようになっているはずです。以下のように再ビルドをしましょう。

```
node_modules\.bin\electron-rebuild.cmd
```

追記 2018/03/24
electron-builderからinstall-app-depsで再ビルドすると、上記を行っていたとしてもうまく動きませんでした
しかし、npmRebuild:falseにしてelectron-rebuildで再ビルドしたファイルを置いておけばパッケージングはできるので
一応なんとかなりそうですね。

追記　2018/11/11
vcpkgのバグなのかどうかは分からないのですが、2018/11/11現在、多くのモジュールでインストール時にエラーが出ます。
```vcpkg\ports\モジュール名\portfile.cmake```
の```PREFER_NINJA```を```#```でコメントアウトすると正常にインストールできるようになります。
どうやら現状windowsではninjaというビルドツールがうまく動いておらず、ninjaを使わない設定とする必要があるようです。

また、bzip2のインストール時にダウンロードしたファイルが不正だといわれてエラーになりますが、手動で正しいファイルをダウンロード（[こことか](https://fossies.org/linux/misc/bzip2-1.0.6.tar.gz/)）して```vcpkg\downloads```に入れておけばインストールできます。

追記　2019/09/28
モジュールによっては、Node.jsのバージョン問題でビルドに失敗することがあるようです
例えば、libxmljs-mtはNode.js v8ではビルド成功しましたが、v10では失敗してしまいました
Pythonでコマンドライン引数を受け取る

コマンドライン引数受け取ってそれを処理する問題が出たときに、
そういえば、Pythonでコマンドライン引数受け取るのやったことなくて、
やらかしたので、メモ。(問題の根幹部分ではなかったから助かったが。)

# コマンドライン引数を受け取る
sysモジュールのargvを使用する。コマンドライン引数のリストが取得できる。

```commandline_args.py
import sys

args = sys.argv

print(args[0])
print(args[1])
print(args[2])
```

```
$ python commandline_args.py a b
```
で実行すると、
出力は、

```
commandline_args.py
a
b
```

となる。
上記からわかるように、
リストの1つ目(args[0])は、実行ファイル名になる。

# 実際の使用時
実際使用する際は、おそらく、いくつの引数を受け取ったかを確認し、
さらに、期待する形の入力かをチェックする必要がありそう。


```fizzBuzz.py
import sys


def fizzBuzz(n):
    if n <= 0:
        return ()
    else:
        fizzBuzz(n-1)
        if n % 3 == 0 and n % 5 == 0:
            print(n, ' : ', 'FizzBuzz')
        elif n % 3 == 0:
            print(n, ' : ', 'Fizz')
        elif n % 5 == 0:
            print(n, ' : ', 'Buzz')
        else:
            print(n, ' : ', n)
        return ()


if __name__ == '__main__':
    args = sys.argv
    if 2 <= len(args):
        if args[1].isdigit():
            fizzBuzz(int(args[1]))
        else:
            print('Argument is not digit')
    else:
        print('Arguments are too short')
```

- 引数無し

引数無しエラー

```
$ python command_line_args.py
Arguments are too short
```

- 引数が数値じゃない

引数タイプエラー

```
$ python command_line_args.py a
Argument is not digit
```

- 引数が数値

正常実行

```
$ python command_line_args.py 15
1 : 1
2 : 2
3 : Fizz
4 : 4
5 : Buzz
6 : Fizz
7 : 7
8 : 8
9 : Fizz
10 : Buzz
11 : 11
12 : Fizz
13 : 13
14 : 14
15 : FizzBuzz
```

- 引数が数値で、複数存在

最初の1つを使用し実行

```
$ python command_line_args.py 3 5 15
1 : 1
2 : 2
3 : Fizz
```
コーディング規約について考えてくれ

常日頃からコーディング規約について考えていますか？
僕は常日頃は考えていません。しかしコーディング規約は大切だと思っています。
なぜ大切だと思っているかを言語化しておきます。

# Q. そもそもコーディング規約とはなんなのか

**A. [weblioから引用](https://www.weblio.jp/content/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84)**

> コーディング規約とは、ソフトウェア開発において、企業やオープンソースコミュニティやあるいは特定のプロダクトごとに定められた、プログラムのコーディングに当たっての統一的なガイドラインのことである。

# Q. なぜコーディング規約が必要なのか

**A. コードを読むコストが下がるから**

コードは書かれる回数よりも読まれる回数のほうが圧倒的に多いので、コーディングのコストは読むときに発生することになります。そのため、コードは読みやすくしておくべきなのです。読みやすくするためには、同じスタイルで統一されている方がよいということになります。

# Q. どのコーディング規約が良いのか

**A. 一般的に使われているもの**

僕の考えた最強のコーディング規約であると嬉しいんですが、複数人で開発する場合は僕の考えた最強のコーディング規約と相手の考えたコーディング規約がぶつかる可能性があります。個人の好みによってぶつかります。

大事なのは、規約決めて揃えることが重要です。

できるだけ自分で作らず、一般的なコーディング規約を導入しましょう。(チームメンバーとモメることも減ります)

普段の開発は `JavaScript` をよく使うので例を上げると、[Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)を使います。

# Q. どうコーディング規約を守っていくか

**A. 機械的に判定してもらいCIを回す**

一つ一つ覚えるのは厳しいので、機械的に判定してもらうのが最適です。
(感情に左右されない + 不毛なレビューを減らせます)

CircleCI などを利用してPRをマージするためにはコーディング規約が守られていないとだめといった形にするべきです。

普段の開発は `JacaScript` をよく使うのでチェックするツールの例を上げると、[ESLint](https://github.com/eslint/eslint)を利用します。

## Q. レベルが高いと自負している人は守らなくても良いか

**A. 自負しないで守れ。**

繰り返しになってしまいますが、コーディング規約の制定はメジャーなものをできるだけ踏襲して、機械的に判定してもらい続けるべきです。

例えば、新しく別の分野(言語が違うところ)から来た人がスーパーできる人だったとして(スーパーできる人は少なくとも規約の大切さを知ってるというツッコミはなしで) `JavaScript` で書かれてるコードを `C言語` 的な規約(ガッツリ手続き型でオラついたり)で書き始めたらチームにとって害悪でしかないということがわかるかと思います。

## Q. すでに書かれているコードはどうするのか

**A. 触るな！**

修正したいですが、既存のコードは今後二度と更新されない可能性があります。あとバグを埋め込む可能性があります。
コーディング規約を守っていないから修正する以外のタスクが来るまでは触らないようにします。
(やることなくて困ってる人がいる場合はやればいいと思いますが、そんな人いないはず)

`Ruby` で開発する場合は `Rubocop` を利用し `rubocop --auto-gen-config` を実行することで現在の問題点を無視することができるようになります。

`eslint`で同じようなことを行いたいので [eslint-auto-gen-config](https://github.com/togana/eslint-auto-gen-config)を作りました。(`eslint`の出力結果を `overrides` の形式に書き換えてくれます)

# まとめ

コーディング規約の大切さをなんとなくでもわかってもらえたかと思います。
規約はできるだけ一般的なものを利用し、守れているかは機械的に判断してもらう。これだけでコードを読む時間すなわちレビューのコストが下がるので、チームメンバーならば理解しやすい良いコードが生まれているはずです。
TermuxでArchlinuxを使う

前回: https://qiita.com/Bluepost59/items/657ef9c198bd43cf59dd

#Termuxの問題点
* GCCが使えない
* Emacsが重い

特にGCCが使えないのは困ったもので、fortranに至っては使えるコンパイラがないという状況だった。

ところが、TermuxにArchLinuxをインストールするパッケージが用意されている。そこでならpacmanが使えるので、GCCなどが使える。

#インストール
次のURLからgit cloneする。
https://github.com/sdrausty/TermuxArch

```setupTermuxArch.sh``` が本体でこれを実行すればARM向けのArchLinuxがインストールできる。curlではなんかうまくいかなかったので、引数を指定してwgetを使った。

```
setupTermuxArch.sh wget
```

ミラーに当たりはずれがあり、20分程度で終わることもあれば1時間以上かかる場合もある。速度が遅い場合は```~/Arch``` を削除してからやり直す。

時間はトータルで少なくとも30分以上はかかる。途中で何度かインタラクティブに入力を求められる。

## localeの設定
エディタが開くので、```ja_JP.UTF-8```のコメントアウトを外す。

## タイムゾーンの設定
日本の場合、Asia -> Japan -> Tokyo -> Yesと選択する。ただし入力は番号で行う。

1回タイムゾーンの設定で固まった。

#2回目以降の起動
## ディレクトリ構成
Termuxのhome以下に次のようなディレクトリが構成される。

```
home/
└ arch/
  ├ bin/
  ├ home/
  ├ dev/
  ├ startarch
...
```

Archに移った後はTermuxのコマンドは使えない。そのためpythonなどは別途インストールする必要がある。ただし、ArchLinuxなのでpacmanが使える。そのままではエディタもないので、emacsなどを入れる必要がある。

なおEmacsはTermuxネイティブでは起動が重いが、Archでは数秒以内に立ち上がった。

#確認したこと
* systemctlを使えない。ゆえに各種デーモンが立ち上がらない。
MacVimでShift+Spaceで日本語切り替えをする

## 前提条件
MacOSバージョン:macOS HighSierra 10.13.3
MacVimバージョン:Custom Version 8.0.1420 (KaoriYa 20171221)
BetterTouchToolバージョン:2.405(756)

## やりたいこと
MacVimでShift+Spaceで日本語オンオフする

## やったこと
BetterTouchToolでキーのリマップを行う
以下設定例
<img width="1127" alt="スクリーンショット 2018-03-18 20.24.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/14249/4111131b-2099-73ff-4253-e9abcf13f5de.png">
IBM Cloud Object Storageをclientから利用する

https://qiita.com/segur/items/e65cdef31eff7685ff21 さんを参考に設定を行ったですが、
やっぱり環境変数から認証情報とりたかったのでその手順

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

```
pip install python-swiftclient python-keystoneclient 
```

## サービス資格情報をウェブコンソールで確認する
https://console.bluemix.net/dashboard/storage から作成済みのサービス（何も表示されない場合は、Regionなどを確認)を選択し、
**サービス資格情報** -> **資格情報の表示** から資格情報をコピーして、任意のファイル名で保存しておく 

## 認証トークンを生成し、`.bash_profile` に保存する
トークン作成後は、JSONファイルは削除して問題ない

```
CREDENTIAL_JSON="2.で保存した　ファイル名"
export OS_AUTH_VERSION=3
export OS_AUTH_URL=`jq -r .auth_url $CREDENTIAL_JSON`/v3
export OS_USER_ID=`jq -r .userId $CREDENTIAL_JSON` 
export OS_PASSWORD=`jq -r .password $CREDENTIAL_JSON`
export OS_PROJECT_ID=`jq -r .projectId $CREDENTIAL_JSON`
swift auth >> ~/.bash_profile
```

## 動作確認

```
soruce .bash_profile
swift info
```
お名前.comで購入したドメインをHerokuに設定する

# はじめに
本記事は、Herokuに**お名前.com**で購入したドメインを設定したい！**SSL証明書**を取得して`https`対応にしたいという方が対象です。

# 前提条件
- [お名前.com](https://www.onamae.com)でドメインを購入済みである（今回はexample.comというドメインを購入したと仮定します）
- Herokuにアプリをデプロイ済みである
- HerokuのプランがHobby以上である

# ドメインの設定
## 1.Herokuにドメインの登録
1. [Heroku](https://dashboard.heroku.com/)にアクセスし、ドメインを設定したいアプリのダッシュボードに移動します。
2. ダッシュボードのメニューバーからSettingを選択します。
3. Settingに移動し、下にスクロールすると『Domains and certificates』という項目が現れます。
4. Add domainボタンを押すとモーダルウィンドウが表示されるので、そちらに設定したいドメイン名を入力してください。（例：www.example.com）
![スクリーンショット 2018-03-18 18.57.20.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/0f5b0180-c71e-8f55-4d20-c0a05f8753be.png)

5. 入力が完了すると赤い部分にドメイン名が表示されると思います。![スクリーンショット 2018-03-18 19.19.17.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/b0feb433-1373-cb70-a171-946bb04521c0.png)

6.　`.herokudns.com`と表示されているDNS Targetをコピーしておいてください。（例：www.example.com.herokudns.com）



## 2. SSLの設定
HerokuのプランをHobby以上にするとSSL証明書を自動で取得することができます。

1. 先ほど設定した『Domains and certificates』の欄にあるConfigure SSLを選択すると、ドメイン名の入力時同様にモーダルウィンドウが表示されます。
2. Automaticallyを選択しContinueを選択してください。![image.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/ff83d7d4-7e62-1279-27e4-203ea6d6293b.png)
3. これでSSLの設定は完了です。

## お名前.com側の設定
1. お名前.comにアクセスし、ドメインNaviにログインしてください。
2. ログインすると上のメニューバーにDNSを押してください。
3. ドメインのDNS関連機能設定にチェックを入れ、次へ進んでください。
4. 中央に表示される内部ドメイン一覧から今回使用したいドメイン名にチェックを入れ次に進んでください。
5. 下にスクロールすると**DNSレコード設定を利用する**という項目があるんで、設定するボタンを押してください。
![image.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/caf52991-4627-9a8d-9108-7cd46bb9e4cd.png)

6. Typeを**CNAME**にし、VALUEに先ほどコピーした**DNS Target**を入力してください。（例：www.example.com.herokudns.com）
![image.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/cb924037-e058-31c2-e100-2b620fe2836b.png)

7. 入力を終えたら下にある変更確認にチェックし、確認画面に進み設定を完了してください。
8. 設定を完了してから、24〜72時間の間でドメインが反映されると思います。<br>ドメインが反映される前に取得したドメインにアクセスするとお名前.comのページに飛ばされ**『このドメインは取得されています』**と表示される思いますが、心配せず気長に待ってください。

## 補足
72時間以上待ってもドメインが反映されない場合は、Heroku側のドメインの設定がうまくいってないかもしれません。その際は、下記の赤枠のようにチェックマークが付いているか確認を行ってください。チェックマークにならない場合は再度、Heroku側の設定もしくはお名前.com側の設定を見直してみてください。![image.png:w300](https://qiita-image-store.s3.amazonaws.com/0/81341/78ca5022-4ce9-a7bd-2b3a-202cc759a04f.png)

# まとめ
いろいろ大変そうだと思っていましたが、SSLの設定やTarget DNSなど自動でしてくれるため非常に簡単でした。ドメインが反映されるまでそわそわすると思いますが気長に待つことが大事です！私は30時間近くかかりましたが、２〜3時間で反映される方もいるそうです。みなさんもHerokuにドメインを設定してみてはいかがでしょうか。
Mac上でのmbedを使ったSTM32 Nucleoプログラミング

組み込みプログラミング環境"mbed"はARM CPUを使った組み込み環境向けのもので、Arduinoとは別のエコシステム(笑)を作っている。mbedを用いることで、Arduino環境ではなかなか面倒だった

+ もろもろのハードウェア割り込みをガンガン使ったコード
+ 特定の組み込み用途により特化したコード

を書くことができるようになる。

STM32 nucleoシリーズのボードは、ARM CPUを使った簡易開発ボードの中でも一番廉価な部類に入る。Arduinoクローンと同じくらいの価格で手に入れることができるので、Arduino環境からも入りやすい気がする。

ここではMac上でmbed/nucleoの開発を行なう際のポイントと注意点をまとめておく。

# ドライバ
公式には「Windows 7以降のみ対応」と書いてある。じっさい、Mbed上にはWindows用のファームウェアアップデートしか見当たらなかった。

ただ接続するとわかるけれど、最近のnucleo x 最近のMacなら、USBで接続すれば自動的にUSBストレージとして認識される。できたらファームウェアのアップデートもしておきたいけれど、まあ問題が生じるまではこのままでも大丈夫かな…。

# mbed OSプログラムのビルド
ビルドはオンライン上で全て行われるMbed Compilerを使う方法と、オフラインでも使えるArm mbed toolsを使う方法がある。

## mbed Compiler
USBストレージとして表示されたnucleoのディレクトリを開くと`mbed.HTM`なるファイルがある。これが`os.mbed.com`へのリンクになっていて、これを開くことで当該nucleoが「使用するデバイス」としてmbed Compilerに登録される（いちいち自分で対象のデバイス名を探したりしなくてよい）。

デバイスがひとつしかなければ、公開されているリポジトリで"Import into Compiler"を押すと、自動でそのnucleo向けの設定でプロジェクトが取り込まれる。

「コンパイル」ボタンでクラウド上でコンパイルが行われ、生成されたバイナリファイルがダウンロードできるようになる。

## Arm mbed tools
コマンドラインから動くmbedツール群。使ったことがないので雰囲気しかわからない。オフラインで使えるという利便性に加えて、ターゲットとするデバイスやコンパイルオプションなどを自分で詳しく設定できる、というよさがあると思う。自分好みのIDEも使えるし。

`mbed compile <options...>`でコンパイルが行われ、バイナリファイルが生成される。


# プログラムのアップロード
ビルドすると`.bin`という拡張子のバイナリファイルが生成されるので、これをnucleo USBストレージに保存する（オンラインのmbed Compilerを使っている場合は、直接保存先としてUSBストレージを指定してもよい）。

コピーが完了すると自動でデバイスがリセットされ、ブートローダが再起動する（Macだと「ディスクの不正な取り出し」的なメッセージが出てしまうけれど、nucleo側としては問題ないのでおそらく無視しても大丈夫）。[Lチカ](https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-blinky/)的なプログラムの場合、この段階で動いていることを確認できる。

## 注意点
USBストレージ上には、アップロードされたプログラムは表示されないので注意。

# USB経由のシリアル通信
mbed OS上では`USBTX`、`USBRX`なるピンがあらかじめ定義されているので、mbedの`Serial`クラスを用いて簡単にデバッグ用シリアルポートとして使うことができる（[Serial_HelloWorldプロジェクト](https://os.mbed.com/teams/mbed_example/code/Serial_HelloWorld/)参照）。

デフォルトの設定は

+ ボーレート9600
+ 8データビット
+ パリティなし
+ 1ストップビット

の設定になっていると思う。もちろんこのあたりの設定は`Serial`クラスから変更できる。

ホスト側からは`/dev/tty.usbxxxx`（xxxxの部分はてきとうな数字）のような感じで見えているはず。

## screenを利用した通信
これを

```
$ screen /dev/tty.usbxxxx 9600 -L
```
のような感じで開けば入出力をモニターできる（`-L`でデバイスからの出力が見えるようになる）。`screen`プログラムを終了するには、`Ctrl-a`の後に`k` (for "kill")をタイプする（`Ctrl-a`が`screen`のエスケープシーケンスで、これで`screen`内部の通信モニターから`screen`そのものの操作に移れる）。


## Arduinoアプリを利用した通信

`screen`は強力だけれど、自分の入力した文字がエコーされない（はず…まだよくわからない）ので通信内容が不安になることがある。実のところシリアルコンソールであればなんでもよいので、たとえばArduinoのシリアルモニタをそのまま使ってやることもできる。

`ツール`メニューの`シリアルポート`のところでnucleoに対応したシリアルポートのパスを選択してやれば、シリアルモニタを開くことで通信ができる。

## 注意点
ホスト側のシリアルポートが開くたびにデバイスがリセットされるわけではないので注意（Leonardo系のArduinoと同じ）。シリアルポートを開くまでに通信を取りこぼしたくない場合は、たとえばホスト側からなんらかの通信があるまでデバイスを待たせる（シンプルには`getchar()`などで）、などの対策が必要。


# 総括
いまいちどこにまとまった情報があるのかわからず、何かの問題にぶつかった時に、何が問題になっているのかを調べるのが大変で困る。それでも全体としては（何か祟りでもあるのではないかというレベルで）スムーズにプログラムできたので、とても便利な環境だと思う。
Lightroomのカタログ(lrcat)が壊れてたのでsqliteツールで修復してみた話

# カタログファイル開けられない…
メインPCのSSDがご臨終し、バックアップしているNASからいろいろファイルをニューPCに書き戻して、さてLightroomのカタログ確認するかーっと開いたら…
![LR5_NG.PNG](https://qiita-image-store.s3.amazonaws.com/0/149049/715e2ce6-646c-6ea4-cdf2-485a28220ea9.png)

```
[Window Title]
確認

[Main Instruction]
カタログ “LRCatalog-2” LRCatalog-2 は書き込み不可で開けないため、Lightroom はこのカタログを使用できません。

[Content]
権限が正しくないか、別の Lightroom アプリケーションがこのカタログを使用している可能性があります。問題を修正するか、別のカタログを選択してください。

[別のカタログを選択] [再実行] [終了]
```

メインPCで普段使っているカタログだし、LR終了後に不定期にNASにrobocopyでバックアップしていたものだ。壊れてないはずやのに？！
なんでやねんっ！とwebで検索検索！っとしてもロックファイルを消せだの権限を確認しろなどと書いてある。
何度も確認したが**問題ない**。

# lrcatってsqliteファイルだったのね
半日くらい別の作業と並行であれこれ見ていくとふとjornalファイルもあれば消せ、とかみた…あ、ひょっとしてlrcatってdbファイル？sqlite？と思って[DB Browser](http://sqlitebrowser.org/)入れたら…
![LR5_NG2.PNG](https://qiita-image-store.s3.amazonaws.com/0/149049/d7b6004d-306f-9edc-f504-5757c8efe541.png)

```
---------------------------
DB Browser for SQLite
---------------------------
Could not open database file.
Reason: database disk image is malformed
---------------------------
OK   
---------------------------
```

！なるほどなんかDB壊れてるっぽいわ、ということで修復方法を調査。

# 修復方法
まず[sqlite](http://www.sqlite.org/download.html)からコマンドラインツールsqlite-tools-win32-x86-****.zipを入手。
で、展開した実行ファイルをカタログファイルと同じ場所に持ってくる。
カタログファイルのある場所をコマンドプロンプトで開く。
sqliteでカタログを開いてダンプしてdump.txtに書き込む。

```cmd.exe
> sqlite3 LRCatalog-2.lrcat .dump > dump.txt
```

**何度かチャレンジしてみても、dump.txtが0Byteだったら諦めよう。**
このdump.txtはテキストファイルなのでエディタで開く。なお数GByte級ファイルとかだとテキストエディタによってはフリーズする。私はVSCodeで開きました。VSCode優秀。
最後の行までスクロールしてROLLBACKとなっていたら、この部分をCOMMITに変更して保存する。

```dump.txt
/**** ERROR: (11) database disk image is malformed *****/
ROLLBACK; -- due to errors
```
**↓ROLLBACKをCOMMITに変更して保存**

```dump.txt
/**** ERROR: (11) database disk image is malformed *****/
COMMIT; -- due to errors
```

新しいファイル(LRCatalog_new.lrcat)をsqlite3で開いて、dump.txtをreadする。

```cmd.exe
>sqlite3 LRCatalog_new.lrcat
sqlite> .read dump.txt
sqlite> .exit
```

LRCatalog_new.lrcatをLightroomで開いて、画像ファイルやらフォルダが読めらラッキー！:muscle:
**何度か同じ事を繰り返しても何も読み込めない場合はあきらめましょう…。:thermometer_face:**

# 私の場合
ちなみに私のはこんな感じになりました(LRCatalog-2.lrcatが開けないファイル、修復後ファイルがLRCatalog-1.lrcat)
![LR5_NG4.PNG](https://qiita-image-store.s3.amazonaws.com/0/149049/ac07862f-0629-ffbf-c539-76dc057a5226.png)

# ぼやき
QAサイトとかで頓珍漢な回答してるのかなりノイジーやね（英語サイト、日本語サイト含めて）:triumph:
adobeよ！メッセージの出し方！書き込み権限関係ないやんかっ！:triumph:
dry_runについてまとめ


dry_runという言葉を聞いて、厳密に知らなかったのでまとめてみました。

## dry_runとは

dry runとは、本番前にリハーサルとして行われるテストで、シェル上で言えばファイルに影響は及ぼさずに行われるコマンドを実行するテストのこと。受け入れテストとは異なり、ユーザがいない状態で処理が正しく行われるか確認するテストである。「お試しテスト」と言われたりする。下記のような特徴がある。

- パフォーマンスまたは安全性を確認できる。
- ファイルに影響を及ぼさずに済む。

ちなみにdry runは「予行演習、空運転」という意味である。
「消防士たちの水を撒かない（dry）訓練・予行演習」が語源だそう。諸説あるらしいですが。

## railsのgenerateコマンドの場合

`-p` あるいは `--pretend` をコマンドにつけることでdry runできるそう。

```
$ rails generate scaffold AdminUser name:string mail:string -p
```

## itamaeの場合

下記記事を参照。
[Itamae|dry-runオプションで変更を行わずに動作を確認。板前がトイレを設置せずにトイレ感を味わってみる。](https://qiita.com/tbpgr/items/9a796c9ee92037d332ca)

## fastlaneの場合

fastlaneでdry runの設定を行うことができる。
下記のgithubのissueページを参照。
https://github.com/fastlane/fastlane/issues/7624

## まとめ

実際に自分のシステムにdry runを導入したわけではないので、
実際にdry run実行できる環境を構築しなきゃなと思います。
792円のテンキーでも良い感じの左手デバイスになった話

# 左手デバイス欲しいな〜〜

プロのイラストレーターさんはだいたい愛用している左手デバイス。
ショートカットをひとまとめにできるので作業効率が上がるそうです。
私の普段の仕事は主にIllustratorやXDを使ってのデザイン制作で、ショートカットはたくさん使うし同様に作業の効率化ができるのでは？と思い立ちました。

amazonでめっちゃ有名なやつを調べた結果↓
<img width="1063" alt="スクリーンショット 2018-03-18 18.49.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/214677/75c7b09a-9ad1-91a4-f76b-c168992357f1.png">
![b.png](https://qiita-image-store.s3.amazonaws.com/0/214677/5c145367-2170-1ba7-32a2-ad01efa4bc9f.png)

## ちょっと厳しい

本当に効果があれば良いんですが、お試しで買うにはあまりにも高いです。
諦めるかあ……と思いながら検索結果一覧を眺めていると
![c.png](https://qiita-image-store.s3.amazonaws.com/0/214677/d6cf0aba-3fa3-992e-b57c-b31e69ac624e.png)

**1個めっちゃ安い……ってテンキーかい！！使えるかいそんなもん！！**

## ちょっと待てよ

お高い左手デバイスの方が見た目はカッコいいとして、**テンキーもいっぱいキーがある。**
KarabinerやBTTでどうにかすれば、安上がりの左手デバイスになるのでは？？

## ということで購入
![IMG_8587.JPG](https://qiita-image-store.s3.amazonaws.com/0/214677/85d649d2-beec-1b28-a153-fb66b8d46b1d.jpeg)
（テーブルの小汚さを打ち消すために可愛げなフィルターを使用しています。）
まだ具体的に何をすれば上手くいきそうか計画は立っていないですが、**「まあ一回やってみましょうぞ」**と作業を開始しました。

### Karabiner-Elementsでの設定
<img width="1000" alt="スクリーンショット 2018-03-18 19.07.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/214677/a3252de3-7ed7-5c4f-7f7d-1ed7f57df909.png">
作業の順番から言うと多少前後しちゃうんですが

* テンキー固有のキーとtabやbackspaceといった共有のキーが混ざってると鬱陶しい
* ショートカットを駆使しようと思うと、commandやshiftなどのキーは一通り使える方が便利っぽい

という結論に至り、上図のように設定をしました。
Target Deviceなるところで「全キーボードのキーバインドを変える」のか「特定のキーボードのキーバインドだけ変える」のかを選べるので、テンキーだけを選んで設定しています。

### BetterTouchToolの設定（一部）
<img width="1015" alt="スクリーンショット 2018-03-18 19.13.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/214677/09a966cd-7fd7-2f82-b7d0-84678be6008c.png">
見た目だけだと結構大変なことになってますね。
これはIllustrator分の設定ファイルで、XD用にも同じくらいのものを作りました。

なんでこんなことをするかというと、各ツールのショートカットキーって

|ソフト|矩形ツール|円形ツール|アートボードツール|
|:--|:-:|:-:|:-:|
|Illustrator|M|L|⇧+O|
|XD|R|E|A|

みたいに結構バラバラなんです。
しかも、ソフト側の設定で揃えようとすると他のショートカットとバッティングしてわけがわからなくなってしまいます。
（例えば、IllustratorのRには回転ツールが割り当てられています。）

それを解消するため、ソフト側のショートカットは変えずに
**「テンキーの3を押したらソフトに関係なく矩形ツール」**
といった指示を出しているのが先程の設定ファイルです。

### Illustratorでの設定

というほどではないですが
もともと[DTP Transitさんのこの記事](http://www.dtp-transit.jp/adobe/illustrator/post_1258.html)にあるスクリプトを登録していたのでこちらもBTTの設定に突っ込みました。

## 一旦やってみてのメリットとデメリット

### メリット
* テンキーでもキーが19個あるので、高いお金をかけて左手デバイスを買わなくてもいい線行けそう
* 元のキーボードの数字とテンキーの数字は区別されているので、うっかりした衝突が無さそう（左手デバイスの仕様は分かっていないけど……）

### デメリット
 * ショートカットが覚え直しになって普通に混乱している（これは左手デバイスでも同じハズ？）
 * 意味のある配置にしづらい
 * 「00」は「1回押したら0を2回押したことにする」って指示を出してるだけらしくて、あまり役に立たない上に場所が場所だからちょっと困る
   * 真ん中の一番下って、結構使いたくなる場所

### まだやれそうなこと
 * Numキーでモード変更
 * 覚えやすい配置決め

## まとめ
思ったより上手くいったし、この配置に慣れてしまえば結構作業スピードが上がる気がします。
まだ登録し忘れのキーとか出てくる気がしますが、しばらく使ってみて改善した点があればまた記事にしたいな〜と思っています。

最後まで読んでいただいてありがとうございました！
wordPress REST-APIのjson出力をphpで行う

##JSONデータをphpで扱う
wordPress REST-APIで吐き出されたJSONデータをphpで出力します。


```php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>phpでjson</title>
</head>
<body>


<?php
$url = "http://example.net/wp-json/wp/v2/news/?_embed&per_page=7";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);

if ($arr === NULL) {
        return;
}else{
        $json_count = count($arr);
        for($i=0;$i<$json_count;$i++){?>

           	<h2>【ID番号】<?php echo $arr[$i]["id"];?></h2>
            <p>【ページタイトル】<?php echo $arr[$i]["title"]["rendered"];?></p>
            <p>【リンク】リンク先は<a href="<?php echo $arr[$i]["link"];?>">こちら</a></p>
            <?php $date = $arr[$i]["date"];?>
            <time>【日付】<?php echo date('Y年m月d日',  strtotime($date));?></time>
			<hr>
<?php
	}
}
?>

</body>
</html>
```

###参考記事一覧
phpとjsonについて詳しくは下記の記事をご覧ください。
参考記事　[PHPでJSONデータの取得の仕方](https://qiita.com/fantm21/items/603cbabf2e78cb08133e)

wordpressのREST-APIの使い方については前回私が書いた記事を参考にしてください。
参考記事　[WordPress WP_REST_API　使い方の基本設定とエンドポイントの勉強](https://qiita.com/dropmo/items/89baa630543b3860b7a5)
【Swift4】文字列の最初または最後の文字が任意の文字がチェックする

## 環境
- Swift5

## 本題
たまに文字列の最初の文字が任意の文字かチェックしてから処理を行うことがある。
それがこちら。

```swift:ソースコード
let str = "アスタリスク"

if str.hasPrefix("ア") {
    print("OK!")
}else {
    print("NG!")
}

if str.hasSuffix("ク") {
    print("OK!")
}else {
    print("NG!")
}
```

```swift:実行結果
OK!
OK!
```

複数文字列のチェックも可能らしい…　 つよい。

```swift:ソースコード
let str = "アスタリスク"

if str.hasPrefix("アスタ") {
    print("OK!")
}else {
    print("NG!")
}

if str.hasSuffix("リスク") {
    print("OK!")
}else {
    print("NG!")
}
```

```swift:実行結果
OK!
OK!
```

文字列に対してチェックしたい時にどうぞ！
【読書&写経】『ブロックチェーン・プログラミング』 で引っかかったところまとめ

コマンド叩いたりして、エラー返ってきたやん、ってときに書きます。
この投稿が親でChapter単位でまとめていきます。リンク貼ってきます。
気まぐれなので、すんなりいったところは書かないかも。
内容は本買って読んでくださいね。

# 読んでる本
**ブロックチェーン・プログラミング　仮想通貨入門**
(Amazon) http://amzn.asia/7RScCwQ
(楽天) https://books.rakuten.co.jp/rb/15024173/
電子書籍版買うと、改訂されるかも？

# 私のスキルレベル
- 普段はCentOSなのでUbuntuはほぼ初
- ブロックチェーンって美味しいの？レベルの知識
- rubyは数年前にちらっと触ったけど、もう覚えてないよね

# 実施環境

Windows10 WSL上のUbuntu

```
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

# リンク
## [Charpter1. ツールの導入](https://qiita.com/yukiko-bass/items/067f6e3db5a3726ac44d)
【読書&写経】『ブロックチェーン・プログラミング』 Charpter1. ツールの導入

# ツールの導入方法のところ
Ubuntuのパッケージインストールは特に問題なく出来た

# bitcoindの起動と停止の話
なんかまだるっこしく、フォルダ構成とかconfファイルの話とかしてたけど、
要は、一回起動させる→bitcoinディレクトリ出来る→confファイル作る→再度起動 って流れをやる。

1. 起動
Ubuntuだとこのコマンド
`bitcoind -deamon &`
&つけないと、バックグラウンド起動にならないから、いろいろめんどい

2. 停止
Ctl+Cで抜ける

3. bitcoinフォルダの直下にbitcoin.confを作成する。
Ubuntuだと ~/.bitcoin/ に出来る。ファイルの内容は本の通りに。

4. もう一回起動
`bitcoind -deamon &`

# ブロックチェーンの情報確認
bitcoin-cli getinfoで確認出来るって書いてたけど、もう無くなったAPIになっちゃてたみたい。

```
$ bitcoin-cli getinfo
error code: -32601
error message:
getinfo

This call was removed in version 0.16.0. Use the appropriate fields from:
- getblockchaininfo: blocks, difficulty, chain
- getnetworkinfo: version, protocolversion, timeoffset, connections, proxy, relayfee, warnings
- getwalletinfo: balance, keypoololdest, keypoolsize, paytxfee, unlocked_until, walletversion

bitcoin-cli has the option -getinfo to collect and format these in the old format.
```
書いてある通りに以下のコマンドを叩いてみれば、それらしいJSONが返ってくる。

```
$ bitcoin-cli getblockchaininfo
$ bitcoin-cli getnetworkinfo
$ bitcoin-cli getwalletinfo
```

# Rubyのインストール

Ubuntuのaptはリポジトリは古いから、apt-getで落ちてきたのは2.3でした。
今は最新は2.5。
本は2.4だったので、2.4を入れることに。
@sasurai_usagi3 さんの[Ubuntuで最新バージョンの諸々をインストールする パターン2 リポジトリの追加](https://qiita.com/sasurai_usagi3/items/99b72c5481dfb6b090e2#%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B32-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0) を参考にさせていただきました。
ちなみに、リポジトリを追加したら、apt-get updateしないといけないみたいね。。
https://www.brightbox.com/blog/2017/01/13/ruby-2-4-ubuntu-packages/

# openassets-rubyのインストール
ruby2.4-dev入れてもなんかわからないエラーが出るなぁと思ったら開発ツールが入ってなかったってオチでした。
@moris さんの　[Ubuntu 14.04 に gcc、gdb などの開発ツールをインストールする](https://qiita.com/moris/items/02c01a239b9701336260)
を参考に以下のコマンド叩いて、
```
sudo apt-get install build-essential
```
sqlite3を入れたら、openassets-rubyもOKでした。
Signal Subspace法（カーネルPCA）を使って音声データのノイズ除去（音声強調）をやってみた

書いてみました。
https://github.com/ryogrid/pyssp_mod/blob/master/kpca_denoise.py

カーネルPCAの実装は以下から拝借しました。
https://github.com/lucasrodes/kPCA-denoising-python/blob/master/our_kpca.py

やっていることは、
-音声データを512サンプルに分割して並べて行列にする
-512サンプルごとにFFTをかけて、振幅スペクトルベクトル群(行列)と位相スペクトルベクトル群(行列)を求める
-上の振幅スペクトル行列にk-PCAを用いたデノイズ処理をかける
-得られた行列の中のデノイズされた振幅スペクトルベクトル(512要素)と位相スペクトルベクトルをよろしくして行列にする
 -位相スペクトルベクトルに1j(虚数のみ1の複素数)をかけてexpをとったものに、振幅スペクトルを乗算
-上の行列の512要素(行か列かどっちだろ)ごとにIFFTをかける
- IFFTをかけた行列の全要素の実部だけとりだして、1次元ベクトルに並べ直す
- デノイズされた音声データが得られたぞ！

いくらかノイズ除去はできました。パラメータをいろいろ試せばもっと良い効果が得られるかも。

以上です。
2つのファイルを比較して片方にしか含まれない行、両方に含まれる行を抜き出すツールをGitHub Pagesを利用して公開した

## 作ったもの
2つのファイルをアップロードして、

- 両方のファイルに含まれる行
- 片方のファイルにしか含まれない行

を抜き出すとてもシンプルなツールです。

## DEMO
https://nobby0024.github.io/list_comparison/

source codeは[コチラ](https://github.com/nobby0024/list_comparison)


## 作った理由
「2つのファイルから重複行を抽出/削除できるオンラインツール」が意外と見つからなかったからです。

私はエンジニアとして働いているのですが、別部署の人から2つのファイルを比較できるツールを「さくっ」と作れないか？と相談されたことがキッカケでした。

2つのファイルを比較して両方に含まれる行を抜き出したり、片方にしか含まれない行を抜き出す作業を行なっている人は多いでしょう。正直、みなさん自分なりのやりやすい方法を確立していると思います。
Excelを使ったり、linuxコマンドや簡単なスクリプトを書いて行なったり。

私もその話を聞いた時、「そんなのググればいくらでも出てくるのでは・・」と。でも、意外とオンラインでできるツールは出てこなかったんですよね。（探し方が悪いだけかもしれませんが。）

また、非エンジニアの方はlinux上でコマンドを叩くことは中々しないでしょうし、Excelでは大きなファイルを扱うことが難しいので、意外と困っている人もいるのかな、、と思い始めました。

ググって出てくるツールは、何かしらのソフトウェアパッケージの形になっていて、PCにインストールする必要があるのも面倒だったのかな、と。

あとは、郵便番号のような、何かしらのユーザ情報が記載されたファイルだと、機密性の観点から知らないツールを使うのが怖かったりもするのかもしれませんね。

# 利用した技術
これと言ったものは特に使っておらず、HTML, css, javascriptだけです。サーバーサイドにデータは送信せず、全てクライアント側のjavascript処理で完結しています。

デザインセンスは糞なので
[semantic UI](https://semantic-ui.com/)というcssフレームワークを使わせていただきました。あとは昔ながらのjQueryです。 (^^;)

ファイルの内容は自分のbrowser内で扱われるだけなので、機密性の高いファイルでも安心・・・(!?)

## 注意点
### ファイルサイズと処理時間
200万行強のテキストファイル、約25MB 2ファイルを扱った時の体感時間が5秒くらいです。
※それ以上は試していません、すいません。

ファイルの1行ごとの内容をhashに入れて比較しているので、hashオブジェクト化した際のメモリ限界点を超えるサイズのファイルだとbrowserが死ぬはずですが、どのくらいまでいけるのかは試していません、すいません。

### 比較処理中のボタン連打
しないでください（笑）、お願いします。例えば「処理中にローディング画像をだす」みたいな細かい事までは対応してません。手抜きです。何卒、ご容赦ください。

## 所感
[GitHub Pages](https://pages.github.com/)の機能を利用して今回作った静的ページを公開しましたが、めちゃくちゃ楽ですね。。
[firebase hosting](https://firebase.google.com/docs/hosting/)も楽チンすぎると思っていましたが、今回のようなデモツールはGitHub Pagesで十分でした。
CloudGarageでRancher2.0 RancherGUI表示まで

CloudGarageのDevAssistProgramに通して頂けたので使ってみた備忘録を書いていく。

# CloudGarage

https://cloudgarage.jp/

DevAssistProgram(DAP/開発者向けインスタンス無償提供制度)
https://cloudgarage.jp/dap/

CloudGarageではインスタンスOSとしてRancherOSを選択できる。
VPSとかクラウド系サービスではレアみたいなのでこれを使って何か立てる(つもり)。

# 全然わからないので雰囲気でRancherをやる

僕のRancherに対する知見はほぼ0。
「なんかDockerをこう・・・アレするツール？」くらいのレベル。

http://rancher.com/docs/os/v1.2/en/
https://qiita.com/erukiti/items/c5bc4a73e457082fbe04#_reference-547113f6f63474fb98e5
https://qiita.com/FoxBoxsnet/items/88b35e52fa075077fccb

これらを参考に雰囲気で進める。

# インスタンス追加

会員登録・ログインしたら早速インスタンス追加をクリック。

VPSレンタルサービスでよく見るような画面が出てくる。
ここまでは大丈夫そう。

OSはもちろんRancher。
それ以外は任意に入力してインスタンス作成。

# RancherOSセットアップ

インスタンスにグローバルIPアドレスが割り当てられるので確認しておく。

インスタンス一覧画面からさっき作ったインスタンス名をクリック。
詳細画面に飛べるので、コンソール表示をクリック。

コンソール画面右上の`send ctrl+alt+del`をクリック。
ちょっと待つとコマンド入力を受け付けるようになるので、

```bash
sudo passwd rancher
```

を叩いてパスワードを設定する。

確認したグローバルIPアドレスでMacのターミナルからログイン。

```bash
ssh rancher@xxx.xxx.xxx.xxx
```

設定したパスワードでログインできる。
ここに公開鍵を置きたいのでローカルのMacで鍵を生成する。

```bash
cd ~/.ssh
ssh-keygen -t rsa -f rancher_id_rsa
```

鍵を作ったので再びCloudGarageWebコンソールに戻る。
config.ymlというファイルを作り、その中に生成した公開鍵rancher_id_rsa.pubの内容をコピーする。

```bash
vi config.yml
```

```yml:config.yml
#cloud-config
ssh_authorized_keys:
  - ssh-rsa AAAA......
```

`#cloud-config`というコメントは必須みたいなので注意。
実はこの時点ではOSのインストールが済んでいない(?)のでインストールコマンドを叩く。
特にこのへん理解が曖昧なので間違ってるかも。

```bash
sudo ros install -c config.yml -d /dev/vda
```

2回質問されるが両方ともyでOK。
Rebootが始まりWebコンソールが終了する。

再起動するので待つ。
起動したらインスタンス詳細画面からISOをアンマウントする。
再起動(強制)ボタンを押せとダイアログが出るので、その通りに押す。

また再起動するので待つ。
起動したらさっきの鍵でログインできるようになっている。
というわけでMacからログイン。

```bash
ssh -i ~/.ssh/rancher_id_rsa rancher@xxx.xxx.xxx.xxx
```

ログインできたらRancherサーバを`docker run`する。

```bash
docker run -d -p 8080:8080 rancher/server:v2.0.0-alpha21
```

ブラウザのアドレスバーで`<インスタンスグローバルIP>:8080`と叩けば以下の画面が出てくる。

<img width="1679" alt="スクリーンショット 2018-03-18 17.43.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/176237/2049852e-c63f-f82f-edd9-39ba9cf4c9ca.png">
display:flexを使った横並びメニューの書き方

# はじめに
display:flexを使った横並びメニューの書き方をまとめました。
# 事前準備
ulタグにメニューの内容を記述し「list-style:none」を指定して縦に並べておきます。
見やすいようにデザインも少し整えておきます。

```html
<ul>
    <li class="btn">menu1</li>
    <li class="btn">menu2</li>
    <li class="btn">menu3</li>
    <li class="btn">menu4</li>
    <li class="btn">menu5</li>
</ul>
```

```css
/**list-styleを指定する**/
ul{    
    list-style: none;
}

/** 見た目を整える **/
body,ul,li{
    margin:0px;
    padding:0px;
}

.btn{    
    padding:10px 30px;
    margin:2.5px;
    
    background-color: rgba(135, 206, 235,1);
    border-radius: 5px;
    
    text-align: center;
    color:white;
}

```
この状態でのブラウザの表示は、こんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/0f2744ee-cc58-6c91-b442-42c796a2555a.png)

# display:flexを使って横並びメニューを作る。
display:flexを一行追加します。
これで横並びメニューの出来上がりです。

```css
ul{
    list-style: none;
    display:flex;
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/de9603ff-3092-3a8b-432d-aeed990e526b.png)
# 左右の表示位置を変更する
justify-contentを指定することで左右の表示位置を変更できます。
###左寄せ(デフォルト)
```css
ul{
    list-style: none;
    display:flex;
    justify-content: flex-start; // 省略可
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/4127741d-c9a4-f38d-74b4-5699bc0a25b1.png)

###中央寄せ
```css
ul{
    list-style: none;
    display:flex;
    justify-content: center;
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/021d87a8-74ce-c736-22bf-f959d00aa2ae.png)

###右寄せ
```css
ul{
    list-style: none;
    display:flex;
    justify-content: flex-end;
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/7b4e82f6-60dc-e486-0688-7e0c3490f319.png)

# 上下の表示位置を変更する
align-itemsを指定することで左右の表示位置を変更できます。
align-itemsは、高さを指定しないと上手く動かないので高さの指定を忘れないようにしましょう。
### 上寄せ
```css
ul{    
    list-style: none;
    display:flex;
    
    height:70px;
    align-items: flex-start;
    
    background-color: rgba(211, 211, 211,0.3); // 分かりやすいように背景色を指定
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/0078e963-cd91-8852-516c-87370bffeda6.png)

### 中央寄せ
```css
ul{    
    list-style: none;
    display:flex;
    
    height:70px;
    align-items: center;
    
    background-color: rgba(211, 211, 211,0.3); // 分かりやすいように背景色を指定
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/a7c5128b-c822-b1d2-6952-a282556d30b3.png)

### 下寄せ
```css
ul{    
    list-style: none;
    display:flex;
    
    height:70px;
    align-items: flex-end;
    
    background-color: rgba(211, 211, 211,0.3); // 分かりやすいように背景色を指定
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178845/37115e60-f94a-6845-129d-39b8ebfe06cf.png)


以上です。
Alibaba Cloud OSS Image Service（IMG）を触ってみる

# 今回は

[前回](https://qiita.com/uchimanajet7/items/143e9854ee04bd58854b) `Object Storage Service (OSS)` の基本的な部分について触ってみたので、今回はその際に気になった `Alibaba Cloud OSS Image Service（IMG）` を触ってみました。 

# Alibaba Cloud OSS Image Service（IMG） とは
日本語公式サイトには

> - イメージ処理 - イメージ処理（IMG）ガイド| Alibaba Cloud ドキュメントセンター
    - https://jp.alibabacloud.com/help/doc-detail/44686.htm


> Alibaba Cloud OSS Image Service（IMG）は、大容量、高セキュリティ、低コスト、高信頼性を備えた画像処理サービスです。OSSでオリジナルイメージをアップロードして保存することで、簡単なRESTful APIを使用して、いつでもどこでも、インターネットデバイス上のイメージを処理できます。

という記載があります。OSSにアップロードされた画像ファイル操作することができるみたいですねー

提供されている機能としては

>- 画像情報の取得
- 画像フォーマットの変換
- 画像のスケーリング、トリミング、回転
- イメージ、テキスト、およびテキストとイメージの透かしをイメージへの追加
- イメージ処理スタイルのカスタマイズ
- 複数の画像処理機能をパイプラインを介して設定された順序での呼び出し

上記の機能を見ると、これはAlibaba 自体が巨大にEコマースを運営しているのでサムネイル画像とかそんなところに使えそうな雰囲気ですね。

# 触ってみる
ログインしたあとのコンソールで「Storage & CDN」>「Object Storage Service」を選択してOSSの画面に移動する。

> ![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/106798/6b7b3e64-bd10-e9ce-c151-316550311b77.png)

公式ドキュメントがよくまとまっているので、これを見ながら進めれば
特に詰まるところもなく使える雰囲気

> - イメージ処理 - イメージ処理（IMG）ガイド| Alibaba Cloud ドキュメントセンター
    - https://jp.alibabacloud.com/help/doc-detail/44686.htm


### 前回と同様に

[前回](https://qiita.com/uchimanajet7/items/143e9854ee04bd58854b) の記事を参考にして、`バケットの作成`と`画像ファイルのアップロード`を行います。

ファイル一覧画面に、画像ファイルが存在する状態になっていればOKです。

> ![Screenshot4.png](https://qiita-image-store.s3.amazonaws.com/0/106798/45d6b90b-f22c-c6d0-cb9d-73952def158e.png)


### スタイルの作成

イメージ処理を行うためには`イメージスタイル`を事前に定義する必要があります。
`イメージ処理`タブを選択して、スタイル一覧画面に遷移します。

> ![Screenshot0228-1.png](https://qiita-image-store.s3.amazonaws.com/0/106798/84396268-f8f5-ab52-aa95-792e205fa07b.png)

`スタイルの作成`ボタンをクリックして以下の画面を表示します。

> ![Screenshot0228-2.png](https://qiita-image-store.s3.amazonaws.com/0/106798/ddfd0e3f-5108-40f0-dbfa-1e59358d2907.png)

`スタイル名`を入力して編集タイプで`基本編集`ボタンを選択します。
今回は「リサイズ」を行うスタイルを作ってみますので、サイズ変更モードで画像サイズを変更するものを選択します。画像の例では`比例サイズ変更`を選択しています。

他にもいろいろと設定できますが、詳細は公式ドキュメントを確認してください

> - イメージ処理 - イメージ処理（IMG）ガイド| Alibaba Cloud ドキュメントセンター
    - https://jp.alibabacloud.com/help/doc-detail/44686.htm

ウォーターマークもこの段階でいろいろと付けられるの便利でいいですねー
正常にスタイルが作成できていれば、スタイル一覧画面に表示があるはずです。

> ![Screenshot0228-3.png](https://qiita-image-store.s3.amazonaws.com/0/106798/fcf18ff0-e257-47d6-0505-b7f2dca78fec.png)



### 画像ファイルにスタイルを適用する

定義したスタイルを画像に適用するには、ファイル一覧画面でスタイルを適用したファイルの`編集`リンクをクリックして`プレビュー`画面を表示します。

> ![Screenshot0228-5.png](https://qiita-image-store.s3.amazonaws.com/0/106798/72aafd35-625f-4cf9-c152-9dde10649b03.png)

`イメージスタイル`のプルダウンメニューにで先ほど作成したスタイルが表示されているはずなので、そのスタイルを選択します。

スタイルを適用するとプレビューに表示されている画像にもスタイルが適用されるので、変化がわかるかと思います。

# まとめ

- Alibaba Cloud OSS Image Service（IMG）を使ってみたが、画像1つから動的にいろいろできるのは便利
- IMGというのは略称はWebで情報を検索するときにほかの情報も拾いそう・・・
- ドキュメントがよくまとまっていて、日本語化されているので困ってもドキュメント見ればOKなのは助かる
- 今回は単純な`イメージのサイズ変更`だったが他にも
    - イメージのトリミング
    - イメージの回転
    - 効果の適用
    - 形式の変換
    - ウォーターマークの追加 などが利用できる
- 動的に生成しているとのことだが、レスポンスも速い
- ストレージ側にこのような機能があるとFaaSと組み合わせて静的Webサイトを作る場合にも便利そう。

以上になります。
Ubuntuでショートカットを作成する（初心者向け）

面白そうな記事を見つけました
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0669?page=2
第669回　Ubuntuとデスクトップフォルダー機能
デスクトップファイル

#####実行した環境
Ubuntu Stdio 17.10

#１．ICONを作成する。
32x32ピクセルの.pngを作成する。
私はシステムにあるICONファイルを/homeにコピーして使用しています。
コピーしなくても、ICONファイルのパス名とファイル名のリストを作成しておいても良いです。
ネットにも沢山あります。
#２．ショートカットを作成する。
テキストエディタで下記の内容で作成し拡張子を「.desktop」にします。
実行権限を与えます。

```python:
chmod +x 「ファイル名」.desktop
```
Ubuntu Stdio 17.10ではファイルマネージャーで　プロパティ　ー＞　アクセス権　ー＞　プログラムとしての実行を許可する
にチェックを入れると実行権限を与えることが出来ます。

Name=「ショートカットに表示される名称です。ファイル名は表示されません。」
Comment=「コメントです。何でも良いです。」
Icon=「ICONのパスとファイル名を指定します。指定しない場合はデフォルト？？のICONになります。種類別にICONを変更したほうがわかりやすい。」

WEB用
URL=「URLを指定します。」

```python:WEB.desktop
[Desktop Entry]
Name=Web
Comment=This is my comment
Icon=/home/ty/bin/icon/web.png
Terminal=false
Type=Link
URL=https://qiita.com/trend
GenericName[ja]=HP
```

実行ファイル用
Exec=「実行ファイルを指定します。パスが通っていない場合は、フルパスで指定します。」
Terminal=false（***.pyファイルのように端末から実行する場合は"true"にします。）

```python:exe.desktop
[Desktop Entry]
Name=App
Comment=This is my comment
Exec=gedit
Icon=/home/ty/bin/icon/application.png
Terminal=false
Type=Application
```

フォルダ用

```python:DIR.desktop
[Desktop Entry]
Name=DIR
Comment=下のURLでPathを指定する
Icon=/home/ty/bin/icon/DIR.svg
Terminal=false
Type=Link
URL=/home/ty/
```

#３．Templatesフォルダに保存する
Ubuntu Stdio（たしかUbuntuでもできた気がする）では、.desktopファイルを　/home/ユーザー名/Templates
に保存すると、ファイルマネージャーで右クリック　ー＞　ドキュメントの作成　で.desktopファイルを作成することが出来ます。
それをテキストエディタで編集します。



URLは忘れましたが海外のサイトで.desktopファイルのことがすごく詳しいサイトがありました。
もっといろいろな機能があったと思います。
windowsのパスの通し方

使う機会は少ないが故に忘れがち、いちいち調べるのも時間の無駄なのでメモ。

- まず管理者権限でコマンドプロンプトを起動

Windows キー + X
A キー
Alt + Y

- パスを設定する

 setx /m path "%path%;パスを通したいところ"
Arukas.ioを使ってWEBページを公開する

## 前提条件
Arukas.io・DockerHub・GitHub(Bitbucket)のアカウントを所持している。

## 手順
- DockerHubで任意のリポジトリを作成。
- GitHubにDockerfileとindex.htmlを記述したリポジトリを作成。
- DockerHubにログインして右上にある「Create Automated Build」を選択。
- 「Create Auto Bulid GitHub」を選択。
- Dockerfileを記述したリポジトリを選択。
- DockerHubでBuild Settingのタブを開き、「Trigger」ボタンをクリックしてビルドする。
- Arukas.ioにログインして、アプリケーションを作成し、先ほどの操作でDockerHubでビルドが完了したリポジトリを選択。
- 任意のエンドポイントを記述し、portはデフォルト(80)に設定し保存。
- アプリケーションを起動し、「https://任意のエンドポイント.arukascloud.io」にWEBページが公開できていることを確認。

## Dockerfileの記述例
```dockerfile
FROM centos:7.4.1708

RUN yum -y update
RUN yum -y install httpd
RUN yum -y install git

RUN cd /var/www/
RUN git clone https://github.com/XXXX/XXXX.git files # XXXXは任意のアカウントとリポジトリ

RUN mv /var/www/files/* /var/www/html/

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
```

## 何故静的ページなのか
まだベータ版ですし、アプリケーションを再起動するたびに全てリセットされるので、今はまだ静的ページにとどめておいた方が良いのではないかと思った次第。
作成したメール認証機能を削除しようとして日曜日終わった

クラウドなメール送信サービスのひとつである「SendGrid」を使用し作成した
ログイン後のメール認証機能を無くそうとして日曜日終わってしまった記録。

#モデル
```app\models\user.rb
class User < ActiveRecord::Base
  # モデルの設定、:confirmable,を削除する
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable

  #carrierwave用の設定、deviseの設定配下に追記
  mount_uploader :avatar, AvatarUploader

  # has_many :hogesにより子モデル(hoge)が複数ひもづくアソシエーションを定義する
  has_many :hoges 

  # ツイッターでログインできるようになるためのメソッドの処理
  def self.find_for_twitter_oauth(auth, signed_in_resource = nil)
    user = User.find_by(provider: auth.provider, uid: auth.uid)
    unless user
      user = User.new(
        name:     auth.info.nickname,
        image_url: auth.info.image,
        provider: auth.provider,
        uid:      auth.uid,
        email:    auth.info.email ||= "#{auth.uid}-#{auth.provider}@example.com",
        password: Devise.friendly_token[0, 20]
      )
      user.skip_confirmation!
      user.save
    end
    user
  end
  #（アカウント新規登録）ランダムなuidを作成するcreate_unique_stringメソッド
  def self.create_unique_string
    SecureRandom.uuid
  end
  # omniauthでサインアップしたアカウントのユーザ情報の変更出来るようにする
  def update_with_password(params, *options) # pdate_with_passwordをオーバーライド(メソッドを定義しなおしている)
    if provider.blank?
      super
    else
      params.delete :current_password
      update_without_password(params, *options)
    end
  end
end
```
## ひとまずrails s でサーバを起動してブラウザで動作を確認
```
rails s -b 0.0.0.0
```

##エラー

- NoMethodError in Users::OmniauthCallbacksController#twitter 
- Undefind method "user.skip_confirmation!"


ここで結構調べる、あきらめかけた



## もう一度モデル内の記述"user.skip_confirmation!"確認

```app\models\user.rb
  # ツイッターでログインできるようになるためのメソッドの処理
  def self.find_for_twitter_oauth(auth, signed_in_resource = nil)
    user = User.find_by(provider: auth.provider, uid: auth.uid)
    unless user
      user = User.new(
        name:     auth.info.nickname,
        image_url: auth.info.image,
        provider: auth.provider,
        uid:      auth.uid,
        email:    auth.info.email ||= "#{auth.uid}-#{auth.provider}@example.com",
        password: Devise.friendly_token[0, 20]
      )
      # ツイッターでログインするときはメール認証要らないですよの意味っぽいこと書いてたのを忘れてた、ここを削除してみた
      user.skip_confirmation!
      user.save
    end
```

## 再びrails s でサーバを起動してブラウザで動作を確認
```
rails s -b 0.0.0.0
```


# 解決

ちゃっちゃ系のラーメン屋でも探しに行こう
coffeescriptを残したままcoffeescript2を使いたい



2017年、久しぶりにcoffee scriptがメジャーアップデートを行いました。

「coffeescript？オワコンだろ？」と言われる中、jsの括弧の多さに辟易してtype scriptやES6へ進めない、進みたくないcoffee使いの方は根強く存在していると思われます。(知らんけど)

しかしcoffee script2(以下2系)はES2015/6に準拠する形でのコンパイルが行われるらしいので、互換性の心配が付きまといます。しかし同時にasync/awaitが使えるようになったというので興味はあります。

過去にcoffeeで書いた遺産が動かなくなったら困るので移行できない、でも使ってみたい。

そこで私はcoffeescriptを残したまま「coffeescript2」をインストールすることにしました。


:exclamation: 2018/03/19追記
coffee-scriptはcoffeeコマンドを呼び出す場所(ディレクトリ)直下のnode_modulesを探し、そこにcoffee-scriptがあれば（ローカルインストールしていれば)それを優先して使用します。
:exclamation: 長々と書いていますが,**coffeeコマンドを呼び出す場所にローカルインストールしていればそこだけで使えます。**他の場所には影響しませんので**２系を使う場所でローカルインストールすればいいだけです。**

## 概要

1. 適当な場所に2系をインストールする
2. パスの通った場所にシンボリックリンクを張る
3. 「coffee2」というコマンドが使えるようになる



## 実践

### 1. 適当な場所に2系をインストールする

場所は本当にどこでもいいです。仮に`$HOME/node_modules_alt`というディレクトリにインストールしてみましょう。



```
cd
mkdir node_modules_alt
cd node_modules_alt
npm i -y
```

これで場所の準備はできました。インストールしてみましょう。
ローカルインストールですので`-g`オプションを付けないように注意してください。

```
npm i coffeescript
```

1系か2系かややこしくなりそうなので名前を変えても良いと思います(任意)

```
cd node_modules
mv coffeescript coffeescript2
```

### 2. パスの通った場所にシンボリックリンクを張る

このままでは当然「coffee2」というコマンドは使えませんのでリンクを張ります。
私は`$HOME/bin`という場所にパスを通しています。
無い人は以下の様に。

```
cd
mkdir bin
```

この場所にパスを通すために`.bashrc`や`.zshrc`などに追記します。

```bash:.bashrc/.zshrc
export PATH=$HOME/bin:$PATH
```
あとはリンクを張るだけです。

```
cd ~/bin
ln -s ~/node_modules_alt/node_modules/coffeescript2/bin/coffee coffee2
```

### 3. 「coffee2」というコマンドが使えるようになる

試してみましょう。

```shell
> coffee2  --version
CoffeeScript version 2.2.3
```

念のためにcoffeeも。

```shell
> coffee --version
CoffeeScript version 1.12.7
```

これで2系が使えるようになりました。
あとは今までコンパイルの時に使っていた`coffee`コマンドを`coffee2`に変えるだけです。
不具合があったらまた`coffee`に変えるだけで戻せます。

enjoy your coffee life!! :laughing:
クラウドサーバレスデータベースまとめ

クラウドのサーバレス*データベースサービスを料金の観点からまとめてみました。
調べる時に色んなURLに飛ばないといけなく大変なので、まとめました。参考程度にどうぞ。
2018年3月18日現在
*ここでいうサーバレスは自動スケールアウト、自動容量アップもしくは制限なしを意味することとする

ピックアップしたのは下記3社4サービス

- Amazon
    - Aurora Serverless
- Google
    - Cloud Datastore
    - Cloud SQL(容量上限が存在するので、定義に反するが容量が大きいので記載)
- Microsoft
    - Azure Cosmos DB

#単純にストレージ料金のみを比較した時
リージョンは東京

| サービス名        |1か月のストレージ料金(GB/月)|備考|
|:-----------------|-------------------------:|----------------------:|
| Aurora Serverless|                   0.10USD|                       |
| Cloud Datastore  |                   0.23USD|                       |
| Cloud SQL        |              0.22USD(SSD)|           0.12USD(HDD)|
| Azure Cosmos DB  |                  31.64JPY|                       |

#Aurora Serverless
[Amazon Aurora Serverless](https://aws.amazon.com/jp/rds/aurora/serverless/)
プレビュー(2018年3月18日時点)
###ストレージタイプ
リレーショナルデータベース

###料金
|項目              |料金                   |
|:-----------------|---------------------:|
|ACU               |                0.6USD|
|ストレージ         |         0.10USD/GB-月|
|I/O               |0.20USD/100万リクエスト|

#Cloud Datastore
[Google Cloud Datastore](https://cloud.google.com/datastore/?hl=ja)

###ストレージタイプ
NoSQL

###料金
|         |1日あたりの無料利用枠|無料利用枠を超えた場合の料金(単価)|料金|
|:-----------------|-------------------------:|----------------------:|---:|
|ストレージ|1GB|$0.23|GB/月|
|エンティティの読み込み数|50,000|$0.08|/10万エンティティ|
|エンティティの書き込み数|20,000|$0.23|/10万エンティティ|
|エンティティの削除数|20,000|$0.03|/10万エンティティ|
|小規模オペレーション|50,000|無料||

#Cloud SQL
[Google Cloud SQL](https://cloud.google.com/sql/docs/?hl=ja)
MySQL、PostgreSQL(ベータ)から選択可能

###ストレージタイプ
リレーショナルデータベース

###料金
リージョン:東京
第2世代MySQL

|項目              |料金                   |
|:-----------------|---------------------:|
|マシンタイプ         |下記参照                                         |
|ストレージ           |SSD-0.22GB/月 HDD-0.12GB/月 バックアップ-0.10GB/月|
|ネットワーク         |上り-無料　下り-IPv4 0.015/時間                   |

マシンタイプ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42311/acc2015a-eaf2-72e4-5afb-97c1b9bbba88.png)

#Azure Cosmos DB

[Azure Cosmos DB](https://azure.microsoft.com/ja-jp/services/cosmos-db/)

###ストレージタイプ
NoSQL

###料金

|項目              |料金                   |
|:-----------------|---------------------:|
|SSDストレージ           |31.64JPY-GB/月|
|予約済みRU/秒(100RUごと、最低400RU)|1.01JPY/時間|
Github の master ブランチ変更

clone してできた git の master ブランチに実験的な変更をもりもり入れていたので、clone 元と同じ内容のブランチ（org）を master に変える。  
ブランチ名は master -> experiment, org -> master と変更する。  
https://github.com/hokorobi/plantuml-syntax で実施した。

1.	Github の Default branch を master から org に変更する。
2.	ローカルで master ブランチの名前を変更。

	```
	git branch -m master experiment
	```

3.	Github の master ブランチを削除

	```
	git push origin :master
	```

4.	Github に変更先のブランチを追加

	```
	git push origin experiment
	```

5.	ローカルで org ブランチの名前を変更。

	```
	git branch -m org master
	```

6.	Github に変更先のブランチを追加

	```
	git push origin master
	```

7.	Github の Default branch を master へ変更する。

8.	Github の org ブランチを削除

	```
	git push origin :org
	```