OmniAICreator/Qiita-1.07M huggingface dataset:
[Linter] CSSLint のルール設定ファイル .csslintrc の作り方

# はじめに
[Atom](https://atom.io/) で [CSSLint (linter-csslint)](https://atom.io/packages/linter-csslint) を使っていて、あまりにも警告が鬱陶しくてルールをカスタマイズしようと思ったけどハマったのでメモ。



# .csslintrc の書き方
以下のように書きます。JSON 形式です。

```json
{
  "ignore": [
    "adjoining-classes",
    "ids"
  ],
  "warnings": [
  ],
  "errors": [
    "known-properties"
  ]
}
```

## ルール

ルールは以下を参照してください：

公式：https://github.com/CSSLint/csslint/wiki/Rules
https://qiita.com/oh_rusty_nail/items/12e5783a9630a6905b1e#1-beware-of-box-model-size
https://gist.github.com/hail2u/1303613

# .csslintrc の場所
Atom の場合は現在開いているプロジェクトルート（1つしかファイルを開いていない場合はそのファイルがあるフォルダ）。
`csslint` を実行する場合はカレントディレクトリ。

ホームディレクトリ `~` に置いても認識してくれるかと思ったが認識してくれないようです。:weary:
https://github.com/CSSLint/csslint/issues/529
Issue としてはあるんですが最近更新されていないようですね…

# → stylelint に乗り換えよう
stylelint なら `~/.stylelintrc` も読み込んでくれるし良い感じ。
https://stylelint.io
設定方法：https://stylelint.io/user-guide/configuration/
ルール：https://stylelint.io/user-guide/rules/

ちなみに自分の設定ファイルはこんな感じです：
https://github.com/shge/dotfiles/blob/master/.stylelintrc

# 参考
http://d.hatena.ne.jp/chi-bd/20170218/1487418124
EXC_BAD_ACCESS KERN_INVALID_ADDRESS in UIWebView

One of the common crashes has a trace like the following:

```
0  libobjc.A.dylib                0x1de214d70 objc_msgSend + 16
1  UIKitCore                      0x20c6f0f04 -[UIWebView webView:resource:canAuthenticateAgainstProtectionSpace:forDataSource:] + 92
2  WebKitLegacy                   0x1e92c624c CallResourceLoadDelegateReturningBoolean(bool, void (*)(), WebView*, objc_selector*, objc_object*, objc_object*, objc_object*) + 76
3  WebCore                        0x1e8977604 WebCore::ResourceLoader::canAuthenticateAgainstProtectionSpace(WebCore::ProtectionSpace const&) + 64
4  WebCore                        0x1e8977580 WebCore::ResourceLoader::canAuthenticateAgainstProtectionSpaceAsync(WebCore::ResourceHandle*, WebCore::ProtectionSpace const&, WTF::CompletionHandler<void (bool)>&&) + 32
5  WebCore                        0x1e7ec9160 WTF::Function<void ()>::CallableWrapper<-[WebCoreResourceHandleAsOperationQueueDelegate connection:canAuthenticateAgainstProtectionSpace:]::$_3>::call() + 136
6  JavaScriptCore                 0x1e633cc8c WTF::dispatchFunctionsFromMainThread() + 308
7  Foundation                     0x1dfae142c __NSThreadPerformPerform + 336
8  CoreFoundation                 0x1defbe0e0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
9  CoreFoundation                 0x1defbe060 __CFRunLoopDoSource0 + 88
10 CoreFoundation                 0x1defbd944 __CFRunLoopDoSources0 + 176
11 CoreFoundation                 0x1defb8810 __CFRunLoopRun + 1040
12 CoreFoundation                 0x1defb80e0 CFRunLoopRunSpecific + 436
13 WebCore                        0x1e7e293e8 RunWebThread(void*) + 592
14 libsystem_pthread.dylib        0x1dec4825c _pthread_body + 128
15 libsystem_pthread.dylib        0x1dec481bc _pthread_start + 48
16 libsystem_pthread.dylib        0x1dec4bcf4 thread_start + Th4
```

The error is `Crashed: WebThread EXC_BAD_ACCESS KERN_INVALID_ADDRESS`. This usually occurs when you try to access an already released object. The scenario goes something like that:

1. User enters screen with `UIWebView`. The `UIViewController` sets `self` as the delegate.
2. Webpage starts downloading
3. User exits screen and `UIViewController` gets allocated.
4. `UIWebView` finished loading and sends message to delegate method like `webViewDidFinishLoad`

The `delegate` of `UIWebView` is `assigned` instead of `weak`. From Apple's official document for `UIWebViewDelegate`, 
>Before releasing an instance of UIWebView for which you have set a delegate, you must first set the UIWebView delegate property to nil before disposing of the UIWebView instance. This can be done, for example, in the dealloc method where you dispose of the UIWebView.

Therefore, the solution is we need to stop the `UIWebView` from loading its page and sets its delegate to nil before we deallocate the delegate.

```objective_c
- (void)dealloc {
    if (self.webview.loading) {
        [self.webview stopLoading];
    }
    self.webview.delegate = nil;
}
```

reference: https://stackoverflow.com/questions/1520674/exc-bad-access-in-uiwebview
@Queryと@Paramの意味と使い方

#問題
@Queryと@Paramってなに？

##意味
###@query 
データベースに送るクエリ文の指定

###@param
クエリ文の中のクライアント側のデータを指定



##例文
```java:example.java
public interface UserRepository extends JpaRepository<User, String>{
	@Query("SELECT u From User u WHERE u.username=username")
	User findByUsername(@Param("username") String username);
}
```

###こんな感じ
@Queryのカッコ内の"SERECT u～"でfindByUsernameで実行されるクエリ文を指定している。
@Paramのカッコ内の"username"で@Queryのカッコ内の"username"=クライアント側のデータをしている。


###実行
上記サンプルのfindByUsernameが呼び出されると@Paramがクライアント側の"username"を取得し、クエリ文"SELECT u From User u WHERE u.username=username"をデータベースに送る。クエリ文末尾のusernameに@Paramで取得した"username"が入っている。
BigQuery検証


# 事前準備

- BigQueryをとりあえず使ってみることを目的
- Googleが用意してくれているサンプルデータを使って試す
- ここから[サンプルデータ](https://console.cloud.google.com/bigquery?p=bigquery-public-data&page=project)をダウンロード
- 新しいタブでBigQueryのコンソールを開く
- 「bigquery-public-data」という新しいプロジェクトがリソースに追加される
- [bigquery-public-data] -> [london_bicycles] -> [cycle_hire] を開く
    - GCP プロジェクト → bigquery-public-data
    - データセット → london_bicycles
    - テーブル → cycle_hire
- コンソールの中央で「プレビュー」をクリックします。
- [bigquery-public-data] > [london_bicycles] > [cycle_hire] をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/1d7dd3a6-8c73-c2d5-ee7f-3d63efa8e9b2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/d66a8c0a-0d3e-5839-9e78-e13a6ddb9efc.png)


# クエリ実行

* クエリエディタにクエリを入力し、サンプルデータからデータを抽出してみる
* いくつか簡単なSQLを入力
* [クエリを実行] をクリック
* クエリの種類によって実行時間が変わるが全体的に処理性能が高いことがわかる
* このようにデータセットを投入すれば簡単にBigQueryを始められる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/9d62c586-6f34-4b76-9707-e8c598988248.png)



以上、とりあえずBigQueryを使ってみるをメモしてみました
IPアドレスとドメインを繋ぐDNSサーバー

#はじめに
初学者向けです。ざっくりと書いていきます。一番下に参考URLを載せておきます。
IPアドレスは住所！ドメインは住所！みたいな感じで、住所ばっかりでよくわからなかったので調べました。
#IPアドレス
ネットワーク上の機器を識別するために与えられた**数字**です。
例)
・AさんのPCのIPアドレス→192.0.2.1　　　(11000000.00000000.00000010.00000001)
・BさんのPCのIPアドレス→198.51.100.1　(11000110.00110011.01100100.00000001)
・CさんのPCのIPアドレス→203.0.113.1　　(11001011.00000000.01110001.00000001)
()内の数字は後述します。

1.**IPv4**と**IPv6**というバージョンがあり、現在は**IPv4**が主流です。(上記例もIPv4)
しかし、**IPv4**は枯渇しそうです。(2019年現在)

2.**グローバルIPアドレス**と**プライベートIPアドレス**があります。
**グローバルIPアドレス**...ICANNという管理団体が管理してます。重複はできません。
**プライベートIPアドレス**...組織内のネットワーク（プライベートネットワーク）でのみ使用できるIPアドレスです。オフィス内や家庭用のネットワークなどでは、通常**プライベートIPアドレス**が使われています。

###IPv4とIPv6の表記例
IPv4→192.0.2.1
IPv6→2001:0db8:2345:5678:90ab:cdef:0000:0000

上記から分かるように、IPv4とIPv6の大きな違いは、
その組み合わせにより使用できるIPアドレスの数です。
IPv4→約43億個
IPv6→約340澗個

