OmniAICreator/Qiita-1.07M huggingface dataset:
CloudWatch Logsにマイクロ秒を認識してもらう

## 事象
ApacheのエラーログをCloudWatch Logsに転送してみたところ、AWSコンソール上に表示される時間がズレてることに気づいた。

転送されてるエラーログをよくよく見てみたところ、以下のようにマイクロ秒まで出力されてました。

```
[Wed Sep 05 17:05:21.280472 2018] ログメッセージ......
```

## 対応

そこで、転送元サーバ側で以下のようにフォーマット修正したところ、ログファイルとAWSコンソールの表示時間が一致した。

```:/etc/awslogs/awslogs.conf
#datetime_format = [%a %b %d %H:%M:%S %Y]
datetime_format = [%a %b %d %H:%M:%S.%f %Y]
```

めでたし。:blush:


参考

- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html
- https://dev.classmethod.jp/cloud/cloudwatch-logs-apache/
java.net.ConnectException: Connection timed out: connect

# java.net.ConnectException：Connection timed out
ionic cordova build --release android
のコマンドの中で出てきました。
## 原因
1. URLが同じPCのWebブラウザーで正常に動作する場合
　-> ブラウザーに接続するために使用しているHTTPプロキシをJAVAコードが使用していない可能性がある
(https://code.i-harness.com/ja/q/15328)

???

-> java.net.ConnectExceptionで検索
(https://docs.oracle.com/javase/jp/6/api/java/net/ConnectException.html)
ソケットをリモートアドレスとポートに接続しようとした際にエラーが発生したことを通知します。接続はおそらく、リモートで拒否されました (リモートのアドレス/ポートでプロセスが待機していないなど)。

-> java.net.ConnectException：Connection timed out  ionicで検索
(https://forum.ionicframework.com/t/error-when-building-for-android-behind-a-proxy/61320)
proxyのせいかもしれないので
ionicのplatforms/androidの中のproject.propertiesに以下を記載。
私の場合はファイル自体がなかったので作成しました。

systemProp.http.proxyHost=(プロキシサーバーのホスト名)
systemProp.http.proxyPort=(プロキシサーバーのポート)
systemProp.https.proxyHost=(プロキシサーバーのホスト名)
systemProp.https.proxyPort=(プロキシサーバーのポート)

...To Be Continued
【Swift4】メソッド一発で配列をグルーピング

## `Dictionary.init(grouping:by:)` を使って簡単なデモ
Swift4から新しく追加された関数で、TableViewで表示されている内容を任意の条件でグルーピングして表示したい時にかなり使えます！

##関数の説明(ざっくり)
説明しなくてもいいからリファレンス見せろって人は[こちら](http！://developer.apple.com/documentation/swift/dictionary/2995342-init)にリンク貼っておきます
ざっくり説明すると、groupingの後に同じ型の配列を引数として与え、byの後はグルーピンしたい要素を引数として与えると、グルーピングされた辞書が返ってきます。

##実装

**大学の授業という構造体を作りグルーピング**

```groupingExample.swift

//授業を構造体で定義します
//難易度をDifficultyという列挙型で定義します
struct Lesson {
    let name: String
    let credit: Int
    let difficulty: Difficulty
    
    enum Difficulty: Hashable {
        case A,B,C,D
    }
}

//授業型の配列を作成します
var lessonList: [Lesson] = [Lesson.init(name: "統計学", credit: 1, difficulty: .B),
                        Lesson.init(name: "会計学", credit: 2, difficulty: .C),
                        Lesson.init(name: "微分", credit: 2, difficulty: .A),
                        Lesson.init(name: "マクロ経済学", credit: 2, difficulty: .B),
                        Lesson.init(name: "ミクロ経済学", credit: 2, difficulty: .C),
                        Lesson.init(name: "英語", credit: 2, difficulty: .D),
                        Lesson.init(name: "積分", credit: 2, difficulty: .B),
                        Lesson.init(name: "線形代数", credit: 2, difficulty: .B),
                        Lesson.init(name: "中国語", credit: 2, difficulty: .C),
                        Lesson.init(name: "社会学", credit: 2, difficulty: .C)]

// 授業型の任意のプロパティを指定して、プロパティの値毎にグルーピングした辞書を返します
let groupedDicationary = Dictionary.init(grouping: lessonList, by: { (lesson) -> Lesson.Difficulty  in
    return lesson.difficulty
})

```

**次回は上記のコードを使いながらTableViewで実装してみたいと思います！**
Dockerで簡易WebDAVサーバを作る

社内で急遽WebDAVサーバを使った検証を行わなければならなかったので、どうせならと思い勉強中のDockerで構築してみました。
Docker便利ですね。
（初めて自分で考えてDockerfile書きました……。

## WebDAVサーバ
とりあえず動けばいいのでApacheで。
LOCKも使えるようにしてみました。

## Dockerfile
一旦httpdのイメージを使って、WebDAVサーバとしての設定をしてみました。
その後、それをコマンドとしてDockerfileに落とし込んでいます。
デフォルトがDigest認証になってたのでそれに合わせてます。
ビルド時にパスワードとかユーザとか変えられた方がいいかなと思い、`user.passwd`を読み込んだりユーザ名変えられるようにしてます。

```dockerfile:Dockerfile
FROM httpd:2.4
RUN sed -i \
        -e 's/^#\(Include .*httpd-dav.conf\)/\1/' \
        -e 's/^#\(LoadModule .*mod_auth_digest.so\)/\1/' \
        -e 's/^#\(LoadModule .*mod_dav.so\)/\1/' \
        -e 's/^#\(LoadModule .*mod_dav_fs.so\)/\1/' \
        -e 's/^#\(LoadModule .*mod_dav_lock.so\)/\1/' \
        conf/httpd.conf \
    && mkdir -m 700 /usr/local/apache2/var \
    && chown daemon. /usr/local/apache2/var/ \
    && mkdir -m 700 /usr/local/apache2/uploads \
    && chown daemon. /usr/local/apache2/uploads/ \
    && sed -i \
        -e 's/POST OPTIONS/POST OPTIONS LOCK/g' \
        -e 's/Require user admin/Require user admin/g' \
        conf/extra/httpd-dav.conf \
    && apt-get -y update \
    && apt-get -y install vim
ADD ./user.passwd /usr/local/apache2/
EXPOSE 80
CMD ["httpd-foreground"]
```

## Docker Hub
作ったイメージですが、どうせならと思い、Docker Hubに登録してみました。
githubのリポジトリと連携すると自動でビルドしてくれるみたいですね。
ちょっとやってみました。
https://hub.docker.com/r/kxn4t/webdav-docker/
もし試されたい方がいらっしゃいましたら、上記URLをご参照願います。
chroot で制限したルートディレクトリ外へアクセスさせたい。

## はじめに
[この前の記事](https://qiita.com/nis_nagaid_1984/items/1205552eba8bcdfb6400)の続きみたいなもの。
chroot で制限されているルートディレクトリ外へのアクセスをするにはどうするのか。

~~シンボリックリンク~~
じゃくなくて、`mount` コマンド。
`mount` コマンドに `bind` オプションがあるので、これを使えば可能。

```bash
mount --bind [マウント元ディレクトリ] [マウント先ディレクトリ]
```

多用すると chroot の意味が無くなるので使いすぎ注意。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
PowerShell を使った、 git のまとめて unstage


initial commit 時、.gitignore に追加するべきだったのにその前に staging してしまった。
それらの一部をまとめて unstage

``` powershell
git status | ?{$_.Contains("hoge")} | %{$_.Split() | select -l 1} | %{git rm --cached $_}
```

# 説明
## 一つ目のパイプライン
PowerShell 以外のコマンドから渡されるのはほぼ全て `string[]`。
`Foreach-Object` や `Where-Object` ではこれを1行ずつ処理する。
`?` は `Where-Object` のエイリアス、 `{}` 内が `true` になったものだけを返す。
`$_` は現在のループで回してる 1 オブジェクト。
ここでは `string.Contains()` を使って `"hoge"` が含まれてる行だけを返してる。

## 二つ目のパイプライン
`%` は `Foreach-Object` のエイリアス、 一オブジェクト毎に `{}` 内を実行する。この場合、 1 行が 1 string。
`string.Split()` で 1 行の string をスペース区切り で string[] にしてる。
`Split(';')` とかすれば、 セミコロン区切りにできる。何も指定しないとスペース区切り。
今

```

new
file:


hoge/fuga/foo/bar
```
という感じになる。
スペースが続いてるところをひとつの区切りとしてくれないので、1個以上のスペースを区切りにしたければ、 `$_ -split '\s'+` などと正規表現を使うと良いでしょう。
それで、これをパイプラインで渡す。
## 3つ目のパイプライン
2つ目のパイプラインの中の `Foreach-Object` 内でのパイプライン
`select` は `Select-Object` のエイリアス。
`-l` は `-Last` を略したもの。PowerShell のパラメーターは一意に決まるだけ書いてあれば問題無い。
つまりパイプラインで渡されたオブジェクトの Last の 1 個を返すので、
上の例で言う `hoge/fuga/foo/bar` になる。

## 4つ目のパイプライン
ここまでで `hoge` が含まれている行のパスだけが string として渡されているので、これを最後に git コマンドに渡してあげればよい。

# 最後に
`contains` に渡す文字列を変えて、最後の git コマンドを変えるだけでもいろいろと応用できる。
svn status でもパスは行末にくるので svn にも応用可。

## 他の例

``` powershell
git status | ?{$_.Contains('modified')} | %{$_.Split() | select -l 1} | %{git checkout -- $_}
```
git logの結果 を PowerShellのオブジェクト配列に変換する

#動機
1. git logの結果でdiffやらarchiveしたいが、git logの結果がプログラムで扱いづらい
2. git logコマンドでは件名のダブルクオーテーションがエスケープできないので、--pretty=formatでjson文字列に変換できない

#環境
- PSVersion：5.1
- OS：Windows10

#ソースコード
```powershell

#gitlogをPSCustomObject配列で返す
#注意：ロケーションが移動します
function ConvertArrayFromGitLog() {

    #.gitのパスに移動する
    Set-Location -path "C:\users\project"

    #gitlogコマンドで件名の”をエスケープできずjsonに変換できないため、
    #タブ区切り(%x09)にしてからMapでPSCustomObject配列作成
    return git log --date=iso --pretty=format:'%ad%x09%h%x09%ae%x09%s' | % {
        $_ = $_.Split("`t")
        return [PSCustomObject]@{
            Date       = $_[0]
            CommitId   = $_[1]
            AuthorMail = $_[2]
            Subject    = $_[3]
        }
    } 
}
```
WindowsServer2008R2 と .NET Framework3.5のTLS 1.1/1.2対応


この記事は [リンク情報システム](https://www.lis.co.jp/) （Facebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)）が主催するイベント[「Tech Connect! Autumn」](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)のリレー記事です。
[「Tech Connect! Autumn」](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)は engineer.hanzomon のグループメンバによってリレーされます。

６日目の担当は@r-ishikawaです。

# はじめに

本記事は、タイトルにある環境で動いているC#のアプリと利用しているWEBサービスの通信を、TLS1.1及び1.2に対応させることが目的です。
対応方法が分からず苦戦したので、同じ状況の方の参考になれば幸いです。


# 対応方法

下記のレジストリ値を設定することで対応できました。
単純でしたが、なかなか辿り着けなかった。。。

WindowsServerに対応したレジストリ値と、.NET Frameworkに対応したレジストリ値を、それぞれ登録してあげる必要があります。レジストリに下記のキーが無い場合は、新規登録で追加すればOKです。

レジストリ値の設定方法はここでは触れませんが、操作を誤るとシステムにダメージを与える可能性があるので、注意して操作しましょう。

### ① WindowsServer2008R2 対応


<table>
  <tr>
    <th>キー</th>
    <th>名前</th>
    <th>種類</th>
    <th>データ</th>
  </tr>
  <tr>
    <td>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.2\Client</td>
    <td>DisabledByDefault</td>
    <td>REG_DWORD</td>
    <td>0</td>
  </tr>
</table>

### ② .NET Framework3.5 対応

<table>
  <tr>
    <th>キー</th>
    <th>名前</th>
    <th>種類</th>
    <th>データ</th>
  </tr>
  <tr>
    <td>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727</td>
    <td>SystemDefaultTlsVersions</td>
    <td>REG_DWORD</td>
    <td>1</td>
  </tr>
</table>


マシンが64bitの場合は以下も追加します↓

|キー|名前 |種類 |データ|
|:-----------------|:------------------|:------------------|:------------------|
| HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727| SystemDefaultTlsVersions |REG_DWORD|1|



## おまけ
### .NET Framework4.5 の場合の対応

<table>
  <tr>
    <th>キー</th>
    <th>名前</th>
    <th>種類</th>
    <th>データ</th>
  </tr>
  <tr>
    <td>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319</td>
    <td>SchUseStrongCrypto</td>
    <td>REG_DWORD</td>
    <td>1</td>
  </tr>
</table>

マシンが64bitの場合は以下も追加します↓

|キー|名前 |種類 |データ|
|:-----------------|:------------------|:------------------|:------------------|
| HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319 | SchUseStrongCrypto |REG_DWORD|1|




# 参考情報

- [.NET Framework で TLS1.1 および 1.2 を有効化する方法](https://blogs.technet.microsoft.com/jpieblog/2015/04/07/net-framework-tls1-1-1-2/)
- [Windows Server 2008 SP2、Windows Embedded POSReady 2009、および Windows Embedded Standard 2009 に TLS 1.1 および TLS 1.2 のサポートを追加する更新プログラム](https://support.microsoft.com/ja-jp/help/4019276/update-to-add-support-for-tls-1-1-and-tls-1-2-in-windows)
VSCodeのcmdの文字コード 設定メモ

# VSCodeのcmdの文字コードをUTF-8とかに変える
他の記事が動かなかったらしいのでメモ、参考にしたというか答えがあったサイトは以下。
https://yeakong.com/vscode-launch-powershell-use-utf-8-as-default-on-windows/

抜粋
`"terminal.integrated.shellArgs.windows": ["-NoExit", "/c", "chcp 65001"]`

自分では未検証なのであとで検証する
ssl化


https://recipe.kc-cloud.jp/archives/11188

サイト内リンクとかcanonicalとかhttpが残ってるとアウトです

サイト内リンク
canonical
http

HTTPページからHTTPSページに向けて301リダイレクトを設定
301リダイレクトはサーバーサイドでの処理を推奨
canonicalの設定先（正規化）をHTTPSページのURLに変更
Webサイト内の各種参照先、たとえばサイト内リンクやCSS、JavaScriptの参照先リンクも漏れなくURLをHTTPからHTTPSに変更
HTTPSサイトをGoogle サーチコンソールに登録
XMLサイトマップにHTTPSのURLを記載
HSTS（HTTP Strict Transport Security）を設定
robots.txtファイルでHTTPSサイトがブロックされずにクロールされるように対応
※HSTSとは、自動的にHTTPSページをリクエストするようにブラウザに指示する仕組み。ユーザーがブラウザのアドレスバーにHTTPを入力した場合でもHTTPSが使用される。


URLの修正
SSL証明書をインストールしたら、httpからhttpsへ記述を修正します。

以下の内容をhttpからhttpsへ書き換えるですが、必ずバックアップを取っておきましょう。

外部ファイル(CSSファイルやJavaScriptなど)のURL
外部ファイルに記載している背景画像などのURL
内部リンクと画像リンク
絶対パスでURLを指定している箇所
httpからhttpsへリダイレクト
修正が完了したら、.htaccessでhttpからhttpsへのリダイレクトを掛けます。

1. サイトマップ更新
2. 

analytics
search console
のURL変更


https://hyper-text.org/archives/2015/01/full_time_ssl_website_quick_start.shtml
https://recipe.kc-cloud.jp/archives/11188
https://www.leon-tec.co.jp/yoshida/7570/
Swift初心者のアウトプット１

#文字の出力
Swiftの文字の出力はprintを使い、コンソールに表示する。

```swift:qiita.rb
print("Hello World")
```
また、実際の動作には影響しない、メモするときなどに用いる「コメント」は頭に // を付ける。

```swift:qiita.rb
//コメント
```
エラー出力を標準出力にまとめる

- 2>&1を使うとエラー出力を標準出力にまとめる事ができます

```shell
$ sh -c "date" > ./log # dateの標準出力がshの標準出力としてlogに書き出される
$ cat log
2018年  9月  7日 金曜日 16:36:08 JST

$ sh -c "dat" > ./log # dat(dateのtypo)を実行するとエラーが出る、エラーはshの標準出力に含まれないため logには空文字が書き込まれる
$ cat log # 当然何も出力されない

$ sh -c "date 2>&1" > ./log # dateのエラーも標準出力にまとめる、logにはdateの出力全てが書き出される
$ cat log
2018年  9月  7日 金曜日 16:41:38 JST

$ sh -c "dat 2>&1" > ./log # datのエラーも標準出力にまとめる、logにはdatの出力全てが書き出される
$ cat log
sh: 1: dat: not found # これはlogの中身
```
Xorshift 16bit

参考：[Retro Programming: 16-Bit Xorshift Pseudorandom Numbers in Z80 Assembly](http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html)

```xors16.asm
; z88dk / WebMSX
; z80asm -b -l xors16.asm
; appmake +msx -b xors16.bin --org 0xd000 --fmsx

CHPUT   equ     $00a2

        org     $d000
start:
        ld      b, 10
.loop
        call    xrnd
        ld      de, buf
        ld      a, (xrnd+2)
        call    tohex2
        ld      a, (xrnd+1)
        call    tohex2
        ld      hl, buf
        call    puts
        djnz    loop
        ret

xrnd:
        ld      hl, 1

        ld      a, h
        rra
        ld      a, l
        rra
        xor     h
        ld      h, a
        ld      a, l
        rra
        ld      a, h
        rra
        xor     l
        ld      l, a
        xor     h
        ld      h, a

        ld      (xrnd+1), hl

        ret

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    CHPUT
        inc     hl
        jr      puts

tohex2:
        push    af
        rlca
        rlca
        rlca
        rlca
        call    tohex
        pop     af
.tohex
        and     $0f
        cp      $0a
        sbc     $69
        daa
        ld      (de), a
        inc     de
        ret

buf:    defm    "xxxx", $0d, $0a, 0
```

```xors16.asm
comment *
MASM32 SDK / MS-DOS
ml /c /AT /Fl xors16.asm
link16 /t xors16;
*
                .model  tiny
                .186

                .code
                org     0100h

main            proc
                mov     bx, 10
        @@loop:
                call    xrnd
                mov     di, offset buf
                call    tohex4
                mov     ah, 09h
                mov     dx, offset buf
                int     21h
                dec     bx
                jnz     @@loop

                mov     ax, 4c00h
                int     21h
main            endp

xrnd            proc
                mov     ax, seed
                mov     dx, ax                  ; ax ^= ax << 7
                shl     dx, 7
                xor     ax, dx
                mov     dx, ax                  ; ax ^= ax >> 9
                shr     dx, 9
                xor     ax, dx
                mov     dx, ax                  ; ax ^= ax << 8
                shl     dx, 8
                xor     ax, dx
                mov     seed, ax
                ret
xrnd            endp

tohex4          proc
                cld
                mov     cx, 4
        @@loop:
                rol     ax, 4
                push    ax
                and     al, 0fh
                cmp     al, 0ah
                sbb     al, 69h
                das
                stosb
                pop     ax
                loop    @@loop
                ret
tohex4          endp

seed            dw      1
buf             db      'xxxx', 0dh, 0ah, '$'

                end     main
```

![WMSX Screen.png](https://qiita-image-store.s3.amazonaws.com/0/257554/96232ac4-6f85-0451-fa5c-d220ab9b5944.png)
![xors16.png](https://qiita-image-store.s3.amazonaws.com/0/257554/e09d8628-559f-5352-4f11-c4bc678510bd.png)
Clean Architecture 達人に学ぶソフトウェアの設計と構造

どんなことが書かれているかとりあえずずらずらと書きます
* あとでまとめて編集

# 第1章: 設計とアーキテクチャ

- 設計とアーキテクチャの違いはない
設計はアーキテクチャの詳細を表すことでアーキテクチャをサポートするもの。
一方でアーキテクチャとそれをサポートする設計の連続で全体の一部が作られ結果的にシステムの形状が定義される一面もあるため、明確に区別できない

- 設計とアーキテクチャの目的
その目的は求められるシステムを構築・保守するために必要な人材を最小限に抑えること。
したがってその良し悪しは労力がいかに費やされたかで決まる。
リリースごとに労力が増えるのであれば優れていない。
ケーススタディを交えて説明

# 第2章: 2つの価値のお話

- ソフトウェアシステムとは「機能」と「アーキテクチャ」の2つの異なる価値をステークホルダーに提供するものであり、開発者はこれを維持する責任があると説明した上で最終的にどちらのほうが大きな価値があるかを問い、それは構造であると結論づけている。

# 第2部 プログラミングパラダイム


## 第3章: プログラミングパラダイムの概要

構造化プログラミング・オブジェクト指向プログラミング・関数型プログラミングの3つについて軽く説明
パラダイムはアーキテクチャの3つの大きな関心事「コンポーネントの分離」「データ管理」「機能」に対応している

## 第4章 構造化プログラミング
構造化プログラミングとはどういうものか

## 第5章 オブジェクト指向プログラミング
- 現代の主流なパラダイム。
- 優れたアーキテクチャの基本となるのはこの“オブジェクト指向“の原則の理解と適用。
- オブジェクト指向とはなんなのか

### オブジェクト指向とは
俗説によると
① データと関数の組み合わせ：☓
② 現実の世界をモデル化する方法： ☓
③ カプセル化・継承・ポリモーフィズム: △


結論どれもちがーうw


- カプセル化：☓
データと関数のカプセル化を簡単かつ効果的なものにしていて、その結果、見えないデータと見える一部の関数がある。
この概念は「プライベートなデータメンバー」と「クラスのパブリックな関数メンバー」として表される
ただこの考え方はオブジェクト指向言語以前からC言語で存在していた。むしろ完璧なカプセル化だった
C++というオブジェクト指向言語が登場し、それ以降C言語による言語の完璧なカプセル化が破壊・弱体化してしまった。したがってカプセル化をオブジェクト指向であると定義づけることはできない。

-  継承：☓
C言語にも存在していて、C言語プログラマが手動でやっていた。
本物の継承と比べるとさほど便利でなかったし、多重継承を実現するのはかなり困難であるため違うところもあるが、
オブジェクト指向が発明されるずっと昔から存在するためこれも違う。

- ポリモーフィズム：△
ポリモーフィズムも新しい考えではない。つまりオブジェクト指向は新しいものを提供しているわけではない。
ただし、これが全面的に正しいわけでもない。
オブジェクト指向がポリモーフィズムを提供してくれたわけではないが、これを安全かつ便利にしてくれたのはオブジェクト指向だ。
このポリモーフィズムを利用することで、コンポーネントの依存関係を独立させることができ、さらにその依存関係を制御(逆転)させることができる。
その結果、UIのコンポーネント、DataBaseのコンポーネントをビジネスルールに依存させることができる。
またUIやDataBaseに変更があっても、ビジネスルールとは独立して変更することができる。

結論： オブジェクト指向とは「ポリモーフィズムを使ってソースコードの依存関係を制御すること。


## 第6章：関数型プログラミング
・関数型言語の変数は変化しない(不可変変数)
・可変変数が存在しなければ競合状態・デッドロック状態・並行更新の問題は発生し得ない
・適切に構造化されたアプリケーションでは、可変コンポーネントと不変コンポーネントの切り分けがしっかりとできている。

結論：関数型プログラミングは代入に規律を課すものである。

## 第2部まとめ
・構造化プログラミングは直接的な制御の移行に規律を課すもの(goto文に順次・反復・選択)
・オブジェクト指向プログラミングは間接的な制御の移行に規律を課すもの(依存関係逆転)
・関数型プログラミングは代入に規律を課すもの(不変コンポーネント)

これらのパラダイムは何か力を与えてくれるものではない。
「何をすべきでないか」を示してくれている。
ソフトウェアでは昔から「順次」・「反復」・「選択」・「間接参照」で構成されている


オブジェクト指向のポリモーフィズムを理解するのにかなり時間がかかったし
今でも依存関係逆転ってどこが逆転してるの？って感じが拭えない。
とりあえずまず広く浅く全体像を掴むことにする(気になってむずむずする)

# 第３部 設計の原則
よくできたソフトウェアシステムを作るにはクリーンなコードを書いてよりよい優れたモジュールを作ることから始まる。
これはレンガの出来が悪ければ優れた建築はできないのと同様である。
(もちろんたとえよくできたレンガを使っても、それ以降の作業でぐちゃぐちゃなものを作ってしまうこともあり得るが。)
第３部ではよりよいレンガ、つまり、変更に強い・理解しやすい・コンポーネントの基盤として多くのソフトウェアシステムで利用できるモジュールを作るために必要なSOLIDについて説明されている。(それ以降の上位レベルのアーキテクチャの原則については第３部以降で説明。)


## 第7章 単一責任の原則

 - 「ひとつの関数はたったひとつのことだけを行うべき」という考えではない
 - 「ソースファイルはたったひとつのアクターに対して責任を負うべきであり、アクターの異なるコードは別のファイルに分割するべき」という考え

## 第８章 オープン・クローズドの原則

・既存の成果物を変更せずシステムを拡張しやすくする、という考えであり、ソフトウェアアーキテクチャを学ぶ根本的理由。ちょっとした拡張・変更のために既存のコード書き換えが大量に必要になるようなら、それは失敗へ進んでいる。

・オープン・クローズドの原則というと、クラスやモジュールを設計する際の指針だと考えている人が多いが、コンポーネントのレベルを考慮したときに重要味を増すと述べていて、8章ではその証明をしている。


## 第９章 リスコフの置換原則

・スーパークラスにない関数をサブクラスで作るな、スーパークラスの関数を無視するな
・置換原則に違反したときに何が起こるか

## 第10章 インターフェイス分離の原則

必要としないお荷物まで抱えたものに依存していると予期せぬトラブルの元につながるから、その際は必要なものだけを持つインターフェイスに分離しよう。
新端末のRuby versionを上げた日

##rbenvでversion管理する

```
$brew install rbenv ruby-build
```
bash_profileに書き込み、読み込ませる。

```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```



キチンと入ったか確認

```
$rbenv install --list
```
```
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
  1.8.5-p231
  1.8.6
　　　　　　　　　　　　　…
　　　　　　　　　　　　　…
```

18/09時点では最新版の2.5.1を入れます。

```
rbenv install 2.5.1
```

確認します。

```
$ rbenv versions
* system (set by /Users/hdymacuser/.rbenv/version)
  2.5.1
```

適用します

```
$ rbenv global 2.5.1
$ rbenv rehash
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
```


###Success!


参考：https://numb86-tech.hatenablog.com/entry/2018/06/26/111619
AWS IoTを使用してGitHubのコードをraspberry piに自動デプロイする

# 概要

これまでは、GitHubにpushしたコードをraspberry piからgit pullしていたが、
この作業が面倒なので、pushしたら自動でraspberry piに反映させるというものを作りました。
C言語のコードも利用するので、コード反映後にコンパイルやrebootなどのコマンドも自動実行できるようになっています。

# 仕組み
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/146154/a1961f05-3aad-d7e4-a1c0-1a1633b9b980.png)

- GitHubのmasterにpush
- GitHubのwebhookによりAWS APIGateway を呼び出す
- AWS APIGatewayより AWS LAmbda Functionを呼び出し、masterリポジトリであれば AWS Iotブローカへパブリッシュする
- raspberry pi上では[専用エージェント(DeployIoT)](https://github.com/shigeru-yokochi/DeployIoT)によりAWS IoTブローカからのサブスクライブを受信する
- サブスクライブを受信した[専用エージェント(DeployIoT)](https://github.com/shigeru-yokochi/DeployIoT)は予め定義されているコマンドを実行する（git pull,make,reboot,等）

# 各所説明

## GitHubのwebhook設定
![webhook.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/eb633dec-7b7b-6d5b-3e44-06a706a3d3ed.jpeg)

- Payload URL は AWS APIGateway のエンドポイントを指定します

## AWS APIGateway設定
![apigateway.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/388d9d05-cdf5-fe96-8b76-abc2e762069e.jpeg)

- リソースのメソッドは「post」にします
- 統合タイプは「Lambda関数」にします
- Lambda関数は作成したものを指定します。ここでは「DeployIoT」としてました
- masterブランチを判定するために「マッピングテンプレート」を編集します
- マッピングテンプレートのリクエスト本体のパススルーを「テンプレートが定義されていない場合」を選択します
- Content-Typeの「マッピングテンプレートの追加」をクリックして「application/json」と入力します
- 値は以下の通りです

```json
{    
    "name" : "$input.params('name')",
    "body" : $input.json('$')
}
```

![apigateway2.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/dcb4d8d7-58dc-5dac-a322-e28aea99c85f.jpeg)

- エンドポイントはステージ（ここではprodとしました）の-post-/に「URLの呼び出し：」となっている箇所です
- このエンドポイントをGitHubのwebhook Payload URL欄に設定します


## AWS Lambda設定
![lambda.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/1892ec55-1b61-f840-6516-02d1aeebd168.jpeg)

### lambda_function code
https://github.com/shigeru-yokochi/DeployIoT/blob/master/lambda_function.lambda_handler.py


- ここでは、関数名「DeployIot」、ランタイム「python3.6」、ハンドラ「lambda_function.lambda_handler」としました
- カスタムロールを作成して、AWS IoT接続用のポリシーを追加でアタッチします。

### Lambda IAMロール

![ロールlambda.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/a7508dc5-7f80-90f2-bae7-01b217f200a8.jpeg)

### IoT接続用 IAMポリシー
![ポリシーiot.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/10ee6af0-1040-61e3-f9c6-8eb9210047e6.jpeg)

```json
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "iot:Publish",
        "Resource": "*"
    }
}
```

## AWS IoT設定

「[AWS IoTを使用してRaspberry PiとのMQTT通信をC言語で動作させる](https://qiita.com/shigeru-yokochi/items/439dca2b154c8e4fe93a) 」に投稿している内容を参照してください

## raspberry pi側の設定

「[専用エージェント(DeployIoT)](https://github.com/shigeru-yokochi/DeployIoT)」の設定になりますので[このGitHubのリポジトリ](https://github.com/shigeru-yokochi/DeployIoT)を参照してください


# 考察

- AWS CodeBuildでLinuxエージェントをインストールして実現可能と推測できるが、デプロイ毎のAWS費用とlinux側の負荷を考慮して却下
- raspberry pi 側はあえて pythonではなく C言語のAWS SDK を使用した。最初にpythonで動作確認したことにより容易に実装できた。
MySQLでJOINをしたいから練習してみた。

#SQLでJOINを使いこなす
という目標を立てて15分間だけ頑張りました。(*´ω｀*)

複数のテーブルを跨いで情報をもたせているものがある場合にフレームワークのmodelのような仕組みのない場合にJOINを使って1度のSQLで目的の情報を取得したい状況を想定します。

##tableの構成
- tableA
    - column (id, name, group_name)
- tableB
    - column (id, A_id, disable)

##やりたいこと
名前を元にtableAのグループ名とtableBの詳細を取り出したい！！
（ちょっと考えるのが面倒だったので需要があれば書き換えます！テキトー魂！）


**「でもSQLは１回しか叩きたくない！！」**

##SQLのコード

```sql
SELECT A.id, A.name, A.group_name, B.disable
FROM tableA AS A
LEFT JOIN tableB AS B
ON A.id = B.A_id
WHERE A.name = ?;
```

「?」に値を入れる！！

##説明

###しれっと使った「エイリアス」→別名
`FROM tableA AS A`ってなんだよ！
って思ったら「sql エイリアス」で調べて見てください。
ざっくり言えばtableAって長いからお前の名前はAな！！ってことです。

###LEFT JOIN
```sql
// 抜粋
FROM tableA AS A
LEFT JOIN tableB AS B
```

`LEFT JOIN`は左のテーブルを親にして右のテーブルを連結するよ～てやつ！


###ON ほげほげ～
```sql
// 抜粋
ON A.id = B.A_id
```
`ON`は`JOIN`したテーブル同士のどのカラムが対応しているものを検索するかって時に使います！

##まとめ
「JOINは怖くないよ！コードは友達！！」
さて、あんまり遊んでると怒られちゃうのでこのへんで失礼します！
AWS IoTを使用してRaspberry PiとのMQTT通信をC言語で動作させる

# 概要

今更ですがAWS IoTとraspberry pi間のMQTTの検証をしてみました
MQTT通信は非力なデバイスが少ないリソースで通信できるためhttp通信同様にスタンダードになりつつある。と考えていますので少しは知っておいたほうがよいという意図です

動作させる内容は、AWS IoTを使用してraspberry pi との間で MQTTのパブリッシュとサブスクライブの動作確認とします。
しかし、ここまでは先人の方々の情報を利用させていただくことにより容易に実現できますので、
今回は、raspberry pi 側はC言語で動作させることにしました

## イメージ

![AWS Icons (1).png](https://qiita-image-store.s3.amazonaws.com/0/146154/3e725846-08dc-8d71-0d6a-79c897b7d1d4.png)


# 検証方法

- AWS IoT のウィザードを使用して一旦python環境で動作させます
- pythonで動作が確認できたら、AWS IoT Embedded C SDK を使用してC言語で動作させます


### AWS IoT のウィザードを使用して一旦python環境で動作させます
ここを参考にさせていただきました

- サービスのリストの変更があり「AWS IoT」ではなく「IoT Core」を選択してください

http://blog.akanumahiroaki.com/entry/2017/07/01/160000

### AWS IoT Embedded C SDK を使用してC言語で動作させます


AWSドキュメント(AWS IoT Embedded C SDK の使用)の手順通りにすすめる
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-embedded-c-sdk.html

(補足説明)
- カレントディレクトリ/rootから、 ``` git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git -b release ``` を実行しました
- certにはpythonで動作させたときに作成された証明書を使用しました
- external_libs/mbedTLS/　配下には　https://github.com/ARMmbed/mbedtls のファイルをコピーしました
- Policyはpythonで動作させたときに作成された内容を一部修正しました
- サンプルプログラムは　``` ~/aws-iot-device-sdk-embedded-C/samples/linux/subscribe_publish_sample ``` を使用しました。カレントディレクトリを合わせて ``` make ``` を実行すれば 実行ファイルが作成できます。
-  ``` aws_iot_config.h　``` を設定することを忘れずに。

```json:Policy(変更前)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/sdk/test/java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/sdk/test/Python",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/topic_1",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/topic_2"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/sdk/test/java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/sdk/test/Python",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/topic_1",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/topic_2"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/sdk-java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/basicPubSub",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/sdk-nodejs-*"
      ]
    }
  ]
}

