OmniAICreator/Qiita-1.07M huggingface dataset:
NativeScriptで枠なしのリップルエフェクトボタンを作る(Android)

NativeScriptのAndroidで枠が無いけど、押すとちゃんとリップルエフェクト（波状効果）がついて
ネイティブの見た目になってくれるボタンを作りたかった。

リップルエフェクトをつけてくれるプラグイン(↓)もあるけれど、たったこれだけのために導入するのは大げさすぎる。
https://github.com/edusperoni/nativescript-ng-ripple

試行錯誤した結果、CSSのみで作ることができたので共有したい。

NativeScript 4.2 + Angularの環境で検証したが、おそらくこの方法はNativeScriptのどのバージョンどのFWでも使えるはずだ。

# まずシンプルなボタンを作る

```html
<Button text="編集する"></Button>
```

こんな見た目。Android 2.3かというくらいダサい。Materialな感じにしたい。

![Android_Emulator_-_Nexus_5X_API_28_5554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170712/84656bc0-adab-0b59-797a-00857b9ce82b.png)

# ボタンの背景を消す

まずボタンの色を、背景と同じ白にしてみる

```css
Button {
   background-color: #FFFFFF;
}
```


![Android_Emulator_-_Nexus_5X_API_28_5554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170712/453f8fb0-85dd-ce4c-6c58-fa6e2e51a946.png)

少しはまともになった。だが、余計な枠がついている。まだコンテンポラリーな見た目とは言い難い。


# 枠を消す

```css
Button {
    background-color: #FFFFFF;
    z-index: 0; /* added */
}
```

枠を消すためにborderをいろいろいじっていたが結論としては、一番シンプルに枠を消す方法は
z-indexを0にすれば良い。

# 完成！

![Apr-30-2019 14-10-00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170712/5b0b7a91-0fde-c5c8-6f10-ae28eb1bdfbf.gif)

余計な背景や枠が消えて、かつリップルエフェクトは効くボタンができた。
thread+SIMD命令でnumpyを超えることができるか？(4)

