OmniAICreator/Qiita-1.07M huggingface dataset:
[用語]スループットとレイテンシー

# はじめに
AWSのソリューションアーキテクトの勉強をしている中で、「スループット」と「レイテンシー」の意味を毎回忘れてしまうので、記憶定着と備忘のため。

# スループット
一言で言うと「時間あたりの処理能力」のこと。
要は一回の処理でどのぐらいのデータを送ったりできるか、という指標で、もちろん高ければ高いほど性能が良いということになる。
ただし、あんまり一度にたくさんのデータを送ったりすると、次に書くレイテンシーが低くなる。

http://e-words.jp/w/スループット.html

# レイテンシー
一言で言うと「ポチってから応答が返るまでの時間」のこと。数え方は「低い（良い）」か「高い（悪い）」。
通信の遅延時間とも言う。
Webオンラインシステムやスマホゲームなどは通信の度に何秒も待たされるとものすごいストレスになるので、そういう場合はスループットよりもレイテンシーが重視される。

https://www.idcf.jp/words/latency.html

# まとめ
スループットとレイテンシーはどっちが良い・悪いではなく、（基本的には）トレードオフになるみたいです。
Amazon RDSでレイテンシーを高めたい時はどの構成にするべきか、みたいな問題は割とよく見ますが、毎回何がどれだかを忘れます。
（スループットならリードレプリカ、可用性ならマルチAZ、レイテンシーならSSDだったか。覚えてたらいつかまとめます）
macOS MojaveでHomebrewのdoctorしたらWarning: The following directories do not exist:となったときの対応方法

# 事象 : `brew doctor`したら`Warning: The following directories do not exist:`となった
```bash
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/usr/local/Frameworks
/usr/local/sbin

You should create these directories and change their ownership to your account.
  sudo mkdir -p /usr/local/Frameworks /usr/local/sbin
  sudo chown -R $(whoami) /usr/local/Frameworks /usr/local/sbin
```

# 原因 : ディレクトリがないから
```bash
$ ls -l /usr/local/
total 0
drwxrwxr-x    4 mana  admin   128 11  9 12:33 Caskroom
drwxr-xr-x   57 mana  admin  1824 11  9 12:33 Cellar
drwxr-xr-x   21 mana  admin   672 12 11 00:09 Homebrew
drwxrwxr-x  211 mana  admin  6752 11  9 12:33 bin
drwxr-xr-x   13 mana  admin   416 11  9 12:33 etc
drwxr-xr-x   78 mana  admin  2496 11  9 12:33 include
drwxr-xr-x  264 mana  admin  8448 11  9 12:33 lib
drwxr-xr-x   68 mana  admin  2176 11  9 12:33 opt
drwxr-xr-x   14 mana  admin   448 11  9 12:33 packager
drwxr-xr-x    4 mana  admin   128 11  9 12:32 rbenv
drwxr-xr-x    3 mana  wheel    96 11  9 12:32 remotedesktop
drwxr-xr-x   20 mana  admin   640 11  9 12:33 share
drwxr-xr-x   11 mana  admin   352 11  9 12:33 var
```

# 対応方法 : `brew update`してからディレクトリを作る
```bash
$ brew update
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
<省略>

# なぜかupdateしたら/usr/local/Frameworksはいらなくなる・・・・
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don`t worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/usr/local/sbin

You should create these directories and change their ownership to your account.
  sudo mkdir -p /usr/local/sbin
  sudo chown -R $(whoami) /usr/local/sbin

# doctorに言われた通りにディレクトリを作って権限を付与する
$ sudo mkdir -p /usr/local/sbin
Password:
$ sudo chown -R $(whoami) /usr/local/sbin
$ ls -l /usr/local/
total 0
drwxrwxr-x    4 mana  admin   128 11  9 12:33 Caskroom
drwxr-xr-x   57 mana  admin  1824 11  9 12:33 Cellar
drwxr-xr-x   21 mana  admin   672 12 11 00:09 Homebrew
drwxrwxr-x  211 mana  admin  6752 11  9 12:33 bin
drwxr-xr-x   13 mana  admin   416 11  9 12:33 etc
drwxr-xr-x   78 mana  admin  2496 11  9 12:33 include
drwxr-xr-x  264 mana  admin  8448 11  9 12:33 lib
drwxr-xr-x   68 mana  admin  2176 11  9 12:33 opt
drwxr-xr-x   14 mana  admin   448 11  9 12:33 packager
drwxr-xr-x    4 mana  admin   128 11  9 12:32 rbenv
drwxr-xr-x    3 mana  wheel    96 11  9 12:32 remotedesktop
drwxr-xr-x    2 mana  wheel    64 12 11 00:27 sbin
drwxr-xr-x   20 mana  admin   640 11  9 12:33 share
drwxr-xr-x   11 mana  admin   352 11  9 12:33 var

$ brew doctor
Your system is ready to brew.
```
【Tello】トイ・ドローンで遊んでみた♪～Pythonで動画撮影しつつ飛んだ！

[昨夜はどうにかスマホやGamePadで飛ばし、Scratchでプログラミングして飛ばす](https://qiita.com/MuAuan/items/27f6bbb3781b75d0cb0b)ところまでやった。
第二夜は、これをPythonで飛ばして、かつ動画撮影まで出来た。
###一応の目標
①とにかく飛行させる
②GamePadで飛ばす
③PCで飛ばす
④Pythonで飛ばす
⑤画像入力する
⑥物体検出搭載
⑦トラッキングする
⑧物体を探して見つける
⑨...
ということで、今回は
④Pythonで飛ばす
⑤~~画像~~動画入力する
について報告する。
###コードは以下に置いた
[Tello/takeoffVideo.py](https://github.com/MuAuan/Tello/blob/master/takeoffVideo.py)
なお、このコードは以下の参考サイトのTellopyをインストールして、そこにあるフレームワークを前提としている。
【参考】
・[hanyazou/TelloPy ](https://github.com/hanyazou/TelloPy)
###④Pythonで飛ばす
これは、上記参考をインストールして、

```
python -m tellopy.examples.simple_takeoff
```
と入力すれば、飛んだ。
###⑤~~画像~~動画入力する
こちらも同じように以下をインストールして試そうとしたが、

```
$ pip install av
$ pip install opencv-python
$ pip install image
$ python -m tellopy.examples.video_effect
```
実はこれはWindowsの実行環境ではavがインストールできなかった。
そこで、conda環境でインストールするとインストールできました。
ということで、飛ばせて、動画入力まで出来たのでこれらを合体します。
###動画撮影しつつ飛んだ！
今回は通過点ということもあり、以下のコードとしました。

```takeoffVideo.py
import sys
import traceback
import tellopy
import av
import cv2.cv2 as cv2  # for avoidance of pylint error
import numpy
import time
from time import sleep

def videoCamera(start_time,container,drone,set_time):
    frame_skip = 300
    while True:
        for frame in container.decode(video=0):
            if 0 < frame_skip:
                frame_skip = frame_skip - 1
                continue
            image = cv2.cvtColor(numpy.array(frame.to_image()), cv2.COLOR_RGB2BGR)
            cv2.imshow('Original', image)
            #cv2.imshow('Canny', cv2.Canny(image, 100, 200))
            cv2.waitKey(1)
            if frame.time_base < 1.0/60:
                time_base = 1.0/60
            else:
                time_base = frame.time_base
            frame_skip = int((time.time() - start_time)/time_base)
            if time.time() - start_time > set_time:
                return
            else:
                continue

def main():
    drone = tellopy.Tello()
    try:
        drone.connect()
        drone.wait_for_connection(60.0)
        drone.takeoff()
        #sleep(10)     
        container = av.open(drone.get_video_stream())
        start_time = time.time()
        videoCamera(start_time,container,drone,10)
        
        drone.down(50)
        sleep(5)
        start_time = time.time()
        videoCamera(start_time,container,drone,10)
        drone.land()
        sleep(5)
        drone.quit()
        cv2.destroyAllWindows()

    except Exception as ex:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback)
        print(ex)
    finally:
        drone.quit()
        cv2.destroyAllWindows()

if __name__ == '__main__':
    main()
