OmniAICreator/Qiita-1.07M huggingface dataset:
gRPC の通信を Wireshark でキャプチャする（windows）

gRPC アプリケーションのデバッグを目的とし、Wireshark で通信をキャプチャしてみます。

## 環境 ##

OS : Windows10
gRPC : 1.16.0 (C#)

## 準備 ##

### Npcap のインストール ###

Windows 版の Wireshark 単体では、localhost の通信をキャプチャすることができません。ここでは NpCap を利用します。

[【Npcap】公式サイト](https://nmap.org/npcap/)

* Downloading and Installing Npcap の項からインストーラーをダウンロードします。2018/11/09 時点の最新版は 0.99-r7 です。
* インストーラーを実行します。Instration options ページの `Install Npcap in WinPcap API-compatible Mode` にチェックをつけます。

### Wireshark のインストール ###

[【Wireshark】公式サイトのダウンロードページ](https://www.wireshark.org/download.html)

* インストーラーをダウンロードします。2018/11/07 時点の最新版は 2.6.4 です。
* インストーラーを実行します。Install WinpCap? ページでは Npcap がインストール済であることが表示され、WinPcap のインストールが選択不可になっているはずです。
* Wireshark を起動すると、ネットワークアダプタの一覧にイーサーネットやローカルエリア接続に並んで `Npcap Loopback Adapter `が表示されており、それを選択すると 127.0.0.1 に流れるパケットが表示されます。

## gRPC のキャプチャ ##

下の画像は localhost で通信を行う gRPC アプリケーションを実行したときの結果です。
![grpc.jpg](https://qiita-image-store.s3.amazonaws.com/0/280969/635e4290-c723-d956-cf37-890d84638d8b.jpeg)

### フィルタする ###

アプリケーションが使用しているポートのみを表示するようにフィルタ（背景色が緑のバーの部分）を設定しています。

```
tcp.dstport == 50051 or tcp.srcport == 50051
```

### HTTP2として表示する ###

上の画像では Protocol 列には TCP と表示されています。既定の動作では、gRPC アプリケーションの通信は HTTP2 ではなく TCP と判定されてしまうようです。次の方法で HTTP2 であることを設定します。

 1. リスト上で右クリックメニューを表示し、`Decode As…` を選択します。
 1. 表示されたダイアログで Current 列をクリックし、`(none)` を `HTTP2` に変更します。

すると protocol 列の表示が HTTP2 に変わります。
![grpc2.jpg](https://qiita-image-store.s3.amazonaws.com/0/280969/3019947e-8236-6d1d-c3ae-07fe9f2678db.jpeg)

### SSLを有効にしてみる ###

下の画像は Grpc.Core.SslServerCredentials を使用して SSL を有効にしたときの結果です。protocol 列には TLSv1.2 と表示され、アプリケーションデータが暗号化されていることが分かります。
![grpc3.jpg](https://qiita-image-store.s3.amazonaws.com/0/280969/965e8343-7546-4382-b59c-b940a8c45140.jpeg)
Linux ssh時便利コマンドメモ

サーバーで計算が回っているかチェックする際に便利なコマンドをメモしておく．

#ssh接続
lsのオプションとして，-lt| head -10　が便利．詳細表示された時刻歴順のファイルリストのうち，最初の10個だけを表示してくれる．

```
ssh ogino@computer1    #ssh [クライアント名]@[コンピューター名]
ls -lt | head -10      #-l時刻など詳細表示，-t時刻歴順にソート
```

#sftp接続

```
ls -lt         #sftp接続だと| head -10が使えなかった．
get [file名]   #クライアントマシンの現在のディレクトリにファイルをコピー
put [file名]　 #ホストマシンの現在のディレクトリにファイルをコピー

```
2018年 ムラサメ研究所 Adventカレンダー（いいわけ）

#いいわけをします
Qiitaの機能の確認という名目で AdventCalendarを勢いでつくりました
全部埋まるか　書いている時点では謎（多分無理
だけど　がんばります

記事の内容はほとんど薄いですが Adventお祭りなので許してね
Qiitaなのに　あまりプログラムに関係ないものも書くとおもうけど
お祭りなので許してね！

とりあえず　2018年は UNITY案件がさらに多かったなー　という印象で
もう　UNITY専門家でもいいやってかんじで
ただ　私のところに来るのは　シェーダーや新機能、パフォーマンスチューニングなど
他の人が嫌がる案件がおおいです

あとは　仮想通貨絡みも多いですが、　こっちはもっと頑張らないと！


とりあえず　Adventカレンダー頑張ります
LPC812でISPモードにてプログラムを書く

LPC812はISPモードでflashmagicを使用して書き込みます。
ここで、間違えてはいけないのですがマーキングです。マーキングはLPC812の表面の最後あたりに書いてあるかと思います。
秋月電子のLPC812M101JD20ですが、3行目の最後に「4C」と書いてあります。自分のLPC812も4Cと書いてありました。
http://akizukidenshi.com/catalog/g/gI-13497/
これは表四番目のSO20に該当します。
<img width="340" alt="lpc812isppin.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/313830/9595af54-ebfa-85ad-cd1c-d304314bae88.jpeg">
間違えないようにPIO0_12をグラウンドにすることでISPモードになります。
私はAE-FX231Xを利用しておりまして、PIO_0とPIC_4にそれぞれつなげます。
AE-FX231X（ドライバーはリンク先の「ＦＴＤＩ社ページ（ドライバダウンロード）」先に探すとあります）
http://akizukidenshi.com/catalog/g/gK-06894/

実際のブレッドボードです。
<img width="847" alt="lpc812m-isp.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/313830/e1828e5d-787a-f83e-f17f-257fa641b42c.jpeg">
※黒い線であるPIO_12(3番ピン）は画像では見えにくいですが、グラウンドにつないでください。

FlashMagicですが、このパラメータでも正常にプログラムを投入できました。ほかの方法もあるかとおもいますが、参考に張り付けておきます。
<img width="362" alt="lpc812flshmagic.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/313830/add7a59b-0712-b29e-92b8-9c6ae64b060f.jpeg">
※例はAE-FX231XがCOM4に接続されていると仮定してます。
これでISPモードで書けるかと思います。
Flutter始めてみた

#はじめに
こんにちは、RHEMS技術研究所のりゅうやです。
今回はMacでのFlutterのインストールからアプリの実機実行までの流れを説明していきます。

#本題
##１．Flutterインストールのためのzipファイルをダウンロードします

```
$ mkdir Flutter
$ cd Flutter
$ wget flutter_macos_v0.8.2-beta.zip
$ unzip ~/Ryuya/Flutter/flutter_macos_v0.8.2-beta.zip 
```
上の２行はFlutterのディレクトリを作ってその中で実行すると環境を汚さずできて良いと教えられたのでやっています。
4行目はぼくの場合なのでRyuyaとFlutterは任意のものに変えてください。

##２．Flutter Toolを自分のPATHに通します。

```
$ export PATH=`pwd`/flutter/bin:$PATH
```

##3.Flutterに必要なものを用意します

```
$ flutter doctor
```
これが完了するといろいろ足りないものをFlutterが教えてくれるので従いましょう。

例

```
[-] Android toolchain - develop for Android devices
    • Android SDK at /Users/obiwan/Library/Android/sdk
    ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ
    • Try re-installing or updating your Android SDK,
      visit https://flutter.io/setup/#android-setup for detailed instructions.
```

##4.iosとandroidでの実機実行
まず新しいProjectを作りましょう。

```
$ cd Flutter 
$ flutter create your_app_name
```
アプリ名に大文字は使えないので注意
これでProjectは完成です

iosとAndroidを分けて説明していきます

###ios
```
$ brew update
$ brew install --HEAD libimobiledevice
$ brew install ideviceinstaller ios-deploy cocoapods
$ pod setup
```
brewが入っていない人はインストール　→　http://brew.sh/

ちゃんとこれらの作業が終わっているかどうかは３でもやったflutter doctorを実行して確認しながらすすみましょう。

```
$ open Flutter/your_app_name/ios/Runner.xcworkspace/
```
xcodeが開くはずです。

*Runner*というファイルを開きましょう
*signing*の*Add acount*を押してFlutterを実行したいiPhoneやiPadでサインインしているアカウントを追加しましょう
*identity*の*Bundle name*を変えないとエラーが起こるので任意の名前に変えましょう
変えてもエラーが起こることもあるのですが、出なくなるまで変えます

ここでデバイス側の設定をします
設定　→　一般　→　プロファイルとデバイス管理
画像のようにAdd acountしたときのアカウント名が出てくるので開いて許可します
許可すると検証済みなります
<img width="414" alt="iphone.screenshot_qiita.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/280251/bb1eba03-8953-7add-aa63-dc723150361c.jpeg">
<img width="414" alt="IMG_4915.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/280251/65097336-513d-90c2-2481-07406d5d70b7.jpeg">


ここまで来たらxcodeで実行するか、Flutter runをします


###Android
```
$ open -a Android\ Studio Flutter/your_app_name
```

そしてPCとデバックモードのデバイスを接続して、認証する

右上の実行ボタンで実行

アンドロイドは簡単です


アプリを実機で動かすことができたので、プロジェクト内のlibのmain.dartを書き換えるだけでアプリが作ることができます
Android Studioではiosデバイスも認識してAndroid StudioからiPhoneなどにデバックもできる(xcodeと併用で)

###おまけ
僕は全然Dartが理解できず諦めました。
ですが、[Flutter Studio](https://flutterstudio.app/)というサイトを使うと、UIを作りコードをコピーすることができるのでおすすめです
別々のリポジトリで立てたdocker-composeを同一ネットワークに所属させる方法

# はじめに
ローカル開発環境を作成する際に、ローカル開発環境用のリポジトリを作るのは依存度が高くなってしまうので嫌だった。
なので同一ネットワークに所属させてローカル開発環境はそれぞれのリポジトリに置くようにしてます。
今後、よりよいベスト・プラクティスを見つけようとは思ってますが一応問題なく動いているのでその方法を残します。

# やり方
docker-dompose:  version 3.5

サンプルは`networks`以外はどうでもよかったので適当です
## ネットワークを作成する

```bash:backend/docker-compose.yml
version: '3.5'
services:
  app1:
    image: alpine:3.4
    ports:
      - 50000:50000
    networks:
      - mynet #←serviceのapp1を作成したnetworkに所属させる
    command: top
networks:
  mynet: #←自分の好きなネットワーク名
    name: mynet #←自分の好きなネットワーク名
```

上記のファイルの`networks`にnameのみ定義しておくと自分で命名して新規ネットワークを作成できます

```
$ cd backend
$ docker-compose up -d
$ docker network ls
# ※結果からbridge host noneは抜いてます              
NETWORK ID          NAME                DRIVER              SCOPE
26350ce7ba23        mynet               bridge              local
```

## 既に存在しているネットワークに所属させる
`networks`に先程作成したネットワークを宣言します
違いは`external: true`のみでこれがあると既に存在しているネットワークへの参照をとれます

```bash:frontend/docker-compose.yml
version: '3.5'
services:
  app2:
    image: alpine:3.4
    ports:
      - 50001:50001
    networks:
      - mynet
    command: top
networks:
  mynet:
    external: true
    name: mynet
```


```bash

$ cd ../frontend
$ docker-compose up -d
```


# ネットワーク確認
`docker network inspect`を見てみると同じネットワークに所属していることがわかります

```bash
$ docker network inspect 26350ce7ba23
# ※Containers抜粋
"Containers": {
            "34223f932ee2d1e21b78da2168d7ddceca457eef5f33dc943beeff891dc7a276": {
                "Name": "backend_app1_1",
                "EndpointID": "ae124e9bb5d3691c51c60520d3ffbd236be9946d2b1574b8bd06e192eebb2599",
                "MacAddress": "02:42:ac:1e:00:02",
                "IPv4Address": "172.30.0.2/16",
                "IPv6Address": ""
            },
            "73fb6f4969a25640c526938b50d0d95e5b3bcf1eeefe99898669b11db4e66df4": {
                "Name": "frontend_app2_1",
                "EndpointID": "d6996a0ab64d429f081ea3144a38ba6122022348f87951dd3b862e66bcf6a31a",
                "MacAddress": "02:42:ac:1e:00:03",
                "IPv4Address": "172.30.0.3/16",
                "IPv6Address": ""
            }
        },

```
Nextcloud のShare by mail 機能

#はじめに
Nextcloudのファイル共有機能として、[URLリンク共有](https://qiita.com/mmisu/items/2b646b39f97ebb74a8f8)があります。Nextcloudのアカウントを持っていない人と共有する手段ですが、URLを発行して、そのURLをコピーしてメールとかに貼り付けて・・・といった手順が必要です。今回はもっと便利なShare by mail 機能について紹介したいと思います。

#プラグイン
Share by mail というプラグインを有効にします。
![画像61.png](https://qiita-image-store.s3.amazonaws.com/0/308127/93a457d0-4360-c850-b4c9-20815e805010.png)

#使い方
まず、Nextcloudサーバからメールが送信できるようにしておく必要があります。管理者画面でメールサーバの設定項目がありますので、メールが送信できるようにしておきます。
![画像62.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b8f2c939-64e9-8758-f412-8a7476a0b02c.png)
フォルダやファイルに表示してある共有アイコンをクリックし、共有設定画面を表示します。ユーザ名やグループ名を入力する欄に、送信したい人のメールアドレスを入力すると、xxxx＠xxxxxxxx（メール）というリストが出てきますので、選択します。（補足ですが、xxxx＠xxxxxxx（リモート）を選択すると、[Nextcloudサーバ間の共有](https://qiita.com/mmisu/items/bb5a2118ae2b1e936adc)になります。）
![画像75.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c895f994-3a07-ded4-8044-68ec9e6f285b.png)
ユーザ・グループ間の共有設定箇所で設定をしましたが、実際はURLリンク共有となっています。共有した相手のメールアドレスが表示されますので、有効期限などを設定する事もできます。
![画像70.png](https://qiita-image-store.s3.amazonaws.com/0/308127/5c4acb13-017c-0837-0dd6-3da73a9206cb.png)
送信したメールアドレスには2通のメールが届きます。
![画像71.png](https://qiita-image-store.s3.amazonaws.com/0/308127/f98f2852-3e1b-10e6-8041-7ab902fad93a.png)
一つは、URLリンク共有がされた旨の通知メール。
![画像72.png](https://qiita-image-store.s3.amazonaws.com/0/308127/fdb99d5f-2f11-6211-e55a-ed750736c089.png)
もう一つは、パスワードのメールです。（パスワードは、パスワードポリシーの条件通りに自動発行されるようです。）
![画像73.png](https://qiita-image-store.s3.amazonaws.com/0/308127/6bd14d5d-49be-4898-c2e6-8b116b4b2518.png)
URLにアクセスすると、パスワード入力画面が表示されるので、パスワードを入力後、アクセスが可能です。
![画像74.png](https://qiita-image-store.s3.amazonaws.com/0/308127/51f936f9-eb7c-fd5e-72e6-4094fa86edb4.png)

#まとめ
1人ずつしか設定できないので、複数人にURLを伝えたい場合は、通常のURLリンク共有の方が良いかも。また、Nextcloudの標準のメールテンプレートで送信するので、文面を変えたいという方は、メールテンプレートのカスタマイズが必要です。それと、通常のURLリンク共有の場合は、管理者が設定した有効期限が反映されますが、Share by mail 機能だと、有効期限が設定されないので、ユーザ自身が設定する必要があります。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
毎月新しいことをする（KPT）

私は　2年ほど前から毎月1個 新しい挑戦をしている
たいていは失敗するのだけど・・

#今のKPT
今は Golangの勉強を課題にしている
業務外でGolangを使っている
具体的には
https://github.com/YukiMiyatake/chaps
Chat-Ops用の SlackBOTのOSS開発を行っている

コードはGo完全に初心者なので・・・
![rikai.jpg](https://qiita-image-store.s3.amazonaws.com/0/13916/c8c9d5c1-820f-bdef-b4f6-9aa5de02499d.jpeg)

を目指して、今はざーーっとコード書いていき、しばらくしたらリファクタリングします

#過去のKPT
過去にはいろいろな挑戦をしました
FPSという今までプレイしたことないジャンルのゲームをプレイするだったり
ドラクエ1（FC版）を実況クリアするというお題
HHKキーボードを使うという課題
SIMカードを使わず 公衆無線LANのみで生活
海外旅行中に仕事する
現金を一切使わない（クレジットカードや電子マネーのみ）
エディタはvimを使う
Githubの草を毎日埋める
夜1時には寝て毎朝8時には起きる
・・・

ほとんどが　取り入れられる事はなかったけど
色々な勉強になった

#KPTにたいするKPT
##Keep
まだしばらく続ける

##Problem
履歴が残ってないので履歴をのこす
まわりに公言してないのでモチベーションが無い
アウトプットがない
1ヶ月という期間は多いものもある


##Try
良いツールがないので　とりあえずTrelloで公開することにした
アウトプットはどこが良いか難しいが プログラム系ならQiita　それいがいははてなブログとか？
1ヶ月は長いので 課題しだいでは1週間とか期限を切ろうとおもう

##今後のTryしたい事
iPadProで Windowsマルチモニタ＆液タブ計画
Slackアイコン作成計画
圏論などの理論勉強
必要あればKPTサービス作成
ダンスラッシュ
ドラクエ2 クリア
ゲーム実況


#Trello
かりに作ってみたが　TrelloはKPTに向いているとは思わないので良いツールあればうつる

https://trello.com/b/BRySO88k/kpt
Instant Preview下でXRNodeの情報が反映されない（Daydream）

## 環境
- Unity 2017.4.3f1
- Mirage Solo（Daydream）用のアプリ開発
- Instant Preview ver1.1.1にて確認

## 症状
- HMDの位置や回転情報が取得できない。
    - InputTracking.GetLocalRotation(XRNode.CenterEye)
    - InputTracking.GetLocalRotation(XRNode.Head)  

- Debug.Logで取得した値を吐かせてみると(0.0, 0.0, 0.0)しか返ってこない。
- エラーは吐いてない。
- カメラもHMDに追従している。

## 解決法
コンソールに
```
Virtual Reality SDK Daydream is not supported in Editor Play Mode. Please Build and run on a supported target device.
Will attempt to enable None instead.
```
とあったのでもしやとは思ったのだけれど、**ビルドしたら普通に動いた。**
**Instant Preview状況下では反映されないようです。**  
Instant Preview下でもカメラ側にHMDの動きが反映されるので惑わされますが、XRNodeを使ってHMDから能動的に情報を取ってこようとすると、ビルドしないとダメみたい ¯\_(ツ)_/¯

## もっといい解決法（※18/12/6追記）
いちいちビルドしていると非常に不便なのでInstant Previewで確認がしたい。
Instant Preview下であってもmainCameraはHMDの動きに追従するので、カメラの情報を引っ張ってこればInstant Pewview下でもHMDの情報を取ってくることができる。  

Vector3 angle = InputTracking.GetLocalRotation(XRNode.CenterEye).eulerAngles;
↓
Vector3 angle = mainCamera.transform.localEulerAngles;

というイメージ。
cssで特定の要素以外を非表示にする


## 概要

以下のようなHTMLで

```html
<div class="main">
  <div class="deactive1">あ</div>
  <div class="deactive2">い</div>
  <div class="deactive3">う</div>
  <div class="deactive4">え</div>
  <div class="deactive5">お</div>
  <!-- 上の全ての要素を非表示にしたい -->
  <div id="app">
    vueとかで作ったアプリケーション
  </div>
</div>
```

.main内の#app以外の要素を非表示にしたいが、classもidもめちゃめちゃでセレクターで指定できない時があります。

そこで、not擬似クラスを使用して#app以外の要素に`display: none`を適用するcssを書いてみます

- [:not() - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/:not)



## 実装

```css
.main>*:not(#app) {
    display: none;
}
```

これで以下のような感じになるはずです！:relaxed:

<img width="923" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/137148/fa6e8ea9-a034-c262-c762-039c399fbe28.png">




## まとめ

意外にググっても出てこなかったのでまとめてみました。

SSIなどでHTMLがサーバーで自動挿入されるような場面で使えるのではないでしょうか？(実際に僕はそうでした:thinking:)
[Python] Numpyで多次元配列のargmaxをとりたい

## 使い方
PythonでNumpyを使っている時，多次元配列に対して`argmax`や`argmin`を使いたい時があります．
例えば，

$$
\begin{bmatrix}
11 & 22 & 33 \\\ 
77 & 88 & 99 \\\
44 & 55 & 66
\end{bmatrix}
$$

であったら，99が位置している `(1, 2)` が欲しいということですね．
そんな時は，`numpy.unravel_index`を使えば１行で取得することができるようです．

```python
np.unravel_index(np.argmax(array), array.shape)
>> (1, 2)
```

こんなかんじ．

以下全体．

```python
import numpy as np
array = np.array([
    [11, 22, 33],
    [77, 88, 99],
    [44, 55, 66]]
)

np.unravel_index(np.argmax(array), array.shape)
>> (1, 2)
```

<br>
## 解説

簡単に解説すると，`np.argmax(array)`は，`array`を１次元配列と解釈したときの最大値があるインデックスを返却します．今回であれば99は6つ目なので，`5`が返ってきます．ちなみに，`shape`は`(3, 3)`ですね．

```python
np.argmax(array)
>> 5

array.shape
>> (3, 3)
```

つぎに`numpy.unravel_index(indices, dims)`の挙動ですが，ここで`indeces`は前から数えた時の数を表す整数で，`dims`は次元を表すタプルです．
要するに，`dims`を次元としてもつ行列で，前から数えて`indeces`番目のインデックスを「多次元で」返してくれます．

99は前から５番目なので`indeces`は`5`，行列は$3\times3$ですので`dims`は`(3, 3)`ですね．
日本語でいうと，

 **$3\times3$の行列において，頭から5番目の要素のインデックスはいくつですか？**

ということです．

```python
np.unravel_index(5, (3, 3))
>> (1, 2)
```

はい，`(1, 2)` ですね！

<br>
> 公式リファレンンス
> [numpy.unravel_index](https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.unravel_index.html)
ChatWork から Slackへの移行を提案　アドバイスするための論拠と方法

#前提
私は[このような方針](https://docs.google.com/document/d/19UEv1Hc0yZ6EpsDh-vL1Gj4jWTAlV7F-mfrJSPmKVBs/edit?usp=sharing)に基づき社内のコミニュケーションをリードしていっています。そのための機能比較です。
これはスラックをITスキルがかなり低い人(エクセルの関数を使えない)に対して導入することを念頭に書いております。
チャットワークとスラックの機能比較をして、チャットワークからスラックへ移行したほうがいいと勧める資料はQiitaに存在しなかったので、ここに書きます。

#Slackのほうが良い点
主に公開性を高めることによるメリットという観点から説明する。
##チャットルームへの招待の簡単さ
スラックは、チャットルームを作る前に@をつけて、対象者や発言し、そこに入れる招待ダイアログをクリックすることで招待することができる。
ChatWorkの場合は、チャットルームに招待し招待された人が承認してから、その人に対してメンションを飛ばすことができるようになる。
したがって、新しくチャットルームを作りたいと思った人が新しいチャットルームを作って招待した人に対して名称を送ることを完了するまでの時間が、新しくチャットルームを作りたいと思った人の行動にのみ左右されるスラックと、そうでは無いChatWorkの違いがある。

この違いが存在すると、チャットルームで公開して行える会話であっても非公開で行ってしまう可能性について違いが出てくる。チャットルームを作成し、招待した人に対してメンションを送る事が完了するまでの時間が短いと、気軽にチャットルームを新しく作りやすくなる。したがって、非公開状態でのメッセージの送信を既存のチャンネルへのメッセージ送信による通知を不必要な人間に対して送りたくないという理由で、個別チャットで送ってしまうという現象を避けることができる。
情報が公開された方が良いと認識しているマネージャーにとっては、公開チャットで行うための障害が少ない方が良い。

##ワークスペース
ワークスペースと言う考え方があるので、ワークスペースのオーナーは全てのチャンネルを把握することができる。
チャットワークであると、自分が加入していないチャットルームの存在を他人に知らせてもらわずに検索して知ることができない。したがって、全体を管理する管理者がすべてのチャットルームの存在を知っていることを保証できない。

チャットルームに対して自由に出入りができない。自由に出入りができないと、 チャットルームのメンバー全員に不必要にメンションを飛ばす人間がいた時に、一旦退室しておいて後から必要な時に見に行くためには、チャットルームの管理者が承認しないといけない。

##通知
モバイル端末のプッシュ通知にメッセージ本文が表示されるのはスラックだけです。

##チャットワークのほうが良い点
###会話の1メンションからタスクを作成することができる。
私が、移行につまずいたのはこれです。しかし、タスクを個人ごとに管理していると、タスクの進捗状況を全員で管理し忘れていることをお互いにリマインドし合うということができないので、それができるタスク管理ツールを別に用意して使ったほうが良いと判断しました。（自分はカンバンツールを導入しております）
全体でリマインドし合うことがないのであれば、チャットワークのこの機能は非常に便利なため、移行が難しいでしょう。
 スラックにも、[/remind](https://qiita.com/takesato/items/335061d7945ebd5c23f7)とタイプすることで、タスクを追加する機能がありますが、非エンジニアにとってはこのコマンドを覚えるのが大変なために、移行するのが難しいと反論されることがあります。そのためにも、個人ごとにタスクを管理すると忘れやすいと言う理由を挙げて、他のタスク管理ツールとスラックの連携機能でカバーするようにしたいです。

###コラボレーション
スラックは有料プランでないと、外部の人が社内のパブリックなチャンネルをすべて見られるようになってしまいます。しかし、協力者に対しても、情報開示をするという点で、このほうが良い場合もあるでしょう。
また、チャットワークでは、チャンネルごとにワークスペースを持っているのと同じなので、無料プランでも、外部の人と連携しやすいです。
時々しか関わらない外部の人が居て、その人の支払の管理までやっていられないという場合は、チャットワークでも良いのかもしれません。しかし、チャットワークで無料で加入できるチャンネル数に制限がついてからは、このメリットはかなり減りました。

##料金について
Slackはチャットワークよりも有料プランの一人当たりの料金が高いですが、チャットワークはチャンネル数に応じて、どのような使い方であっても課金しなければいけないのに対して、スラックは外部アプリとの連携数さえ少なければ、課金をしなくても実際の業務で使っていけます。
Slackは課金しないと、過去の履歴を検索ができなくなってしまいますが、それはかえって必要な情報をドキュメントにまとめる習慣をつけることにもなります。チャットワークだとどんなに古い履歴であっても検索することができますので、チャットを見ればわかるからドキュメントにまとめないと言う悪い習慣が治りません。

#結論
以上のような理由から Slackを推奨します。
いろいろなライブラリが接続する先として、Slackが標準になっているので、そちらにしていただいたほうがとてもありがたいです。
ES6 の関数の書き方

# はじめに
前に書いた記事の続きです。初見の時に、意味がわからなかった無名関数の書き方をまとめます。

[ES6の書き方](https://qiita.com/WooNoo/items/2486e45c355a4b0dc234)

## 関数
次の関数は `a, b` の二つの引数を受け取り、足し算して返す `add` という名前がついた関数です。

```javascript
const add = (a, b) => {
  return a + b;
}
```

しかし、いちいち名前をつける必要がないときは無名関数と呼ばれる、次の書き方があります。`addEventListener` の引数などコールバック関数を定義する時によく使われます。

```
obj.addEventListener('click', event => {
  console.log(event);
}
```

ここまでは理解できたのですが、次のような関数定義を見た時にすぐには理解できなかったです。

```javascript
(callback => {
  if(callback !== 'undifined') {
    callback();
  }
})(argument => {
  console.log(argument);
})
```

この関数は二つの部分から成り、見やすくすると次のようになります。

```javascript
const func = callback => {
  if(callback !== 'undifined') {
    callback();
  }
}

const callback = argument => {
  console.log(argument);
})

func(callback);
```

最初の関数定義が、一つの関数を引数に受け取る関数を宣言して

```
(callback => {
  if(callback !== 'undifined') {
    callback();
  }
})
```

そして、 `callback` に渡される関数が後半の関数定義になります。

```
(argument => {
  console.log(argument);
})
```
プルリクエストをチェックアウトするには hub pr checkout が便利

OSSのメンテナをやっていると、プルリクエストをマージする前に手元でテストしたり修正するためにチェックアウトしたいことは多いでしょう。

"Git プルリクエスト チェックアウト" で検索するとそのための bash や git の alias がいくつか見つかります。

しかし、 Github 純正のコマンドラインクライアント hub を使うと、よくあるエイリアスよりも楽になります。
プルリクエストの作者が編集を許可している（diff画面で鉛筆アイコンを使える）場合、 `git push` で修正を直接 push できるのです。

試しにこのプルリクエストをチェックアウトしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1969/a05836f1-1481-7750-f305-cba6731d9c1e.png)

鉛筆アイコンが有効なので、このプルリクエストは修正を許可していることがわかります。 `hub pr checkout` でチェックアウトしてみます。

```shell-session
$ hub pr checkout 10419
remote: Enumerating objects: 71, done.
remote: Counting objects: 100% (71/71), done.
remote: Total 98 (delta 70), reused 70 (delta 70), pack-reused 27
Unpacking objects: 100% (98/98), done.
From https://github.com/python/cpython
 * [new ref]               refs/pull/10419/head -> issue-30064
Switched to branch 'issue-30064'

$ git config --local --list
core.repositoryformatversion=0
...
branch.issue-30064.remote=git@github.com:asvetlov/cpython.git
branch.issue-30064.merge=refs/heads/issue-30064
```

よくあるエイリアスと違い、ブランチ名がプルリクエスト元のブランチ名になっています。 (このブランチ名が嫌な場合は第二引数にブランチ名を指定できます)

そして、このブランチの remote が自動的に設定されているのがわかります。 `hub pr checkout` コマンドを使うようになるまでは `git push git@github.com:asvetlov/cpython.git` のようにしていたのですが、 この設定のおかげで普通に `git push` できるようになりました。

なお、このブランチの設定は `git branch -D issue-30064` したら消えるので、ローカルブランチを常に掃除しているマメな人は、設定にゴミが溜まる心配をする必要もありません。
AWS Cloud9でWordpressを使ってみる~本編~ 4(日本語版Wordpressをインストールする)

今回は、いよいよwordpressをいれていきます！

最初、
国際版をインストールしてしまって「ほぁ？！」てなってしまったので、同じ思いをさせぬように書いていきます・・・はい。
ほぼ操作はコマンドを打ち込むだけ！なので、楽ちんな内容です。

## 前提条件
■ AWSのアカウントをつくった
■ AWS Cloud9の画面で環境を作った
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/986a9343-a518-edd9-0475-e75660fd9971.png) [作り方はこちら！](https://qiita.com/iwashito_230/items/119c1df0712804eed147)

## ここでの大まかな流れ
- reade.meの削除
- 公式HP(日本語版！！！)からリンクをコピーする
- 日本語版のwordpress(.tar.gz形式)のインストール
- 解凍する
- いらんくなった.tar.gzを削除

以上　5点。

## どこでやるの?
※ 操作はAWS Cloud9の下部にある**ターミナル(bash- “ip-XXX”)**でやていきます。
#### ここ↓
![tarminaru-ichi.png](https://qiita-image-store.s3.amazonaws.com/0/304122/d7c77e9e-f9a4-cc82-0648-02f6a68dc1d7.png)

※ 操作を始める場所は、自分のいまつくってる環境の位置
<font color="MediumSeaGreen">**(ec2-user**</font>**:<font color="DodgerBlue">~/environment)**</font>のままで始めること

心配な人は`$ pwd`で位置を確認
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/5d930266-009c-4967-e66e-c9e4b7d54eaf.png)  ` /home/ec2-user/environment`ってでればおｋ!

## reade.meの削除
`$ rm README.md `

コマンドで削除したらファイル消します。
環境つくると毎回、上のエディターに大きく<font color="DeepPink">AWS cloud9 WELCOM～～!!</font>てでてくるやつですね。
エディターのほうは右端の×押して閉じます。

## 公式HPから.tar.gzのリンクをコピーする
https://ja.wordpress.org/download/ を開きます。

すると、` [wordpress-4.9.8をダウンロード]` のボタンの**下**に`[.tar.gz をダウンロード]`と書いてあります。

ここのリンクをいただきます！

####  いただき方
1.リンクの上で<font color="MediumVioletRed">**右**</font>クリック
2.`[リンクのアドレスをコピー]`をぽちー
で、OK!

## 日本語版のwordpress(.tar.gz形式)のインストール
ターミナルに戻ります。
` $ wget  コピーしたアドレス(Ctrl+V)`でダウンロードします。

（作者のときだと以下↓）
`$ wget  https://ja.wordpress.org/wordpress-4.9.8-ja.tar.gz `
## 解凍する
` $ tar -xzf ファイル名`
<font color="DeepSkyBlue">wordpressフォルダができた</font>らおｋ！

（作者のときだと以下↓）
` $ tar -xzf wordpress-4.9.8-ja.tar.gz`

## いらんくなった.tar.gzを削除
`$ rm .tar.gz形式のファイル`

（作者のときだと以下↓）
`$ rm wordpress-4.9.8-ja.tar.gz` 

です。
はい、今回はこれで終わりです、お疲れ様でした。
次はこれ
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/9bc5471a-033f-6d9d-4dcd-ef4b90309d5b.png) [AWS Cloud9でWordpressを使ってみる~本編~ 5(設定ファイルの変更、追加)](https://qiita.com/iwashito_230/items/168bb3e04c87c9607603)
「今後必要になるマスター言語」をPersonality Insightsに分析させてみた

先日Qiitaを賑わせていた「今後必要になるマスター言語」が気になったのでPersonality Insightsに食わせてみました。

#背景
同年代のエンジニアなので若干のひいき目で見ようと思ったが、コメント欄の意味不明な発言や人間性を疑問視してしまうような発言も多々あったので、この人物がどのような性格なのか興味が沸いてきた。

#下準備
既にQiitaからはユーザ自身がサスペンドされているので、記事を直接見ることはできないのでweb.archive.orgから原文のみを拝借。

https://web.archive.org/web/*/http://qiita.com//administrator1974/items/387aab2a42bf57e3b215

#調理
WatosonさんのPersonality Insightsに怪文書を放り込む。

[Personality Insights](https://www.ibm.com/watson/jp-ja/developercloud/personality-insights.html)

ここの「デモを試す」から「性格分析 Personality Insights を試してみる」を選択。
表示されたページの「テキスト入力」「任意のテキスト」に本文を貼り付けて「分析」。


#分析結果
【性格特性】
1056 分析された単語: 確度が低い解析結果


Watosonさんでもこの文章だけでは判断に迷ったようです。
通常はこれくらいの単語数があれば精度の高い分析ができると思うのですがさすが怪文書。以下に分析結果の総評を張り付けておきます。
コメント欄の発言も貼り付ければ、もっと精度は上がると思われる。

```
結果
表現に富むタイプであり、熱くなりやすいタイプであり、また独特なタイプです.
哲学的なタイプです: 新しいアイディアに興味をそそられ、進んで受け入れ、探求することを好みます. 
冒険的なタイプです: 新しい経験をすることを熱望しています. 
また、自己主張が強いタイプです: 遠慮なく発言し、その場をリードする傾向があります。また、集団を統率できます.
現代性につながる体験を好みます.

生活を楽しむことと伝統の両方にあまりこだわりません. 
単なる個人の楽しみよりも大きな目標を伴う行動を優先します. また人が通った道よりもわが道を行くことを大切にします.

下記のような傾向がありそうです______
・自動車を買うときは維持費用を重視する
・歴史映画を好む
・社会貢献のためにボランティア活動をする

下記の傾向は低そうです______
・商品を購入するときは家族の影響を受ける
・商品を購入するときは商品の実用性を重視する
・ドラマ映画を好む
```


ざっくりまとめると「独特のタイプで冒険好き、自己主張は強くその場をリードすることができる。人が通った道よりも我が道を行く」タイプのようです。我が道を進んでいるのだから、周囲とズレていてもあまり気にしない人なのかもしれない。


#総評
Watosonでは文脈や語彙量、普通体 or 丁寧体、感嘆詞の有無などで分析をしていると思われますが、文章の中身が正しいかどうか判断することも重要ではないかと感じたので記事にしてみました。
Rails server (development)は3000番portをLISTENする

# はじめに
Ruby on Rails 初学者向けの情報をざっくりベースで書いています。

# 使用port番号
ruby on rails の developmentは3000番portを使用しています。
([こちら](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)のポート番号3000番参照)

したがって、「`rails server`」コマンドを実行するとPCの3000番portがLISTEN状態になります。
LISTENについては[こちら](https://www.wdic.org/w/WDIC/LISTEN)を参照。

# LISTEN　portの確認
ターミナルで「`netstat -tan | grep LISTEN`」を入力すると現在LISTEN状態のport一覧が出力されます。
`rails server`を実行してから上記コマンドを入力すると、下記のような情報が追加されると思います。

```
$ netstat -tan | grep LISTEN
tcp4       0      0  *.3000                 *.*                    LISTEN 
```

「rails serverを実行したのにも関わらずlocal:3000にアクセスできない」といった場合、
まずは3000portが正常にLISTEN状態になっているかの確認として使えると思います。
ASP.NET でスクリプト単位でタイムアウト設定（executionTimeout）を変更する

## 簡単に言うと

サブディレクトリを切ってその中に対象のスクリプトと Web.config を入れます。

```bat
app_root
|   Web.config
|   
\---slow_scripts
        Web.config
```

## ASP.NET では動的にタイムアウト値を変更できない

PHP には set_time_limit() という関数があります。スクリプト単位で簡単にタイムアウト値を変更できますが、ASP.NET では Web.config でアプリケーション全体で１つの設定という感じになっています。

## サブディレクトリで設定を変える

ただしサブディレクトリを作り、その中に Web.config を入れれば、アプリケーション全体の設定の一部を上書きすることができます。その上書きされた設定はサブディレクトリ配下全体に適用されます。

これを利用することで、アプリケーション全体の設定はそのままに、特定のスクリプト（Web フォーム）だけタイムアウト値を変更することが出来ます。

```xml:Web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
      <httpRuntime
        executionTimeout="300"
      />
    </system.web>
</configuration>
```

手間はかかりますが、スクリプトごとにサブディレクトリを作ればスクリプトごとに値を調整することもできます。
Excel 表を reStructuredText の表に変換するアドイン

## はじめに

Excel から Markdown にするものはいくつかありますが、reStructuredText にするものが見当たらなかったので作りました。

## アドイン

[アドインをダウンロード](https://drive.google.com/uc?id=1KxBEXTNvxWglC5SItuHnKeHNXQRUqabv)

追記：環境によってダウンロードできないので [Github](https://github.com/TachyPochy/convRst_withContextMenu) に置きました。

[ブロックの解除](https://ygkb.jp/2191#i-3) をしてから起動してください。

Mac と Windows 両対応です。

### 操作イメージ

ワークシートから表にしたい領域を選択し、右クリックすると `reStructuredText` メニュー項目があります。サブメニューから対象のタイプを選択してください。reStructuredText のコードがクリップボードに格納されます。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/37554/2bfbd221-5864-4621-e799-10ef7e6a0678.jpeg)

### 結果テキスト

```bat
+----+--------+-------------------------+
| No | Fruits | 備考                    |
+====+========+=========================+
| 1  | Apple  | この列の幅は "6" です。 |
+----+--------+-------------------------+
| 2  | Banana |                         |
+----+--------+-------------------------+
| 3  | Citrus |                         |
+----+--------+-------------------------+


== ====== =======================
No Fruits 備考                   
== ====== =======================
1  Apple  この列の幅は "6" です。
2  Banana                        
3  Citrus                        
== ====== =======================


.. list-table::
    :header-rows: 1
    :widths: 1 ,2 ,6

    * - No
      - Fruits
      - 備考
    * - 1
      - Apple
      - この列の幅は "6" です。
    * - 2
      - Banana
      - 
    * - 3
      - Citrus
      - 


.. csv-table::
    :header: No ,Fruits ,備考
    :widths: 1 ,2 ,6

    1 ,Apple ,この列の幅は "6" です。
    2 ,Banana ,
    3 ,Citrus ,


```

### レンダリング結果

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/37554/6b5aa3e2-35ed-1c08-5396-b92a6f320ec4.jpeg)

### キーワード
Excel 表 rst 変換 アドイン マクロ
SwiftでKotlinのスコープ関数を作ってみた

## スコープ関数
スコープ関数とは、関数を引数に取ることで、関数のスコープを変えることができる関数です。
Kotlinの標準ライブラリにある `apply` `let` `run` `with` `also` が当てはまります。
これを使うことで、１つのオブジェクトに対してたくさんの処理をしたいときに簡潔に記述できるようになります。
スコープ関数の使い方については以下の記事を参考にしてください。

[Kotlin スコープ関数 用途まとめ](https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%84%E3%81%86%E5%90%8D%E7%A7%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

## Swiftにはスコープ関数はない
今までKotlinをやってきて、今まさにSwiftをやっているのですが、Kotlinの `let` `also` を使えなくて、不便だと感じることがありました。
なので、SwiftのClosureを使って、`let` `also`と使えるようにしました。

## ソースコード

```swift
import Foundation

// ------------------ let ------------------ 
protocol LetProtocol {}

extension LetProtocol {
    func `let`(_ closure: (Self) -> Void) {
        closure(self)
    }
}

extension NSObject: LetProtocol {}

// ------------------ also ------------------ 
protocol AlsoProtocol {}

extension AlsoProtocol {
    func also(_ closure: (Self) -> Void) -> Self {
        closure(self)
        return self
    }
}

extension NSObject: ApplyProtocol {}
```

`let` は、自身を引数として受け取った関数を実行します。
Kotlinの `let` と若干違う点は、Kotlinのほうでは関数を実行後に任意の型を返しており、返り値を設定してない場合は返り値がUnitが返っている点です。

`also` は、自身を引数として受け取った関数を実行しているところまでは `let`と同じで、異なるところは自身を返しているところです。

## letの使用例
UserDefaultsに値を保存するとき

```swift
// ------------------ Before ------------------ 
UserDefaults.standard.set("aaaaaaa", forKey: "key1")
UserDefaults.standard.set("bbbbbbb", forKey: "key2")

// ------------------ After ------------------ 
UserDefaults.standard.let { it in
    // UserDefaultsのスコープ
    it.set("aaaaaa", forKey: "key1")
    it.set("bbbbbb", forKey: "key2")
}
```

## alsoの使用例

コードでUILabelを作るとき

```swift
// ------------------ Before ------------------ 
let helloLabel = UILabel()
helloLabel.frame = CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)
helloLabel.text = "Hello"
helloLabel.textColor = UIColor.red

// ------------------ After ------------------ 
let helloLabel = UILabel().also { it in
    // UILabelのスコープ
    it.frame = CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)
    it.text = "Hello"
    it.textColor = UIColor.red
}
```

このUILabelをViewに追加するとき、わざわざ`helloLabel`のnamespaceを設定することなく、書くことができるようになります。

```swift
addSubview(UILabel().also { it in
    it.frame = CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)
    it.text = "Hello"
    it.textColor = UIColor.red
})
```

## スコープ関数を使ったメリット

- スコープを絞ることができた
- 1つのオブジェクトに対する処理｛｝内でまとめられた
- コードがすっきりした
- namespaceを省略して書くこともできる
2018年最強のWPプラグイン「RED OLIVE」とは

こんにちは。
突然ですが、皆さんGoogleの各種トラッキングコード埋め込みの面倒じゃないですか？
今回はそんな面倒を一発で解消してくれる便利なプラグインのご紹介です。

##WordpressでGoogleタグを入れるのは色々不便
All in One SEOやGoogle公式のプラグインを入れることも出来ますが、大体がGoogleアナリティクスしか対応してなくてタグマネージャーやオプティマイズといった他ツールの導入が出来ないんですよね。
もしかしたら他の方法があるのかもしれませんが、結局全部使うとなると直書きが必要で、環境によってはエンジニアさんの手を借りる必要も出てくるので、できればマーケマターで完結させたいところ。

##「RED OLIVE」で全部解決
https://www.redolive.io/

```
Google Analytics（無料）
Google Tag Manager（無料）
CallTrackingMetrics（無料）
Google Content Experiments（無料）
Google Optimize（無料）
Crazy Egg
LiveChat Tag
Olark Live Chat
LinkedIn Insight Tag
Google AdWords Remarketing
Bing Ads UET
TrackDuck（無料）
Header Tags & Scripts
Footer Tags & Scripts
```
全13種のアクションに対応。まだ全部使いきれてません。
一個一個インストールして、その互換性を気にする必要ナシ。楽チン。

##※GoogleTagManagerの設定だけちょっと面倒くさい
GTMの設定だけコードをいじる必要があります。
と言っても、bodyタグ直下に一行コピペで挿入するだけですが。


```header.php
<body <?php body_class();?> itemschope="itemscope" itemtype="http://schema.org/WebPage">
#ここから下を追加
<?php do_action( 'after_opening_body' ); ?>
```
対応しない限り、ずっとアラートが鳴るので導入時にサクサクっとやっちゃいましょう。



色々便利なので随時更新予定です。
[iOS][Swift] 意外と知らない？　スマートなグローバル変数ファイルの作り方

以下のように構造体を作成してから、

Constant.swift

```
struct K {
    
    struct UserDefaultsKey {
        static let Settings = "kSetings"
    }

    struct NotificationKey {
        static let Welcome = "kWelcomeNotif"
    }
    
    struct Path {
        static let Documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        static let Tmp = NSTemporaryDirectory()
    }
}
```

以下のように使うだけ。

```
K.UserDefaultsKey.Settings
K.Path.Documents
```

参考：
https://stackoverflow.com/a/26252377
Buildroot Nginx RTMP Module有効化

buildroot MenuからBR2_PACKAGE_NGINX_ADD_MODULESの設定を変更する。
<pre>
Symbol: BR2_PACKAGE_NGINX_ADD_MODULES []
Type  :string
Prompt: additional modules 
Location:
  │     -> Target packages
  │       -> Networking applications
  │ (3)     -> nginx (BR2_PACKAGE_NGINX [=y])
  │   Defined at package/nginx/Config.in:378
  │   Depends on: BR2_PACKAGE_NGINX [=y]
</pre>

設定画面を開き、BR2_PACKAGE_NGINX_ADD_MODULESにModule Pathを設定すると良い。
例えば、nginx-rtmp-moduleのPathが
<pre>
/work/src/modules/nginx-rtmp-module
</pre>
ならば、この内容を設定する。相対パスでも絶対パスでもどちらでも良い。
相対パスの場合は
<pre>
~/buildroot-xxxx.xx/output/build/nginx-x.xx
</pre>
からのPathとなる。
localhost:3000とは何か

# はじめに
Ruby on Rails 初学者に向けた情報をざっくりベースで書いてます。

# localhost:3000とは
Ruby on Railsを学んでいると、rails server実行後に`localhost:3000`　 をブラウザのurl欄に入力し、
serverの立ち上がりを確認する場面があると思います。

この`localhost:3000`とは何を意味しているのでしょうか？
これはアクセスしに行く**宛先**を表しています。

「:」の左側は`IPレイヤ`、右側は`TCP/UDPレイヤ(port)`の宛先を表しています。
つまり「localhost:3000」を翻訳すると、
「**自分の(PCの)IPの3000番port宛にアクセスしてくれ**」という意味になります。

「自分のIP」を指定するのにはlocalhost以外にも表現があり、
「127.0.0.1:3000」「0.0.0.0:3000」でも同様になります。
127.0.0.1や0.0.0.0は「自分のIP」を意味する特殊なIPアドレスです。
# 実IPでアクセス
「自分のIP」を指定すれば良いということは、PCが無線LANに接続している時に取得している実際のIPアドレスでも同様となります。
(MACの場合、ターミナルで`ifconfig`を打つと、`en0:` のインターフェイスに記載があります)

例えば192.168.11.2を取得しているの場合、「`192.168.11.2:3000`」でも同様ということです。

# 他の端末からアクセス
「`192.168.11.2:3000` にアクセスしろ」という命令で自分のPCからアプリケーションが見れるという事は、
192.168.11.2にアクセスできる(同じ無線LANに接続している)**他の端末からでも同様に見れる** ということです。
(一般の家庭用無線LANであれば接続可能です)

他の端末からのアクセスの方が、
Server - Client 間の通信をより実感できるかもしれません。

##補足
Railsのversionによるかもしれませんが、サーバーを立ち上げる時、-bオプションをして
`rails s -b 0.0.0.0`
じゃないと他の端末からの接続ができないかもしれません。

https://qiita.com/yusaku_/items/4e41b556b55ff65b826b
スイッチとラズパイ使ってご飯をslackに通知

# はじめに
まず、これは自分用確認メモなのであしからず。
本ページは、[半田付け日記](https://ryusakura.wordpress.com/2016/01/28/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7gpio%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF/)さんの記事と[Pythonで遊ぼう](https://akakou.github.io/learn-python/)さんの記事を参考にさせていただきました。
##回路図
![lead_switch_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/228792/49085d6c-ba5d-7932-7303-811d99cb84fd.jpeg)

すっごい適当に書いちゃいました。
ラズパイ３modelBを使ってます。

| pin   |  役割    |
|:------:|:-------:|
|  GPIO17 | OUTPUT  |
|  GPIO4 | INPUT  |
|  GND | GND  |

となっています。（多分）

##コード
以下ソースコード（責任は負いかねます。）

```python:Gohandayo.py
#coding: UTF-8

from slackclient import SlackClient
import time
import RPi.GPIO as GPIO
from datetime import datetime

def slack_bot():
   slack_token = "SlackBotのAPI"
   sc = SlackClient(slack_token)
   sc.api_call(
       "chat.postMessage",
       channel="チャンネル名",
       text="ご飯できたよ"
)

def time_list(time):
   f= open('time_list.txt','a') #add open time
   f.write(time +"\n")
   f.close()

def switch_callback(gpio_pin):
   print("succeed")
   open_time = str(datetime.now())
   time_list(open_time)

###############################
f = open('time_list.txt','w')
f.write("")
f.close()

pin_in=4
pin_out=17
###############################

GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(pin_out, GPIO.OUT)
GPIO.setup(pin_in, GPIO.IN)
GPIO.add_event_detect(pin_in, GPIO.RISING)
GPIO.add_event_callback(pin_in, switch_callback)

try:
   while True:
       time.sleep(1)
except KeyboardInterrupt:
    GPIO.cleanup()


```
ボタンを押すことで、指定したチャンネルに「ご飯できたよ」と通知します。
家に実装することで、ご飯のたびにお部屋に侵入されることはなくなり平和が保たれます。

もっとスマートにしたかったのですが、なにぶんビギナーなもので、これが限界でした。
PHPのイコール2つで比較する時の罠

（前提）
弊プロジェクトでは===は使わずに==を使う慣習があります

```
<?php

$str = "0";
$cmp = "test";
var_dump($str == $cmp); // false

$str = 1;
$cmp = "test";
var_dump($str == $cmp); // false

$str = 0;
$cmp = "test";
var_dump($str == $cmp); // なんとtrueになる！

```
Python お作法

2019-07 現在の自分の Python の使い方を記録。参考資料:

* PEP 8 -- Style Guide for Python Cod: https://www.python.org/dev/peps/pep-0008/
* Google Python Style Guide: https://github.com/google/styleguide/blob/gh-pages/pyguide.md
* https://code.visualstudio.com/docs/python/linting

## 選択したツール

* 整形ツール
  * black
  * 理由: 設定項目が少ないらしいので
  * 実行方法: `black ディレクトリ`
* 型チェック
  * mypy
  * 理由: 標準なので
  * 実行方法: `mypy ディレクトリ`
  * 厳しい実行方法: `mypy --disallow-untyped-defs sherpa`
* コード解析
  * pylint
  * 理由: たまたま VisualStudio Code のデフォルトだったので
  * 実行方法: `pylint ディレクトリ`
* ドキュメント
  * pydoc ./ファイル名 でたまに docstring の見た目を確認

## mypy

何もやってないと以下のようなエラーが大量に出る。

```
error: Cannot find module named 'folium'
error: No library stub file for module 'sklearn.preprocessing'
...
```

メジャーなライブラリには型が付いていたり
[stub](https://github.com/python/typeshed) で型を付けられているが、そ
うでないやつは明示的に無視する。

```
[mypy]

[mypy-sklearn.*]
ignore_missing_imports = True

[mypy-numpy.*]
ignore_missing_imports = True
```

のようなファイルを mypy.ini として保存すると無視される。

## VSCode の settings.json

```
    "[python]": {
        "editor.formatOnSave": true
    },
    "python.linting.mypyEnabled": true,
    "python.linting.pylintEnabled": true,
    "python.formatting.provider": "black",
    "python.linting.pylintArgs": ["--disable", "line-too-long,bad-continuation"]
    "python.linting.mypyArgs": ["--disallow-untyped-defs"],
```
ディープラーニング(CNN)は外観検査でなぜそれをNGと判定したのか？

# 傷に注目してNGになっている等がわかる。

![nut_cam.gif](https://qiita-image-store.s3.amazonaws.com/0/114533/1528cb8e-761a-e4e3-3ea9-b0e0c232ff94.gif)
判定結果は特に赤色部分に起因している。
OKは全体に分布しているのに対し、NGは傷があるところに集中している。

# ■はじめに
ディープラーニング(CNN)は画像分類タスクの自動化に不可欠となっています。
一方中身がブラックボックス(情報は取り出せるが数値の意味が人間が把握できない)で、
「精度が上がらないけどどこ見て判断してんの？」
「評価データでは精度高いけど、今後未知のデータでも大丈夫？」
という点が気になることもしばしば。
そこで判断根拠のヒントを得ようとする取り組みも多数あるようです。
[ディープラーニングの判断根拠を理解する手法](https://qiita.com/icoxfog417/items/8689f943fd1225e24358)

# ■やったこと
今回は金属表面のキズ判定のために学習させたCNNネットワークにClass Activation Mapping(CAM)を適用して、
判定結果がどの領域の特徴と相関が強くあるのかを可視化してみました。
[検証用動画、学習済みモデルを含むMATLABサンプルコード](https://jp.mathworks.com/matlabcentral/fileexchange/69357-class-activation-mapping)

Class Activation MappingはMITのComputer Science and Artiﬁcial Intelligence Laboratoryのチームが発表されたもののようです。(※1)

## 利用するネットワーク
転移学習でキズ有無によるOK/NGを判定できるようにしたGoogleNetとSqueezeNetで今回試してみました。
CAMを適用する点での違いは
演算で用いる場所のActivation Mapのサイズが異なる点です。
GoogleNet → 7x7
SqueezeNet → 14x14
ですので、SqueezeNetのほうが高分解能なMapを取り出せます。

## CAMの計算
SqueezeNetの場合を例に示すと、演算に使った層は'relu_conv10'と'fc'です。
<img width="672" alt="2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/114533/51d594a8-0893-b099-c9a6-e4d87527118c.png">

'fc'層から判定されたクラスのWeight(長さ1000のベクトル)を取り出し、'relu_conv10'層でのActivationの出力(imageActivations(14x14x1000))の各位置の出力ベクトルとWeightを要素ごとの掛け算後すべてを足し合わせることでサイズ14x14のClass Activation Mapができます。


```matlab:CAMheatmap_squeezenet.m
% 全結合層から判定されたカテゴリのWeightを取り出す。
weightVector    = myNet.Layers(67).Weights(classIndex,:); 
% Classification Activation Mapを計算する
weightVectorSize = size(weightVector); 
weightVector = reshape(weightVector,[1 weightVectorSize]); 
dotProduct = bsxfun(@times,imageActivations,weightVector); 
classActivationMap = sum(dotProduct,3); 
```
その出力結果を
値大　→　赤
値小　→　青
のヒートマップとして表示しています。

# ■ポイント
・Class Activation Mappingはどこの特徴量が判定に寄与しているかを可視化できる
・分類する全結合層の重みとその前の層のActivation Mapとの演算で求めるため、全結合層が複数層続く構造のネットワークには向いていない。
・解像度は演算で用いる層のActivation Mapのサイズに依存


# ■参照
(※1) http://cnnlocalization.csail.mit.edu/Zhou_Learning_Deep_Features_CVPR_2016_paper.pdf
GRASS GISの「r.viewshed」コマンドで出力されるラスタ画像

可視領域を算出する「r.viewshed」コマンドについて、出力される可視領域ラスタの数値について。

「r.viewshed」コマンドでは入力DEMと視点場の位置を指定します。
「coordinates」は視点場を示すxy座標です。
observer_elevationは視点の高さで、何も指定しなければデフォルトの1.75mに設定されます。

```
r.viewshed input=DEM@kasi output=f08 coordinates=462317,4643958 observer_elevation=1.75
```

出力される可視領域は「見える」、「見えない」のニ値画像かと思いきや連続量ラスタが出力されます。
単純に可視領域を２値画像化する場合は「r.reclass」コマンドを使用します。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/60438/6d6982c4-e83c-0ced-d0b3-a4969144dd5f.png)

## ニ値画像化する場合

二値画像化する場合は、あらかじめルールファイルを用意しておくほうが簡単です。ここでは「reclass.txt」というファイルにルールを記述しています。

```
r.reclass input=f08@kasi output=f08reclass rules=reclass.txt
```

ルールファイルの中身は、0〜180度を「1」、180度以上を「NULL」に指定しています。これをテキストファイルに保存しておきます。

```
0 thru 180 =1
180 thru 1000 =NULL
```

## ベクタ化する場合

二値画像ラスタからベクタ化する場合は「r.to.vect」コマンドを使用します。

```
r.to.vect input=f08reclass@kasi output=f08 type=area
```

## 可視領域ラスタは視点場からの角度

「r.viewshed」コマンドで出力される可視領域ラスタは視点場からの視線と可視地点の鉛直方向との角度です。俯角は鋭角、仰角は鈍角になります。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/60438/bb18f5a2-c8cb-18d5-e1d8-1dd150ebb081.png)



可視領域ラスタをGeoTIFFに出力します。「r.out.gdal」コマンドにて。

```
r.out.gdal input=f08@kasi output=F08_original format=GTiff
```

QGISで出力して90より大きいを赤、90以下を青に設定しました。視点場（オレンジ五角形）より高い地点は赤に、低い地点は青になっています。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/60438/06df0c5c-1938-155e-6d90-a400d2f63485.png)

![04.png](https://qiita-image-store.s3.amazonaws.com/0/60438/4b915ad0-49fe-e6ca-e002-dc0592d9cbb8.png)
Docker for Windowsで起動エラーが起きた場合の対処

#環境
- Windows 10 Pro
- Docker for Windows 18.06.1-ce-win73 (19507)
 
#概要
最近起動していなかったDocker for Windowsを今日(2018/11/09)起動したらこんなエラーが起きて起動しなかった。絶対これ同じハマっている人がいると思うので久しぶりに投稿する。

```text:log
Unable to create: ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。Hyper-V で、コンピューター 'DESKTOP-BTTN302' 上のオブジェクトにアクセスしようとしましたが、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。
New-Switch、<ファイルなし>: 行 117
<ScriptBlock>、<ファイルなし>: 行 394. Let's retry
```

#試してだめだったこと
- まずはググって最初に出てきた、Dockerアンインストール ⇒ Hyper-Vの無効化・有効化 ⇒ Dockerインストール。
- ウィルス対策ソフトの無効化

#解決策
公式のところ？にちゃんと書いてあった。
https://social.technet.microsoft.com/Forums/windows/en-US/ee5b1d6b-09e2-49f3-a52c-820aafc316f9/hyperv-doesnt-work-after-upgrade-to-windows-10-1809?forum=win10itprovirt

1. **Windows セキュリティ**を起動する（アプリの名前です）
2. **アプリとブラウザーコントロール**をクリック
3. 一番下にある**Exploit protectionの設定**をクリック
4. **プログラム設定**のタブを選択
5. **C:\WINDOWS\System32\vmcompute.exe**を選んで編集をクリック
6. **制御フローガード(CFG)**の**システム設定の上書き**のチェックを外して適用
最新の Ruby と Rails をインストールして Rails プロジェクトを作成する

## そもそも Ruby と Rails の最新バージョンって何を確認すれば良いんだっけ？

公式サイトから最新バージョンを確認するのが正確です。

- [Ruby on Rails](https://rubygems.org/gems/rails)
- [Ruby](https://www.ruby-lang.org/ja/downloads/)

基本的に開発環境ごとに Ruby のバージョンを指定したいので、 **rbenv** を使ってバージョン管理していきます。

## rbenv とは？

Ruby のバージョンを管理してくれるバージョン管理システムです。
[rbenv/rbenv: Groom your app’s Ruby environment](https://github.com/rbenv/rbenv)

Ruby のバージョン管理システムは他にも RVM などがありますが、私は使いやすい rbenv のほうを使っています。

比較については以下などを参考に。

- [passingloop • rbenv と RVM との違い](https://passingloop.tumblr.com/post/10512902196/difference-between-rbenv-and-rvm)
- [ruby - RVM と RBEnvの違いは？ - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/2955/rvm-%E3%81%A8-rbenv%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF)

### ruby-build とは？

rbenv の README を見ていると、「ruby-build」という単語が出てきます。これは rbenv のプラグインです。
[rbenv/ruby-build: Compile and install Ruby](https://github.com/rbenv/ruby-build#readme)

`rbenv install` コマンドを提供する rbenv のプラグインとして利用できます。

## 最新の Ruby と Rails をインストールする方法

公式サイトから Ruby と Rails の最新安定版バージョンを確認します。

> 2018年11月9日 時点
> Ruby 2.5.3
> Rails 5.2.1

※ ここから先は rbenv と ruby-build がインストールされている前提で話を進めます。まだインストールされていない場合は、公式の README の手順に従ってインストールしていきましょう。

### 1） ruby-buid を更新して最新の Ruby をインストールする

```
# ruby-buid を更新する
$ brew update && brew upgrade ruby-build

# `rbenv install -l` を実行して最新の Ruby バージョンが出てくるのを確認
$ rbenv install -l

# 最新バージョンの Ruby をインストール （2018/11/09 時点）
$ rbenv install 2.5.3
```

### 2） 最新の Rails をインストールする

```
# 実行するディレクトリの場所はどこでも可
$ gem install rails
```

Rails は Gem なので、もうすでに Rails がインストールされている場合は `gem update rails` でアップデートできます。

**※ もし `ERROR:  While executing gem ... (Gem::FilePermissionError)` というエラーが出たら...**

Mac に標準でインストールされている Ruby を使おうとした場合、パーミッションエラーで実行できない可能性が高いです。

以下の記事などを参考に、rbenv を global でも利用できるようにしましょう。

[gem installでpermissionエラーになった時の対応方法 - Qiita](https://qiita.com/nishina555/items/63ebd4a508a09c481150)

これで、最新の Ruby と Rails が使えるようになりました :tada: 

### 3） Bundler をインストールする

Bundler とは、Gem を管理するためのパッケージマネージャーです。
[Bundler: The best way to manage a Ruby application's gems](https://bundler.io/)

Rails は Bundler を使って Gem を管理しているため、Bundler をインストールしましょう。

```
$ rbenv exec gem install bundler
```

`rbenv exec` をつけると、「rbenv の設定で現在有効な Ruby の Bundler」をインストールすることができます。

### 4） Rails プロジェクトを作成する

```
$ rails _5.2.1_ new [project name]
```

これで一通りインストール & Rails プロジェクト作成ができました！
どんどん開発していきたいですね :relaxed:

## 参考になった記事
[rbenv + ruby-build はどうやって動いているのか](https://takatoshiono.hatenablog.com/entry/2015/01/09/012040)
[railstutorial - 1.2.1 開発環境](https://railstutorial.jp/chapters/beginning?version=5.1#sec-development_environment)
Docker（Docker Compose）から DynamoDB Local を使う際にデータを永続化する

2018/11/15 更新

DynamoDB Local を実行するユーザにディレクトリへの書き込み権限が無いと正しく動かなったので修正。

---

2018年8月ごろ？（うろ覚え）にDynamoDB Local の公式 Docker イメージが利用できるようになった。

* [DynamoDB (ダウンロード可能バージョン) と Docker - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.Docker.html)
* [amazon/dynamodb-local](https://hub.docker.com/r/amazon/dynamodb-local/)

しかし、デフォルトでは `-inMemory` オプションで起動されるため、コンテナを落とすとテーブル定義を含むデータがすべて消えてしまう。


代わりに `-dbPath` オプションを指定して起動させることで、コンテナを落としてもデータを失わずに済む。

```yml:docker-compose.yml（一例）
version: "3"

services:
  dynamodb:
    build: ./dynamodb
    volumes:
      - dynamodb_data:/home/dynamodblocal/data
    ports:
      - 8000:8000
    command: -jar DynamoDBLocal.jar -dbPath ./data

volumes:
  dynamodb_data:

```

```dockerfile:dynamodb/Dockerfile
FROM amazon/dynamodb-local

WORKDIR /home/dynamodblocal

# UID=1000 → DynamoDB Local の実行ユーザ
RUN mkdir data && chown -R 1000 data
```

## 参考

* [DynamoDB 使用に関する注意事項 - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html)
* [DynamoDB Localの公式Docker Imageが公開されました。 - サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2018/08/29/dynamodb-local-dokcer/)
Tweetを用いたデータ解析用！基本コマンドまとめ

よく使うコマンドをまとめておきます　part2
twitterを使ったデータ解析ver（随時更新）

part1「pandas基本コマンドまとめ」は[こちら](https://qiita.com/mary/items/49fe50825baa45425b65)

#読み込み
###基本のパッケージ読み込み

```
import MeCab as mc
```
pythonで日付処理のループをする方法

# はじめに

pythonを使ってる時に、日付のループ処理をしたい時用の関数をちょこちょこ自作して使うからまとめます。

# 指定期間内の日付を返す関数

rangeちっくに指定期間内の日付を返します。
rangeの仕様とは異なりますが、利便性を考え、開始日と終了日を含む処理になっています。

```python:指定期間内の日付を返す
from datetime import datetime, timedelta

def date_range(start_date: datetime, end_date: datetime):
    diff = (end_date - start_date).days + 1
    return (start_date + timedelta(i) for i in range(diff))
```

# 基準日からN日までの日付を返す関数

基準日を「含めて」N日分の日付を返します。

```python:基準日からN日までの日付を返す
def date_back_range(base_date:datetime, period: int):
    yield from date_range(base_date-timedelta(period-1), base_date)
```

# 補足

relativedeltaに置き換えれば、月ごとのループも容易です。

この２つを組み合わせれば、Nヶ月前の月初から指定した月の月末の日付を返す関数(例えば、1/1~3/31)とか、色々応用が効きます。


# 参考
 - [Creating a range of dates in Python](https://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python)
 - [2つのdatetime型の期間内で日毎、月毎に処理をする](http://y0m0r.hateblo.jp/entry/20120616/1339854322)
Flask, uWSGI, Nginx をつなぐ

次のページを参考にしました。
[Flask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6)](https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b)

私は、これを Arch Linux で行い、かつ uWSGI は手動で起動しました。

Flask のプログラム

```py:hello.py
# ------------------------------------------------------------------
#
#	hello.py
#
#					Nov/09/2018
# ------------------------------------------------------------------
from flask import Flask
app = Flask(__name__)

# ------------------------------------------------------------------
@app.route("/")
def hello():
	str_out = "<h2>Hello World!</h2>"
	str_out += "こんにちは。<p />"
	str_out += "Nov/09/2018 PM 16:51<p />"
	return str_out

# ------------------------------------------------------------------
if __name__ == "__main__":
    app.run()
#
# ------------------------------------------------------------------
```

これを、ビルトインサーバーで起動

```bash
python hello.py
```

>ブラウザーで、http://127.0.0.1:5000/　にアクセス

uWSGI で起動

```bash
uwsgi --plugin http,python --http :9080 --wsgi-file hello.py --callable app
```

>ブラウザーで、http://127.0.0.1:9080/ にアクセス

次に、uWSGI と Nginx をつなぎます。

Nginx の設定

```text:/etc/nginx/nginx.conf
        location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
        }
```

Nginx　の起動

```bash
sudo systemctl start nginx
```

Nginx が起動しているか確認

```bash
sudo systemctl status nginx
```

次に uWSGI をマニュアルで起動

```bash
uwsgi --plugin http,python --socket /tmp/uwsgi.sock --wsgi-file hello.py --callable app --chmod-socket=666
```

>ブラウザーで、http://127.0.0.1/ にアクセス

この次には、uWSGI をサービスにして、systemd で起動できるようにする必要があります。

ini ファイルを使って、uWSGI を起動するようにします。

```text:/home/uchida/flask/hello/hello.ini
[uwsgi]
wsgi-file = /home/uchida/flask/hello/hello.py
callable = app
master = true
processes = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
plugin = http,python
```

uWSGI の起動

```bash
uwsgi --ini /home/uchida/flask/hello/hello.ini
```

>ブラウザーで、http://127.0.0.1/ にアクセス

サービスの作成

```text:/etc/systemd/system/hello.service
[Unit]
Description=uWSGI instance to serve hello
After=network.target

[Service]
User=uchida
Group=wheel
WorkingDirectory=/home/uchida/flask/hello
Environment="PATH=/usr/bin"
ExecStart=/usr/bin/uwsgi --ini hello.ini

[Install]
WantedBy=multi-user.target
```

サービスの起動

```bash
sudo systemctl start hello
```

サービスの起動を確認

```bash
sudo systemctl status hello
```

>ブラウザーで、http://127.0.0.1/ にアクセス

これで、完了です。

hello.py を編集したら、サーバーで

```bash
sudo systemctl daemon-reload
sudo systemctl restart hello
```