OmniAICreator/Qiita-1.07M huggingface dataset:
pipenv で任意の場所の仮想環境を使う

pipenv は初期設定では `~/.local/share/virtualenvs/` の下に仮想環境を作ります。

```shell
$ pipenv install
...
Virtualenv location: /Users/a-hoge/.venvs/spam-O71st27X
...
```

しかし、実際に使う上では、

- `~/.local/share/virtualenvs/`ではなく `~/.venvs` の下に作りたい
- プロジェクトの直下に作りたい
- すでに仮想環境を作ってあるので、そこにインストールしたい

などと、仮想環境の場所を変えたいことがよくあります。

# `$WORKON_HOME`: 仮想環境の親ディレクトリを変える

`$WORKON_HOME` を定義すると、仮想環境はその下に作られます。

```shell
$ export WORKON_HOME=~/.venvs
$ pipenv install 
...
Virtualenv location: /Users/a-hoge/.venvs/spam-O71st27X
...
```

https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#custom-virtual-environment-location

# `$PIPENV_VENV_IN_PROJECT`: プロジェクトの直下に仮想環境を作る

`$PIPENV_VENV_IN_PROJECT` を定義すると、プロジェクトの直下に `.venv/`が作られます。

```shell
$ export PIPENV_VENV_IN_PROJECT=1
$ pipenv install 
...
Virtualenv location: /Users/a-hoge/spam/.venv
...
```

なお「プロジェクトの直下」は、pipenv install を実行したディレクトリではなく、**Pipfileが置かれたディレクトリ**のようです。

# `$VIRTUAL_ENV`: すでにある仮想環境を使用する

`$VIRTUAL_ENV`が定義されていると pipenv はその場所にある仮想環境を使おうとします。 `$VIRTUAL_ENV`は仮想環境を`activate`すると、定義されます。

```shell
$ python -m venv ~/foo
$ source ~/foo/bin/activate # VIRTUAL_ENVなどの定義（コマンドはBashの場合）
$ echo $VIRTUAL_ENV
/Users/a-hoge/foo/
$ pipenv install
$ pipenv --venv
Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning.
/Users/a-hoge/foo/
```

警告は出ますが、指定した仮想環境が使われます。

なお、仮想環境をまだ作っていないパスを指定すると、単にエラーになります。

```
$ export VIRTUAL_ENV=~/not-created
$ pipenv install
...
RuntimeError: location not created nor specified
...
```

この機能は、すでに venv で仮想環境を作ってある場合に後付けで pipenv を導入するのが主な利用目的だと思いますが、

「`$WORKON_HOME`も`$PIPENV_VENV_IN_PROJECT`も要らん！ 俺はインストール先を自由に決めたいんだ！！」というときも役立ちそうです。

なお、上述の通り `$VIRTUAL_ENV`が定義されていると警告が出ます。これは誤って別の仮想環境にインストールしてしまうのを防ぐためのものでしょう。既存の仮想環境を流用する必要がない場合は、警告文にもある通り `PIPENV_IGNORE_VIRTUALENVS=1`を定義してこの振る舞いを無効化できます。
コマンドを実行する際にファイルやフォルダのパーミッションで弾かれた場合


```
1. 該当ファイルやディレクトリのパーミッション確認
2. コマンドの実行ユーザーを確認(パーミッションで許可されているユーザーで実行しているかどうか)
3. Sudo -uでパーミッションで許可されているユーザーでコマンドを実行する
```
IntelliJの虎の巻

いつも使い方忘れるので、これどうやるんだってのがあるたびに追記してくための記事です。

## まずやること
`IdeaVim`のPluginを入れる

## 共通
##### 括弧の外に出たい
閉じ括弧入力することで出れる

##### 括弧を閉じたまま改行したい
括弧の中で`Shift + Enter`

##### Terminal使いたい
デフォルトのショートカットキーは`⌥F12`
HHKBだと入力が不可能に近いので適当にKeyMapを変える必要がある
PreferencesのVim Emulationから使ってないキーを見て適当に割り当てる
個人的にはCtrl+Yとかに割り当ててる

##### editorsの移動
vimのタブと同じ扱いなので、gtとgT

##### ファイル移動したい
`Command + Shift + O`

##### 良しなに直す (Quick Fix)
`Alt + Enter`

##### なんでも検索
`Shift`二回押し
クイックランチャー的に使っていける

##### アクションを検索する
`Command + Shift + A`
ショートカットキー分からない時は大体こいつでなんとかなる

##### ドキュメントの表示
`Ctrl + J`

##### 最近開いたファイルを表示
`Command + E`

##### 全ファイル内文字検索
`Shift + Command + F`