```
これで、どうにかtakeoffして、動画撮影１０ｓして、降りてきて再度動画撮影１０ｓ、最後に無事に着陸しました。
ちなみに今回は動画の乱れもほとんどなく転送時間も動画っぽく取れました。

###まとめ
・PythonでTelloを飛ばせた
・動画を撮影しつつTelloをコントロールできた

・次回は、物体検出、トラッキングのどちらかを実施する
よく忘れる特殊なCHOPたち

# はじめに
TouchDesignerを使い始めてはや2年。
まだまだ勉強中ですが、CHOPの値の使い方について未だに「あれ、この時どのCHOP使えばいいんだっけ・・・」ということがあります。
なので要素を変換する系の特殊なCHOPの逆引きシートを作りました。
が、それを見る前にCHOPの基本的な名称を覚えておきましょう。

## Value
単一の値です。CHOPで扱う値の最小単位です。日本語訳すると『値』ですね。

## Sample
Valueが連なったものです。
と書きましたが恐らく逆で、Sampleの標本数が1つしかないものがValue、というのがTouchDesigner上の概念のようです。
なのでぱっと見『配列』（Array）のように見えますが、日本語訳としては『標本』が妥当かと思います。

## Channel
ValueあるいはChannelのラベルです。
日本語訳は・・・難しいですね。まぁそのまま『チャンネル』と思ってもらえれば良いかと思います。

# で、逆引きシート

## ValueをストックしてSampleを作りたい
<b>Trail CHOP</b>を使います。
<img width="562" alt="スクリーンショット 2018-12-11 0.08.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/c551da05-2421-5d34-4585-ada7f53314ca.png">

## Valueを複数繋いで、Sampleを作りたい
<b>Join CHOP</b>を使います。
<img width="512" alt="joinchop.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152718/0b118108-6d3d-d0ec-ef59-9f13e74ca870.png">


## Sampleの並び順を逆転させたい
<b>Stretch CHOP</b>の<b>Reverse Interval</b>を<b>On</b>にします。
<img width="562" alt="スクリーンショット 2018-12-11 0.09.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/4fd9cc63-9fc6-435a-28bf-9e63740acac1.png">

## Sampleを分解し、複数ChannelのValueにしたい
<b>Shuffle CHOP</b>の<b>Method</b>を<b>Split All Samples</b>にします。
<img width="603" alt="スクリーンショット 2018-12-11 0.37.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/71a68a21-b69d-3379-4d16-cbc8971b6df4.png">



## ChannelとSampleをスワップしたい（交換したい）
<b>Shuffle CHOP</b>の<b>Method</b>を<b>Swap Channels and Samples</b>にします。
『要素数５のSampleが３Channel』の場合、『要素数３のSampleが５Channel』になります。
<img width="562" alt="スクリーンショット 2018-12-11 0.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/93ac6edd-d710-0a52-5d2b-f7f167c91329.png">


## Sampleの最後尾に別のSampleを合体させて、長いSampleを作りたい
<b>Shuffle CHOP</b>の<b>Method</b>を<b>Sequence All Channels</b>にします。
<img width="562" alt="スクリーンショット 2018-12-11 0.16.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/0b6b7109-90bd-9f22-d3d2-23eb73d030e8.png">


## 2つのSampleを混ぜて、長いSampleを作りたい
<b>Shuffle CHOP</b>の<b>Method</b>を<b>Sequence All Samples</b>にします。
<img width="562" alt="スクリーンショット 2018-12-11 0.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/cac3e407-58b9-0707-d14b-36cb7dfd6b4e.png">


## Sampleの間に別のSampleを挿入したい
<b>Splice CHOP</b>を使います。
<img width="562" alt="スクリーンショット 2018-12-11 0.18.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/856eb23a-7f47-9a7e-66e9-6e2a9b852d5c.png">

## 1ChannelのValueを、複数のチャンネルに振り分けたい
<b>Fan CHOP</b>の<b>Operation</b>を<b>Fan Out</b>にします。
<img width="562" alt="スクリーンショット 2018-12-11 0.23.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/6234f0e2-3c0f-510c-f4ce-6f2c5ef6e280.png">

## 複数ChannelのValueのうち、アクティブなChannelだけ知りたい
<b>Fan CHOP</b>の<b>Operation</b>を<b>Fan In</b>にします。
1つめのChannelに１が入っていると０、2つめのChannelに１が入っていると1、３つめのChannelに１が入っていると２を返します。
<img width="562" alt="スクリーンショット 2018-12-11 0.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/152718/8f0e171d-2a61-d7ca-42ad-26e27d3cbf34.png">
ARKitでオクルージョン

# オクルージョンとは

**オクルージョンとは手前にある物体が背後にある物体を隠して見えないようにする状態**のことです。

現実世界では後ろにある物体が前にある物体に隠れるのは当然ですが、ARの世界では物体の表示をうまいことコントロールしないと、前後関係がうまく表現できません。

以下にオクルージョンの例をあげます。

## ナイアンティックの例

まずは、ナイアンティックの動画です。バーチャルのピカチュウが現実の人の影に隠れています。

<img width="764" alt="スクリーンショット 2018-12-11 0.05.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/111366/b777faad-bd53-26fb-d065-8c06dddbc3f3.png">
https://youtu.be/7ZrmPTPgY3I

## テクテクテクテクの例

この前僕が[テクテクテクテク](https://www.teku4.jp/)を外苑前で使った時に撮った以下の画像もオクルージョンしてます。

![tek.jpg](https://qiita-image-store.s3.amazonaws.com/0/111366/1902dde9-2a78-15a6-48b7-9f88549e3372.jpeg)

# ARKitでオクルージョン

ARKitでも平面に関してならレンダリングを工夫すれば行うことができます。

![occlusion.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/74eb640e-b383-f738-64a1-d809a7ac6c1a.gif)

決めては**renderingOrder**です。

## renderingOrder
<img width="772" alt="スクリーンショット 2018-12-10 23.43.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/111366/502a9bb5-70b3-4a5a-6c9a-243ae474467d.png">

https://developer.apple.com/documentation/scenekit/scnnode/1407978-renderingorder

SCNNodeのパラメータの**renderingOrder**をいじるだけでオクルージョンができます。

平面検出については、[[iOS 11][ARKit] 平面の検出について #WWDC2017
](https://dev.classmethod.jp/smartphone/ios11-arkit-plane-detection/)あたりの記事を読んでいただいた上で、以下のようなお決まりのパターンのplaneAnchorの取得から平面のNodeを置くコードを見ていきましょう。

```swift
extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else {
            return
        }
        let extent = planeAnchor.extent
        let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z))
        let planeNode = SCNNode(geometry: plane)
        planeNode.name = "arPlane"
        planeNode.renderingOrder = -1
        planeNode.eulerAngles.x = -.pi/2
        node.addChildNode(planeNode)
    }
}
```

注目すべきなのは、

```swift
planeNode.renderingOrder = -1
```

これをすることで、planeNodeを描画する順番が一番最初になります。なぜならSCNNodeのrenderingOrderのデフォルト値は0だからです。

0より-1のほうが小さいので必ず先に平面が描画され、その結果、以下の赤いBoxNodeは平面と重なったときに隠れます。

![occlusion.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/74eb640e-b383-f738-64a1-d809a7ac6c1a.gif)

別に-1じゃなくても良いんですが、-1を使うと、他のNodeには0が入ってるので手っ取り早いですね。

このrenderingOrderをコントロールすることで、例えば[SceneKit の SCNNode のレンダリングオーダーでどこでもドア的表現をする](http://appleengine.hatenablog.com/entry/2017/11/28/175040)のようなこともできます。

# まとめ
- 平面にNodeを貼ることができれば、その後ろに物体を隠してオクルージョンができる
- Nodeさえ表面にうまいこと貼ることができれば机以外にもオクルージョンできるかも？
レイマーチングでフォッグ

レイマーチングだと簡単にオブジェクトを繰り返しできるのですが、遠くの方は繰り返しが途中で終わったり、エイリアスが発生したりして絵が汚くなりがちです。

例えば、以下のシーンでは球が途中が途切れていたり、地面のチェッカー模様が奥のほうでごちゃごちゃしたりしています。

<img width="692" alt="no_fog.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/df738c87-292f-397d-1ab4-d8411c2fe722.png">

このようなときは、カメラからの距離に応じてフォッグをかけてごまかすのがよさそうです。

透過率(フォッグのかからない具合)を$f$として$[0, 1]$の範囲で表すと、元の色${\bf c_i}$とフォッグの色${\bf c_f}$を$f$で補間することでフォッグをかけることができます。

```math
{\bf c} = (1 - f){\bf c_f} + f{\bf c_i}
```

GLSLで書くと単純に`mix`関数で実装できます。

```glsl
vec3 color = mix(fogColor, sceneColor, fogIntensity);
```

問題はどのように$f$を求めるかですが、いくつか方法があります。

## 線形フォッグ

以下の式で$f$を求めると、$d_{start}$より手前では$f=1$、$d_{end}$より奥では$f=0$、$d_{start}$から$d_{end}$の間では$f$が$1$から$0$に線形に変化するようになります。

```math
f = clamp(\frac{d_{end} - d}{d_{end} - d_{start}}, 0, 1)
```

GLSLで実装すると以下のようになります。

```glsl
float linearFog(float d, float start, float end) {
	return clamp((end - d) / (end - start), 0.0, 1.0);
}
```

上述したシーンに線形フォッグを適用すると次のようになります。線形フォッグはパラメータが直感的でわかりやすいですが、フォッグのかかっている箇所とかかかっていない箇所がくっきりしており、リアルではないかなという印象です。

<img width="695" alt="linear_fog.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/3de04bdc-c4f5-731e-3838-e909564b8309.png">


## 指数フォッグ 1

指数を用いて$f$を求める方法です。$density$には$0$から$1$の間の値を指定します。

```math
f = e^{-d \times density}
```

グラフにすると以下のようになり、距離に応じてなだらかに$f$の値が変化することがわかります。

<img width="649" alt="graph_exp.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/aeeb0db9-cda6-e4cf-5210-a70cf20905e9.png">

GLSLで実装すると、このようになります。

```glsl
float expFog(float d, float density) {
	return exp(-d * density);
}
```

このフォッグを最初のシーンに適用すると、線形フォッグのときよりもリアリティは増しますが、手前のオブジェクトにもフォッグがかかりモヤっとした印象になりました。

<img width="694" alt="exp_fog.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/837a6db7-a9d8-62a1-bbbd-01de19ed33fa.png">


## 指数フォッグ 2

先に紹介した方法と式が似ていますが、指数部分を2乗しています。

```math
f = e^{-(d \times density)^2}
```

グラフにすると以下のようになり、手前部分はゆっくりと変化し、奥に行くにつれて急激に$f$が0に近づいていきます。

<img width="653" alt="graph_exp2.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/3b69b0ae-461e-8426-7dbb-f72a4ad9ed87.png">

GLSLで実装すると以下のようになります。

```glsl
float exp2Fog(float d, float density) {
	float dd = d * density;
	return exp(-dd * dd);
}
```

この方法だと手前部分がくっきり見えるようになりつつ、フォッグのリアリティも維持しているような感じがします。

<img width="697" alt="exp2_fog.png" src="https://qiita-image-store.s3.amazonaws.com/0/61569/e3e36d71-5cb0-e694-4d3e-a0aa9c96917b.png">

## 終わりに

今回はフォッグについてまとめてみました。フォッグ自体は3Dで定番のエフェクトなので目新しいことはないですが、繰り返し表現が簡単に実現できるレイマーチングでも有用かなと考えています。

今回のサンプルとして作成したシーンはglslsandboxに置いておきました。`#define FOG_TYPE`を変更することで使用するフォッグを変更することができます。
http://glslsandbox.com/e#50866.0

