OmniAICreator/Qiita-1.07M huggingface dataset:
中華 セキュリティ カメラ 事始め

# Overview

Amazonなどで人気(?)の中華セキュリティカメラをhackしていくためにいろいろと調べた基礎情報をまとめていきます。

* [.264を.mp4へ変換](https://qiita.com/hidenorly/items/c6b9381f3f6f97c152ef)

# web setup

## 初回

```
http://admin:admin@ipaddress/
```

# onvif

```
http://admin:password@ipaddress:8080
```

# rtsp

main stream:

```
rtsp://admin:password@ipaddress:554/11
```

sub stream (downsized stream):

```
rtsp://admin:password@ipaddress:554/12
```

# one shot jpeg file

```
http://admin:password@ipaddress/tmpfs/auto.jpg
```

# file browse

```
http://admin:password@ipaddress/sd/20190430/record000/
```

```
Index of /sd/20190430/record000/
Name Modified Size 

--------------------------------------------------------------------------------
 
Parent directory  -   - 

P190430_232200_999999.264  30-Apr-2019 23:22   404.1k 
```

# Appendix

* firmware download page : http://www.sv3c.com/Firmware.html
    * Currently updated firmware is only available for HX & POE series
* Instruction & Setup guide & PC Software download : http://www.sv3c.com/Instruction-and-Software-For-1080P-Wireless-IP-Camera-P-series-.html

# ご参考

* [「中華ウェブカメラ」のセキュリティについて](http://r00tapple.hatenablog.com/entry/2017/08/12/050252)
* [SV3C製1080P POE対応IPカメラ（SV-B01POE-1080P-L）](http://quuta.atgj.net/ipcamera_nvr/2018070501)
* [URL list for iSpy](https://www.ispyconnect.com/man.aspx?n=SV3C)
  * iSpy already supports OVNIF Camera Support Wizard for SV3C devices.
  * [Common IP camera RTSP URL formats for use with Wowza Streaming Engine](https://www.wowza.com/docs/common-ip-camera-rtsp-url-formats)
* [Converter from ".264" extension to mp4](https://www.spitzner.org/kkmoon.html)
* [Conversion steps with ffmpeg](https://oxynotes.com/?p=11912)
    * [Conversion with ffmpeg (CLI)](https://superuser.com/questions/1289973/how-to-convert-raw-264-file-to-mp4-provided-by-luowice-ip-camera)
* [Great guide to setup s3vc camera](https://oxynotes.com/?p=11484)
* [Setup to force demuxer mode to H.264](https://reolink.com/how-to-play-h264-files-in-vlc/)
    * [Other article of how to setup demuxer on VLC to h.264](https://www.unifore.net/ip-video-surveillance/how-to-play-264-video-files-from-ip-cameras-dvrs.html)
curl実行の時につけておくべきオプションを解説

## curl実行の時につけておくべきオプションを解説
手軽にGETリクエストを送る時にはcurlを使うことと思います。
その時には、`$ curl google.com`のように使うのではなく、常に`$ curl -v google.com`
と`-v`をつけるのがおすすめです。
こうすることでステータスコードを初めてとしてHTTPレスポンスのヘッダの内容を見ることができるため、より正確にリクエストとリスポンスを把握することができます。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Unity 2018 LTS リリース（2019-05-10）

<p><img src="https://dl.dropbox.com/s/q9xde7pcnxjzu8v/Unity2018.4.0f1.png" /></p>


<!--
https://qiita.com/sator_imaging/items/8967a336b2c072a706e7
-->


昨日つらつらと書いていたら、Unity 2018 LTS がリリース。


- [Unity 2019.1 vs 2018.3 比較 - Qiita](https://qiita.com/sator_imaging/items/1a491d5ec48594fb4999)
   - Unity 2018.3 vs 2019.1 Unity 2019 は LTS になるまでスキップして、Unity への開発リソース配分を減らそう、という算段。をした過程。
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://qiita.com/sator_imaging/items/1a491d5ec48594fb4999">
   </iframe>



ダウンロード。


- [Unity QA - LTS Releases - Unity](https://unity3d.com/unity/qa/lts-releases)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://unity3d.com/unity/qa/lts-releases">
   </iframe>
Vue + Typescript やろうとしたら'vue' は、内部コマンドまたは外部コマンド～(windows10)

vue + typescriptをやってみようと思って[公式](https://jp.vuejs.org/v2/guide/typescript.html)を見ながらvue/cliをインストールしたらいきなり突っかかったので、（自らへ向けた）怒りの初投稿

# 公式どおりに

vue/cliをインストールする

```bash
npm install --global @vue/cli
```

プロジェクトを作ろうとする

```bash
vue create my-project-name
```
# 失敗する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/51b2b3dd-ff42-1372-6636-228d5ae49c8a.png)

ええ・・・
（npmグローバルインストールした場合でも環境変数を設定しないといけない事を初めて知る）←


# グローバルインストールの場所を調べる
```bash
npm bin -g
```

```
C:\Users\Betergeuse\AppData\Roaming\npm
(not in PATH env variable)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/3d27c155-f7f5-b551-4a3d-f25cf1324c8d.png)


(vueはんおるな～)

環境変数Pathに指定したら成功した。

さて、やるか・・・
「Diverta 2019 Programming Contest」を終えて

2回目のAtCoder Contestの参加となりました、今回はAだけAC、Bが結局あってるのかあってないのかわからない(WJのまま)、Cが48/51正答の3つWAという結果でした、仕方ないとはいえラスト30分間ほとんど何もできなかったのは悲しかった...

# A問題

これはすぐに思いつきました、N個のうちK個の数をひとまとめにすればいいだけなので...

```python
    list = input().split()
    print(int(list[0]) - int(list[1]) + 1)
```
リストを使わない入力方法早く覚えたい...

# B問題

蟻本にくじ引きの似たような問題があったのでアルゴリズムを考えるのは楽でした、最初for3回回しなのかな～とぼんやり思ってたけど2回で十分でしたね...こっちはCで

```C
    #include<stdio.h>
     
    int main(){
      int r, g, b, n;
      int cnt = 0;
      scanf("%d %d %d %d\n", &r, &g, &b, &n);
      int x = n / r;
      for(int i=x;i>=0;i--){
        int y = (n - (i * r)) / g;
        for(int j=y;j>=0;j--){
          int z = n - (i * r) - (j * g);
          if(z % b == 0){
            cnt++;
          }
        }
      }
      printf("%d\n", cnt);
      return 0;
    }
```

わざわざx, y, zでおいているのは前半でFloatingエラーでまくったトラウマなので許してください...あとあっているか教えてください。

追記:ACでした、やったね

# C問題

## 考えたアルゴリズム
ざっくり書くと
 ・1つの単語中の`AB`1つにつきcntを1つ増加
 ・ラストの`A`につきcntaを1増加
 ・頭の`B`につきcntbを1増加
 ・cntにcntaとcntbの最小値を足したものを出力

## 実装したコード
```python
    n = int(input())
    list = []
    cnt = 0
    cnta = 0
    cntb = 0
    cntexp = 0
    for i in range(n):
      list.append(input())
      a = list[i].count("AB")
      cnt += a
      if(list[i][-1:] == "A"):
        cnta += 1
      if(list[i][0:1] == "B"):
        cntb += 1
      if((list[i][-1:] == "A")and(list[i][0:1] == "B")):
        cntexp += 1
    cntab = min(cnta, cntb)
    if(cntab == cntexp):
      cntab -= 1
    ans = cnt + cntab
    print(ans)
```

これに色々な例外処理を考慮して実装したのが上でしたがラスト2つがWAでした...ほかにどういうパターンが存在するのか教えてください...






D,E問題も解けそうだったけど時間が足りなかったのでゆっくりやっていきたいです...
Leetcode #19: Remove Nth Node from End of List

```swift
func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
    let dummyHead = ListNode(0)
    dummyHead.next = head
    var fast: ListNode? = dummyHead
    var slow: ListNode? = dummyHead
    for _ in 0...n {
        fast = fast?.next
    }
    while fast != nil {
        fast = fast?.next
        slow = slow?.next
    }
    slow?.next = slow?.next?.next
    return dummyHead.next
}
```
デスクトップ向け FreeBSD ディストリビューション Project Trident

[当方執筆の技術情報に関するライセンス、免責事項、禁止事項](https://qiita.com/EarthSimilarityIndex/items/6b9bb2ccacb38aae15b1)

****

#概要
![Screenshot_2019-05-06 Home Project Trident.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/a7aaf9b9-94d6-9940-e2c7-c42702e31334.png)
https://project-trident.org/

※ ロゴ画像は公式サイトより

###What is Project Trident?

Project Trident is a desktop-focused operating system based on TrueOS. It uses the Lumina desktop as well as a number of self-developed utilities to provide an easy-to-use system that both BSD beginners and advanced system administrators can feel comfortable running 24⁄7.

※ 24/7 は twenty-four seven で、日本語の「四六時中」のような意味らしいです。

TrueOS ベースという点では GhostBSD に近いかもしれません。他方、GhostBSD のデスクトップ環境が GTKベースの Mate であるのに対して、Project Trident のデスクトップ環境は Qtベースの Lumina と、メインで採用する GUI ツールキットに関して対照的です。 

#日本語環境のセットアップ
![ぷろとら03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/92e2a1fe-f2f8-136a-d3d7-266b8f6f7bf1.jpeg)

![ぷろとら04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/df82ea41-8de4-a854-bbb3-acfe129b37a1.jpeg)


やや苦戦しました。参考リンク先の方の記事でも触れられていますが、日本語を選択してセットアップしてしまうと豆腐だらけになってしまいます。自分はタイムゾーンのみ UTC+9 としてウィザードに従いセットアップし、英語環境でログインして日本語フォントや入力メソッドをインストール・セットアップ後にログアウト。二度目のログインでディスプレイマネージャ（ PCDM / PC-BSD® Display Manager ）画面左上の言語選択で日本語を選択して再度ログインすることで、実用可能な環境とすることが出来ました。

![ぷろとら01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/fd027233-64ab-e690-f9fd-77dd232aced8.jpeg)


###パッケージインストール例

```
sudo pkg install ja-font-mplus-ipa ja-uim-mozc uim-qt5 sl
```

###.xprofile 設定例

ja-uim-mozc インストール時に表示されるメッセージの内容＋α を .xprofile に記述。
CLI のエディタは nano ではなく ee が採用されていました。

```
#!/bin/sh
setxkbmap -layout jp

export GTK_IM_MODULE=uim
export QT_IM_MODULE=uim
export XMODIFIERS=@im=uim
export XIM=uim

/usr/local/bin/mozc start
uim-xim &
```

###参考／先行研究
Project Tridentのご紹介 - 610's BSD Life
https://scrapbox.io/BSD/Project_Trident%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B

#タイムゾーンの再設定
タイムゾーンが正常に反映されていない場合、端末エミュレータから tzsetup を実行することでJSTを設定することが出来ました。

```
sudo tzsetup
```

###出典
タイムゾーンの設定 - メモとかメモのようなものとか（byルーキーの中のひと）
https://wiki.rookie-inc.com/os/freebsd/ntp/timezone
１から始めるバックエンド・kubernetes・Docker入門

## kubernetesとは

Kubernetesは、Dockerコンテナ群を統合管理するためのオープンソース のソフトウェア。コンテナ化されたアプリケーションの展開やスケーリング、 管理を自動化するための基盤である。K8sとも略記される。（kとsを除いて８文字のため）

## 事前環境について

Dockerをインストールする
本家サイトからダウンロード＆インストールができます。各種環境に合わせたものがあるので、自分にあったものを選びます。また、WindowsとMac共にOSのバージョン指定などがあるのでその辺はサイトをご確認ください。

https://docs.docker.com/engine/installation/

インストールの結果、以下のコマンドが動けばOKです。

```
$ docker --version
Docker version 1.13.0, build 49bf474
```
## コンテナとイメージのビルドについて

Dockerfileと呼ばれるコンテナの中身を定義して操作を練習します。

```
$ docker build -t summerwind/hello:1.0.0.
```
以下は公式のリファレンスやドキュメントなどで確認してください。

## Kubernetesのインストール

①Docekrのツールバーから設定画面を開く
②Enable Kubernetesのチェックボックスを有効化
③Applyをクリックしてインストールを開始
④しばらくするとインストール完了。

Dockerを通さなく、コマンドライン上でインストールするやり方もあるので、
各自のやりやすい方法で進めてください。

##Kubectlを活用し、Podなどを操作する、本編と続きます
【VB.net】Using句について

# 今回書くこと
最近、VB.netを扱う仕事をし始めたので、書ける範囲で書いていこうと思う。備忘録として。

## Using句


```VB:Module1.vb
Dim aaa = As Boolean
Using reader = '何かしらのDBアクセス定義など
    aaa = reader.Read()  'True:データ有り  False:データなし
End Using

If aaa Then
    'Trueの際に行う処理
Else
    'Falseの際に行う処理
End If
```


この時の*reader.read()* は、返り値がBooleanなので、例えば、「DBにアクセスして条件にあったレコードが存在するのか？」を簡単に調べられるし、安全に実行できる。

### 理由
前述の通り、安全に実行できるといったのは訳があって、End Using時にDispose()が自動的に働いてくれるので、
DBをオープンしていても、End Using時にはクローズしてくれるので、割と便利だった。

#### まとめ
DBのアクセスや、ファイルのオープン、WriteLine関係でも活用できる(らしい)ので、積極的に使っていこうと思う。
この内容は僕個人が感じた感想と備忘録なので、もし何か違うよ？ってことがあったら教えて欲しいです。
というか、一思いにVB.netを全て教えて欲しい。
Docker Desktop for Mac のタグ補完(Shell Completion)

いちいち tag をコピペしたりがめんどくさかったり、オプションを覚えてられない。 Docker Desktop for Mac の場合に、毎回忘れてしまうのでメモを書いておく :pencil:

[Install shell completion](https://docs.docker.com/docker-for-mac/#install-shell-completion)

> Docker Desktop for Mac comes with scripts to enable completion for the `docker`, `docker-machine`, and `docker-compose` commands. The completion scripts may be found inside Docker.app, in the `Contents/Resources/etc/` directory and can be installed both in `Bash` and `Zsh`.

```console
$ ls /Applications/Docker.app/Contents/Resources/etc/
docker-compose.bash-completion	docker-compose.zsh-completion	docker-machine.bash-completion	docker-machine.zsh-completion	docker.bash-completion		docker.fish-completion		docker.zsh-completion
```

docker に関しては `bash` や `zsh` 以外に `fish` もある。

```console
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion $(brew --prefix)/etc/bash_completion.d/docker
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-machine
$ ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-compose
```

コマンドやオプションももちろんイメージもタグ補完が聞くので便利 :bulb:
rails でbinding.pryが効かない&サーバー閉じれない


```terminal
$lsof -wni tcp:3000
.......
ruby      1144 katoatsushi   21u  IPv6 ...........      0t0  TCP [::1]:hbci (LISTEN)
ruby      1144 katoatsushi   26u  IPv6 ...........       0t0  TCP [::1]:hbci->[::1]:49767 (ESTABLISHED)
ruby      1144 katoatsushi   28u  IPv6 ...........       0t0  TCP [::1]:hbci->[::1]:49768 (ESTABLISHED)
$kill -9 49768
```
応急処置はできたけど原因がわからない、、、
調査します。
ImageDataGeneratorを拡張しcutoutを実装する

# はじめに
[以前](https://qiita.com/shoji9x9/items/35adc2bd48ab531a3a01)にImageDataGeneratorを使ってData Augmentation（水増し）を行ったのですが、ImageDataGeneratorが持っていない水増し方法も使いたいと思っていました。今回それを実現してみました。

# 環境
* Google Colaboratory
* TensorFlow 2.0 Alpha

# コード
[こちら](https://github.com/shoji9x9/inherit_ImageDataGenerator)です。

# コード解説
```Python
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator

class CustomImageDataGenerator(ImageDataGenerator):
    def __init__(self, cutout_mask_size = 0, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.cutout_mask_size = cutout_mask_size
    
    def cutout(self, x, y):
        return np.array(list(map(self._cutout, x))), y
    
    def _cutout(self, image_origin):
        # 最後に使うfill()は元の画像を書き換えるので、コピーしておく
        image = np.copy(image_origin)
        mask_value = image.mean()

        h, w, _ = image.shape
        # マスクをかける場所のtop, leftをランダムに決める
        # はみ出すことを許すので、0以上ではなく負の値もとる(最大mask_size // 2はみ出す)
        top = np.random.randint(0 - self.cutout_mask_size // 2, h - self.cutout_mask_size)
        left = np.random.randint(0 - self.cutout_mask_size // 2, w - self.cutout_mask_size)
        bottom = top + self.cutout_mask_size
        right = left + self.cutout_mask_size

        # はみ出した場合の処理
        if top < 0:
            top = 0
        if left < 0:
            left = 0

        # マスク部分の画素値を平均値で埋める
        image[top:bottom, left:right, :].fill(mask_value)
        return image
    
    def flow(self, *args, **kwargs):
        batches = super().flow(*args, **kwargs)
        
        # 拡張処理
        while True:
            batch_x, batch_y = next(batches)
            
            if self.cutout_mask_size > 0:
                result = self.cutout(batch_x, batch_y)
                batch_x, batch_y = result                        
                
            yield (batch_x, batch_y)     
    
datagen = CustomImageDataGenerator(rotation_range=10, horizontal_flip=True, zoom_range=0.1, cutout_mask_size=16)
```

ImageDataGeneratorを継承したClassを作成し、flowメソッドをオーバーライドし、そこからcutoutを呼び出しています。

# 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337041/c5b6e94a-c0f8-a5d0-9905-23cc2da6def6.png)
ちゃんとcutoutが入っているようです。

# 参考にしたページ
* [KerasのImageDataGeneratorを継承してMix-upやRandom Croppingのできる独自のジェネレーターを作る](https://qiita.com/koshian2/items/909360f50e3dd5922f32)
* [ImageDataGeneratorを拡張してデータ拡張のパターンを追加する](https://qiita.com/LAKuEN/items/db80a6927b60299cf5b1)
Firebase Analytics の自動イベント取得

# はじめに
iOSやAndroidアプリの利用状況把握のツールとして、Firebase　Analyticsがあります。利用状況把握のためのアプリを変更は、少ない方が楽なので、[以前の記事](https://qiita.com/KenNagami/items/1052ad2b50c3ddfc41f6)で書いたようにアプリの変更を2行のみした状態で、どんな情報が取得できるか試してみました。

# 自動取得できる情報
自動取得できる情報は、[自動的に収集されるイベント](https://support.google.com/firebase/answer/6317485)で書かれている情報が取れるようです。今回は、画面遷移の把握ができるかを試してみました。

# アプリの実装
以下のような3つの画面を持つアプリを作って試してみました。このアプリは、それぞれのViewControllerに2つのボタンがあり、そのボタンを押すと、別のViewControllerに画面遷移します。
<img width="300" alt="20190511-firebase-analytics-storyboard.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/07aa1802-4ccd-ecf3-8eed-18266bee5f97.png">

それぞれのViewControllerに対して、下の図のように、Custom　Classとして別のクラスを設定します。

<img width="262" alt="20190511-firebase-analytics-storyboard2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/0a13d7d7-e6c9-c8cd-d574-26ff4b02c10a.png">

# アプリのログ
このアプリを起動して、どのような情報が自動的に取得できるかログを出してみました。以下のように、現在の画面(firebase_screen_class)と遷移前の画面(ga_previous_class)が取得できます。この項目は、Custom Classで設定したクラス名が入っています。このログのように遷移前の画面と遷移後の画面が取れることがわかったので、画面遷移に関しては、自動的に収集できる情報で、よさそうです。

```
2019-05-10 16:29:14.433227+0900 firebase-test[26326:1786556] 6.0.0 - [Firebase/Analytics][I-ACS023105] Event is not subject to real-time event count daily limit. Marking an event as real-time. Event name, parameters: screen_view (_vs), {
    firebase_debug (_dbg) = 1;
    firebase_event_origin (_o) = auto;
    firebase_previous_id (_pi) = -623853840462668681;
    firebase_screen_class (_sc) = View3Controller;
    ga_previous_class (_pc) = View2Controller;
    ga_realtime (_r) = 1;
    ga_screen_id (_si) = -623853840462668680;
}
```

# Firebaseコンソール
下の図は、Firebaseコンソールでの見え方です。
表示されていた画面の平均閲覧時間や比率が見れるようになっていました。

<img width="500" alt="20190511-firebase-analytics-console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/4a8a6130-13b0-ac66-d038-7caac91d496d.png">

# 参考文献

- [画面表示のトラッキング](https://firebase.google.com/docs/analytics/screenviews)
- [自動的に収集されるイベント](https://support.google.com/firebase/answer/6317485)
USB XHCIについて

USB XHCIについてのメモ

#USB XHCIについて
- XHCIではデータ転送はハードウェアが主に実現する
- XHCIではTRB(Transfer Ring Block)という16バイトの制御構造体を用いてデータ転送などを実現する
- TRBは、TRB Ringというリング配列のデータ構造により、メインメモリ領域を介してコントローラドライバとホストコントローラでデータのやり取りを行う
- TRB Ringは次の3つ
    - Transfer TRB
        - USBデバイスとのデータ転送に使用される
        - コントローラドライバによりパイプごとに作成される
        - ホストコントローラが順次取り出して実際の転送を実行する
    - Command TRB
        - USBデバイスの認識プロセスにおけるコマンドの発行やステート遷移に使用される
        - システムに一つだけ存在する
        - ホストコントローラが順次取り出して実行する
    - Event TRB
        - ホストコントローラで発生したイベントをコントローラドライバに通知するために使用される
        - 転送処理、コマンド処理の完了やポートの状態変化の通知など、ハードウェアの状態変化をUSBソフトウェアに伝えるために存在する
        - システムに1つだけ存在する

![TRB_Ring.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294245/45e19302-e8e3-ba36-650f-5c61a2d9f327.png)

##データ転送
- 基本は以下の手順
1. コントローラドライバが送信したいTransfer TRBまたはCommand TRBをTransfer RingまたはCommand Ringについかする
2. コントローラドライバがDoorbell Arrayレジスタに転送したいエンドポイントを設定することで転送開始
3. ホストコントローラがTRBを受信してUSB転送処理を開始する
4. ホストコントローラは処理が完了したことのEvent TRBをEvent Ringに追加
5. ホストコントローラは割り込みを発生させてコントローラドライバに処理が完了したことを通知する
6. Event TRBを取得する

##xhciにおけるステート遷移
###デバイス認識シーケンス
1. xHCにデバイスが接続される
2. PORTSCレジスタのCCSビットとCSCビットが1にセットされる
3. PORTSCレジスタの変化とともに、XHCIはPort Status Change Event TRBを生成し、Event Ringに追加。その後割り込みがあがり、コントローラドライバに通知される。
4. ドライバはデバイスのために、Event Slot Command TRBを発行し、Device Slotをアサインする。ドライバはCommand Completion Event TRBを受け取り、Device SlotのSlot IDを入手できる。
5. ドライバはDevice Slot管理用のDevice Contextの確保と初期化を行う
6. ドライバはAdress Device Command TRB用のInput Contextの確保と初期化を行う。(Enable State)
7. ドライバはAddress Device Command TRBを発行し、デバイス・アドレスの割り当てを行う。この時、バス上では、SET_ADDRESSのControl転送がxHCにより自動実行される。この転送が成功すると、(Block Set Address Request(BSR)が0の時)Enable StateからAddressed Stateに遷移する。(Addressed State)
8. ドライバはGET_DESCRIPTORコントロール転送を発行し、USBデバイスのディスクリプタ情報を取得する
9. ドライバはConfigure Endpoint Command TRBを発行し、デバイスステートをConfigured Stateへ移行し、認識シーケンスが完了する。(Configured State)

※この時、Deconfigure(DC)フラグを1にしてConfigure Endpoint Commandが発行されると、Addressed stateに戻る

![XHCI_State.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294245/6909acfe-68d6-c84c-92f5-6345bf9062b2.png)
Leetcode #20: Valid Parentheses

```swift
func isValid(_ s: String) -> Bool {
    var stack = [Character]()
    for char in s {
        if char == "(" || char == "[" || char == "{" {
            stack.append(char)
        } else {
            if let top = stack.popLast() {
                if (top == "(" && char == ")") || (top == "[" && char == "]") || (top == "{" && char == "}") {
                    continue
                } else {
                   return false
                }
            } else {
                return false
            }
        }
    }
    return stack.isEmpty
}
```
Leetcode #21: Merge Two Sorted Lists

```swift
func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    let dummyHead = ListNode(0)
    dummyHead.next = l1
    var pre = dummyHead
    var n1 = l1
    var n2 = l2
    while n2 != nil {
        var tmp: ListNode?
        while n1 != nil {
            if n1!.val >= n2!.val {
                tmp = n2?.next
                pre.next = n2
                pre = n2!
                n2!.next = n1
                break
            } else {
                pre = n1!
                n1 = n1?.next
            }
        }
        if n1 == nil {
            pre.next = n2
            break
        }
        n2 = tmp
    }
    return dummyHead.next
}
```
基本的なphalcon devtoolコマンドの使い方

#使用可能なコマンドの確認
使用可能なコマンドの確認は「phalcon commands」で行います。
といってもそんなに多くありません。

```shell
$ phalcon commands
Available commands:
  commands         (alias of: list, enumerate)
  controller       (alias of: create-controller)
  module           (alias of: create-module)
  model            (alias of: create-model)
  all-models       (alias of: create-all-models)
  project          (alias of: create-project)
  scaffold         (alias of: create-scaffold)
  migration        (alias of: create-migration)
  webtools         (alias of: create-webtools)
```

基本的にhogeとcreate-hogeはエイリアスとなっているようです。


#プロジェクトの作成

```shell
$ phalcon create-project store
```
storeというディレクトリ名でphalconのプロジェクトが作成されます。


#ビルトインサーバーの起動
phalconのアプリがあるディレクトリまでいき、以下を実行。

```shell
$ php -S localhost:8000 -t /public .htrouter.php
```

#controller作成
Phalcon projectの下で以下を実行
app/controllers/PostController.phpが作成される

```shell
$ phalcon create-controller post
```

#DBとの接続

modelsやscaffoldを使うために、databaseへの接続準備が必要なのですが、
app/config/config.php.で行います。

databaseのセクションを変更します。

```php:app/config/config.php
<?php
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');

return new \Phalcon\Config([
    'database' => [
        'adapter'     => 'Mysql',
        'host'        => 'localhost',
        'username'    => 'root',
        'password'    => 'secret',
        'dbname'      => 'test',
        'charset'     => 'utf8',
    ],
    'application' => [
        'appDir'         => APP_PATH . '/',
        'controllersDir' => APP_PATH . '/controllers/',
        'modelsDir'      => APP_PATH . '/models/',
        'migrationsDir'  => APP_PATH . '/migrations/',
        'viewsDir'       => APP_PATH . '/views/',
        'pluginsDir'     => APP_PATH . '/plugins/',
        'libraryDir'     => APP_PATH . '/library/',
        'cacheDir'       => BASE_PATH . '/cache/',

        // This allows the baseUri to be understand project paths that are not in the root directory
        // of the webpspace.  This will break if the public/index.php entry point is moved or
        // possibly if the web server rewrite rules are changed. This can also be set to a static path.
        'baseUri'        => preg_replace('/public([\/\\])index.php$/', '', $_SERVER["PHP_SELF"]),
    ]
]);
```

#モデルの作成

```ruby:qiita.rb
$ phalcon model Posts
```
Clovaで「抵抗値換算」のスキルを作ってみる（４）

# はじめに
[これ](https://qiita.com/ufoo68/items/e99dceb21c005c28e72a)の続きです。別に続けるつもりは特に無かったのですが、先日作った「抵抗値換算」の審査がリジェクトされたので色々と修正していました。今回はそれについて書きます。もしかしたら今後の参考になるかも？

# Clovaの呼び名が違う
正しくは**「ねぇ、Clova」**です。私は**「ねえ、Clova」**にしてました。何が違ったのかというと「え」じゃなくて「ぇ」だったんです。これは言われないと気付かないぞ。。。

# 音声認識の揺らぎに対応していない
これはどういうことかというと、私のスキルを例とするならば、「橙橙黄金」というカラーコードの並びをClovaに話したとしてClovaは「 大大大大嫌い」や「大大大大飢饉」などと別の読み方もしくは別の漢字として認識してしまうわけです。
この音声認識の評価をしたい場合は、「対話モデルを編集」を開くと左下に「ダッシュボード」と「発話履歴」を切り替えるメニューがあります。音声認識には自分のアカウントで登録したClovaを使ってできます。実際に以下のように誤認識とかが分かって便利です。
![2019-05-11 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/a73dc490-1eb9-0140-ec2b-05eeb0f401cd.png)
![2019-05-11 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/bae389af-a683-0891-6d05-bda02ff9760d.png)
![2019-05-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/fdb58178-ac20-bc07-b2bc-63e4fb3babc0.png)
こういう誤認識はテストしていて結構面白かったです。言葉の読み方があっていても「黄金」が「基金」で漢字としては間違っているからインテントとして扱われなかったり、「灰赤赤金」を「早川亜希」という人名として聞き取ったりしてました。
多分この「抵抗値換算」は色の並びという少し特殊といえば特殊な単語を扱っているわけで、もう少し一般的な単語や人名に変換されたのかな？とか色々な想像ができました。

# 想定しない発話が来ると無言でスキルを終了される
これは普通にうっかり忘れてました。つまりは「何のインテントも受け取れなかったとき」の処理がかけてなかったということです。まあ単純に実装するだけの話なのですが、どうせなので前回までインテントの分岐if文で書いていたところをswitchで分岐させました。こっちの方がコードが見やすくなったと思ってます。というか[この記事](https://qiita.com/miso_develop/items/6b256c1e8757c0ace4a9)でもswitchで分岐させると書いてました。。。

# 「1キロオーム」などというインテントに対して「undefined」と返す
これは前回の記事でも課題点として挙げていました。解決するために「CLOVA.UNIT」のビルトインスロットを使うことを検討することにしました。これは単位つきの数字に対応できるスロットです。
しかし問題が発生しました。何故か知りませんがこいつ「キロ」に全然反応しない！「100メガ」というと単位つきの数字として認識してくれるのに「100キロ」というと単純に「1000」という数字として認識してくれる！！しかし何故か「1キロ」はそのどっちでもない反応をしました。
なんにしろ使えたものじゃないので諦めました。とりあえず問題は単付きの数字に対して「undefined」と返すことだという理解に切り替えて、インテントが「undefined」という文字列を受けたったときには「単位なしの数字でお願いします。」という返しで妥協することにしました。

# おわりに
今回リジェクトをもらったわけですが、運営の方からかなり懇切丁寧に修正箇所とその解決方法も教えてくれたので有難かったです。逆にリジェクトを恐れずにどんどんスキルを出していこうという励みになりました。
とりあえず今回はこんな修正でもう一回申請してみました。またリジェクトが来たら続きの記事を書くかもしれません(笑)。
営業企画部門の人員がPythonをさわっていく話。

## 作成者及び作成の背景
#### 作成者
- 人材系の会社で6年ほど営業企画、データ分析に携わっています。
- Excelの遅い処理、低い再現性に辟易してどうにかして楽をしたく、MySQL→RPA→pythonと触ってきました。
    - 目的に合わせて私は結局こんな具合で使い分けています。
        - mysql+BIツール　＝　毎週同じ集計で、定義が余り変わらないもの
        - python　＝　上記に当てはまらない分析用
        - EXCEL　＝　最終的なアウトプット（共有するにはやっぱり便利）
        - RPA　＝　スクレイピング。分析では使わない。
- pythonについては、書籍とudemyで習得。以下、オススメ。
    - 独学プログラマー コーリー・アルソフによる本
    - https://www.udemy.com/course/python-beginner/
        - 1200～1500円くらいで売ってる時を見計らって購入をオススメ
        - 動画も全部見る必要はなくてpythonのデータの型、モジュールくらいを理解していれば十分


#### 作成の背景
- 私自身が忘れやすく、苦労してドキュメントを読み込んだにもかかわらず忘れてしまう知識をメモっておく場所がほしかった。
- これから営業企画などの分析の道に踏み入る方、EXCELに辟易している方に助力に少しだけでもなれればと思っております。
    - pandasの圧倒的な速度に惚れ惚れしています。（例：60万件×20万件のvlookupに1.5秒）
    - パソコンがくるくるしている時間待つ、みたいな非生産的な時間が少しでも減らせると嬉しいです。

#### その他
- プログラミング本職の方からすると笑ってしまうようなコードを披露しているかもしれません。そこはご容赦頂けると幸いです。

## やることとやらないこと。
#### やること
- pandasで便利だと思ったことの紹介（特に日本語の記事が少ないモノ。英語読むの面倒）
- その他データ分析を行うにあたって便利だと思った機能
    - mysqlとの接続とか？


#### やらないこと
- Pythonの細かな説明
- anacondaなどのインストールの方法など

## 主に使ってるもの
- jupyter lab
- VScode

## 作成物リンク
fhalconで新しいディレクトリを読み込みたい時

fhalconで、
app/formsなどapp以下に新しいディレクトリを読み込みたい場合は、

・app/config/config.php
・app/config/loader.php
・public/index.php

の3つのファイルを以下のように修正する。（以下はapp/formsを加えたいとき）

```php:app/config/config.php
    'application' => [
        'appDir'         => APP_PATH . '/',
        'controllersDir' => APP_PATH . '/controllers/',
        'modelsDir'      => APP_PATH . '/models/',
        'migrationsDir'  => APP_PATH . '/migrations/',
        'viewsDir'       => APP_PATH . '/views/',
        'pluginsDir'     => APP_PATH . '/plugins/',
        'libraryDir'     => APP_PATH . '/library/',
        'cacheDir'       => BASE_PATH . '/cache/',
         //追加
        'formsDir'       => APP_PATH . '/forms/',
```

```php:app/config/loader.php
<?php

$loader = new \Phalcon\Loader();

/**
 * We're a registering a set of directories taken from the configuration file
 */
$loader->registerDirs(
    [
        $config->application->controllersDir,
        $config->application->modelsDir,
         //追加
        $config->application->formsDir
    ]
)->register();

```


```php:public/index.php
// Register an autoloader
$loader = new Loader();

$loader->registerDirs(
    [
        APP_PATH . '/controllers/',
        APP_PATH . '/models/',
         //追加
        APP_PATH . '/forms/', 
    ]
);
```
LLVMの公式WindowsバイナリでWASMを作る

LLVM 8.0 からは、Clangに標準でWASMターゲットが入っている。というわけで、サイトからバイナリをダウンロードしてきて、コンパイルすればWASMが出てくる。今まではツールチェーンを手でビルドする https://qiita.com/chikoski/items/41853dfb2afdec52e7d1 のが一般的な方法だったが、ビルドの再現性とかを考えると公式バイナリが有った方がありがたい。

ただし **ヘッダというかライブラリが無い** 。Emscriptenのを使うか、WASI SDK( https://github.com/CraneStation/wasi-sdk )のようなプロジェクトが成熟するのを待った方が良いだろう。

個人的にもコレ用のヘッダを用意しようとしていて、それは次回のエントリで。。

# バイナリのダウンロード

LLVM の公式サイト( http://llvm.org/ )にダウンロードリンクがあり、 .msi 形式のインストーラがダウンロードできる。 ...zipで良いと思うんだけど。。

- http://releases.llvm.org/download.html#8.0.0

あと、WASMにおけるBinutilsに相当するWABTも公式バイナリが有る( https://github.com/WebAssembly/wabt/releases )ので、ツールチェイン的には揃っていると言える。

# コマンドライン

適当にCMakeのToolchainファイルを書いてみた: https://github.com/okuoku/warpsdk-proto/blob/b38ad74854c2bd4f499379198691fd9c042dfc72/cmake/Modules/Platform/Yuniwarp.cmake

(今のToolchainファイルは、パスの指定を手動でやる必要があるのに注意: https://github.com/okuoku/warpsdk-proto/blob/b38ad74854c2bd4f499379198691fd9c042dfc72/cmake/protopaths.cmake#L4 FIXME: 多分ダウンロード機能とか付けた方が良いかな )

コレといって注意すべきポイントは無いが、 **リンカにexport-dynamicオプションを与えないとシンボルのエクスポートができない** のは微妙かもしれない。

```cmake
set(WARP32_LDFLAGS "-Wl,--no-entry -Wl,--export-dynamic")
```

GitHubの方では `wasm32-warp` を使用しているが、別に `-warp` の部分は無くても良い。 (WARPは今用意しているSDKの名前)


## Windowsホストのためのワークアラウンド

Toolchainファイルでは、

```cmake
# Hacks
if(CMAKE_HOST_WIN32)
    # CMAKE_DIAGNOSE_UNSUPPORTED_CLANG Workaround
    message(STATUS "Disable Host_Win32 (WAR)")
    set(CMAKE_HOST_WIN32)
endif()

# Emscripten hacks
set(CMAKE_SYSTEM_PROCESSOR x86) # We're 32bits
set(WIN32)
set(APPLE)
if(CMAKE_TOOLCHAIN_FILE)
    # Do nothing, just consume the variable
endif()
```

のように、いくつかのCMake変数をundefしている。特に、 `CMAKE_HOST_WIN32` を消しておかないと、CMakeが `clang-cl` を指定しようとして間違えたものとして扱ってしまうため、正常にconfigureできなくなってしまう。

## .c → .o のコマンドライン

```
clang.exe --target=wasm32 -o <出力> -c <入力.c>
```

SDKが有る場合、そのヘッダの場所は `--sysroot=<ルートディレクトリ>` で指定できる。

このコマンドラインで出力される `.o ` は **WASM形式になる** 。このため、Emscriptenのような通常のWASM開発環境同様の処理をしたければ、 `-emit-llvm` するなりしてLLVM bitcodeを代わりに出力し、リンク時にLTOされるようにした方が良いだろう。

## リンクのコマンドライン

```
clang.exe -Wl,--no-entry -Wl,--export-dynamic -nostdlib --target=wasm32 -o <出力> <入力...>
```

`--target=wasm32` オプションを指定することで、同梱の `wasm-ld` コマンドを使用して1つのWASMにリンクしてくれる。

`--no-entry` オプションは、 `_start` 関数を自動的に呼び出す挙動を抑止する。

# SDKは？

この環境にはコンパイラしかないので、 `printf` とか `malloc` みたいな普通のC標準関数はどこか別のところから持ってくる必要がある。

今のところ、言わずと知れた Emscripten がWASMのSDKとしては最も普及しているが、今後はClang側のフロントエンドを直接利用した様々なSDKが出てくるのではないかと個人的には予想している。最も有力なのはWASI( https://wasi.dev/ )で、既にMUSLとCloudlibcベースの移植( https://github.com/CraneStation/wasi-sysroot )や、そのSDK(WASI-sdk)も動き出している。

特にWASIはnpmのような重要なプラットフォーマーが既に支持を表明し、GNU autoconfもWASIをプラットフォームとして認識する( http://lists.gnu.org/archive/html/config-patches/2019-04/msg00001.html )等それなりに実装が進んでいる。

個人的にはWASIやEmscriptenの抽象化はWASMのポテンシャルを生かすには不十分だと思っていて、もうちょっと用途を絞ったプロファイルを複数用意するのが良いと考えている。例えば、WASIでは `fd` を直接アプリケーションに見せているが、ゲームを配布するような目的であればSDLの各種APIさえ見せれば十分なのでオーバースペックと言える。
モデルにロジックを書いてみる

　やはり、モデルにロジックを書くことがプログラミングの醍醐味ではないかな、と思います。
今回は、コントローラに書いた記述をモデルにロジックとして移行してみます！


# controllerの記述
- 実装内容
テーブルのデータを降順、昇順にする

- コード


```rb:texts_contoroller.rb
class TextsController < ApplicationController
 
    def index
       if request.fullpath.include?('desc')
           @texts = Text.all.desc_sort
           @sort = "asc"
       else
           @texts = Text.all.asc_sort
           @sort = "desc"
       end
    end
end
```

```rb:text.rb
class Text < ApplicationRecord
    
    scope :asc_sort, ->{ order(id: :asc)}
    scope :desc_sort, ->{ order(id: :desc)}
end
```

```rb:index.html.erb
<%= link_to 'スキル', texts_path(id: @sort) %>
```

上記の記述の説明は一つ前の記事に掲載しています。



#モデルにてロジックを書く
それでは、早速上記のコントローラをロジックに移行していきましょう。

まず、目指すべきなのは上記の実装をメソッド化することです。
そうすれば、子クラスで同一の実装をするときにすぐに呼び出せますよね。

私はこのように書きました。


```rb:texts_controller.rb
class TextsController < ApplicationController

    def index
        path_desc = request.fullpath.include?('desc')
        @texts = Text.data_sort(path_desc)
        @sort = Text.sort_key(path_desc)
    end

end
```

```rb:text.rb
class Text < ApplicationRecord
    
    scope :asc_sort, ->{ order(id: :asc)}
    scope :desc_sort, ->{ order(id: :desc)}

    def self.data_sort(path)
        if path
            Text.all.desc_sort
        else
            Text.all.asc_sort
        end
    end
    
    def self.sort_key(path)
        if path
            "asc"
        else
            "desc"
        end
    end

end
```

- [x] メソッドの引数にpathを設定
- [x] メソッド内でpathによる条件分岐→pathにパラメータを割り振っている状態
- [x] １番目のメソッドで実際に昇順、降順の並び替えを実施
- [x] ２番目のメソッドはpathへのパラメータを割り振る用のメソッド、文字列をstringsクラスにすることを忘れない  


これからもどんどんロジック書いていきます！
2段のサーバを経由してWinSCPを使う

# 状況
環境を次のように仮定する。localからはalphaのみにSSH接続可能。そこからbetaを経由して目的のgammaに接続できる。
![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408827/46094104-15fc-a11c-bfa5-623c712d2119.png)

Windows Subsystem for LinuxでUbuntu18.04を使用。~/.ssh/configに以下のように記述しておく。

```~/.ssh/config
Host alpha
     HostName alpha.example.com
     Port 22
     User mura
     PasswordAuthentication yes
Host beta
     HostName beta.example.com
     Port 22
     User mura
     PasswordAuthentication yes
     ProxyCommand ssh -W %h:%p alpha
Host gamma
     HostName gamma.example.com
     Port 22
     User mura
     PasswordAuthentication yes
     ProxyCommand ssh -W %h:%p beta
```

こうすると、例えばlocalにおいてgammaからファイルをダウンロードするときは

```
scp gamma:~/hoge/fuga/baz.dat ./
```

などとできるが、gammaの対象ディレクトリが深くなると面倒である。

# 踏み台サーバ経由のSCP

Windowsでよく利用されるFTPクライアントとしてWinSCPがある。

WinSCPでは踏み台サーバが一つの場合トンネル設定により目的のサーバにアクセスできる。しかしトンネルの数を増やすことはできない。2段以上になったときにできることはないか調べてみると次のようなページを発見した。

+ [WinSCPで多段階接続をする](http://sigtech.hatenablog.com/entry/2014/10/17/181050)
+ [RLogin と WinSCP を使って多段 SSH 経由で SCP を利用する](https://mseeeen.msen.jp/scp-through-cascaded-ssh-with-rlogin-and-winscp/
)

これらの記事にはPutty・Rloginを使うとできるとあるが、WSLを使っている身としては新たにクライアントをインストールするのは癪なのでなんとかしたい。

PuttyやRloginがやってることはポートフォワーディングなので、UbuntuのSSHコマンドで同じ動作が達成できればよい。

# WSLでやってみる

WinSCPのプロキシ形式でSOCKS5を利用する場合はWSLのUbuntuで以下のように入力すればよい。alphaのパスワードを入力すると何も起こらないように見えるが、きちんと動作している。
参考ページは[ここ](http://note.crohaco.net/2017/ssh-tunnel/)。

```
ssh alpha -fND localhost:10022
```

####オプションの説明
f: バックグラウンドで動作
N: 何もしない
D: 動的フォワーディング
-fNでつなぎっぱなしを意味する。


#WinSCP側の設定

新しい接続先にgammaのホスト名・ポート番号・ユーザ名を入力し、詳細タブを選択する。
![winscp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408827/9efa19fe-a2be-69b8-ddef-72c58e577264.png)

プロキシ形式でSOCKS5を選択。Ubuntuで入力したコマンドに従ってプロキシホスト名(localhost)とポート番号(10022)を入力し、「ローカルホストからもプロキシ接続を行う」にチェックを入れる。
![proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408827/80999ea9-1ec7-8626-134c-299631d81d17.png)



トンネルタブに移って「SSHトンネルを経由して接続する」にチェック。サーバbetaの情報を入力。
![tunnel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408827/0a8c4661-47b7-f8eb-e888-eedc2e7c7a53.png)


OKを押して設定を保存する。あとはログインボタンを押してbetaとgammaのパスワードを入力すれば接続できる。



#余談

今回は2段の踏み台サーバを経由したが、目的サーバの2つ前のサーバまでトンネルを掘れば原理的には何段でも使えると思われる。


あと、コネクションを削除するときには該当プロセスを以下のように探すことができる。
[SSHでトンネリング](https://nksg.org/archives/13)

```
ps aux | grep ssh
```
Programming in Haskell 第2版 目次の雑和訳

# Programming in Haskell 第2版 目次の雑和訳

名著と名高いProgramming in Haskellが第2版になって、[構成等が色々改善されて結構良いらしいという話](https://qiita.com/waddlaw/items/dd926462d398c4cbd019)は噂には聞いていたものの、実際どういう構成なのか調べようにもなかなか出てきませんでした(自分のググ力が低いだけかもしれません)。
悩んでも仕方がないし、もう買うか、と思い切って買ったので、今後自分みたいに購入に二の足を踏む人がなるべく減るように、目次を雑に和訳してみたいと思います。

※私はまだこの本を目次以外まだ1ページも開いていません。
※タイトルの通りかなり雑な和訳です。間違いがあればぜひ教えて下さい。

## Part Ⅰ 基本概念

### 1. 導入
### 2. 初めの1歩
### 3. 型とクラス
### 4. 関数定義
### 5. リスト内包表記
### 6. 再帰関数
### 7. 高階関数
### 8. 型とクラスの宣言
### 9. カウントダウン問題

## Part Ⅱ

### 10. 対話プログラミング
### 11. 絶対に打ち負かせられない3目並べ
### 12. モナドとその他
### 13. モナディックな構文解析
### 14. 畳み込み可能(Foldables)とその仲間
### 15. 遅延評価
### 16. プログラムの推論
### 17. 計算するコンパイラ

## 付録A 問題の解答

## 付録B 標準ライブラリ(prelude)
Leetcode #22: Generate Parentheses

```swift
func generateParenthesis(_ n: Int) -> [String] {
    var answer = [String]()
    helper(0, 0, n, "", &answer)
    return answer
}

private func helper(_ left: Int, _ right: Int, _ n: Int, _ str: String, _ answer: inout [String]) {
    if right > left || left > n {
        return
    }
    if left == n && right == n {
        answer.append(str)
        return
    }
    helper(left+1, right, n, str+"(", &answer)
    helper(left, right+1, n, str+")", &answer)
}
```
= ale.vimとQuickRunでstack環境を使う

デフォルトだとグローバルに存在する`ghc`や`runhaskell`を使ってしまい、`stack`で入れたパッケージが使えない。

**追記(2019/05/12): ALEの設定はまだうまくいってないかもしれません（ただ単に全てのエラーが表示されなくなった気がする）**

# ALEの設定

(ALEはリントツール等用のみで使用し、Lspは`vim-lsp`に任せているため使用していません。)
`ale_linters`で`stack-ghc`を指定してあげます


```vim
let g:ale_linters = {
    \ 'haskell': ['stack-ghc'],
    \ }
```

また、この時**`hie`等も同時に指定しない**ようにしてください。自分の環境だと動きませんでした。

# QuickRun

`g:quickrun_config.haskell`を作成し、設定を書き込んでやります。

```vim
let g:quickrun_config = {}
let g:quickrun_config.haskell = {'command': 'stack',
                                \'cmdopt': 'runhaskell',
                                \}
```

ここで**'`command': 'stack runhaskell'`としない**ことが重要です。
そうした場合、「そんなもんねーよ！」と怒られてしまいます。



[2019-05-11 21:59]
【論文紹介】3次元点群位置合わせのための反復座標変換を行う深層学習

# 紹介する論文

[Wentao Yuan, David Held, Christoph Mertz, and Martial Hebert. "Iterative Transformer Network for 3D Point Cloud," arXiv, 2018.](https://arxiv.org/pdf/1811.11209.pdf)



# 論文の要約

- ターゲット点群に対して，入力のソース点群を位置合わせするための変換を求めるネットワークの学習を行う
- 1度の位置合わせでは完全に合わないので，反復（iterative）して変換を行う（Iterative Transformer Network: IT-Net）
- 対応点探索を行わずに，ICPスキャンマッチングと類似の挙動を示す位置合わせを行うことができるようになる



# はじめに

Iterativeとは「反復」という意味です．自己位置推定や点群位置合わせ（Alignment）の文脈では「2つのデータを反復計算により最適化することで照合する」というような意味で良く使われています．代表的なものとして，[Iterative Closest Point（ICP）スキャンマッチング](http://www-evasion.inrialpes.fr/people/Franck.Hetroy/Teaching/ProjetsImage/2007/Bib/besl_mckay-pami1992.pdf)という方法があり，これは2つの点群を位置合わせするために利用できます．本論文では，これを深層学習を用いて行う方法を提案しています．



# IT-Net

Iterative Transformer Network（IT-Net）は，1つの点群（ソース点群）を受け取り，もう1つの点群（ターゲット点群）に対応する座標変換を予測します．3次元空間での座標変換を行うためには，3×3の回転行列（yaw，roll，pitch角の成分に対して決まる行列）と3次元の平行移動ベクトルを求める必要があります．なお変数の都合上，回転行列を予測する際にはクォータニオンが良く使われます．なのでIT-Netは，クォータニオン（4成分）と平行移動ベクトル（3成分）の7成分を予測します．なお，トレーニング用のデータは著者ら自身が用意しているようです．



# LK法とICP

画像処理において有名なアルゴリズムであるLucas-Kanade（LK）法は，ソース画像とターゲット画像を反復計算により位置合わせする方法です（KLに関しては，Webで検索すれば大量の関連記事がヒットします）．また前述の通りICPは，2つの点群を反復計算により位置合わせを行います．どちらの方法でも，2つのデータ間での誤差を定義し，その誤差に基づくコスト関数を作成します．そして，コスト関数の位置・姿勢に関する勾配（偏微分）を求め，最小のコストになる状態（最適状態）を求めます．

![it-net_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329950/193be57f-d4f7-3b55-6127-64bfb4d2e2d4.png)

上図（論文中図4）にIT-Netによる位置合わせの概略が示されており，IT-NetもLKやICPの様な反復計算に基づいて実装されています．最初にソース点群をネットワークに入力し，座標変換を予測します．そして，予測された座標変換を作用したソース点群をさらにネットワークに入力し，新たな座標変換を予測します．これらの処理を繰り返し行い（反復し），得られた座標変換を全て掛け合わせると，最終的な座標変換の値を求めることができます．

![rotation_translation_magnitudes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329950/9e30dfd3-c683-dc9f-38ea-78a6665362f4.png)

なお，このような反復計算は，基本的に反復回数が増えるほど座標変換による移動量（Magnitude）の大きさが減っていきます．これは，最適状態に近づくほどコスト関数の勾配が緩やかになるためです．IT-Netでもこの様な現象が観測されるようで，上図（論文中図5）には反復回数が増えるほど移動量が下がっていくことが示されています．



# 感想

End-to-Endで位置合わせをしようとすると，素直にソース点群とターゲット点群間の座標変換のみを求める実装になると思います．しかし本論文で紹介している方法では，反復計算を行う方法になります．確かにEnd-to-Endで学習してしまうよりも，位置合わせの性能が上がることは直感的も想像できます．

End-to-Endの位置合わせでもそうですが，このような位置合わせに深層学習を使う最大のメリットは，**2つのデータ間の対応点探索を省けることにある**と思います．一般に対応点探索さえ完璧にできれば，おおよその位置合わせは最適化することで正しく解けます．しかしデータにはノイズなどが含まれるため，この対応点探索は極めて難しい問題となります．このような問題をデータドリブンに解けることこそ，深層学習の強みと言えると思います．

しかし，やはりどうしてうまく位置合わせができるかどうかを示せないことは弱点だと思います．深層学習で対応を求め，その対応が正しいかどうか検定する，なんて方法を採用すると，良い手法になるのかもしれません．
AWSでhttps化

AWS上で動いてるシンプルなWebアプリケーションをhttps化させたのでその手順を残しておきます。

# 構成図
目指すインフラ構成は下図のとおりです。

![https通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/40ed9c05-3110-e0dc-34c6-ba34c7b3661a.png)

RDSは今回直接的に関係ないです。

# 必要な手順

- AWS Certificate Manager(ACM)でSSL証明書の発行
- ALBにhttpsの設定を入れて作成
- Route53でAレコードのエイリアスを作成

## AWS Certificate Manager(ACM)でSSL証明書の発行

まず証明書が必要になるのでAmazon Certificate Manager(ACM)を使って作成します。
証明書のプロビジョンニングから進みます。

<img width="1430" alt="スクリーンショット 2019-05-11 19.34.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/79dc03a7-52b7-e329-b424-f349d731012e.png">

パプリック証明書のリクエストにチェックして証明書のリクエストボタンを押す

<img width="1417" alt="スクリーンショット 2019-05-11 19.37.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/57bb913a-9e25-310d-4257-865c00c3ff2b.png">

登録したいドメインを入力します。特定のサブドメイン以外も含めておきたい場合は添付画像のようにワイルドカードを指定しておきます
<img width="1384" alt="スクリーンショット 2019-05-11 19.39.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/47250721-f2f5-067d-b5cd-24a4c2119d16.png">

ネームサーバにRoute53で設定したものを使ってる時はDNSの検証を選ぶと楽に進められます。

<img width="1407" alt="スクリーンショット 2019-05-11 19.39.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/3d200d37-d97a-4e40-08a4-b35f17601d1d.png">

確認画面で問題ないことが確認できたら次の画面に進みます。

次は検証のための設定画面です。
テストドメインでやったら出ませんでしたが、指定したドメインに関連するレコードセットが存在すればそこに直接追加するボタンが出てくるはず(出現条件は不明)なのでそこから登録します。

![スクリーンショット 2019-05-11 19.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/53e0926e-950c-5ba2-7617-ae8052ecc5b9.png)

あとは検証が終わるまで待機です。

## ALBにhttpsの設定を入れて作成

証明書ができたらロードバランサーに登録します。
今回はALBを使います。

<img width="1418" alt="スクリーンショット 2019-05-11 20.03.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/195108af-ec34-8d4c-0b8a-402c1bfdc815.png">

プロトコルにHTTPSを追加します。

<img width="1437" alt="スクリーンショット 2019-05-11 20.03.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/098d2b89-3469-1835-6b71-45ad51365c5c.png">

名前やサブネットの設定は適宜行ないます。

先ほど作成した証明書を選択します。

<img width="1413" alt="スクリーンショット 2019-05-11 20.04.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/00dd2be5-fa09-e057-d43a-cb5d5c6d8232.png">

セキュリティグループはhttpとhttpsの通信を許可する設定になっているものを選んだらOKです。

あとは各々の設定。

作成されたらDNS名を確認します。ここに記載があるものをRoute53に設定します。

![スクリーンショット 2019-05-11 21.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/d3824359-12cc-9764-f3d7-db5b467641db.png)


## Route53でAレコードのエイリアスを作成

利用するホストゾーンに1つレコードセットを追加します。

先ほど出力されたDNS名をエイリアス先に指定します。
画像は編集画面ですが追加時も同じ画面がでます。

![スクリーンショット 2019-05-11 21.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13766/86069e98-577c-6312-de42-a4167a1c8659.png)

あとは反映されたらAWS側で設定は完了です。

# 最後に

SSL証明書にはお金がかかりませんが、ALBを使うのにお金がかかってしまうので完全に無料というわけには行かないですが、この方法でhttpsが実現できます。
とても簡単なので試してみるには良い環境でした。
WSL上でRspecのSystem Specを使った時のエラー

[現場Rails](https://book.mynavi.jp/ec/products/detail/id=93905)でWSLの環境上でRspecの章を進めているときにエラーに躓いたのでメモ

###環境
ruby 2.5.1
rails 5.2.3
WSL(Ubuntu18.04)
Chromeブラウザ バージョン: 74.0.3729.131

ｇｇると同じ症状の方が見当たりました

[『Ruby on Rails 5 速習実践ガイド』のRSpecの実行部分でテストが通らなく詰まっています。](https://teratail.com/questions/187391)

上記のteratailの回答で、こちらのサイトを参考にされていて、

[WSL Ubuntu 上で chromedriver を使った System Spec を動かす](https://gist.github.com/upinetree/fb71a947cc100e7918b7b280485d620c#%E5%AF%BE%E7%AD%96a-chromedriver-helper-%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%AB%E8%87%AA%E5%88%86%E3%81%A7-chromedriver-%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

上記のサイトの方法を引用します

>対策A. chromedriver-helper を使わずに、自分で >chromedriver を設定する
>chromedriver-helper を Gemfile から削除。

>```- gem 'chromedriver-helper'```
>chromedriver.exe を直接ダウンロード。

>http://chromedriver.chromium.org/downloads

>適当なところへ配置。今回は C:\Program >Files\chromedriver_win32\chromedriver.exe とした。

>パスを Selenium Webdriver に教えてあげる。

>```# spec/spec_helper.rb
require 'selenium-webdriver'
Selenium::WebDriver::Chrome.driver_path = "/mnt/c/Program Files/chromedriver_win32/chromedriver.exe"```


###注意！
このとき、インストールするchromedriverのバージョンは自分のインストールしてるchromeのバージョンに合わせる
「chromeブラウザのヘルプ→Google Chromeについて」で、ブラウザのバージョンがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304952/b11fd22b-c231-ec2a-bd09-4aa9f4c07fa0.png)

例：バージョン「74....」だったから、74.xxxのchromedriverを入れる

もしバージョン違いをいれてもこんな感じでエラーメッセージが出てくるからわかりやすいはず
例：バージョン74.xのブラウザを使っているのに75.xのchromedriverを入れてしまった場合

```
Selenium::WebDriver::Error::SessionNotCreatedError:
            session not created: This version of ChromeDriver only supports Chrome version 75
```
Qiita(2) 編集リクエスト

Qiita の機能である「編集リクエスト」で、単純なことだけを送るようにしている。

# タグの＃付き
自分でも数度したことがある。
twitter, facebookなど他のシステムではタグには＃をつけることがある。
そこで#をつけてしまう。

単純で＃を取るだけ。

編集リクエストになじむ。なお、編集リクエストでは

「タグに＃はいりません」
" tag should have no #."

と書くかもしれません。


# 編集リクエスト一覧
編集リクエストを送るまえに、編集リクエスト一覧を見るとよい。

画面上の表題の右の　... 印を押す。

<img width="192" alt="編集リクエスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/a0cb8b13-60ac-aaed-3c42-50842e452323.png">

編集リクエスト一覧を押す

<img width="435" alt="未処理.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/032dd943-7e28-3818-d9ac-858b4f2b8388.png">

なお、タグへの編集リクエストと、他の編集リクエストは一緒に送らない方がよい。
すぐに判断して受け入れるのが早くなる。

## 失敗１

すでにタグ編集の編集リクエストが送られているのに編集リクエストを送った。

## 失敗２

もっとひどい。
自分がすでに編集の編集リクエストが送ったのに、もう一度編集リクエストを送った。

ごめんなさい。
再発防止のために記事に。

p.s.
他の方の編集リクエストが１年以上前にあって、修正されていない場合には、思い出していただくために、編集リクエストをお送りしようと思います。

# コマンド、ファイルなどのための ```

コマンド、ファイルなどを示す｀｀｀は、Qiitaの見やすさの一つで、わかりやすくする機能。
｀｀｀の前に空白行がない場合などにも編集リクエストをお送りする。

他の編集リクエストとは独立して送る。

p.s.
複雑な編集リクエストを送ると、すでに著者が編集していると、エラーになって、わけがわからなくなるかもしれない。Qiitaのシステムのバグの地雷をふむかもしれない。

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 20190513
ver. 0.02 補足 20190514
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Leetcode #24: Swap Nodes in Pairs

```swift
func swapPairs(_ head: ListNode?) -> ListNode? {
    var dummyHead = ListNode(0)
    var current = dummyHead
    dummyHead.next = head
    while current.next?.next != nil {
        let tmp = current.next!.next!.next
        let first = current.next!
        current.next = current.next!.next
        current.next!.next = first
        first.next = tmp
        current = current.next!.next!
    }
    return dummyHead.next
}
```
【型ってかなり良いんじゃないかなと思った】レガシーをぶっつぶせ。現場でDDD！に参加してみて #genbadeDDD

# セミナーを終えて、今後意識しようと思ったこと

- 新しいことをやるには、まず小さく始める。
- ビジネスルール、ビジネス戦略、ドメインオブジェクト、ドメインモデルの4象限を行ったり来たりしてよいドメインモデルを探求してゆく。
- ステークホルダーと共通認識を得るための言葉（ユビキタス言語）を育ててゆく。認識が取れずに重大障害になることがあるので、特にビジネスサイドとITサイドでの認識合わせは意味がある。

# 本文
参加イベント概要は[こちら](https://genbade-ddd.connpass.com/event/127494/?utm_campaign=event_reminder&utm_source=notifications&utm_medium=email&utm_content=detail_btn)。

今までスクリプト言語ばかり触ってきて、静的型付け言語はJavaを新人研修で少しだけ、って感じだったので、今日の話は目から鱗だった。

静的型付け言語にアレルギーを持っていたけど、一気に払拭された気分だ。

ビジネスに必要なデータを「型」として定義し、データの種類とその有効範囲、そしてデータへの操作も含めて記述する。そうすることで、**ビジネスルールをソースコードに表明できる。可視化できるのだ**。

最初は「レガシーをぶっつぶせ！」なんて煽り気味のタイトルに惹かれたけれど、たまたま今月から入ったプロジェクトが正にレガシーの嵐で共感しきりだった。

なんせ現場はドキュメントが全く無く、担当者任せの秘伝のタレコードだらけ。
ビジネスロジックとI/Oロジックがごっちゃになった10000行のグローバル変数まみれのスクリプトコードというシロモノだ。これは胃が痛い。

だから、型としてコードにビジネスルールを記述できるのはとても良い方法だ。
プログラムの意図しないデータパターンを排除して組合せ爆発を回避できる。
テストコードの数も減らせる。

ソフトウェアの根本にある複雑さというのは、ソフトウェアが表現しているドメイン（ビジネスそのもの）が複雑だから起きるもの。だからココに振り切ってドメインロジックを複雑にしないようにすることがカギになるという。
**ビジネスは、ルールの適用条件による条件分岐がコアとなる複雑さだ**。単に、扱うデータ量が増えただとかいった類のものは、処理が面倒になるかもしれないが複雑というわけではないのだ。

そう、一律定時ではなくてフレックスタイムを導入しようとか、テレワークを導入しようだとか、そういった「条件分岐」がソフトウェアの複雑さを加速させる。

こういった複雑なビジネスルールを、ドメインオブジェクトやドメインモデルといった形で整理できれば、とても面白いことになりそうだ。
データモデリングと同じような感じだ。

**いままで、ただただ面倒だと思っていた、年末調整や確定申告、標準報酬月額の集計、その他沢山の役所対応をするときに、読むのを躊躇っていた超絶に複雑な手引書を、これからはドメインモデリングのトレーニングとして使ってみよう**。楽しくなるかもしれない。

登壇者の人たちが、現場でもがいた知見を展開してくれたことが、ただ有り難かった。
最初はどこか、「やっぱり大手企業は凄い人たちが揃ってるから出来るんだろーな」と、どこか遠い国の話のような、そんな感じで聞いていた。

でもセミナーの最後に主催の安西さんがこう言った。

>セミナーでの話は、言語化された整理された話。最初からうまくいったように見えるが、そんなことはない。みんな泥にまみれてきた。**だからいま現場で泥沼でもがいていて、なんとかしようとしている経験こそが大切なもの**なので頑張ってください。一緒にがんばりましょう

だから自分も頑張ろうと思う。
ubuntuのローカルタイムを変更する

# 環境
```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.6 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.6 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

# 現在の時間確認
```
$ date
Sat May 11 12:29:50 UTC 2019
```

または

```
$ timedatectl
      Local time: Sat 2019-05-11 12:30:32 UTC
  Universal time: Sat 2019-05-11 12:30:32 UTC
        Timezone: Etc/UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

# 時間を日本時間に変更する
```
$ timedatectl set-timezone Asia/Tokyo
```

# 再確認
```
$ date                                    
Sat May 11 21:32:39 JST 2019

$ timedatectl                                                                                                                                                   
      Local time: Sat 2019-05-11 21:32:45 JST
  Universal time: Sat 2019-05-11 12:32:45 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

# その他
### 変更できるtimezone一覧
```
$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
...
```

### 時間指定する場合
```
$ timedatectl set-time "2019-05-01 00:00:00"
```
プログラミング学習記録84〜JavaScriptで三択クイズ〜

##今日やったこと
- ドットインストール「JavaScriptでストップウォッチを作ろう」で作ったものをYoutubeに投稿
- ドットインストール「JavaScriptで三択クイズを作ろう」で三択クイズを作り、YouTubeに投稿

###ストップウォッチ
昨日作ったストップウォッチを画面収録で撮ったものです。
https://youtu.be/fm8QJx5h21E

ソースコードはこちらです。
https://github.com/yuta-kinu/MyStopwatch  しばらく経ってからコードを見ても理解できるように、コメントを加えまくっています。



###「JavaScriptで三択クイズを作ろう」
全体的に色のバランスがいいなと思いました。


`フィッシャー・イェーツのシャッフル`というアルゴリズムを使って、問題の選択肢をシャッフルしました。

アルゴリズムに関する解説が＃０８の動画でされており、わかりやすかったです。

また、全ての問題を解いた後に表示されるアラートのようなものの実装の仕方が面白いなと思いました。

アラートのように出てくるのですが、実際は最初から画面外の見えないところにいて、全ての問題を解き終えたら見える位置に出てくるという感じです。

今回も作った後、実際に動かしている様子を画面収録してYouTubeに投稿しました。
https://youtu.be/QBRqWZvWF4g

ソースコードはこちらです。
https://github.com/yuta-kinu/MyQuizApp

ドットインストールのJavaScript(ES2017)がだいぶ進みました。

この調子で明日からも引き続き頑張りたいと思います。

おわり