## GoLand
##### go fmtを自動で実行
[Golandでコード保存時に自動でgo fmtやgometalinterを効かせる様に設定する際のメモ \- Qiita](https://qiita.com/Sekky0905/items/c40e3375c72c003e8b1d)

## WebStorm
* JSのインデント幅を2に変更
* In function expressionの解除
TreasureDataにiOSアプリからログを送れるようにする

#はじめに
業務でアプリからTDへログを送ることになりました。
TreasureDataの[SDK導入リファレンス](https://support.treasuredata.com/hc/en-us/articles/360000671667-iOS-SDK)にはObjective-Cの実装例しかなく、swiftで実装したところ紹介されているメソッド名なども若干違っておりました。
なのでどなたかの役に立てばと残しておきます。

## 下準備
CocoaPodsを使いインストールしていきます。
CocoaPodsインストール未済の場合は以下のようにインストールが必要となります。

```
$ gem install cocoapods
```

プロジェクト直下のPodfileに下記を追記してください。

```text:Podfile
pod 'TreasureData-iOS-SDK', '= 0.1.24'
```

```
$ pod install
```

## 実装編
まずはTreasureDataライブラリのインポートを行なってください。

```swift:AppDelegate.swift
import TreasureData_iOS_SDK
```

その後下記のタイミングでTreasureDataの初期化を行なってください。

```swift:AppDelegate.swift
 open func application(_ application: UIApplication,
                          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let tdSettings = TreasureDataEventLogger.setting.self 
    // TDのエンドポイントを指定してください
    TreasureData.initializeApiEndpoint("https://in.treasuredata.com") 
    // APIkeyはこちらに指定してください。
    TreasureData.initialize(withApiKey: API_KEY)
    // 使用するDB名をいれてください
    TreasureData.sharedInstance()?.defaultDatabase = "hogehoge"
    //もしもデバッグ版だけログを出力したいときなどに使用してください
    if isDebug {
         TreasureData.enableLogging()
    }
    // デバイスごとにユニークIDを付与することもできます。disableにもできますのでお好みで使用してください。
    TreasureData.sharedInstance()?.enableAutoAppendUniqId() 
```

## 実際にイベントを飛ばす
イベント送信タイミングはイベントがおきた際にTDへ送るようにしました。
AndroidだとonStop時と書いてあったので若干モヤモヤしました。(詳しい方教えてください)

``` hoge.swift 
    var event: Dictionary<String, String> = [:]
    event["name"] = "みかん"
    event["gender"] = "female"
    event["strength"] = "100"
    
    TreasureData.startSession()
    TreasureData.sharedInstance().addEvent(event, table: "character")
    TreasureData.endSession()
    TreasureData.sharedInstance()?.uploadEvents()
```


`As long as startSession is called but endSession is not called, the session will continue. Also, if startSession is called again within 10 seconds of the last calling endSession(), then the session resumes, instead of a new session being created.
`
endSession()が呼ばれても10秒以内にstartSession()が呼び出された際にはSessionが引き続き再開するようです。

#おわり
https://support.treasuredata.com/hc/en-us/articles/360000671667-iOS-SDK
initializeのメソッド名がドキュメント上だとinitializeWithApiKeyだったり、先にAndroid側を実装したのですがuploadEvents()のタイミングがiOSとAndroidで違ったり難しいなぁと感じました。
Visual Studio 2017 C++ MFCビルドエラー'd3dx9.h': No such file or directory

・Visual Studio 2017で下記のビルドエラー

fatal error C1083: include ファイルを開けません。'd3dx9.h': No such file or directory

・DirectXをインストール
https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=6812

・エラーが出てる該当プロジェクトをソリューションエクスプローラーから右クリック→プロパティ
・構成プロパティ→VC++ディレクトリ
・インクルードディレクトリ→下矢印クリック→＜編集....＞選択
・インクルードディクトリウィンドウ表示、上部分のフォルダアイコンをクリック→DirectXをインストールしたincludeフォルダを追加（C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\include）


上記でビルドが通る。
【随時更新】2018年まとめ記事まとめ

2018年を総括するようなまとめ記事のまとめ。
編集リクエスト大歓迎。片っ端から追加します。

## サービス

2018年に話題になったWebサービスまとめ | 男子ハック
https://www.danshihack.com/2018/12/09/junp/2018-webservice.html

これ知ってる？2018年話題になったWebサービス・アプリ50選【総まとめ】 | プロ副業
https://hukugyo-pro.com/prog/18ser/

## Web技術

2019年までに見直しておきたい CSS・JavaScriptの手法 - Speaker Deck
https://speakerdeck.com/tonkotsuboy_com/2019nian-madenijian-zhi-siteokitai-cssjavascriptfalseshou-fa

イマドキのJavaScriptの書き方2018 - Qiita
https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9

CSSの参考になるアイデアがいっぱい！2018年スタイルシートを使ったテクニックのまとめ | コリス
https://coliss.com/articles/build-websites/operation/css/css-techniques-2018.html

Web制作で気になることのアンケート結果（2018年版） | Stocker.jp / diary
https://stocker.jp/diary/enq-2018/

Web制作者が備えておきたい最新版チートシートのまとめ | コリス
https://coliss.com/articles/build-websites/operation/work/cheat-sheets-for-front-end-developer-2018.html

【2018年版】フロントエンドエンジニアがよく使うWebサービス・アプリまとめ - たこさんちゃんねる(別枠)
https://tako3ch.hatenablog.com/entry/2018-frontendengineer-webservice

2018年の最先端フロントエンドエンジニアになろう
https://qiita.com/rana_kualu/items/5986ceab8fd4e353de1b
5000人に聞いた、2018年最先端のフロントエンド開発者が使ってるツールはこれだ
https://qiita.com/rana_kualu/items/8dc3f93a7176d9a0f05d
2018年の最先端DevOpsエンジニアになるためのロードマップ
https://qiita.com/poly_soft/items/7cce0fb45195575921ae
2018年の最先端バックエンドエンジニアになろう
https://qiita.com/rana_kualu/items/19ab559dddbca6674417

安全なWebアプリケーションの作り方2018
https://www.slideshare.net/ockeghem/wasbook2018

## デザイン

2019年用、日本語のフリーフォント366種類のまとめ -商用サイトだけでなく紙や同人誌などの利用も明記 | コリス
https://coliss.com/articles/freebies/japanese-free-fonts-for-2019.html

どうなる2019年のロゴデザイン？知っておきたい最新人気トレンド6個まとめ - PhotoshopVIP
http://photoshopvip.net/112471

## その他

2018年版もっとも参考になった機械学習系記事ベスト10 - Qiita
https://qiita.com/junichiro/items/67ddf03014597552d78b

2018年これだけは知っておきたいiOSライブラリ31選
https://qiita.com/kohei1218/items/275fcee7406395919885

## おまけ

2018年スマホゲーム総決算::모바일인덱스
http://www.mobileindex.com/report/report_view.asp?s=68
2018年マンガアプリ総決算::모바일인덱스
http://www.mobileindex.com/report/report_view.asp?s=74
2018ライブ配信アプリ現状分析::모바일인덱스
http://www.mobileindex.com/report/report_view.asp?s=78

The 10 highest-grossing iPhone apps in the world in 2018
https://www.businessinsider.com/highest-grossing-apple-ios-apps-revenue-2018-2018-12
Cacooでワイヤフレームづくりのすゝめ

三度目まして。おさぬです。
この記事はSC（非公式） Advent Calendar 2018の20日目です。
今回は自称ワイヤフレーム作れる人増やし隊長としてCacooを使ったワイヤフレームの作り方を
ざっくり説明しつつ、個人的Cacooオススメポイントをご紹介しようと思います。
といいつつ社内勉強会のおさらいレベルにはなるかと思いますのでご了承を

##Cacooとは
Backlog等で有名なnulab開発の作画共有ツールです。

`Cacooとは、サイトマップ、フローチャート、マインドマップ、ワイヤーフレーム、
モックアップ、UML構成図などを作成するためのオンライン作図ツールです。
Cacooの図があれば世界中の人たちとリアルタイムでコラボレーションすることができます。
(公式サイトより)`

##ワイヤーフレームをつくろう（Osanu流超簡易版）
###1:サイトマップ作成
サイトマップとはサイト全体の画面構造を階層的に記載したものです。
私は手書きでざざっと書きますが、このときに簡単なレイアウトも決めておくと後々楽になります！
サイトマップを作ることで必要な機能と、画面連携がざっくりイメージできるようになり、
無駄な画面を作ってしまうこともなく結果的に時間短縮になります。
画面数も大体ここで確定させてください。
↓社内勉強会で晒した、社内コインアプリの超絶雑サイトマップです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/f9ee2cf9-9cb7-43a9-3c5f-0d6790491ec2.png)

###2:Cacooに起こす
本来ならここでメイン・ベース・アクセントカラーを決めたり
サイトマップを叩いたりしますがCacoo紹介したいので割愛します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/7fb9ee93-1baa-dd7b-1cd5-9ffb510c7666.png)
これがcacooのメイン画面です。社内コインアプリのワイヤーフレームですね。
Cacooではグループ化やコピー＆ペースト、図形、画像の挿入等、描画ソフトの機能は大抵使えます。
最大の特徴は同時編集と、テンプレートの存在だとおもいます。
####同時編集
CacooではURLを共有し、コラボレーターに設定することで、画面を同時に編集することが出来ます。
（コラボレーターにするには会員登録が必要）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/6937cb42-b769-11d5-8ac6-82f822e35a53.png)
編集画面の左の柱から共有をクリックするとポップアップが出ますので、ここからリンクを共有します。
リアルタイムでなくても編集したり、コメントをもらったりすることが可能なため、
わざわざ顔を合わせずとも、意見をもらってワイヤーフレームを叩くことが出来ます。
同時編集してても結構サクサクなのも高ポイントです('◇')

####テンプレート
Cacooにはワイヤーフレーム作成に便利なテンプレートが沢山あります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/b75fcfa6-f370-ce2f-e960-f150542032fc.png)
webページ用、モバイルアプリ用だけでなくiPhoneやAndroid、タブレット、Windows、Mac等の画面枠、
汎用部品等、種類は紹介しきれないほどに豊富です。
ちなみに手書き風やサイトマップ用などもありますのでCacooで最初から作るのもイイですね('ω')
今回はモバイルでのワイヤーフレームなのでiPhone7のテンプレートを使用しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/9196e4ae-c8be-29c4-8dcb-5a93396511e4.png)基本図形や
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/f539b19e-e2f2-35e9-b339-074e39019d64.png)ウェブのこんな感じ部品とか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215581/370c9d21-5119-cfc0-c2b2-47c5686bd14e.png)手書き風部品やアイコンやら
あるのです(*'▽')もうこれはセンスとか関係ない！誰でもそれっぽいのが作れる！( ｀ー´)ノ笑

###3:共有
出来上がったワイヤーフレームは先程言及したurl公開以外にも様々な形式で共有できます。
リンク公開では画像リンク、埋め込みリンク方式もあります。
エクスポートはPNG,PNG(背景透過),SVG,PDF,PS,PPTが選べます。
ただしPNG,PNG背景透過以外は有料プランになっておりますのでご注意を。（印刷も有料プラン！)

##まとめ
ざざーっと書いてきてしまいましたが、
個人的にCacooでワイヤーフレーム作成を勧めたいポイントとしては以下の3つです。
1. 無料で使用でき、かつ使用感が数ある描画ソフトとほぼ一緒のため、学習コストが低い
2. テンプレートが豊富で、誰でもそれなりのクオリティで仕上がる
3. 同時編集機能と共有機能により、より意見をもらいやすい環境での制作が出来る

私個人としましては、もっと社内でワイヤーフレームを作る人が出てきて
皆さんのアウトプットを見たいので...ぜひ一度チャレンジを(/・ω・)/
ワイヤーフレームだけでなくてフローチャート用の部品もありますので一度使用してみては
いかがでしょうか...（回し者ではありません）

