OmniAICreator/Qiita-1.07M huggingface dataset:
Modern OpenGLとは

# OpenGLとは
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130343233342f34623466613737662d663666332d346431382d363266622d3135303062383766613561362e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/104234/11b749a3-c14f-c417-65fa-e6a31f9596a2.png)



　プログラムからグラフィックスハードウェアを制御するために使用するアプリケーションプログラムインタフェース (API) のひとつ。 [クロノスグループ](https://jp.khronos.org/) が策定をしており、現在の最新バージョンは4.6である。
　
　Windows, Mac OS, Linux, BSD等の様々なOSの上で利用可能。個人でも無料のソフトウェア群のみでGPUの能力を最大限に利用できる3Dプログラミング環境を整備できる。家庭用・業務用問わず広く普及している。
OpenGL以外には、後継のVulkan、AppleのMetal、MicroSoftのDirect Xなどが存在する。




## OpenGLファミリー
　OpenGLには派生形として以下の3つが存在する。

||用途|
|:-----------|:------------:|
| ![download.png](https://qiita-image-store.s3.amazonaws.com/0/104234/1f642c36-4229-19fd-f8df-bb38f93d4b0d.png)|組込系や携帯デバイス|  |
|![OpenGL_SC_logo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/104234/cb50b1a7-8386-ceb1-df91-234a72081550.png)|航空電子機器、工業、軍事、医療などセーフティクリティカルな現場|
|![1200px-WebGL_Logo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/104234/4485439e-08eb-88ae-8269-12cad1d3549e.png)| Webブラウザ、HTML5のcanvas要素を通じて、JacaScriptで利用できるグラフィックスAPIのWeb標準。|



## 3.X以降のOpenGL
　OpenGLにおける特異点が3.0。
2008年に公開されたOpenGL 3.0では、肥大化したAPIを整理するため、**2.X以前を切り捨てる大幅なアップデートが行われた。**その後、徐々に後方互換をなくし、3.1からは、Vertex ShaderとFragment Shaderが必須となった。3.2でGeometry Shaderのサポート。4.X系からは、Tesselation ShaderやCompute Shader、Transform FeedBackなどが利用可能になり、よりプログラマブルかつ柔軟に進化している。


**2.Xから3.X以降への大きな変化。**

* 固定機能パイプライン、イミディエイトモードを廃止に
* 多くのOpenGL関数が非推奨に
* Vertex ShaderとFragment Shaderが必須に


# 依然として残る問題。解決策としてのVulkan

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130343233342f34383762323836642d346166642d666537352d353666652d6638626638346637616331322e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/104234/e5ae9233-fbba-89a4-fdaf-e1c939560c8b.png)


　OpenGLの次世代APIとして、VulkanがSIGGRAPH 2014にて発表された。
これは、3.X系で後方互換を切ったが、**それでも残る1.Xや2.X時代の設計を刷新しようというねらいがある。**
OpenGLよりもローレベルな制御が可能で、OpenGLでは不可能だったマルチスレッドに対応している。
ちなみにopenFrameworksにはVulkanのフォークがある。
https://github.com/openframeworks-vk/openFrameworks



# まとめ

* OpenGLは、WIndows、Mac、Linux上で動作し、多くの場面で活躍している。
* OpenGLは3.0で後方互換を切り捨てた設計に変化した。
* しかし、以前残るレガシーな設計を刷新すべく次世代APiであるVulkanが発表された。
* 現在もバージョンアップを重ねより便利なAPIに進化している。
【準備編】Pythonで形態素解析を行う

こんにちは、ディレクターのJackです。
昨日の告知記事に引き続き、LIG Advent Calendar 2日目の記事を担当します！
https://qiita.com/advent-calendar/2017/lig

本日、明日でPythonで形態素解析を行うスクリプトを開発したいと思います。本日は準備編ということで、下記内容をお話できればと思います。

* 形態素解析とは？
* 必要ライブラリのインストールに関して
* Pythonインタプリタでの実行

# 形態素解析とは?
はじめに、形態素解析について簡単に整理します。形態素解析とは、自然言語処理の分野のひとつで、自然言語によって構成された文章から、文法や単語の品詞等が登録された辞書データに基づき「形態素」に分割し、各形態素の品詞を判別することです。

自然言語って何それ？と思った方もいるかと思いますが、難しく考える必要はありません。普段我々が日常に利用している言語、そう英語や日本語のことを自然言語と呼びます。また、形態素とは、言語で意味を持つ最小単位となります。

## 形態素解析の例
さっそくですが、形態素解析の例を下記に記載します。言葉での説明よりも、実際にコマンドを叩いて結果を見た方が分かりやすいですよね。
今回は、みんな大好きなMeCabを利用したいと思います。

### MeCabとは？
あまりに有名すぎて説明不要かもしれませんが、MeCabとは日本語形態素解析システムです。
詳細は、下記リンクに記載されています！

▼形態素解析システム MeCab
https://www.mlab.im.dendai.ac.jp/~yamada/ir/MorphologicalAnalyzer/MeCab.html

## 早速、試してみる
例えば、「LIG Advent Calendar 2日目です！」という文字列を形態素解析システムMeCabにかけると下記のような結果が出力されます。

```zsh
% mecab
LIG Advent Calendar 2日目です！
LIG	名詞,固有名詞,組織,*,*,*,*
Advent	名詞,一般,*,*,*,*,*
Calendar	名詞,一般,*,*,*,*,*
2	名詞,数,*,*,*,*,*
日	名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
目	名詞,接尾,一般,*,*,*,目,メ,メ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
！	記号,一般,*,*,*,*,！,！,！
EOS
```

「LIG」という形態素は「名詞」と判別され、「です」という形態素は「助動詞」と判別されています。
さて、ここまでざっくりではありますが、形態素解析の簡単な説明をさせていただきました。
次に、Pythonで形態素解析を行う際に必要なライブラリのインストールを行いたいと思います。

# 必要ライブラリをインストールする
今回は、上述ではありまが、MeCabを利用して形態素解析を行いたいと思います。

## MeCabをインストールする
brewを利用しインストールします。下記コマンドで簡単にインストールする事ができます。

```zsh
% brew install mecab-ipadic
```

これで、`mecab` コマンドを利用できるようになりました。改めてコマンドを実行してみましょう。
「今日は良い天気ですね！」という文字列を入力してみます。

```zsh
% mecab
今日は良い天気ですね！
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
良い	形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
天気	名詞,一般,*,*,*,*,天気,テンキ,テンキ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
！	記号,一般,*,*,*,*,！,！,！
EOS
```

次に、PythonでMeCabを利用できるようにします。

## mecab-python3をインストールする
`mecab-python3` ですが、`pip`コマンドでインストールする事ができます。

```zsh
% pip install mecab-python3
```

実際にPythonインタプリタ上でMeCabを実行してみましょう。

```zsh
% python
Python 3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> m = MeCab.Tagger()
>>> text = "今日は良い天気ですね！"
>>> print(m.parse(text))
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
良い	形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
天気	名詞,一般,*,*,*,*,天気,テンキ,テンキ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
！	記号,一般,*,*,*,*,！,！,！
EOS

>>>
```
`text` という変数に文字列「今日は良い天気ですね！」を代入し、形態素解析を実行したスクリプトを記載しました。
Pythonでも簡単にMeCabを実行する事ができました。

次回は、もう少し踏み込んで、LIGブログの特定記事の形態素解析を行ってみたいと思います。
2日目終了！それでは！
審査なしでiOSアプリのアイコンを変更する方法

## はじめに
アプリ内でアイコンを変更する機能を試したのでメモです。
期間限定でアイコンを変更したい場合などに使えそうです。

## 注意1
iOS10.3から使用可能な機能です。
それ以前のiOSをサポートしている場合は`if #available(iOS 10.3, *) {`とする必要があります。

## 注意2
アイコンを変更するとアラートが出ます。
<img width="150" alt="IMG_3456.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/89206/ea6e00eb-0cb1-86e2-6ebd-6819ce937b44.png">

##やり方
###アイコンの追加
Assets.xcassetsではなく直接追加する必要があります。
60×60の`@2x`と`@3x`を用意してください。

<img width="269" alt="スクリーンショット 2017-11-30 21.26.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/49313808-8ae0-a04b-a138-0f97746fcd81.png">

###Info.plist
下記のようにCFBundleIconsを追加します。

```
	<key>CFBundleIcons</key>
	<dict>
		<key>CFBundleAlternateIcons</key>
		<dict>
			<key>redIcon60</key>
			<dict>
				<key>CFBundleIconFiles</key>
				<array>
					<string>redIcon60</string>
				</array>
				<key>UIPrerenderedIcon</key>
				<false/>
			</dict>
		</dict>
	</dict>
```

Source Code
<img width="416" alt="スクリーンショット 2017-11-30 21.13.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/86374264-ab9d-e363-bb6a-160b86d7d180.png">

Property List
<img width="870" alt="スクリーンショット 2017-11-30 21.12.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/b6033275-f6e5-2ce3-8a0d-0a2fe5d6c948.png">

## コード
下記のようなコードを書きます。
※変更後にアラートが出ます。

```ruby:デフォルトのアイコンに戻す
UIApplication.shared.setAlternateIconName(nil, completionHandler: nil)
```

```ruby:指定した画像ファイルに変更する
UIApplication.shared.setAlternateIconName("redIcon60", completionHandler: nil)
```


##GitHub
https://github.com/hideyukitone/IconChangeSample

##参考
https://www.gaprot.jp/pickup/ios10/alternate-icons
Windows 無線LANでSSIDが表示されない




# 概要

会社のWindows端末で、常時接続していた無線LANのSSIDが突如見えなくなり、
ネットワークに接続できなくなる事象が発生しました。。。
分かれば簡単なのですが、結構はまったのでメモしておきます...。

# SSIDのパラメータが「nonBroadcast=yes」かどうか

結局、会社のアクセスポイントでブロードキャストを行わない設定に変更したとのことで、
端末側の無線LANプロファイルで接続しにいかないようになっていたのでした...。

その設定をGUIで行うには、無線LANの新規設定でしか出来ないようなので、
以下netshコマンドで「nonBroadcast=yes」　＝　「ネットワークがブロードキャストを行っていない場合でも接続する」
のチェックを追加してあげることで、無事SSIDがネットワーク一覧に表示され、接続できたのでした...。

`netsh wlan set profileparameter name="(プロファイル名)" nonBroadcast=yes`

# 最後に

普段意識していないとすぐに気づけないですね。。。

# 参考URL
[無線LAN設定　SSIDの削除をしたい](https://social.technet.microsoft.com/Forums/windows/ja-JP/83a1716d-fc09-41e3-8abf-0da59b42ec8f/lan-ssid?forum=w8itpro)
使えるシェルコマンド

# プロセスkill
```bash
ps aux | grep <keyword> | grep -v grep | awk '{ print "kill -9", $2 }' | sh
```

# ssh host 削除
```bash
 ssh-keygen -R <IP/host_name>
```
 - [参考したqiita](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)

# scp コマンド
```bash:サーバーへアップロード
scp -i <ssh private file> -r <local dir/file> <user>@<remote server>:<remote dir/file>
```
```bash:サーバーからダウンロード
scp -i <ssh private file> -r <user>@<remote server>:<remote dir/file> <local dir/file>
```

 - [参考したqiita](https://qiita.com/katsukii/items/225cd3de6d3d06a9abcb)
Jupyter NotebookでJubatusを試す

# 

Jubatusという機械学習フレームワークはフロー型、つまり次々と流れてくるデータを、逐次的に学習と分析できるという特徴があります。コードを書いては試せるJupyter Notebookと相性が良さそうかなということで、ちょっと書いてみます。

Jubatusで戦国武将の名前を学習させ、徳川家か足利家かを予測するサンプルをJupyterで動かしてみましょう。

http://jubat.us/ja/overview/feature.html

ちなみに私は下記を参考にMac上にVagrantでCentOS7.2を入れて使っています。
https://qiita.com/RyochanUedasan/items/b1ff13bc39913cb5b561

# CentOS7にJupyterをインストール

anacondaを入れれば勝手に入りますが、Macのブラウザ（Chrome)から使えるように、こちらを参考に穴あけをしています。

https://qiita.com/hiroseabook/items/1da01ea439b01c1eb48c

```
sudo yum update -y
wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh
bash ./Anaconda2-5.0.1-Linux-x86_64.sh

mkdir ~/.jupyter
touch ~/.jupyter/jupyter_notebook_config.py
vi ~/.jupyter/jupyter_notebook_config.py
```

```py:jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
```

VagrantfileでJupyter用のポートをフォワードするよう設定しておくと楽ですね。

```ini:Vagrantfile
config.vm.network "forwarded_port", guest: 8888, host: 8888
```


# CentOS7にJubatusをインストール

ほぼ、こちらの手順でRHEL7と読み替えればうまくいくと思います。
http://jubat.us/ja/quickstart.html

一点、Pythonクライアントのインストールに必要なpipはez_setup.pyからではなく　yumで入れたほうが確実です。

```
sudo yum install python-pip
sudo pip install jubatus
```

# githubからJubatus Exampleをcloneし動作確認

```
sudo yum install git
git clone https://github.com/jubatus/jubatus-example.git
```

git cloneが成功したら、shogunを動作確認

https://github.com/jubatus/jubatus-example/tree/master/shogun

# shogunをJupyterに移植

こんな感じでコピペすればOK。

<img width="783" alt="j1.png" src="https://qiita-image-store.s3.amazonaws.com/0/33389/dbcda805-add6-9e93-ad38-b73d068da422.png">

予測するところ（元データは「守時」だった箇所）を書き換えてみました。「晋三」は徳川っぽいのか・・・。

<img width="781" alt="j2.png" src="https://qiita-image-store.s3.amazonaws.com/0/33389/5d4e0085-4189-4847-f79a-427cee341eb7.png">

予測の関数を改造すれば、よりフロー型の機械学習という特徴を味わえそうですね。
CALを消費せずにリモートデバッグを利用する

Windowsの開発者ですと、複数人で開発しているときにWindows端末にリモート接続して開発を行う場面もあるかと思います。
でも、リモートデスクトップには接続数の制限がありますよね。
Windows10だと1人しかアクセスできませんし、Windows Serverだとクライアントアクセスライセンス（CAL）が必要になります。

でも、デバッグするのにCALを使うとかちょっと本末転倒な感じもしますよね。
リモートデバッガを仕込んで動かせば、開発端末からサーバー端末に接続してデバッグなんかも可能ですが、
RDP接続してリモートデバッガ仕込んでも、CALを消費することには変わりありません。

そこで思い立ったのが以下の方法です。

**PowerShell でEnter-PSSessionしてリモートデバッガを動かす**

まあ、それだけなんですけど、やってる人を知らないのでご紹介します。

## リモート接続の設定方法
設定は、 [PowerShellで遠隔操作の準備 - Qiita](https://qiita.com/arachan@github/items/707ba05befb2d5a5a81a) を見ていただけたらわかるのではないでしょうか。
接続先で Enable-PSRemoting する感じ。

で、接続する方は

` PS > Enter-PSSession コンピュータ名 -Credential アカウント `

します。

## リモートデバッガの仕込み方
接続できたら、リモートデバッガを起動します。

`[コンピュータ名]: PS > & '<Visual Studio のインストール ディレクトリ>\Common7\IDE\Remote Debugger\(x64、x86、Appx)\msvsmon.exe' /nofirewallwarn`

です。
コマンド自体は[リモート デバッグ - MSDN - Microsoft](https://msdn.microsoft.com/ja-jp/library/y7f5zaaa.aspx) から引用しただけですが、ポイントは
` /nofirewallwarn `
です。
環境によってオプションは変わるかと思います。

一度リモートデスクトップ上でリモートデバッガを起動させればわかりますが、
いろいろと確認ダイアログが表示されます。
**ダイアログが表示されてしまうとリモートデバッガが開始されません**。
ここを探るのが難しいところですね。

で、別のPowerShellでEnter-PSSessionして
`[コンピュータ名]: PS > Get-Process `
すると、

```
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   SI ProcessName
-------  ------    -----      ----- -----   ------     --   -- -----------
（略）
    112       9     1616       5296    40     0.03   3760    0 msvsmon
    117      10     1532       4936    40     0.02   4600    0 msvsmon
    146      13     2988       9816    86     0.06   6600    0 msvsmon
```
と、Session IDが0でリモートデバッガが起動されます。便利！
リモート接続してデバッガを起動するとSession IDは1とか2とか3とかになるはずです。

あ、ちなみにPowerShellのバージョンが古いとSIが表示されないと思います。
その場合は、

`[コンピュータ名]: PS > Get-Process | Where-Object -FilterScript {$_.SessionId -eq 0} `

とかやれば、Session ID 0のものだけを表示できるので、msvsmonを確認することが出来ると思います。

動かない場合もあったり、微妙にグレーな気もしたりしますが、
デバッグスキルはとても大事なので頑張りたいですね！
はじめよう Galaxy！

さて、いよいよ Galaxy Advent Calendar 2017 が始まりました。今月は今までにないくらい多くの「Galaxy」情報を日本語で得られることでしょう。とても楽しみです！

それでは**「Galaxy」とは何か** から話します。スマホではありません。スマホより昔からあります。

データを分析するとき、多くの人は３つの選択肢を考えます。Excel を使うか、プログラムを書くか、誰かにやってもらうかです。でも、最近多いのは「Excel にはデータが大きすぎるけど、プログラムは書きたくない、そもそも書けない、誰も書いてくれない」という状況です。

そこで登場するのが **みんなの Galaxy** です。

Galaxy は誰でもウェブ上で使えて、サイズの大きなデータをシェアできて、いろいろなデータ分析のツールをその上で実行することができます。プログラムが書けなくても使えます。下図のようなイメージです。

<img width="663" alt="スクリーンショット 2017-11-30 21.21.05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/191970/8a6c14b0-c41b-05ba-b72b-d66f08810a1c.jpeg">

Galaxy はいろいろな分析ツールを動かすためのプラットフォームというわけです。

[https://usegalaxy.org/](https://usegalaxy.org/) からアクセスしてください。実際には、次のような画面で操作します。

![スクリーンショット 2017-11-30 20.55.07.jpg](https://qiita-image-store.s3.amazonaws.com/0/191970/f2d6f83f-fea4-7561-6044-58aefaf3365f.jpeg)

左に並んでいるのがツールたち。真ん中のパネルでツールを操作すると、、、右側に結果が出てきます。

それでは次回から、実際の使い方を説明します。
PHP初心者　学習のポイント

# PHPの学習のポイント
PHPの学習のポイントは、他の言語と異なる部分をしっかりと理解すること。
他の言語と異なる部分は、大きく分けて3つ

- 変数は'$'を使って表現
- 連想配列の概念
- foreach()の存在

## 変数は'$'を使って表現するところ
bashなどのシェルスクリプトの言語触った方なら抵抗は、ないかもだけど
シェルスクリプトとは、若干違う。

ex)変数valueに'hello'を入れて出力

```bash:shell
value = 'hello'
echo $value
```

```php:php
$value = 'hello';
echo $value;
```
一つ言えるのは、やっぱり型の宣言いらないインタプリンタのスクリプト言語は楽ちん。
でも他のスクリプト言語と違って語尾の';'いるから気をつけよう。
## 連想配列の概念
簡単に言えば、
配列のボックスに名前をつける

```php:php
$user = array(
        'name'   => '田中太郎',
        'age'    => 24,
        'gender' => 'male'
      );
echo $user['name'];  //結果　田中太郎

```
他の言語に配列に名前をつけたりなんて珍しい
でもなれるといい感じ。
## foreach()の存在
<details><summary>foreach()とは</summary>
一般的な関数のfor()と
配列を進めるeach()という関数の合体版である。

```
foreach({配列名} as $key => $value)
```
</details>

```php:php
    $scores = array('数学' => 70, '英語' => 90, '国語' => 80);

    foreach($scores as $key => $value){
      echo $key.'は'.$value.'点。'; 
　　　 //結果 数学は70点。英語は90点。国語は80点。
    }
```
### まとめ
　PHPの基本的な記述で他の言語と異なる部分は、このような感じ。
PHPだけできる人はバカにされる。と言われているほどプログラミング言語の中では
簡単な部類に入るらしい。
しかし、web系で非常に便利だしPDOを使えばどんなDBも同じ命令文の記述で扱える非常に有能な言語。この記事がPHPを学ぶモチベーションに繋がれば良いな。
libcidr を macOS でビルドする

# libcidr とは
https://www.over-yonder.net/~fullermd/projects/libcidr/docs/1.2/libcidr-big.html

# 環境
- macOS 10.13.1

# GNU Make 4.2.1 のインストール
`brew install make`

# Makefile を修正する
以下のファイルの `-soname` を `-install_name` に、`-shared` を `-dynamiclib` に、拡張子 `.so` を `.dylib` に変更する。

```
src/GNUmakefile.inc
src/Makefile.inc
```

差分は次のとおり。

```diff
diff --git a/src/GNUmakefile.inc b/src/GNUmakefile.inc
index 4df45d7..f2019ac 100644
--- a/src/GNUmakefile.inc
+++ b/src/GNUmakefile.inc
@@ -49,7 +49,7 @@ def: all

 ${SHLIB_NAME}: ${SO_FILES}
        @echo Linking ${SHLIB_NAME}...
-       ${CC} -shared -Wl,-x -o ${@} -Wl,-soname,${SHLIB_NAME} \
+       ${CC} -dynamiclib -Wl,-x -o ${@} -Wl,-install_name,${SHLIB_NAME} \
                        `${LORDER} ${SO_FILES} | ${TSORT}`
        ${LN} -sf ${SHLIB_NAME} ${SHLIB_LINK}

@@ -74,7 +74,7 @@ ifdef PROGNAME
 # These paths wind up relative to src/{test,examples}/*
 CFLAGS += -I../../../include
 L_FLAGS += -g -pipe -L../..
-LCIDR = ../../libcidr.so
+LCIDR = ../../libcidr.dylib

 CLEAN_FILES = ${O_FILES} ${PROGNAME} *core .depend

@@ -86,4 +86,3 @@ ${PROGNAME}: ${O_FILES} ${LCIDR}
 ${LCIDR}:
        (cd ../.. && make)
 endif
-
diff --git a/src/Makefile.inc b/src/Makefile.inc
index 653357b..f1877a3 100644
--- a/src/Makefile.inc
+++ b/src/Makefile.inc
@@ -45,7 +45,7 @@ def: all

 ${SHLIB_NAME}: ${SO_FILES}
        @echo Linking ${SHLIB_NAME}...
-       ${CC} -shared -Wl,-x -o ${@} -Wl,-soname,${SHLIB_NAME} \
+       ${CC} -dynamiclib -Wl,-x -o ${@} -Wl,-install_name,${SHLIB_NAME} \
                        `${LORDER} ${SO_FILES} | ${TSORT}`
        ${LN} -sf ${SHLIB_NAME} ${SHLIB_LINK}

@@ -70,7 +70,7 @@ clean allclean:
 # These paths wind up relative to src/{test,examples}/*
 CFLAGS += -I../../../include
 L_FLAGS += -g -pipe -L../..
-LCIDR = ../../libcidr.so
+LCIDR = ../../libcidr.dylib

 CLEAN_FILES = ${O_FILES} ${PROGNAME} *core .depend
```

以下のファイルの拡張子 `.so` を `.dylib` に変更する。

```
GNUmakefile.inc
Makefile.inc
```

差分は次のとおり。

```diff
diff --git a/GNUmakefile.inc b/GNUmakefile.inc
index bb0f46b..6076f9d 100644
--- a/GNUmakefile.inc
+++ b/GNUmakefile.inc
@@ -5,8 +5,8 @@

 # Library naming and versioning
 LIB_VERS = 0
-SHLIB_NAME = libcidr.so.${LIB_VERS}
-SHLIB_LINK = libcidr.so
+SHLIB_NAME = libcidr.dylib.${LIB_VERS}
+SHLIB_LINK = libcidr.dylib

 # Define some destination directories
 # Where we think of ourselves as living
diff --git a/Makefile.inc b/Makefile.inc
index 3c44a94..674150d 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -2,8 +2,8 @@

 # Library naming and versioning
 LIB_VERS = 0
-SHLIB_NAME = libcidr.so.${LIB_VERS}
-SHLIB_LINK = libcidr.so
+SHLIB_NAME = libcidr.dylib.${LIB_VERS}
+SHLIB_LINK = libcidr.dylib

 # Define some destination directories
 # Where we think of ourselves as living
```

# ビルド
```
./mkgmake.sh
gmake -f GNUmakefile
```
僕がコードレビューをもらうときに意識していること

## はじめに
[Progate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/progate) 初日の記事です:point_up:
会社もサービスも少しずつ成長してきて、やっとAdvent Calendarがやれるくらいの人数にはなってきました（まだ25人もいないけど）。

この記事では、僕が**コードレビューをもらう時**に意識してる（割と当たり前な）ことをゆるく書きました。
「レビューするコツ」みたいな記事はよく見かけますが、「レビューもらうコツ」はたまにしか見ないので。

ー　ー　ー　ー　ー　ー　ー　ー　ー　ー　ー

コードレビューをする意義として、

- コードの品質の維持（向上）
- 個人の技術力の向上

があるかな、と思います。

1つ目の方はプロジェクトや組織全体に関わる話なので、忘れられず大事にされ続けるケースが多いと思います。

2つ目の方は組織によっては粗末にされがちのようです。
でも個々の成長こそがプロジェクト全体の成長に直結するので、これもまた大事なことです。

僕はコードレビューをしてもらえるときがとても幸せです。
先輩だけでなく、同期や後輩からも様々なレビューをもらえて、自分の技術力の幅を広げることに役立っています。
（以前はエンジニア1人で働いてたこともあったので、尚更ありがたみを感じます。）

今回は自分がコードレビューをもらう時に意識していることが4つくら思いついたので順に書いていきます。

## 1. 自分で自分のコードをレビューする
まずはコードレビューを依頼する前に、自分で一通りちゃんとチェックするようにしています。
その際に特に意識しているのは、

- タイポしてないか
- 明らかに不要なコードがないか

などです。
僕の場合はデバッグ用のブレークポイントや出力をそのまま放置してることが多々あるので。

レビュアーからこれらのようなケアレスミスへの指摘を受けるのは、非常にもったいないと個人的には思ってます。
せっかくのコードレビューなので、もっと重要なところに思う存分時間を使ってもらいたい、というところです。
なので、事前に自分で防ぐ努力はしているつもりです。

あとは似たような話で、Lintやテストは事前に実行して確認するのは忘れずにやりたいですね。
 
## 2. 開発の背景を明記する
新機能の作成・既存システムの改善・バグの修正、など、開発の内容によって様々ではありますが、いずれにしてもその開発を行った背景は存在すると思います。
当たり前なことなのかもしれませんが、その背景をちゃんと書くことを大切にしています。

![スクリーンショット 2017-11-30 21.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/81183/9651058e-1779-4faa-c6e8-21cd8e47e23b.png)

↑ これはかなりシンプルな例ですが、少しでもあるだけで効果は大きいです。

僕が思う、あんまり良くないコードレビューの1つに「コードだけをレビューする」というものがあります。
コードの差分だけをみて、コードの見た目から得られる情報だけをレビューする。
これだけではやっぱり不十分で、どういう経緯でそのコードを書いたのか、みたいな部分までレビューできるのが理想だと思ってます。

これは当然レビュアー側の意識の問題でもあるんですけど、もらう側にもできることはたくさんあると感じています。
深いところまでレビューをもらえるような工夫は積極的にしていくべきだと思います。

## 3. 見てほしい箇所を明記する

例えば50行ある変更の中でも、キモになってる機能や実装に迷った箇所など、特に見てほしい部分はあったりすると思います。

- この関数内のロジックがめっちゃ大事
- テーブル構成がやや不安
- 地味にここの変数名に迷った

プログラミングの力は難題を乗り越えたり、あやふやな点を解決していくことで伸びていくと思ってます。
レビュアーと一緒に今直面している「大事なこと」に集中して向かっていければ成長も加速するはずです。

## 4. 見る必要のない箇所を明記する

先ほどの逆で、見る必要のない箇所があればちゃんと書くようにしてます。

うちの開発体制の場合、ほぼ全ての変更はレビューを受ける必要があることになってます。
ですが、当然あまりレビューが必要ない変更もあります。

- タイポ直しただけ
- 他の場所から移動させただけ
- 誰になんと言われようと明らかに間違ってない（？）

などなど、です。

先日、メンバーのプルリクを眺めていたらこんなコメントがありました。
![スクリーンショット 2017-11-28 10.51.08.png](https://qiita-image-store.s3.amazonaws.com/0/81183/7fba96f5-b374-565a-75e4-f9ab2db91302.png)
レビューが不要な箇所を明示することで、レビュアーが楽になるだけでなく、本当に大事な箇所だけに集中してレビューすることができて幸せですね。


## 最後に

まぁ割と当たり前だな、と思った方も多いような内容かな、と思います。
でも現場では〆切とかプレッシャーとか深刻なバグによる精神崩壊とかで当たり前のことが当たり前にできなくなるものだな（仕方ないんだけどね）と思ってます。

あと、コードレビューって、どうしてもシビアな感じになりがちです。
でも、複数人で1つのものを作っていくのはとても楽しいことで、コードレビューも楽しむべきだ、と常々思ってます。
殺伐とした感じではなく、みんなが楽しく会話してる感じのプルリクエストが大好きです。

今度は（もうちょっとしっかり）、レビューする時に意識してることも書きたいと思ってます:thinking:

ー　ー　ー　ー　ー　ー　ー　ー　ー　ー　ー

ちなみに [Progate Advent Calendar 2017](https://qiita.com/advent-calendar/2017/progate) の明日の担当は社長さんです！
Ruby on Rails mysqlにしてみた。

# Ruby on Rails mysql で構築

Ruby on RailsはデフォルトではSqliteになっているのでそれをMysqlで構築してみる。

->> rails -v
Rails 4.2.0

->> ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin16]

```
rails new App の名前 -d mysql
```

これでmysql使える状態にしました。

Gemfileに記述されたものをインストール

```
bundle install
```

Gemfileを書き換えます。

下記のように編集

```
gem 'mysql2', '~> 0.3.20'
```

Gemfile.lockを書き換えます。

```
mysql2 (0.3.20)
mysql2 (~> 0.3.20)
```

bundle　これでmysql2 の 0.3.20をインストールします。

```
 bundle install
```

database.ymlの内容でデータベースを作成
```
rake db:create
```

ローカル環境

```
bundle exec rails s
```

下記へアクセスすると表示されます。
http://localhost:3000/
ElasticBeanstalkでTooManyApplicationVersionsExceptionが出た時の対応

CircleCIからElasticBeanstalkへ自動デプロイしていると、
そのうちTooManyApplicationVersionsExceptionというエラーが出てしまうという
問題に対応したので、その備忘録

awsの管理コンソールでもライフサイクルを決めることができるのに
なぜそれで対応できないのか…というのはおいておいて

shell scriptで

```
REGION=【region】
APP_NAME=【application name】
ENABLE_APPLICATION_COUNT=+200

aws elasticbeanstalk describe-application-versions --output text --region=$REGION --query 'ApplicationVersions[*].[ApplicationName,VersionLabel,DateCreated]' \
| grep $APP_NAME \
| tail -n $ENABLE_APPLICATION_COUNT \
| while read app ver date;
do
    echo "deleting version $app $ver $date";
    aws elasticbeanstalk delete-application-version --region=$REGION --application-name $app --version-label $ver --delete-source-bundle;
    sleep 1
done
```

こんな感じで`region` `application name` を設定すれば
最新200アプリケーションを残して、あとは自動削除をしてくれる
LoRa デバイス LT-100を使ってみた

##概要
SORACOM Advent Calendar 2017ネタということで
LoRaデバイス **LT-100** を購入してまだ試せてなかったので
シンプルに電波の飛び具合などを測定してみました。

LoRa GPS トラッカー LT-100
https://soracom.jp/products/lora/lt-100/

##LoRaゲートウェイ設置場所

会社で、LoRaインドアゲートウェイ（共有サービスモデル）を設置しておりますので
LoRa Spaceに設置場所が載っています。山梨県の甲府駅に近いところにあります。

![SORACOM_LoRa_Space.png](https://qiita-image-store.s3.amazonaws.com/0/20632/8803a880-40cb-27aa-562c-422257ceb723.png)

##LoRaデバイス LT-100セットアップ

さて、セットアップといっても手順が紹介されておりますのでそれを参考に実施。
[LoRa GPS トラッカー LT-100 をセットアップする]
(https://dev.soracom.io/jp/start/lora_hw_lt-100/#_ga=2.20381752.1682853613.1511929616-1599960385.1443645000&_gac=1.20185418.1508655245.CjwKCAjw4KvPBRBeEiwAIqCB-RVSL02FHb9FH2SMDiB_VWXuJeV-6Q2Hlledm6IGvAF4CneASfDRsRoCboYQAvD_BwE)

##SORACOM ユーザコンソール設定
続いては、サイトにも記載ありますが、LT-100で位置情報を見える化するには
[ezFinder BUSINESS]（http://www.ezfinder.jp/）
というサイトにデバイスを紐付けて表示させます。

そこで、LT-100の位置情報を、ezFinder BUSINESSに送るには、SORACOMの
ユーザコンソールより、該当するLoRaデバイスが所属する、LoRaグループの設定の中で
[SORACOM Beam](https://soracom.jp/services/beam/)の設定が必要とのこと。
※この紐付け作業が、必要なことがわからずサポートの方から教えてもらいました。ありがとうございました。

設定は下記のように行います。
![lora_ezfinder.png](https://qiita-image-store.s3.amazonaws.com/0/20632/d6c7c79d-9272-51a0-bb03-d10c5efa8a9b.png)

##ezFinder BUSINESSでLoRaデバイスの位置情報を確認
あとは、ezFinder BUSINESSでIDを作って、ログインして、LT-100を登録してあれば
下記のようにezFinder BUSINESS上で、LT-100の位置情報が表示されました。
その一例が下記

![ezFinder_BUSINESS.png](https://qiita-image-store.s3.amazonaws.com/0/20632/f9ac1199-d32f-0ceb-1ac5-6c8b46b49aaa.png)

紫線のところが、LT-100の位置情報が取得できたポイントを結んだ線になりますが
LT-100を持って車に乗りながら、測定したわけですが、実際には、もう少し広い範囲で
車は移動しました。水色の線が1kmの円の範囲になりますので、弊社のLoRaインドアゲートウェイ
の設置場所的には、1km未満が利用可能な状態という結果になりました。
この辺りは、LoRaゲートウェイの屋外用なども予定されているとのことですので
屋外用でゲートウェイを設置できれば、もっと距離がでるのでは？と期待しております。

とは言っても、この範囲でセンサー情報を送ることができる、LoRaの仕組みはすばらしいと思いました。
引き続き、いろいろな場面での利用方法を検討していきたいと思います。
ベクトルタイルアドベントカレンダーで私が書きたいこと

# ベクトルタイルの生産と消費を広める
これは、ウェブ地図で使われる「ベクトルタイル」技術についてのアドベントカレンダーです。どなたでもご自由にご参加ください。

このアドベントカレンダーを通じて、私はベクトルタイルの生産と消費を広めることに貢献したいと思っています。

ベクトルタイルの生産と消費を広めるためには、ベクトルタイルの生産技術・消費技術の普及と、ベクトルタイルスキーマの相互運用が必要であると考えています。

特に、異なるデータソースであっても、[ベクトルタイルスキーマ](https://qiita.com/hfu/items/3f1a3ea1f23580e188e2#see-also)の相互運用を追求するべきかということに興味をもっています。

ベクトルタイルの生産と消費を広めるために、今回私は、オープンソースやアドベントカレンダーといった手段を利用させていただきたいと思い、アドベントカレンダーを作りました。

# 予定している内容
私が書いていきたい内容としては、次のような内容を考えています。

1. [ベクトルタイルアドベントカレンダーで私が書きたいこと](https://qiita.com/hfu/items/3f1a3ea1f23580e188e2)（この記事）
2. そもそもベクトルタイルをどう説明するか
2. 私が選択した技術体系
3. https://sli.do/A727 で頂いた質問への応答
4. openmaptiles を使うにあたっての細かなノウハウ
5. openmaptiles で処理するデータの規模と処理時間との関係（経験則）
6. http://github.com/hfu/nevta （現在制作中）
7. Tangram でベクトルタイルの上に情報を重ね合わせるための細かなノウハウ
8. ズームレベル z にヒントを得て考えた、量レベル q という概念とその応用
9. 少数点数ズームレベルと縮尺との関係
10. ズームレベルの実用上の最大値。ベクトルタイルの世界の限界を理解しておくために。
11. ベクトルタイルの拡張子は mvt であることも pbf であることもある現象の解釈
12. Place YAML(PYAML)。これはその時にご説明します。
13. turf の紹介
14. ベクトルタイル利用についてイメージを深めていただくための好事例紹介
15. 三次元とベクトルタイルの関係
16. Mapbox GL JS が 1.0 になる時期について
17. 2018年のベクトルタイルはどうなるのか

# See Also
- ベクトルタイルスキーマという言葉が表すものについての例については、https://github.com/openmaptiles/openmaptiles が参考になると思います。

# Questions?
ベクトルタイルについて書いてほしい内容等、質問は https://sli.do/A727 で受け付けています。
正規表現でのIPマッチング -Regexp

###概要
正規表現で、IPアドレスにマッチングする方法。
ついでに、PORT番号を含めてマッチする方法も書いておく。

###実装
早速マッチングするためのコードを以下に記す。

```pattern.txt
(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
```
コードについて説明すると、「[1-9]?[0-9]」の部分は、1桁の１〜９か、二桁の1０〜９９までにマッチする様になっている。

その次の「|1[0-9]{2}」は、「|」と言うのが”または”という意味であり、最初に１を固定し、「１００〜１９９」までマッチするようになっている。
因みに、{n}というのは、直前のパターンをn回繰り返すという意味である。

恐らく、ここまで説明すれば後は理解できると思うので、次のサンプルに移る。

プロキシーを取得したい場合、「０．０．０．０：８０８０」の様にPORTが付いている場合がある。
この場合の取得方法も書いておく。

```pattern.txt
(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):([1-9][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]{1})
```

この様にすればPORTも含めてマッチができる。
JavaSciprt開発あれこれ


# はじめに

私は主に.NET系のエンジニアなのですが、諸事情により HTML5 + JavaScript プレイヤーのUI部分のカスタマイズに関わったので、その中で知ったアレコレを書いていこうと思います。

# その1. クラスを作る

Playerというclassを作りたいため、 ECMAScript 6 で導入された JavaScript クラスを利用しようとしました。

```js
class Player {
    constructor(id) {
        this._id = id;
    }

    play() {
        console.log('id=' + this._id);
    }
}

var player = new Player('player');
player.play();
```

分かりやすい構文ですが、残念ながらInternet Explorer 11で未サポートです。
IE11もMSE(Media Source Extensions)に対応している以上は、サービス対象外とするのは難しいので諦めざるを得ません。

非常に読みづらいですが、こんな感じに書きました。

```js
var Player = function (id) {
    this._id = id;
    this.player = function() {
        console.log('id=' + this._id);
    }
}

var player = new Player('player');
player.play();
```

【参考】

* [MDN web docs クラス ブラウザ実装状況](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes#ブラウザ実装状況 "MDN web docs クラス ブラウザ実装状況")
* [DRM Today: Platform Native DRM Support](https://drmtoday.com/platforms/ "DRM Today: Platform Native DRM Support")

# その2. Visual Studio 2017でスクリプトを最小化したい

開発中はコードを整形してコメント等を加えていますが、リリースするときはスクリプトをまとめたり、最小化させるのが定石かと思います。
Visual Studioでは[Bundler & Minifier](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BundlerMinifier)を使えばOKです。

細かい使い方は割愛しますが、このツールを入れてあれば、元ソースが更新されると、自動でmin.jsも更新してくれます。

# その3. ASP.NET Coreで簡単にCache Bustingする

JavaScriptやCSSといった静的ファイルがブラウザにキャッシュされて更新が反映されないことを防ぐため、クエリ文字列を付加することが一般的です。
こんな感じ

```html
<script src="./player.min.js?ver=xxx"></script>
```
ASP.NET MVC ではこれを独自実装をしなければいけなかった（はず・・・）のですが、ASP.NET Core MVCではScriptTagHelperのasp-append-versionを使えば自動でクエリ文字列を更新してくれます。

cshtml内の記述

```html
<script src="./player.min.js" asp-append-version="true"></script>
```

ページの表示結果

```html
<script src="./player.min.js?v=Y24i4b1MaAB28JJITCIOv0TZ79xd4gqv5BJXbZYLcZc"></script>
```

※Azure App Serviceで試したところ、再起動しても値が変わらないので、クエリの値の変更タイミングはデプロイ時と思われるが仕組みは要確認

# その4. 最小化するとAngular.jsが屍になる

スクリプトの最小化前の実行時は問題ないのに最小化するとエラーが発生。色々調べてみると訳あって使っているangular.jsの実装が原因。

```js
var app = angular.module("samplePlayer", ['ngAnimate', 'luegg.directives']);
app.controller("myController", function ($scope, $window, $timeout, $interval, $filter) {
    ...
}
```

こんなコードを書いていました。

\$scope, \$window などのパラメータはangular.jsのエンジンで使う予約パラメータ（この表現で良いのか？）なのですが、スクリプトが最小化されると名前が変わってしまい、追跡できなくなるらしい

こんな感じに書き直すと最小化うまくいきます。

```js
var app = angular.module("samplePlayer", ['ngAnimate', 'luegg.directives']);
app.controller("myController",
    ['$scope', '$window', '$timeout', '$interval', '$filter', 
    function ($scope, $window, $timeout, $interval, $filter) {
        ...
}]);
```

#最後に

とりとめのない記事になってしまいましたが、JavaScript開発あれこれでした。
Game A Weekとその振り返り

[グレンジ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/grenge) 15日目の記事担当の s_ebata です。
グレンジでクライアントエンジニアをしております。

# 概要
本記事は弊社のゲームデザイン室にて行っているGame A Weekという取り組みについての投稿になります。

## ゲームデザイン室とは
新規プロジェクトの種となるゲームモックを作成、提案している部署です。

## Game A Weekとは
> Game A Weekとは、一週間で1つゲームを作って、ゲーム開発者の経験値を上げる方法として、オランダのインディー系デベロッパー「Vlambeer」のRami Ismail氏が提唱したものです。

引用元 : [Game A Weekの定義まとめ](http://2dgames.jp/2016/02/28/game_a_week/)

Qiitaにも[15週間でクソゲーを20本作って得たもの](https://qiita.com/2dgames_jp/items/6a23207fd0057df92552)という投稿があります。
情報としては上記の方が詳細にまとまっておりますので、本記事では
「グレンジでこの取り組みをどう機能させているのか」
に焦点を絞り、作ったモックのひとつを例にしてご紹介できればと思います。

# グレンジ流Game A Week定義

まず弊社でのGame A Weekの定義ですが本質を変えず、以下のようにアレンジしています。
## 毎週ゲームを作る・毎週ゲームをリリースする
### 本家の定義
> 月曜日の12:00にプロジェクトを開始し、日曜日の23:59までにゲームを作り上げること


> 作ったものは例えクソゲーでもWebサイトを通じて配信を行うこと。さらにSNSやブログなどでそれを告知すること

### グレンジ流
グレンジではゲームデザイン室に所属するエンジニアが各々の提案したいものを制作するため、制作物の内容によっては上長に相談した上で「2週間で1本ゲームを作る」など期日の調整も例外的に認められています。~~（主に私です）~~

## 振り返りを行う
### 本家の定義
> 作って良かったところ、間違っていたところ、興味深かったところ、などをまとめておきます。作ったゲームは何人かにプレイしてもらい感想を聞くこと。そしてその感想をまとめておくこと

### グレンジ流
一番重要な部分なので、手厚めに振り返りはしています。

1. 月曜に作ったゲームモックをレビューしてもらうため社内に配信しアナウンス
2. ゲームデザイン室のメンバーと上長から直接レビューしてもらう
3. ゲームデザイン室だけで振り返りを行う
4. Qiita:teamに技術的なチャレンジ内容も含めて振り返り記事を投稿

2番の直接レビューしてもらう際には、「どういうゲームか」「どういうプレイを想定しているか」「それが実現できているか」にフォーカスを当てながらレビューしてもらっています。

# 振り返り投稿の一部を紹介

ご紹介するのはGame A Weekの第10回目の振り返り投稿です。
作ったゲームはKeidoroというタイトルでジャンルは非対称型対戦ゲームです。

![keidoro.gif](https://qiita-image-store.s3.amazonaws.com/0/218179/02937ff6-9e3e-738a-74a7-4a2802f066f1.gif)

※赤がキラー

キラー1人と生存者3人のマルチプレイゲームで、プレイするタイプによって目標が変わります。
キラーの勝利条件: 全ての生存者を倒す事
生存者の勝利条件: 4つのオーブ（マップ上の球）を解放して出口から逃げる事

# 反省点

## アピールしたい面白さにたどり着けない
初めてのマルチプレイゲームというのもあり機能実装の時間配分が読めなかった事と、そもそもその機能がアピールしたい面白さに繋がる部分なのかの精査がないままタスクに積んでしまった事で、自分の想像している面白さをわかってもらえるレベルまで作り込めませんでした。
作る前に「何が面白いゲームなのか」「その面白さを表現するのにどの機能があれば必要十分なのか」をもっとしっかり精査してから制作に入るべきでした。

## デバッグ効率
実装でハマって解決に時間がかかったというのはあまり無かったのですが、マルチプレイのデバッグ効率の悪さが地味に響きました。1人で制作する上で効率よく進められる方法ご存知の方いらっしゃったら教えてください・・。

# 良かったところ

## 初のマルチプレイ
今回はPhotonを使って初めてマルチプレイゲームを作成しました。
同期まわりの実装方法や、作りながら別クライアントの事も考えなければいけなかったりと苦戦しましたが、動いているのを見るとモチベーションが上がるのでなにより作っていて楽しかったです。
この知見を活かして、今後の制作バリエーションの幅を拡げていきたいです。

# まとめ

成果物は100点満点中30点くらいの出来でしたが、サーバーの知識が全くない自分でもお手軽にマルチプレイが作れるのが新鮮で楽しかったです。
AWS IOT を AWS CLI で設定

次のページの作業を私なりにやってみました。
[[AWS CLI] AWS IoTの作成](https://qiita.com/web_se/items/e2de72d1276522ab7e77)

Things の登録

```bash
aws iot create-thing --thing-name sunflower
```

AWS コンソールで見ると次のようになります。
![sunflower_dec0601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/20ecb450-ba59-c9d2-21cf-2414f9a63bc0.png)



Things の一覧

```bash
aws iot list-things
```

名前を指定して表示

```bash
aws iot describe-thing --thing-name sunflower
```

Things の削除　（やり直しをする時の為）

```bash
aws iot delete-thing --thing-name sunflower
```

証明書の作成、アクティブ化

```bash
aws iot create-keys-and-certificate --set-as-active > cert.json
```

cert.json から秘密鍵を抜き出す

```bash
cat cert.json | jq .keyPair.PrivateKey -r > private.pem.key
```

cert.json から certificate-id を抜き出す

```bash
jq .certificateId cert.json > certificate-id.txt
```

証明書の作成

```bash:create_cert.sh
#
#	create_cert.sh
#
CERTIFICATED_ID=`cat certificate-id.txt | sed 's/"//g'`
#
aws iot describe-certificate --certificate-id $CERTIFICATED_ID --output text \
  --query certificateDescription.certificatePem > cert.pem
```

証明書の確認

```bash
openssl  x509 -text < cert.pem
```

IoTポリシの作成

```json:policy.json
{
    "Version": "2012-10-17", 
    "Statement": [{
        "Effect": "Allow",
        "Action":["iot:*"],
        "Resource": ["*"]
    }]
}
```

```bash
aws iot create-policy --policy-name sunflower-policy \
  --policy-document file://policy.json
```

AWS コンソールで見ると次のようになります。
![sunflower_dec0602.png](https://qiita-image-store.s3.amazonaws.com/0/179446/888c39f8-4780-1331-1581-625454a842ae.png)


ポリシーの一覧

```
aws iot list-policies
```

IoTポリシーの確認
　この時に表示される、"policyArn" を使う

```bash
aws  iot get-policy --policy-name sunflower-policy > sunflower_policy.json
```

証明書にIoTポリシを紐付ける

```bash:attach_policy.sh
CERTIFICATED_ID=`cat certificate-id.txt | sed 's/"//g'`
echo $CERTIFICATED_ID
#
CERTARN=`jq .certificateArn cert.json  | sed 's/"//g'`
echo $CERTARN
#
aws iot attach-principal-policy \
       --principal $CERTARN \
      --policy-name "sunflower-policy"
```

紐付けを表示

```bash:list_attach_policy.sh
CERTIFICATED_ID=`cat certificate-id.txt | sed 's/"//g'`
echo $CERTIFICATED_ID
#
CERTARN=`jq .certificateArn cert.json  | sed 's/"//g'`
echo $CERTARN
#
aws  iot list-principal-policies \
       --principal $CERTARN
```

証明書にThingsを紐付けます

```bash:attach_things.sh
CERTIFICATED_ID=`cat certificate-id.txt | sed 's/"//g'`
echo $CERTIFICATED_ID
#
CERTARN=`jq .certificateArn cert.json  | sed 's/"//g'`
echo $CERTARN
#
aws iot attach-thing-principal --thing-name "sunflower" \
        --principal $CERTARN
```

紐付けを表示

```bash
aws iot list-thing-principals --thing-name sunflower
```

エンドポイントの表示

```bash
aws  iot describe-endpoint --region ap-northeast-1
```

作成された AWS IoT に Pub/Sub を行う方法は、こちら。
[Raspberry Pi で、mosquitto を使って、AWS IOT に Pub/Sub する](https://qiita.com/ekzemplaro/items/f2c74afcd716a9251e65)

次が必要です。
>モノの証明書 　device.pem.crt
>プライベートキー　private.pem.key
>ルート CA root-CA.crt (ダウンロードする必要があります。)

[取得方法](https://github.com/aws/aws-iot-device-sdk-js/blob/master/README.md#specify-a-directory-containing-default-named-certificates)
math for Swiftについて

#math for Swift
## Rounding Functions
- round: Round up from 0.5 and higher and rounds down from 0.49 and lower
- floor: Rounds to the lowest integer
- ceil: Round to the highest integer
- trunc: Drops the decimal value

<img width="422" alt="Screen Shot 2017-11-30 at 20.33.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/166098/84c016cf-5139-079b-7503-47289246e4db.png">

## Calculation Functions
- fabs: Calculates the absolute value of a number
- sqrt: Calculates the square root of a positive number
- cbrt: Calculates the cube root of a positive number
- hypot: Calculates the square root of (x*x + y*y)
- fmax: Identifies the maximum or largest value of two numbers
- fmin: Identifies the minimum or smallest value of two numbers

<img width="515" alt="Screen Shot 2017-11-30 at 20.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/166098/489beae6-36e5-2a49-4641-cd0306034068.png">
交通系電子マネーカードを 白PaSori RC-S320  + Raspberry Pi でNFCして固有番号を取得する。


######株式会社XSHELL　デベロッパー　植田歩

![IMAG2962.jpg](https://qiita-image-store.s3.amazonaws.com/0/208108/d58e2e88-b55e-749c-6673-c1d861aacee8.jpeg)

## 概要
- SonyのPaSoRiを使ってSuicaやPasmoなどの電子マネーの固有番号（IDm）をターミナル上で確認する。
- RC-S320(白PaSoRi)は有名なnfcpyというライブラリが使えないようなのでlibpafeを使う。
- もっといろいろやるならRC-S380(黒PaSoRi)を購入したほうがいいかも。

## 環境
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img
- Mac OS X El Capitan
- RC-S320
- Python 2.7.13

PaSoRi製品一覧
https://www.sony.co.jp/Products/felica/consumer/products/list.html

##参考サイト
https://qiita.com/IMIMIM1080/items/23844281cf53156a196f



##手順

```

sudo apt-get install libusb-dev
git clone https://github.com/rfujita/libpafe.git
#sudoなしで使えるようにする
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
sudo udevadm control --reload-rules
sudo reboot

```

##テスト実行

```

pi@raspberrypi:~/git/libpafe $ ./tests/pasori_test
```

成功時

```

PaSoRi (RC-S320)
 firmware version 1.40
Echo test... success
EPROM test... success
RAM test... success
CPU test... success
Polling test... success
```

##IDm取得のpythonコード
こちらの記事のソースを使用させていただきました。
https://qiita.com/IMIMIM1080/items/23844281cf53156a196f

```
#read_idm.py
# -*- coding: utf-8 -*-

from __future__ import print_function
from ctypes import *

# libpafe.hの77行目で定義
FELICA_POLLING_ANY = 0xffff

if __name__ == '__main__':

    libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so")

    libpafe.pasori_open.restype = c_void_p
    pasori = libpafe.pasori_open()

    libpafe.pasori_init(pasori)

    libpafe.felica_polling.restype = c_void_p
    felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0)

    idm = c_ulonglong()
    libpafe.felica_get_idm.restype = c_void_p
    libpafe.felica_get_idm(felica, byref(idm))

    # IDmは16進表記
    print("IDm:", "%016X" % idm.value)

    # READMEより、felica_polling()使用後はfree()を使う
    # なお、freeは自動的にライブラリに入っているもよう
    libpafe.free(felica)

    libpafe.pasori_close(pasori)
```

##実行

実行結果

```

#成功
pi@raspberrypi:~/git/libpafe $ python read_idm.py 
IDm: 1F3XXXXXX00XXX01

```

##おまけ

RFIDタグをいろいろ扱ってるサイト
https://www.rfid-alliance.com/RFIDshop/top.html

RFIDについてわかりやすいサイト
http://www.taiseinet.com/rfid.html

電力供給方法
http://www.phoenix-denshi.co.jp/oyakudachi/gijutsu-04.shtml



---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
定常作業をchatwork連携して自動化した話

[グレンジ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/grenge) 11日目の記事を担当しました、 yoshida029と申します。
グレンジでサーバサイドエンジニアをしております。

今回は、定常作業をchatwork連携して自動化した話になります。

# __はじめに__

日々の定常作業があります。

定常作業の例

- KPI情報を集計する
- アプリのランキング変動
- 社内レビュー結果の集計
- 定例作業の開始と終了の合図
- アプリビルド完了通知
- 毎回のリリース前にマスタのバリデート結果の報告
- （今日の天気、電車遅延情報、トレンドワードの投稿など趣味に寄った通知）

単純な作業ですが、手動だと漏れやミスが起こりうるので
自動化対応を進めました。

## chatworkのトークン取得

発行方法はこちらにて

API Tokenを発行する
https://help.chatwork.com/hc/ja/articles/115000172402-API-Tokenを発行する

# __連携手段__

- curlによる投稿
- Google Apps Scriptから投稿
- phpから投稿

## __curlによる投稿__

### サンプルコード

```console
curl -X POST -H "X-ChatWorkToken: トークン" -d "body='メッセージ'" "https://api.chatwork.com/v2/rooms/{ルームID}/messages"
```

実際にはjenkinsから叩いて使います。
「毎日○○時からあれがはじまるよー」の開始・終了を投稿しています。

## __Google Apps Scriptからchatwork投稿__

スプレッドシートからchatworkに投稿します。

スクリプトエディタを開く
![611053d0-c1fa-bbd7-9639-24d96d099925.png](https://qiita-image-store.s3.amazonaws.com/0/218170/de19c2c8-a318-9868-305a-a0074710bf2c.png)


[リソース]->[スクリプト...]で、スクリプトの追加ダイアログが開きます。
ここでChatWorkClientのプロジェクトキーを検索して追加します。

https://github.com/cw-shibuya/chatwork-client-gas

バージョンは17以上を選択しました。

![d3de18ec-8198-c63c-d9de-a1c9350524cb.png](https://qiita-image-store.s3.amazonaws.com/0/218170/68913278-9448-6b1f-970b-d33bd9986fb0.png)


### サンプルコード

```gas
function myFunction() {
  var cwClient = ChatWorkClient.factory({token: 'トークン'});
  cwClient.sendMessage({
        room_id: 'ルームID',
        body: 'メッセージ'
  });
}
```

## __chatworkの内容をスプレッドシートに書き出し__

chatwork投稿内容をスプレッドシートに書き出します。

```gas
function myFunction() {
    var cwClient = ChatWorkClient.factory({token: 'トークン'});
    var messageList = cwClient.get('/rooms/ルームID/messages', {
        force: 1
    });

    var logsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名');
    for (var i in messageList) {
      var date = new Date(messageList[i].send_time * 1000);
      var sendDate = new Date(date.getFullYear(), date.getMonth(),date.getDate(), 0, 0, 0);
      // 最終行に追加
      logsheet.appendRow([sendDate, messageList[i].account.name, messageList[i].body]);
    }
}
```

ちょっとしたディスカッションを議事録にあげるとかに使うと便利。

## __phpから投稿__

phpからchatworkに投稿します。

```php
public static function send() {
    $url = sprintf('https://api.chatwork.com/v2/rooms/%d/messages', 'ルームID');
    $option = [
        'body' => '[info][title]タイトル[/title]本文[/info]',
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ChatWorkToken: ' . 'トークン']);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($option, '', '&'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_exec($ch);
    curl_close($ch);
}
```

gitプッシュ時にバリデート結果がNGの場合通知します。
本番環境からのアラートメールの代わりにchatworkにしたり。

# 導入してみた結果

- 朝昼晩気づいたときに誰かが集計するという人任せの運用がなくなりました
- 平日朝集計、土日祝日分は月曜日にまとめてやる運用がなくなりました
- 集計してもメール見ない、webページ作っても見ない人でもchatworkなら見ている可能性高い（気がする）
- サーバーにログインする回数が多少減るので気分的に楽になります
- マスタデータのチェックを代わりに返答してくれるのでエンジニアが調査する回数が減りました

# 最後に

非エンジニアは定常作業かどうかも気づいてない場合があります。
巻き込んでやってしまいましょう。
大抵喜んでくれます。

定常作業を自動化してクリエイティブな時間を増やしていきましょう。

以上となります。
Jenkins + PowerShell で出力書式がおかしくなる場合の対処

ニッチな条件のバグ踏み抜いたのでメモ

## TL;DR

- 同じものを踏んだ場合は、以下のどれかで対処する。
    - `Write-Host`、`Write-Information` を利用しない、`Write-Warning` 等で代替する。
    - `returnStdOut` の場合はログを諦める。
    - PowerShellが直るのを待つ。
    - Jenkinsを64bit版に変更する。


## 環境

| OS/MW | バージョン |
| ---- | ---- |
| Windows Server | 6.3.9600.0(2012 R2) |
| Jenkins | 2.73.3(32bit) |
| PowerShell | 5.0.10586.117 |


## 何が起きたか

JenkinsからPowerShellに連携して、PowerShellの途中でOutputとは別にログを表示しようとした時に
`Format-List` されて出力されていた。

```groovy:JenkinsFile
node {
    def out = powershell returnStdout: true, script: 'Write-Host "Hello World."; "some output"'
    echo "PSResult = ${out}"
}
```

```:期待するログメッセージ
Hello World.
PSResult = some output
```

```:実際のログメッセージ
WriteInformationStream : True
MessageData            : Hello World.
Source                 : Write-Host
TimeGenerated          : 2017/11/29 20:43:20
Tags                   : {PSHOST}
User                   : ****\****
Computer               : ****
ProcessId              : 131196
NativeThreadId         : 21572
ManagedThreadId        : 14

PSResult = some output
```

なんか `Format-List` かかってるらしい！？

## 原因

簡単に上げると以下の感じで。

- JVM + Jenkinsを32ビットで構築していたため、PowerShellも32ビットで動作していた
- 出力内容を返すオプションを付けるとInformationのストリームリダイレクトが使われていた

### PowerShell側の原因

32ビット版PowerShellにリダイレクトでフォーマットが変わるバグがあるらしい。
https://github.com/PowerShell/PowerShell/issues/2147

まさにこの挙動だった。
試したところ 6(Information) だとダメ、3～5(Warning,Verbose,Debug)だと大丈夫だったので
まさにピンポイントで踏んだらしい。

64ビット版の PowerShell ではこれが発生しないので開発チームでも優先度は低そうで、
github上でも `post-6.0.0` としてタグが付いているので、直るのはまだ来年まではかかりそう。


### Jenkins側の原因

#### アーキテクチャによる問題

構築当初にあまりちゃんと調査できてなかったこともあり、JVMとJenkinsを32ビットバージョンで構築していた。
そのためと思われるがPowerShellの実行も32ビット版が起動されているらしい。
（情報ソースはないので想像含む）

#### プラグインによる問題

Jenkins の PowerShell Plugin は `returnStdOut` を付けると標準出力の結果を戻り値として保持できるが、
その際にstdout以外の各ストリームをOutputにリダイレクトして、ファイルに保存してから表示するらしい。
[該当ソースコード](https://github.com/jenkinsci/durable-task-plugin/blob/master/src/main/java/org/jenkinsci/plugins/durabletask/PowershellScript.java#L111)
ここで `6>&1` が付いてることによって、32ビットの問題と掛け合わせて見事にバグを踏み抜いている。


## 対応方法

### 64ビット環境で構築

一から環境を作るなら、JVMの64ビット版をインストールするとJenkinsが64ビット環境として稼働するらしい(?)
[stack overflow](https://stackoverflow.com/questions/44035476/running-powershell-via-x64-in-jenkins)
64ビットのJenkinsであればPowerShellも64ビット側が使われるので、一番きれいな方法はこれ。

### `returnStdOut` を使わない

スクリプト実行をしたいだけで出力結果を変数などに拾う必要がなければ、`returnStdOut` を付けないだけでも解決する。

```groovy:returnStdOutがない例
node {
    powershell 'Write-Host "Hello World."'
}
```

これなら渡した内容がそのまま出力される。

### information以外のストリームに流す

元々PowerShellからのコンフィグを読みたくて `returnStdOut` は必須だったので、今回採用した方法がこれで。
Information以外ならなんでも大丈夫だけど、ErrorはStopかけている、VerboseとDebugは表示すると量が多いので
Warningがまだマシな感じで。

```groovy:Warningストリームに流す
node {
    def out = powershell returnStdOut: true, script: '''\
$WarningPreference = "Continue"
Write-Warning "Hello World."
"some output"
'''
    echo "PSResult = ${out}"
}
```


```:出力結果
Hello World.
PSResult = some output
```

### 気にしない

そもそも余計な表示が増えるだけで他への動作影響はないので、気にしないのもありで。



----

## 参考

[PowerShell Issue #2147](https://github.com/PowerShell/PowerShell/issues/2147)
[PowerShell Plugin](https://wiki.jenkins.io/display/JENKINS/PowerShell+Plugin)
Unity、カラープリセットをチームで共有しよう

こんにちは、オルトプラスで働くクライアントエンジニアの尾土平です。
最近はunityを使ってごにょごにょしている、元flasherです。
今日はUnityのカラープリセット（プリセットライブラリ）について書きたいと思います。

# カラープリセットとはなにか

色情報（RGBA、HexColorなど）を登録しておくことができ、
必要に応じて使用することができるものです。
名前もつけることができます。（似たような色の時に便利）

# なぜやるのか

カラープリセットをプロジェクトのリビジョン制御に追加することで、
ユーザー間で共有することができます。

デザイナーがカラープリセットで色情報を追加し、
エンジニアがそれを用いて着色を行えるので作業が効率が上がります。

例えばこんな修正が発生しなくなります。
「このテキストは真っ黒（000000FF）じゃないんです。161616FF（黒に近いサムシング）なんです。修正よろ！」

# 作り方
 1.Colorを表示します。 （Hierarchy上にSprite等を配置してColorを選択）

<img width="252" alt="howto1.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/84e0b756-508b-12b3-f392-d8a741745a50.png">

---
 2.コンテキストメニュー（三本線のアイコン）から"Create New Library"を選択 
   
<img width="455" alt="howto2.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/5a40e55f-cbaf-6552-aa4c-59e11ab2d9a1.png">

---
 3.Nameに"任意の名前"を入力、Locationを"Project Folder"に設定し、"Create New Library...."

<img width="584" alt="howto3.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/a97cade2-d4c5-7eee-0364-1d2cca550190.png">

---
 4."任意の名前"（Project）が追加され、設定されている状態になります。

<img width="432" alt="howto4.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/f252bdce-5d6f-08a3-91a6-845832343ec0.png">

---
 5.コンテキストメニュー内の"Reveal Current Library Location"を選択すると、Project内のどこに作られたかが確認できます。

<img width="440" alt="howto5.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/d2040f72-f552-b88c-1cb3-722cbeb2de7c.png">


---
 6.色を追加して、共有チームに共有してください。（git操作など...

<img width="237" alt="howto6.png" src="https://qiita-image-store.s3.amazonaws.com/0/20181/9f3ee07b-4ffa-115a-cd30-cea4d9b90f01.png">

---
 7.コンテキストメニューから"任意の名前"（Project）を選択すると、その色情報を使用することが可能です。

# 最後に 
プリセットライブラリのマニュアルには、グラデーション、アニメーションカーブも共有できそうなことが書かれているので、
機会があれば試してみたいと思います。


# リンク
 - プリセットライブラリ・マニュアル
  - https://docs.unity3d.com/ja/540/Manual/PresetLibraries.html
交通系電子マネーカードを 黒PaSori RC-S380 + Raspberry Pi + python で


######株式会社XSHELL　デベロッパー　植田歩

![IMAG2963.jpg](https://qiita-image-store.s3.amazonaws.com/0/208108/e85cc730-5fb9-f98a-bf2e-522cdf1ddffc.jpeg)

## 概要
- nfcpyを使って固有番号を取得する。


## 環境
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img
- Mac OS X El Capitan
- Python 2.7.13
- SONY RC-S320
 - https://www.sony.co.jp/Products/felica/consumer/products/list.html

##手順

```
nfcpy入れて動かす

sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install python-pip
sudo apt-get -y install python-dev
sudo apt-get -y install vim
sudo apt-get -y install git
sudo apt-get -y install libusb-dev
sudo apt-get -y install python-usb
sudo reboot

sudo pip install -U nfcpy

#nfcpyインストールできない場合
sudo apt-get remove python3-pip
sudo apt-get remove python-pip

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo pip install -U nfcpy


#テスト実行
python -m nfc

#PaSoRiが認識されているか確認
lsusb

#sudoなしで使えるようにする
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
sudo udevadm control --reload-rules
sudo reboot

```

失敗時

```
pi@raspberrypi:~/git/nfcpy $ python -m nfc
No handlers could be found for logger "nfc.llcp.sec"
This is the 0.13.4 version of nfcpy run in Python 2.7.13
on Linux-4.9.59-v7+-armv7l-with-debian-9.1
I'm now searching your system for contactless devices
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
```

成功時

```
pi@raspberrypi:~/git/nfcpy $ python -m nfc
No handlers could be found for logger "nfc.llcp.sec"
This is the 0.13.4 version of nfcpy run in Python 2.7.13
on Linux-4.9.59-v7+-armv7l-with-debian-9.1
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:001:005
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
```

lsusbで認識されている。

```
pi@raspberrypi:~/git/nfcpy $ lsusb
Bus 001 Device 006: ID 054c:06c3 Sony Corp. 
```

##Suicaの履歴閲覧
###参考サイト
Suicaの履歴を読み取る
http://raspberry.mcoapps.com/archives/128

```

#実行
git clone https://github.com/m2wasabi/nfcpy-suica-sample.git
python suica_read.py 
・
・
・
=== 01 ===
端末種: None
処理: 運賃支払
日付: 17-11-25
入線区: 東日本旅客鉄道-東北本
入駅順: 秋葉原
出線区: 東日本旅客鉄道-中央本
出駅順: 新宿
残高: 542
BIN: 
1d 01 00 02 23 79 02 03 03 0d 1e 02 00 0f 19 00 
・
・
・
```

これはSuicaではなく、Pasmoですが問題なく動く様子。


---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---