[thread+SIMD命令でnumpyを超えることができるか？(3)](https://qiita.com/g667408/items/e52fc7730dfa37674447)の続き
gitのソースは[こちら](https://github.com/g667300/mynumpy)
commit 767abec77627718084310bc3c9a6ba91c5d1686a

#変更点

とりあえず、numpy.dotの2次元配列x１次元配列のみに限定的に対応。
v1 : ２次元配列
v2 : 1次元配列
とすると、

```
v3 = mylib.dot(v1,v2)
```
のように使用します。
out=には未対応。後日対応します。

#結果

実行してみた結果が下記のファイルです。
mydottest.ipynb
jupyter notebook超便利。。。
でかすぎる配列を生成してなんども実行させると、MacOSが不安定になったりします。
配列の大きさによってnumpyより早かったり遅かったりいろいろです。
時間的な都合もあり、まともに試せたのは、16384x16384の２次元配列と、長さ16384の１次元配列の場合のみです。

|実行時間|float64|float32|complex128|complex64|
|:--|:--|:--|:--|:--|
|numpy|86.3ms±505µs|48.3ms±7.14ms|172ms±685µs|86.3ms±505µs|
|mylib|85.9ms±8.04ms|39.1ms±395µs|162ms±4.92ms|92.9ms±14.1ms|

残念ながらcomplex64はむしろ遅くなってしまいました。
うまく場合分けをして、計算順序を工夫すれば、もう少し速くなりそう。
最適化は後にして、次は2次元x２次元のnumpy.dotに対抗する予定です。

#環境の情報

```
numpy           1.16.1
Python 3.7.2

clang++
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

```
  機種名:    MacBook Pro
  機種ID: MacBookPro13,2
  プロセッサ名:   Intel Core i5
  プロセッサ速度:    2.9 GHz
  プロセッサの個数: 1
  コアの総数:  2
  二次キャッシュ（コア単位）:  256 KB
  三次キャッシュ:    4 MB
  メモリ:    16 GB
```
【Unity】Unityテスト入門リンク集【UnityTestRunner】

## スライド
- [【Unite 2017 Tokyo】バグを殲滅！Unityにおける実践テスト手法(動画)](https://www.youtube.com/watch?v=vlwKZKeRIdE)

- [【Unite 2017 Tokyo】バグを殲滅！Unityにおける実践テスト手法(スライド)](https://www.slideshare.net/UnityTechnologiesJapan/unite-2017-tokyounity)

- [テストを書こう、Unity編]
(https://www.slideshare.net/hirotoimoto1/unityunittest)

- [Unityテスト完全に理解した(スライド)](https://speakerdeck.com/sassembla/unitytesutowan-quan-nili-jie-sita-shi-ji-zi-dong-li-falsearutesutonishi-raitukuhua)
- [Unityテスト完全に理解した(動画)](https://www.youtube.com/watch?v=ZuZ3RE45-DU)
- [どこから始めるUnity Test](https://learning.unity3d.jp/1840/)

- [Unityプロダクトにテストを導入していくまで](https://speakerdeck.com/adarapata/unitypurodakutonitesutowodao-ru-siteikumade)

- [Zenjectとテスト](https://speakerdeck.com/adarapata/zenjecttotesuto)

- [Zenjectの機能をご紹介 ~テストの巻~](https://speakerdeck.com/barasixi/zenject-testing-lt)

## Qiita

[Unityでテストを書くのが当然になる時代に今から備えよう](https://qiita.com/naninunenoy/items/b5092774fed30739adbc)

[Unity使いは全員Unity Test Runnerを使え！爆速のトライ＆エラー環境だぞ！](https://qiita.com/su10/items/67a4a90c648b1ef68ab9)





[Unityでちゃんとテストを書きたい人のためのまとめ]
(https://qiita.com/su10/items/560302ceafa6bf43a13e)


[【Unity】TestRunnerで使えるNUnit.Frameworknoアトリビュートの使い方メモ](https://qiita.com/okNirvy/items/e183ecec97572a16861e)

[Zenject入門その1 疎結合とDI Container](https://qiita.com/toRisouP/items/b3d3c43db40857ca4ad4)

## 公式マニュアル系

[Unity Test Runner](https://docs.unity3d.com/ja/2019.1/Manual/testing-editortestsrunner.html)

[Writing and executing tests in Unity Test Runner](https://docs.unity3d.com/ja/2019.1/Manual/PlaymodeTestFramework.html)

[Most Complete NUnit Unit Testing Framework Cheat Sheet]
(https://www.automatetheplanet.com/nunit-cheat-sheet/)
AWSのコンソール画面で、EC2インスタンスを起動・停止する方法

AWSでEC2インスタンスを起動したり停止したりする方法。
基本は自動で起動・停止をコントロールするかと思うが、手動でやる場合のメモ。
EC2のインスタンスは停止中だと課金されないため、
小刻みに停止させておいて運用費をケチりたいときなど用。

##EC2のインスタンス状態は３つある
・起動している状態
<img width="72" alt="スクリーンショット 2019-04-30 13.36.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/086911ec-2714-fe25-8923-aa0e404c31ce.png">

・停止している状態
<img width="77" alt="スクリーンショット 2019-04-30 13.36.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/05afbe94-2db8-edaf-a03e-3baf91037d93.png">

・インスタンスの作成中、起動準備中、など
<img width="100" alt="スクリーンショット 2019-04-30 13.36.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/8eab7c82-63b1-c078-489f-e850cdd18a66.png">

このうち、「running」⇆「stopping」の操作を紹介。

## IAMからログイン

## リージョンを指定
画面右上のリージョン名をクリックして、使用中のものを選択。
大抵のユーザーはアジアパシフィックの東京リージョンと思われるが、
デフォルトだと北米になっていたりするので、その際は変更する。
<img width="1233" alt="スクリーンショット 2019-05-01 14.28.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/bab2ba49-6650-1208-0d4f-9afca0ebac05.png">


## EC2を選択
コンソールにログインしたら、サービス一覧から「EC2」を選択し、そのままEC2の管理画面に移動。
<img width="481" alt="スクリーンショット 2019-04-30 8.57.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/0a83b2ed-de97-8335-3461-3962a520afb3.png">

## インスタンスの管理画面に
EC2のダッシュボードへ移動し、左側列の一覧から「インスタンス」を選択。
<img width="895" alt="スクリーンショット 2019-04-30 9.08.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/d1d0ec40-f19f-e6dd-d617-c10584e29cff.png">

## インスタンスの確認
インスタンスの情報がまとめられている表が表示されるため、
任意のインスタンスを選択する。
※図のように、行の一番左側にある四角が青くなっていると、選択状態。
<img width="1101" alt="スクリーンショット 2019-04-30 9.25.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/40ef39db-f99d-475b-5d13-0a5d82455fb4.png">

## インスタンスの開始
状態が「stopped」になっているインスタンスについては、下図のように、
①インスタンスを選択し、
②上部にある「アクション」ボタンを押し、
③「インスタンスの状態」タブを選択し、
④「開始」を選択。
とすると、インスタンスが開始される。

<img width="609" alt="スクリーンショット 2019-04-30 9.29.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/8e1945b0-2a30-5098-d6bd-764df8039da8.png">

## インスタンスの停止
状態が「running」になっているインスタンスについては、下図のように、
①インスタンスを選択し、
②上部にある「アクション」ボタンを押し、
③「インスタンスの状態」タブを選択し、
④「停止」を選択。
とすると、インスタンスが停止される。

<img width="796" alt="スクリーンショット 2019-04-30 9.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/a91e5b78-a1c3-fb9c-2f4f-ffde73c8772a.png">


停止しようとする際、下記のようなポップアップが表示されるるが、「停止」を選べばOK。
<img width="633" alt="スクリーンショット 2019-04-30 13.37.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167185/3463f3b9-26ee-ae8d-59f4-dc3630272dcf.png">


以上。
Ruby％記法 〜チェリー本２章〜

# Ruby％記法 〜チェリー本２章〜 #



**※この記事は初心者の私がチェリー本で学習するにあたって新しく知ったことや考えたことアウトプットするための場として書いています。**
この記事は以下の情報を参考にして記述し、一部引用しています。
[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)


##　-2.8.2 ％記法で文字列を作る##
 
```
irb(main):001:0> puts Hello, World
Traceback (most recent call last):
        2: from /Users/hiwillowz/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
        1: from (irb):1
NameError (uninitialized constant Hello)

irb(main):002:0> puts 'Hello, World'
Hello, World

irb(main):003:0> puts %q!Hello, World!
Hello, World
```
１行目は何も囲ってないので**NameError**が出てますね
２行目はシングルクォーテーションで囲ったので**文字列**としてちゃんと認識されています
３行目は％記法というもので`%q!何か!`でシングルクォーテーション文字列を作ることができるものになります。

```
irb(main):004:0> a = 1
=> 1
irb(main):005:0> a.class
=> Integer
irb(main):006:0> b = %Q!1!
=> "1"
irb(main):007:0> b.class
=> String
```

`%Q!何か!`で％の次のｑを大文字することでダブルクオーテーションで展開することができます。

---
#追加#
###％記法で配列を作る###
```
irb(main):122:0> %w(red green blue)
=> ["red", "green", "blue"]

irb(main):123:0> prefix = 'Colors of traffic light are'
=> "Colors of traffic light are"
irb(main):124:0> %W(#{prefix}red green deep\ blue)
=> ["Colors of traffic light arered", "green", "deep blue"]
```
`%w()`で（）の中の文字列で配列を作る（空白で区切り、**空白前の`\`で空白も文字列と認識させる**）。
`%W()`で（）の中の文字列で配列を作り、同時に式展開もする。


---
###%記法でシンボルやシンボルの配列を作成する###
```
irb(main):117:0> %s(ruby is fun)
=> :"ruby is fun"

irb(main):118:0> %i(ruby is fun)
=> [:ruby, :is, :fun]

irb(main):120:0> name = 'Alice'
=> "Alice"
irb(main):121:0> %I(hello\ngood-bye #{name.upcase})
=> [:"hello\ngood-bye", :ALICE]
```
`%s()`は()の中の文字全体でシンボル化する。
`%i()`は()の中の文字毎にシンボル化する（空白で区切る）。
`%I()`は()の中の文字毎にシンボル化し、同時に式展開もする。

---
###忘れやすそうな文字列###

**-\n 改行 " "**

```
irb(main):011:0> puts "Hello,\nWorld"
Hello,
World
```

**クォートを入れる為のバックススラッシュ`\`**

```
irb(main):019:0>  %Q!Hello,World!!
irb(main):020:0* 
irb(main):021:0* quit
Traceback (most recent call last):
        1: from /Users/hiwillowz/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
SyntaxError ((irb):19: syntax error, unexpected '!', expecting end-of-input)
 %Q!Hello,World!!
                ^
irb(main):022:0>  %Q!Hello,World\!!
=> "Hello,World!"
```

`\`を何か意味を含む記号の前につけることでその記号をただの文字列と認識させることができます！
１行目`\`をつけなかったことで！が文字列と認識されずエラーを起こしている。


**あとがき**
Qiita初投稿になりますがこんな５分くらいで書けそうな記事でも１時間以上かかりました。
ただMarkdown記法を覚えたり、タイピングが遅かったりこれから早くしていきます。

そもそもなぜこんな大したことない記事でも書こうかと思ったのかというと、
[ryoutaku](https://qiita.com/ryoutaku)さんの
[【未経験から転職】「28歳+空白期間1年+高卒+プログラミング経験なし」が、自社開発の企業からスカウト頂いてエンジニア転職する４ヶ月間の体験談](https://qiita.com/ryoutaku/items/3749b957f2f41545ad09)を読んでアウトプットの重要性を知ったので毎日継続できるようにまずは習慣化させていきます！
OJT期間の過ごし方（インフラエンジニア）

####今年も新入社員研修を終えた新人が各現場にアサインされる時期がやってきました！
改めて、OJT期間の過ごし方を整理しました。私のプロジェクトではこうしてるよ！みたいなコメント頂けると嬉しいです。

弊社では一般的に以下のようなキャリアアップを目指しています。
- 3年目までインフラエンジニアとして構築を担当
- 4年目以降で案件担当者としてプロジェクトを推進

では、早速...

##０．セキュリティルールの説明（初日）

新人、ベテラン関係なく同レベルで理解しなくてはいけない事項です。
USBの持ち込みはもちろんのこと、入館証の取り扱い、ドキュメントの取り扱い、SNSの利用について説明しています。

##１．インフラエンジニアの簡単な説明（初日）

新人研修中にはプログラミング言語の学習中心なので、インフラ(?)という新人が多数です。
簡単な仕事のイメージとキャリアプランがイメージできるような話をしています。
結局、イメージつかんでもらえないことのほうが多いんですけど、、、

<details>
<summary>参考：インフラで扱う領域</summary><div>

---
>抜粋「インフラエンジニアとは？実際の業務内容、スキル、キャリアから、資格、将来性までまとめて公開！」
>http://proengineer.internous.co.jp/content/columnfeature/8091
>![colum_imaga_8091_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/733abc07-9d5a-0fb2-e14e-39af43134bd0.jpeg)
---

</div></details>

##２．UNIXコマンド、Windowsコマンドの簡単な操作（初月）

毎年利用しているドリルを毎朝30分程度やってもらっています、
コマンドなんて利用したいときにすぐ使えるレベルになっていないと意味ないですからね:smirk:
（小学校の時に利用していた計算ドリルみたいなものです）

##３．仕事の進め方（初月～翌月）

プロセス起動確認のチェックバッチのプログラム設計書～開発～テスト～リリースまでをプロジェクトと課程して進めてもらっています。ホウレンソウ、タスク管理の練習を兼ねてWBS、課題管理表も用意。

##４．ITの基本的な仕組み（初月～翌月）

最初はOJT担当者で説明していたのですが、やはり座学での理解度はかなり低く、
去年度より各新人に以下のテーマを与えて発表してもらう形式にしました。レビュアーは有識者が良いです。

ITを支える基礎技術を理解するのはもちろんですが、
わからないことを調べて相手に説明できる能力を向上する目的です。

<details>
<summary>各種テーマの詳細</summary><div>

---
- テーマ1)　WEB　3層構造

サーバインフラエンジニアの仕事の領域を理解してもらうために、このテーマを採用しています。
着地点：WEB/AP/DBのコンポーネントが必要な理由を説明できること。アプリケーション、インフラの役割分担を説明できること。

>抜粋「ミドルウェア(Web、AP、DB)について知ろう」
>https://thinkit.co.jp/article/11837

- テーマ2)　IPアドレス、DNS
名前解決の仕組みを理解してもらうために、このテーマを採用しています。
着地点：自端末から弊社公式トップページの名前解決までの流れを説明できること。

- テーマ3)　仮想化ソリューション(VMware vSphere)　/　ストレージ仮想化
VMware vSphereを利用しているお客様が多いため、このテーマを採用しています。ネットワークの仮想化技術(NSX)には触れていません。採用ケースが増えてきたら考えますが、、、私も勉強しなきゃ:sweat:
着地点：物理的なアクセスの流れ（同セグメント間の通信、別セグメント間の通信）が説明できること。

>抜粋「新卒 SE 社員が贈る　vSphere のキソ！第1回〜 vSphere を俯瞰する〜」
>https://blogs.vmware.com/jp-cim/2014/08/vsphere_kiso01.html
>![20140813_vSphere1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/860aef2b-e979-2f1c-09b3-ba448bbf4dc2.jpeg)

- テーマ4)　イントラネット / インターネットシステム
基本はオンラインシステムの保守構築が中心のため、イントラ、インターネットに分けて説明しています。SSL、DMZ、グローバルIPからプライベートIPへのNAT変換、IPSやWAFについても触れるようにしています。

---

</div></details>

##５．メールの書き方

３、４の状況を週次でメールするように伝えています。不明点なども極力メールでもらうようにしています。業務では比較的電話やり取りも多いですが、わからないことを文章で整理する力をつけてもらいたいので、このようなルールにしています。

以上、OJT期間の過ごし方でした。
今後もプロジェクト状況や新人にあわせて改善していきたいと思います。
swagger-editorのnpm installでコケる場合に確認すべき点

- swagger-editor 3.6.27
- `git clone`して`npm install`しようとしてコケてしまった人向け

# 確認すべき点

私が遭遇した範囲では以下の３つ。

1. Python 2.7系の有無
1. C/C++のコンパイラ等の開発環境の有無
1. Node.js/npmのバージョン

# 1. Python 2.7系の有無

swagger-editorが依存する一部のパッケージは、Node.jsのネイティブアドオンを利用しており、それらは`node-gyp`という、ネイティブコードをコンパイルするためのツールに依存している。

この`node-gyp`が動作するためにPython 2.7系が必要となる。次のコマンドで確認できる。（Vは大文字）


```shell
python -V
```

次のように出力されればOK。`2.7.x`であれば良く、細かいリビジョン番号まで一致する必要はない。

```shell
Python 2.7.10
```

`python : command not found`とエラー出力される、あるいは2.7系以外のバージョンが表示される場合は、各プラットフォームごとの適当な方法でPython 2.7系をインストールする。

- $注意点$
    - Mac OSXなど一部のプラットフォームではシステムが利用するためのPythonがデフォルトでインストールされている。システムのPythonとの競合を防ぐために`virtualenv`や`Anaconda`等のPython環境を切り替えるツールを活用すると良い。そもそもシステムが利用するPythonは2.7系な気がするので、余計な心配かもしれない・・

# 2. C/C++のコンパイラ等の開発環境の有無

前述した`node-gyp`はPython 2.7系に加えて（当然だが）C/C++のコンパイラやMake等の開発環境を必要とする。

## 2.1. Mac / Linuxの場合

次のコマンドで確認できる。

```shell
make -v
```

次のように`make`のバージョンやビルドターゲット環境が表示されればOK。もちろん細かい部分が違ってても良い。

```shell
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
```

`make: command not found`とエラー出力される場合は、各プラットフォームごとの最適な方法でC/C++開発環境をインストールする。

一例としてUbuntuであれば`sudo apt install build-essential`

## 2.2. Windows の場合

確認方法は色々ややこしいので省略。

手っ取り早く解決したいなら次のコマンドを実行する。管理者権限で実行した方が良さそう。

```shell
npm install --global --production windows-build-tools
```

- 補足
    - `node-gyp``windows`あたりのキーワードでググると色々記事が出てくる。Visual Studioをインストールするとか色々出ててくるが、それらは古い情報なのでご安心を。2019年現在、一番簡単なのがこの方法。[`node-gyp`の公式のインストール手順](https://github.com/nodejs/node-gyp#on-windows)にもある。
    - `--production`オプションにより`windows-build-tools`のdevDependencies（＝実行するだけなら不要）はインストールせずに済む。

# 3. Node.js/npmのバージョン

[Readme](https://github.com/swagger-api/swagger-editor#running-locally)にあるように、swagger-editorに必要なNode.js/npmのバージョンは以下の通り。

- Node.js 6.x
- npm 3.x

確認方法は次の通り

```shell
node -v
npm -v
```

次のようにNode.js/npmがそれぞれ6.x/3.xのバージョンが表示されればOK。

```
> node -v
v6.17.1

> npm -v
3.10.10
```

異なるバージョンが表示された場合、Node.jsのバージョンを変更する。各プラットフォームごとにNode.jsバージョン管理ツールがあるので、そちらを利用するのがベター。

代表的なツールを次にあげる。もちろん他にもツールは色々ある。

|プラットフォーム|ツール名|
|---|---|
|Linux|[nvm](https://github.com/nvm-sh/nvm)など|
|Mac|[nodebrew](https://github.com/hokaccha/nodebrew)など|
|Windows|[nodist](https://github.com/nullivex/nodist)など|
icotoolでicoファイルの中身を確認する

ウェブサイトのfavicon.icoなどでicoファイルを扱うことがある。icoファイルの実体はざっくりいうと、複数の解像度のPNGかBMPファイルの集合である。

引き継いだ、大分前に作ったなどの理由でicoファイル内にどのような画像データが含まれているか、わからなくなってしまうことがある。

そんなときにicotoolを使えばCLIでサクッとicoファイル内の情報を確認できる。

## インストール

Ubuntuならicoutilsパッケージですぐインストールできる。

```sh
$ sudo apt-get install icoutils
```

## 使い方

`-l` でエントリごとのメタデータが一覧できる。

```sh
$ icotool -l favicon.ico
--icon --index=1 --width=16 --height=16 --bit-depth=8 --palette-size=0
--icon --index=2 --width=24 --height=24 --bit-depth=8 --palette-size=0
--icon --index=3 --width=32 --height=32 --bit-depth=8 --palette-size=0
--icon --index=4 --width=64 --height=64 --bit-depth=8 --palette-size=0
```

`-x` でファイル内の画像ファイルを書き出す。デフォルト展開先は`.`。

```sh
$ icotool -x favicon.ico
$ ls
favicon.ico            favicon_2_24x24x8.png  favicon_4_64x64x8.png
favicon_1_16x16x8.png  favicon_3_32x32x8.png
```

`-c` でPNGファイルからicoファイルを作成できる。

```sh
$ icotool -c favicon_1_16x16x8.png favicon_2_24x24x8.png  > favicon.ico
```

## 参考

* [icoutils home](http://www.nongnu.org/icoutils/)
* [audreyr/favicon-cheat-sheet: Obsessive cheat sheet to favicon sizes/types. Please contribute! (Note: this may be in flux as I learn new things about favicon best practices.)](https://github.com/audreyr/favicon-cheat-sheet)
* [ICO (file format) - Wikipedia](https://en.wikipedia.org/wiki/ICO_(file_format))
Mac ターミナルの設定色々

##Summary
Markdownの練習がてらQiitaに初投稿してみる。
ターミナルの設定変更を行うにあたり参考にさせていただいた素晴らしい記事。
https://qiita.com/kinchiki/items/57e9391128d07819c321

その他引用元は各項ごとに。

##Index

[Ⅰ. 事前設定](##事前設定)
[Ⅱ. テーマ](##テーマ)
[Ⅲ. フォント](##フォント)
[Ⅳ. vim](##vim)
[Ⅴ. プロンプト](##プロンプト)

##事前設定

1. Macの購入 ()
2. GitHubへの登録、sign-in

##テーマ

**脳死でICEBERG**

1. [公式サイト](http://cocopon.github.io/iceberg.vim/)からDL
(一番下にDownloadボタンがあります)
2. [作成者様のブログ](https://cocopon.me/blog/2014/04/iceberg-for-terminalapp/?p=4862)の手順をなぞって設定
3. 最後は[デフォルト]をクリックして完了

##フォント

デフォルトはイケテナイらしいので変える。
rictyとricty diminished、どっちでもいいっぽい。
App開発ならricty、Linuxならdiminished、とかなんとか。
rictyにしとけば安牌か。

**ricty diminishedの場合**

```
brew tap caskroom/fonts
brew cask install font-ricty-diminished
```

**rictyの場合**

```
brew tap sanemat/font
brew install ricty

#下記2行は上記のコマンド実行後に表示されるのでそっちをコピぺ実行でもおk
cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf
```

**設定**
1. ターミナルを開く
2. ディスプレイ左上🍏マークの横の[ターミナル]>[環境設定]を選択
3. ↓の通り[変更]>フォントの編集窓が上がるのでrictyを選択>[デフォルト]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231579/8ae32340-a336-ca29-b491-b479a166717d.png)

**参考**
https://qiita.com/mochizukikotaro/items/def041700846adb903fe
https://qiita.com/segur/items/50ae2697212a7bdb7c7f
https://www.konosumi.net/entry/2018/03/07/011920

##vim

**Hybridが見やすいらしい。**

```
# ~/vim/colorsのdirectoryを作る *既にあれば不要
cd ~
mkdir -p ~/.vim/colors

# gitからDLしてくる
cd ~
git clone https://github.com/w0ng/vim-hybrid

# DLしたファイルを作成した/colorsに移動
mv vim-hybrid/colors/hybrid.vim ~/.vim/colors

# home下に.vimrcファイルを作成
vi ~/.vimrc
```

```:.vimrc
syntax enable
colorscheme hybrid
set background=dark
 
set number
set cursorline
set virtualedit=onemore
set showmatch
```
中身の設定の詳細は参考のリンク先に。

**参考**
https://qiita.com/mochizukikotaro/items/def041700846adb903fe
https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301
https://pc.tokuvin.net/vim-hybrid/

##プロンプト

[xxxnoMacBook:user]とかダサくなっているのを変える。
そのためにbash_profileとbashrcに追記する。

bash_profileの編集

```
cd ~
vi .bash_profile
```

```:.bash_profile
#read bashrc
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
```

bashrcの編集

```
cd ~
vi .bashrc
```

```:.bashrc
#prompt param
PS1='[\h:\W] $ '
```

あとは[このサイト](https://www.softantenna.com/wp/tips/mac-change-conputer-name/)の手順を踏んでコンピュータ名を変えましょう
(\hの部分、xxxnoMacを適当な文字に)
↓こんな感じになりました？
<img width="383" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231579/b65a49fe-4394-0fa8-4a0e-bc7d67d7d053.png">


**参考**
https://tech.qookie.jp/posts/terminal-turn-off-prompt/
https://qiita.com/dark-space/items/cf25001f89c41341a9fd
Elixir ~Enum.mapをEnum.mapで包む~

#ここまでのあらまし

前回のドキュメント[Elixir~名前付き関数とモジュール化~](https://qiita.com/kmizuno0211/items/8119b6a3d6d0779e63e3) でEnum.mapで各要素をIO.putsで出力することをしました。

今回は、Enum.mapにEnum.mapを入れ子にするとどうなるか、やってみようと思います。

#本題

適当なディレクトリで

```elixir
mix new example
```

します。

式はこちら

```elixir:lib/example.ex
defmodule E do
  def example( list ) do
    list
    |>Enum.map( & F.foo(&1) )
  end
end

defmodule F do
  def foo(list2) do
    Enum.map(list2, fn x -> x * 2 end)
  end
end
```

(あまり関数の命名が美しくないかもしれませんが、お許しください。。）
Enum.mapで各要素に対して下段のEnum.を呼び出し、それぞれの要素に2をかける、というものです。

最初はEnum.mapに対してEnum.mapを入れ込むことは適当じゃないのだろうか、という問いから出発し、
まずはでは式を作ってみよう、ということでこの式を作りました。

さっそくiexで[1,3,5]のリストを引数に関数exampleを呼び出してみます。

```elixir
iex > E.example([1,3,5])
** (Protocol.UndefinedError) protocol Enumerable not implemented for 1. This protocol is implemented for: HashSet, Range, Map, Function, List, Stream, Date.Range, HashDict, GenEvent.Stream, MapSet, File.Stream, IO.Stream
    (elixir) /private/tmp/elixir-20190202-21222-1ilp2g0/elixir-1.8.1/lib/elixir/lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir) /private/tmp/elixir-20190202-21222-1ilp2g0/elixir-1.8.1/lib/elixir/lib/enum.ex:141: Enumerable.reduce/3
    (elixir) lib/enum.ex:3015: Enum.map/2
    (elixir) lib/enum.ex:1327: Enum."-map/2-lists^map/1-0-"/2

```


?????????
"加算プロトコルは1のために実装されていない。このプロトコルは〜〜〜"

普通に整数のリストを与えても上記エラーが出ます。

```elixir
iex > E.example([false , "first" ,123])
** (Protocol.UndefinedError) protocol Enumerable not implemented for false. This protocol is implemented for: HashSet, Range, Map, Function, List, Stream, Date.Range, HashDict, GenEvent.Stream, MapSet, File.Stream, IO.Stream
    (elixir) /private/tmp/elixir-20190202-21222-1ilp2g0/elixir-1.8.1/lib/elixir/lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir) /private/tmp/elixir-20190202-21222-1ilp2g0/elixir-1.8.1/lib/elixir/lib/enum.ex:141: Enumerable.reduce/3
    (elixir) lib/enum.ex:3015: Enum.map/2
    (elixir) lib/enum.ex:1327: Enum."-map/2-lists^map/1-0-"/2
```
リストの中身を真偽値や文字列にしても同じエラーに阻まれました。
???????????


次いで、関数fooの動作確認をします。

```elixir
iex > F.foo([1,3,5])
[2, 6, 10]
```

こちらは式のとおりリストの各要素にかける2をした値が返ってきました。

次いで、関数exampleにリストで包んだリスト、[[1, 2], [3, 4]]を与えてみます。

```elixir
iex > E.example([[1, 2], [3, 4]])
[[2, 4], [6, 8]]
```

しっかりリストのなかの整数にすべて2をかけた値が返ってきました。

これは何を意味するのか？

ここで先生から重要なことを教わりました。


**"Enum.mapにただの整数を渡すとエラーになる"**

ということです。

つまり、Enum.mapにEnum.mapを入れ子にした関数では、
上段のEnum.mapで一度リストが各要素にバラされてしまうので、

"リストをリストで包んだデータ"を与えてやらねばならない

ということです。

ここからも先生の教えです。
この”リストをリストで包んだデータ”が何を意味するか。

これが意味するところのひとつは、表で表された数値データです。
[[1,2],[3,4]]は

|1|2|
|3|4|
のような表を表している。
このような表現を、数学では”行列"と呼ぶそうです。
また、いままでの数値を要素にしたリストを”ベクトル"と呼ぶ。
つまり、ベクトルを束ねたものが行列。
なお、リストのリストはC言語などでは"2次元配列"と呼ぶ。

つまり、
リスト=配列=ベクトル
リストのリスト=2次元配列=行列

というように対応する。
ここまで、先生の教えをうまく噛み砕けていないのですが、後から見返したときのために記述しておきます。

#編集後記

前回IO.putsを入れ込んだところに自由に関数を当てはめることができる、また、Enum.mapのなかにEnum.mapを入れ込むことができる。

まだまだ、Elixirに限らずとも自分の自由な思考でコードを書くことに至らず、速いと信じていた自分の学習スピードに疑問を持つこともあります。
Qiitaドキュメントも、誤った記述をしてはならないようなセルフプレッシャーが強く、わからないこともうまく表現できないことがままあります。
が、必ず備忘録として役に立つ日があとで来るので、なるべくすまさず素直な書き方ができたらなと思います。

うまずたゆまず、頑張ります。

Kento Mizuno
Macbook Pro(2018) mojaveにアップグレードできない人メモ

mojaveにアップグレードに手こずったので，アップグレードするために試した方法をまとめておきます．

現在状況
macOSのバージョン
→macOS Hight Siera10.13.6
→mojaveのインストーラーをMacに入っており，それを起動し進んでいくと下のようなエラーがでる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/73ce0ba2-b3d7-2218-ed17-a3552f60cb95.png)



解決までに試した手法をまとめたいと思います．


1, ネットワークを変えてみる
    自宅と大学両方のネットワークを利用しましたが，解決できませんでした．
2, リカバリー領域にOSの再インストールを行う．
    再起動時に「Option+command+R」を同時押しする．
    地球儀のマークが出てきたら長押ししている指を離して，手順に従い進む．
    その後，同様にインストーラを起動して作業を行う．
3, SMCリセット
    →https://gori.me/mac/mac-tips/78454
    ここに記載されている内容を実行した．
4, 一度，「macOS Mojaveインストール」を削除して，ダウンロードし直す．
5, 他社のソフトを消す．
　ライブラリ＞LaunchAgentsの中身を削除
　ライブラリ＞LaunchDaemonsの中身を削除
　ライブラリ＞ScriptingAdditionsの中身を削除
　ライブラリ＞Extenssionsの中身を削除
　ライブラリ＞Input Methodsの中身を削除


上記を実行した結果(おそらく4を一番にするべき)，

<img width="800" alt="スクリーンショット 2019-04-30 13.28.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/1e4e39c8-0a80-8ac5-c313-5443041e7937.png">

このような画面になった．
どうやらネットワークの問題のようだ．

https://support.apple.com/ja-jp/HT202480

に従って，ネットワークを変えてやってみたらアップグレードできた．
単語感情極性対応表とMeCab出力

最近セキュリティ関係のコードばかり（Rで）書いていて、文字処理とかしていないのだが、そのセキュリティ関係のコードで文章内容の判定が必要になった。

東京工業大学の高村先生が公開されている語感情極性対応表をしばしば利用させてもらっているのだが、この辞書では同じ綴りでも読みが異なり、さらに感情値も違う場合がある。

http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html

```
dic <- read.table("http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic", 
   sep = ":", stringsAsFactors = FALSE, fileEncoding = "CP932"
   , encoding = "UTF-8"# Windowsでこの行は不要なので行頭に半角#を追記
)

dic %>% group_by(V1)  %>% filter(n() > 1)  %>% arrange(V1)
# A tibble: 4,504 x 4
# Groups:   V1 [2,050]
   V1       V2               V3        V4
   <chr>    <chr>            <chr>  <dbl>
 1 アイス   アイスボックス   名詞  -0.326
 2 アイス   アイス           名詞  -0.354
 3 アイス   アイスキャンデー 名詞  -0.368
 4 アイス   アイスクリーム   名詞  -0.497
 5 アイス   アイスホッケー   名詞  -0.575
 6 あらあら あらあら         名詞  -0.134
 7 あらあら あらあらかしこ   名詞  -0.305
 8 あんぜん あんぜんマッチ   名詞  -0.178
 9 あんぜん あんぜんピン     名詞  -0.438
10 イエロー イエロー         名詞  -0.167
# … with 4,494 more rows
```

同じ綴りの単語だから手抜きで平均値を使ってきたが、いい加減MeCabでも単語原型と読みの両方の情報を使って、感情値を照合しようと思った。


```
tmpf <- tempfile()
X <- "今日はアイスを食べた。"
write(X, file = tmpf)
library(RMeCab)
yomi <- RMeCabText(tmpf) %>% map_df( ~ tibble(V1 = .[1], V2 = .[9]))
# A tibble: 7 x 2
  V1     V2    
  <chr>  <chr> 
1 今日   キョウ
2 は     ハ    
3 アイス アイス
4 を     ヲ    
5 食べ   タベ  
6 た     タ    
7 。     。    
unlink(tmpf)
```

MeCabでは読みはカタカナに統一されているので、感情辞書の方で読みをカタカナに統一し、とりあえず語形で照合してみたのだが。


```
library(Nippon)
dic <- dic %>% mutate(V2 = hira2kata(V2))
yomi %>% left_join(dic, by = c("V1" = "V1"))
# A tibble: 12 x 5
   V1     V2.x   V2.y             V3         V4
   <chr>  <chr>  <chr>            <chr>   <dbl>
 1 今日   キョウ コンニチ         名詞    0.264
 2 今日   キョウ キょウビ         名詞    0.172
 3 は     ハ     NA               NA     NA    
 4 アイス アイス アイスボックス   名詞   -0.326
 5 アイス アイス アイス           名詞   -0.354
 6 アイス アイス アイスキャンデー 名詞   -0.368
 7 アイス アイス アイスクリーム   名詞   -0.497
 8 アイス アイス アイスホッケー   名詞   -0.575
```

読みも違う場合があるのだな。ちょっと考え直そう。

あと **Nippo** パッケージでは、拗音はカタカナに変換できないのか？
最近気に入ってる開発に役に立つサービス【GW連投企画】

# サービス
## [ElephantSQL - PostgreSQL as a Service](https://www.elephantsql.com/)
制限あるけど、無料でPostgreSQLが使える。RDBの環境構築が面倒い時はよく使ってる
その影響でMysql派からPostgreSQL派に寝返りました。
推奨されている「pgAdmin」は無料版だと無料ユーザーのDB全部を参照として固まるので
Dbeaver使ってます

## [MongoDB Atlas](https://www.mongodb.com/cloud/atlas)
制限あるけど、無料でmongodbが使える
以前mlabだったものだと思われます。ここ一年Node.js + Mongoを使うことが多かったので
RDBじゃなくて良いかなって時は、こちらを利用してます。

UdemyだとNode.js + Mongoのコース多いんでその時活躍してた。

## [myjson](http://myjson.com/)
AndroidやiOSのバックエンドAPIをサクッと作れます。
よくある公開されたAPIを使って表示するお天気アプリとか
作った次に自分が欲しいデータをこれで作ると良いと思います。
CocosCreator でAndroidで Build->Compile でエラーが起きた時に行った対処

#概要
CocosCreatorで実機ビルドする際にiOSはそのまま"Project"->"Build..."で"Platform"をiOSに変更してビルドすれば上手くいくがAndroidではエラーがでたのでハマった部分を記載

#Androidビルド設定
基本的な事だが"Preference"->"Native Develop"で"NDK Root"と"Android SDK Root"を設定する。のはAndroid Studio をインストールしてその時インストールしたSDKとNDKの場所を指定している

#エラー内容
"Error: Compile failed. The log file path"とでてログファイルの場所を見に行くと以下のようなエラーが出た

```native.log
Building mode: release
Using Android Studio project : /Users/{user.name}/proj/private/ccSample/start_project/build/jsb-link/frameworks/runtime-src/proj.android-studio
Building apk...
running: '"/Users/{user.name}/proj/private/ccSample/start_project/build/jsb-link/frameworks/runtime-src/proj.android-studio/gradlew" --parallel --info assembleRelease'

Initialized native services in: /Users/{user.name}/.gradle/native

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '11.0.2'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org
Error running command, return code: 1.
```

gradleまわりが怪しいので一度AndroidStudioでプロジェクトのbuild/jsb-link/frameworks/runtime-src/prj.android-studioを開いたら依存関係を解決してくれるのでその後で再度ビルドすると成功する
Live Shareで、ゲスト同士の表示をしたくない！

###状況
Visual StudioのLive Share機能を使っています。

ホストは読み取り専用でセッションを共有し、多数のゲストが参加している状況を想定しています。

また、ホストのLive Shareのオプションは、以下のように設定しています。

+ 「共同編集」→「読み取り専用ユーザーの表示」は「フォロー中」
+ 「詳細設定」→「ゲスト制限の増加」は「True」
+ 「認証」→「ゲスト承認が必要」は「False」
+ 「認証」→「匿名ゲストの承認」は「同意する」

###問題点
ゲストに、他のゲストのカーソルや選択が見えてしまいます。

ホストなら、ゲストをフォローするかどうかで、見えるかどうかを制御できます。
しかしゲストは、フォローしていない状態でも、他のゲストのカーソルや選択が見えてしまいます。

###HELP‼
ゲストに、他のゲストのカーソルや選択を見せないようにしたいのですが、ゲストを（あるいはホストを）どのように設定していいのかわかりません。

ご存知の方がいらっしゃいましたら、ぜひ、コメントをお願いいたします！
WordPressのユーザーに独自のフィールド項目を追加する方法

#やりたいこと
記事詳細ページ下部に「この記事を書いた人」のユーザー画像を表示したい。
<img width="871" alt="まなびとサイトのキャプチャ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/6a76990c-97f1-d1c9-5803-9f554445c515.png">


# やり方

## 1. 管理画面のユーザー編集画面に画像URLを入れる項目を追加
画像の登録自体は、管理画面のメディア機能があるので、画像URLを入力できるようにする。

functions.phpに以下を追加

```php
function xxxxxx_modify_user_contact_methods( $user_contact ) {

	$user_contact['blog_author_img_url']   = 'この記事を書いた人:画像URL';

	return $user_contact;
}
add_filter( 'user_contactmethods', 'xxxxxx_modify_user_contact_methods' );
```

`blog_author_img_url`は自分で一意なIDをつける。
`この記事を書いた人:画像URL`はユーザー編集のラベル名。

これを行うとユーザー編集に項目が追加される。
<img width="1222" alt="ユーザー編集に項目が追加" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/96c67aba-8f87-7c65-e8bf-d22ed4ae54d5.png">

## 2. 記事詳細ページに画像を表示

登録はできるようになったので、imgタグを表示する記述をsingle.phpに追加。

```php

$author_img_url = get_the_author_meta( 'blog_author_img_url' );
if( !empty( $author_img_url ) ){
	echo '<img src="' . esc_url( $author_img_url ) . '" alt="' . esc_attr( get_the_author_meta( 'display_name' ) ) . '">';
}
```

- `get_the_author_meta()`に、1.で自分で名前をつけた`blog_author_img_url`を指定すると取得できる。
- `if( !empty( $author_img_url ) )`で入力されているかチェック。
- 表示するときに、`esc_url()`で脆弱性対策でエスケープかける。
- 画像のaltは`get_the_author_meta( 'display_name' )`で「ブログ上の表示名」を取得。これも`esc_attr()`でエスケープかける。

# 参考
- [Plugin API/Filter Reference/user contactmethods(英語)](https://codex.wordpress.org/Plugin_API/Filter_Reference/contactmethods)
- [関数リファレンス/esc url](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/esc_url)
- [関数リファレンス/esc attr](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/esc_attr)
- [関数リファレンス/get the author meta](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_the_author_meta)
教育向けドローン

自分向け　備忘録
#必要な機能
- 高度維持機能
- 安定性機能
- SDK

#機材比較
数千円のものは、安定しないので最初は以下の2機がよい
GPSがついていないので実用向けでは無いです

- Ryze Tech Tello<br/>  https://www.ryzerobotics.com/jp/tello
- Parrot Mambo<br/>  https://www.parrot.com/jp/doron/parrot-mambo-fly

https://tri-drone.com/archives/1313 　参考

| 機種 | Ryze Tech　Tello | Parrot Mambo |
|:-:|:-:|:-:|
| 制御 | WiFi | Bluetooth<br/>距離が心配(高出力のBluetoothが日本で購入できるの？） |
| 気圧センサー  |  有り | 　有り  |
| 下向き安定化センサー | ビジョンポジショニングセンサー登載<br/>(マイコン負荷が大きく飛んでいない時に熱暴走しやすい) | 超音波センサー登載  |
| FPVカメラ | 有り | なし(オプション) |

TelloとTello EDUの比較

Tello(通常版)の方が先に2018年3月発売され、
Tello EDUが2018年末に発売されました。

https://drone-aerial-corps.com/2019/02/22/tello-edu/

Telloは本体がAPになるのに対して
Tello EDUは他のAPが利用可能

https://tarosky.co.jp/tarog/4315

たぶん内蔵マイコンが違うのでしょうね？
Myriad 2　と　Myriad X かな
【Ruby on Rails】 view パスの記述 パターン

#viewへの記述方法は3種類

###コントローラー

```:controller
def show
    # productsテーブルから該当するidの作品情報を取得し@productの変数へ代入する処理を書いて下さい
    @product = Product.find(params[:id])
end
```
###ターミナルでパスを調べる
例えば下記のようなパスに飛びたいとします。

```:ターミナル
 new_product_review GET  /products/:product_id/reviews/new(.:format)                                              reviews#new                                         
```
###viewファイルへの記述方法
#####パターン1

```
<a href="/products/<%= @product.id %>/reviews/new">この作品を投稿する</a>
```
#####パターン2

```
<%= link_to 'この作品を投稿する', "/products/#{@product.id}/reviews/new" %>
```
#####パターン3

```:show.html.erb
<%= link_to 'この作品を投稿する', new_product_review_path(@product) %>
```
コントローラーのshowメソッドに変数@productに作品情報が入っているため、@product.idで作品idを取得することができます。

以上Railsでのパスの記述方法についてでした。
Nodeバージョン管理のnを試してみる@mac

docker内でnpm使ってコンパイルしているのだが遅くて、macで行うことにした。

で必要になるのはnodeのバージョン管理。いろいろ調べたところnが良さそうだったので試してみる。

[tj/n: Node version management](https://github.com/tj/n)

homebrewが入っていることが前提

## nのインストール

```bash
~ $ brew install n
==> Downloading https://homebrew.bintray.com/bottles/n-3.0.2.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Pouring n-3.0.2.mojave.bottle.tar.gz
🍺  /usr/local/Cellar/n/3.0.2: 6 files, 30.2KB

~ $ n -V
3.0.2
```

## nodeのインストール

```bash
~ $ n latest

     install : node-v12.1.0
       mkdir : /usr/local/n/versions/node/12.1.0
mkdir: /usr/local/n/versions/node/12.1.0: Permission denied

  Error: sudo required
```

`/usr/local`配下にインストールしようとするが管理者権限なく怒られる。
`/usr/local`にインストールしたくないのでドキュメントに書かれているように`N_PREFIX`を設定

```bash:.bash_profile
# n
export N_PREFIX="$HOME/.n"
export PATH="$PATH:$N_PREFIX/bin"
```

再度、最新版をインストール

```bash
~ $ n latest

     install : node-v12.1.0
       mkdir : /Users/hoge/.n/n/versions/node/12.1.0
       fetch : https://nodejs.org/dist/v12.1.0/node-v12.1.0-darwin-x64.tar.gz
######################################################################## 100.0%
   installed : v12.1.0

~ $ node -v
v12.1.0
```

## 指定のバージョンをインストール

```bash
~ $ n 9.11.1

     install : node-v9.11.1
       mkdir : /Users/hoge/.n/n/versions/node/9.11.1
       fetch : https://nodejs.org/dist/v9.11.1/node-v9.11.1-darwin-x64.tar.gz
######################################################################## 100.0%
   installed : v9.11.1

~ $ node -v
v9.11.1
```

## 切り替え

```bash
~ $ n 12.1.0
~ $ node -v
v12.1.0
```

無事切り替えらられる様になりました。


## 参考

- [Windows における Node.js バージョン管理マネージャの選択（nvm-windows, nodist 等）](https://blog.clock-up.jp/entry/2018/02/10/nodejs-manager-on-windows)
- [Node.js のバージョン管理ツール n を使ってみました](http://var.blog.jp/archives/75607669.html)
- [Node.js 環境構築メモ](https://qiita.com/megane42/items/dcd71c317b0062522068)
プログレアプリGlideappsにchoice機能が追加されたので使ってみました

プログレアプリをGoogleスプレッドシートをベースに簡単に作ることができるGlideappsに、choice機能が追加されましたので使ってみました。

glideappsの用意している解説の動画はこちらです。

https://www.youtube.com/embed/4TrkhiyIA-A

動画で済ますのではなく、ちゃんとしたドキュメントにしてほしいところです。

choiceは、ユーザーにプリセットの項目を選択してもらう機能です。

## 動き

前に作った「技術書同人誌博覧会2019」アプリのサークルリスト画面ににchoiceを追加してみます。
「so?」という選択項目で、"good!"と"bad!"を選べるようにします。

![Screenshot_20190430-123857.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/6a276d38-aa44-f472-d631-ed8c6bc6e3c4.jpeg)

項目を選択すると選択画面が表示されます。

![Screenshot_20190430-123904.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/090b7fc6-41b6-b099-2c93-ee2009f31103.jpeg)

どちらかを選ぶと、サークルリストの「So?」項目に表示されるようになります。

![Screenshot_20190430-123911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/8783ce73-e9b9-eff1-e045-39de2d41baf9.jpeg)

## 作り方

スプレッドシートに選択肢を入れるシート"choice"を作り、カラム名"so?"と選択肢"good!"/"bad!"を入れておきます。

![スクリーンショット 2019-04-30 12.23.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/df220a31-cfb9-e5e5-5e0e-03d482b97e68.png)

これを組み込むスプレッドシート「サークルリスト」に、新しい列を追加します。ここでは「評価」という項目を追加しました。
プリセットの値を入れておくこともできますが、めんどくさいので空白のままで。!

サークルリスト画面に、choiceを追加して、作成したシートとカラム名を指定します。

![スクリーンショット 2019-04-30 12.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513/157d3cb2-a0aa-1a6d-41c0-222308934903.png)

これで終わりです。簡単でした。

## しかし、ユーザーの概念がないので自分メモにしか使えない

サークルリストはユーザー複数での共有されるものですので、choiceのような使い方は利用者に紐付かないので意味はありません。
choiceは、自分用のメモアプリでしか使いみちがない感じです。

これについて、サポートチャットで聞いてみたら、返事をもらえました。

"Yes, well, it depends how you use Glide."

使い方って言われてもねぇ...
Glideで個人専用アプリ作る人もいないような。

Glideは、１つのアプリをたくさんのユーザーで使うということをまったく想定していないようです。残念。

"What kind of app? Your users will expect the Choice to work differently depending on how you use it. If it's a different value for each user, how would you expect this to be represented in your spreadsheet?"

いやぁ、変わらないでしょ...

## 関連ドキュメント
・[流行りのGlideでプログレアプリ(PWA)してみた](https://qiita.com/kinneko/items/548597770d93aa17c6cf)
・[プログレアプリGlideappsにchoice機能が追加されたので使ってみました](https://qiita.com/kinneko/items/99a67faa231226335ba6)
・[Glideappにコメント/チャットのメッセージ追加を通知する機能が付いたので試してみた](https://qiita.com/kinneko/items/654c2a1e6e13d9c9592c)
・[Glideappsでfav機能が評価中なので試してみた(リリースされました)](https://qiita.com/kinneko/items/d4fae3ae26d358b130ba)
・[「5分で作れる！Glideappsではじめる超簡単PWA」セッションで利用する予定のデモ動画とプレゼン資料](https://qiita.com/kinneko/items/2d15a7cb87cb17a483a7)
・[Glideで画像アップロードの機能のテストが開始されました](https://qiita.com/kinneko/items/6831572cf3cf12a4a4e3)
・[Glideのリスト表示で地図と連携表示する機能のテストが開始されました](https://qiita.com/kinneko/items/79e84181ab7c0bcef88d)
・[Glideで画面のリロードをさせるための対策](https://qiita.com/kinneko/items/dec896995aca30b91ec6)
Pepper for Biz 3.0 Robot Suite ~概要編~

#はじめに
[Pepper for Biz 3.0](https://www.softbankrobotics.com/jp/product/biz3/#_ga=2.243209858.1074538764.1556501867-850404903.1513303852)が新たにリリースされました。
その中で、新たな概念としてPepperを遠隔から統合管理できるポータル**Robot Suite**が新規追加されました。
![rbtswt-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/5d93c0ae-14d1-46c7-aba4-cdd35d7d1b8d.jpeg)

Pepper for Biz 3.0ではRobot Suiteの機能が大きく２つに別れています。
<font color="Salmon">ログイン画面が異なるのでご注意ください</font>
それぞれの概念について、ご説明します。
1.[Robot Suite（アプリ配信管理）](https://command-center.softbankrobotics.com/client/index.html#/)
2.[Robot Suite（機体管理）](https://ros.robot.softbank.jp/)

##Robot Suite（アプリ配信管理）
所定のアカウント（新規機体契約時に払い出されるアカウント）にて、ログインすると下記画面が見えるかと思います。
※Pepper for Biz 3.0では各自が作成したSBRアカウントでのCMSでのログインはできませんので
　ご注意ください（例外あり）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/56ae3e6a-7ddc-4566-269b-5db42ef73c31.png)

こちらの機能は、主に下記2種の機能を具備しています。
1.お仕事配信管理
作成したお仕事の閲覧、編集、機体配信を管理
2.アプリ配信管理
購入したロボアプリの配信管理

お仕事作成のおおよその流れは、[PepperのAI会話](https://qiita.com/HiroyukiYasui/items/d080f5cd9589569b61cb)を御覧ください

##Robot Suite（機体管理）
今までは、Pepperが不調の場合再起動する際に現地にて、電源ボタンを押下する必要がありました。
こちらの機能により、現地に不在でも遠隔でPepperの不調状態の可視化および再起動の実施が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/24166fc2-6229-940b-87c8-aac2d7698cad.png)


機体に設定したSBRアカウント（上記のアカウントと同一でなくともよい）でログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/9ebd7e62-ecda-7ec5-fb57-8312c1cf36c9.png)

ログインすると下記画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/f2082cce-bdf4-e8f3-10ab-4daa502e758e.png)

###遠隔管理
遠隔でのPepper再起動、アプリアップデート、再起動が実施できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/3cdc7753-850d-bcc6-f48a-a33dfa1bba72.png)

###ヘルスチェック
遠隔で、機体ごとの不調状態を見ることができます。
また各種エラーに応じておすすめのアクションがレコメンドされるのでそれに応じたアクションを取ることで
エラーが解決されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102312/af188213-140f-0f38-71cd-f51c11ad44b1.png)
パフォーマンスモニタのログにMinGWでアクセスできないとき


パフォーマンスモニタのログが出力されるディレクトリである `C:\PerfLogs` には特殊なアクセス権が設定されています。
普段は意識しなくてもいいのですが、`MinGW` や `Git for Windows` に付属している `bash` を使ったときに戸惑うかもしれません。

エクスプローラーやエディタなどでは普通にアクセスできるのに、`bash` などの 'MinGW' のツールでアクセスすると `Permission denied` と言われることがあります。

```
/c/PerfLogs/Admin $ cd Test/
bash: cd: Test/: Permission denied
```

これは、アクセス権が次のように設定されているのが原因のようです。
<img width="299" alt="acl_directory_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223758/b3fb2151-2649-9d3e-6ba2-a6bb42ea9265.png">

アカウントが管理者の場合（つまり、Windows の利用者の大半は） `Administrators` グループに入っているため、普通はこのディレクトリにもアクセスできます。なのでエクスプローラーやその他の Windows アプリではアクセスできるわけです。

ところが `MinGW` ツール（`bash`）の場合、**自分自身のアカウント**に権限がなければアクセスできないようなのです。

試しに以下のようにアクセス権を付与してみます。
<img width="299" alt="acl_directory_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223758/11e6c782-c06d-86c1-e2b4-3d119f2c9fc7.png">

するとアクセスできるようになりました。

```
/c/PerfLogs/Admin $ cd Test/
/c/PerfLogs/Admin/Test $
```

こういう設定が必要なディレクトリは他に知りませんが、他の場所にもあるかもしれません。

UNIX 系 OS と Windows ではアクセス権の考えが大きく違うので、こういった細かな違いが出るのでしょう。どう動作するのが正しいのかは分かりませんが、**グループではなく自分自身にアクセス権が必要なことがある**というのは覚えておいて損はないような気がします。
リップルアニメーションのメモ


# background

* すべてのView（CardViewを除く）

```xml:layout
<View
    android:background="?android:attr/selectableItemBackground"/>
```

# foreground

* FrameLayout
* CardView（FrameLayoutを継承しているため）
* Android 6.0／APIレベル 23／Marshmallow以上のすべてのView

```xml:layout
<View
    android:foreground="?android:attr/selectableItemBackground"/>
```

# コードで設定

```kotlin:src
val outValue = TypedValue()
getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true)
view.setBackgroundResource(outValue.resourceId)
```

# カスタムのbackgroundにリップルアニメーションをつける

```xml:drawable/ripple.xml
<ripple xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- ここをカスタム -->
    <item android:drawable="@color/colorAccent"/>
</ripple>
```

```xml:layout
<View
    android:background="@drawable/ripple"/>
```
【初心者】VirtuaBoxとVagrantを使って仮想マシンを立ち上げる方法(mac OS) 

プログラミングを始めて１ヶ月も経っていないので、この記事に不備があればどうぞご指摘ください。

#問題点
ドットインストールの[ローカル開発環境の構築 [macOS編]](https://dotinstall.com/lessons/basic_localdev_mac_v2)を参考にして、VirtualBox(6.0.6)とVagrant(2.2.4)をインストールし、仮想マシンを立ち上げようとしたが、エラーが起きてしまう。
<img width="515" alt="スクリーンショット 2019-04-30 12.07.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/92217018-7027-217b-73e4-fe928c6ac7ac.png">
#解決策
https://sazaijiten.work/docker_virtualbox_vagrant/
https://qiita.com/akippa_app/items/d6aef518bff20dc39530
この２つの記事を参考にして、Vagrantfileを自分で編集する。
#まとめ
エラーを解決するのに丸1日かかりました。
ドットインストールの最終更新日が2016年10月20日なので、自分が使っているバージョンより古いものを使って解説しているため、エラーの解決方法が参考になりませんでした。
プログラミングを始めて、丸１日苦戦したのはこれが初めてです。
解決するまでのストレスはすごかったですが、解決したときの気持ち良さがそれを超克しました。
プログラミングの楽しさがより深く感じられたと思います。
UnityでPerceptionNeuronのデータをクリーンに使う方法

#自己紹介
こんにちはゆずです。@Yuzu_Unity


#手っ取り早く…
アセットが公開されているみたいなので、このアセットのインポートを行えば以下の記事は読む必要はありません！！
![image.png](https://assetstorev1-prd-cdn.unity3d.com/key-image/9647e812-85a7-4e0b-ae6b-e7e9e7838638.jpg)
https://assetstore.unity.com/packages/tools/utilities/neuron-fbx-importer-144203
（※筆者はアセットを購入していません…）
無料で行いたい場合のみお願いします。

##なぜデータがおかしな動作をするのか
簡潔に言うとUnityのHumanoidの仕組みによる誤作動です。
UnityのHumanoidアニメーションはHumanoid同士ならアニメーションがリターゲットできるというものになっています。
（初期TポーズからIK・FK等を用いオフセットのパラメータを割当する機能です。）

まずはスケルトンの定義を行います。
この時初期フレーム時のモーションがTポーズとして設定されます。
なのでNeuronのデータの場合、初期フレームにアニメーションが入ってしまいTポーズとして
設定されないといった現象が起こるのです。
これはNeuronに限らずMaya等のツールでも起こります。Mixamo等
Blender上ではクリップを分けられるので便利！！

##解決策
やることは簡単です。
Tポーズの状態の同じボーン構造のデータを用意しそのスケルトン定義をコピーすればよいのです。
以下のデータにTポーズ（回転値0のデータ）の状態のデータを用意してみたのでダウンロードお願いします。
[FBXデータ](https://drive.google.com/uc?id=10aUKdjlIP-tzNUeFDARf1shtsglYCLzM)
ダウンロードしたデータをUnityにインポートしRigの項目のAnimationTypeをHumanoidにしApplyを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308905/1046aa02-bf61-961b-1f77-91a03c133d3c.png)
次にNeuronから書き出したFBXデータを同様にHumanoidにし
AvaterDefinitionをCopyFromOtherAvatarに設定しSourceを先程インポートしたFBXデータのAvatarに設定しApplyを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308905/af6457dd-76da-3d6a-611f-1ca82bdd4a30.png)
これで問題なく動作するようになります。

##その他Tips
初期設定ではアニメーションがリダクション（フレームレートが減少）されてしまいます。
きれいに中割されるわけではないので、ただただカクカクになってしまいます。
なのでここの設定を変更すると、もとのフレームレートで動くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308905/c83dc836-fbf3-5811-0239-7d54315ca8d1.png)
Leetcode #128: Longest Consecutive Sequence

Time Complexity: O(n)
Space Complexity: O(n)

First try failed at the case with duplicates

```swift
func longestConsecutive(_ nums: [Int]) -> Int {
    var dict = [Int: Int]()
    var maxLength = 0
    for num in Set(nums) {
        let before = dict[num-1] ?? 0
        let after = dict[num+1] ?? 0
        dict[num] = 1 + before + after
        dict[num-before] = dict[num]
        dict[num+after] = dict[num]
        maxLength = max(maxLength, dict[num]!)
    }
    return maxLength
}
```
GitHubで誤ってcommitした際の対応方法

GitHubで誤ってコミットした際の対処方法について・・・
状況ごとに整理してみます。

###リモートのpushを一つだけ戻したい場合###

####1. 強制的に削除する方法（git reset)####

内容は変更せずにコミットだけ取り消す方法
```$ git reset --soft HEAD^```

内容を前の状態にし、さらにコミットも削除する方法
```$ git reset --hard HEAD^```

ターミナル上で上記のどちらかを行ったあと、

```$ git push -f origin HEAD^:ブランチ名```
もしくは、
```$ git push -f origin HEAD~1:ブランチ名```

（ちなみにHEADの後の＾を２つ付けると２つ前に戻れる。HEAD~２としても同様）
を行う。

この方法だと誤ったコミット自体がなかった事になります。
メリット：誤ったコミットを削除出来るので履歴が見やすい
デメリット：チーム開発の場合、他の人が同じブランチで作業していた場合だと、コンフリクトがおきたり、エラー発生の原因になりうる可能性があります。

別の方法として、

###リモートのpushを一つだけ戻したい場合(git revert)###

コミットした内容を打ち消すコミットを出来るようにする。
```$ git revert HEAD```

すると間違えた内容のコミットを再度編集出来るようになる。（正確には、もう一度前回のコミットと同じ内容のコミットが出来るようになるので、正しい内容に編集して再コミットする。）

そして、再プッシュ
```$ git push origin master```

この方法は、削除ではなく、前回内容をコミットして上書きする方法です。
メリット：誤った履歴は残るので、チーム開発で同じブランチで作業している人がいても影響がない。削除をしないので、安全にコミットを元に戻せる。
デメリット：誤った履歴が残るので少し見づらくなる。

なので、個人で開発する場合は、**git reset**、チームで開発する場合、**git revert**と使い分けるのが良いと思います。
Gitコマンドの省略形を使えるようにする

# gitのコマンドの長さ
常に打つコマンドだから、短くしたい。

## gitconfigに入れる

```~/.gitconfig
[alias]
        co = checkout
        ci = commit
        st = status -uno --ignore-submodules
        stt = status
        br = branch
        df = diff
        dff = diff --word-diff
        today = log --oneline --since='12 hour ago'
        cancel = reset --soft HEAD^
        gr = log --oneline --graph
```

## bashに入れる

```~/.bash_profile
alias pull='git pull'
alias ggrep='git grep'
alias ci='git ci'
alias push='git push'
alias st='git st'
alias br='git br'
alias df='git df'
alias dff='git dff'
alias stt='git stt'
alias gr='git gr'
alias co='git co'
alias add='git add'
alias show='git show'
alias fetch='git fetch'
alias merge='git merge'
alias log='git log'
alias gr='git gr'
```

## bashを読み込む
```
source ~/.bash_profile
```

これで完了です
vue.jsのtemplateファイルの書き方

vue.jsのテンプレートファイル(`.vue`)について、備忘録的にまとめてみました。
ちょくちょく書き足していきます。

## 基本
```vuejs:SampleTag.vue
<template>
  <div class="sample-tag">
    <h1>{{ title }}</h1>
    <p>{{ msg }}</p>
  </div>
</template>

<script>
export default {
  name: 'SampleTag',
  data () {
    // テンプレート内で保有するデータ
    return {
      title: "Vue Template File"
    }
  },
  props: {
    // 親要素から受け取るプロパティの定義
    msg: String
  },
  computed: {
    // 算出プロパティ(処理結果がキャッシュされ、入力値が変更されたときのみ再計算)
  },
  methods: {
    // メソッド(毎回呼び出す度に処理を実行)
  }
}
</script>

<style scoped>
  p {
    color: red;
  }
</style>

```

```vuejs:App.vue
<template>
  <div id="app">
    <SampleTag :msg="messgae" />
  </div>
</template>

<script>
export default {
  name: 'App',
  data () {
    return {
      massage: "さんぷるてきすと"
    }
  }
}
</script>
```

他のコンポーネントファイルを読込むときは、

### `name`プロパティの定義
ケバブケース(`sample-tag`)とキャメルケース(`SampleTag`)の2つの書き方があります。

## PugとStylusを使って書いてみる
どうやったらできるか、は[この記事](https://qiita.com/ezawa800/items/eef19d1c0dcbe0b4de62)が参考になりました。

```vuejs:SampleTag.vue(pugver)
<template lang="pug">
.sample-tag
  p {{ msg }}
</template>

<script>
</script>

<style scoped lang="stylus">
p
  color red
</style>

```
iOS Google AdMob Mobile SDKのアップデート対応


### Google Mobile Ads SDK をアップデート後、起動時に以下エラーが表示された場合

```
*** Terminating app due to uncaught exception 'GADInvalidInitializationException', reason: 'The Google Mobile Ads SDK was initialized incorrectly. Google AdMob publishers should follow instructions here: https://googlemobileadssdk.page.link/admob-ios-update-plist to include the AppMeasurement framework, set the -ObjC linker flag, and set GADApplicationIdentifier with a valid App ID. Google Ad Manager publishers should follow instructions here: https://googlemobileadssdk.page.link/ad-manager-ios-update-plist'
```

#### 対応： info.plistにApp IDを記述する。
Google Mobile Ads SDK version 7.42.0より必須になったApp IDの記述が無いことに起因する。
* info.plistに以下の様にApp IDを追記する。

``` info.plist
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx</string>
```

### 初期化メソッドの変更
AppDelegate.swiftの `application:DidFinishLaunchingWithOptions:` メソッドで以下の処理がdeprecatedで警告されている。

``` swift
GADMobileAds.configure(withApplicationID: "ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx")
```
この`configure`メソッドで行っているApp IDの設定は先ほどのinfo.plistに記述する方式に変わったので不要。この行は削除する。

また、これに替わり初期化するメソッドが定義されているので、こちらを同じく`application:DidFinishLaunchingWithOptions:` メソッドに記述する。

``` swift
GADMobileAds.sharedInstance().start(completionHandler: nil)
```

## 参考
*AdMobのドキュメントに記載されていました。
[スタートガイド  |  iOS       |  Google Developers](https://developers.google.com/admob/ios/quick-start?hl=ja)
DatadogでWindowsのサービスを監視する

# やりたい事
DatadogでWindowsのサービス（SMTPとか）の死活監視を行う。

# やってみた環境
Windows Server 2016 (AWSのEC2でサーバー用意）
Datadog Agent version 6.10.1

# やってみた手順
- WindowsにDatadogエージェントをインストールします
- タスクマネージャーのサービスタブから死活監視を行いたいサービス名を確認します
<img width="661" alt="スクリーンショット 2019-04-30 11.12.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187070/f1b069c8-7e94-f5d4-8129-61b76a46cc77.png">
- サービス監視を有効化するためにyamlファイルを作成します（デフォルトだと下記内容）

```yamlファイル作成先
C:\ProgramData\Datadog\conf.d\windows_service.d

conf.yaml.exampleをコピーしてconf.yamlを作成すればOK
```

- Datadog Agetn Managerを起動します
- ChecksメニューのManage Checksを選択します（以下画面が表示されます）
<img width="843" alt="スクリーンショット 2019-04-30 11.15.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187070/713b422d-b98d-acaf-184e-d9565db3fc3b.png">

- 確認しておいたサービス名を設定して、Saveボタンで保存します（設定後のイメージは下記）
<img width="849" alt="スクリーンショット 2019-04-30 12.01.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187070/77ff0d28-0341-8dad-cd5f-7843885b971f.png">
- Datadog Agent ManagerからRestart Agentを実行します
- DatadogのコンソールからNew Monitorの作成画面を開きます
- Select a monitor typeでIntegretionを選択し、Windows servicesを選択します
- Pick monitor scopeのところで先程登録したサービス名（今回は service:smtpsvc）が選択できるようになります！

# まとめ
タスクマネージャーのサービスタブに表示される左端の名前で死活監視を行うサービス名が確認できて、あとはDatadog Agent Managerから設定すれば監視設定準備完了です！
Active Directoryもサービス名も自分はADSVCみたいな名前かなぁと勝手に推測してましたが、結構違って（ntds）、へぇ〜ってなりました。

最後まで読んで頂きありがとうございました。　(・ω・)ノシ
Leetcode #129: Sum Root To Leaf Numbers


```swift

func sumNumbers(_ root: TreeNode?) -> Int {
    var totalSum = 0
    helper(root, 0, &totalSum)
    return totalSum
}

func helper(_ node: TreeNode?, _ pathSum: Int, _ totalSum: inout Int) {
    guard let node = node else {
        return
    }
    if node.left == nil && node.right == nil {
        totalSum += (pathSum * 10 + node.val)
        return
    }
    helper(node.left, pathSum * 10 + node.val, &totalSum)
    helper(node.right, pathSum * 10 + node.val, &totalSum)
}
```