社内勉強会での内容に結構被ってるところが多くてすみません...(´;ω;`)
そちらでは色彩の基礎もちょこっとだけ入れているので、見られる環境の方はどうぞ参考までに。
（見られない人は言っていただければ送りつけます。）
configure, make, make install とは何か

Linux環境で何かをインストールするときに、**configure**、**make**、**make install**という言葉がよく出てきます。
configure、make、make installという言葉はよく見るものの、アプリによって微妙に違ったりすることに疑問を感じていました。
今回じっくり調べてみてとてもすっきりしましたのでまとめます。


#これらは何者なのか
アプリをソースコードからインストールする時に使用します。

Linux環境にアプリをインストールしようとすると、大きく分けて2つの方法があります。
一つは、rpmやyumなどのコマンドを使用してパッケージとしてインストールする方法です。
もう一つがソースコードからインストールする方法です。
この後者の方法を使う際にconfigure、make、make installを使用します。

また、ソースコードからインストールするときに、必ずこのconfigure、make、make installを使用するということでもありません。
インストールするときには、README等から手順を確認する必要があります。
慣習的にこれらの方法がとられていることが多い、ということです。


#configure
```bash
$ ./configure
```

`configure`というスクリプトファイルを実行しています(configureというコマンドがあるわけではありません)。
ソースコード中にこのスクリプトファイルが含まれているので、パスに注意して実行します。

実行することで、インストールに必要な環境変数やライブラリが正しく設定、設置されているか等がチェックされます。チェックした結果、`MakeFile`が作られます。
アプリケーションをインストールする環境は様々存在するため、単一のMakeFileを準備するだけだと、環境の差異に対応するのが難しくなります。
`configure`を使えば、アプリがインストールされる環境を自動的に調べ、その環境に合わせた`MakeFile`を自動的に作ることができます。

多くの場合は慣例に伴い「configure」という名前がつかれていますが、別の名前で定義されている場合もあります。
README等から手順を確認しましょう。

#make
```bash
$ make
```
configureで作成されたMakeFileに基づいて、アプリのコンパイルが行われます。
`make`コマンドは(こちらはコマンドです)オプションなし、引数なしで実行することで、`MakeFile`を参照し、MakeFile内のデフォルトの処理を行います(大抵の場合はビルド処理です)。
MakeFileが作成されたパスに気を付けて実行します。


#make install
```bash
$ make install
```
`make`コマンドによってコンパイルされたアプリをインストールします。
(結局のところは、makeしたファイル群をディレクトリにコピーしています)

`make install`というコマンドは、「MakeFile」に記述された「install」というラベルから処理を実行する、という動作になります。
configure同様、多くの場合は慣例に伴い「install」と定義されていますが、別の名前で定義されている場合もあります。


#makeコマンド
```
$make [オプション] [ターゲット]
```

makeコマンドはMakeFileをもとにして実行されます。
オプションを使うことで(-f)、Makefileとして別のファイルを参照することもできます。

Makefile内の処理は、ターゲット単位で区分されています。
ターゲットを指定して実行することで、ターゲットに定義された内容のみが実際に実行されます。
ターゲットを指定しない場合は、一番上に定義されたターゲットの内容が実行されます。
代表的なターゲットがinstallやcleanとなります。
flutterでiOSビルドができなくなる

# flutterでiOSビルドが急にできなくなる。
Androidでは普通にできるから、Flutterのコードの問題じゃない。（多分）

難読化する場合はこちらもご参照ください。
https://qiita.com/sakyoyuto/items/c510bafbc11d64ed250e

## エラーメッセージ

```
$ flutter run -d （target）
```
とすると、

```
Could not build the application for the simulator.
Error launching application on iPhone XR.
```
となる。
実機でも同じ症状。
## 回復
flutterプロジェクト/iosに移動し、

```
$ pod setup
```
したら治った。
まだまだ、初心者なので、なんなのかはイマイチわからなかったけど、とりあえず解決。
【開発サンタ】GASで予定確認Botを作成【アンサー】

# はじめに
本記事は、Randstad Advent Calendar 21日目かつ、[出勤予定時間管理システム（RFP）](https://qiita.com/memegumi/items/92e0e0810592c805416b)を受けてのアンサー記事です。

「クリスマスまでの短期間にできること」をコンセプトに構想ました。実装に当たっては、下記記事を参考にしております。（~~ほぼコピペ~~）

> [SlackBot：毎朝Googleカレンダーの予定を通知してくる秘書ねこBotの作り方](https://designmemo.jp/creative/bot-googlecalendar-slack.html)
> [【GAS】Hangouts Chat botsをGoogle Apps Scriptで試してみた](https://webird-programming.tech/archives/624)

実装環境は、以下の通り(Googleを普段利用している為)

- Google Hungout Chat
- Google Apps Script(GAS)

# できることはなにか？
現状各社員は、カレンダーに予定を登録して、別途チャットで投稿するという二重入力運用になっています。
※チャットについては投稿したらそこで終わり。二次利用されない(※履歴を追うのが大変)
そこから、カレンダーの情報を取得して、チャットに返すことができるかを構想

# 取り敢えず作った
作成方法については、以下を参照のこと

>  [【GAS】Hangouts Chat botsをGoogle Apps Scriptで試してみた](https://webird-programming.tech/archives/624)

下記画像にある通り、メールアドレスの「@」より前を入力すると、該当するアカウントのGoogleカレンダーから今日の予定を取得して回答してくれます。（構想30分、実装10分（~~ほぼコピペ~~））
![WS000041.JPG](https://qiita-image-store.s3.amazonaws.com/0/311972/ac1426bf-196f-f36e-135b-c1fe286aac0e.jpeg)
# 最後に今後の展望
限られた時間での実装ということで、まずはここまで。
入力値に柔軟性がなく、取得できるのは今日の予定のみ、という制限があるので、これから徐々に改善していきたいと思います。
ScriptはGoogleドライブ上にあるので、社内オープンソース化して、みんなで育てるのもありかと。。
Visual Studio Code を使ったPython環境の構築

# はじめに

当ドキュメントでは、Visual Studio Code を使った Python開発環境の構築方法についてまとめる。以下を導入することにより、Pythonの開発をし易くする。

* Visual Studio Code
* Python拡張
* flake8

# 環境前提

* エディタは、Visual Studio Codeを使う
* venv による [仮想環境](https://qiita.com/shinno21/items/de09a2533097cbfd5f66)を使う
* 静的解析は flake8 を利用する

# Visual Studio Code 導入・Python用の設定手順

## Visual Studio Code インストール
https://code.visualstudio.com/

インストール後、以下の拡張機能をインストールする。
（リンクからでも可能だが、Visual Studio Code の拡張機能からも検索、インストール可能）

## プロキシ設定（会社での利用などで必要な場合）

1. Visual Studio Code を起動し、 ファイル→基本設定→設定→ユーザ設定タブ
2. アプリケーション→プロキシのproxyに以下を設定(認証が必要な場合、user:password@が必要)

`http:user:password@proxyのURL:port`

## 日本語化
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

## Python拡張
https://marketplace.visualstudio.com/items?itemName=ms-python.python

# ワークスペース（作業ディレクトリ）の作成

1. 適当な場所にディレクトリを作り、そこをワークスペースとする。(ここでは、 `(work_space_dir)` とする。）
2. Visual Studio Code で、そのディレクトリを開く。

# 仮想環境の設定

1. ターミナル→新しいターミナル（またはCtrl+Shift+@)で、ターミナルを開く。
2. ワークスペースのルートディレクトリ `(work_space_dir)` で、 `python -m venv venv` を実行
3. venv ディレクトリが出来たら、　`venv\Scripts\activate` を実行
4. `(venv) C:\(work_space_dir)>`  というようにターミナルの表示が変わる
5. `pip install flake8` で flake8 をインストールする
6. `pip install black` で black をインストールする

# Visual Studio Code で静的解析, formatter を有効にする

## 設定

1. ファイル→基本設定→設定→ワークスペースの設定タブ
2. 「settings.json で編集」リンクをクリックして、以下のコードをコピペする

```json
{
    "python.linting.flake8Enabled": true,
    "python.pythonPath": "(work_space_dir)\\venv\\Scripts\\python.exe",
    "python.linting.pylintEnabled": false,
    "python.linting.lintOnSave": true,
    "python.formatting.provider": "black",
    "editor.formatOnSave": true,
    "editor.formatOnPaste": false
}
```

## 設定確認

以下の様に適当なPythonファイルを作成して、`from` の所に赤い波線が出たらOK。
波線にカーソルを合わせると、 `'datetime.datetime' imported but unusedflake8(F401)` と表示されるはず。

```python:test.py

# coding: utf-8
from datetime import datetime
```

# 参考

https://code.visualstudio.com/docs/python/environments
https://qiita.com/shinno21/items/de09a2533097cbfd5f66
【第3回】何人が何十回やってるか分からないが、それでも俺はFirebaseでチャットアプリを作りたい

# 前回の内容
[【第2回】何人が何十回やってるか分からないが、それでも俺はFirebaseでチャットアプリを作りたい](https://qiita.com/marumarumaru/items/7db88b959941d365806d)

# 今回の内容
チャット機能を作っていきます！
![第３回.gif](https://qiita-image-store.s3.amazonaws.com/0/277406/59484016-993f-d108-f1bb-01ccda244957.gif)

ゴールはこんな感じです！
では作っていきます！

# メッセージ一覧の取得
と言ってもやることは前回とほぼ変わりません。

```kotlin
val query = db.collection("rooms").document(room).collection("talks")
                .orderBy("sendTime")
```

"rooms"Collectionの中からDocumentIdを指定して、Documentへの参照を取得します。
そのDocumentのサブコレクション"talks"の参照をさらに取得し、orderByを使ってメッセージ送信時間でソートします。
前回同様[FireStoreAdapter](https://github.com/maru01/MyChat/blob/3810373bf981ade3205a2c480c92535f88952194/app/src/main/java/com/example/mychat/FireStoreAdapter.kt)のサブクラスを作ってqueryを渡してSubscribeの準備は完了です。

※DocumentIdは部屋一覧画面から渡しています。チャット画面でクエリしてもいいと思いますが、せっかく部屋一覧でゲットしてるので使いまわした方がいいかなと思ったのとなるべくクエリ回数を減らすためにこのように実装しています。もっといい方法をご存知の方いたら教えてくださいm(_ _)m

# メッセージの送信
前回実装した部屋の追加と同じです。

```kotlin
val message = binding.messageEdit.text.toString()
val talk = Talk(Timestamp(Date()), message, userName)
db.collection("rooms").document(room)
                .collection("talks")
                .add(talk)
```

dataクラスのTalkに、タイムスタンプとユーザーが入力したメッセージとメッセージを送信したユーザーの名前を入れて"talks"Collectionに追加しています。

# 所感
全体的にあっさりし過ぎてる感あるなと思いました。Firebaseって簡単に使えるんだなと思っていただけると嬉しいです。。。
静的なファイルを含む Django のページを Nginx で表示

静的なファイルを含まない場合のデプロイ方法
[Django で作成したページを uwsgi を使って Nginx で表示](https://qiita.com/ekzemplaro/items/e78ea269b9103626dc30)

静的なファイルは、アプリの中に次のように配置されます。

```text
├── app01
│   ├── static
│   │   └── app01
│   │       ├── app01.css
│   │       └── app01.js
```

静的なファイルを、/var/www/static に配置するとします。
プロジェクトを proj01 として、
設定ファイルを編集します。

```py:proj01/setting.py
（省略）
STATIC_ROOT = '/var/www/static/'
（省略）
```

/var/www/static にデータを配置します。

```bash
python manage.py collectstatic
```

Nginx の設定変更

```text:/etc/nginx/nginx.conf
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
        }

        location /static {
            root   /var/www;
            index  index.html index.htm;
        }
