OmniAICreator/Qiita-1.07M huggingface dataset:
初心者が始めてコードを書いてみた(1)

HTML初心者です。学習5日目で初アウトプットです。
使用エディタ　Mery

客観的に見てもコードが雑なのは一目瞭然ですが徐々に慣れていこうと頑張ります。
今後はnav、sectionで苦戦するかと思いますが、ググり倒して覚えていきたいです。



```sub.html

<!DOCTYPE>
<meta charset ="utf-8">
<html>
<head>
<title>初アウトプット</title>

</head>
<body>
<thead>
<h1>HTML初アウトプット</h1>
<h3>今回のアウトプット内容</h3>
 <ol>
   <li>引用</li>
   <li>table</li>
   <li>ゲーム作品のリンク張り</li>
 </ol>
 <hr>
 <h2>ゲーム紹介</h2>
 
 <a href ="リンク先">サイト名</a>

 <nav>  <!--navの使い方が分からない-->
    <li> <a href="/">概要</a></li>
    <li>各キャラ紹介</li>
 </nav>
 
 
 <h4>概要</h4>
 <p>

<cite> <a href="引用元リンク">OOより引用</a></cite>
<p>
</thead>
<tbody>
<h3><abbr title ="タイトル">タイトル</abbr>簡単なキャラ紹介</h3><!--一つのセルに画像を張り付ける-->
 <div>
 <table border="1">
  <tr>
   <th>キャラ名</th>
   <th> キャラ名 </th>
  </tr>
  <tr>
   <td>キャラ名</td>
   <td>キャラ名</td>
  </tr>
  <
  </div>
  
  
 </table>
</body>
</html>
Magic Leap Unity MLLightingTracker

Magic Leap One では 照明などの光の情報の取得が可能です。

```c#
// 開始
MLResult result = MLLightingTracker.Start();
if (result.IsOk)
{
    ...
```

```c#
// 輝度取得
ushort luminance = MLLightingTracker.AverageLuminance;

// 色温度をRGBカラーで取得
Color color = MLLightingTracker.GlobalTemperatureColor;
```

** 参考 **
Light Tracking Example
https://creator.magicleap.com/learn/guides/sdk-example-light-tracking

UnityEngine.XR.MagicLeap.MLLightingTracker Class
https://developer-documentation.magicleap.com/public/v0.21.0/UnityAPI/class_unity_engine_1_1_x_r_1_1_magic_leap_1_1_m_l_lighting_tracker.html
pyexpat が原因で pyenv install が出来ない解決方法

#`pyenv install 3.7.3`したら下の様なエラーが発生した

# 現状
**MacOS Mojave10.14.5**を使って**pyenv 1.2.12**経由で`pyenv install 3.7.3`したらpyexpatがビルドが出来ないエラーが発生した。

###  version
MacOS Mojave10.14.5
pyenv 1.2.12

## エラー内容

```
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
Installing Python-3.7.3...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 10.14.5 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/python-build.20190618113202.9421
Results logged to /var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/python-build.20190618113202.9421.log

Last 10 log lines:
  File "/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/tmpmrukj_i2/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/cmdoptions.py", line 22, in <module>
  File "/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/tmpmrukj_i2/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/hashes.py", line 10, in <module>
  File "/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/tmpmrukj_i2/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/misc.py", line 21, in <module>
  File "/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/tmpmrukj_i2/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/pkg_resources/__init__.py", line 35, in <module>
  File "/private/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/python-build.20190618113202.9421/Python-3.7.3/Lib/plistlib.py", line 65, in <module>
    from xml.parsers.expat import ParserCreate
  File "/private/var/folders/02/2q54w44n1010wm667_3wfx340000gn/T/python-build.20190618113202.9421/Python-3.7.3/Lib/xml/parsers/expat.py", line 4, in <module>
    from pyexpat import *
ModuleNotFoundError: No module named 'pyexpat'
make: *** [install] Error 1
```

どのバージョンのpythonをインストールしても同じエラーが発生する。

# 解決方法
https://github.com/pyenv/pyenv/issues/1066
こちらに記載されている方法で解決した！！！

## 1. コマンドラインツールをversionを変更する
https://developer.apple.com/download/more/?=command%20line%20tools
*Command Line Tools for Xcode Beta*のバージョンをインストール。

## 2. ちゃんとインストール出来ているか確認
```
pkgutil --pkg-info=com.apple.pkg.CLTools_Executables
```
### 上のコマンドの実行結果
```
package-id: com.apple.pkg.CLTools_Executables
version: 11.0.0.0.1.1559496560
volume: /
location: /
install-time: 1560831114
groups: com.apple.FindSystemFiles.pkg-group
```
versionが上記になっていれば正常??


## 3. 環境変数を設定
以下のコマンドを実行して、環境変数を設定する。

```
export CFLAGS="-I/usr/local/Cellar/openssl/1.0.2s/include"
export LDFLAGS="-L/usr/local/Cellar/openssl/1.0.2s/lib"
```

## 4. `pyenv install 3.7.3`

いつも通りにインストール出来た！！

解決方法があまり記載されていなかったので、書きました。
Debianでなんかやらかして「あれっ!何かおかしいです。」とか言われたとき

Debian stretchでの話

2019-12-29追記：
まずはこれを試してみよう。
https://wiki.archlinux.jp/index.php/GNOME/%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#gnome-shell_.2F_gnome-session_.E3.81.8C.E3.82.BB.E3.83.83.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E8.B5.B7.E5.8B.95.E6.99.82.E3.81.AB.E3.82.AF.E3.83.A9.E3.83.83.E3.82.B7.E3.83.A5.E3.81.99.E3.82.8B

2025-04-13追記:
単純にgnome-shellのバージョンが古い場合もあるのでシングルユーザーモードで起動してアップグレードすることも検討しよう。

# 「あれっ!何かおかしいです。」

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39647/6b1d22f9-f0ae-a149-1960-526814e5832b.png)

「システムの復帰ができません」などと言われると恐ろしげであるが、この表示の場合カーネルに異常があるというよりは、画面周り（XもしくはWayland）でトラブルが起きている可能性が高い。
（カーネルがおかしいときはそもそもこの画面まで来られない場合がほとんどである）

よくあるのがパッケージインストールの際にXとかWayland周りでなにか必要なパッケージを誤って消してしまった可能性である。

# 今回の復旧手順

再起動してもダメな場合は

recovery modeで起動して

とりあえずターミナルでは日本語表示できないので

```bash
# export LANG=C
```

でデフォルト表示（英語）にしておく

```bash
# systemctl start network-manager
```

これでネットワークがつながるので

```bash
# apt dist-upgrade
```

これで必要なパッケージが入ってくれることを祈ろう。

これでもダメなときは

```bash
# less /var/log/messages
```

でX周りのログが見られるので、`(EE)`となっているログがあればそこが原因の可能性がある。

今回対応したケースではVMWare上で起動していたのだが、vmwgfx_dir.soの読み込みに失敗していた。

`apt-file`で探してみると

```bash
# apt install apt-file
# apt-file update
# apt-file search vmwgfx_dir.so
```

libgl1-mesa-dirが持っているということがわかったので

```bash
# apt install libgl1-mesa-dri
```

で無事解決した。
RaspberryPiのGUIが起動できなくなった(解決)

RaspberryPiをずっとCUIだけで使用していました。

ある日にGUIの画面が見たくなり
$ startxを入力するとcinnamonがCrashしました。cinnamonを再起動しますか？
となってしまいXWindowSystemが使えなくなりました。
X-WindowSystemには
 cinnamon
 sddm
 lightdm
等をaptでインストールしています。
しかし現状では全く使用をしていません。
【解決済み】
今まではRaspberryPiをインストールした時のGUIが起動していたのですが、このような状態になってしまいました。

GUIを起動させる為に色々と試してみたのですがうんざりする程の工程なので成功した記録だけ示させていただきます。

$ sudo apt install mate
　MATEは(X displayManager)です。読み方はLinuxの持つ独特の感覚で"メイト"ではなくて"マテ"です。

これでXのdefaultがcinnamonからmateに代わり起動が可能になりました。
しかし最初のRaspbianのGUIには戻せずMATEが起動してしまう様になりました。

Xが起動できなかった時の状態よりはマシになった程度です。

それと修正できないトラブルが残っています。
Xの起動時にcinnamonがcrashしました。cinnamonを再起動しますか？とゆう内容が表示されるのです。
"いいえ"を選ぶとMATEが起動します。

本当はRaspberryPiのオリジナルのGUIに戻したいのですがpackageを沢山インストールしたRaspberryPiの再インストールは避けたいので、このまま使用する予定です。
オリジナルに戻す方法をご存知でしたらご教授して下さい。
【解決】
$ sudo apt install raspberrypi-ui-mods
これだけでオリジナルのRaspberryPiのGUIに戻りました。

"RaspberryPiのGUIの起動が出来ない"と検索すると再インストールをするとゆう手段もありましたが、その必要はありません。

まだ試したい事が沢山あるのですが
GUIが変わってしまったのは
$ sudo apt upgrade　が原因なのかな？とも思います。

不安材料はかなりありますが、安定してきたらまた記事を投稿させていただきます。
[Vue]チェックボックスを選択して、任意のclassを変更するサンプル

# いきなりコード
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="riotam4" data-slug-hash="gNMoep" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="[Vue]checkboxでclassを変えるサンプル">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/gNMoep/">
  [Vue]checkboxでclassを変えるサンプル</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
# 解説
このチェックボックスは、

```html:HTML側の2行目
<input type="checkbox" v-model="changeColor">
```
v-modelの指定によって、

```javascript:JS側の5行目
data: {
  changeColor: false
},
```
↑の「changeColor」の真偽と連動しています。
なので、今回のコードでは初期値をfalseにしていますが、これをtrueにしておくと、はじめからチェックボックスにチェックがしてある状態になります。

そして、classを変化させている部分は…

```html:HTML側3行目
<p :class="{change: changeColor}">この文字の色が変わります</p>
```
↑の「:class...」の部分です。
「:」は「v-bind:」を省略した書き方です。
そのあとは、`:class="{change: changeColor}"`としていることで、
`JS側のdataに入っている「changeColor」がtrueのとき、classを「change」に変更する`という指示になります。

あとは、

```css:CSS側
.change{
  color: red;
}
```
chageクラスのものを赤色に変えているCSSを用意し、待ち受けておくだけです。
【R言語】RでopenCVを動かしてみる

Rで画像処理ってできるんだろうかと軽い気持ちでネットを調べてみたら[R版のopenCV](https://github.com/ropensci/opencv)を利用すれば実現出来ることがわかりまして、色々動かしてみました。

きちんとopenCVを使用したことが無いもので、従来のopenCVと比べて出来ることは限られているのかもしれませんが、使い方を紹介させていただきます。

今回、サンプルに使用する画像は著作権フリー画像を扱っている[GAHAG様](http://gahag.net/)から写真をいただきました。ありがとうございます。

###画像処理

まずは画像処理から。
サンプル画像は`opencv::ocv_picture`関数でWebカメラ撮影することもできますが、自前だとたいへん見栄えがよろしくないので、大人しくプロの写真を使うことにしました。
画像は以下を使用します。
![元画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/23bd971b-f8fd-6087-c693-9e1883846470.png)

ソースは以下です。

```r:opencv.r
# ライブラリ -------------------------------------------------------------------

pacman::p_load(opencv)


# ソース本文 -------------------------------------------------------------------

#画像の読み込み
photo <- ocv_read("gahag-0119426971-1.jpg")

photo
```

####顔認識
画像に手を加えていきます。
まずは顔認識。`opencv::ocv_face()`関数で顔認識をします。

```r:opencv.r
#顔認識
ocv_face(photo)
```

![顔認識.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/bb2676c7-c0fb-270b-4bd1-41c5249e64d5.png)

####顔認識(マスキング処理)

顔認識をしてマスキング処理を加えます。
`opencv::ocv_facemask()`関数を使用します。

```r:opencv.r
#顔をマスキング
ocv_facemask(photo)
```

![顔のマスキング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/544cd7ba-47aa-e110-d8c1-fef90a94792a.png)


####エッジ検出
エッジ検出を行います。
`opencv::ocv_edges()`関数を使用します。

```r:opencv.r
#エッジ検出
ocv_edges(photo)
```

![エッジ検出.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/b7477be4-e702-6395-2674-2d2eb68710ef.png)


####ぼかし

ぼかし表現で表示します。
`opencv::ocv_blur()`関数を使用します。

```r:opencv.r
#ぼかし
ocv_blur(photo)
```

![ぼかし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/a240fb44-51d9-67be-a14a-a24a6e68f3ae.png)


####スケッチ風

スケッチ風に表現します。
`opencv::ocv_sketch()`関数を使用します。

```r:opencv.r
#スケッチ風
ocv_sketch(photo)
```

![スケッチ風.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/7a812090-1a7a-4b89-5f04-14d8ebabb629.png)


####スタイライズ

スタイライズ効果を入れます(どんな効果なのかは良くわかっていない)。
`opencv::ocv_stylize()`関数を使用します。

```r:opencv.r
#スタイライズ効果
ocv_stylize(photo)
```

![スタイライズ効果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/60449dc0-718b-bacd-75a8-3f1482e880f0.png)

####マーカー表示

マーカーをプロットします。
`opencv::ocv_markers()`関数を使用します。

```r:opencv.r
#マーカー表示
ocv_markers(photo)
```

![マーカー表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/156a1ed1-16c0-d442-7ff2-3376534c00b8.png)


####局所特徴領域を表示
局所的に特徴のある領域を□で囲みます。
`opencv::ocv_hog()`関数を使用します。

```r:opencv.r
#局所特徴領域
ocv_hog(photo)
```

![局所特徴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/67039791-9b2a-1b12-d3bd-737b3c0841d8.png)


###動画処理

RのopenCVで動画処理もできるようです。
`opencv::ocv_video()`関数を使用します。

```r:opencv.r
#動画処理
ocv_video(function(input){
  #エッジ検出
  ocv_edges(input)
})
```

![エッジ_動画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/9b44a997-8af9-cbcc-5cd6-a9c4cfc423e0.png)

筆者をエッジ検出した動画が撮れました。
サンプルとして`opencv::ocv_edges()`関数を使用しましたが、顔認識(`ocv_face()`関数)やマーカー表示(`ocv_markers()`関数)でも難なく動作を確認することができました。

###おわり

実用性はさておき、ご興味があれば触ってみるのはいかがでしょう。
やっていきましょう。
【UiPath】ライセンス付＆トライアル期限パッケージを作ってみる

あくまでトライアルなので、無限に配布されたり、ずっと使い続けられると困るなー
ってことあると思います（あるのか？）

今回は、ライセンス付き（端末縛り）＆トライアル期限つきパッケージの作り方を紹介します。
**※自己責任でお願いします**

## テキストファイルを用意する
licenseファイルとtrialファイルを用意します。
プロジェクトフォルダ内であればどこでもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/733012ee-8ec1-6e49-44dd-1b5a16c2e832.png)

## 端末名を取得
実装していきます。
licenseファイルの内容を読み込み、変数にセット。
その後、端末名を取得します。端末名はEnvironment.MachineNameで取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/fc875f64-f8f2-d185-dc31-a0d7059c25dd.png)

## 初回起動か判定
licenseファイルに端末名が記載されていなければ、初回起動とみなします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2836c01f-fe38-1795-75bd-0ab0cfe3041e.png)

###初回起動の場合
初回起動の場合は、licenseファイルに端末名を書き込み保存します。
次回起動からは、licenseファイルに端末名が書き込まれている状態となるので初回起動とはみなされなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/be37a4a5-ddfa-71e0-2ceb-c6819dc3a972.png)

trialファイルには、処理日+30日の日付をyyyy/MM/dd形式で書き込み保存します。
トライアル期限を60日などにしたい場合は+60としてあげれば良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/dc8c9c6e-f8ba-4f58-a9a1-e744c055ce09.png)

###初回起動でない場合
licenseファイルに記載された端末名と、取得した端末名が合致するかチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4b5593ba-3c5d-1dc2-dba6-3065f2c3905e.png)

**端末名が合致しない**場合、ワークフローを終了します。
licenseファイルに記載された端末以外では実行されないというわけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5c769023-2d79-523c-2068-fe44d8485985.png)

**端末名が合致する**場合、今度はトライアル期限が切れていないかチェックします。
trialファイルに記載された日付と処理日を比較します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/52a57044-e460-0bfb-2d94-488eef20e8d5.png)

**トライアル期限日 >= 処理日**の場合、まだ期限内なので残日数をダイアログ表示して、
後続処理に繋げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2418a505-a4a3-3c2e-77e3-8c19d62843dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/11bcce41-63aa-f0b8-45de-4ff58a5891ea.png)

**トライアル期限日 < 処理日**の場合、期限切れなのでその旨を伝えるメッセージを表示し、
ワークフローを終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/471a9c62-ec35-eab1-8643-aa626b6a1571.png)

## パッケージングする
あとはパッケージングするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/56f8bf13-cee9-3e64-b646-dd3962168bd2.png)

既定の場所にパブリッシュされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/442a7e2a-2821-556a-07a4-e8e138fde2fa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/29d58abc-4781-1818-5481-63a3318e2b36.png)

##まとめ
ポイントは、**licenseファイルとtrialファイルもまとめてパッケージングされるので、外部から変更される心配が少ない**というところです。

注意点としては、必ず1度は対象端末でロボットを実行する必要があるという点です。
そうしないとlicenseファイルとtrialファイルに情報が書き込まれず、今回の実装の意味がなくなってしまいます。

ファイル展開
⇒license, trialファイル書き換え
⇒↓の方法でnupkgファイルを作り直す
http://sourcechord.hatenablog.com/entry/2016/02/07/150350
で縛りの回避は可能かもしれませんが、やったことありません←

ご参考まで～
GASでtwitterアナリティクスのcsvをパースする

先日、会社の人からこんなご相談がありました。

```
企画の人　「twitterアナリティクスのcsvをexcelで開いたら文字化けして読めないんですよ・・・」
ワイ　「なるほど？それ文字コードでは？」
企画の人　「文字コードって何？」
```

excelのメニューからデータ->テキストファイルでインポートウィザードが起動するので、そこで文字コードをUTF-8に設定すれば解決しそう[^0]ではあるんですが、説明しても何度も同じこと聞かれそうだし、他の問題も起こりそうなので、googleAppsを使って解決しようって流れになりました。

# 作業フロー
1. twitterアナリティクスからcsvをDLする（手作業）
    - twitterのホームを開く -> 左上の自分のアイコンをクリック -> アナリティクス -> ツイート -> データエクスポート
3. GoogleDriveにデータをアップロード
4. SpreadSheetでGASを実行

# twitterアナリティクスCSVの仕様
１行目に項目名が入っているのでそこを見ればだいたいわかります。

|順番|項目名|
|:--|:--|
|1|ツイートID|
|2|ツイートの固定リンク|
|3|ツイート本文|
|4|時間|
|5|インプレッション|
|6|エンゲージメント|
|7|エンゲージメント率|
|8|リツイート|
|9|返信|
|10|いいね|
|11|ユーザープロフィールクリック|
|12|URLクリック数|
|13|ハッシュタグクリック|
|14|詳細クリック|
|15|固定リンクのクリック数|
|16|アプリ表示|
|17|アプリインストール|
|18|フォローしている|
|19|ツイートをメール送信|
|20|ダイアル式電話|
|21|メディアの再生数|
|22|メディアのエンゲージメント|
|23|プロモのインプレッション|
|24|プロモのエンゲージメント|
|25|プロモのエンゲージメント率|
|26|プロモのリツイート|
|27|プロモの返信|
|28|プロモのいいね|
|29|プロモのユーザープロフィールクリック|
|30|プロモのURLクリック数|
|31|プロモのハッシュタグクリック|
|32|プロモの詳細クリック|
|33|プロモの固定リンクのクリック数|
|34|プロモのアプリ表示|
|35|プロモのアプリインストール|
|36|プロモのフォローしている|
|37|プロモのツイートをメール送信|
|38|プロモのダイアル式電話|
|39|プロモのメディアの再生数|
|40|プロモのメディアのエンゲージメント|

本文に改行が入った場合CSVも改行されます。また本文中の `"` は `""` に変換されます。[^1]
また、日時はISO8601のサブセットぽいですが、 `new Date(csvの内容そのまま)` ってやるとNaNなので `-` を `/` に変換が必要です。[^2]
今回集計したい内容のみを抜き出しているので全ての項目を使ってるわけではありません。

# コード
https://gist.github.com/regtan/739935e938f00636f9b8570ebfe18131

# どういうことやってんの？
Googleドライブに入っているCSVファイルを読んでユーザー名を特定し、ユーザー名と同じ名前のシートにデータを書き込み、処理の終わったファイルは別のフォルダに移動しています。GASには `Utilities.parsecsv(string)` という便利なAPIがありますので最終的にはこのAPIが解釈してくれるようにtwitterアナリティクスのCSVから都合の悪い部分を取り除いて処理をしています。

SpreadSheetのデータインポートだとうまく解釈するくせに `Utilities.parsecsv(string)` だとぐちゃぐちゃになるのはなんだかなんだかなーって感じ[^3] です。twitter様におかれましては本文中の改行もエスケープしてください。お願いします。

-- 2019/08/28追記
色々運用してみたところ、本文に `^M` が入ることがあることがわかりました。これもよしなに取り除く必要があります。(replace(/\r/g,'')して取り除きましょう)


# これ使いたいんだけどー

1. このスプレッドシートをコピー https://docs.google.com/spreadsheets/d/1EF99GP5uZ8xzAdQ8pJJgnTGIQUJNn8G7eSGv_wkZtr8/edit?usp=sharing
2. このコードを上のシートのスクリプトエディターにコピー&ペースト https://gist.github.com/regtan/739935e938f00636f9b8570ebfe18131
3. コピペしたコードの `sourceForlderId` と `archiveForlderId` 自分のフォルダIDに書き換え
4. twitterアナリティクスのデータを上で指定したフォルダに入れてマクロ実行

一回シートが作られると、同じユーザーのデータは同じシートに追記していきます。古い方向には追記しない。新しいものだけ追記していきます。


[^0]: 解決すると思ったんですが、本文中の改行の問題でうまくいかないと思う
[^1]: https://gist.github.com/regtan/739935e938f00636f9b8570ebfe18131#file-twitteranalytics-gas-L24 この辺でよしなにやってます。
[^2]: https://gist.github.com/regtan/739935e938f00636f9b8570ebfe18131#file-twitteranalytics-gas-L51 この辺りでよしなにやってます。この形式なんていうんだっけ・・・
[^3]: https://saenai-movie.com/ 秋公開
form.labelの使用方法

#参考リンク
[Railsドキュメント](http://railsdoc.com/form)

###form.labelの項目を変更する。
```app/views/courts/_form.html.erb
  <div class="field">    
    <%= form.label :store_name %>
    <%= form.text_field :store_name %>
  </div>

  <div class="field">
    <%= form.label :address %>
    <%= form.text_field :address %>
  </div>
```
項目名としてstore_nameを「店舗名」に、addressを「住所」に変更したい。
↓

```app/views/courts/_form.html.erb
  <div class="field">    
    <%= form.label :store_name, "店舗名(必須)" %>
    <%= form.text_field :store_name %>
  </div>

  <div class="field">
    <%= form.label :address, "住所" %>
    <%= form.text_field :address %>
  </div>
```

と、変更すると理想通りviewで表示される。
pip installをオフラインで行う



使う環境が少ないので備忘録として書いております。
間違ってたり誤字脱字があれば指摘していただけると幸いです

##環境

- Windows10 32bit たまたま手元にあったのがこれだった。
- Python 3.6.4

##準備

オフライン環境でインストールしたパッケージは
先にダウンロードしておく必要がある

pip にダウンロード機能があるのでそれを利用する
※この段階ではネット環境があるPCで作業する必要がある

```:cmd
pip download -d src --no-binary :all: パッケージ名
or
pip download -d src パッケージ名
```

インストール時のビルドの関係で--no-binaryオプションをつけてダウンロードしてるとだめやつも
いるらしいので両方準備しておくのが先決

オプションに関しては下記参照
https://pip.pypa.io/en/stable/reference/pip_download/#


別途pipのバージョンも上げたいので
pipの最新版のパッケージも同様にダウンロードもしくは[ここ](https://pypi.org/simple/pip/)から
現状時最新の19.1.1

##オフラインインストール方法

準備でダウンロードしてきたパッケージ群を適当なフォルダに入れ込む

はじめにpipのバージョンを上げる

```:cmd
python -m pip install -U pip-19.1.1.tar.gz
```

pip listで確認19.1.1になってたらおｋ


ここから本題だけど実際インストールもさほど変わらない

```:cmd
pip install --no-deps ダウンロードしてきたやつ
```

これで大概のパッケージはインストールできるはず


##今回、ハマったこと

virtualenvをインストールするのに上記のコマンドではエラーがでた

```:エラー内容
ERROR: Command "'C:\Users\ユーザー\AppData\Local\Programs\Python\Python36-32\python.exe' 'C:\Users\ユーザー\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pip'install --ignore-installed --no-user --prefix 'C:\Users\ユーザー\AppData\Local\Temp\pip-build-env-y15yfi5_\overlay' --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'setuptools >= 40.6.3' 'wheel >= 0.29.0'" failed with error code 1 in None
```

たぶん要約するとsetuptoolsとwheelが規定以上バージョンが無い
だと思うんですが

この２つを最新にしても変わらず････
~~てか--no-deqsのオプションで依存パッケージに関しては無視するはずなのに･･･~~

というわけでインストールできなかったんですが

###解決

pipのオプションに[--find-links]で依存パッケージ等必要ならこの先から見つけてね☆
みたいなのがあるらしいので試したら行けた

のでsetuptoolsとwheelの最新をpip download
オフラインPCの同一フォルダに格納しておく

```:cmd
pip install --find-links ２つが入ってるフォルダパス --no-deps virtualenv-～～～.tar.gz

～～～はバージョン
```


うぇーい出来た☆彡
一応不安になったので仮想環境作成したりもしたけど問題なく動作しているみたいだった

これでもうあらかたのパッケージはオフラインでもインストールできるんじゃないかなと思っております。
AWS 『Identity and Access Management(IAM)』




#IAMとは
![AWS_IAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/8cbbfe2a-3cf3-774b-4ecf-37ba97003f99.png)
[画像：CloudBerry Lab](https://www.cloudberrylab.com/resources/blog/aws-iam-policy/)

AWS操作を実施するための認証・認可の仕組み

- __どのサービス（リソース）の__
- __どういう機能や範囲を__
- __誰に__

付与するのかを決めることができる。

#IAMの機能
IAMには以下の4つの機能を用いてユーザーに権限を付与する。

- __IAMポリシー__
- __IAMユーザー__
- __IAMグループ__
- __IAMロール__

権限付与の流れとしては以下のようになる。

1. AWSサービスやリソースに対する操作権限を__『IAMポリシー』__として定義する
2. IAMポリシーを__『IAMユーザー』__や__『IAMグループ』__にアタッチ（付与）する

#AWSのアカウントの種類
AWSのアカウントは以下の２つに大きく分類される。

- ルートユーザー
- IAMユーザー

###ルートユーザー（AWSアカウント）
AWSの全サービスに対して操作できる権限を持っている非常に強力なアカウント。
多要素認証(Multi-Factor Authentication, MFA)の設定をし、セキュリティーを強くする。

__特徴__

- AWSアカウント作成時に作られるIDアカウント
- 全てのAWSサービスとリソースを使用できる情報を有するユーザー
- 日常的なタスクはルートユーザーを使用しないことが強く推奨される

###IAMユーザー
IAMポリシー内でAWSサービスを利用できるユーザー。基本操作はIAMユーザーで実施することになる。

#IAMポリシー
IAMポリシーは、__Effect(許可)__、__Action(どのサービス)__、__Resouuce(どの範囲、機能)__の3つのルールをJSON形式で記述し、AWSのサービスを利用する上での権限を設定する。

以下に、『IAM ユーザーが自分の S3 ホームディレクトリにプログラムおよびコンソールでアクセスすることを許可する』ポリシーの例を示す。

```JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "home/",
                        "home/${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name/home/${aws:username}",
                "arn:aws:s3:::bucket-name/home/${aws:username}/*"
            ]
        }
    ]
}
```

また、IAMポリシーは以下の２種類が使い分けられている

- インラインポリシー（対象毎に個別に適用する。管理が煩雑になるので基本的には使わない。）
- 管理ポリシー（複数のユーザー、グループに適用する。）

#IAMユーザー
AWSを利用するために各利用者に与えられる認証情報（ID）。以下の２つの認証方法がある。

- ユーザーIDとパスワード（Webコンソールのログインに使う）
- アクセスキーとシークレットアクセスキー（CLIやAPIからAWSのリソースにアクセスするときに使う）

#IAMグループ
ある権限を付与したグループにユーザーを入れることで、ユーザーの権限を容易かつ正確に管理することができる。
１人のユーザーが複数のグループに所属することも可能（最大１０グループ）。

#IAMロール
一時的にAWSリソースへのアクセス権限を付与するときに使用する。

__例__

- EC2インスタンス上で稼働するアプリケーションにAWSのリソースへのアクセス権限を付与する

インスタンスにロールを付与することで、プログラムや設定ファイルに認証情報を書かなくて済むので、セキュリティーの向上が期待できる。

#リファレンス
- [AWS Identity and Access Management](https://docs.aws.amazon.com/iam/index.html)
- [Amazon S3: IAM ユーザーが自分の S3 ホームディレクトリにプログラムおよびコンソールでアクセスすることを許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_s3_home-directory-console.html)
- [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け21時間完全コース）](https://www.udemy.com/aws-associate/)
link_toの使用方法(電話番号、メール、URL等のリンク化)

#参考リンク
[Railsドキュメント](http://railsdoc.com/view)
[MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/a)

#オリジナルアプリ内での使用例

####電話番号 ver.
```app/views/courts/show.html.erb
<p>
  <strong>TEL:</strong>
  <%= @court.tel %>
</p>
```
を

```app/views/courts/show.html.erb
<p>
  <strong>TEL:</strong>
  <%= link_to @court.tel, "tel:" + @court.tel %>
</p>
```
に変更する。

- tel:はstringにしなければいけないので、””で囲む。
- +を使うことでstring同士の足し算ができる。


####メール ver.
```app/views/courts/show.html.erb
<p>
  <strong>EMAIL:</strong>
  <%= @court.store_email %>
</p>
```
を

```app/views/courts/show.html.erb
<p>
  <strong>EMAIL:</strong>
  <%= link_to @court.store_email, "mailto:@court.store_email" %>
</p>
```
に変更する。


####URL ver.

```app/views/courts/show.html.erb
<p>
  <strong>URL:</strong>
  <%= @court.url %>
</p>
```
を

```app/views/courts/show.html.erb
<p>
  <strong>URL:</strong>
  <%= link_to @court.url, @court.url, { :target => "_blank" } %>
</p>
```
に変更する。
Nuxt.jsで「render function or template not defined in component」

Nuxt.jsの勉強をしていたところ、

```
render function or template not defined in component: 
```
のエラーが発生。

手順を追って解説してくれているサイト（ https://liginc.co.jp/449575 ）の通りに写経しているのに、なぜ、、、
と思いつつ、調べて解決しました。

Nuxt.jsのバージョンは v.2.8.1 です。

#先に結論
コンポーネントにHTMLを書くなら、template要素の中に書く必要がある。

#エラー内容と解決策
components/common/TheHeader.vue
components/common/TheFooter.vue
という２つのコンポーネントを書いたあと、
layouts/default.vue
の中身を、その２つのコンポーネントを呼び出すように書き換えたところで、エラー発生。

```
render function or template not defined in component: TheHeader
```

###エラー時点での各ファイルの内容

```vue:TheHeader.vue
<header class="header">
<div class="header-inner">
    <h1>my-portfolio</h1>
    自己紹介
  </div>
</header>
```
```vue:TheFooter.vue
<footer class="footer">© my-portfolio.</footer>
```


###それぞれ、こうしたらエラーが解消されました。

```vue:TheHeader.vue
<template>
<header class="header">
<div class="header-inner">
    <h1>my-portfolio</h1>
    自己紹介
  </div>
</header>
</template>
```
```vue:TheFooter.vue
<template>
<footer class="footer">© my-portfolio.</footer>
</template>
```


#おわりに
当たり前のことではありますが、エラーメッセージが最大のヒントですね。
今回も「render function か template が componentの中に定義されてないよ」と出ているわけなので。
Boostnoteをアップデートしたらテーマが反映されなくなった

## 起こった問題

こんにちは。**Boostnote**の愛用者である僕です。

先日、Boostnoteのアップデートが来ていたので、何も考えずにアップデートしました。
すると

![Boostnote_IPIgtjclxi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/970d0701-e882-adbc-946e-8bbe9cfd283e.png)

「え・・・:rolling_eyes:？」
「シンタックスハイライトは・・・:hushed:？」
「てかめっちゃ白い・・・せめて黒背景に白文字にして・・・:sob:」

という感じにシンタックスハイライトのテーマが正常に読み込めなくなってしまったようです。
ちなみに環境はWindows10です。

## 対処法

日本語の記事は見つけられず、英語で検索していると、[GithubのIssue](https://github.com/BoostIO/Boostnote/issues/3018)を発見。

つらつらと読み進めていると、[対処法を発見しました](https://github.com/BoostIO/Boostnote/issues/3018#issuecomment-495294972)。

`C:\Users\[User Name]\AppData\Local\boost\app-0.11.17\resources\app\compiled\main.js`
の4889行目を以下のように修正してください。

修正前

```main.js
	      path: path.join(directory.split(/\//g).slice(-3).join('/'), file),
```

修正後

```main.js
	      path: path.join(CODEMIRROR_THEME_PATH, file),
```

`directory.split(/\//g).slice(-3).join('/')`を`CODEMIRROR_THEME_PATH`に置き換えてください。


そしてBoostnoteを再起動すると・・・

![Boostnote_etsAUCFbDX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/7777d163-3f45-0f4b-c310-c7f627714539.png)

なおった:relaxed:

Issueでかなり騒がれてるので近いうちに修正来るとは思いますが、いったんはこれで治ります。
AWS Single Sign-Onを使ってみよう。

# TL;DR

aws SSOを使ってOrganizationアカウントで管理しているAWSアカウントへのログイン設定をします。
外部アプリケーションとの連携は試してみません。
ログインは楽だし、ユーザー管理も楽なので、いろんなアカウントにログインしなければならない人がいる＆何かの事情でアカウントの追加削除が多い場合には役に立ちそうだよ。

# AWS SSOって？

AWS Single Sign-On(SSO)はAWSアカウントを複数持っている場合、ユーザーやポリシーを一元管理できるAWSのサービスのひとつです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/8d25cebb-a3df-728b-5eae-4ee03616843b.png)


awsのOrganizationアカウントで支払いを一括管理しているのであればSSOを設定すればOKです。逆にしていないようであればOrganization設定を先に済ませておいてください。

ユーザーポータルのURLから各AWSアカウント/ロールにログインするイメージです。

ログインするとこんな画面になります。黒塗り部分はAWSアカウント番号と名前が入っています。
DevelopersやMonitorsは後述のアクセス権限セット(ロール)名が記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/cfdb115f-0b44-343d-c7bc-1a64210be421.png)


# 項目説明

## ディレクトリ

SSOでのユーザー/グループを設定します。
Windows ADと連携することもできます。
なので、社内組織的なグループを設定するものかと思われます。

## AWSアカウント

↑のディレクトリで設定したユーザー/グループと後述するAWS組織、アクセス権限セット(Permission set)と紐づけます。

### AWS組織

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/078b569b-a4a6-dab2-8f97-45bd2fe58722.png)

AWSのアカウント名と設定されているアクセス権限セット(Permission set)が表示されます。


### アクセス権限セット

アクセス権限セットの一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/1a96f0ac-98b4-e45a-e3ef-20a0b653440f.png)

# 作成の仕方

アクセス権限セットを一通り作ってから、AWS組織にアタッチしていく感じがよろしいかと思います。
アクセス権限セットのページから「新しいアクセス権限セットを作成」で作成します。

よくあるポリシーとして既存のポリシーを使用してもよいし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/36f17577-e77a-ccff-2064-ecf97fe70ae5.png)


自身で作ることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/885fb920-7458-3b43-d955-15bc4df49de3.png)


ただし、複数のカスタムポリシーを当てることはできません。「カスタムアクセス権限ポリシーを作成」にまとめて記載します。
AWSの既存ポリシーであれば、複数当てることができます。

IPアドレスによるアクセス制限や、s3のバケット別にポリシーを作りたい場合には「カスタムアクセス権限ポリシー」にまとめて記載しましょう。


# ログインしたときの挙動

SSOを使ってログインすると、SSOが各AWSアカウントに専用ロールが作成されます。

Monitorsでログインするとこんな感じに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/bc618e2d-5324-98cd-3cfa-4af7b595965b.png)

CloudTrailでのログの表示はどのロールで、どのユーザーが操作したのかまで表示されますので安心できます。
(userIdentity.principalId, userIdentity.arnに記載されます。)

# まとめ

これでブラウザのプロファイルを分けて別のアカウントを見るたびにログインする毎日とはサヨナラさ。
~~いまいちなのは、MFAでの2段階認証を行うには自前でRADIUSサーバなどを用意しないといけないところ。一応デバイスを覚えてくれる＆メールでの2段階認証は設定できます。~~ 2FAデバイスの登録ができるようになっていました。
すでにAWSアカウントに直接ログインしているユーザー存在する場合には、SSOアカウントに移行後に古いアカウントを削除する必要があるので、めんどくさいけどやる価値はあるかなー。どうかなー。

ログインは楽だし、ユーザー管理も楽なので、いろんなアカウントにログインしなければならない人がいる＆何かの事情でアカウントの追加削除が多い。
なんて場合には役に立ちそうだよ。
lessで表示中の内容をvim（または任意のエディタ）で開く

## ディスク上のファイルを表示している場合

```
$ less hoge.txt
```

のようにしてファイルを表示中の場合、less上で`v`を押せばエディタが起動してそのファイルを編集できる。起動するエディタは環境変数`VISUAL`または`EDITOR`で指定できる。

## 標準出力をパイプでlessに表示させている場合

```
$ grep hoge hoge.txt | less
```

のようにlessの入力が標準入力である場合、`v`を押しても`Cannot edit standard input`と表示されてエディタは起動しない。
そこで`g|$vim -`とタイプし最後にエンターを押すとvimが起動する。
`g`はバッファの先頭に移動。
`|`はパイプコマンド。
`$`はバッファの末尾を表すマーク。
`vim -`は標準入力からテキストを読み込んでvimを起動するコマンド。

### ファイルに保存する方法
less上で`s`を押すと`log file: `と入力を求められるので、ここでファイル名を入れると表示中の内容をファイルに保存できる。そのままless上で`!vim ファイル名`とタイプしエンターを押すとvimが起動する。

## 参考
https://unix.stackexchange.com/a/43460/157267
ニートの自然言語処理100本ノック:33

こちらもほぼ前回のコードをちょっと変えただけ
一応他のpos 動詞や変格活用に対処できるようにしている。

```python
"""
33. サ変名詞
サ変接続の名詞をすべて抽出せよ．
"""

import MeCab
from pprint import pprint
from n30_execise import maping_morphology
from n31_execise import load_mecab_file,extract_verb_type_all


def extract_pos_pos1_all(analyzed_list,pos="名詞",pos1="サ変接続"):
    '''
    動詞「する」に接続してサ行変格活用の動詞となりうる名詞を抽出する
    pos:str
        今回の場合:名詞
    pos1:str
        今回の場合:サ変接続
    '''
    irreg_conjugate_posList = []
    
    for mapped_morphology in analyzed_list:
        if mapped_morphology['pos'] == pos:
            if mapped_morphology['pos1'] == pos1:
                irreg_conjugate_posList.append(mapped_morphology['base'])
            else:
                continue
        else:
            continue

    return irreg_conjugate_posList


if __name__ == "__main__":

    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)
    # サ変名詞の名詞を全てリスト格納
    nouns_list =  extract_pos_pos1_all(analyzed_list,"名詞","サ変接続")
    pprint(nouns_list)
```
# 出力結果
 養', '運動', '吹聴', '発明', '病気', '病気', '往生', '薨去', '寂滅', '号', '洋行', '横断', '往復', '呼吸', '*', '呼吸', '*', '推論', '全快', '広告', '相当', '到着', '遭遇', '帰宅', '進化', '機能', '狂', '抵抗', '*', '換言', '使用', '*', '実行', '運動', '運動', '運動', '運動', '運動', '運動', '鑑定', '運動', '運動', '評価', '変化', '変化', '融通', '進歩', '運動', '運動', '往来', '運動', '運動', '運動', '説明', '承知', '困窮', '因', '運動', '運動', '横行', '運動', '実行', '運動', '運動', '運動', '刺激', '競争', '刺激', '興奮', '運動', '*', '成功', '供', '*', '運動', '*', '成功', '*', '運動', '*', '運動', '遊戯', '抵抗', '背面', '運動', '教育', '背面', '前進', '右往左往', '右往左往', '活躍', '調和', '装飾', '実用', '利用', '活躍', '活躍', '運動', '廻転', '前進', '休息', '身動き', '運動', '運動', '解釈', '研究', '関係', '即答', '運動', '運動', '運動', '判断', '運動', '際会', '小便', '小便', '小便', '影響', '研究', '*', '集合', '集合', '*', '運動', '妨害', '注文', '休息', '探偵', '真似', '到着', '休息', '請求', '運動', '御馳走', 'ごつごつ', '*', '換言', '了見', '下向', '軽蔑', '相違', '抵抗', '利用', '変化', '運動', '一言', '平行', '左右', '運動', '一周', '休息', '推参', '運動', '返答', '猶予', '挨拶', '分', '逗留', '運動', '保証', '運動', '中止', '啓', '退却', '深入り', '真似', '看過', '侮辱', '退却', '話', '象徴', '反応', '呈出', '圧倒', '進呈', '運動', '運動', '吸収', '判然', '区別', '摩擦', '安眠', '*', '*', '誤解', '繁殖', '真似', '*', '*', '豹変', '利用', '摩擦', '分別', '全滅', '蔓延', '我慢', '実行', '工夫', '病気', '分別', '思案', '影響', '相違', '病気', '夭折', '案出', '験', '設備', '思案', '屹立', '訪問', '嫉妬', '養成', '教育', '軽蔑', '意味', '堕落', '相違', '断定'
```
特許・実用新案・意匠・実用新案　特許権の分類についての簡単なまとめ

基本情報技術者の内容でもある特許権について分類を調べたので簡単なまとめ。
[http://www.cotech.co.jp/ipr/](http://www.cotech.co.jp/ipr/)
こちらのサイトの内容をまとめたものです。

##特許・実用新案
**特許制度**は産業の発展に寄与する発明を硬化する代償として、
一定期間その発明を独占的に実施できる特許権を国が付与する制度。

「発明」とは、
・自然法則を利用した技術的思想の創作の内高度のもの（特許法第2条）

**実用新案制度**も
・自然法則を利用した技術的思想の創作（実用新案法第2条）
である公安を保護するもので*本質的*には一緒だが保護対象が
「物品の計上・構造または組み合わせに係る考案」（実用新案法第3条）となっている。

『つまり』
特許≓実用新案

・特許制度＝発明を模倣から守る
ex)消せるインク（ボールペン）
・実用新案制度＝物品の形状・構造等の発明を守る

```
【特許】
保護対象：
・物の発明
・方法の発明
・製造方法の発明

保護期間：
・出願の日から20年間（医薬などに限り最大5年延長）
```

##意匠（いしょう）※読み方定かではなかったので一応ｗ
**意匠**とは
・物品の形状、模様、もしくは色彩またはこれらの結合、資格を通じて美観を起こさせるもの。
ex)イヤーポッド（Apple.Inc）
   siriの起動画面のデザイン、アイコン（〃）

意匠制度は、デザイン（意匠）を新しく捜索した創作者（または、その承継人）に対し、
独占排他的な意匠権を一定期間付与する制度

『つまり』
デザインや見た目（形・色・模様）に対しての保護制度

```
保護対象：
・物品の形状の意匠
・物品の形状と模様が結合した意匠
・物品の形状と色彩が結合した意匠
・物品の形状と模様と色彩が結合した意匠

保護期間：
登録した日から20年間

```


##商標

**商標**とは
・サービスや商品に着けるロゴ、ネーミング、ブランド等

商標制度は、事業者が自己(自社）の扱う商品・サービスを他人(他社）のものと区別するために使用するマーク（識別標識）
ex)・お茶の見た目がほぼ一緒なので、ラベル・ロゴなどを付けてくべるできるようにする(カスタマーに)
   ・Coca-Colaのロゴ

```
保護対象：
・文字、図形、記号、立体的形状などの商標

対象期間：
・登録日から10年間（10年単位で更新可）

```

#####と、いうようになっているそうです。
####大雑把にいうと、アイデア・デザイン・ブランドの各々の保護みたいな感じですね。
YAMLの参照機能

# YAMLの参照機能

YAMLに参照機能があるのを、いまさら知ったので、覚書メモ。
- *YAMLはちゃんとしたモジュールを使って読み込まないと危険*

## 実験したログ

### とあるキー以下を他で再利用したい場合

キーの後ろで「&」をつけて参照用の名前をつけてあげる。

``` :test1.yml
とあるキー: &参照名
  Item_A: Item_A_Value
  Item_B: Item_B_Value
```

これをjs-yamlあたりを利用したjsで実行して、構造を出力すると

``` :結果
$ node yamlview.js test1.yml
{ 'とあるキー': { Item_A: 'Item_A_Value', Item_B: 'Item_B_Value' } }
``` 

こうなる。
この参照を別のキーとして複写するだけなら

``` :test2.yml
とあるキー: &参照名
  Item_A: Item_A_Value
  Item_B: Item_B_Value
複写するだけなら: *参照名
```

``` :結果
$ node yamlview.js test2.yml
{ 'とあるキー': { Item_A: 'Item_A_Value', Item_B: 'Item_B_Value' },
  '複写するだけなら': { Item_A: 'Item_A_Value', Item_B: 'Item_B_Value' } }
``` 
と中身が複写されてる様にみえる。
データ構造を再びdumpすると

``` :dump結果
$ node yamldump.js test2.yml
とあるキー: &ref_0
  Item_A: Item_A_Value
  Item_B: Item_B_Value
複写するだけなら: *ref_0
```

と、リファレンス参照を保持したままになっている。
これだけみてると中身の実体を複写している訳ではなさそう（たぶん）

次に、別のキーにて、とあるキーをベースにしてキーを定義する。
さらに追加したい場合や更新したい場合は中身も記載する。
今回は、

- Item_Aの中身を更新
- Item_Cを追加

します。

``` :test3.yml
とあるキー: &参照名
  Item_A: Item_A_Value
  Item_B: Item_B_Value
複写するだけなら: *参照名
別のキー:
  <<: *参照名
  Item_A: Item_AAA_Value
  Item_C: Item_C_Value
```

``` :結果
$ node yamlview.js test3.yml
{ 'とあるキー': { Item_A: 'Item_A_Value', Item_B: 'Item_B_Value' },
  '複写するだけなら': { Item_A: 'Item_A_Value', Item_B: 'Item_B_Value' },
  '別のキー':
   { Item_A: 'Item_AAA_Value',
     Item_B: 'Item_B_Value',
     Item_C: 'Item_C_Value' } }
```

と、複写するだけの部分は先程のリファレンス参照を保持したままだけど、いじったりしている方は、実態を複写してそうにみえる。
更新する場所を、大雑把にやりすぎるとメモリの節約にならないかも？（もちろんデータ定義の手間と品質は良くなるとは思いますが）

## 参考

### 準備まわり
参考までにyaml表示するのに利用したnode-jsまわり

```
$ node init
$ node install js-yaml
```

### 使ったスクリプト

``` js:yamlview.js
const fs = require('fs');
const jsYaml = require('js-yaml');

try {
    const yamlData = fs.readFileSync(process.argv[2], 'utf-8');
    const hashData = jsYaml.safeLoad(yamlData);
    console.log(hashData);
} catch (e) {
    console.log(e);
}
```

``` js:yamldump.js
const fs = require('fs');
const jsYaml = require('js-yaml');

try {
    const yamlData = fs.readFileSync(process.argv[2], 'utf-8');
    const hashData = jsYaml.safeLoad(yamlData);
    const textData = jsYaml.dump(hashData);
    console.log(textData);
} catch (e) {
    console.log(e);
}

```
コンソールで文字数をカウントする

コンソールで文字数をカウントする方法。

## 一行の場合

```terminal
$ echo -n '文字列' | wc -m
```

* `echo -n`: `-n` オプションで出力文字の最後を改行させない。
* `wc -m`: `-m` オプションで文字数を表示。(マルチバイト文字対応)

## 複数行の場合

```terminal
$ echo -n '文字列' | tr -d '\n' | wc -m
```

* `tr -d '\n'`: `-d` オプションで改行コードを削除。
Azure DevOps とは？

[Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops/)は、マイクロソフトが提供する開発を楽にしてくれるサービスです。
主に、"アジャイル開発"とか"DevOps"とかいわれる開発を支援してくれます。
（もちろん、ウォーターフォール開発でも十分に威力を発揮してくれるサービスです）
ざっくりいうと、ステキなプロジェクト管理ツール群です。

# Azure DevOpsはサービス群の総称－ブランド名
アプリケーションを開発する上で、何かしらのツールや手作業で実施しているタスクが存在すると思います。
Azure DevOpsは、そのようなツールやタスクの可視化や管理を請け負ってくれます。
[Visual Studio](https://visualstudio.microsoft.com/)のように直接的に開発作業を実施するものでも、[Microsoft Azure](https://azure.microsoft.com/)のような具体的なサービスを提供する環境でもありません。
Azure DevOpsは、開発やリリースをはじめとする様々なことを支援してくれます。

主なサービスは次の４つがあります。

## Boards（ボード）
何を作るのか、どう作るのか、そのために何をするのか、今どれくらいできているのか
このような情報は、ソフトウェア開発をする上で何らかの形で記録、保存していると思います。
例えば、"WBSをExcelで書いて進捗確認する""要求仕様書をWordで書く""Q&A一覧表を作成してミーティングでお客様に確認する""お客様と取り決めた内容を議事録に残す"というようなことです。
Boardsを使うと、これらと同じようなことを実施できます。

## Repos（リポ）
ソースコードを作成したら、何らかの形で保存し共有するかと思います。またコードレビューを実施してレビュー記録票を作成される方もいらっしゃると思います。
ReposはGitというリポジトリの機能を有しており、これらと同じようなことを実施できます。

## Pipelines（パイプライン）
プログラムが出来上がったら、コンパイルし単体テスト等を実施します。また結合テスト用の環境にデプロイ(プログラムの配置)を実施するかと思います。
Pipelinesはこれらの作業を実施する環境を提供してくれます。
（もう誰かのPCが壊れたらコンパイルできないという悲劇からは解放されます）

## Test Plans（テストプラン）
最近のテストは"自動化"が流行りです。
しかしながら、それではまかなえないテストが存在することも事実です。
例えば、品質保証部門がリリース前に実施する人間系のテストです。
Excelで作ったテスト表を元に手動でテストを実施して、バグや懸念が発見されたときは１つ１つエビデンスを保存し、開発部門に返すという作業があるのではないでしょうか。
Test Plansは、このような人間系で実施しなければならないテストを支援してくれます。

# まとめ
他にもサービスはあります（例えばArtifacts）が、まずはここまでの存在を理解できればいいと思います。
ウォーターフォールを意識しながらまとめると、例えばこんな感じです。
![20190618-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/84249b87-ecf5-69d6-9ecf-b94262e7959a.png)
React.js 学習メモ　第4回

最近Reactの勉強を始めたので、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#Redux 
Reduxを学習します！しかし英語なので不安なので翻訳された物も見ながらやりました。
ほとんど、翻訳された記事をメインに読んでしまいましたが

[Redux公式チュートリアル](https://redux.js.org/basics/basic-tutorial)
[Redux入門【ダイジェスト版】10分で理解するReduxの基礎](https://qiita.com/kitagawamac/items/49a1f03445b19cf407b7)

- Reduxの各機能を物流？で例えると
    - Action
       - 何をするのかの情報を持ち、指示する。　**マニュアル(手順書）の様な物**

    - dispatch
       - データの送信、機能の呼び出しなど。　**トラックで出荷の様な物**
    - Store
       - アプリケーション内の状態を保存しているところ　**倉庫の様な物**
    - State
       - アプリケーションでの状態　**在庫みたいな物**
    - Reducer
       - dispatchされた時にStore内にある、Stateを変更するためのメソッド。引数のactionと現在保持しているStateをReducerへ渡し、新しいStateを作成する。引数のStateを更新することはせず、新しいstateのオブジェクトを作成して返す。　**物流データを管理する場所？**

例えが、微妙かもしれませんが、大体こんな感じなのかなと思いました。
下記の画像がReduxの一通りの流れです。

ユーザの操作 → View → Action → Reducer → State → View → ユーザへの表示の順
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31313433332f35386434346533312d346630652d323530662d623663652d6430393266373432666437372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394657/20a78f3a-b13e-c0f1-9c9b-99e2a15da3cf.png)


#Reduxが必要な理由
JavaScriptで開発されるシングルページアプリケーションが複雑になるにつれて、管理しなければいけない状態(state)の数が増えていきます。そのため新機能開発やバグ修正などがとても大変になります。
>その複雑さは『変化(mutation)』と『非同期性(asynchronicity)』という２つの概念を混在させていることにより起こるものです。

ややこしい...

Reactのようなライブラリは、非同期と直接DOM操作の両方を削除することによって、ビューレイヤでこの問題を解決しようとします。
しかし、状態(state)の管理はユーザーに任せられたままであるので、『Redux』はその状態（state）管理の複雑さを解消するために開発されました。

#振り返り
Reduxの流れは掴むことができてはきたた。Reactのみでは複雑な状態を管理するのが難しくなったのでReduxが管理しやすくしてくれている。このReduxの流れを実際にコードに落とし込んだものを見て理解を深めていきます。
ニートの自然言語処理100本ノック:32

前回の投稿でとんでもないミスをしていたので修正した。

```
'Surface':tmp_list[0],'base':tmp_list[-3],'pos':tmp_list[1],'pos1':tmp_list[2]
```
のインデックスを思いっきり間違っていた。
不注意の極みである。

```python
"""
32. 動詞の原形
動詞の原形をすべて抽出せよ．
"""

import MeCab
from pprint import pprint
from n30_execise import maping_morphology
from n31_execise import load_mecab_file,extract_verb_type_all




if __name__ == '__main__':
    
    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)
    # 動詞の原型を全てリスト格納
    verb_list = extract_verb_type_all(analyzed_list,"base") 
    pprint(verb_list)

```
コード再利用のため自然言語処理31のコードを少し変換した。
typeを自分で選択できるようにした。

```python
def extract_verb_type_all(analyzed_list,type="Surface"):
    '''
    動詞の表層形をすべて抽出する
    '''
    verb_surface_list = []

    for mapped_orphology in analyzed_list:
        if mapped_orphology['pos'] == '動詞':
            verb_surface_list.append(mapped_orphology[type])
    
    return verb_surface_list
```
【Python3】括弧と括弧内文字列削除

不動産のデータを普段から触っていると，物件名称ひとつとってもフォーマットがまちまちです．

その代表的なものとして，「括弧と括弧内文字列が~~邪魔~~ない状態で管理したい」というものがありますが，汎用的な関数な気がするので乗せておきます．

ちなみに，括弧内にさらに括弧があってもちゃんと削除できます．

# output

```Python
import re

def delete_brackets(s):
    """
    括弧と括弧内文字列を削除
    """
    """ brackets to zenkaku """
    table = {
        "(": "（",
        ")": "）",
        "<": "＜",
        ">": "＞",
        "{": "｛",
        "}": "｝",
        "[": "［",
        "]": "］"
    }
    for key in table.keys():
        s = s.replace(key, table[key])
    """ delete zenkaku_brackets """
    l = ['（[^（|^）]*）', '【[^【|^】]*】', '＜[^＜|^＞]*＞', '［[^［|^］]*］',
         '「[^「|^」]*」', '｛[^｛|^｝]*｝', '〔[^〔|^〕]*〕', '〈[^〈|^〉]*〉']
    for l_ in l:
        s = re.sub(l_, "", s)
    """ recursive processing """
    return delete_brackets(s) if sum([1 if re.search(l_, s) else 0 for l_ in l]) > 0 else s
```

# usage

s = "渋谷ソラスタ　（旧呼称：(仮称)南平台プロジェクト）"
delete_brackets(s) # '渋谷ソラスタ\u3000'

# logic

## brackets_2_zenkaku

はじめに想定しうる半角の括弧を全部全角にする

## delete zenkaku_brackets

括弧内に括弧が入ってない文字列を削除

__'（[^（|^）]*）' というのが，__
__'（'と'）'に囲まれた文字列でかつ，'（'と'）'を含まない文字列にマッチする正規表現__

です．

## recursive processing

上のdelete zenkaku_bracketsを一度行うだけでは全部の括弧に対応できないので，再帰処理をしています．再帰処理については[再帰関数を理解するための最もシンプルな例](https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4)を参考にさせていただきました．

```Python
return delete_brackets(s) if sum([1 if re.search(l_, s) else 0 for l_ in l]) > 0 else s
```
は，

__文字列sにまだ括弧が残っていれば再度実行し，もし残っていなければそのときのsを返す__

というロジックです．
1分でCouchDBまとめ



現在扱っているHyperledger FabricがCouchDB対応なのでCouchDBについて調べてみました。

#CouchDBとは
- RDBとはほとんど類似点がないらしい

- ドキュメント方式
  - データをドキュメント単位で管理するDB
- スキーマレスで厳密なデータ構造を持たない
- ドキュメントは主にJSON形式で保存
 - だから各ドキュメントの構造の違いに対応しやすい
- 各ドキュメントに対して重複しないURIを割り当てる
- ドキュメントをまとめて保存する単位をデータベースという
- CouchDBサーバの中に複数のデータベースがあり、各データベースの中には複数のドキュメントが詰め込んであるイメージ
    -  なのでURIは/serverName/databaseName/documentNameという風に割り当てられる。
    
- ドキュメント操作はHTTPメソッドで行うことが出来る
    - なのでデータベース言語を使わなくても操作出来る


Hyperledger Fabricなどのコンソーシアム型ブロックチェーンだと共有のデータベースを管理するわけですが、そうなると参加している各組織でデータ構造を厳密に定義して共有するのは難しいのでCouchDBのようなデータ構造をあまり気にしなくてもいいようなDBが採用されているのかなと思います。

あとCouchDBの特徴が、RDBと比較して語られてることが非常に多かったのでRDBも勉強しないとな、とおもいました。


###参考図書

[“動物図鑑”で知るCouchDBの特徴 (1/3)](https://www.atmarkit.co.jp/ait/articles/0909/04/news105.html)


[IBM:CouchDB を探る](https://www.ibm.com/developerworks/jp/opensource/library/os-couchdb/index.html)
Vim個人的コマンドまとめ

サーバーで見るときvim使う機会があると思うので、個人的まとめです。

#vimでバイナリを編集する
$ vim -b file.bin
:%!xxd
バイナリ見ても、実際右にでてくるものをいじっても無意味

保存するときは
:%!xxd -r
してからじゃないと、そのままになるので注意
参考資料:https://qiita.com/urakarin/items/337a0433a41443731ad0

#ctags
ctags -R .で現状のディレクトリに作成
Ctrl-]：宣言元に飛び
Ctrl+t：戻る

homeディレクトリまでctagsがあるか確認する
.vimrc
```
set tags=.tags;$HOME
```

#option
余白の場合の差分は比較しない（常に追加すると逆に気づけなくなるのでコマンドベースのほうがよさそう）
:set diffopt=iwhite

#Vimdiff
vimdiff fail1 fail2でdiffmodeで開く

##Vimdiffよくつかうコマンド
zR:vimdiffの全てを開く
]+c:次の差分
[+c:前の差分
diffget:差分を受け入れる
diffput:差分を向こう側に入れる

##コマンド
% 対応した括弧（[](){}等）に移動します。

##git difftoolでvimdiff実施
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global merge.tool vimdiff
git config --global mergetool.prompt false

あとはgit difftool fileとかでvimdiffでみれる

#viで開いて、vsで水平展開してdiffをとる
:vs filename
:windo diffthis
//offする場合
:windo diffoff

##vimdiffのカラー設定（目に優しくない、もうちょっとなんとかしたい）
~/.vimrcに追加
highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=darkred
highlight DiffDelete cterm=bold ctermfg=10 ctermbg=darkblue
highlight DiffChange cterm=bold ctermfg=10 ctermbg=brown
highlight DiffText   cterm=bold ctermfg=10 ctermbg=darkmagenta

##Vimgrep&結果をQuickfixに表示
:vimgrep  sample /decompress/ *  | cw
ctrl + oで戻る

#参考資料
https://sgry.jp/blog/2014/11/24/1811/comment-page-1/
https://qiita.com/aratana_tamutomo/items/59fb4c377863a385e032
VisualForceでPDFを作る

# VisualForceでPDFつくる。
忘備録なので大して詳しくないですし不親切です。
## 漢字でねぇぇ
bodyにStyleをいれましょう。こんな感じ。
`            body {
                font-family: Arial Unicode MS;
                font-size: 10pt;
                text-align: left;
            }`
VFのPDFで使えるダブルバイトのフォントは*Arial Unicode MS*のみなのでBodyに指定しないと出ないっす。
## テーブルにCSSきかねぇぇぇ
CSS定義しようが直接Style書こうが効かない時は効かないっす。
そんな時は。。。

* Styleに頑張ってCSSを書く
* TR、TDに直接Styleを書く
* TDの中にpやdivを埋め込んで書く

どうしてもheightが変わらなくてpを埋め込みました。。。
## LightningコンポーネントにVisualForceページを出したい
iframeで埋め込めばいい。
`<iframe src="{! '/apex/FooPage' }" width="100%" height="500px;" frameBorder="0"/>`
### 埋め込んだページを動的に更新したい
src属性を動的に変更してやればいい。
気を付けるのはURLに何らかの変化をつけいないとLightningでは更新が起こらないので、URLを動的に変える必要がある。
`       
var n = new Date().getTime();
cmp.set( "v.ifmsrc", '/apex/FooPage?t=' + n + parms);  `
みたいに時間をURLパラメータとして付加して変更してやると動的に変化する。
ニートの自然言語処理100本ノック:31

はじめの方にイモってparseToNodeを使わなかったので、微妙なコードかも知れない。
自分の癖として無駄にfor loopをしてリストにブチ込む癖があるので考えものである。
また今回は今回でコメントが短すぎる気もする。

```python
"""
31. 動詞
動詞の表層形をすべて抽出せよ．
"""
"""
31. 動詞
動詞の表層形をすべて抽出せよ．
"""
import MeCab
from pprint import pprint
from n30_execise import maping_morphology



def load_mecab_file(mecab_file):
    '''
    mecabファイルを読み込む
    '''
    with open(mecab_file) as mecab_data:
        mecab_text = mecab_data.read()
    
    return mecab_text


def extract_verb_surface_all(analyzed_list):
    '''
    動詞の表層形をすべて抽出する
    '''
    verb_surface_list = []

    for mapped_orphology in analyzed_list:
        if mapped_orphology['pos'] == '動詞':
            verb_surface_list.append(mapped_orphology['Surface'])
    
    return verb_surface_list


if __name__ == '__main__':

    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)
    # 動詞の表層を全てリスト格納
    verb_list = extract_verb_surface_all(analyzed_list)  

    pprint(verb_list)