**澗(かん)て何！？**
澗とは10の36乗である。340兆の1兆倍の1兆倍である。
参考[wikipedia](https://ja.wikipedia.org/wiki/%E6%BE%97)
途方もないことだけはわかりました。

###IPアドレスのルール
IPアドレスは32ビット(桁)の2進数ですが、そのままではわかりづらいため、
8ビット毎に「.（ドット）」で区切り10進数表記で表します。それぞれの値は0～255まであります。
一番上の例の()内は2進数表記です。
![ipアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/376013/9728d726-f836-3e18-d358-96836d82789a.png)
出典：wikipedia

#ドメイン
IPアドレスを**文字列**に置き換えたものです。
例)
ホームページ→https://qiita.com/ (IPアドレスだと13.114.188.69)
メールアドレス→info@qiita.com
それぞれqiita.comがドメインになります。

###IPアドレスをドメインにする理由は？
平たく言うと分かりやすくするためです。数字よりも文字の方が覚えやすいし分かりやすいですね。
ドメインを取得することによってホームページを作成したり、メールアドレスを作成したりできます。また、ホームページにおいてドメインが重複することはありません。

###独自ドメインとサブドメイン
ドメインには独自ドメインとサブドメインがあります。

**独自ドメインとは**
世界にまだ存在しないドメインであれば、ユーザーが好きなように名前を付けて利用することができます。一般的に、ドメインの取得や維持に費用が発生し、サーバーも必要となります。
例えばqiita.comは独自ドメインです。

**サブドメインとは**
独自ドメインを細かくして用途によって割り振るドメインのことです。
例えば独自ドメインがqiita.comならばサブドメインはhelp.qiita.comです。独自ドメインの前の「.」で区切ったhelpの部分がサブドメインになります。

**ついでにサブディレクトリとは**
例えばhttps://qiita.com/connecrew-sugiyama
で言うと、connecrew-sugiyamaの部分がサブディレクリになります。
独自ドメインからユーザーページを分けたいなーとか、ヘルプページを要素によって細かく分けたいなーとかの時に使います。

#DNS
DNSはドメインネームシステムと呼ばれており、
数字であるIPアドレスと文字列であるドメインを相互に変換してくれる仕組みです。
この仕組みを行ってくれるサーバーをDNSサーバーと呼びます。橋渡し役ですね。
IPアドレスを使って通信をするルールなので、DNSサーバーのおかげでホームページを表示できます。

#さいごに
かなり大まかな内容だったので、なんとなくわかってくれれば幸いです。
間違っている部分がありましたら、是非ご指摘下さい。