```

Nginx のパラメーターが正しいか確認

```bash
sudo nginx -t
```

uwsgi と Nginx を再起動します。
Node/npm で popoto.js を動かす

## はじめに

先日  [popoto.jsでネットワーク「図」を検索してみよう](https://qiita.com/corestate55/items/892a8bf99dd06fd102cb) という記事を出したんですが、 [Popoto.js](http://www.popotojs.com/) のセットアップ方法はスルーしていました。

ということで、とりあえずどんなものか触ってみたいという人向けに、[Getting started](https://github.com/Nhogs/popoto/wiki/Getting-started) にあるサンプルが動く最小レベルのセットアップ方法の紹介です。 `script` タグで minify された popoto.js をよみこむのでもいいんですが、ここでは [Install](https://github.com/Nhogs/popoto/wiki) にある npm を使う方法でやります。

## Neo4j のセットアップ

省略。

localhost で実行していない場合 (popoto.js 実行サーバの外に Neo4j サーバがある場合) は、Neo4j 側で外部からのアクセスを受け取れるよう設定を変更しておいてください。

## Node.js, npm のセットアップ

省略。

以降の内容は Ubuntu 18.04, Node.js/8.10, npm/3.5.2 で確認しています。

## popoto.js のセットアップ

### ディレクトリ構成

全部フラットにおいてもいいんですがわかりにくいので以下のように `dist`, `src` をわけて必要なファイルを用意していきます。

```
hagiwara@dev01:~/nwmodel/netomox/popoto$ tree -I 'node_modules' --matchdirs
.
├── dist
│   ├── font
│   │   └── popoto
│   │       ├── popoto.eot
│   │       ├── popoto.svg
│   │       ├── popoto.ttf
│   │       └── popoto.woff
│   ├── index.html
│   └── popoto.min.css
├── package.json
├── src
│   └── index.js
└── webpack.config.js
```

### npm パッケージのインストール

先に package.json を用意しましょう。[私が使ったもの](https://gist.github.com/corestate55/7556323eb9c8f7d2e857a39bf6916be2#file-package-json) をもってきて `npm install` してもいいですし、自分で作るのであれば

```
npm init
npm install --save popoto
npm install --save-dev webpack webpack-cli webpack-dev-server
```
してください。(ここでは手っ取り早く webpack-dev-server で Web Server を起動して動かす方針です。)

### webpack の設定

* [webpack.config.js](https://gist.github.com/corestate55/7556323eb9c8f7d2e857a39bf6916be2#file-webpack-config-js)

概ね見たままです。

* 入力は `src/index.js`
* 出力は `dist/main.bundle.js` (名前はてきとう)
* webpack-dev-server を使う (他のアプリで 8080 使ってたので適当にポートを変えてます)
  * Document root を `dist/` にする
  * ソースの監視やブラウザ起動等のオプション入れてあるのでコマンド一発で使い始められます。

### index.js (popoto.js configuration) の作成

ほぼ [Getting started](https://github.com/Nhogs/popoto/wiki/Getting-started) そのままです。Neo4j の認証情報や popoto.js オプション等を記載します。気にしておくのは、npm でインストールする popoto.js を require しておく、くらいかな。

* [src/index.js](https://gist.github.com/corestate55/7556323eb9c8f7d2e857a39bf6916be2#file-index-js)

### index.html, css, font の準備

これも、 `script` tag 以外は [Getting started](https://github.com/Nhogs/popoto/wiki/Getting-started) そのままですね。 Webpack がビルドする main.bundle.js を読み込んでください。

* [dist/index.html](https://gist.github.com/corestate55/7556323eb9c8f7d2e857a39bf6916be2#file-index-html)

上のディレクトリ構成にある、css , font は[公式のもの](https://github.com/Nhogs/popoto/tree/master/css)をもらってきます。あるいは　npm package からコピーします (`node_modules/popoto/dist`)。この辺がないとツールバーなどのアイコンが表示されません。

### Webpack dev server の起動

Dev server を起動するためのコマンドを [package.json](https://gist.github.com/corestate55/7556323eb9c8f7d2e857a39bf6916be2#file-package-json) に入れておきます(`scripts` セクション)。これで、 `npm run start` コマンドを実行すると main.bundle.js のビルドとサーバの起動、ブラウザの起動まで実行されます。また、index.html で popoto.js のオプション等を変更した際も自動的に再ビルドとブラウザの更新(リロード)がおこなわれます。

## おわりに

これくらいで "とりあえず" popoto.js が動くようになります。グラフィカルに Neo4j 内のデータを触ってみたい人向けのセットアップ方法でした。 Enjoy!
Site24x7 で瞬時にWeb の状況が把握できる環境を構築する

こんにちは、@mezguinです。

[前回](https://qiita.com/mezguin/items/c8f78e73a94c6f08170a)はSite24x7のアカウントにログインすらしていませんでしたが、ついに監視を始めます。

監視追加の案内に従っていたら、SSL証明書やらDNSやらがたくさん増えました。
URLの正常性監視だけするはずが、一気に画面がにぎやかに。
<img width="951" alt="2018-12-20_11h43_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/320280/1e0f663f-5212-30fe-3714-6f36060a5079.png">

この、Site24x7にログインして最初に目に入ってくるページ、便利ですよね。
特に作りこむ必要がないまま、現在の監視状況を綺麗に出してくれます。

でも、ふと思ってしまいました。『文字ばっかりだな』と。
# もっと可視化できませんか？

もうちょっと図示してほしいなと。

ただ、「トラブル」とか言うだけでなく。
「トラブルに至るまでの経緯」などをパッと見ただけでわかるくらいまで、もうちょっと教えてほしい。

どうにかしてどうにかできないかとマニュアルを探っていたら、以下の機能を発見。

カスタムダッシュボード
https://www.site24x7.jp/help/getting-started/custom-dashboard.html

今回は、こちらを試してみた結果をご紹介します。

## カスタムダッシュボード

「ホーム」=>「ダッシュボード」=>「カスタムダッシュボード」から作りました。

完成形はこちら。

<img width="960" alt="2018-12-20_11h44_21.png" src="https://qiita-image-store.s3.amazonaws.com/0/320280/1ffa17a3-0ee7-bfef-2240-0ff736ae1808.png">

「ウィジェット」と呼ばれるカードのようなものを、好きなように作って並べました。

どんな種類のウィジェットがあるのかは、マニュアル参照のほど。

下の「ステータスウィジェット」は、トラブル状態になったときに、黄色くなってチカチカと点滅していました。これはわかりやすい。

<img width="347" alt="2018-12-20_11h44_32.png" src="https://qiita-image-store.s3.amazonaws.com/0/320280/f59a8376-faf3-a32a-3052-003942eeef3d.png">
トラブル状態のスクリーンショットは撮れなかった……

あとは、カスタムダッシュボード機能を探し当てる過程で、もう一つ機能を発掘したので、併せてここにメモしておきます。

## ステータスページ

「ホーム」=>「ステータスページ」から、サービスの稼働状況の一覧のページが表示されます。

<img width="960" alt="2018-12-20_11h44_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/320280/aa52b37d-295c-936d-9a07-615f7dda101a.png">
アカウントを持っていない人に対しても、サービスの稼働状況を公開できるようです。
（実際、Site24x7の提供元のZohoでは、Site24x7のこの仕組みを使って、[Zohoクラウド？の稼働状況を公開している](https://status.zoho.com/)様子。）

不特定多数に向けたサービスには、正常稼働の証明にもなって良いですね。


# 所感

カスタムダッシュボードで、パッと見て

- 今どういう状況にあるのか
- 過去数時間がどうだったのか

が把握できるようになりました。

自分のサーバーでWebページを作っている場合は、応答時間のグラフに加えて、サーバーをパフォーマンスを表示しておけば、サーバー原因かどうか一発で判断できそう。

サーバーのCPU使用率上昇→応答時間低下→タイムアウト→URLダウン
のような障害までの流れがもしあるとしたら、これも一目で追えるようになります。

（※残念ながら、私がいま追加しているサービスはレンタルサーバー上に乗っているので、サーバーリソースの監視はできませんが。）

作りこみは基本必要ないが、作ることもできる

というのはいいですね。
いま監視したい対象のページには、そこまで高度な原因切り分けは必要ないのが少々もったいないところではあります。

ニーズが出てきたら絶対使う。

ちなみに、カスタムダッシュボードをトップページに持ってこれたらいいな～と思いましたが、そういうのはできない？ようです。ちょっと残念。
FlutterでAndroidネイティブライブラリを取り込む時の注意点

# はじめに

FlutterでAndroid開発中に特定のライブラリを導入すると、ビルドは通るのにアプリ起動時にこんなエラーで強制終了することがあるかもしれません。

```
couldn't find "libflutter.so"
        at java.lang.Runtime.loadLibrary0(Runtime.java:1011)
        at java.lang.System.loadLibrary(System.java:1657)