```
```
'する',
 '云う',
 '云う',
 '云う',
 '出来る',
 'する',
 'ある',
 '読ん',
 '云う',
 'なる',
 '作っ',
 '始まら',
 '生れ',
 '挙っ',
 'する',
 'あり',
 'し',
 '出',
 'する',
 'なる',
 '読ま',
 'もっ',
 'てる',
 '作っ',
 'あらわれ',
```
[論文読み] Egocentric Gesture Recognition Using Recurrent 3D Convolutional Neural Networks With Spatiotemporal Transformer Modules(ICCV2017)

# Egocentric Gesture Recognition Using Recurrent 3D Convolutional Neural Networks With Spatiotemporal Transformer Modules(ICCV2017)

###### description: 論文読んだまとめ記事
###### url: http://openaccess.thecvf.com/content_ICCV_2017/papers/Cao_Egocentric_Gesture_Recognition_ICCV_2017_paper.pdf
自分なりに解釈したメモになります。
ミスがあったら優しく教えてください。

---

- Title
Egocentric Gesture Recognition Using Recurrent 3D Convolutional Neural Networks With Spatiotemporal Transformer Modules

- Conference
ICCV2017

- Authors
Congqi Cao, Yifan Zhang, Yi Wu, Hanqing Lu, and Jian Cheng
中国の大学から出た論文

---

## どんなもの?
本研究では、VR機器のようなヘッドマウントカメラから装着者自身のジェスチャー動作を**end-to-endな3D-RCNNで推定する**手法を提案する。

**特徴的な点として、STNを再帰結合と共に使ったモジュール(RSTTM)を提案している。**
この構造によって空間的及び時間的次元の両方において3Dの特長マップを標準の視点に変換する。

![](https://i.imgur.com/z5Ncazz.png)

## 先行研究と比べて何がすごい？
ヘッドマウントカメラからの認識を行う場合には、カメラが動くということと、視界が狭いという点が難しかった。
本研究では、カメラの動きに対して工夫しており、明示的に頭の動きを推定せずにend-to-endな推定を行う。

## 技術の手法や肝は？
STN(NIPS2015)は画像データに対して空間的不変性を得るためのモジュールであった。
本研究ではSTNを拡張して、3Dの特長マップを空間と時間の両方の次元で標準視点に変換するSTTM(spatiotemporal transformer module)を提案する。
STTMは以下の3つの要素で構成される。

- LocalizationNetwork
    変換のパラメータ推定.
    今回は最も一般的な射影変換であるホモグラフィー変換を選択した(4x4).
    アフィンは長方形を平行四辺形にしたが、ホモグラフィーは台形に変換できる.
- GridGenerater
    推定したパラメータで移動した点の座標は小数点以下を持つ値なので、これを整数に丸めて移動後の座標を修正する.
- Sampler
    上記の要素で得た値から実際に変換を行う.

STTMに再帰層を付けたモジュール(RSTTM)を使っている.

## どうやって有効だと検証したか
自作のデータセットを使って検証した。

- 自作データセット
    - RGBD
    - sample数
    24,000 gesture 
    3,000,000 frames

- 従来手法との比較
![](https://i.imgur.com/BJaSIVx.png)
静止時では1.6%の精度向上、歩行時は4.0%の精度向上となった。
歩行時は特に精度の差が見られた。

- 混合行列の考察
![](https://i.imgur.com/pL2T05q.png)
動きが類似している分類の難しい動作がうまく分類できるようになったとのこと。

## 参考文献
http://openaccess.thecvf.com/content_ICCV_2017/papers/Cao_Egocentric_Gesture_Recognition_ICCV_2017_paper.pdf