```


```json:Policy(変更後)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:*"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:*"
      ]
    }
  ]
}
```

# 参考にさせていただいた情報
http://blog.akanumahiroaki.com/entry/2017/07/01/160000
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-embedded-c-sdk.html
https://github.com/aws/aws-iot-device-sdk-embedded-C/issues/85
https://github.com/aws/aws-iot-device-sdk-embedded-C/issues/183
Docker 使ってみた[Mac][コンテナ作成・削除]

# VagrantをmaxOSにインストール

[Vagrant](DOWNLOAD VAGRANT)のダウンロードページからMac OS Xを選択してダウンロードし、vagrant.pkgをダブルクリックしてインストールしましょう。

# Ubuntuを立ち上げる

1.boxを追加
vagrantフォルダを作成してそこにいろいろやっていきます。

```
$ mkdir vagrant
$ cd vargrant
$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

かなり時間がかかります。
完了したら、以下のコードを実行しvagrantファイルを作成します。

```
$ vagrant init trusty64
```

2.IPアドレスの変更

上記で作成した`Vagrantfile`のIPアドレスをこのように変更します。


```
# config.vm.network "private_network", ip: "192.168.55.44"
```

3.Vagrant起動

```
$ mkdir Docker
$ cd Docker
$ vagrant up
```
errorが起きた場合は、VirtualBoxをインストールしましょう。
参考：[MacにVirtualBoxをインストールしてみた](https://pc-karuma.net/mac-virtualbox-install/)

# sshに接続

```
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64：~＄
```
このようになったと思います。

#Dockerインストール

[公式ドキュメント](https://docs.docker.com/install/linux/docker-ce/ubuntu/#os-requirements)からインストールしていきます。

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install docker.io
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
vagrant@vagrant-ubuntu-trusty-64:~$ docker --version
Docker version 1.6.2, build 7c8fca2
```

このような感じになったと思います。

# centOSをpullする

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker pull centos
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker images
#imageの一覧が見れる
centos              latest              c5507be714a7        4 weeks ago 
```

1.imageの詳細をみる
後ろの文字はimage IDを指定します。

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker inspect c5507be714a7
```

補足：imageを削除するときは、$ sudo docker rmi imageIDで削除できます。

# Hello,World

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run centos echo "hello,world"
hello,world
```
もしhello,worldできなかったらもう一度pullしてみてください。

```
vagrant@vagrant-ubuntu-trusty-64:~$ docker pull centos
```

# コンテナの確認・削除

### 起動中のコンテナの確認

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps
```

### 動作終了のコンテナの確認

Exited(0)が動作を終了したコンテナを表しています。

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
```

### コンテナの削除

コンテナのIDは３文字指定すれば特定できるので、入力は３文字で十分です。

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker rm コンテナID(STATUSの下の文字)
```

### 実行中のコンテナの動作を終了する

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker kill コンテナID(STATUSの下の文字)
```

### コンテナの再開

```
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker start コンテナID(STATUSの下の文字)
```

以上です。
衝突判定のまとめと注意事項

# 入力する箇所
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/214359/11497d9e-c78b-296c-6231-86b9a8d82f10.png)

# 衝突するオブジェクトがすり抜けない場合

```csharp
void OnCollisionEnter (Collision col)
    {
        if(col.gameObject.name == "getabako"){}
    }
```

**{}の中には実行する内容を入力する**

**衝突するオブジェクトがすり抜けない場合の注意事項**
①Colliderをつける
②どちらかにRigidBodyをつける

# タグのつけかた
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/214359/c78eb448-91cd-096f-192c-9f31e341c4cc.png)</details>