```

要はFlutterのライブラリが見つからない、ということですが、これはFlutterに限らずですが、JNIを使ったライブラリを取り込むときに注意する点です。

# 原因

Flutterはネイティブライブラリであるsoファイルとしてアプリ上で動作します。その際、別のライブラリでもネイティブライブラリを使っていた場合、必要なsoファイルがapk内に取り込まれずに強制終了しています。
順を追って説明していきます。

## Flutterから生成されるsoファイル

まず他のライブラリを入れる前の状態でアプリをビルドしてapkの中身を見ると以下のようになっています。
![スクリーンショット 2018-12-19 14.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/202533/e3ef345d-2483-b028-f55b-0d45368da4b2.png)
このように３つのディレクトリにそれぞれ`libflutter.so`が配置されています。

`2019/1/17 修正：`
~~flutterの現時点の最新1.1.9では、armeabi-v7aのサポートが終了し、arm64-v8aへ以降したため、記述を変更しました。キャプチャは古いままですのでご注意ください。~~（すみません、詳細確認中です）

- arm64-v8a
- x86
- x86_64 

それぞれの詳細については公式参照：[ABI管理](https://developer.android.com/ndk/guides/abis?hl=ja)



## 他のライブラリを入れた場合

私の場合、[Google VR SDK](https://github.com/googlevr/gvr-android-sdk)を導入したため発生しました。
Google VR SDKの場合、下記の３つが用意されていました。

- arm64-v8a 
- armeabi-v7a
- x86 

参考：https://github.com/googlevr/gvr-android-sdk/blob/master/samples/ndk-hellovr/build.gradle#L47
その結果、lib配下には４つのディレクトリが生成され、それぞれの構成は以下のようになりました

- arm64-v8a
    - Flutter(libflutter.so)
    - Google VR(libgvr.so, liboanorenderer.so)
- armebi-v7a
    - Google VR(libgvr.so, liboanorenderer.so)のみ
- x86
    - Flutter(libflutter.so)
    - Google VR(libgvr.so, liboanorenderer.so)
- x86_64
    - Flutter(libflutter.so)のみ

![スクリーンショット 2018-12-19 14.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/202533/f420a901-d71d-251d-a35d-552741f0487f.png)
![スクリーンショット 2018-12-19 14.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/202533/5b2c343f-326f-f591-90e0-6805dd9b00e8.png)
![スクリーンショット 2018-12-19 14.37.31.png](https://qiita-image-store.s3.amazonaws.com/0/202533/9b9ca3bb-ba9e-d8fa-274c-38b3ea1260e0.png)

## 何が起こるのか？

lib配下のsoファイルは、端末のハードによってどのディレクトリが使用されるか決まります。今回の場合、armebi-v7aとx86であれば両方のsoファイルが格納されているため、問題なく起動できます。
一方、arm64-v8aやx86_64を使用する端末で起動した場合どうなるでしょう？ディレクトリ内に必要なsoファイルが揃っていないため、`loadLibrary`時に`couldn't find`と言われてしまうわけです。

## どうすれば良いのか？

結論からいうと、gradleで`abiFilter`を指定する必要があります。

```gradle:build.gradle
android {
  ...
  defaultConfig {
    ...
    ndk {
      // Specifies the ABI configurations of your native libraries Gradle should build and package with your APK.
      abiFilters "x86", "arm64-v8a"
    }
  }
  ...
}

```

今回の場合、Google VRとFlutter両方が用意されているのは、x86とarmebi-v7aの二つのみなので、その二つをabiFiltersで指定します。
これにより、apkに取り込まれるsoファイルはabiFiltersで指定されたx86とarmebi-v7aのみとなり、それ以外のx86_64およびarm64-v8aはディレクトリが生成されなくなります。

# まとめ

Flutterもネイティブライブラリを使用していることを忘れずに、soファイルが見つからないと強制終了した場合はabiFilterの見直しを検討してみてください。
また、クラッシュは端末のハードに依存するため、Play Consoleのリリース前レポートを利用して確認しておくのがよいかと思います。
force cli :カスタムフィールドの追加（参照）

#はじめに
データ型が参照の場合の備忘録

#実行結果

```
force field create Product__c manufacturer_number_id:lookup label:メーカーid
Enter object to lookup: table_master__c <==ここの質問に答える（参照するオブジェクト）
What is the label for the loookup? Product_A06<== ここの質問に答える（子リレーション名）
Not done yet: InProgress  Will check again in five seconds.
Deploying now...
Status: InProgress (0/0)

Successes - 1
        Admin: changed

Test Successes - 0

Test Failures - 0
The deployment took 5.308681712s to run.
Custom field created
```
#注意事項
label:メーカーid2と指定しましたが、反映されないです。ソースを見てもtextの時とは違うようなので別途改造が必要そうです。

子リレーション名は実際には入力した文字列に_delがついた形で作られます。
関連リストの表示ラベルは入力した文字列にsがついた形で作られます。
日本語を指定するとエラーになりました。

```
What is the label for the loookup? メーカーid2
ERROR: オブジェクト「テーブルマスタ」に指定したカスタム項目名「メーカーid_del」は英数字のみで定義してください。また、名前は英文字で始まる必要があり、アンダースコアで終わったり、連続するアンダースコアを含ん だりできません。さらに、すべてのテーブルマスタ項目の中で一意の名前を設定してください。
```
コロン付きXMLのパース

#概要

コロン付きXMLのパースで、嵌った。
結論としては、chromeのヴァージョンで、違う。

#コロン付きXML

```
<item rdf:about="http://.jp/takabo/1406251057.htm">
  <title>昨日は</title>
  <link>http://.jp/takabo/1406251057.htm</link>
  <description>特に私は  </description>
  <dc:subject>0</dc:subject>
  <dc:creator>takabo</dc:creator>
  <dc:date>2018-06-25T10:57:34</dc:date>
  <geo:lat>140</geo:lat>
  <geo:long>38</geo:long>
</item>

```

#chrome v:71
geo:latで獲れる。latで落ちる。

```
var w = xml.documentElement.getElementsByTagName("item");
for (var i = 0; i < w.length; i++)
{
    var title = w[i].getElementsByTagName("title");
    var desc = w[i].getElementsByTagName("description");
    var link = w[i].getElementsByTagName("link");
    var lat = w[i].getElementsByTagName("geo:lat");
    var lon = w[i].getElementsByTagName("geo:long");
}

```

#chrome v:49
latで獲れる。geo:latで落ちる。

```
var w = xml.documentElement.getElementsByTagName("item");
for (var i = 0; i < w.length; i++)
{
    var title = w[i].getElementsByTagName("title");
    var desc = w[i].getElementsByTagName("description");
    var link = w[i].getElementsByTagName("link");
    var lat = w[i].getElementsByTagName("lat");
    var lon = w[i].getElementsByTagName("long");
}

```

以上。
ABEJA Platform に private python module を使う TIPS