##参考サイト
IPアドレスについては下記を参照させていただきました。
[カゴヤのサーバー研究室](https://www.kagoya.jp/howto/network/ipaddress/)
[IPv4とIPv6の違いについて](https://www.netassist.ne.jp/blog/?p=642)
[日本ネットワークインフォメーションセンター](https://www.nic.ad.jp/ja/basics/terms/ipv6-text-representation.html)
[グローバルIPアドレス](http://www.geolocation.co.jp/learn/ip/06.html)

ドメインについては下記を参照させていただきました。
[カゴヤのサーバー研究室](https://www.kagoya.jp/howto/webhomepage/01/)
[お名前ドットコム](https://www.onamae.com/clever/about/domain.html)
[名づけてネット](https://www.nadukete.net/domain-guide/beginners/whatis.html)
[INNOVA](https://innova-jp.com/3716/)

DNSについては下記を参照させていただきました
[DNSとは](https://www.atmarkit.co.jp/ait/articles/1706/21/news041.html)
[名づけてネット](https://www.nadukete.net/domain-guide/setting/dns.html)
i.MX6(EIM NORフラッシュ起動)でU-Boot SPLからの2段ブートを利用する方法

# i.MX6の起動方法
NXP(Freescale)社のSoCであるi.MX6シリーズを起動させるときは、よっぽどのことが無い限りU-Bootを使うと思います。i.MX6は起動デバイスとして、SDカード、QSPI、パラレルNORフラッシュなどをサポートしています。

# U-Boot SPLとは
U-Bootは、大きく分けて２つの起動パターンがあります。

- U-Boot
- U-Boot SPL(１段目) + U-Boot(2段目)

一般的には、単一のU-Bootバイナリを利用した起動で問題ないのでそれが使われます。もう一方は、U-Boot SPLと呼ばれるサイズが小さな１段目を起動した後、２段目のU-Boot本体をロード起動する方法です。U-Boot SPLは、単一のU-Bootバイナリを動作させるだけのメモリが電源投入直後は利用できない場合などに使用されます。
他にも、U-Boot SPLから直接Linuxを起動することもできたりしますが、それについては今回割愛します。

# i.MX6でU-Boot SPL
i.MX6はSoC内に十分なSRAMを持っているので、SPL起動を利用する意味はないですが、利用することは可能です。簡単なお試し方法と、パラレルNORで試行する際に起きる問題を以下に記載します。

**※SDカードやフラッシュへの格納方法の詳細については省略します**

### SDカード起動で試す
例えばi.MX6 Sabreボードで試すには、以下のコンフィグでU-Bootをビルドすれば試すことができます。

- mx6sabresd_spl_defconfig

ビルドするとSPLというファイル(U-Boot SPL)とu-boot.imgというファイル(2段目本体)ができますので、SDカードに書き込めばOKです。

### パラレルNORフラッシュ起動は問題あり

defconfigファイルの設定に

- CONFIG_SPL=y

の指定を追加することでU-Boot SPLのビルドができますが、起動デバイスにNORフラッシュを使う場合はU-Bootのソースコードを修正する必要があります。
修正しない場合は、ロードした２段目U-Boot本体バイナリのヘッダチェックでNGとなり起動処理が停止します。

#修正方法
U-Bootのソースに対し修正を行います。

```c:common\spl\spl_nor.c
int spl_nor_load_image(void)
{
	/*
	 * Loading of the payload to SDRAM is done with skipping of
	 * the mkimage header in this SPL NOR driver
	 */
+#if !defined(CONFIG_MX6)
	spl_image.flags |= SPL_COPY_PAYLOAD_ONLY;
+#endif

```

```c:common\spl\spl_nor.c
	/*
	 * Load real U-Boot from its location in NOR flash to its
	 * defined location in SDRAM
	 */
	spl_parse_image_header(
			(const struct image_header *)CONFIG_SYS_UBOOT_BASE);

+#if !defined(CONFIG_MX6)
	memcpy((void *)spl_image.load_addr,
	       (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
	       spl_image.size);
+#else
+	memcpy((void *)spl_image.load_addr,
+	       (void *)(CONFIG_SYS_UBOOT_BASE),
+	       spl_image.size);
+#endif

	return 0;
}
```
以上の修正でU-Boot SPLからU-Bootのバイナリが正常に認識され起動できるようになります。
HTMLヘルパーでパラメータで渡した値でなく、モデルの設定値を使いたい

元ネタは以下
> HtmlHelper.TextBox uses the model value even when an explicit value provided
https://stackoverflow.com/questions/12271994/htmlhelper-textbox-uses-the-model-value-even-when-an-explicit-value-provided

## やりたかったこと
入力欄2つ => 1つでもキーワード検索可 => 一意に特定できたら、入力欄に検索結果をセット
がやりたい。

## 問題
HtmlヘルパーのTextBoxForを使って表示すると、モデルに検索結果をセットしていても、検索後の表示は入力値のままになってしまう。
片方の入力欄にだけ入力して検索しヒットした場合、もう片方にはその結果が反映されない。

## 原因
Htmlヘルパーの値は、`ModelStateDictionary(入力パラメータ）`=>`ViewDataDictionary（結果のモデル）` の順で表示するため

> the ModelStateDictionary object, the value of this parameter, the ViewDataDictionary object, and lastly, a value attribute in the html attributes.
https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.html.inputextensions.textbox?view=aspnet-mvc-5.2

## 対応方法
モデル値を優先したい場合、ModelStateの値を削除する

``` Search.cshtml
@Html.TextBoxFor(model => model.KeywordA, new { @class = "form-control" })
@Html.TextBoxFor(model => model.KeywordB, new { @class = "form-control" })
```
``` SearchViewModel.cs
public class SearchViewModel
{
    public string KeywordA { get; set; }
    public string KeywordB { get; set; }
}
```
``` HomeController.cs
public class HomeController : Controller
    public ActionResult Search(SearchViewModel model)
    {
        if (ModelState.IsValid) 
        {
            model = repo.Search(model.KeywordA, model.KeywordB);
            //検索後の入力値はModelState(入力パラメータ）が優先されるため、検索結果が入らない
            //ModelStateの値を削除することで検索結果が表示されるようにする
            ModelState.Remove(nameof(SearchViewModel.KeywordA));
            ModelState.Remove(nameof(SearchViewModel.KeywordB));

        }
        return View(model);
    }
}
```
点群にメッシュをフィッティング！！

<img src=https://qiita-image-store.s3.amazonaws.com/0/356592/e275992d-3df4-85c1-aca1-19fd18781df6.gif width=100%>

# 背景

センサーで撮影した点群をメッシュにするという要求に対して、最終的にたどり着いた手法を紹介する。
前提として、点群にメッシュをフィッティングする（Registration）手法上、テンプレートとなるメッシュが必要になる。

# 手法紹介

以下の論文に記載された手法を実装した。
[Template Deformation for Point Cloud Fitting](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.230.953&rep=rep1&type=pdf)

![Screenshot from 2019-03-25 17-36-21.png](https://qiita-image-store.s3.amazonaws.com/0/356592/01e2339e-cb0f-4319-7c5e-667e7ed3d6a9.png)
図1. 手法外観

## 手法の特徴

- 点群にメッシュをフィッティングさせる
- 点群はある程度欠損したりノイズが入っていてもよい
- 初期位置合わせのために、メッシュと点群で対応する点とその点の局所的な座標軸を数点〜数十点選択する必要がある
    - ただし、精密である必要はなく大まかでよい
- メッシュの局所的な形状性質を保つ

## 手法解説

手法を図1.の図を交えて解説する。

1. 図1.(a)(b)の赤い点で表現されているように、メッシュと点群間の対応点（ランドマーク）を探す
1. 図1.(a)(b)の赤い点から伸びている緑と青の線のように、局所座標軸を求める
1. 初期変形を求めるため、局所座標軸の対応関係から局所的な回転を算出し、対応関係を持たない点の回転は内挿で補完する
    - 回転の補完には、他の論文の手法を用いている
        - 参考：[Harmonic Guidance for Surface Deformation](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.226.1150&rep=rep1&type=pdf)
1. 求めた局所回転と対応点の位置制約から初期変形を行うと図1.(c)のようなスケールが考慮されていない結果となる
1. スケールを考慮するため、メッシュの対応点の変形前と変形後の距離比率の平均をスケール係数として用いて適用させると図1.(d)の結果となる
1. その後、変形したメッシュの各頂点の近傍に存在する点群を位置制約として、繰り返し処理を行うことでよりよい変形結果を得る
    - 図1. (e)(f)(g)はそれぞれ処理を1、2、4回適用した結果となる
1. 最後に、近傍点が見つからなかった点に対して、初期変形と最終変形の変形差をもとに補完した変形を伝播することでデータ欠損に対応する
    - 下図参照

    ![Screenshot from 2019-03-25 18-49-37.png](https://qiita-image-store.s3.amazonaws.com/0/356592/411727bf-3f13-923b-ddd8-6f187f58119c.png)
    図2. 変形伝播の効果を示すシリンダー変形

## 実装結果
<img src=https://qiita-image-store.s3.amazonaws.com/0/356592/451d74dc-ba0b-5534-882c-285c1f9aa1e8.png width=100%>

# まとめ
- ランドマーク探しは今回は手動で行ったが、メッシュに対して同じような姿勢の点群であれば自動検出もできる
- 局所座標軸は自動検出できている
- スケール変化、回転、形状変化している点群にメッシュをフィッティングできた
- 初期変形でおおよそのフィッティングができている
- 繰り返し処理は4回で最終変形結果を得ることができた

以下は、実務の経験上

- 得られる点群は異なるが、メッシュは同じ構造にしたい場合に非常に便利
    - 異なる点群から同じメッシュ構造を得ることはかなり大変！
    - メッシュ構造が同じであれば、メッシュ構造に密な処理をかけることができる

# 最後に
ヒトやモノをデータ化＆解析してみたい、という方。
３D技術と深層学習を組み合わせて、何か面白いサービスを作ってみたい！、という方。

弊社では一緒に働いてくれる仲間を大募集しています。

ご興味がある方は下記リンクから是非ご応募ください！
https://about.sapeet.com/recruit/

# 参考

- [Template Deformation for Point Cloud Fitting](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.230.953&rep=rep1&type=pdf)
- [Harmonic Guidance for Surface Deformation](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.226.1150&rep=rep1&type=pdf)
PycharmProfessionalでの便利なショートカットキーメモ

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。

今回はよく使うPycharmのショートカットキーとその動作についてまとめていきます。

#よく使うPycharmのショートカットキー
Pycharmには非常に便利な機能がショートカットキーを押すだけで簡単に使用可能です。


##ダブルShift
「どこでも検索」
Shiftキーをダブルクリックのようにタップすると、Project内部のどこでも検索することが可能です。
この機能で簡単にファイルやフォルダがサーチ可能になります、助かっております。
![Screenshot from 2019-03-26 15-09-49.png](https://qiita-image-store.s3.amazonaws.com/0/320820/60639fb1-98cb-1a8e-c84b-6bcdea4e8ad2.png)


##Ctrl+Shift+A
「アクション検索」
実行可能なアクションやオプション、設定などをサジェストしサーチしてくれます。
「こんな設定あるかな.....」とかサーチする際にとても便利なショートカットです。
![Screenshot from 2019-03-26 15-11-52.png](https://qiita-image-store.s3.amazonaws.com/0/320820/0b654d15-4f7c-833f-9e9c-2b5475208a36.png)

##「Alt+Enter」と「Ctrl+Space」
「インテンションアクションの表示」と「基本コード補完」
魔法のコマンド。
これを押すだけで一定以上のクオリティを持つコードが書けるようになります。


#まとめ
ショートカットキーでGUIの煩わしさから逃れられ、生産性の向上につながります。

CUIとの組み合わせで、更に自分の環境を最適化させていきます。
複数ファイルの改行コードをCRLF→LFに一括置換する

プロジェクト内でWinユーザーとmacユーザーが混在したことにより、改行コードがCRLFのファイルとLFのファイルが混在する形となってしまい、LFに統一する対応を行なった際のメモ。

※LF→CRLFの置換だと勝手が違うようなので、あくまでCRLF→LFの前提で書いていきます。

## 下準備：VSCodeで改行コードを可視化する
改行を可視化するプラグインをインストールします。
下記以外にも種類があるので、自分が使いやすいものを選びましょう。

[code-eol](https://marketplace.visualstudio.com/items?itemName=sohamkamani.code-eol)
　→様々な改行記号に対応しています。

[line-endings](https://marketplace.visualstudio.com/items?itemName=steditor.line-endings)
　→CR、LFという文字で改行が表されます。
　見た目がわかりやすかったので今回はこちらを使いました。

line-endingsで改行を可視化する際は、VSCodeの設定からsettings.jsonを開き、以下を追記します。

```settings.json
"editor.renderControlCharacters": true
```

これで改行が可視化されます。
![スクリーンショット 2019-03-26 12.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/314184/597d7edd-0c11-4fd5-2471-818099fc7c52.png)

## CRLFを含むファイルを検索
今回はCRLF→LFの置換を行うので、CRLFを含むファイルを検索します。

#### VSCode上で検索
検索タブを開き、入力バーの「正規表現を使用する」 （`.*` ←こんなボタン）をONにします。
この状態で、検索バーに `\n` や `\r\n` と入力して検索すると、該当する改行コードを含むファイルがヒットします。
（ファイルの数によっては膨大な検索結果がヒットしVSCodeに絞り込みを要求されますので、あまりお勧めではないかもしれません）

#### コマンドで検索
置換時にコマンドを流用できることを考えるとこちらがおすすめです。
cdコマンドで置換対象のファイルがあるディレクトリに移動し、以下のコマンドを実行します。

```
// 例) カレントディレクトリの全てのファイルから検索
$ find . -type f | xargs file | grep CRLF

// 例) phpファイルに限定して検索
$ find . -name '*.php' | xargs file | grep CRLF
```

findコマンドのオプションを変えることで検索条件を変えられます。

## CRLF→LFに置換する
検索コマンドの延長で、置換対象のファイルを引数として（`xargs`コマンドで渡して）改行コードを置換するコマンドを（先ほどと同じカレントディレクトリで）実行します。
以下は`nkf`コマンド、`dos2unix`コマンドを用いた方法です。

```
// nkfコマンドを使用
find . -type f | xargs file | grep CRLF | awk -F: '{print $1}' | xargs nkf -Lu --overwrite

// dos2unixを使用
find . -type f | xargs file | grep CRLF | awk -F: '{print $1}' | xargs dos2unix
```

実行後、ファイルの改行コードが置換されます。
![スクリーンショット 2019-03-26 14.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/314184/2a2ab0e3-b03a-72c9-6920-076c5dff4661.png)

改めてCRLFを含むファイルを検索して、何もヒットしなければOK。

## 参考
[CRLFが含まれているファイルを手っ取り早く探して置換](https://qiita.com/fieldville/items/b4aa39ea0b1e65103112)
[色々な改行コード変換の方法](https://qiita.com/dharry/items/b4eead2868dddf1499f0)
render partial  collection、値が入らない

この記事は配列に入った値を部分テンプレートのキーに繰り返し当てていくpartialのcollectionオプションに関してハマった記事が見つからなかったので無かったのでメモします。
（そもそもcollectionオプションの記事が少なかった）

### collectionを使用する経緯
そもそもですが、each文でも繰り返しrenderさせることはできますが、なぜcollectionかというところで、パフォーマンスがcollectionの方が良いとのことでcollectionを使い配列の情報を部分テンプレートに繰り返し表示させようと思い使用しました。

参考記事
https://qiita.com/itmammoth/items/612efc6ad3280349b7e1

### render partialのcollectionオプションの使いかたに関して事前知識
パーシャルはデータの繰り返し (コレクション) を出力する場合にもきわめて便利です。:collectionオプションを使用してパーシャルにコレクションを渡すと、コレクションのメンバごとにパーシャルがレンダリングされて挿入されます。

参考記事　3.4.5 コレクションをレンダリングする
https://railsguides.jp/layouts_and_rendering.html


### 問題点
値は部分テンプレートの #{item.name}に値が入っていかない。

```hoge.haml
.item-box
 = render partial: 'item-box', collection: @item
```
```_item-box.haml
.item-box_item-name
  #{item.name}
```
### 確認
_item-box.hamlにbinding.pryを行い、
item.nameで値が取り出せることは確認済み。
だが入らない、なぜ。

下記の記事を参考させていただき、変数の渡し方が少し変化球で動くようだと言うことがわかりました。
https://qiita.com/bambis13s/items/015f5bf921eb820ef652

***
＜引用＞
collectionで渡すと勝手にeachして、asで指定した変数に入れてくれます。
ちなみにcollectionは何も指定しないと、eachされた変数は参照先テンプレートの名前になります。
***
なるほど。つまりas: :キー、この場合で言うと部分テンプレート先に渡る際のキー名をas: :itemと変数定義することでいいのか、ということで下記に更新。

```hoge.haml
 = render partial: 'show-box', collection: @item, as: :item
```

### 結果
as:でキーの変数を定義することで部分テンプレートにparams内の値がきちんと入ってくれました。

### 追記
***
＜引用＞
どこを修正してもエラーがなおらない！！
同じ部分テンプレートを別の場所でもrenderしていないか？
そんな時は別の場所で同じ部分テンプレートをrenderしている可能性あり
***

以上、参考になれば幸いです。
ReactでFizzBuzz

こんにちは。
無性にFizzBuzzしたくなる時ってありますよね？（僕はあります）
今回は、Reactで良く見かけるカウントアップのサンプルを弄って作っていきます。

## 準備

- `create-react-app`でポチポチやっていきます。

```powershell
npm i create-react-app -g
create-react-app ts-react-fizzbuzz --typescript
```
## 実装

- 以下のファイルを書き換えます。

```typescript:src\App.tsx
import React, { Component } from 'react';
import './App.css';

interface IProps {}
interface IState {
  count: number;
  fizzBuzz: string;
}

class App extends Component<IProps, IState> {
  constructor(props: IProps) {
    super(props);
    this.state = {
      count: 1,
      fizzBuzz: this.toFizzBuzz(1)
    };
    this.countUp = this.countUp.bind(this);
    this.countDown = this.countDown.bind(this);
  }

  toFizzBuzz(value: number): string {
    if (value <= 0) {
      return '';
    }
    const fizzBuzz: string =
      `${value % 3 === 0 ? 'Fizz' : ''}${value % 5 === 0 ? 'Buzz' : ''}` ||
      value.toString();
    return fizzBuzz;
  }

  countUp() {
    const value = this.state.count + 1;
    this.setState({
      count: value,
      fizzBuzz: this.toFizzBuzz(value)
    });
  }

  countDown() {
    const value = this.state.count === 1 ? 1 : this.state.count - 1;
    this.setState({
      count: value,
      fizzBuzz: this.toFizzBuzz(value)
    });
  }

  render() {
    return (
      <div>
        <div className="count">{this.state.fizzBuzz}</div>
        <input type="button" value="+" onClick={this.countUp} />
        <input type="button" value="-" onClick={this.countDown} />
      </div>
    );
  }
}

export default App;
```

```css:src\App.css
#root {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
}

.count {
  margin-bottom: 10px;
  font-size: 200px;
}

input[type='button'] {
  margin: 10px;
  width: 50px;
  font-size: 50px;
}
```

## 実行

```powershell
npm run start
```

## 結果確認

![GIF](https://user-images.githubusercontent.com/36128512/54974609-f0eae680-4fd7-11e9-9330-5f031fa4e796.gif)

良いですね。

# ソースコード

https://github.com/orbit0801/ts-react-fizzbuzz
Ruby on Rails .erbテンプレートにてform_withのフォームに初期値をセットする

```ruby:main_controller.rb
@title = "default form value"
```

Controllerでは、↑こんな感じで、インスタンス変数をセットしてViewに渡す。


```erb:main.erb
<%= form_with scope: :post,:url => {:action => :update} do |form| %>
    <%= form.text_field :title, value: @title %>
    <%= form.button '送信', id: 'customButton', type: 'button', onclick: 'submit()' %>
<% end %>
```

Viewでは、↑こんな感じで、Controllerから受け取ったインスタンス変数を `value: @hoge` というふうにフォームにセットする。
vs codeでExplorer（ファイルツリー）の階層構造を見やすくする

## 前書き
vs codeでそこそこな規模の開発をしているとフォルダの階層が深くなっていくわけですが、vs codeのファイルツリーは階層毎のインデントが浅く、見づらいなーと常々思っていました。

いい加減なんとかしないといけないと思い拡張機能で解決できないか考えていたところ、今年の1月(v1.31)にツリーのインデントを調整する機能がすでに実装されていました。

## 設定方法
Preferences > Settings > 検索項目に「Tree Indent」と入力
Workbench > Tree: Indent 項目に任意の数値を入力する（default: 8, range: 0~40）

![参考](https://user-images.githubusercontent.com/142875/51373515-9e63ea00-1abd-11e9-8dbd-cd282131b156.gif)

知らなかった方はお試しあれ。

## 参考
[User configurable indent in file explorer - github](https://github.com/Microsoft/vscode/issues/35447)
Record of the study(Ruby1)

初めまして:bow_tone1:節原と申します。
自分自身にスキルを身に付けるべく、プログラミングの学習を始めた33歳九州男児です。

Qiita投稿は始めてですが、自分自身のアウトプットの場として、また皆様からアドバスやご指導の場としていきたいと考えております。宜しくお願い致します。

まずは、購入した、『[たのしいRuby 第6版](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-Informatics-IDEA-%E9%AB%98%E6%A9%8B/dp/4797399848)』『[現場で使える　Ruby on Rails5 速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)』を参考に学習した内容をアウトプットしていきたいと思います。認識の間違えなどございましたら、ご指摘、ご指導のほど、宜しくお願い致します:bow_tone1:



#Rubyについて
* Rubyは
    * オブジェクト指向言語であり
    * スクリプト言語であり
    * マルチプラネットフォームな言語であり
    * オープンソースソフトウェア

##オブジェクト指向言語とは
**ー『オブジェクト』の概念を理解するにはー**
 ***オブジェクト=『物』という捉え方をする***

- 現実世界でのオブジェクト『物』
人、動物、花、車、水、空気、時間など言葉により区別できるものは**全てオブジェクト『物』**として捉えることができる

- rubyの世界でのオブジェクト『物』
文字列、数値、配列、ハッシュなど**全てのデータをオブジェクト『物』**として見なす。

つまりオブジェクト指向言語(rubyなど)は
**オブジェクト『物』を作成したり、使用することで、コンピューターに処理を行わせる言語**である

##スクリプト言語とは
**軽量プログラミング言語**とも呼ばれ、少ないコード量で手軽にプログラムを記述、実行ができる言語。比較される言語に**コンパイラ言語（ソースコードを機械命令に翻訳する「コンパイル」作業が必要となる言語）**がある。


##マルチプラネットフォームな言語とは
Windows・macOS・FreeBSD・Linuxなどのような様々なプラットフォーム上でも、同じコード、処理を実行（動かすこと）が出来るプログラム言語[[ウィキペディア（Wikipedia）参考](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)]

##オープンソースソフトウェアとは
ソースコードの変更や使用が自由に認められている無償のソフトウェアのこと

***

今回はここまで。次回からは本格的にRubyのアウトプットを実施していきます:bow_tone1:
認識違い、間違いなどありましたら、ご指摘頂けますと幸いでございます。宜しくお願い申し上げます:bow_tone1:
Xcode10.2アップデート後にreact-nativeで「Could not find iPhone X simulator」がでて立ち上がらない人向けの記事

取り急ぎ、さきほど発生したので記載

# Could not find iPhone X simulator
シミュレータで起動したら上記のエラーが表示

```
react-native run-ios
```

以下のエラーが表示

![スクリーンショット 2019-03-26 14.22.47.png](https://qiita-image-store.s3.amazonaws.com/0/170824/4197f709-d21c-9c7c-bb83-68300c9f5fa2.png)


# 解決方法
既にstackoverflowにあがっていたのと同じ手順でシミュレータが起動するようになった

https://stackoverflow.com/questions/55337909/iphone-x-real-device-ios12-2-the-status-bar-seems-to-be-squeezed-and-does-no


1. 「open ./node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js」
2. 以下を書き換え

```:before
    // Making sure the version of the simulator is an iOS or tvOS (Removes Apple Watch, etc)
    if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {
      continue;
    }
```

```:after
    // Making sure the version of the simulator is an iOS or tvOS (Removes Apple Watch, etc)
   /*
    if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {
      continue;
    }*/
    if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS')) {
      continue;
    }

```
3. react-native run-ios → シミュレータ起動

# おわり
react-native使っている人は一旦Xcodeは10.1のままにしておいたほうが良さそう
devise 画面遷移ヘルパーメソッド３種

deviseにはサインアップ、ログイン、ログアウト後の画面遷移やアクション等を
入れることができるヘルパーメソッドがあります。
下記はroot_pathを仮の遷移先にしていますが、それぞれ任意の遷移先にしていただいて大丈夫です。


新規登録後のafter_sign_up_path_for(resource)ですが、
これだけ何故かアクションが呼ばれているコントローラー内に配置しないと動かないらしいです。 
## 新規登録後
```registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  def after_sign_up_path_for(resource)
    root_path
  end
end
```
下記２つはapplication_controller.rbに配置しています。
（もちろんsessions_controller.rb下でもOKです）
## ログイン後
```application_controller.rb
  def after_sign_in_path_for(resource)
    root_path
  end
```
## ログアウト後
```application_controller.rb
  def after_sign_out_path_for(resource)
    root_path
  end
```

以上、お役に立てればと思いメモ。
Dynamics365 CE jQueryによるDOM操作

どうしても画面のデザインを変更したいということはあると思います。
Dynamics365CEのWEBリソースを使ってDOM操作をする方法です。
*Dynamics 365, version 9.0*

#####1.やりたいこと
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/364023/af6fb97f-2b51-73f1-c99e-fb8e0a80898e.png)
取引先企業の取引先企業名タイトルを赤くしたい。

#####2.WEBリソースの準備
![2-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/364023/d6c4fa53-286f-6512-0d12-af4de1006975.png)
webリソースを新規追加する。ファイルの拡張子は.jsにすること。
テキストエディタボタンを押下し、下記のソースとする。

```
function init(){
    console.log($('#name_cl', window.parent.document).text());
    $('#name_cl', window.parent.document).css('cssText', 'color: #f00!important');
}
```
jQueryのセレクタには、window.parent.documentを指定する。
あとは画面のマークアップを参考に適当に。importantも必要に応じて指定する。

#####3.フォームライブラリの設定
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/364023/9e046320-0e32-dcd5-6252-1aef78cc5be6.png)
jQueryの読み込みのないフォームはjQueryを追加する。Dynamics365内のライブラリでもいいし、自分で追加してもいい。
2の項目で自作したjsファイルを追加する。

![3-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/364023/8dfcd96b-7c39-218e-1af5-4541e4d4de7f.png)
フォームのonloadイベントに自作したjsファイルの実行を追加する。

#####4.結果
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/364023/1f7225f1-6cd1-1f58-5441-c6ee32c8f11c.png)
赤くなった。


jQueryのセレクタはマークアップの影響をもろに受けるので、この方法の採用は慎重に。


*参考*
https://docs.microsoft.com/ja-jp/dynamics365/customer-engagement/developer/use-javascript#use-of-jquery
光の速さで静的ファイルしかおけないローカルサーバを立てる

光の速さは盛りすぎだけど
まぁまぁ簡単

# 用途
適当なjsonを用意してcurlしたいとかjs試してみたいとか

# 環境
例によってローカルにインストールするのが嫌いなのでdocker使います
そして[http-server](https://www.npmjs.com/package/http-server)を使います

# 手順
## 1.ファイル用意する
適当なディレクトリの中に
- `Dockerfile`
- `docker-compose.yml`
- `public/index.html`(public以下がドキュメントルートになるので)
を用意する

### Dockerfile
```dockerfile:Dockerfile
FROM node:8.11.3-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm http-server

```

### docker-compose.yml
```yml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    ports:
      - 9999:9999
    volumes:
      - .:/app
    stdin_open: true
    tty: true
    command: /bin/sh -c "http-server -a 0.0.0.0 -p 9999 --cors"
```

### public/index.html
```html:public/index.html
<html>ok baby</html>
```

## 3. 立ち上げる
```shell-session
$ docker-compose build
$ docker-compose up
```

## 4. ブラウザ開く
http://localhost:9999

## 5. おしまい
Handsontableで大きいテーブルを表示したときに描画が崩れる

Handsontableで大きいテーブルを画面いっぱいに表示してスクロールすると、下端から上に戻るときに描画が遅れて白い帯が表示されてしまった。
`viewportRowRenderingOffsetNumber`を適当に設定することで、正しく描画されるようになった。
NetCore でSJISエンコードを扱う



.Net Coreで、GetEncoding("Shift_JIS")とするとエラーになる。


```csharp
var sjisEnc = Encoding.GetEncoding("Shift_JIS");
```



エンコードリストにShift_JISが無いことに起因する。

Shift_JISが使えるように以下をNugetからインストールする。
[NuGet Gallery | System.Text.Encoding.CodePages 4.5.1](https://www.nuget.org/packages/System.Text.Encoding.CodePages/)


sJISを使う前に、`Encoding.RegisterProvider()`をコールする事でSJISが使えるようになる。

```csharp

using System.Text;


Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var sjisEnc = Encoding.GetEncoding("Shift_JIS");
```





## おまけ

### サポートしているすべてのエンコーディングを取得する

```csharp
//サポートしているすべてのエンコーディングを取得する
var eis = System.Text.Encoding.GetEncodings();
foreach (System.Text.EncodingInfo ei in eis)
{
    Console.WriteLine("{0}\t{1}\t{2}", ei.DisplayName, ei.CodePage, ei.Name);
}
```

### 結果

```shell
Unicode 1200    utf-16
Unicode (Big-Endian)    1201    utf-16BE
Unicode (UTF-32)        12000   utf-32
Unicode (UTF-32 Big-Endian)     12001   utf-32BE
US-ASCII        20127   us-ascii
Western European (ISO)  28591   iso-8859-1
Unicode (UTF-7) 65000   utf-7
Unicode (UTF-8) 65001   utf-8
```
Prettier で改行される列数を伸ばす


以下のようにちょっと長いと折り返されてしまうのを1行にしたい

```
export const FETCH_XXXXXXX_XXXXXXX_XXXXXXX_SUCCESS
="FETCH_XXXXXXX_XXXXXXX_XXXXXXX_SUCCESS";
```


.prettierrc ファイルを作成

```js:.prettierrc
{
  "printWidth": 120
}
```


結果、改行されなくなりました。

```
export const FETCH_XXXXXXX_XXXXXXX_XXXXXXX_SUCCESS = "FETCH_XXXXXXX_XXXXXXX_XXXXXXX_SUCCESS";
```



## 参考 Prettier オプション
[Configuration File · Prettier](https://prettier.io/docs/en/configuration.html)
Angularで使うFirebaseの認証系API一覧

AngularでFirebaseのAuthを使う機会があったので自分用にメモを
フォルダ構成などは割愛し、メソッドの整理だけ。

インポート→
`import * as firebase from 'firebase';`

### Firebase JavaScript SDKを初期化

```xxx.ts
var config = {
  apiKey: "<API_KEY>",
  authDomain: "<PROJECT_ID>.firebaseapp.com",
  databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
  storageBucket: "<BUCKET>.appspot.com",
  messagingSenderId: "<SENDER_ID>",
};
firebase.initializeApp(config);
```
configの内容はFirebaseコンソールの右上にある<Web>に記載されてます

### createUserWithEmailAndPassword
メールアドレスとパスワードでアカウントを作成するときに使用する
→ `firebase.auth().createUserWithEmailAndPassword(email, password)`

### signInWithEmailAndPassword
メールアドレスとパスワードを使用してユーザーのログインの時に使用する
→ `firebase.auth().signInWithEmailAndPassword(email, password)`

### signOut
ユーザーのログアウトを行う
→ `firebase.auth().signOut()`

### sendSignInLinkToEmail
ユーザーのメールアドレスに認証リンクを送信

```sample.ts
firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings)
  .then(function() {
    window.localStorage.setItem('emailForSignIn', email);
  })
```

### Google等でログイン
> ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報（ユーザー名とパスワード、電話番号、または認証プロバイダ情報）にアカウントがリンクされる

### GoogleAuthProvider
Google プロバイダ オブジェクトのインスタンスを作成
→ `var provider = new firebase.auth.GoogleAuthProvider();`
ほかのプロバイダは下記の通り

```
var provider = new firebase.auth.FacebookAuthProvider();
var provider = new firebase.auth.TwitterAuthProvider();
var provider = new firebase.auth.GithubAuthProvider();
```

### signInWithPopup(provider)
ポップアップ ウィンドウでログインを行う
→ `firebase.auth().signInWithPopup(provider)`

### signInWithRedirect(provider)
ログインページにリダイレクトしてログインを行う
→ `firebase.auth().signInWithRedirect(provider);`

### currentUser.getIdToken
IDトークン（JWT）を取得する
→　`firebase.auth().currentUser.getIdToken()`
スマホとオムロン非接触MEMSセンサでサーモグラフィっぽいもの作ってみた

## 背景
別のエントリで書いた通り「[obnizとオムロンの非接触MEMSセンサで温度を測る](https://qiita.com/yskmjp/items/db839dfc4002a6c28728)」ことができました。obnizはディスプレイ付きなので単体で確認できるのはいいのですが、数字の羅列は少し味気ないです。

できればサーモグラフィのように色で温度を表現できると直感的に分かるので、それに近いものを作ってみようと思います。

![Infrared_dog.jpg](https://qiita-image-store.s3.amazonaws.com/0/149785/75c80bd2-85ff-cfda-0ab2-d46e6e374db3.jpeg)
出展: http://coolcosmos.ipac.caltech.edu/image_galleries/ir_zoo/dog.html

## やること
今回は4x4の温度を色のボックスで表現し、それにスマホのカメラ映像を重ね合わせることで、以下のようにサーモグラフィ風に表示したいと思います。
左側にあるグラスは冷たいので青や緑に、右側の鉄鍋は熱いので赤や黄色で表現されているのが分かります。

![ondo.png](https://qiita-image-store.s3.amazonaws.com/0/149785/9d242909-ff65-d942-5e4c-86f7d3962c81.png)

## ハードウェア構成
obnizとセンサの接続は前回の構成と同じですので「[obnizでオムロンの非接触温度センサを使ってみた](https://qiita.com/yskmjp/items/db839dfc4002a6c28728)」を参考にしてください。

## 実行手順
1. [GitHUB上にアップ](https://github.com/yskmjp/obniz-omron-d6t-44l-06-graphical)しているコードをobnizクラウドにアップしてOBNIZ-IDを適宜修正。
2. スマホカメラ近くに同じ方向を向けてオムロンセンサを貼り付ける。
3. スマホのブラウザからobnizクラウドにアクセスし「新しいタブで開く(https)」を選択。
4. 新しいタブで温度と映像がオーバーレイした映像を見ることができます。

ビールとピザで実験した動画を[Youtubeにもアップ](https://www.youtube.com/watch?v=i-AlArGBBQQ)してあるのでこちらも参照ください。

注意点としてはブラウザからカメラ映像を取るあたりの実装が環境依存する可能性が高いです。私は「iPhoneXS + iOS12 + Safari」で動作を確認しています。

## 今後について
色々と調べていると「[サーボでセンサの角度を変えて強制的に解像度を上げる](http://takesan.hatenablog.com/entry/2015/11/05/195839)」、「[ラグランジュ曲線で補間して解像度を上げる](http://takesan.hatenablog.com/entry/2016/04/20/232718)」などをしている方がいて奥が深そうです。
またサーモグラフィ風の色合いについても「[サーモグラフィ風の色変化をシグモイド関数で再現する](https://qiita.com/masato_ka/items/c178a53c51364703d70b)」という記事があったり改善する方法は色々とありそうなので引き続き遊んでみたいと思います。
npm の導入から Vue-cli 環境構築

# Vue-Cli の環境構築
チャット系のアプリケーションを作りたいなと思い、Vue.js + element でフロント側を作りたいとなったので、npmの導入からVue.jsとVue-cliの導入を書きます。
いつも、npmの導入で手こずるので一回それもまとめときたいなと思い記事にしました。

## 前提
mac OS high Sierra
brew 導入済み

## 導入

`nodebrew`の設定

```bash:shell
brew install nodebrew # nodebrew のインストール

nodebrew -v # nodebrew のバージョン確認

mkdir -p .nodebrew/src/ # nodebrew install でエラーになるためあらかじめ ~/.nodebrew/src を作っておく

nodebrew install-binary latest # 最新のバイナリをインストール

nodebrew list # nodebrewの一覧を表示

nodebrew use v11.12.0 # 使用するバージョンを選択 (nodebrew listで見たときに表示されるバージョンを選択)

echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile # インストールしたバイナリにパスを通す

```

`vi ~/.bashrc`で設定ファイルを開く

```bash:shell

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

を追記

`exec $SHELL -l`でターミナルを再起動

`Vue-cli`の導入

```
npm install -g vue-cli

vue init webpack test
```
でプロジェクトの作成がうまくいきました。




## まとめ
基本的にnode/npmの手順にすごく手間取る感じでした。

`npm -v`で

```
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.60.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found
Abort trap: 6
```

というエラーがでてて悩んでましたけど`brew reinstall node`で解決しました。
TortoiseGitで元プロジェクトでの変更を派生プロジェクトに取り込む方法

あるプロジェクト（以下、プロジェクトA）をもとに作成したプロジェクト（以下、プロジェクトB）にTortoiseGitを用いて反映させる（マージする）方法の覚書きです。
・プロジェクトAへの対象ファイルへのマージが複数回ある
・プロジェクトBに独自の仕様があり、差分を丸々反映させられない
場合に実施する方法です。

## 前提条件
・TortoiseGitがインストールされていること
・比較マージツール（WinMerge）がインストールされていること

## 手順
1. プロジェクトAをクローンしたフォルダ上で右クリック > TortoiseGit > ログを表示
2. 比較したいバージョン2つ（変更前後）を選択し、右クリック > リビジョンの比較 > 対象ファイルを押下
3. 比較マージツール（WinMerge）が起動し、差分が表示されるので、テキストエディタでプロジェクトBを開き、反映させる

## 補足事項
手順1で表示されるログが多い場合は、From, Toで期間を絞るか、条件欄に入力・検索する
deviseでログイン状態が維持できない際の対応

## エラーの経緯
deviseのsign_up,sign_in時の画面遷移や条件を持たせる目的でdeviseのコントローラーをインストールしました。

しかし新規登録（sign_up）後に本来であればサインイン(ログイン)状態が維持されますが、最近動作が不安定です。
## sign_inメソッドとは 
sign_inメソッドはdeviseが提供する機能です。
sign_inメソッドはサインイン(ログイン)状態にします。

```ruby:registrations_controller
def create
  if user.save?
     sign_in(user)
     redirect_to root_path
  end
end
```
そもそもですが、下記のafter_sign_up_path_forのメソッドもdeviseのメルパーメソッドになり、サインアップ後のアクション等を持たせることができます。
下記はサインアップ後のTOPページに遷移の設定としておりま下が、
ページ遷移をしなかったため、上記のcreateアクションを作り原因究明を行った経緯です。

```ruby:registrations_controller
  def after_sign_up_path_for(resource)
    root_path
  end
```
## デバック
- bingding.pryを行いながらafter_sign_up_path、createアクションが動いているか確かめましたが、いずれもメソッドは呼び出されている。
- createメソッドはif user.save?の下にbinding.pryを配置
  => やはりきちんと当たっている。
- ではDBへの書き込みは？
  => きちんと新しいユーザーが書き込まれている。
- sign_upメソッドが怪しい。そもそもログインされているのか。
- ログアウトボタンを急遽簡易で作成しアクションを動かしてみる。
  => ログアウトされない。
- ログインしてるかログイン状態でないかわからない。
- before_action :authenticate_user!をコントローラーに追記。
  => ログアウトページに入れない。

#### ということはやはりログイン状態を維持していない。

ということで色々と試している中でターミナルが急に今まで出してこなかったエラーメッセージを吐き出しました。（こんなメッセージ的なエラーも出すんですね）

```
DEPRECATION WARNING: [Devise] bypass option is deprecated and it will be removed in future version of Devise.
Please use bypass_sign_in method instead.
```
非推奨警告：[Devise]のバイパスオプションは廃止予定であり、将来のバージョンのDeviseでは削除される予定です。
代わりにbypass_sign_inメソッドを使用してください。

つまりこれで言うバイパスオプションとはsign_inメソッドのことだな。
bypassを付ければ解決されるのか？
頼む、ログイン維持してくれ！

## 結果

ターミナルの通りbypass_sign_inへ更新することで
ログイン状態は無事維持されました。

```ruby:registrations_controller
def create
  if user.save?
    bypass_sign_in(user)
    redirect_to root_path
  end
end
```

## 参考にしたサイト
結構前のアップグレードだったんですね。
逆になぜ今まで使えてたんだろう。。。

https://dev.classmethod.jp/server-side/ruby-on-rails-5-0-upgrade/
リザーブドインスタンスを買うのと夜間休日停止するのどちらが安いか調べてみた

# はじめに
リザーブドインスタンス（以下、RI）の購入は、AWSのコスト削減を考えた際に必ずといっていいほど選択肢の一つに入ると思います。
しかし、RIはインスタンスを停止していてもインスタンスに必要となる料金が変わらないため、24時間365日稼働するシステムではいざ知らず、開発環境のように稼働時間が限定されている環境下では使わない時は停止する運用をする方が安上がりになるのでは？？と思い至り、AWSで代表的なサービスであるEC2、RDSについてそれぞれの料金を調べました。


#RI購入時の考慮ポイント

まず始めにRIを購入する際の考慮ポイントを抑えておきます。
以下にあげるポイントは主にコスト削減効果とRI柔軟性に関連しています。

- 考慮ポイント
 - RI適用期間（１年 or ３年）
 - AZの指定有無（キャパシティを予約可能）
 - 支払い方法（前払いなし、一部前払い、全前払い）
 - RIタイプ（スタンダード or コンパーチブル）


EC2にはRIタイプにスタンダード、コンパーチブルがありますが、これらについては変更可能な範囲に以下の違いがあります。
以下の条件を見てもらうと予想できると思いますが、スタンダードRIの方が割引率は高いです。
（一例としてt3.largeを全額前払いした際、スタンダード34%、コンバーチブルは24%の割引率）

- スタンダードRI
 - RIの一部の属性の変更は可能
 - スコープ(Region/AZ)
 - AZ
 - インスタンスサイズ


- コンバーチブルRI
 - 新しい属性の別のRIへの交換も可能
 - プラットフォーム（OS等）
 - インスタンスファミリー/サイズ
 - テナンシー（専有 or デフォルト）
 - 支払いオプション


コンバーチブルRIでは変更時の差額を支払うことで購入した条件からある程度変更可能となりますが、想定されるケースとして今の構成よりもリソースを増強したいケースが設定されているようです。言い換えると今よりコストを下げる方向への変更はできず、高くなる方向にしか変更はできません。
ex.)m5.large * 1 → t3.large * 1やt2.large * 1 → t3.large * 1などの変更は不可能。




# 夜間休日に停止した場合とRIを購入した場合の比較

本題のコスト比較に入ります。
リージョン、DBエディション等、環境により微妙な差異はあるかと思いますが、
概ね以下のようなコスト差になるかと思います。


### EC2編
https://aws.amazon.com/jp/ec2/pricing/reserved-instances/pricing/
インスタンスタイプ：t3.small
リージョン：アイルランド

|ケース |年間コスト($) | 計算式 | 備考|
|:-----------------|:------------------|:------------------|:------------------|
|オンデマンドで夜間土日停止して運用する場合 |95.21 |0.0228 * 261 * 16 | 1時間のインスタンス料金：0.0228<br>稼働日：261（365日 * 5日 / 7日）<br>1日の稼働時間：16（8:00 - 24:00）|
|オンデマンドで夜間土日祝停止して運用する場合 |85.36 |0.0228 * 261 * 16 | 1時間のインスタンス料金：0.0228<br>稼働日：234（365日 - 121日）<br>1日の稼働時間：16（8:00 - 24:00）|
|スタンダードRIを購入（前払いなし）       |141.96   |11.83 * 12 |月額料金：11.83 |
|スタンダードRIを購入（一部前払い）       |135.44   |67.44 + (11.83 * 12) |前払い料金：67.44<br>月額料金：11.83|
|スタンダードRIを購入（全額前払い）       |133.00   |- |前払い料金：133.00|
|コンバーチブルRIを購入（前払いなし       |198.00 |16.50 * 12 |月額料金：11.83|
|コンバーチブルRIを購入（一部前払い）      |188.56 |94.00 + (7.88 * 12) |前払い料金：94.00<br>月額料金：7.88 |
|コンバーチブルRIを購入（全額前払い）      |185.00 |- |前払い料金：133.00|


### RDS編
https://aws.amazon.com/jp/rds/aurora/pricing/

インスタンスタイプ：r4.large
DBエディション：PostgreSQL
リージョン：アイルランド

|ケース |年間コスト($) | 計算式 | 備考|
|:-----------------|:------------------|:------------------|:------------------|
|オンデマンドで夜間土日停止して運用する場合    |1503.36 |0.32 * 261 * 18 | 1時間のインスタンス料金：0.32<br>稼働日：261（365日 * 5日 / 7日）<br> 1日の稼働時間：16（7:00 - 25:00）|
|オンデマンドで夜間土日祝日停止して運用する場合 |1347.84 |0.32 * 234 * 18 | 1時間のインスタンス料金：0.32<br>稼働日：234（365日 - 121日）<br> 1日の稼働時間：18（7:00 - 25:00）|
|スタンダードRIを購入（前払いなし）          |1839.60  |153.30 * 12 |月額料金：153.30 |
|スタンダードRIを購入（一部前払い）          |1576.00   |700.00 + (73.00 * 12) |前払い料金：700.00<br>月額料金：73.00|
|スタンダードRIを購入（全額前払い）          |1544.00   |- |前払い料金：1544.00|
※今回の例では、DBはアプリケーションの停止起動の前後1時間ずつ余裕を持たせているため、1日の稼働時間が長くなっています。


# まとめ
上記のようにRIを購入するよりも夜間、土日（祝）は停止する方がコストを抑える効果があることがわかります。
当該環境ではEC2、RDSは夜間と土日に停止しており、EC2はElasticBeanstalkで稼働しているためスケジュールスケーリングで、RDSはLambdaのイベント発火で任意の時間に停止起動するスクリプトで起動停止を制御しています。
RIは購入しさえすれば割引が適用されるメリットがありますが、インスタンスタイプのロックインや構成変更の柔軟性を損なう等、少なからずデメリットもあるのでよく考えて購入を検討したいです。
display block inline inline-blockについて

この記事は、CSSのblock inline inline-blockについて自分用メモ用に簡単にまとめたものです。
なお、投稿主は１ヶ月ほど学習した程度の者ですので、間違いがあった際にはご指摘してくださると助かります。

#displayって何？block inline inline-blockって何？
block inline inline-blockは、displayのプロパティ値です。
displayとは、webページの表示形式を指定するプロパティです。
HTMLで指定する要素（pタグ、aタグ等）には元から表示形式が指定されているのですが、CSSを使う事でその形式を変更する事ができます。
例えば、pタグの表示形式を変更したい場合は、CSSで以下のように書きます。

```css

p {
  display: inline;
}
```
##display: blockの特徴

ここからそれぞれのプロパティ値の特徴について説明します。
blockの特徴は以下の通りです。

+ 縦に積まれていく
+ 領域はwidthに依存する
+ width heightの指定が可能
+ 上下左右にmargin paddingの指定が可能
+ text-align vertical-alignは指定不可(text-alignは中身の要素に反映されます）

blockを中央寄せにしたい場合は、margin-right:auto margin-left:autoとした方がいいようです。

次に具体例を挙げます。
以下のHTML CSSを使った場合、表示結果１のようにになります。

```html:sample.html
<h1>h1タグは縦に積まれる</h1>
<h1>領域はwidthに依存する。尚、width heightの指定は可能</h1>
<h1>margin paddingの指定が可能</h1>
```       
```css:sample.css
h1 {
    width: 500px;
    height: 30px;
    padding: 20px 5px;
    margin: 40px;
    font-size: 20px;
    background-color: red;
}
```
表示結果１：
![block.png](https://qiita-image-store.s3.amazonaws.com/0/355738/46b76cef-cadc-70ab-f0ae-99be10abf30c.png)
##display: inlineの特徴
inlineはよくblockの中身に使われます。
aタグやspanタグがこの要素に該当します。
特徴は以下の通りです。

+ 横に並ぶ
+ 領域は文字の高さや幅に依存する
+ width heightの指定はできない
+ 左右にだけmarginの指定が可能
+ paddingは上下左右に指定できるが、上下のpaddingは他の要素に影響を与えない
+ ブロックレベル要素の中身となる事がある（ブロックレベル要素がインライン要素の中身となるように書く事も可能ですが文法的には間違っています）
+ text-alignは親要素で指定する事で使用可能

インライン要素のpaddingについての詳細は<a href="http://markup.webcrew.co.jp/art_20141023.html">こちら</a>の記事がとても参考になります。

インライン要素を用いた具体例を挙げます。
以下のHTML、CSSの場合、表示結果２のようになります。

```html:sample2.html
<ul>
    <li><a href="#">inlineの上下のpaddingは他の要素に影響を与えない</a>
    </li>
    <li><a href="#">領域は文字の高さ、幅に依存</a></li>
</ul>
    <h1><a href="#">blockの中身になれる</a><span>inlineは横に並ぶ</span></h1>
```       
```css:sample2.css
a {
    width: 500px;
    height: 30px;
    padding: 20px 5px;
    margin: 40px;
    background-color: yellow;
}
span {
    background-color: white;
}
```
表示結果２：
![inline.png](https://qiita-image-store.s3.amazonaws.com/0/355738/651b354d-a7d0-082d-e8b4-16f2ff61769c.png)
##display:inline-blockの特徴
最後にinline-blockの特徴について説明します。
inline-blockはblockのように高さ幅の指定ができ、inlineのように横に並べる事ができます。
具体的な特徴は以下の通りです。

+ 横に並ぶ
+ width heightの指定が可能
+ 上下左右にmarin paddingの指定が可能
+ text-align vertical-alignは使用可能

display: inline-blockの具体例を挙げます。
以下のHTML CSSを用いた結果は表示結果３のようになります。

```html:sample3.html
<p>inline-blockは横に並ぶ</p>
<p>width heightの指定が可能</p>
```
```css:sample3.css
p {
    display: inline-block;    
    width: 300px;
    height: 100px;
    padding: 10px 5px;
    margin: 30px;
    text-align: center;
    background-color: blue;
}
```
表示結果３：
![inlineBlock.png](https://qiita-image-store.s3.amazonaws.com/0/355738/37edfc85-481e-7779-3477-41de6123eb28.png)
GitBook使ってみた

<img width="1392" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/8d2f010b-4fdb-786b-6252-c0a5b646c603.png">

## はじめに
皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
弊社ではドキュメント管理に[kibela](https://kibe.la/ja)を利用しているのですが、先日社内で議論していたときにGitBook使ってみるのはどうか？という意見が出て使ってみました。(ローカルで動かすぶんにはタダですからね！)

ポイントとしては以下の3点を重要視しました

- 環境構築が簡単
- 気軽にドキュメントがかける
- 記事の検索が容易

`npm`などは導入されてる前提です。

## 環境構築
ローカルで動かす、`gitbook-cli`をインストール

```shell
$ npm install -g gitbook-cli
```

gitbook環境構築

```shell
$ mkdir gitbook
$ cd gitbook 
$ gitbook init
Installing GitBook 3.2.3
...(中略)
info: create README.md 
info: create SUMMARY.md 
info: initialization is finished 
```

という感じで、macにnpmが入っていたら上記のように一瞬で環境構築できてしまいます
簡単ですね

## ノートを作る
### pluginを入れる
pluginを入れることで、フローチャートなども書けるように拡張できるみたいなので、導入してみます

```bash
$ vi book.json
```

```json
{
    "plugins": ["new-flowchart"],
    "pluginsConfig": {
    }
}
```

pluginをインストールする

```shell
$ gitbook install
```

これで、フローチャートが使えるようになりました

### 目次を作る
`SUMMARY.md`をいじり、目次を作る

```md
# Summary

* [Introduction](README.md)
* [Chart1](docs/chart1.md)
```

### ノートを書く
```shell
$ vi README.md
```

```md
# Introduction
## gitbook試してみる

- hogehoge
- fugafuga


## エディタはsublで書いてる
```

## フローチャートを書いてみる
```shell
$ mkdir docs
$ vi docs/chart1.md
```
```md
フローチャート
Qiita上での表示がバグるので「\」でエスケープしてます
\``` flow
st=>start: Start|past:>http://www.google.com[blank]
e=>end: End:>http://www.google.com
op1=>operation: My Operation|past
op2=>operation: Stuff|current
sub1=>subroutine: My Subroutine|invalid
cond=>condition: Yes
or No?|approved:>http://www.google.com
c2=>condition: Good idea|rejected
io=>inputoutput: catch something...|request

st->op1(right)->cond
cond(yes, right)->c2
cond(no)->sub1(left)->op1
c2(yes)->io->e
c2(no)->op2->e
\```
```

## 画面確認
ローカルホストで開始する

```shell
 $ gitbook --port 8080 serve
```

普通のドキュメント
<img width="1091" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a549d643-85ff-0fc1-b52e-c1f5c547fce4.png">

フローチャート
<img width="1433" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/75970a2f-d05c-2d32-06d1-2f86bc0ab2a4.png">


検索
<img width="1412" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/eb9fbca8-be33-f869-8123-97baacc64868.png">

## さいごに
いじってみた感想としては以下のような感じでした

- 環境構築は簡単
- mdのかきやすさはエディタ次第(どうやらgitbook専用のエディタ的なものもあるみたいだ)
- フローチャート以外にもUMLなどのプラグインがあるので拡張はしやすそう
- 目次を自分で作ったりしないといけないのがめんどくさい
- 画像などの外部ファイルの取り扱いがめんどくさい

結論として、弊社の規模感でもgitbookをAWS上に構築して使うのはちょっと役不足に感じた

https://www.gitbook.com/ などのホスティングサービスを利用すれば有用だと感じたが、お金かかるならkibelaでいいしな〜といった感じです

個人用のドキュメント管理などには良いかなーと思いました

gitbookの導入を検討している方の参考になれば幸いです

### Wantedlyでもブログ投稿してます

Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers
衛星画像利用サービスまとめ

# 衛星画像利用サービス

## 比較表

|名称|費用|商用利用|
|---|---|---|
|Tellus|2021年の3⽉まで無償というのは決定。それ以降は有償の予定|可能。有償|
|Copernicus|全世界に向けてオープンフリー。2030年までの運用が決定している|可能。無償|
|G-Portal|無償|無償。商用利用可能だが、データの出所表示に必要あり。データの種類（高次付加価値データ・製品）によっては制限がある場合もある|
|Google Earth Engine|研究・個人利用に限り無償|有償の商用ライセンスあり|

## Tellus（てるーす）

https://www.tellusxdp.com/

### 概要

⽇本最⼤規模のデータプラットフォーム。
経済産業省主導で、政府衛星データのオープン化を⾏い、関連事業の展開と衛星データの受託者を増やすことが⽬的である。

### 費用

2021年の3⽉まで無償というのは決定している。

### 商用利用

⾼性能なデータ、コンピューティング環境を提供する。商業利⽤が可能。(同様に衛星データを閲覧できるものとして、Google Earth Engineがあるが、こちらは商⽤利⽤不可)
SAR衛星データ、⾼解像度な光学情報を利⽤できる。

商業利用してほしい、という目的で公開している。

### 利⽤⽤途

- 建設情報への提供
- 農業保険
    - 地上のデータと衛星データを融合して、災害の発⽣確率を予測
    - 収穫時期の予測、たんぱく質の含有率、肥沃度、どこに植えていけばよいか
- 災害情報提供
- マーケティング
    - ⾞の数計測
- 都市計画⽀援

### 参考記事

https://sorabatake.jp/?s=Tellus
https://qiita.com/ryo_naka/items/492b9b6b3d4792a3e150
https://qiita.com/seitoo2/items/1f663f6c81ea4c777ab0

## Copernicus

https://www.copernicus.eu/en

### 概要

欧州連合(EU)が行っている地球観測プログラムの名称です。

> 天災やその他災害のリスクが高まる現代社会において、コペルニクスは地上、海上および大気の環境の状況の監視と、市民の安全向上を目指す全地球観測プログラム。

となっている。

### 費用

2030年までの運用が保証されており、2030年以降の運用に向けて現在欧州連合内で予算検討が行われています。

データへの入手は全世界に向けてオープンフリー制度を取っており、研究や商業目的といった全ての面において利用は個人・団体も原則無償となっている。

### 商用利用

前述の通り、商業利用も無償で利用可能

### 参考記事

https://www.sorakoto.space/serialization/copelnicus/copelnicus-01/

## G-Portal（地球観測データ提供システム）

https://gportal.jaxa.jp/gpr/information/tool?lang=ja

### 概要

JAXAが打ち上げた地球観測衛星で取得されたプロダクト（衛星画像等）を検索、ダウンロードできるポータルシステム

### 費用

無償。ダウンロードには登録が必要。

### 商用利用

商用利用可能だが、データの出所表示に必要あり。データの種類（高次付加価値データ・製品）によっては制限がある場合もある。


> （１）G-Portalから提供されるデータは、（２）に示すデータの出所表示を除き、制約なく誰でも自由に無償で利用（商用目的での利用を含む）できます。 
> （２）データの出所表示 
G-Portal提供データを利用して、その成果を論文、レポート等で公表・出版する場合は、別表をご参照の上、利用したG-Portal提供データの出所表示をお願いいたします。 
なお、高次付加価値データ・製品については、原初データの出所をご記載ください。
https://gportal.jaxa.jp/gpr/user/regist1?lang=ja

### 参考記事

https://satpf.jp/spf/?lang=ja&sceneid=ALOS2260233120-190319&zoom=6&lon=123.5195000000025&lat=24.70999614048762


## Google Earth Engine

https://earthengine.google.com/

### 概要

地球観測衛星が取得したデータや画像の分析ができる、オンラインのプラットフォームのことです。

衛星画像を分析するには、前処理・豊富な計算リソースが必要であり、また、衛星画像を入手するにも費用が掛かったり、元となるデータ分散されているなど、継続的に分析を行うことは難しい状況でした。

しかし、すでに加工済みの衛星画像が用意されているため、衛星データからの計算、画像加工、分析結果をグラフに表すなどの作業を、統一された環境で行えることが特徴。

### 費用

研究・個人利用に限り無償

### 商用利用

有償の商用ライセンスあり

### 参考記事

https://sorabatake.jp/337/
https://www.jstage.jst.go.jp/article/rssj/38/2/38_125/_pdf/-char/en
https://qiita.com/ga_ku/items/c937e4eb5df467ca8048