## 参考

* [フォグ公式](https://msdn.microsoft.com/ja-jp/library/cc373153.aspx)
* [01\-10:フォグ\(霧\) \| \#region OpenTK](https://masuqat.net/programming/csharp/OpenTK01-10.php)
ESP32でJavaScriptが動くModdable SDKさわってみた

つい先日のIoTLT名古屋で発表したModdable SDKの話をしていこうと思います。

この技術でESP32やESP8266でJavaScriptが動かせるようになります！さっそく説明していこうと思います。

# Moddable SDK

ESP32やESP8266でJavaScriptが動かせるSDKになります。（NefryBTで動作確認しました）

GitHubでオープンソースで開発が進められています。
https://github.com/Moddable-OpenSource/moddable/

似たようなものにObnizがありますが、おそらくアプローチは別だと思います。

# ESP32、ESP8266

ものすごく簡単にまとめます。

500円程度で購入することができるWiFiモジュールです。
WiFiが使えるためIoTデバイスとして使用できます。

ESP8266とESP32の違いはBLEを使えるか使えないかが大きな違いです。ESP32がBLEを使用できます。

# Moddable SDKの環境構築

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md

上記のリンクから開発環境を構築できます。

手順が多く少々めんどくさいですが、特段難しいことはないので上記を参考にしてください。

https://make.kosakalab.com/make/electronic-work/moddable-sdk_build_how-to
こちらの方がきれいにまとめられているので悩んだらこちらを参照してください。

# 動かしてみる

環境構築ができたら、「Hello, world - sample」と表示するサンプルプログラムを動かしてみましょう。
![2018-12-09_11h16_09.png](https://qiita-image-store.s3.amazonaws.com/0/97208/8e95327c-5aa6-d41b-1846-9b25f025376f.png)

デバッガーが起動して、変数の確認やブレイクポイント貼ってプログラムを試すことができます。

ポートなどの設定をしたあとに```mcconfig -d -m -p esp32```を実行するとESP32でHello worldという処理を実行することができました。

次のステップでLチカもサンプルプログラムみるとこんな感じで実行してLEDをそのピンにつけるとLチカしてくれます！

```
import Timer from "timer";
import Digital from "pins/digital";

// blinks the two LEDs on ESP8266 NodeMCU boards
// blinks only blue LED on ESP32 Node<MCU boards (pin 2).

let count = 0;
Timer.repeat(() => {
	trace(`repeat ${++count} \n`);
	Digital.write(2, ~count & 1);
	Digital.write(16, count & 1);
}, 200);
```
引用：https://github.com/Moddable-OpenSource/moddable/blob/public/examples/pins/blink/main.js

# ドキュメントをよむ

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/pins/pins.md
デジタル入出力やI2C、SPIなど一通りのピン制御ができます。

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/network/ble/ble.md
BLEなんかもサポートしててわりとよさげです！

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/network/network.md#class-wifi
もちろんWiFiもつながります！

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/drivers/ssd1306/ssd1306.md
NefryBTでつながるDisplayのライブラリもあるみたいですね！

# まとめ

Obnizちょっと高いなとかESP32余らしてるんだよなとかちゃんとJavaScriptでボード動かしたいんだよね！みたいな人にはいい技術じゃないんでしょうか？

初めの環境構築がちょっとめんどくさいとこだけ乗り越えたら遊べるのでぜひ一度遊んでみてください！
ユビキタス言語についての知見を共有します

この記事は、[ドメイン駆動設計 #1 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ddd)の10日目です。

## ユビキタス言語は大事

DDDは分類手法の一つという側面があります。

分類の道具は境界づけられたコンテキストと、ユビキタス言語です。
境界づけられたコンテキストで、システムの対象業務を分類し、境界づけられたコンテキスト内部ではユビキタス言語で言葉を分類します。


個人的に、ユビキタス言語はDDDを実践する上でとても大事なテクニックだと思うのですが、何を指すものなのか、どういうメリットがあるものなのかわかりにくいために、初心者にとってはわかりにくいものかもなー、とも感じます。
そこでこの記事では、ユビキタス言語についての私の知見を書いてみます。ユビキタス言語についての学習の助けになれば幸いです。

## ユビキタス言語とは何か？

ユビキタス言語の定義をする前に、「境界づけられたコンテキスト」について説明します。

境界づけられたコンテキストとは「共通の用語が通じる業務の範囲」のことです。
DDDは全体で同じ用語を使うことは無理と考えますが、ある範囲であれば共通の用語を使えると考えます。その範囲が境界づけられたコンテキストです。

境界づけられたコンテキストは名前空間として働きます。ユビキタス言語とはコンテキストの内部だけで有効な用語集です。コンテキストを越えると同じ名前の用語であってもユビキタス言語としては通じず、別の概念になります。

例えば発送処理と請求処理でコンテキストを分けているとして、それぞれのコンテキストで「顧客」というユビキタス言語で定義された用語を使っていても、それらの用語は別の概念だとみなさないといけません。


ユビキタス言語はどのような用語集になるでしょうか？例えば発送処理のユビキタス言語は「発送」「発送者」「郵送先」「日付指定」「配達業者」「運転手」のような言葉を使うかもしれません。
大事なことは、ドメインのユーザーが使う言葉とプログラムを構成する言葉を一致させることです。プログラムの中で使われているクラス名、メソッド名をユーザーが見れば意味が通じないといけませんし、ユーザーが使っている言葉がついたクラスは、実際の言葉が指し示すものと同じように振る舞わなければいけません。

ユーザーが使っている言葉でプログラムを検索すれば、該当する概念の挙動を表しているクラスに行き着くようになってないといけませんし、そうなっている状態が保守しやすいプログラムであると言えます。ユーザーの言葉からプログラムの言葉に翻訳しないといけなかったり、一つの概念が複数のファイルに分割されている状況は可能な限り避けないといけません。





## なぜ技術用語でなくドメインの言葉で分類するのか？

同じ言葉を使ってユーザー、ドメインエキスパート、開発者などの関係者が会話することで、ドメインを効率的に学習するため。
また、そうすることでうまく分類でき、理解しやすく保守しやすいシステムにすることを期待します。
保守しやすいプログラムにすることも目的です。


## ドメインの言葉を使えば適切に名前付けできるのか？

この点は私がDDDを学び始めた時の疑問の一つでした。
適切に名前付けするとは、以下の条件を満たしていること、と言えるでしょう。

* 名前でドメインの概念を識別できること
* 理解しやすい名前付けができること

それぞれについて考えてみます。



## ユーザーが使っている言葉を使って、適切に識別できる名前付けができるのか？

たぶんできる。
ユーザーは混乱の無いように業務を回しているというのがその根拠です。
曖昧な言葉を使っていたら、効率的に業務を行うことはできない。なので曖昧な用語は使わないように業務で使う言葉が洗練されている、と期待できます。


## ユーザーが使っている言葉を使って、理解しやすい名前付けができるのか？

これもたぶんできる。けど、一見わかりにくい言葉を使っていることはありうる。
業務を回すには、曖昧な言葉を使うのはNGだが、関係者だけに通じる言葉が使われているかもしれません。
外部の目から見て不必要にわかりにくい言葉が使われているなら、それを理解しやすい言葉に置き換えてもいいかもしれないし、すでに共通言語として使われているメリットを活かすなら、そのまま使い続ける判断もあるでしょう。




## ユビキタス言語を作る時の注意点

ユビキタス言語は、ユーザーが使っている用語を使うだけでなく、開発者も含めて共通に使う言葉を育てていくのだそうです。
ユーザーも業務で実際に使う必要があるため、以下の点に気をつけて言葉を選んでいかないといけないでしょう。

* 同一コンテキストの中では、たとえモジュール(パッケージ)が別れていたとしても、同じ名前を異なる概念に対してつけてはいけない。パッケージ名を取り除いた名前だけで識別できないといけない。
  普段の会話の中で、パッケージ名を付けて呼んだりはしないので。
* 誤解を生じにくい言葉を選ばないといけない。そうしないとコミュニケーションが滞ってしまう。

「重複している」「曖昧である」と感じたなら、それは適切な名前付けができてないサインです。
そういうコミュニケーションのわだかまりを学習の機会と捉えて、言葉を整理して、ユビキタス言語を育てていかないといけません。


以上、ユビキタス言語の知見の共有でした。ご参考まで。
ロリポップマネージドクラウドを使ってSPAを作った話

#概要
この度、ロリポップマネージドクラウドが年末まで利用無料となっております。
ふとしたきっかけでそれを知ったので
さくっとGolangプロジェクトを作って遊んでみました。
その時に詰まったことや気づいたことなどを共有しておきます。

結論を急ぐと、AWSやHerokuに比べてリリースまでが楽で速いため、
「多少お金を払ってもよく、小規模なWebアプリをさっさとリリースしたい」
といった場合は導入を検討するといいかもと思いました。

#ロリポップマネージドクラウドとは
[ロリポップマネージドクラウド](https://mc.lolipop.jp/ )
詳細は上記公式ページをご覧ください。
早い話がGCP等と同じようにコンピューティングリソースを使用できるサービスで、
月当たりの金額が安くなっております。オートスケールとかもできます。
SSLも当然対応(LetsEncryptのドメインベースのやつ)
ロードバランシングとか結構奥まった設定のチューニングはあまりできないです。
その代わりこちらで管理/把握する部分が少なくて済むので、
フロント出身エンジニアのサンドボックスにするといった使い方とかもありだと思います。
注意点としてはDBがMySQL固定で、容量も500M程度が許容範囲となるのでヘビーな利用は慎重に。

#対象読者
数あるバックエンドサービスの中でも新しい選択肢を検討する方

#投稿背景
1:ロリポップマネージドクラウドを使ってみて、ドキュメントの少なさが気になった為
2:品質はどうあれ、アウトプットすることで各種界隈の盛り上がりに1cmでも寄与する為

#何作ったん
[StarCraft Battle Timer](https://starcraft-battle-timer.lolipop.io/)
esportsとして今めちゃくちゃアツい高難度RTS:[StarCraftII](https://starcraft2.com/ja-jp/)
の対戦支援SPAです。
(ゲームは基本無料ですが日本語に対応していないので英語力を強化したい方におすすめです。)

スマホで使うことを想定しています。
使い方は簡単、対戦開始と同時に相手種族のアイコンをポチっと押すだけ！
理論上の最速だと何分ごろどんなテックが上がっているかをプレーしながら横目で確認できます。
戦術Wikiに時間付きテックツリーはあったんですがパッチVerが古めだったので異なっている部分もあり作りました。
マネージドクラウドの無料化が終了するころには撤収予定。

後述の理由によりほぼフロントのみで開発しました。
バックエンドの立ち上がる部分のみgoLangを使用しています。
ロリポップマネージドクラウドのコンテナ起動時コマンドにGolangを指定できるので、任意のgolangファイルをあらかじめSCPで配備して権限を切っておくだけでできます。

環境はWIndows10 × Chrome × Brackets です。

# 良かったところ/気づいたところ
・ロリポップマネージドクラウドの管理画面は見やすい(設定項目が少ないので)
・公開鍵を設定して簡単にSSH/SCP接続ができるのがよい。
→GCPやFireBaseHostingだとこう簡単にはいかないので、これは結構ありがたいと思います。

・Golangを初めて触りましたが、実行環境別にクロスコンパイルできるってすごいですね。
良いぞ良いぞとは言われてましたが、今回良さの一角を垣間見ました。

# つまったところ
・MySQLがSSHコンテナ上コマンドからもgolangファイルからもクライアント側からも接続できない！
これは本当に詰まりました。そして諦めました。
ネット上でもなかなか取り組んでいる記事が見当たらず、、、SPAで使うデータ量が少なかったことと、リリースを優先するためにDBの使用をあきらめております。
ちなみにGolangプロジェクトでは、Linux-amd64系にnginx/MySQL/golangが載っているような構成でした。

```consoleのMsg.
can't connect to local mysql server through socket '/var/run/mysql/mysql.sock' (2)
```

このエラー自体の対策記事は結構あるんですが、ググりまくってあれこれ試してもメッセージが変わらず。。。
MySQLのエラーログファイルも結構探したんですがそもそも見つかりませんでした。
ロリポップマネージドクラウドのコンテナ自体の挙動や仕様に関係があるのか切り分けしきれませんでした。
ここに関しては、もし何か明らかになったら更新しようと思います。

・公式ドキュメントがまだ少し寂しい。
プロジェクト自体はPHP/Ruby/Node/Python/Wordpress/golang
とあるのですが、WebアプリのDB接続についてはRubyのみ記載、
MySQLのクライアント接続はMacのみ記載、など「ドキュメント充実」といった感じではないです。
ドキュメントの今後のそろい方次第ですが、情報が多いプロジェクトを選択するのが良いでしょう。
チャレンジャー根性でgoLangプロジェクトに突撃した私は無事折られました！

# まとめ
PHP-LumenやRoR等であまりこみいった事をせず,ド王道のCRUDを使った定番Webアプリをさくっとリリースする　という使い方が最も良さを生かせるんじゃないかと思います。
StaticなHostingはFireBaseがあるし、サーバ構成から煮込みたいならAWS/GCPがあるので、
当然ですが要件によって使い分けていきましょう。

以上です。
御観覧頂きましてありがとうございました。
途中で滑らかに太さの変わる曲線の描画をWebGLでやってみた（非多ポリゴン分割）

![スクリーンショット (223).jpg](https://qiita-image-store.s3.amazonaws.com/0/59191/fbdf8b1b-92c9-45a9-3b9a-0471919add88.jpeg)

この記事は[WebGL Advent Calendar 2018](https://qiita.com/advent-calendar/2018/webgl)の11日目の記事です。

# はじめに

## 趣味でお絵かきツールを作っています

![Image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59191/6c72681d-1374-f8a1-3f16-ee4641ce1096.jpeg)

昨年からCanvasとWebGLを使ってベクター方式のお絵かきツールを作っています。前回のアドベントカレンダーでも少しだけ紹介しました。WebGLはポーズ人形の描画に使っています。

基本的には線画のためのツールですが、塗りつぶしや簡易なアニメーション機能も備えていて、そのうちそれを使って簡単なアニメーションが作れるようになったらいいなと思ってたりもします。

筆者はBlender使いの端くれなのでグリースペンシルも使っているのですが、自分の求める使い心地とは少し違う感じです。

## Canvasは一定の太さの線しか描けない

線の描画はHTML5のCanvasで行っているのですが、Canvasの2D描画は最初から最後まで同じ太さでしか線を描画できないとう問題があります。

イラストを描くときには線に微妙な太さの変化をつけたいときがありますが、それができないということになります。

この問題は調べてもいまいち良い方法が見つからず、3D描画技術では細かくポリゴンに分割する方法がよくありますが、拡大しても滑らかな曲線にするには相当なポリゴン数になります。

なお、現状は線の太さを変えて何度も直線を描いています。これでも縮小すると結構それっぽく見えます。

![Image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59191/162cab90-9ba2-08c6-540f-0c0bc3b3aafd.jpeg)

## ベクター方式でやりたいのには理由がある

正確には、ベクター方式（線の座標などを保存しておく方式）ではなくラスター方式（ピクセルデータを保存しておく方式）なら色々とやりようがありますし、ベクター方式でもそれなりにやりようがある気がするのですが処理が重かったりします。

ちなみに、なぜベクター方式にこだわるのかというと、筆者が不器用だからです。生まれつきか、練習不足か、あるいはペンタブレットの性能がいまいちなのか、PGの職業病で手が震えるからか、とにかくなかなか滑らかな線が引けないのです。そこで、後から線を編集したりスムージングしたりできるベクター方式のツールを作ろうと思いました。これもPG特有の病かもしれません。

# WebGLで高速に太さと透明度に変化のある線を描く

![Image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59191/9df3dc0f-98a3-1925-668c-b8acfff4e130.jpeg)

半年くらい悩んだのですが、大雑把に次のような流れになります。

1. 頂点の位置と半径のデータを作成
2. 理想としては頂点の間をベジエ曲線で補間した各位置で補間された半径の円を描いた形にしたいが難しい
3. そこでベジエ曲線で線の左側と右側を近似する。
4. しかしポリゴンを単純に作ると線がはみ出る場合がある
5. 左右の曲線がはみ出ないように制御点の位置も利用してポリゴンを作る
6. セグメント（辺）ごとのローカル空間を考えて、ベジエ曲線の位置xに対応するyの値を三次だか四次だかの方程式を解いて求める（フラグメントシェーダ）
7. 左側のベジエ曲線と右側のベジエ曲線の間の点であればピクセルを描画する

なお既知の問題として、ポリゴンにする関係から、厳しい角度になると破綻するという問題があります。

# 蛇足

シェーダ内でのベジエ曲線の計算はBlenderのベジエ曲線を再現する処理を作ったことがあり、それをTypeScriptからGLSLに移植しました。もともと方程式の解はネットからコピペしたコードで正直よくわかっていないのに、それをGLSLに移植したら一発で動いたのでびっくりしました。数学は偉大。数学は神秘。

# ライブデモ

![スクリーンショット (223).jpg](https://qiita-image-store.s3.amazonaws.com/0/59191/fbdf8b1b-92c9-45a9-3b9a-0471919add88.jpeg)

[ライブデモ](https://warotarock.github.io/variable_line_drawing_webgl/VariableLineDrawingWebGL/)

[ソースコード](https://github.com/warotarock/variable_line_drawing_webgl)

デモをGitHub pagesに用意しました。そういえば去年までのデモはたしか○オシティーズなのでそのうち見れなくなってしまうのか…

作ったはいいのですが線を一本描いただけでは高速なのか分からないため、自作のお絵かきツールで描いている途中の恥ずかしいデータ（他に良いデータが無かったんです。有名なキャラです）を無理やり描画してみました。ライブデモの「負荷テスト開始」ボタンから実行できます。

※データは2MBありますので、モバイル回線等で実行する際は注意して下さい。

## 本当に高速なのか？

単純に比較はできませんが、Canvasで描画するのと比べ高速な気がします。

iPhone 6Sではヌルヌル動きました。

ただ、頂点バッファを作成する処理は重いのでお絵かきツールで使うには工夫が必要そうです。

# 終わりに

今回の描画処理は拡大には強いですが縮小には弱いです。また、厳しい角度で線が曲がっていると破綻してしまいます。さらにアンチエイリアスを考えていないので、WebGLでは細かいポリゴンに分割する方がよいかもしれません（自動でされるため）。

などなど問題は多いのですが、ともかく半年くらい思い描いていたことを現実にできたので良かったです。

また、超がつく蛇足ですが、１２月１１日のアドベントカレンダーを担当して５年目になりました。来年も１１日かもしれませんが、１１日が良い方は筆者に遠慮なさらずに容赦なく先に登録していただければと思っております。これはフリではありません。

それでは皆様、WebGLとともに良い年の瀬をお過ごし下さい。
Terminal越しのVimで^Mをなんとかする

# tl;dr

^M付で貼り付け（ペースト）してしまったら、CTRL-V, CTRL-Mで入力して置換しよう。
備忘です。

# What

Chromeで設定ファイルを開いて、コピペした。すると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8837/4d1c4bfd-5e59-d838-1a15-82eedb2fc5dd.png)

ふぁっく、`^M` だ。なんとかしよう。

# How

Vim力が低いので調べたら `^M` は `CTRL+V, CTRL+M` で入力できるらしい。
なので、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8837/7b0a9ffc-bca6-59ea-dce4-f2a52c7b5800.png)

```
:s/^M/\r/g
```
で入力できた。制御文字は文字色がかわるみたい。んで、実行すると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8837/809ac771-8337-b836-7d22-f2d56094bbab.png)

となって、整形できた。よかった。
OpenCVで画像サイズの変更をしてみた

## 　何をしたか？
####  →OpenCVを使った画像サイズの変更

### <実装手順>
1.ライブラリのインポート
2.画像の読み込み
3.高さ・幅の定義
4.画像のリサイズ
  4-1縮小する(×0.5)場合
  4-2拡大する(×1.5)場合
5.編集後の画像を保存


## 実際にやってみた
#### 1.ライブラリのインポート

~~~Python
import cv2
~~~
OpenCVのライブラリをインポートします。

#### 2. 画像の読み込み
~~~Python
img = cv2.imread('./data/pict/image1.jpg')
~~~
指定したパスの画像をimread関数で読み込みます。

#### 3.高さ・幅の定義
~~~Python
height = img.shape[0]
width = img.shape[1]
~~~
shape[0]が高さを、shape[1]が幅を表しています。

### 4.画像をリサイズする
####4-1 縮小する(×0.5)場合
~~~Python
img2 = cv2.resize(img , (int(width*0.5), int(height*0.5)))
~~~
resize関数で画像の高さ・幅にそれぞれ0.5をかけています

###4-2 拡大する(×1.5)場合
~~~Python
img3 = cv2.resize(img , (int(width*1.5), int(height*1.5)))
~~~
resize関数で画像の高さ・幅にそれぞれ1.5をかけています


###5.編集後の画像を保存(image2の場合)
~~~Python
cv2.imwrite('./data/pict/image2.jpg' , img2)
~~~

imwrite関数で画像を指定のパスに保存しています。

上記の処理を行うと
#### image1(もとの画像)
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/fa43d111-bdbd-ae1d-3cab-104c7737d067.jpeg)

#### image2(image1 × 0.5した画像)
![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/5708ecf2-ca66-176f-7ea7-94ae67d532f2.jpeg)

#### image3(image1 × 1.5した画像)
![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/317125/5c34f18b-9c51-38e5-efa7-fabba12b3d35.jpeg)

このような画像が保存されていることが確認できます。
プログラミング初心者にしか分からない、「初心者が分からないこと」　その１　HTML / CSS 

私は現在、プログラミングスクールに通っています。通いはじめて約2ヶ月です。スクールに入る前は、書店で参考書のような物を買い、約1ヶ月間自力でなんとか勉強しようとしました。

とはいえ、「初めての○○」みたいな本を読んだところで、最初のページからさっぱりでした。

「HTML５、CSS、JavaScriptとは、WebサーバーにあるデータをWebブラウザ上で表示するためのプログラミング言語です。」
　　

　　
は？？

　　


こういう経験をした、もしくは今実際にそうなっている方はかなりいると思います。プログラミングどころか、パソコンに関する知識だってそこまでない人もたくさんいます。でも、そこをじっくり解説していたら何千ページあっても足りなくなってしまうので、わざわざ説明はしてくれません。　　
　　


じゃあどうすればいいんでしょうか？　　　
　　


１から理解いていくしかありません。こればっかりはどうしたって避けられません。
ただ、私の経験上、初めから難しい言葉ばっかりをひたすら覚える必要はないと思います。やっていれば自然とわかるからです。

ですので、少しずつですが、私と同じような思いをしている方の頭の中が少しでもスッキリするような物を書いていきたいと思います。もし困っていて、暇な時間があれば少し読んでみてください。少し。

今回は初めてですので、とりあえずコードとか難しいことは無しにして、HTMLとかCSSって何だろうみたいなのがちょっとだけわかったかもくらいの説明をしていこうと思います。


　　　　


ー　プログラミング「言語」って何？
　　
　　


プログラミング言語は、簡単にいうとプログラミングの種類のことです。
日本語、中国語、英語みたいな感じで、HTML、CSS、JacaScriptなどのいろんなプログラミングの種類があるってことです。
人の言葉は「人と人」が意思疎通をする物ですが、プログラミング言語は「人がコーンピューター」に、「誰かがここクリックしたら、この画像を表示してくれ」みたいんな感じで伝える物です。
　　
　　


じゃあその言語とやらは、それぞれどう違うんですか？っていうと、

HTMLは、今あなたが実際に読んでるような、黒い普通の文字とかを画面に写すためのもの。

CSSは、その普通のつまんない文字に、色をつけたり、大きさを変えたりして見た目を変えるもの。

です。
　　
　　

ここで厄介なのがJavaScriptです。参考書とかだと多分「HTMLやCSSで表示したものをWebブラウザ上で動かす。」みたいなよくわかんないことが書いてあると思います。

動かすってなんだよって話ですよね。「文字とか動いてねーじゃん」みたいな。

その通りです。文字は動いてないし、別に画面上をうじゃうじゃ動いてるものなんてありません。ここでいう動かすっていうのは、クリックしたら別のWebページにいくとか、クリックしたら動画を再生するとかっていう、画面を変えたりすることを動かすって言っています。ちなみに、Webブラウザっていうのは、SafariやInternet Explorer,Firefoxみたいな、ネットでWebサイトをみるためのアプリだと思ってください。今開いているやつですね。

正直、最初はJavaScriptは全く考えなくていいと思います。まずはHTMLとCSSだけに専念するのがいいと思います。じゃないと、ただただ何も分からずに挫折すると思います。思います。

　　
　　

他にもたくさんの「言語」があるんですが、難しい数学の知識などが必要なく、しかもWebページを作るのに絶対必要なのがよく目にするHTML,CSSというわけです。
比較的簡単って書いてるものを多々みますが、ぶっちゃけ初心者からすればめっちゃ難しいです。私もそうでした。わけわかんなかったです。でも、勉強して、パソコンで打って打って打ちまくればちゃんとわかってきますし、できるようになります。なので、みなさんがここでつまずいてもうダメだってならないように、少しでも手助けできればなと思っています。

あんまり一気に色んなこと読んでも混乱しちゃうと思うので、今回はここまでにします。
　　
長くなりましたが、もしここまで読んでくださったなら、本当にありがとうございました。
私も勉強中の身ですので生意気なことは言えませんが、少しでもみなさんのお役に立てればと思っています。今後もこういう感じで堅っ苦しくならないように書いて入れたらなと思いますので、よろしければ読んでみてください。

　　
ではまた。
知識ゼロからコーポレートITに挑戦した話

[<font color="Red">Livesense not engineers Advent Calendar2018</font>](https://qiita.com/advent-calendar/2018/livesense-not-engineers)に初挑戦します。
リブセンスのコーポレートITという社内インフラ部門に所属しております黒木と申します。

早速ですが、本題にも付随するのでざっと私の経歴をお話しします。

**2016年3月**　宮崎の某文系大学を卒業。
**2016年4月**　上京し、某アパレル企業に就職。
**2017年4月**　地元宮崎に帰り、リブセンスに入社。[<font color="blue">転職ナビ</font>](https://job.j-sen.jp/)のセールスとして勤務。
**2018年4月**　キャリアチャレンジで本社へ異動。コーポレートITグループ（当時総務グループ）に配属。
~現在に至る~

まさかのIターンでもなく、Uターンでもなく、Oターンしています。
そして、現在の部署に配属されるまで、ITの知識はZEROでした。
（転職ナビのセールス時代にSQLは学んでいましたが...）

始めたばかりの頃は、「ドメインとは？」「クラウドってなに？」「みんな何の話してるの？」本当にそのレベルでした...
「こんなのも分かんないの？」なんて言う人はもちろん居ませんでしたが、そう思われたら嫌だな、なんて思って聞けずにいた場面もたくさんたくさんありました。
毎日つまずいては調べて、つまずいては調べて、その繰り返しでした。


それから9ヶ月。
まだまだ知識もスキルも無いけれど、**「ここまでどうやって乗り越えて来たか」**そんなお話をしたいと思います。




##まずやったこと
私が配属されてまず任された業務は「入退社対応」です。
・PCのキッティング
・アカウント発行／削除
定型業務なので、同じ事の繰り返し。でもそんな中でも学びはあります。

手順書をコピーし、冊子にして、分からない単語を書き出し、調べる。
~~何てアナログな事をしていたんだろう~~
でも、単語の意味をちまちまと勉強したところで、すぐに実務に活かすことはできません。

**どうすれば学びを実務に活かせるのか**
**どうすれば高速で成長していけるのか**

考えました。あれこれ考えました。
そして結果、辿り着いた答えは...

**うん、実際にやってみるしかない。**

これです。
~~「それだけかよ！」っていうツッコミは心の中でお願いします。~~

コーポレートITには毎日たくさんの問い合わせと依頼が来ています。
自分にできる事なんて限られているけど、挑戦すれば変わるんじゃないか、だったら挑戦してみよう。
と思って、コーポレートITに来た問い合わせや依頼にガンガン挑戦しました。

もちろん、最初はつまずいてばかりでした。
でも、<font color="Red">実際に経験しながら学んでいく事が自分にとっての一番の成長への近道</font>だと思いました。

- 権限周りの対応をする事で、システムの中身に興味を持ち、そして知る事が出来る。
- PCの不具合の対応をする事で、「こういう症状の時は何が原因なのか」少しずつ特定できるようになり、そしてPCの仕組みを理解出来る。
- ライセンスの発行や更新をする事で、そのツールで何が出来るのか、そこにどれくらいの費用がかかっているのか知ることが出来る。
- ネットワークやサーバー周りにも触れ、少しずつ仕組みの理解を深める事が出来る。（ここはとにかく深い）

習得できるものは書ききれないくらいに色々ありますが、一番思ったのは、たくさんの方からの依頼を受ける事で、リブセンスの皆さんの顔と名前だけでなく各部署がどんな業務をしているのかを知る事ができ、それがコーポレートITとしての日常業務や業務改善にも活きています。



##未経験だからこそ出来たこと
経験を積んでいくと、出来るのが当たり前、知っているのが当たり前になっていくと思います。
でも、**未経験だからこそ出来ない事、知らない事**がたくさんあります。
一つ一つの事象に対して、おそらく人一倍の疑問点が芽生えます。

「何でこのシステムが必要なのか」
「何でこのベンダーにお願いしてるのか」
「何でこのプロジェクトを優先すべきなのか」

物事には理由が絶対にあります。

もし必要のないものだったら、無くすべきで、
改善できるものであったら、改善すべき。

優先するものが違っていれば、正すべきで、
統制されていないものは、統制すべき。

多くの疑問を抱いたからこそ、理解が深まり、改善へと繋がった場面もありました。
こうした考えや物事の見方は変えずにいたいと思っています。


##未経験だからこそすべきこと
一番重要だと考えるのは、**分からないことを分からないままにしないこと**です。
当たり前だと思うかもしれませんが、意外と出来る事ではありません。

私は勉強が嫌いでした。
本を読むより雑誌を見る方が好きだったし、夏休みの宿題はいつもギリギリにやっていたし、
テスト勉強は計画的にやるより一夜漬けで詰め込むタイプでした。

分からないことがあると、「もうやだ〜〜〜」ってポイしてしまいたくなる、そんなタイプでした。

でもポイしたらダメなんですよね。
後で自分の首を締めるだけなんです。

特に今の部署では、分からないままに行動してしまっては色んなところに影響を及ぼしてしまいます。

分からない事があったら、調べるなり聞くなりして、絶対に逃げない事。
（未経験だからこそ聞けること、教えてもらえることってたくさんあると思うんです）
そうすれば確実に力がついていく、そう思います。

##まとめ
新しい事に挑戦する事、新しい世界に飛び込む事。
とても勇気が要ります。不安にもなります。

ただ経験した事のない世界に飛び込んだその後は、<font color="Red">毎日が発見です。毎日が学びです。</font>
その発見や学びを楽しむ事が出来れば、それが更なる力になり、自らを高めていけると思います。
きっとこれは業種職種問わずに言える事だと思います。

私はまだまだスタートしたばかりですが、その発見や学びを知り、充実した毎日が過ごせています。
そしてこれからも組織や自分の成長に向けて、常に自分自身が何を出来るかということを考えていこうと思います。

以上で、ドキドキの初挑戦エントリを終わります！！！！
全然技術的な内容では無くなってしまい、主旨とズレてしまっていたらすみません( ﾉД`)
ありがとうございました:dancer_tone5:
IoTに興味はあるけどハードの知識がない人間に贈るデバイス

去年のネタ作りのためにバッカーになっていて
結局間に合わなかったIoTデバイスを、せっかくなので使ってみます。

# その名は Bolt Iot

- 簡単にIoTを始められる、統合プラットフォーム(WiFi Module+Cloud+Apps+API全部入り）
- 2017年にローンチし、目標額の４倍以上を獲得してリリース
- Arduinoとも連携できる

<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/71518/e39f0d07-8246-230a-913a-d7ee90669a20.jpeg">

私の選んだプレッジは"Starter Kit"($44)です。

本体とセンサー・LED・ブザー・ブレッドボードなど、初心者向けのセットになります。

詳しくはこちら
https://www.boltiot.com/

とにかく簡単に始められるという評判なので早速使ってみたいと思います

# まずはセットアップ

https://docs.boltiot.com/docs/setting-up-the-bolt-wifi-module
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/71518/adf43c2b-7109-22f9-fb86-0088ad1298f6.png)


フローが指示する通りにやっていけば特に問題なくセットアップ完了(５分くらい)。
Boltクラウドの自分のアカウントとBolt本体を紐づけます。
Wifiの設定もスマホアプリから簡単にできるので楽ちんです。

# 基本のLチカ

これが恐ろしく簡単でした。
既にAPIが用意されております。

```
https://cloud.boltiot.com/remote/{APIキー}/digitalWrite?pin=0&state=HIGH&deviceName={デバイスID}
```

１分くらいでできました:upside_down:

<img width="50%" alt="IMG_0001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/71518/57f78539-a1f0-e493-f345-e2b31fe3f925.jpeg" width="50%">

pin: 電流を流すピン
state： ON(HIGH)かOFF(LOW)

で、指定したピンに電流を流すという命令をしているようです。
I/Fはかなりわかりやすいですね。
ハードはからっきしなWebエンジニアでも、REST APIさえあれば余裕！

(注：本来は抵抗を挟むべきだそうですが、わかりやすくデモの通りにやっています）

その他のAPIはこちらに記載があります。
https://docs.boltiot.com/docs/introduction

## Boltでできること

#### センサーで記録したデータの可視化

[Light Monitoring for Plants using Bolt(ボルトを用いた植物の光モニタリング)](https://docs.boltiot.com/v1.0/docs/getting-started-with-bolt-light-monitoring-for-plants)

1. 指示通りに組み立てます
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/71518/c3be5f81-3913-2748-5d6a-747c85929c71.jpeg">

1. Productsを作成し、A0ピンからの入力値をグラフにプロットするコードを書きます

<img width="80%" alt="スクリーンショット 2018-12-10 0.20.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/71518/922dbed0-b095-aa18-7c56-9c4e1df8431c.png">
<img width="80%" alt="スクリーンショット 2018-12-10 0.20.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/71518/bc34940d-7b24-2cdf-dca4-972f3408ad89.png">

1. Bolt本体にProductsをdeploy(ボタン一発ワンタッチ)

Productsを紐付けるデバイスを選択
<img width="50%" alt="スクリーンショット 2018-12-10 0.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/71518/7f883faf-dc13-bf41-b4e5-22682b0b0063.png">

1. できた :relaxed:

<img width="80%" alt="スクリーンショット 2018-12-04 22.58.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/71518/bd15d0ec-6a4d-34e4-95ff-2ed91bb1f486.png">

（凹んでるのは、光を遮ったタイミングです)
アナログピンでは５分おきにモニタリングできます。（GPIOではTrigger=検知時？にできるらしい)

Raspberry PiやArduinoでも、[Blynk](https://www.blynk.cc/) というアプリで同じようなこと（APIの提供や可視化など）ができるようです。


#### 作れるプロダクトの種類

入力・出力・入出力デバイス いずれにも対応しています。
センサー探知した情報をトリガーにSlackを送ったり、
サーバーのアラートメールをIFTTTのWebhookでBolt APIにつないで
LEDへ出力してやれば、お気軽可視化ツールが作れますね。

#### Integromatにも対応

[Integromat](https://www.integromat.com/en/integrations/bolt-iot)※のワークフローに組み込む事ができます。
もはやプログラミングさえいらない手軽さです。
※IFTTTやZapierのようにwebサービスを使った自動ワークフローを作るためのサービス

#### コミュニティもある

https://www.hackster.io/bolt/projects

色んな人がBoltで作った作品が見られます（まだそんなに多くはないです）

# まとめ

IoT初心者がつまづきやすそうなポイントが見事なまでに回避されているので
「IoTやってみたいな…でもハードとか全然わからんし…(´・ω・`)」という超初心者の導入にはピッタリだと思いました。

より凝ったことをするには電子工作の知識が不可欠ですが、
まずはつまずかずに導入できたので、これを足がかりに少ーしずつハードの世界を覗いてみたいと思います:relaxed:
PM2でnpm startする.

やりたいこと
==============================

PM2でNode.jsアプリケーションを永続化する. 特にnpm startするようなアプリケーションを対象にする.

やりかた
==============================

## 環境

```bash
$ node -v
v9.7.1
$ npm -v
5.6.0
```

## PM2をインストール

```bash
$ npm install -g pm2
```

## アプリケーションの起動
アプリケーションのルートディレクトリで実行する.
your-app-nameは表示名なのでなんでもいい.

```bash
$ pm2 start npm --name your-app-name -- start
```

## アプリケーションの確認
```bash
$ pm2 list
```

## アプリケーションの停止
```bash
# プロセスidを指定
$ pm2 stop 0

# 全てのプロセスを停止
$ pm2 stop all
```

## アプリケーションの再起動
```bash
# プロセスidを指定
$ pm2 restart 0

# 全てのプロセスを再起動
$ pm2 restart all
```
素人だけど愛さえあればTEIについてお話しても関係ないよねっ

まじめに論文調に書こうと思ったけど、悪ふざけしないと死んじゃう病にかかったので、タイトルはパロディで。

#TEIっていったい？

そもそもTEIって聞いたことがある人は日本には少ないような気がします。
正式名称は"Text Encoding Initiative"です。

ということで調べてみた。
![qiita_study.PNG](https://qiita-image-store.s3.amazonaws.com/0/318745/379dca3c-8410-0539-575a-a3bf2a31aee7.png)

まず一致しないよね。

![google_study.PNG](https://qiita-image-store.s3.amazonaws.com/0/318745/03159382-fdc8-9e76-6f56-0f6bc11eea70.png)
Googleだとjapan入れて120万件。

割と該当するページは多そうだけど、ほとんど英語サイトなんですよねー
個人的にはもう少し広がってほしい話ではあるので、ここでちょっとだけ検索数に貢献していきます。


#Text Encoding Initiative
直訳すれば「文書記号化戦略」。
そのまんまだけれども、おおよそイメージしやすいのかなとは思います。
一般には文書をxmlに沿って記録しようという流れのことです。
デジタルヒューマニティーズ、デジタルヒストリーなどの進展もあって、歴史文書での応用が期待されます。

例1）[Models of Japanese Texts and TEI](http://21dzk.l.u-tokyo.ac.jp/DHI/index.php?teijpsig)
例2）[Introduction to TEI in Japanese　日本語によるTEI入門](https://tei2018.dhii.asia/teijp_ws)

まぁ読んでも分からないですね。
なので、以下に実際にTEIの基準を使っていろいろ書いてみるというのが今回の主題になります
ただxmlはおろかプログラミングすら3か月前に始めただけなので、知識ないです。
リファレンスも英語なので、、、正確性については察してください。

公式リファレンス⇒[Text Encoding Initiative](http://www.tei-c.org/)


##TEI①　～やはり俺の青春ラブコメはまちがっている。～

```xml
<publicationStmt>
	<authority>Watari Wataru</authority>
	<publisher>Shogakukan</publisher>
	<pubPlace>Tokyo, JA</pubPlace>
	<date when=2011/>
	<ptr target="https://www.shogakukan.co.jp/books/09451262"/>
	<idno type="ISBN">978-4-09-451262-5</idno>
</publicationStmt>
```
こんな感じ。
関係ないけど、俺ガイル13巻、貴いですね。
本来は手書き文書の古典籍に用いるものなので、あんまり有用な感じはしないけど、書籍情報をフォーマット統一させることで、解析しやすくしようという流れですね。

##TEI②　～九州考古学 第92号～
```xml
<publicationStmt>
	<publisher>The Archaeological Society of Kyushu</publisher>
	<pubPlace>Fukuoka, JA</pubPlace>
	<date when=2017/>
	<idno type="ISSN">0387-7078</idno>
</publicarionStmt>
<typeDesc>
	<summary>
		<p>This journal was written by 15 people</p>
	</summary>
	<typeNote>
		<p>Printed in general paper with Japanese</p>
	<typeNote>
</typeDesc>
```
こんな感じ。

###簡単に解説
自己流だけど
publicationStmt ... 書籍情報
publisher ... 出版社、出版者（古文書では個人名が普通）
pubPlace ... 出版された場所
date ... 出版年
idno ... 書籍ID、ISSNだったりISBNだったりをtypeで指定。
typeDesc ... 書籍コンテンツ情報
summary ... 概要。ここは中身自由な感じ。
typeNote ... どこに何で記されたか、多くはantiqua typeface（古い活版印刷）とか記される。
p ... 散文。HTMLのpと同じ感じ

#まとめ
TEIって拡張性かなり高いです。。。
個人的に興味ある分野は歴史なので
history ... 歴史手書き文書
origin ... 文書の出自
provenance ... 文書の入手するまでの歴史的経過
acquisition ... その文書を手に入れた経緯
とかも規定があります。
たぶん先に挙げた延喜式のTEI化もこのあたりを利用しているのではと思います。
今から発表が楽しみですね。

###参考
[TEI2018 in Asia](https://tei2018.dhii.asia/)
[Text Encoding Initiative](http://www.tei-c.org/)
[Models of Japanese Texts and TEI](http://21dzk.l.u-tokyo.ac.jp/DHI/index.php?teijpsig)

[やはり俺の青春ラブコメはまちがっている。](https://www.shogakukan.co.jp/books/09451262)
[お兄ちゃんだけど愛さえあれば関係ないよねっ](https://mfbunkoj.jp/product/oniai/201216029883.html)

後藤真,2016,「総合資料学のための資料情報共有手法の構築にむけて」,『人文科学とコンピュータシンポジウム』
合成数列の和 in Haskell

[合成数列の和 Advent Calendar](https://qiita.com/advent-calendar/2018/composite-number)に、Haskellで参加してみました。

## Haskellを選んだ経緯

少し前の日にC++版を上げましたが、いっときはテンプレートメタプログラミングを考えていました。ただ、書こうとしてのあまりのやりづらさに、結局「これで苦しむぐらいなら、同じく純粋関数型のHaskellで書いたほうがいい」という考えに至り、Haskellで書いてみることとしました。

とはいえ、Haskellでコードを書くのは初めてなので、すごいH本を片手に進めていくこととしました。

## まずはコード

```haskell
dividors :: [Int]
dividors = [2] ++ iterate (+2) 3

target :: Int -> [Int]
target x = takeWhile (\k -> k * k <= x) dividors

isComposite :: Int -> Bool
isComposite x = any (\k -> x `mod` k == 0) (target x)

composites :: [Int]
composites = [x | x <- [4, 5..], isComposite x]

compositeSum :: Int -> Int
compositeSum cnt = sum $ take cnt composites

main = do
    num <- readLn :: IO Int
    putStrLn $ show $ compositeSum num
```

[Wandboxで動作確認](https://wandbox.org/permlink/bD60Rxz1cIRVDT03)

## 解説

### 無限リスト

Haskellは遅延評価なので、無限個のリストも扱うことができます。`iterate (+2) 3`で3から始まる無限の奇数列を作って、先頭に2を追加して試し割りするリストを作っておきます（素数列を作ればいいのですが、ぱっとそこまでたどり着くことはできませんでした）。

そして、`target`で必要な分（平方根まで）を切り出しています。

### リスト内包表記

`[x | x <- [4, 5..], isComposite x]`という短い式ですが、これだけで「4以上の整数から合成数だけ抜き出す」という意味になります。そして、この結果も無限リストのままなので、いくつでも必要なだけ抽出できます。

### `do`記法

Haskellは純粋関数型言語である以上、そのまま入出力を扱うことはできません。モナドという仕組みを介しているのですが、`do`記法はそれを命令形言語のような見た目で書くことを可能としています。

## おわりに

Haskellは初心者なので、改善点などありましたらコメントをいただければと思います。
プロパティ設定だけ有効化できる igx-grid の基本機能さまざま

*2018/12/10(Mon) 時点の情報に基づいています*

igx-grid には様々な機能があります。

その中でも、プロパティ設定、つまり、html テンプレート側の設定だけで、すぐに有効化できる基本的な機能について紹介したいと思います。

## まずはデモをどうぞ
実際にデモを作ってみたのでぜひ見てみてください。
https://stackblitz.com/edit/igx-grid-basic-features
※ 残念ながら StackBlitz の問題で IE11 では正常に表示できないのであしからず。

## `igx-grid` レベルのプロパティでONにできる機能

|機能  |プロパティ  |
|---|---|
|1. ツールバー表示|[showToolbar]="true"|
|2. 列非表示|[columnHiding]="true"<br>[columnHidingTitle]="'非表示'"|
|3. 列固定|[columnPinning]="true"<br>[columnPinningTitle]="'固定'"|
|エクスポート<br>4. Excelエクスポート<br><br>5. CSVエクスポート<br><br>|[exportText]="' Export'"<br>[exportExcel]="true"<br>[exportExcelText]="'Excel'"<br>[exportCsv]="true"<br>[exportCsvText]="'CSV'"|
|6. フィルタリング|[allowFiltering]="true"|
|7. 行選択|[rowSelectable]="true"|
|8. ページング|[paging]="true"<br>[perPage]="100"|

ソースコードにするとこのようになります。

```html:app.component.html
  <igx-grid [data]="data"
            [showToolbar]="true"
            [columnHiding]="true"
            [hiddenColumnsText]="'hidden'"
            [columnPinning]="true"
            [pinnedColumnsText]="'pinned'"
            [exportText]="'Export'"
            [exportExcel]="true"
            [exportExcelText]="'Excel'"
            [exportCsv]="true"
            [exportCsvText]="'CSV'"
            [allowFiltering]="true"
            [rowSelectable]="true"
            [paging]="true"
            [perPage]="100">
    ...
  </igx-grid>
```

画像で表すとこのようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/6090aacd-98e0-fa6d-b2b8-727712f89c2f.png)

## `igx-column` レベルのプロパティでONにできる機能

|機能  |プロパティ  |
|---|---|
|9. 列の編集|[editable]="true"
|10. 列のフィルタリング|[filterable]="true"|
|11. 列のグルーピング|[groupable]="true"|
|12. 列のサマリー|[hasSummary]="true"|
|13. 列の移動|[movable]="true"|
|14. 列のリサイズ|[resizable]="true"|
|15. 列のソーティング|[sortable]="true"|

ソースコードにするとこのようになります。

```html:app.component.html
    <igx-column *ngFor="let column of columns"
                [field]="column.field"
                [header]="column.header"
                [dataType]="column.dataType"
                [width]="column.width"
                [editable]="true"
                [filterable]="true"
                [groupable]="true"
                [hasSummary]="true"
                [movable]="true"
                [resizable]="true"
                [sortable]="true">
    </igx-column>
```
画像で表すとこのようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/1d548682-9982-aaa0-86a2-4064cd728cbf.png)

## まとめ
ざっと15機能もありました！これら全てを有効化するだけでもかなり高機能なグリッドができあがりました。大半の要件は満たせるのではないでしょうか。

より複雑な設定によって実現可能な機能もまだまだあるので、今後紹介していきたいと思います！



## Ignite UI for Angular が気になった方はこちら
デモサイトで様々なサンプルを試すことができるので色々試してみてください！
https://jp.infragistics.com/products/ignite-ui-angular/angular/components/grid_virtualization.html
【VR学まとめ】1.2 VRの要素と構成

# はじめに

この記事は[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の3日目の記事です。

[バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)の1章「バーチャルリアリティとは」の内容をまとめていきます。
書籍の方も是非ご購入いただいた上でご利用ください。

# 1 バーチャルリアリティとは

## 1.2 VRの要素と構成

簡単に言うと、以下のような要素の組み合わせによって人工的な現実を生成することが出来る

![JPEG image-11A99415FAC3-1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55365/55abb10e-612c-7832-d5f0-74d6bb7a5972.jpeg)
引用元: [バーチャルリアリティ学](https://www.amazon.co.jp/バーチャルリアリティ学-舘-暲/dp/4904490053)

### 1.2.1 VRの基本構成要素

**ディスプレイ**
感覚入力を模擬するための仕組み
モニターという意味でなく、全ての感覚の提示装置として使われる言葉

**入力システム**
運動系を通してユーザからシステムに情報を伝えるための仕組み
通常のコンピュータシステムと異なり、より身体的な要素が要求される

**シミュレーションシステム**
VR世界そのものの構成
リアルタイムシミュレーション

### 1.2.2 VR世界のいろいろ

シミュレーションシステムにはいくつかの状況が考えられる。

100％作り込まれ完結している場合
→シミュレーションゲームなど

現実世界が入り込む場合
→通信回線を通して遠方と繋がる(メディア的な役割)
→ロボットを操作してテレポートしたような感覚を得る(テレイグジスタンス/テレプレゼンス)

計算機世界に接続する場合
→既に存在するデータ世界と複雑に絡み合う

### 1.2.3 VRをどうとらえるか

**AIPキューブ**

MITのD.Zeltzerが提案

![sf-10-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/55365/7e1c27d0-84cc-c457-1b5d-dcdf91a91dd0.jpeg)
引用元: https://www.slideshare.net/Sun_san2160/sf-58416544

究極のVRは3要素をすべて満たす`(1,1,1)`に位置する。

全天球シアター
臨場感はあるが、自立性、対話性がないため、`(0,0,1)`

ゲーム
それぞれを程々に持ち合わせているため、`(0.5,0.5,0.5)`

**ヒューマンインターフェースの観点**

従来: 対話的な関係・第三人称的・メタファ・記号的恣意性
VR: 包括的な関係・第一人称的・身体的

VRの捉え方は多様であり、「インタラクティブなCG」「可視化に注力したシミュレーション技術」など、多面的な見方をするのが良い。

# まとめ

VRといった概念はいくつかの主要な要素があり、しかし様々な捉え方を出来ることが分かりました。

[一人VR技術者認定試験 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vr-engineer)の4日目は[【VR学まとめ】1.3 VRの歴史](https://qiita.com/nkjzm/items/fdee16db7e0314b68fc9)です。
社内プロジェクトで使用している便利なNPMパッケージ

この記事は [Adventure Advent Calendar 2018](https://qiita.com/advent-calendar/2018/adventure) 10日目の記事です。

フロントエンドエンジニアの嶋谷です。

みなさんnpmパッケージ使ってますか?
コマンド一つインストールするだけで使うことができる機能がたくさんあって便利ですよね。
そんなnpmパッケージで僕が携わっているプロジェクトの中で個人的に便利と感じたものをまとめました。

## 内容について
僕が携わっているホテルのプロジェクトではReact + Reduxを使用し、開発環境としてBabel + Webpackの構成で開発しています。
この辺りのパッケージも大変便利ですが、今回は省略して、基本的に有名ではないが便利なパッケージを紹介します。

### [humps](https://github.com/domchristie/humps)
多くの開発の場合、フロントエンドとサーバサイドの開発言語が違うことは当たり前のようにあり、フロントエンドからAPIでデータを取得しようとするとサーバ側開発言語のコーディング規約の事情でスネークケースだったりすることありますよね？
けれどjsの規約であるべきなのはキャメルケース。
そんなときに使えるのがこのhumpsでObjectのキー名をスネークケース→キャメルケースに変換でき、その逆も対応可能です。

<p data-height="265" data-theme-id="0" data-slug-hash="wRvJOK" data-default-tab="js,result" data-user="adv-o-shimaya" data-pen-title="humps demo" class="codepen">See the Pen <a href="https://codepen.io/adv-o-shimaya/pen/wRvJOK/">humps demo</a> by Osamu Shimaya (<a href="https://codepen.io/adv-o-shimaya">@adv-o-shimaya</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### [platform](https://github.com/bestiejs/platform.js/)
UAの判定はサーバサイドでもできますが実装を進めれば進めるほどフロントエンド側でのユーザーエージェントの判定が必要になるということがあると思います。そんなときに使えるのがplatform.jsです。
このライブラリはユーザーエージェントをもとにブラウザやOSの名称をオブジェクトとして返してくれ、ブラウザ個別の処理を書くときに便利です。
<p data-height="265" data-theme-id="0" data-slug-hash="MZWoeR" data-default-tab="js,result" data-user="adv-o-shimaya" data-pen-title="platform demo" class="codepen">See the Pen <a href="https://codepen.io/adv-o-shimaya/pen/MZWoeR/">platform demo</a> by Osamu Shimaya (<a href="https://codepen.io/adv-o-shimaya">@adv-o-shimaya</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### [raven-js](https://github.com/getsentry/sentry-javascript/tree/master/packages/raven-js)
これはフロントエンドでも使えるログ収集サービスのSentryで使うパッケージです。
[raven-for-redux](https://github.com/captbaritone/raven-for-redux)と一緒に使っており、チェックが漏れてしまったバグもキャッチしてくれるので問題を見つけるまでの流れが非常にスムーズになります。

### [redux-persist](https://github.com/rt2zz/redux-persist)
ホテルのプロジェクトではreact + reduxの構成で実装していますが、この中で厄介なのが画面の再読込が行われると中で保持したデータが消えてしまうことです。そこで使えるのがredux-persistです。これはActionで実行した内容をローカルストレージに都度保存して、再読込の際にstateを読み込むことができる機能です。なお、ローカルストレージ以外にもセッションストレージやLocalForageのようなライブラリも記録に使えます。

### [prettier](https://github.com/prettier/prettier)
このパッケージだけはものすごく便利なので挙げさせてください。コードのフォーマットをするパッケージです。
従来のlintでは構文の誤りやルール違反は指摘してくれましたが、インデントや改行までは教えてくれませんでした。しかしprettierを使うことによってそれが解決されました。ルールを設定すれば誰が書いても同じコードをかけるようになり、特にReactの環境ではjsのコードだけではなくjsx(≒reactのhtml)に関わる部分も自動でインデントしてくれることが、開発上非常に効率的です。VSCodeやSublimeなどのエディタ用のプラグインもあり、ファイルを保存するだけで整形することもでき大変便利です。

## 最後に

npmパッケージのようにOSSのライブラリを使うと時間や人手が少ないような状況でもスムーズに開発を進めることができるため大変便利です。
一方で更新がアクティブではない、ライブラリに依存しすぎて開発の柔軟性がなくなるといった問題もあります、実際にプロジェクトに導入する場合、ベストかどうか検討してみてください。

=======

株式会社アドベンチャーではフロントエンドエンジニアの募集をしています。
興味がありましたらぜひ応募してくださいね。

https://www.green-japan.com/job/43286
DualSPHysicsのインストールとExampleの実行

オープンCAEシンポジウムで見たDualSPHysicsの計算がかっこよかったので、インストールとExampleの実行までやってみた。環境はWindows10です。

# ファイルのダウンロード
公式サイトは改ざんの疑いがあるとかGoogleさんが言うので、Githubからコード一式を持ってくる。

https://github.com/DualSPHysics/DualSPHysics


# インストール
Githubから持ってきたときのフォルダ構成次のような感じ。

![222650.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/bbf62172-c34d-377e-d0e8-7c2422baf04a.jpeg)

bin\windowsを見るとexeファイルがあるので、コンパイル等はいらないように見える。

# Exampleの実行
GithubにあるDualSPHysicsはExampleがダムブレイクしかない。examples\main\01_DamBreakの中身を次に示す。

![コメント 2018-12-10 223120.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/abfaeb69-cabf-9c91-314d-6033f490e77b.jpeg)

雰囲気で言うと、Command Promptのショートカットをクリックして、batを叩けばいいように見えた。とりあえずCommand Promptを起動して、負荷の軽そうな「wCaseDambreakVal2D_win64_CPU.bat」を実行した。

実行すると「CaseDambreakVal2D_out」というフォルダができ、中にデータが出力されていることが確認できる。

![コメント 2018-12-10 223555.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/12357197-62b1-3a2f-fdfd-929568407056.jpeg)

途中でノートン先生がexeファイルを停止したりしてひと悶着あったが、処理が終了したので、キーを押して終了した。

![コメント 2018-12-10 224948.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/c1cc47e6-1b23-0545-58b5-767017b85cc3.jpeg)


# 結果の確認
CaseDambreakVal2D_outフォルダを見ると、いくつかフォルダが作成されており、粒子のvtkファイルがありそうなparticlesフォルダから「PartFluid_～」の名前のファイルをすべて選択してParaViewで読み込む。

向きを変更し、動画を再生した。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130772/9d76d567-e88d-81f6-a44f-8b3bc4fbed9b.png)

# まとめ
公式ページからダウンロードできるバージョンのDualSPHysicsはExampleの量が多いようなので、サンプルが欲しい場合は公式ページからダウンロードした方がよさそう。ただし、Google先生の言葉を信じるのであれば、自己責任で踏みに行く必要がある。