[ABEJA Platform AdventCalendar 2018](https://qiita.com/advent-calendar/2018/abejaplatform) 20日目の記事です．
今回は python の private module を ABEJA Platform で使う TIPS について紹介したいと思います．


# モチベーション
ABEJA Platform ではプリインストールされたモジュール以外を使いたい場合，`requirements.txt`に記載しておくとモデルの起動時にインストールされる仕様となっています．
cf. https://developers.abeja.io/organization/model/#ライブラリの追加
この際，public なモジュールを使う場合には特に問題にはなりませんが，会社の共通ライブラリなど private なモジュールを使いたい場合にインストールできないという問題が発生します．今回はそういった場合にどのようにデプロイすべきかの TIPS を紹介します．なお，private python module は package cloud などの private pypi repository にアップロードされている前提とします．


# 解決策

## その1
まず最も簡単に思いつく方法は [AWS Lambda の python デプロイパッケージ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html#python-package-dependencies) にあるような依存関係を全てローカルにインストールしてソースコードに含めてアップロードする方法です．

```bash
$ pip install Pillow --t .
$ tar -zcvf model.tar.gz *
```

ただし，この方法には1つ弱点があります．python モジュールに C のネイティブライブラリを用いる必要がある場合に対応が難しいことです．必要なネイティブライブラリを集めたり`LD_LIBRARY_PATH`を正しく環境変数に正しく設定したりする必要があります．特に Deep Learning で使われるようなモジュールには高速化のため C のネイティブレベルで手を入れているものが多く，共通化の障壁となります．

## その2
上記の問題を解決するために [仮想環境を使う方法](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html#python-package-venv) の類型も考えられますが，ネイティブライブラリ間の依存関係を解決しつつ全てをソースコードに含めていくのが面倒であるため，今回は private pypi repository を`extra-index-url`として追加する方法を紹介します．

まず，以下のように`pip.conf`をソースコードに含めます．今回は package cloud を例に紹介しますが，適宜利用している private pypi repository に読み替えて下さい．

```bash
$ tree
.
├── main.py
├── pip.conf
└── requirements.txt

0 directories, 3 files
```

```conf:pip.conf
[global]
extra-index-url=https://{API_TOKEN}:@packagecloud.io/xxx/pypi/simple
```

さらに，デプロイする際に以下の環境変数を加えて下さい．これによって，モジュールのインストール時にソースコードに含まれる`pip.conf`が読み込まれ，依存パッケージが正しくインストールされるようになります．
![5f49090f-400a-4517-adbb-fd653e3fb085.png](https://qiita-image-store.s3.amazonaws.com/0/130762/b23b4a2b-3244-320a-9282-28e5fdc2fdf8.png)


# まとめ
`extra-index-url`を追加することで，ABEJA Platform でも private python module を使えるようになる方法を紹介しました．これで会社の共通ライブラリを活用してモデル開発もできるようになりました．ではでは，効率の良い開発ライフを！
Google App Maker スプレッドシートをDBにする　～その壱 表示～

まずはじめに
----
もともとGoogle Drive Tableがあったのですが新規アプリでは非推奨になり、作成できなくなりました。
https://developers.google.com/appmaker/release-notes

そこでスプレッドシートをDBにしたいなと思い汎用的なテンプレを作ってみました。
もっと良い方法があれば教えてください。

やってみましょう
----
まずはDBとなるスプレッドシートを用意します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/aff693cc-bd66-9667-fbcc-9ffd74017713.png)

AppMakerを開き、Create New App -> Blank Application　を　選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/2c614c7b-4b8f-478c-e071-1fa94945c57c.png)

まずはDATAを作成します。
左メニューのDATA「＋」 -> Calculated を選択 -> NEXT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/6f84d00a-a05a-d791-8d3c-f9be767c13b2.png)

適当に名前を付ける -> IMPORT FIELS -> Use a Google Spreadsheet -> SLECT A SPREADSHEET...
先程作成したスプレッドシートを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/df371d29-2df5-280f-b67c-da1fe9470ad3.png)

作成したデータがプレビュー表示されていればNEXT

Field Typeが正しいか確認して、問題なければCREATE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/5a659757-fc7b-13b6-9524-9365e1e79e5c.png)

作成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/59f142a2-67c2-5621-d206-8708c65db655.png)

次はスプレッドシートの内容を取得するためのserver scriptを書きます。
DATASOURCES -> testDB
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/a0f7bb72-4472-d566-6a3d-c9bc838ae3f2.png)

スプレッドシートIDはスプレッドシートのURLから確認できます。
…/spreadsheets/d/スプレッドシートID/edit

```js
var records = [];

var spreadsheet = SpreadsheetApp.openById('スプレッドシートID');
var sheet = spreadsheet.getSheetByName('シート名');
var values = sheet.getDataRange().getValues();

var NoColumn, CompanyColumn, StructureColumn, NameColumn;

for(var i = 0, len = values[0].length; i < len; i++){
  if(values[0][i] === 'No'){
    NoColumn = i;
  }
  if(values[0][i] === 'Company'){
    CompanyColumn = i;
  }
  if(values[0][i] === 'Structure'){
    StructureColumn = i;
  }
  if(values[0][i] === 'Name'){
    NameColumn = i;
  }
}

for (var i = 1; i < values.length; i++) {
  var record = app.models.モデル名.newRecord();
  record.No = values[i][NoColumn];
  record.Company = values[i][CompanyColumn];
  record.Structure = values[i][StructureColumn];
  record.Name = values[i][NameColumn];
  records.push(record);
}

return records;
```

次に表示するためもともとPAGESにあったページをRenameする
左メニューにあるウィジェットマーク -> Table をページにドラック&ドロップ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/88edd4a3-c959-3c08-e47a-1f930b476bf9.png)

作成したDATAが選択可能になっているので選択してNEXT
EditableはチェックしないままNEXT
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/495afcae-066d-c981-ad6e-755900a3c8ca.png)

Sortableもチェックを外してFINISH
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/af25f758-e7d6-7ef2-b14c-cc6f26a017d4.png)

こんな感じになっていればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/3fbc9c74-864e-dc78-5371-6fb82f10adcc.png)

実際に表示されるか確認してみます
PREVIEを押す（初回はパーミッション、スコープを許可する必要がある）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/312018/e3eea42f-c870-eda5-3b09-4ee680eefc91.png)
表示されましたね
その壱は以上になります。
そもそも言語学的にダジャレとは何なのか？「おもしろいダジャレを入力すると布団が吹っ飛ぶ装置を作った」で学習したいまとめ

# [おもしろいダジャレを入力すると布団が吹っ飛ぶ装置を作った - Qiita](https://qiita.com/fujit33/items/dbfbd7a2aa3858067b6c#%E3%83%80%E3%82%B8%E3%83%A3%E3%83%AC%E3%81%A8%E3%81%AF%E3%81%AA%E3%81%AB%E3%81%8B)

by @fujit33 さん

# ダジャレとはなにか、言語学チックに言うと

「多様な形での、言葉の反復」と言い直すことが出来るかも。なるほど。

>2018年12月現在、Sharekaで対応可能なダジャレは、「完全反復型」「不完全反復型」のみであり、「変形反復型」「潜在表現重複型」は対応していません。


# 「完全反復型」

>アサインされて日が浅いんです

「あさいん」と「あさいん」で完全一致

# 「不完全反復型」

>裏面のらーめん

「らめん」と「らーめん」が反復されているが、不完全一致

# 「変形反復型」

>数学の勉強をしmathか

意味は同じだが発音が違う

# 「潜在表現重複型」

>倒産か、辛かったな

>父さんカツラ買ったな

ひとつの文章から2つ以上の意味が導ける

# pythonと自然言語処理を学ぶ方へ

元記事を読もう‥！








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
FutureVuls : JPCERT, US-CERTの注意喚起について