# 衝突するオブジェクトがすり抜ける場合

```csharp
void OnTriggerEnter (Collider col)
    {
        if(col.gameObject.tag == "getabako"){}
    }
```

**{}の中には実行する内容を入力する**

**衝突するオブジェクトがすり抜ける場合の注意事項**
①Colliderをつけて「isTrigger」にチェックをつける
②どちらかにRigidBodyをつける
②衝突するオブジェクトにタグをつける
「fuelphpのrestコントローラでログインチェックを行う」でログアウトされていたときの処理をフロントで共通化したい

[fuelphpのrestコントローラでログインチェックを行う](https://qiita.com/cs_sonar/items/3ffa8553c76c052c018c)
でログインチェックに失敗したときの処理をajax毎に書きたくなかったので調べました。

```
$(document).ajaxError(function(e, jqXHR) {
    if (jqXHR.status === 401) {
        //ここに処理を書く
    }
});
```

axiosを使っている場合は以下

```
axios.interceptors.response.use(function (response) {
    return response;
}, function (error) {
    if (error.response.status === 401) {
       //ここに処理を書く
    }
    return Promise.reject(error);
});
```
Rails の reverse_order を使ってみた

Rails で `reverse_order` を使ってあれこれと試してみたのでメモ。

### バージョン

* ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
* Rails 5.1.6

## order のおさらい

DBから取得するデータをソートするには `order` を使います。（ `scope` の中なのはたまたまです）

``` ruby:model/article.rb
class Article < ApplicationRecord
  scope :sort_by_oldest, -> {
    order(:published_date)
  }
end
```

`order(:published_date)` と `order('published_date')` では作られるSQLが異なるため要注意。

``` sql
-- order(:published_date)
ORDER BY `articles`.`published_date` ASC

-- order('published_date')
ORDER BY published_date
```

リレーションを上手く扱ってくれるのが Rails の魅力。
SQLを直接書くと思わぬ落とし穴にはまりかねないので、なるべく避けたいところです。

### 降順に取得するにはどうすればいいの？

良く見かけるのは以下のような書き方です。

``` ruby:model/article.rb
class Article < ApplicationRecord
  scope :sort_by_newest, -> {
    order('published_date DESC')
  }
end
```

SQL書きたくない言ってる端からこれですよ。。

## reverse_order 登場

そこで `reverse_order` の登場です。降順に取得したい場合は下記のように書けます。

``` ruby:model/article.rb
class Article < ApplicationRecord
  scope :sort_by_newest, -> {
    order(:published_date)
      .reverse_order
  }
end
```

なるほど。 `reverse_order` は「降順」に取得するメソッドなんですね！
→ 違います。

### 正しい reverse_order の意味

降順とかじゃなく、現在のソート順を逆にするメソッドです。名前のままですが（笑）

``` ruby
# ORDER BY `table`.`col_one` DESC
order(:col_one)
  .reverse_order

# ORDER BY `table`.`col_one` DESC, `table`.`col_two` ASC
order(:col_one)
  .reverse_order
  .order(:col_two)

# ORDER BY `table`.`col_one` ASC, `table`.`col_two` DESC
order(:col_one)
  .reverse_order
  .order(:col_two)
  .reverse_order

# ORDER BY `table`.`col_one` DESC, `table`.`col_two` DESC
order(:col_one)
  .order(:col_two)
  .reverse_order
```
!!を2つ使う論理演算子

人の書いたjsを改修することになって読んでいたら論理演算子で「!」が連続して2つ書かれていた

こんな感じ

```javascript

hoge = 'ほげ!!';

if(!! hoge){
 console.log(1);
}else{
 console.log(2);
}
```

結果は「1」

##調べた結果、どんな処理をしているのか

**!! は ! の処理を2回行っている**
notの後にnotだから元に戻る

だから、!! は 

```javascript
if(hoge){〜}
```

これと変わらない状態になるけど ! でboolean型になることに意味があるのかな？
コードを読んでも意図がわからなかった、、、

##phpの場合

話を変えてphpだとしたらisset関数を使って、

```php
$hoge = 'ほげ！！！';
if(isset($hoge)){
 echo '中身あります';
}
```
となるところを !! 使えば簡略化できるなーと思いました。



!! は正直明確な用途がわかんない、、、
tweepyで検索時、結果が省略されてしまう問題

twitterの検索で得られる結果(Statusオブジェクト?)はなんだか知らないけど膨大な量の情報を持っている。この中身についてはそのうち調べよう。

ところでtweepy.API.search()に限らないと思うけど、呟きが長いとtextの末尾が「...」となって省略されてしまう。これを回避する方法はないかと調べてみるも、

https://tweepy.readthedocs.io/en/v3.6.0/api.html

には特にそれらしきものはないんだよね。でもsearch()の引数に、
tweet_mode="extended"
を追加してあげると、full_textというプロパティに省略されていない呟きが取得できるようだ。

で、もともとこの関数はTwitter APIのラッパー関数なので、直接

https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets

を調べた方が良さそうだ。でも、それらしき引数はないんだよなぁ。隠しパラメータなのかしら。…あれ? もしかしてこれ書いたらまずかった? (そんなことはないと思うけど)

ps.
https://developer.twitter.com/en/docs/tweets/tweet-updates
に書いてあったわ。
コーディングでよく見る英単語の直訳リスト

コーディングしてるとよく見る「binding（バインディング）」だったり「rendering（レンダリング）」だったり、意味は分かるけど、日本語直訳はわからない英単語。
忘れないためにリスト化しました。

- binding（バインディング）… 縛る・束ねる
- data（データ）… 情報
- rendering（レンダリング）… 表現・演出
- reactive（リアクティブ）… 反応的な
- component（コンポーネント）… 構成要素・成分
- architecture（アーキテクチャ）… 建築・構造
- interactive（インタラクティブ）… 相互・双方向
- library（ライブラリ）… 書庫・文庫
- widget（ウィジェット）… 部品
- system（システム）… 制度・組織・体系
- document（ドキュメント）… 記録・文献
- node（ノード）… 結び目・中心点・結節・節点
- model（モデル）… ひな型
- view（ビュー）… 見た目
- unique（ユニーク）… 唯一
- element（エレメント）… 要素
- template（テンプレート）… 型板・指型
- listener（リスナー）… 聞き手
- progressive（プログレッシブ）… 革新的な
- framework（フレームワーク）… 骨組み・枠組み
- module（モジュール）… 組み立てユニット
- routing（ルーティング）… 道・道筋
- build（ビルド）… 建てる・築く・造る
- constructor（コンストラクタ）… 建設者
- computed（コンピューテッド）… 計算した
- directive（ディレクティブ）… 指示的・指向
- bind（バインド）… 結び合わせる
Helm と Kubernetes


[Helm](https://helm.sh/) という Kubernetes 用のパッケージマネージャを試しました。

Helm が apt や brew などの OS のパッケージマネージャと一番違うと感じたのは、一つのパッケージ(Chart と呼びます)を複数個インストール出来る事です。例えば mysql を三回インストールすれば３つの mysql が立ち上がります。３つインストールすればそれぞれを見分けないといけないので、Release 名が付けられます。

## Chart のインストールと削除

[Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart) をやってみます。

まず、現在の Kubernetes 環境を確認する。とりあえず Docker for Mac についてる環境でやります。

    $ kubectl config current-context 
    docker-for-desktop

Helm のインストール。

    brew install kubernetes-helm

初期化。これで Tiller というサーバー側の部品も Kubernetes クラスタにインストールするらしい。

    helm init

試しに `stable/mysql` chart をインストールしてみる

```
$ helm repo update
$ helm install stable/mysql
NAME:   braided-quail
...
```

NAME: の所に表示されるのを Release 名です。これで Chart から出来たインスタンスを見分けます。適当に名付けられますが、 `--name` オプションで指定も出来ます。Chart をインストールすると丁寧な説明が表示されるので、そのとおりに操作して mysql が動いている事を確認する。

```
$ kubectl port-forward svc/braided-quail-mysql 3306 & # これはクラスタ内にアクセスするためのポートフォワーディング

$ MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default braided-quail-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)

$ mysql -h 127.0.0.1 -P 3306 -u root -p${MYSQL_ROOT_PASSWORD}
mysql: [Warning] Using a password on the command line interface can be insecure.
Handling connection for 3306
Welcome to the MySQL monitor.  Commands end with ; or \g.
...
```

もう一度 Release の詳しい説明を見る。

    helm status braided-quail

Chart の情報を見る。

    helm inspect stable/mysql

インストールした Release のリスト

```
$ helm ls
NAME         	REVISION	UPDATED                 	STATUS  	CHART       	APP VERSION	NAMESPACE
braided-quail	1       	Fri Sep  7 10:44:43 2018	DEPLOYED	mysql-0.10.1	5.7.14     	default
```

面白い事に、再度 `stable/mysql` をインストールするともう一個 Release が出来る。

```
$ helm install stable/mysql
$ helm ls --all
NAME           	REVISION	UPDATED                 	STATUS  	CHART       	APP VERSION	NAMESPACE
braided-quail	1       	Fri Sep  7 10:44:43 2018	DEPLOYED	mysql-0.10.1	5.7.14     	default
moldy-toucan   	1       	Fri Sep  7 11:15:12 2018	DEPLOYED	mysql-0.10.1	5.7.14     	default
```

Release の削除

    helm delete braided-quail

Delete しても記録が残っていて同じ名前を使えない。完全に消したい時は --purge を使う。

    helm delete --purge customized

## Chart をカスタマイズしてインストール

カスタマイズ項目を見てみます。

    helm inspect values stable/mysql

実際にカスタマイズします。config.yaml に差分を書いて helm install の -f オプションに渡します。例えば MySQL のユーザ hoge とパスワード hige を作ります。

```
echo '{mysqlUser: hoge, mysqlPassword: hige}' > config.yaml
helm install stable/mysql -n customized -f config.yaml
```

動作確認

```
$ kubectl port-forward svc/customized-mysql 3306 & # ポートフォワーディングの設定

$ mysql -h 127.0.0.1 -P 3306 -u hoge -phige
mysql: [Warning] Using a password on the command line interface can be insecure.
Handling connection for 3306
Welcome to the MySQL monitor.  Commands end with ; or \g.
```

上手く行った。Chart の書き方に続く予定。。。
OculusGoでアップデートできないと嘆いている方へ

# はじめに
* OculusGoのバージョン（バージョン、ランタイムバージョン、OSバージョン）がアップデートされない原因を調査しました
    * 最新のUnityアプリを起動しようとすると「Oculus Update Required」というメッセージが表示されて実行できなくなる

# 原因
* OculusGoの自動アップデート機能を妨害していたため
    * 妨害方法：強制的に常時装着状態にしている（画像参照）（センサ部分にテープ貼って装着解除にならないようにしている（ひどいｗ））
    * <img width="1415" alt="スクリーンショット 2018-09-07 15.23.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/44076/eae0446c-8367-70cf-2d15-e1eb1071d927.png">


# 対策方法
* 常時装着状態を解除してネットワークの繋がる環境で30分くらい放置して再起動する
    * 常時装着状態を解除 ＝ センサに貼ったテープを剥がす

# わかったこと
* OculusGoは装着していないタイミングで自動アップデートを行っている
    * 手動アップデート機能は存在しない
* アップデートは一気に最新版にするのではなく段階的に行っている
    * バージョン：3.42.xxx → 3.45.xxx → 3.47.xxx
    * ランタイムバージョン：2.15.xxx → 2.16.xxx → 3.0.xxx
    * OSバージョン：user-27130.xxx → user-88830.xxx → user-113640.xxx
        * （初期状態 → 対策方法実施10分後 → 30分後、でバージョンを確認）

# 教訓
* 機器の意図しない動きを強要してはいけない
    * 自分が使っていないときも特別な機能が動いていることがある

# 参考資料
* https://forums.oculusvr.com/community/discussion/65160/oculus-go-oculus-update-required-error-for-every-app
    * 同じことではまってた人たち
ufwの設定 - Ubuntu Server 18.04 LTS

#はじめに
ufwでファイアウォールを設定する。


#手順

1: 現在の状況確認

```text:
$ systemctl status ufw
```

3: defaultのポリシー

```text
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
```

3: sshの許可ポリシー

```text:(/etc/services参照)
$ sudo ufw allow ssh
```

4: NNNNNポートの許可ポリシー

```text:
$ sudo ufw allow NNNNN
```

4: sshの許可ポリシーの削除

```text:
$ sudo ufw delete allow ssh
```

6: ステイタスを確認

```text:
$ sudo ufw status verbose
```

7: ufwを有効にする

```text:
$ sudo ufw enable
```



#リファレンス

- [manpages.ubuntu.com - ufw](http://manpages.ubuntu.com/manpages/bionic/en/man8/ufw.8.html)
javascript/parsimmonでインデントで構造化された文書のパーサを書く

## 概要・意図

パーサコンビネータ[parsimmon](https://github.com/jneen/parsimmon)を使用します。js以外でも同様のパーサコンビネータが色々あります。数式やプログラミング言語のような再帰を含む言語を表現可能です

パーサやマークアップに興味があれば、文脈自由文法とかBNF記法とか、そのあたりのキーワードで調べると幸せになれるかもしれません

python,pug,hamlのようなインデントベースのブロック構造をパースしたい需要で作ったものです

## 入出力例・実装

inputの文字列からoutputの配列を生成します

```:input
@id1
  aaa
@id2
  ccc
  @id2-1
    ddd
    eee
    @id2-1-1
      xxx
    fff
  @id2-2
    ggg
    hhh
```

```:output
[
  [
    "@id1",
    [
      [
        "aaa"
      ]
    ]
  ],
  [
    "@id2",
    [
      [
        "ccc"
      ],
      [
        "@id2-1",
        [
          [
            "ddd"
          ],
          [
            "eee"
          ],
          [
            "@id2-1-1",
            [
              [
                "xxx"
              ]
            ]
          ],
          [
            "fff"
          ]
        ]
      ],
      [
        "@id2-2",
        [
          [
            "ggg"
          ],
          [
            "hhh"
          ]
        ]
      ]
    ]
  ]
]
```


```javascript:parser.js
import {regex, string, optWhitespace, lazy, newline, whitespace, seq} from 'parsimmon'

function lexeme(p) { return p.skip(optWhitespace) }

const lparen = lexeme(string('{'))
const rparen = lexeme(string('}'))

const elem = lazy('', () => { return block.or(line) })

const id   = lexeme(regex(/@[\w-]*/i))
const atom = regex(/[^\{\}\r\n ]+/).skip(regex(/ */))

const line  = optWhitespace.then(atom.many()).skip(regex(/\n+/))
const block = optWhitespace.then(seq(id, lparen.then(elem.many()).skip(rparen)))

const root = block.many()

export default {
  preserve(string) {
    let value = ''
    let level = 0
    string.split(/\r\n|\r|\n/).forEach((line) => {
      const indent = Math.floor(line.match(/^ */)[0].length / 2)
      if (level < indent) {
        value += "{".repeat(indent - level) + "\n" + line + "\n"
      } else if (level > indent) {
        value += "}".repeat(level - indent) + "\n" + line + "\n"
      } else {
        value += line + "\n"
      }
      level = indent
    })
    value += "}".repeat(level)
    return value
  },
  parse(string) {
    return root.parse(this.preserve(string)).value
  }
}
```

インデントからブロック終端を判別する実装が思いつかなかったので前処理で{}で囲むようにしています
なお、@に特殊な意味を持たせているのは固有の要件からで、単にインデントを分解したいだけならもっとシンプルに書けます

もっとカッコいいやりかたがあれば教えてください
【Android,iPhone】カード番号を入力させる際のカメラによるスキャン

#スマホカメラによるカードの読み取りを行いフォームに入れる

入力欄にカーソルが来ると、
    Android：「新しいカードをスキャン」
    iPhone: 「クレジットカードを読み取る」
と出ます。

決済用フォームなどであるとUI, UXの面で良いかもしれません
私は手入力の方が速いので好きですが…

# Autocomplete
特別な事はなく、form の autocomplete に特定の設定をします。
WHATWG HTML Standard という標準仕様があり、それによって各ブラウザが実装しているようです。
[WHATWG HTML Standard:autofill](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill)

ページを見ていくと、いろいろありますがカード関係に注目すると以下のようになっています。
（細かくは他にもありますが主なものとして）

- cc-number
    クレジットカード番号

- cc-exp-month
    有効期限（月）

- cc-exp-year
    有効期限（年）

- cc-csc
    セキュリティコード

- cc-type
    カードタイプ

- cc-name
    所有者名

これらを設定してあげることで、特に難しいこともなく、スキャンしてくれます。便利すぎ！
スキャントリガーは cc-number です。

カード番号の保持に関してはセキュリティが厳しい昨今、決済業者に任せて自社では持たない、
という事が多いとは思いますが、もし参考になれば幸いです。

# 注意事項
自己証明書でのhttpsのサイトでは動きません。もちろんhttpsでない場合も動きません。

# 参考文献
[最適なフォームの作成　by developers.google.com](https://developers.google.com/web/fundamentals/design-and-ux/input/forms/?hl=ja)
AWS Solution Architect 取得に向けて①

自分なりの勉強法まとめ

私自身AWS部署に着任してから5か月ぐらいたっており、実際の案件でも少しずつAWSを利用し始めて
AWS自体への興味が湧いてきて本資格を目指すことになりました。

あと、弊社にはassociateの資格を持っている方は何人かいますが、Professionalまではまだ
持っていないので、私がその第1人者になろうという目標で日々勉強に励んでおります。

なので、今から私が説明する方法はProfessionalまでを見込んだ勉強法になるので
ほかのQiita記事より過酷な道になるかもしれません。

参考サイト
https://aws.amazon.com/jp/certification/certification-prep/
https://www.aws.training/Certification
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

#AWS WEB問題集
・５回ほど説いてます。

1回目：答えなんかわかるわけないので、適当に選んで添付サイトをとりあえず
読みまくりました。必要に応じてはさらに調べました。
（例：情報が昔過ぎて最新情報を検索。RDS for MySQLってInnoDB使っているみたいだけど、そもそもInnoDBって何？など）
2回目：ちょっと回答わかってきたので選択しつつ、早回し問題解いていきます。
もちろん不足している概念とかは調べながら
3回目：2回目で実施したことの繰り返し
4回目、5回目：2回目、3回目の際、下記のようにメモしておいた問題を中心に実施しました。

・知らない問題、暗記が必要そうな問題はメモ
試験直前対策として
私は以下のようカテゴリ別に分けてみました。
１．わけがわからない問題
２．Route53レコードタイプ
３．数値に関する問題（出るかどうかわからないが）
４．EC2ファイルに関する問題
５．Ec2インスタンスライフスタイル
６．IAMユーザ、グループ、ロールの違いについて
７．S3URLに関する問題
８．S3データ整合性に関する問題

#海外サイト
http://jayendrapatil.com/aws-solution-architect-professional-certification-exam-preparation-guide/
https://blue-clouds.com/
http://blogs.catapultsystems.com/cmoore/archive/2016/01/27/aws-certified-solutions-architect-study-guide-introduction/

#動画サイト
講義のおすすめ
SAA講義：https://www.udemy.com/aws-certified-solutions-architect-associate/
動画だけ
https://acloud.guru/learn/aws-certified-solutions-architect-associate
あとで模擬試験も受けられる。説明とか参考すべきURL、正解率に関して詳しく分析してくれる。
SAP講義：https://linuxacademy.com/amazon-web-services/training/course/name/aws-certified-solutions-architect-professional-level


#ブログ作成
実は2回目からやり始めましたが、よく問われているサービスを中心にInputした概念を他人に説明するという名目でOutputするツールとして利用しています。

#AWSが提供する資料
いきなり始めると読みづらいですが、上記の方法をある程度クリアした上で
下記の資料は必ず読むべきです。

AWS_Cloud_Best_Practices.pdf
AWS-Cost-Optimization-Pillar.pdf
AWS-Operational-Excellence-Pillar.pdf
AWS-Performance-Efficiency-Pillar.pdf
AWS-Reliability-Pillar.pdf
AWS-Security-Pillar.pdf

#実習
ほかに合格者の方の記事にもたくさん書かれていますが、実習は何よりも大事で、いち早くそのサービスの特徴やコンセプトを身につく方法だと思います。

ちなみに私自身現在、ほかではあまり経験できないことを担当しています。
それは、弊社内の全社員を対象にAWSのサービスを紹介し、実習を手助ける勉強会を進行をやらせて頂いたことで、勉強会を進行するにあたって色々準備していた経験が結構働いたかもしれません。

ここまではする必要はないですが、実機を触ってみるということはAWSの資格を勉強する上では必須だと思います。
#その他
・機能ごとの色分けに着目

AWS_Simple_Iconsを見ればわかりますが、AWSが提供している機能って分野ごとに色とかが分かれています。
連想方式(?)その色分けをみてこれってどの領域のサービスなんだとイメージした上で
問題に取り組んだら意外と正解が見えてくる場合も多かったです。

# まとめ

次回は模擬試験と実際の試験についてまとめてみたいと思います。
shellでslackにログを残す

# 事前準備
slackのアプリケーションからIncomming Webhooksを作って `Webhook URL` を取得

# コード

```shell
today=$(date "+%Y%m%d")
month=$(date "+%Y%m")
slack_webhook_url="https://hooks.slack.com/services/*******/*******/*****************"
```

```shell
function slack_info () {
    title=${1}
    text=${2}
    PAYLOAD=`cat << EOS
        payload={
            "username": "sushi",
            "attachments": [{
                "color": "#00FF00",
                "title": "[INFO] ${today} ${title}",
                "text": "${text}"
            }],
            "icon_emoji": ":sushi:"
        }
EOS`

    curl -X POST --data-urlencode "${PAYLOAD}" ${slack_webhook_url}
}
```

```shell
function slack_error () {
    title=${1}
    text=${2}
    PAYLOAD=`cat << EOS
        payload={
            "username": "sushi",
            "attachments": [{
                "color": "#D00000",
                "title": "[ERROR] ${today} ${title}",
                "text": "${text}"
            }],
            "icon_emoji": ":sushi:"
        }
EOS`

    curl -X POST --data-urlencode "${PAYLOAD}" ${slack_webhook_url}
}
```
Db2:その月から特定の日を取り出す関数(DAYOFMONTH,FIRST_DAY,DAYS_TO_END_OF_MONTH)

Db2 11.1には、日付操作を行う関数についても多くの拡張があり、日付・時刻操作をSQLでより簡単に行えるようになっています。

日付・時刻操作に関して、Oracle, Netteza, PostgreSQL, MySQLなど、他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるよう、SQLの互換性がより強化されています。


参考(前回までの記事) 
[Db2:日付,時刻の操作を行う関数(NOW,EXTRACT)](https://qiita.com/camp07/items/c07c662bfbbdbad73f24)
[Db2:日付,時刻の操作を行う関数(DATE_PART)](https://qiita.com/camp07/items/8bec02c01f6d7968d00a)
[Db2:日付,時刻の操作を行う関数(DATE_TRUNC)](https://qiita.com/camp07/items/12ecc353d3b8acce6733)



# その月から特定の日を取り出す３つの関数

DAYOFMONTH - 日付を表す1から31の整数を戻します
FIRST_DAY - 月の初日を表す日付またはタイム・スタンプを戻します
DAYS_TO_END_OF_MONTH - 月末までの日数を戻します



次のNOW関数は、CURRENT TIMESTAMPを戻しますので、これら3つの関数の計算のベースになります。
Db2のSAMPLEデータベースに接続して、次のSQLを実行します。

```
VALUES NOW
```

```

1
--------------------------
2018-09-07-14.30.58.633000

  1 レコードが選択されました。

```




# DAYOFMONTH関数

DAYOFMONTH 関数は、日付を表す1から31の整数を戻します。

Db2のSAMPLEデータベースに接続して、次のSQLを実行します。

```
VALUES DAYOFMONTH(NOW)
```
9月7日のため、7が戻ります。

```

1
-----------
          7

  1 レコードが選択されました。

```


# FIRST_DAY関数

FIRST_DAY関数を使って、その月の初日を、簡単に取得することができます。

Db2のSAMPLEデータベースに接続して、次のSQLを実行します。

```
VALUES FIRST_DAY(NOW)
```
9月1日が戻ります。

```

1
--------------------------
2018-09-01-14.39.00.542000

  1 レコードが選択されました。

```

# DAYS_TO_END_OF_MONTH関数

最後に、DAYS_TO_END_OF_MONTH関数は、月末までの日数を戻します。
その月の最後の日である場合は、0が戻ります。

Db2のSAMPLEデータベースに接続して、次のSQLを実行します。

```
VALUES DAYS_TO_END_OF_MONTH(NOW)
```
今日は9月7日のため、23が戻ります。

```

1
-----------
         23

  1 レコードが選択されました。


```



#参考資料



- [Db2 11.1 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [SQL の互換性の機能拡張](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html)
        - 新しい組み込み集約関数およびスカラー関数
    - [NOW スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061945.html)

    - [DAYOFMONTH スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061475.html)


    - [FIRST_DAY スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061474.html)


    - [DAYS_TO_END_OF_MONTH スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061473.html)
sshのポート設定 - Ubuntu Server 18.04 LTS

#はじめに
sshのポートを設定する。ファイアウォールに注意。


#手順

1: SSH設定ファイルのコピー編集

```text:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
```

2: /etc/servicesで空いている番号を選択

```text:
NNNNN
```



3: /etc/ssh/sshd_configを編集
 
```text:
#Port 22
Port NNNNN

```

4: ssh.confのチェック

```text:
$ sshd -t

```

5: sshdの再起動

```text:
$ sudo systemctl restart sshd.service

```

6: ssh再接続

```text:22番ポート指定でログインできなければOK
$ ssh -p 22 hoge@NNN.NNN.NNN.NNN

```

```text:NNNNN番ポート指定でログインできればOK
$ ssh -p NNNNN hoge@NNN.NNN.NNN.NNN

```





#リファレンス

- [iana - Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?&page=141)
PowerShellとExcelで指定フォルダ以下のPDFファイル一覧をリンク付きで出力

#はじめに
「記録文書の一覧が欲しい」
「元のWordファイルじゃなくて署名の入ったPDFファイルの一覧が欲しい」
そうかい…ファイル検索って知ってる…？

#参考資料
[VBAでハイパーリンクを設定(Hyperlinks.Add)](https://vbabeginner.net/vba%E3%81%A7%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E8%A8%AD%E5%AE%9Ahyperlinks-add/)

#ソース
```powershell:make_pdflist.ps1
# フォルダ内のpdfすべてのリンク付きブックを作成する

#いつものを関数化した
function FolderDialog{
    [CmdletBinding()]
    param(
        [string]$path
    )
    Process{
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
        $process = [System.Diagnostics.Process]::GetCurrentProcess()
        $window = New-Object Windows.Forms.NativeWindow
        $window.AssignHandle($process.MainWindowHandle)

        $dialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $dialog.Description = "フォルダを選択してください"
        $dialog.SelectedPath = $PWD
        $ret = $dialog.ShowDialog($window)
        if($ret -eq [System.Windows.Forms.DialogResult]::OK){
            $Path = $dialog.SelectedPath
            return $path
        } else {
            Read-Host "キャンセルされました。ENTERキーを押してください。"
            return
        }
    }
}

#フォルダ選択ダイアログ関数からパスを取得
$folder = FolderDialog 
$list = Get-ChildItem -Recurse $folder *.pdf
$num = $list.count

#Excelの下ごしらえ
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.DisplayAlerts = $true
$book = $excel.Workbooks.Add()
$sheet = $book.Sheets(1)

#内容を入力していく
1..($num) | %{
    $sheet.cells.item($_,1) = $list[($_-1)].FullName
    $sheet.hyperlinks.Add($sheet.cells.item($_,1),$list[($_-1)].FullName)
}
$book.SaveAs($folder +"\"+ (Split-Path $folder -Leaf)+"_pdflist.xlsx")

#末端処理
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($sheet)
```

#出力
![pdflist.png](https://qiita-image-store.s3.amazonaws.com/0/276779/eecac2f2-dea3-1d7f-7dbe-2529b5309bc4.png)
ヨシ！
あとは好みのフォルダを選択して実行してもらえば大丈夫。