# はじめに
この記事は[FutureVuls(脆弱性管理サービス) Advent Calendar 2018](https://qiita.com/advent-calendar/2018/futurevuls)の20日目の記事です。 今日以外はすべて @sadayuki-matsuno さんが書いてます。

FutureVulsの概要については、[こちらの記事](https://qiita.com/sadayuki-matsuno/items/58af0d32287ee6ce2259)で確認できます。

今回はFutureVulsの脆弱性から見える警戒情報について説明します。

# JPCERT, US-CERTの注意喚起情報とは

要するに、特に危険な脆弱性情報です。
## JPCERT > 注意喚起
> 深刻且つ影響範囲の広い脆弱性などに関する情報を告知するための文書です。
> 情報システムや制御システムに関わる端末やネットワークの構築・運用管理業務、組織内CSIRT業務、セキュリティ関連業務などに関与する担当者、技術者、研究者等を対象としています。
> - https://www.jpcert.or.jp/at/2018.html

## US-CERT > Alerts
> Alerts provide timely information about current security issues, vulnerabilities, and exploits. 
- https://www.us-cert.gov/ncas/alerts

# 脆弱性一覧からの見分け方

<img width="667" alt="list.png" src="https://qiita-image-store.s3.amazonaws.com/0/14275/171b88e5-f941-07cd-9c78-bf7fd86a3202.png">

脆弱性のリストの中に、｢警戒情報｣という項目があるので、そこでチェックできます。
JPCERT, US-CERTのどちらかに存在すれば｢○｣になります。

# 脆弱性詳細では
<img width="1671" alt="detail.png" src="https://qiita-image-store.s3.amazonaws.com/0/14275/f98c1387-a4c7-015e-9968-f73bd0a6ef10.png">
脆弱性の詳細ページには、情報が掲載されたURLへのリンクができます。

# 今後について
JPCERT, US-CERTの情報について、注意喚起の記事の中にCVE-IDが入っていない場合もあり、現段階で検知できていない脆弱性もあります。今後、その精度の向上をしていく予定です。

# まとめ
- JPCERTの注意喚起, US-CERTのAlertsには、比較的危険な脆弱性が掲載される
- FutureVulsでは、各脆弱性が注意喚起情報に入っているかを手軽に確認できる
- 記事のフォーマットの都合上、現段階で注意喚起に関する検知の精度は完全ではない。今後も改善を続ける

# さいごに
JPCERTの注意喚起, US-CERTのAlertsをFutureVulsで確認する方法を説明しました。

FutureVulsは短い間隔で様々な機能をリリースしています。
最新の更新情報については[リリースノート](https://releasenote.vuls.biz/release-note/)を確認ください
ルールベースのアプローチとは？「おもしろいダジャレを入力すると布団が吹っ飛ぶ装置を作った」まとめ自己学習

# [おもしろいダジャレを入力すると布団が吹っ飛ぶ装置を作った - Qiita](https://qiita.com/fujit33/items/dbfbd7a2aa3858067b6c#%E3%83%AB%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81)

by @fujit33 さん

# ルールベースって人工知能なの？

らしい。

>※ルールベースは人工知能ではないと言い張る人は、第２次人工知能ブームでググってください。

# ルールベースによるアプローチの例

- 「布団がふっとんだ」を「全てカタカナ」に変える(小文字とか記号も削除)
- 「3文字ずつのズレ配列を作る」
- 重複判定する

>['フトン', 'トンガ', 'ンガフ', 'ガフト', 'フトン', 'トンダ']

# ダジャレ判定判定の結果

nの設定「二文字重複」と「三文字重複」で結果が変わる。

精度は変わらなかったが傾向が変わったらしい

>どちらも精度はほぼ変わらず約89%となりましたが、
>ダジャレ判定判定が緩い場合（n=2）、通常文をダジャレと誤判定する場合が多く、
>ダジャレ判定判定が厳しい場合（n=3）、ダジャレを通常文と誤判定する場合が多くなります。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VSCode 用 SystemVerilogの拡張を作る（#5）

# LanguageServer
IDE上のプログラミング補助機能（補完、情報提示など）をエディタごとに全言語分を作っていると大変だから、エディタと言語機能提供サーバを分けて実装しましょう。というのが[基本概念](https://code.visualstudio.com/docs/extensions/example-language-server)です。

また、補助機能には言語解析がつきもので、パーシングに時間もかかることからプロセスを分けておくことでエディタの応答を犠牲にしないという効果も期待できます。

私が欲しかったのは補完機能なので、特にLanguageServerに拘る必要はなかったわけです。
しかし、後々わかったことですが、JavaScriptで書かれたパーサーがとんでもなく遅いということがあり、プロセスを分けることは重要と考え、最終的にLanguageServerで実装することにしました。

## Language Server Protocol (LSP)
LanguageServerは[プロトコルがLSPとして仕様化](https://microsoft.github.io/language-server-protocol/specification)されています。
どのようなリクエストがクライアントから来ると、どのように応答しなければいけないというルールがAPIのレベル？で書かれています（実際は、jsonの生テキストのやり取りで実現しているのでしょうか）。

ですので、実装はCでもPythonでも何でも良いのです。
しかし、VSCodeに準備されているライブラリはNode.jsしかなかったため、今回はTypeScript実装としました。
世の中には[様々なLanguageServerがあり](https://langserver.org/)、実装も様々であるようです。


# 補完機能とLanguageServer
VSCodeの補完機能は、インターフェースが発生させるイベント、マウスが単語の上に乗った（onHover）とか、補完キーワードが入力された（onCompletion）とかに対してそれをハンドルする処理を登録することで実現されます。

[公式のページ](https://code.visualstudio.com/docs/extensionAPI/language-support)になんとなく書かれています。

このイベントハンドルは

- コールバック関数を登録する（拡張機能ローカルで応答する）
- LanguageServerに任せる（LanguageServer側で応答する）

が選べるようです。
こだわらないのであれば、実装もデバッグも楽なローカル実装をおすすめします。


# LanguageServerの仕事
基本的に、以下の3つです。

- 何らかのタイミングでソースファイルをパース
- データベースを作る
- LSPリクエストに応じてデータベースから情報を精査して応答する

結構な種類のリクエストがありますが、全て実装しなくても問題ありません。
[このページ](https://code.visualstudio.com/docs/extensionAPI/language-support)から実現したい機能をピックアップし、対応するLSPを調べ、それだけ実装することにします。

いずれにせよ、SystemVerilogのパーサーは必要です。
saml2awsのCLIを持ち複数のAWS Profileを自在に操る高貴なる俺のためのtips

光速の異名を持ちkuraudoを自在に操る高貴なる俺です。

[初老丸 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/syoroumaru)のエントリです。

[saml2aws](https://github.com/Versent/saml2aws)というCLIがあります。
複数のIdPアカウントを使い、複数のAWSアカウントを制御するためのtipsです。

# configure

--idp-accountオプションを指定し、そのIdPアカウントに関連付けるProfileを設定します。
configureの結果は~/.saml2awsに記録されます。

```
$ saml2aws configure --idp-account=bbb
? Please choose a provider: Okta
? AWS Profile (saml) bbb
? URL https://aaaaaaaaaaaaaaaaaaaaaaaaa
? Username kishigami

? Password *******************************************
? Confirm *******************************************

account {
  URL: https://aaaaaaaaaaaaaaaaaaaaaaaaa
  Username: kishigami
  Provider: Okta
  MFA: Auto
  SkipVerify: false
  AmazonWebservicesURN: urn:amazon:webservices
  SessionDuration: 3600
  Profile: bbb
}
$ cat ~/.saml2aws
[bbb]
url                  = https://aaaaaaaaaaaaaaaaaaaaaaaaa
username             = kishigami
provider             = Okta
mfa                  = Auto
skip_verify          = false
timeout              = 0
aws_urn              = urn:amazon:webservices
aws_session_duration = 3600
aws_profile          = bbb
```

# loginとcheck

- 一時クレデンシャルを受け取ります

IdP aaaから受け取ったCredentialsは~/.aws/credentialsのProfile bbbとしてセットされます。

```
saml2aws login --idp-account=bbb --profile=bbb
```

- Profile bbbのS3バケットをlist

```
aws s3 ls --profile bbb --region ap-northeast-1
```

おわり
intra-mart 開発環境変更後 ログイン時に403エラー解消

## 前提
 - intra-mart Accel Platform 
 - ブラウザ = Google Chrome
 IEでは発生確認できません
 代わりといってはなんですが、IEはIM-Workflow申請一覧や未処理一覧のブラウザキャッシュが壊れるのかスクリプトエラーが発生して処理を先に進められなくなることがあります

 - 開発環境切り替え後に発生。別案件のResinを同一URL(localhost)で動かすと発生しがちです
 毎回発生するわけではないです

## 現象
![ログイン.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/35be7f59-630e-a629-d4f7-ed233c95fd87.png)
![403エラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/eca69ab9-dd82-1d90-fe37-8d5c68f4bdb7.png)


ログ
> [WARN] S.j.c.i.f.s.SecureTokenManager - [W.IWP.CERTIFICATION.SECURITYLOG.00800] セキュアトークンが不正です。


## 修正方法
 - 該当URLのCookie削除を削除します
 自分はChrome拡張機能の[「EditThisCookie」](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja)[で消しています
  手動でやる場合はこちらを参考にしてください
[Google Chromeで特定のサイトのCookieだけを削除する方法](https://otokuseikatu.net/job-cookiesakujyo2/)

 - Cookie削除後にログイン画面を開きログインします
![ログイン.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/35be7f59-630e-a629-d4f7-ed233c95fd87.png)
![アイコン.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/54139263-bc27-0cd9-ecb8-a4e01f0e6a36.png)


 - ログインは出来ますがアイコンぶっ壊れています
 この状態だと押せないボタンがあったり色々不都合があります
 - Ctrl + F5でブラウザキャッシュクリアすると直ります
![修正後アイコン.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/29e543da-09f6-2edb-3608-0f4828155e1f.png)
laradockをアップデートしたらlaravelmixもアップデートされた

そしたらapp.jsでの書き方がこうなっちゃうのね
旧
Vue.component('hoge-form', require("./components/HogeForm.vue"));
新
Vue.component('hoge-form', require("./components/HogeForm.vue").default);

参考
https://medium.com/@bluestar/upgrading-to-laravel-mix-4-on-laravel-6eead3096c5d
vue.jsでaxios使ってのGET時にカスタムヘッダーが効かない対処法

## 結論
空でいいから `data:{}`を付与する。

```
axios
 .get("http://localhost:8081/hogehoge/getContents", {
    headers: { "Content-Type": "application/json" },
    data: {} //←これ！！！
})
.then(response => {
  this.gridData = response.data.contents;
});
```

## 経緯
`Content-Type`で `application/json` を指定しないと弾くAPIサーバにアクセスしたかった。
そのためカスタムヘッダーを指定してみるも、chromeの開発者ツールで見る限り付与されていないようだった。

いない・・・
![スクリーンショット 2018-12-20 12.24.00.png](https://qiita-image-store.s3.amazonaws.com/0/189206/f3a273d1-7ee2-0056-898a-affcd40cbba8.png)

調べてみたところ、axiosのissueにてそれっぽいものをみつけた
https://github.com/axios/axios/issues/86

「 `data:{}`指定したらいいよ」というコメントをみつけたので試した。
![スクリーンショット 2018-12-20 12.24.00のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/189206/45dde326-1455-c992-062e-d9c7a2d842f6.png)

よかった🤗

なぜって話はコメント読んでみてください。ここあたりから書いてるみたいです。要はContent-Typeで指定される対象となるコンテンツがないからそりゃ無いよね、だから空でいいからそのコンテンツ指定しようぜって話のようです。
https://github.com/axios/axios/issues/86#issuecomment-311788525
>@teleyinex Content-Type describes what format the request data is in. If there is no request data, there is no need to specify the Content-Type. So you can correct me if I'm wrong but I believe the present behavior makes sense, aside from the fact that it should still not add the header if data is null. What do you think?
ヤフー福岡 Tech Meetup #2 に参加してみた

#導入
先日、ヤフー福岡のMeetupに参加してきました。今まで勉強会とかに参加したことはなく、全く初めてだったので、とてもいい刺激になりました。ここでは中でも特に印象に残った、OAuth（Web API）とSREについて学んだこと、感じたことを共有したいと思います。

#OAuth
まずは、OAuthについて。PHPやJavaでセッションやクッキーに触れたことがあり、簡単なログインフォーム（とても一般に公開できるものではありませんが…）なども作ったことがある私ですが、企業での開発経験は全くないため、認証技術に関してはとても知識不足。そんな、私にとって、モバイルアプリからユーザーエージェントを通しての、Authentication、Authorization、ProxyそしてDBというアクセス認証の一連の流れについて詳しいお話を伺えたことはとても勉強になりました。アクセストークンの利用、AuthenticationとAuthorizationサーバーの違いなどなど、今後詳しく学習してまた知識を共有したいと思います。

#SRE
次にSREについて。SREって言葉自体今回初めて知った私、新しく聞く言葉がほとんどでしたが、内容的にはとてもわかりやすいものでした。SREはSite Reliability Engineeringということで、Siteとという単語が使われていますが、ソフトウェアエンジニアリングを参考にしているということで、システム開発全般に使えそうだなという感じでした。具体的にはサービスの安定稼働、キャパシティプランニング、オーバーヘッド（雑務）の自動化や機械化による削減、トイル（スケールを阻害するもの）の解消など。これらを通して、運用業務時間の削減、開発業務時間の増加を目指すということらしいです。普段独学で勉強しているだけでは決して学ぶことのできない内容ばかりでした。

#まとめ
勉強会、交流会に参加したのは今回が初めてでしたが、とても勉強になり、自分の知識不足を痛感しました。今後もこのようなイベントに参加して、自分の知識を広げていきたいです。
gitのメモ

## ブランチの一覧
```shell
git branch -a
```

## 現在のブランチ確認
```shell
git branch
```

## ブランチを切る
```shell
git push -u origin 作成したブランチ名
```

## ブランチを切り替える
```shell
git checkout ブランチ名
```

## フェッチ
```shell
git fetch origin #リモートリポジトリの最新情報取得
```

## リベース
```shell
git checkout ブランチ名
git rebase master
```

## スタッシュ
引用元：[色々な git stash - Qiita](https://qiita.com/akasakas/items/768c0b563b96f8a9be9d)

```shell
git stash　　　　　　　　　　　　　　　　　　　 #メッサージなし
git stash save 名前 #メッサージ付き
```

### スタッシュリスト
```shell
git stash list
```

### n番目のスタッシュを確認
```shell
git stash show stash@{N}
```

### スタッシュを適用
```shell
git stash apply # 最新のスタッシュを適用し、残す
git stash apply stash@{N} # N番目のスタッシュを適用し、残す
```

### スタッシュを適用し、スタッシュを削除
```shell
git stash pop # 最新のスタッシュを適用し、削除 
git stash pop stash@{N} # N番目のスタッシュを適用し、削除
```
Pythonで与えられた離散確率分布に従って乱数を生成する方法とエントロピーの計算方法

離散確率分布が以下のようにListで与えられているとする。

```python
pd = [0.1, 0.2, 0.3, 0.4]
```

この分布に従う乱数(対応するindex)を返す関数：

```python
import numpy as np
def generate_random_num_based_on_given_pd(pd):
    cumulative_dist = np.cumsum(pd).tolist()
    cumulative_dist[-1] = 1.0
    random_num = np.random.rand()
    cumulative_dist.append(random_num)
    return sorted(cumulative_dist).index(random_num)
```

この分布のエントロピー：

```python
import math
def calculate_entropy(pd):
    return sum(list(map(lambda p: - p * math.log(p) if p != 0.0 else 0.0, pd)))
```

結果

乱数。10000回実行した分布がもとの確率分布に近ければOK。近さはJensen-Shannon Divergenceで測る。

```python
import math
import numpy as np

limit = 10000
dic = {}

def js_divergence(pd_a, pd_b):
    n = len(pd_a)
    left_kl_div = sum(list(map(lambda i: - pd_a[i] * math.log(pd_b[i] / pd_a[i]) if pd_a[i] != 0.0 else 0.0, range(n))))
    right_kl_div = sum(list(map(lambda i: - pd_b[i] * math.log(pd_a[i] / pd_b[i]) if pd_b[i] != 0.0 else 0.0, range(n))))
    return (left_kl_div + right_kl_div) / 2

for i in range(limit):
    r = generate_random_num_based_on_given_pd(a)
    dic[r] = dic[r] + 1 if r in dic else 0

result_pd = list(map(lambda n: n / limit, dict(sorted(dic.items())).values()))

print(result_pd)
print(js_divergence(a, result_pd))
```

出力。いいかんじに近い

```
[0.0993, 0.1975, 0.3014, 0.4014]
2.3886883539799464e-05
```

エントロピー。一様分布`pd`のエントロピーと`math.log(len(pd))`が等しければOK。

```python
import math

pd = [0.25 for i in range(4)]

print(calculate_entropy(pd))
print(math.log(len(pd)))
```

出力。一致している。

```
1.3862943611198906
1.3862943611198906
```

ライブラリがあるかもしれないけど調べてない。
picture、source要素 srcset、sizes属性について

## srcsetはあくまで同じ見た目の画像に使う
srcsetは画像を○倍にという用途にしか適さない

```
<img src="img320.jpg" srcset="img640.jpg 640w, img320.jpg 320w" sizes="(max-width:640px) 100vw, 640px"
 alt="">
```
srcsetの中で画像パス、**画像ファイルの横幅**を記述。
単位はpxでなくwを用います。
320w=1x、640w=2xみたいな書き方もできる。
sizes属性で**画像をウェブページ上で表示する際の横幅**を指定

※「画像ファイルの横幅」は、「画像をウェブページ上で表示する際の横幅」では無いことに注意してください。
※srcsetはページを読み込んだ段階で画像を選定
ウィンドウ幅を縮小したときに切り替えたいなら
pictureを使う。


### 各ブラウザのsrcset仕様

-  Chrome : 大きなサイズの画像ファイルをキャッシュした場合、画面幅を狭めても小さい画像は読み込まれない
- Firefox : 画面幅を変える度に、画面幅に適したサイズの画像を読み込む
- Safari : 最初に開いた画面幅に応じた画像ファイルがキャッシュされ、画面幅を変えても画像は再読み込みされない

※追記
Firefox、Safariでは動作が不安定

## pictureは違う画像にも対応
pictureはsrcsetとは違いsp時のみ見た目が違う画像にできたりする。
ただしie11を考慮すると**ポリフィル**を導入しなくてはいけない

```             
<picture>
    <source srcset="img640.jpg" media="(max-width:640px)">
    <img src="img320.jpg" alt="">
</picture>
```
メディアクエリを指定できるのでサイズの大きい順に記述し、最後にimg要素を記述します。

## まとめ
srcsetは色々不安定なので
picture使うがいいかも
pictureを使う際は**ポリフィル**を忘れずに！
めんどくさかったらclassで画像を出し分けてください

サンプルコード
https://codepen.io/belowt/pen/BGPvxp
decomposeMatrixノードを使う２

前回の記事、[decomposeMatrixノードを使う](https://qiita.com/YokoU/items/c7cf4da57e07acca679c)ではworldMatrixアトリビュートを用いてコネクションをしていました。
これを今回は、localのmatrixアトリビュートを用いてコネクションをする、に変えてみたいと思います。

まずは、対象となっていたhead_prxのmatrixアトリビュートをmultMatrixにコネクション。
![2018-12-20_11h12_31.png](https://qiita-image-store.s3.amazonaws.com/0/324697/7dd6cc38-cc22-68db-ad3c-f2215110674b.png)

階層を辿るように順にコネクションを行っていく。
![2018-12-20_11h05_06.png](https://qiita-image-store.s3.amazonaws.com/0/324697/673b40a0-b2d8-8672-63dd-3ad3d6b91d1d.png)

上位階層のノードまでコネクションを張り、multMatrix➡decomposeMatrixへ繋ぐ。
![2018-12-20_11h03_14.png](https://qiita-image-store.s3.amazonaws.com/0/324697/f1a39b0d-29f6-298b-82ca-a88ed64bdcd6.png)

decomposeMatrix➡head_pos(locator)へ繋ぐ。
![2018-12-20_11h00_26.png](https://qiita-image-store.s3.amazonaws.com/0/324697/60ebfd8f-fcdd-26b9-ee5b-5ce842a2ed01.png)

これでworldMatrixを用いてコネクションをしたのと同じ動作になります。
![2018-12-20_11h54_04.png](https://qiita-image-store.s3.amazonaws.com/0/324697/17bbcb8c-7dc2-4ab9-a1ef-9aefbd832456.png)


対象のノードのlocalのmatrixを階層を辿ってtopのノードまでつなぐ＝対象のノードのworldMatrix

ということがわかりました。