OmniAICreator/Qiita-1.07M huggingface dataset:
Grafanaのダッシュボードで自動更新しているとサーバのIO負荷が高くなった時勝手にログアウトしてしまう→使用するDBをSQLite3から変更して解決

# 環境
* ホスト: Raspberry Pi 4 (4GB)

GrafanaはDockerHubに公開されているイメージを使用して動かしています。 (以下のdocker-compose.yml参照)

```yaml:docker-compose.yml(抜粋)
version: "2"
services:
  prometheus:
    # 省略
  grafana:
    image: grafana/grafana-arm64v8-linux
    links:
      - prometheus
    volumes:
      - grafana-data:/var/lib/grafana
volumes:
  grafana-data:
```

# 現象
例えばRaspberryPiのカーネルのtar.gz[^1]を展開しているときの状態をiostatで確認すると、%iowaitの値が50近い値になります。これ自体はRaspberryPiのSDカード読み書き性能はそこまで高くないので、しょうがないことだと思います[^2]。

[^1]: [raspberrypi/linux](https://github.com/raspberrypi/linux/releases)で配布されているものです
[^2]: ioniceでも対処できるかもしれないですが、使っているIOスケジューラがbfqなので使えないのと、今回はSQLiteのロック範囲が広すぎることが原因みたいだったのでioniceは使いません

ただ、その負荷が高くなったタイミングでGrafanaのダッシュボードの自動更新が走ると、以下のような現象が発生しました。

* Grafana上にUnauthorizedのメッセージが表示される
* Unauthorizedのメッセージが表示された後、勝手にログアウトされたり、Server Errorの画面が表示される
* `docker-compose logs grafana`に以下のようなログが記録される

```text:表示されるエラー
grafana_1            | t=2020-09-06T04:34:56+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="database is locked"
```

# 分析
ログに記載されている通り、データベースがロックされていてユーザの情報が取得できず、ログアウトしてしまっているようです。

DockerHubに公開されているGrafanaは、何も設定しなければSQLite3をデータベースに使用するようになっています。SQLite3のロックはデータベース単位でしかかけられないため、IO負荷が高いときロックからロック解除までの時間がかかり、その間にユーザ情報の読み取りが発生したために上記エラーが発生したと考えました。

# 対処
ロックが問題であれば、PostgreSQLなど他のRDBMSであれば行レベルでのロックに対応しているため、ロックにより行のデータが取得できない可能性は減るだろうと言うことで、PostgreSQLを使用するようにGrafanaを設定することにしました。

GrafanaのDockerイメージは`GF_`で始まる環境変数を設定すると、grafana.iniの設定をオーバーライドできます。そのため、docker-compose.ymlを以下のように設定してPostgreSQLを使用するように設定しました。

```yaml:docker-compose.yml(抜粋)
services:
  grafana:
    image: grafana/grafana-arm64v8-linux
    ports:
      - 3111:3000
    links:
      - prometheus
      - postgres
    environment:
      - GF_DATABASE_TYPE=postgres
      - GF_DATABASE_HOST=postgres
      - GF_DATABASE_NAME=grafana
      - GF_DATABASE_USER=grafana_user
      - GF_DATABASE_PASSWORD=aoZ62dMb
  postgres:
    image: postgres:12.4
    environment:
      - POSTGRES_USER=grafana_user
      - POSTGRES_PASSWORD=aoZ62dMb
      - POSTGRES_DB=grafana
```

この設定でgrafana.iniに以下の設定を行ったことになります。

```ini
[database]
type=postgres
host=postgres
name=grafana
user=grafana_user
password=aoZ62dMb
```

以上の設定で、これまで勝手にログアウトされていた時と同じ状況を再現しても、勝手にログアウトされることがなくなりました。

ただ、先述の通りRaspberryPiのSDカードの読み書き性能は高くないので、もしかするとこれでもシステムの負荷によってはログアウトしてしまうかもしれないです。とはいえ、その確率は大幅に減ると思っています。

# 参考ページ
* https://grafana.com/docs/grafana/latest/installation/configure-docker/
* https://grafana.com/docs/grafana/latest/administration/configuration/
ヘッダーメニューが完成した後の中身の作り方

本格的な中身の作り方を忘れてしまった人のために、中身を作る型を紹介していきます

```html:html
<body></body>の中にメインコンテンツのコードを記述していきます

<div class="main">
 <div class="copy-container">
  <h1>文字を入れる</h1>
  <h2>文字を入れる</h2>
 </div>
  <div class="contents"></div>
  <div class="contact-form"></div>
</div>
```

続いてcssを見ていきましょう

```css:css
.main {
}

.copy-container {
}

.contents {
}

.contact-form {
}
```

以上になります。
ANTLRでTSQLを解析してみる #02 GitHubにTSQL構文解析プログラムを公開した


# 経緯
[前の記事](https://qiita.com/Hidenori/items/19ddfd1f7cc1d8ddbef7)でTSQLの公開されているAntlr4の文法ファイルを、大文字小文字問わないよう変更した。
その後、この文法ファイルで構文解析するプログラムを作成しGitHubに公開した。

[GCer-Hidenori/ANTSQLParser](https://github.com/GCer-Hidenori/ANTSQLParser)。

# 今後の展開
- テスト作成(実施済み)  
Microsoftのサイトに公開されているSQLのサンプルを元にテストケースを作成した。
- テスト結果のフィードバック  
実施中。  
[元としたTSQLの文法ファイル](https://github.com/antlr/grammars-v4/tree/master/sql/tsql)は最新の文法には対応していない。  
それ以外にも不具合が散見される。  
これをテスト結果を元に修正する。
- TSQL以外に対応  
Oracle等にも対応する。
[git] 特定のフォルダ下にあるファイルをすべてリネームする

リネームしたいファイル群があるフォルダを下記のコマンドで消す

```
git rm -r --cached 対象フォルダ
```

コマンドで消した後、ステージしてコミットする
ステージした段階で `git status` で `rename Data/{file => FILE} (100%)` のような表示が確認できれば良い

```
git add 対象フォルダ
git commit -m"コミットメッセージ"
```
【Vuetify】v-data-tableの特定の列のヘッダーをv-slotを使用してテキスト以外の要素を入れる方法

# 概要
基本的な`v-data-table`の機能は使用したいけど、特定の列のヘッダーをテキスト以外の要素を入れるなどのカスタムをしたい場合に。
ただ、`v-slot`の指定の仕方はどうだったかしら？となりがち(;^ω^)

覚え書きも兼ねてコードサンプルを記事に。


## script側のサンプル

```typescript
// TypeScript形式で書いています。TypeScriptではない場合DataTableHeader[]の型定義は不要
headers: DataTableHeader[] = [
  {
    text: 'デザート (100g serving)',
    align: 'start',
    sortable: false,
    value: 'name',
  },
  { text: '(カスタムするヘッダー部分です)', value: 'hoge' }, // この行のvalueをtemplate側で使います
  { text: '脂肪 (g)', value: 'fat' },
]

// itemsのデータは省略します・・・。
```

## template側のサンプル

```html
<template>
  <v-data-table
    :headers="headers"
    :items="desserts"
    item-key="name"
    class="elevation-1"
    hide-default-footer
    disable-pagination
  >
    // 次の行に注目   ※ "={ item }" の部分はおまけの知識です。特定の列のヘッダーをslotで差し替えには関係ない。
    <template v-slot:header.hoge="{ item }"> 
      // ----- ここからお好きなようにカスタム！ -----
      <div class="d-flex align-center">
        <v-checkbox
          @change="onChanged(item)"
        ></v-checkbox>
        <span>ほげほげ</span>
        <v-radio></v-radio>
      </div>
      // ----- ここまでお好きなようにカスタム！ -----
    </template>
  </v-data-table>
</template>
```

## コードサンプルの要点
`header`オブジェクトの`value`というプロパティの値を`v-slot:header.`の後に続いて記述するとその`value`の値を持つ列のヘッダー部分がslotで差し替えられ、自由にカスタムすることができます。
Linux Mintで動画編集（OpenShot Video Editor)

kdenliveと比較しましたが、OpenShotの方が使いやすいです。
字幕をつける作業がkdenliveは面倒でした。


この記事はほぼまだ下書きです。

# 導入(apt)

OpenShot-qtをインストール
Inkscapeと自動で入る
Blenderはaptで入れるとVersionがふるくOpenShotで使えない

1.  ~~OpenShot Video EditorをFlatpakインストール~~
1. OpenShot-qtをインストール
1. ~~InkscapeをFlatpakインストール~~
1. Blenderをインターネットからダウンロードしてインストール
1. OpenShot Video Editorを起動
1. 設定でBlenderの実行パスを3で導入したBlenderのパスに変更

~~※ Blenderの導入に関して~~
~~aptでもflatpakでもBlenderを導入できるが、OpenShot Video Editorで動画タイトルを選択するとエラーとなる。~~
~~インターネットからダウンロードして展開したものでも、/usr/shareなどに置いて使おうとしたらエラーとなったことから、パーミッションの問題と思われる。~~

※ Blenderの導入に関して
OpenShotとBlenderで、bpyというPythonのモジュールに相違がある模様
MoreEffectiveAgile 6章がまじで耳が痛かった

MoreEffectiveAgile
https://www.amazon.co.jp/dp/4822286584


6章、読んでてしんどくなるほど今のチームはダメな方だった。ここから変えていきたい。

# 自律・熟達・目的によるチームの動機付け
生産性を左右する最も大きな要因は内発的な動機付け（モチベーション）である。
ダニエル・ピンクの著書「Drive (2009)」では、これらが自律・熟達・目的によって大きく変化するという理論を提唱している。

## 自律

| 自律性を養う方法 | 自律性を損ねる方法 |
| --- | --- |
| 方向性を定めることでリードする | 作業の実行方法の細かな点にリーダーが関心をもつ |
| 方向性を確約する | 方向性を頻繁に変更する |
| 自樹的な行動を取るために必要なスキルをチームに取り入れる | 作業を行うために必要な専門知識をチームに与えない. 高度にマトリックス化された個人を集めただけでチームになっていない |
| ふりかえりによりチームがプラクティスの変更を試みることを許可する | チームの経験に関係なく、あらかじめ決められたプロセスを強制する |
| 合意した要求獲得プロセスを通じて要求を与える | チームまたはチームメンバー個人に要求を直接プッシュする | 
| 仕事のできるチームはそのままにする (人ありきで仕事を割り当てる) | チームの解散と編成を頻繁に行う (仕事ありきでそこに人を割り当てる) |
| チームが間違いを犯しても、そこから学ぶことが許されている | 間違いを罪とみなし、チームを罰する |


#### 事例
- 日程や要求をギチギチに確定したあとで（ただし仕様は不確定) 、反論のできないメンバーをそこに割り当てる
- 小さな文言の一つ一つをなぜか位の高い人が決めたがる
- 朝令暮改でリリースの内容・日程が変わる


## 熟達
| 熟達を支援する方法 | 熟達を阻む方法 |
| --- | --- |
| ふりかえりの時間を設ける | ふりかえりに反対する |
| 学習と改善を目的として定期的に変更を奨励する | 変更を許可しないか、面倒な変更承認プロセスを要求する |
| 開発者に新しい技術分野の’調査を許可する | 開発者の作業を当面のビジネスニーズに限定する ｜
| 合宿やハッカソンを支援する | 実験に反対する |
| 具体的な改善目標を立てた上での訓練を支援する | ひたすらタスクに集中することを強要し、個人の上達のために時間を使うことを許可しない |
| 新しい分野へのメンバーの進出を許可する | 最も経験があるところに留まることをメンバーに要求する |

#### 事例
- 週に30分のふりかえり時間を設定できない
- 怖すぎて新規性の高い実装・ライブラリの使用が許可されない
- タスクを消化するため改善に充てる時間がない


## 目的
| 目的意識を養う方法 | 目的意識を損ねる方法 |
| --- | --- |
| 開発者を実際の顧客と定期的に接触させる | 開発者が顧客と直接やりとりすることを制限する |
| 開発者を社内のビジネス担当者と定期的に接触させる | 開発者と社内のビジネス担当者を「サイロ化」し、滅多にやりとりさせないようにする |
| チームの仕事を取り巻く全体像を定期的に伝える | 不定期に行われる全社ミーティングでのみ全体像を伝える |
| コミュニケーションを現実に根ざしたものにする | 現実から切り離された月並みな情報しか伝えない |
| チームの仕事が現実世界にどのような影響を及ぼしているかを伝える | 全体像に関する情報はあくまでチームリーダーが知りうる情報であり、チームが「知る必要のない情報である」と断言する |
| 組織にとって質の高い作業に価値があることを強調する | 会社にとっての目先の利益や短期的なデリバリー目標だけを説明する |

#### 事例
- メンバーによっては全体周知にすら招待されていない
- ユーザーと接触する機会はない
- 質の高いコードより期日までのリリース
jenkins-2.249.1-1.1.noarch.rpm の公開鍵がインストールされていません


```yum update```でJenkinsのアップデートでこけた．


```shell:エラー文
$ sudo yum update
・・・
・・・
中略
・・・
・・・
トランザクションの要約
========================================================================================================================
更新  14 パッケージ

合計容量: 115 M
Is this ok [y/d/N]: y
Downloading packages:
warning: /var/cache/yum/x86_64/7/jenkins/packages/jenkins-2.249.1-1.1.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 45f2c3d5: NOKEY


jenkins-2.249.1-1.1.noarch.rpm の公開鍵がインストールされていません

```

## 解決方法


以下を実行

```
$ sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
$ sudo yum update
```

解決した

## 参考

[I'm getting error “Public key for jenkins-2.232-1.1.noarch.rpm is not installed” while installing AWS on Jenkins [closed]
](https://stackoverflow.com/questions/61344317/im-getting-error-public-key-for-jenkins-2-232-1-1-noarch-rpm-is-not-installed)

誰かの参考になれば
React Navigation v5のデモアプリをDocker+Expoを使って動かしてみる（For Mac）

# まえおき

[React Navigation](https://reactnavigation.org/)のV5用の[デモ用アプリケーション](https://github.com/react-navigation/react-navigation/tree/main/example)をDocker+Expoを使ってモバイル端末(iOS or Android)上で動かすための手順を掲載しています。

React Navigationについて勉強中であれば是非お試しください。

# 現時点（2020/09/30）でAndroid端末の動作確認が完了していません。

現在Androido端末を調達中で検証は後日実施する予定ですが、理論上は同じ手順でAndroid端末も動作するはずです。

# 各端末情報

- PC
    - Mac OS Catalina Ver.10.15.6
    - docker version 19.03.12, build 48a66213fe
    - docker-compose version 1.26.2, build eefe0d31

- iPhone
    - iPhone XR
    - iOS:13.7

# 前提

- Expoアカウントが登録済

    アカウントの登録手順は別記事「[Expoアカウントの作成方法](https://qiita.com/hidenoritoki/items/0c5084b84dfc2126d9ec)」に掲載しています。

- PC

    - docker, docker-composeインストール済
    - gitインストール済

- モバイル端末

    - Expo Clientがインストール済

        インストールの手順は別記事「[iPhoneでExpoクライアントアプリのインストールとセットアップ方法](https://qiita.com/hidenoritoki/items/afa69ca6ce910ee28cd9)」に掲載しています。

# 手順

1. ターミナルを使ってプロジェクトフォルダを作成し移動します。

    ```
    mkdir react_navigation_demo
    cd react_navigation_demo
    ```

1. github上のreact-navigationのリポジトリをcloneコマンドでダウンロードします。

    ```
    git clone https://github.com/react-navigation/react-navigation.git
    ```

1. DockerとEXPO用の各設定ファイルを作成します。

    ```
    touch dockerfile
    touch docker-compose.yml
    touch .env
    ```

    1. dockerfileに設定内容を記載します

        ```
        FROM node:14-alpine

        WORKDIR /usr/src/app/

        RUN apk update && apk add bash
        ```

    1. doker-compose.ymlに設定内容を記載します

        ```
        version: "3"
        services:
        react-navigation:
          build: ./
          volumes:
            - ./react-navigation/:/usr/src/app
          env_file: .env
          command: bash -c "cd example && yarn start"
          ports:
            - "19000:19000"
            - "19001:19001"
            - "19002:19002"
        ```

    1. .envに設定内容を記載します

        Expoを利用する各端末のIPアドレスを設定する必要があります。
        - ~~ADB_IP~~
            - ~~検証端末のIPアドレスを指定してください。カンマ区切りで複数指定可能なようです。~~

            ※この設定は不要であることが判明しました。（2020/11/11追記）
        - REACT_NATIVE_PACKAGER_HOSTNAME: 
        
            Dockerを起動するPC端末のIPアドレスを指定してください。

        ```
        REACT_NATIVE_PACKAGER_HOSTNAME=192.168.1.204
        ```

1. Docker環境をビルドします

    ```
    docker-compose build
    ```

1. Dockerコンテナ上でのセットアップ

    1. Dockerコンテナへ接続します

        ```
        docker-compose run --rm react-navigation bash --login
        ```

    1. exampleフォルダへ移動します

        ```
        cd example
        ```

    1. yarnでセットアップします

        ```
        yarn
        ```

    1. コンテナとの接続を終了します

        ```
        exit
        ```

1. Dockerを起動します

    ```
    docker-compose up
    ```

1. ターミナル上に表示されたQRコードをモバイル端末で読み込みます

    ![スクリーンショット 2020-09-30 13.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/0ec28cc2-126b-94f5-5b09-ad648541e37a.png)

1. モバイル端末上にデモアプリが起動します

    ![IMG_8991.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/07da8eb2-1f24-ab23-12d8-6fa3240efbba.png)
Swiftってどんなもん？3週間で得られた知見

#Swift学習教材
下記の書籍を題材にSwiftを学習してます。

>SwiftUI 徹底入門 | 金田 浩明 |本 | 通販 | Amazon
https://www.amazon.co.jp/dp/4815604061


#3週間で得られた知見
実際にどんなことをしたのかは下記の通りです。

* 11章まで読了（言葉の意味がわからないこともあったけどスルーした）
* サンプルアプリのデータ構造を紙にまとめて解析
* サンプルアプリの中身をオリジナルのアセットに差し替え

この3週間で思ったことは、
**「Swiftめちゃめちゃ簡単！とっつきやすい！」**
ということでした。

ひとつの画面がひとつのswiftファイルに対応しているので、
データ構造がとてもわかりやすく、何が起因してどんな画面になるかが容易に想像できます。

（正直、本がなくても、サンプルプログラムを自分で解読していくだけで
なんとなく理解できてしまうぐらいには簡単だったと思う）


新しいディレクトリを作成して、視覚的にわかりやすいようにファイルを整理しても、
Swift側で勝手に探してくれる。
パスの引き直しが必要ないことが地味に嬉しい。

Swiftはプログラミング初心者の人に向いてる、と言われる理由がわかりました。

#Swift学習する前の自分が知りたかった情報
もしかしたら過去の自分のようにとりあえず触ってみたい人がいるかもしれないので、
そんな人向けに情報を残しておきたいと思います。
最低限、下記のことを知っておけばあとは調べながら学習できるはず。

### 各ファイルの役割
｢aa」プロジェクトを作成すると画像のようなデータ構造でプロジェクトが作成される。
![defaultaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703702/42b218cc-d1b0-1679-9be2-7e41736a7d93.jpeg)


##### ContentView.swift
アプリを開いたとき、最初に表示される画面（ビュー）。
この画面を一番上の階層として、新しい画面をさらに下の階層に作成していくイメージ。

Swiftファイルをデフォルトで作成したとき、二つの要素が構造体として定義されている。
ContentView.swiftを例にとってみると下記二つ。

* struct ContentView: View{}
* struct ContentView_Previews: PreviewProvider{}

ContentViewは実際にアプリの内容を記述する構造体。
デフォルトでは「Hello, world!」と表示されるテキストが書かれている。
この部分をググりながら触ってるだけで理解できると思う。

ContentView_Previewsはキャンバスと呼ばれる場所にプレビューするための構造体。
中身にContentViewが参照されていることからなんとなく察せる。
モダンな言語？なので、自分が書いたコードが瞬時に表示されるのは楽しい！

##### Assets.xcassets
画像や色といったアセット（素材みたいな意）を格納しておく場所。
画像を表示させるときにここの画像を参照先に指定する。

Swiftで画像を表示、挿入する方法を調べればここの説明も出てくる。


### 実行
キャンバスに表示されている端末の上部に再生ボタンがあるので、それを押せばプレビューが開始される。
その他、キャンバスに表示させる端末を変更することで表示の変化を見ることができる。
![previewaaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703702/5161f657-c721-1d1c-81c9-74c6e6539298.jpeg)
（プロジェクトを作成したばかりだとキャンバスには何も映っていない可能性がある。
そのときはキャンバス右上の「Resume」を押せば端末が表示されると思う。倍率も適当な数値に変更した方が良い。）

コードを変更してすぐプレビュー、という流れがとてもインタラクティブで触ってて楽しい。

#おわりに
Swiftをざっと勉強したときに得られた知見を雑多にまとめてみました。
過去の僕が欲しかった情報だけを記載しています。

プレビューで簡単に確認できるおかげで検証作業は気軽にできますし、
どの行がどの要素に対応づいているか直感的に理解することができるのが本当に感動しました。

TECH::CAMPが始まってしまったのでSwiftアプリ開発は一時的にストップしている状況ですが、
プログラミングに触ったことすらない本当の初学者向けにしっかりとした記事を書きたい欲が出てきました。

時間があるときにコツコツ下書きに書き留めておきます。
いいねの数で並べ替えてページネーション

##はじめに
いいねの数を多い順で並べ替えた後、ページネーション機能を追加するやり方です。
実装するのに苦戦した為、備忘録として残しておきます。
##手順

####gemをインストール


```Gemfile
gem 'will_paginate'
gem 'bootstrap-will_paginate'
```

####アソシエーションを定義する


```post.rb
  belongs_to :user
  has_many   :likes,    dependent: :destroy
  has_many   :liked_users, through: :likes, source: :user
```

```user.rb
  has_many :likes,    dependent: :destroy
  has_many :liked_posts, through: :likes, source: :user
  has_many :posts,    dependent: :destroy
```

```like.rb
  belongs_to :post
  belongs_to :user
```
####クラスメソッドを定義する

```post.rb
  def self.sort_like
    Post.all.sort{|a,b| b.liked_users.count <=> a.liked_users.count}
  end
```
####コントローラーに反映させる
```post.controller
 @posts = Post.sort_like.paginate(page: params[:page],per_page: (1ページに表示したい数))
```

paginateメソッドは配列にはデフォルトでは使えない。
config/initializersの下にファイルを作り、require 'will_paginate/array'を追記する。

```will_pagenate.rb
require 'will_paginate/array'
```
####ビューに表示させる
```
<% @posts.each do |post|%>
  <%= post.XXX %>
<% end %>
<%= will_paginate @posts %>
```



##参考にさせて頂いた記事
https://qiita.com/Kazuhiro_Mimaki/items/1f8e851b957f511c88e9
https://qiita.com/nakamurau1@github/items/13e081fcba1af0ca399f
[Laravel] CRUD 詳細画面

## 概要

よくあるCRUDの個人メモ。
一覧画面から詳細画面への遷移を簡単にまとめる。

## 前提条件

以下記事を参考に一覧画面を作成していること。
https://qiita.com/Hiroto10/items/4723b96b491b1ce88278

## コントローラ

ルーティングを確認すると、詳細画面は`TasksController@show`を使用することがわかるので編集。

```app/Http/Controllers/TasksController.php
    public function show($id)
    {
        $task = Task::findOrFail($id);

        return view('tasks.show', [
            'task' =>  $task
        ]);
    }
```

## view

### 詳細画面

一覧画面同様、テーブル形式で出力させる。

```resources/views/tasks/show.blade.php
@extends('layouts.app')
@section('content')

  <table class="table table-striped">
    <tr>
      <th>id</th>
      <td>{{ $task->id }}</td>
    </tr>
    <tr>
      <th>タスク</th>
      <td>{{ $task->task }}</td>
  </tr>
  </table>

@endsection
```


### 一覧画面

一覧画面の`id`が押下されたら詳細画面に飛ぶよう修正する。

```resources/views/tasks/index.blade.php
@extends('layouts.app')
@section('content')
  @if (count($tasks) > 0)
    <table class="table table-striped">
      <thead>
        <tr>
          <th>id</th>
          <th>タスク</th>
        </tr>
      </thead>
      <tbody>
        @foreach ($tasks as $task)
        <tr>
          <td>{!! link_to_route('tasks.show', $task->id, ['task' => $task->id], []) !!}</td>
          <td>{{ $task->task }}</td>
        </tr>
        @endforeach
      </tbody>
    </table>
  @endif
@endsection
```

![スクリーンショット 2020-09-30 23.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/069e38a2-7994-b30e-f54f-90a5beb1f704.png)

idを押下し、詳細画面へ遷移すればok。

---
以上
Homebrewでtransfer closed with outstanding read data remaining


Homebrewでtransfer closed with outstanding read data remaining が発生した。

```
HEAD is now at 0629c29b8 Merge pull request #8823 from Homebrew/sorbet-files-update
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': transfer closed with outstanding read data remaining
Error: Failure while executing; `git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core` exited with 128.
Error: Failure while executing; `/usr/local/bin/brew tap homebrew/core` exited with 1.
Failed during: /usr/local/bin/brew update --force
```

こなれた手順なのに？？？となったが、ウイルスソフトの接続を切って brew doctor で解決した。
※在宅勤務の都合でSymantecのノートン360をインストールしていた。(初期設定)

```
$ brew doctor
Your system is ready to brew.
```

macOS Catalina 10.15.6
git version 2.24.3 (Apple Git-128)
最もシンプルなAWS Lambdaの実装

#はじめに
「とりあえず、AWS Lambdaを体験してみたい」人用の記事です。
初心者向けに「S3と連携して～」みたいな記事は多いのですが、
意外とシンプルな実装を投稿している人が少なかったので今回やってみました。
早ければ１０分程度でAWS Lambdaを体験できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/65b90fb1-e052-96a5-a79f-9748ba0d8ba3.png)

<div style="text-align: center;">
今回作成するシステムの構成図↑
</div>
#全体の流れ

①AWS Lambda関数の作成
↓
②API Gatewayの作成、AWS Lambdaとの接続
↓
③テスト

#①AWS Lambda関数の作成
一から作成で、test_funcという名前の関数を作成します。
ランタイムは何でもいいですが、今回はpyhonを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/ed439827-090c-b57c-e9fc-12a2078dff94.png)

作成するとこんな↓感じです。
トリガー（AWS Lambdaへの入力）はAPI Gatewayの作成時に設定するので、まだ操作しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/2be39b2b-3613-cecd-823d-63de1c91097c.png)

#②API Gatewayの作成、AWS Lambdaとの接続
「REST API」API Gatewayを構築します。
分かりづらいですが、インポートではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/9c85f8f5-49d8-c104-b114-8b2943b5ccc8.png)

適当な「API名」を設定します。
（今回はtest_apiにしました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/4c0cd244-42ec-9943-63f8-66c7e96bfd60.png)

リソース（メソッドを入れるための器みたいなもの）を追加します。
「アクション」タブから「リソースの作成」を選択します。
適当にリソース名を入力し、「リソースの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/94a2cc9e-309d-4707-b7cc-535aca189b25.png)

メソッドを追加します。
「アクション」タブから「メソッドの作成」を選択し、ＧＥＴメソッドを追加します。
「Lambda関数」に先ほど作成したLambda関数の名前を入れます。
入力予測がでるので、頭文字だけ入れれば選択肢がでてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/805a5cd6-9981-2595-48cf-4efa7da9c1c1.png)

「保存」を押すと、権限を与えるか確認されるので、「OK」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/5d708030-b250-ef3c-ae84-6417fdf2efe5.png)

最後に、今まで作成したAPI Gatewayをデプロイ（構築を反映）します。
この時、ステージ（デプロイ時のバージョン的なもの）の入力を求められるので、適当に入力します。
これで完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/06528ab9-d319-a9fe-c460-b0524f6e1d5a.png)

#③テスト
先ほど作成した、API GatewaryにGETメソッドでリクエストします。
先ほどデプロイしたステージの「GET」をクリックすると、URLが表示されます。ここをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/6627fb0e-f966-494b-8ebc-bd743f3f6083.png)

下記画像のように「Hello from Lambda!」が表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287677/a7020b53-521e-6f1d-8eda-98c340d2e9a7.png)

おつかれさまでした。
#おわりに
AWS Lambdaを体験することを目的とし、最も？シンプルなAWS Lambdaを実装しました。
今後はこれを元に、もっと複雑なシステムを作ってみたいです。

#参考サイト
・AWS Lambda
https://aws.amazon.com/jp/lambda/
AWSの公式サイト

・AWS API Gateway to Lambda Tutorial in Python | Build a REST API
https://www.youtube.com/watch?v=uFsaiEhr1zs
ほとんどこの手順を踏んでいます。
日本語の解説よりも、英語の解説の方が分かりやすい。
GoogleMap系API(GCP)が17個もあったので全部調べてみた

## ある日のこと

自作の地図系webアプリを作るためにGoogleMapのAPIを使おうと思った私は、GCPのコンソール画面からAPIを検索していました。

そこで見たものは...

![API一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/2de84203-0565-82e8-17f9-b776579feafd.png)

「えぇ... ちょっと地図系のAPI多すぎん...？」

「どれ使ったらいいか分からんやん...」

## 概要

ということで、Google Cloud Platformから利用可能なGoogle Map系API全17個についてざっくり調べてまとめてみました。それぞれのAPIを使うことで「何ができるのか？」と、個人的に感じた利用頻度の高さ（高いものはこれからお世話になりそう）も一緒に掲載しています。

※ APIの利用料金には触れませんので、気になる方はご自身でご確認ください。

## GoogleMap系APIの一覧表

| API名称                 | APIの機能                                                                                   | 利用頻度 |
|-------------------------|---------------------------------------------------------------------------------------------|----------|
| Maps Javascript API     | ウェブサイトにマップを配置できる                                                            | 高       |
| Geocoding API           | 住所と地理座標（緯度・経度）を相互に変換できる                                              | 高       |
| Places API              | 1億か所の詳細情報を取得できる                                                               | 高       |
| Direction API           | 複数地点間のルートを取得できる                                                              | 高       |
| Distance Matrix API     | 複数地点間の移動時間と距離を取得できる                                                      | 高       |
| Maps Embed API          | ウェブサイトにマップまたは<br>ストリートビューパノラマを配置できる                          | 高       |
| Maps SDK for Android    | Google Mapsデータに基づくマップを<br>Androidアプリケーションに追加する                      | 中       |
| Maps SDK for iOS        | Google Mapsデータに基づくマップを<br>iOSアプリケーションに追加する                          | 中       |
| Maps Static API         | URLに位置座標、ズーム倍率、マーカ情報を指定することで<br>Google Mapを静的な画像で取得できる | 中       |
| Roads API               | 位置情報（2点以上）をもとに、補正された経路情報を取得できる                                 | 中       |
| Geolocation API         | 基地局やWi-Fiアクセスポイントの情報に基づいて、<br>現在位置と精度半径を取得できる           | 中       |
| Time Zone API           | 位置情報から属しているタイムゾーンのID、名称と<br>UTCとの時差を取得できる                   | 中       |
| Street View Static API  | URLに位置座標、角度を指定してストリートビューの画像を<br>静的な画像として取得できる         | 中       |
| Street View Publish API | 360°写真をメタデータ（位置座標や向きなど）とともに<br>Googleマップに公開できる              | 低       |
| Maps Elevation API      | 地球表面の標高データ（海洋の場合は海底深度）を取得できる                                    | 低       |
| Playable Locations API  | 位置情報ゲームで利用可能なロケーション情報を取得できる                                      | 低       |
| Semantic Tile API       | モバイルゲーム等に利用可能な地理空間データが<br>取得できる（Unityからのみ接続可能）         | 低       |
初見で難解だったdeviseを改めてまとめてみた

##はじめに
　deviseとの出逢いは最悪でした。そもそもGemという概念すら曖昧で、MVCモデルの流れが少しわかるようになってきた段階でインストールした記憶がある。deviseでは、基本的にコントローラーを触らないので、初見ではなぜ勝手にアクションが実行されているのかが理解できなかった。なので、改めて「これだけ！」というものをまとめた次第。

#deviseとは
　deviseはユーザー管理機能のに特化したGem。サインインやログアウトなどの設定が簡単になる。つまり、手動でルーティングの設定やコントローラー…をしなくて済む。ユーザー登録をしてサービスが受けられるアプリケーションなら、導入すると、開発が早くなるというメリットがある。

##全体の流れ
1. Gemfileに追加
1. deviseをインストール
1. モデルの作成
1. テーブルの作成
1. 新規登録とログインのためのリンク設定
1. 新規登録のためのビューファイルの作成

今回は新規登録のみを扱う。

###1. Gemfileに追加
```ruby:Gemfile
gem 'devise'
```
・ファイルの最終行でOK
###2. deviseをインストール
ここでは２つのことを行う。

①
カレントディレクトリが導入したいアプリケーションのディレクトリであることを確認の上、
ターミナルで、

```
bundle install
```
　これはGemfileに追記したら、必ず行う。
　必要に応じて、ローカルサーバーを再起動。（control + c→rails s）

②
同じくターミナルで、

```
rails g devise:install
```
　このコマンドが大切。忘れずに！
　このコマンドによって、deviseが使えるようになる。

###3. モデルの作成

　今回はユーザー管理機能の実装を想定しているので、モデル名は「user」にする。
同じくターミナルで、

```
rails g devise user
```


＜難解なポイント＞
reilsを初めて勉強していると、モデルを作成するときのコマンドは

```
rails g model user
```
と学ぶ。違いを比べてみると、deviseの有無である。
この有無で結果は大きく異なる。

　下のdeviseがないコマンドだと、ただモデルを作成しているだけ。つまり、deviseを活用できていない。devise:modelとすることで、このコマンドだけで、同時にdeviseに関連するルーティングまでも同時に生成される。
　ルーティングを作成する手間が省かれているというわけだ。意外とこれが、学ぶ上で難しい点でもあり、deviseの良さでもある。
（作成されたmodelは「app/models」ディレクトリにある）

###4. テーブルの作成
　必要に応じて、マイグレーションファイルにカラムを追加する。今回は割愛。ちなみに、deviseではデフォルトで、emailとpasswordカラムが入っている。これもまた、deviseの有能な点。
ターミナルで。

```
rails db:migrate
```
　ここでは、dviseがつかない。考え方としてはマイグレーションファイルは、deviseで作ったファイルだけではなく、他にも存在するから。

###5. 新規登録とログインのためのリンク設定
　ビューにリンクをヘルパーメソッドのlink_toでパスを指定することを想定。
ターミナルで、

```
rails routes
```
とすると、ルーティングがズラッと並ぶ。（rails routesの見方は割愛）注目すべきは、
sign_up（新規登録）
sign_in（ログイン）
は別物であるということ。
新規登録＝registration
ログイン＝session
がpathに含まれるということ。

具体的にリンクをビューファイルに記述するなら、下記のようになる。

```Rails
<%= link_to '新規登録', new_user_registration_path %>
<%= link_to 'ログイン', new_user_session_path %>
```
とにかく、pathの違いに注意。

###6. 新規登録のためのビューファイルの作成
まずは、ビューファイルを生成するコマンドから。
またまた、ターミナルで、

```
rails g devise:views
```
　ここも困難なポイント。重要なことは3つ。

１つめは、
先ほどのモデル生成時と同様、「devise」をつけるということ。
deviseをつけることで生成されるビューファイルがdeviseの配下になる。
具体的には、
app/views/<font color=red>devise/registrations/</font>new.html.erb
app/views/<font color=red>devise/sessions/</font>new.html.erb

２つめは、
新規登録用のregistrationsディレクトリとログイン用のsessionsディレクトリに分かれているということ。つまり、新規登録画面のHTMLを編集するファイルとログイン画面のHTMLを編集ファイルが別ということ。

３つめは、
コマンドの最後の単語がview<font color=red>s</font>と複数形になるということ。２つめで取り上げたようにいくつものビューファイルが生成されるので、複数形と覚えればよい。
　
　ちなみに、デフォルトで新規登録のHTMLファイルもログインのHTMlファイルもコードが書かれている。必要に応じて編集する。（カラムを追加していた場合やデザインに凝る場合など）
##ポイント

- [x] ターミナルでdeviseがつくのはモデルやビューファイルを生成するとき。
- [x] 新規登録とログインは別物。
- [x] ルーティングやコントローラーの記述をほぼしなくて済むので、開発が楽になる。

##最後に
　長々と読みにくい文章になってしまった。慣れれば便利なGemに感じること間違いない！
ハノイの塔に再帰で挑む

こんばんは。
いつも応援、有難うございます。

有識者の皆様の見解を色々と拝見しましたが、
なかなか難しかったです。
多分自分の理解能力の問題なので、しょうがない。

まずはやってみましょう。
2 個の円盤を左端から、右端に移動させてみます。
ここで、右端、中央、左端の表現が微妙なので、
数字を割り振ります。
左端:1 , 中央:2 , 右端:3 とします。
![図1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/612bddab-f9d2-5e8c-5cbe-09adba010853.png)
しれっと書きましたが、
右図に動かした円盤と何処から何処に
動かしたか、補足しています。

前回の記事にある階乗を再帰で攻略しましたが
流用出来ないでしょうか？ちょっと眺めてみましょう。

```cure.py
def test(n:int=3):
    if n>1:
        return n * test(n-1)
    else:
        return 1
```

やりたい事としては。。

```
2枚の円盤を 1 から 3 へ移動したいのですが、
1番の円盤を 1 から 2 へ移動させてから、
2番の円盤を 1 から 3 へ移動させて、
1番の円盤を 2 から 3 へ移動させます。
```

枚、番を n として共通にして、
x から y に移動させてみましょう。
繰り返しになりますが、以下イメージです。

```
2枚(n)の円盤を 1(x) から 3(y) へ移動したいのですが、
1番(n)の円盤を 1(x) から 2(y) へ移動させてから、
2番(n)の円盤を 1(x) から 3(y) へ移動させて、
1番(n)の円盤を 2(x) から 3(y) へ移動させます。
```

よって、def test(n , x , y) で始めたら良さそうです。

```
2枚(n)の円盤を 1(x) から 3(y) へ移動したいのですが、=> def test(n , x , y): 
1番(n)の円盤を 1(x) から 2(y) へ移動させてから、
2番(n)の円盤を 1(x) から 3(y) へ移動させて、
1番(n)の円盤を 2(x) から 3(y) へ移動させます。
```

次です。
test(2,1,3) から start したら、次は
test(1,1,2) を渡す構成にする必要があります。
test(1,1,?) 
最後の ? はどうやって作りましょうか。
各軸をナンバリングしたのを思い出してください。
1 + 2 + 3 = 6 なので、6-x-y とすれば ? を表現できます。

```
2枚(n)の円盤を 1(x) から 3(y) へ移動したいのですが、=> def test(n , x , y): 
1番(n)の円盤を 1(x) から 2(y) へ移動させてから、　　=>     test(n-1,x ,6-x-y)
2番(n)の円盤を 1(x) から 3(y) へ移動させて、
1番(n)の円盤を 2(x) から 3(y) へ移動させます。
```

上記のままだと n == 0 の状態が発生します。
0 枚の円盤? 0 番の円盤? ちょっと破綻しそうなので、
if 文で条件を付けましょう。n>1 とすれば、
n==0 の条件を回避できます。

```
2枚(n)の円盤を 1(x) から 3(y) へ移動したいのですが、=> def test(n , x , y): 
1番(n)の円盤を 1(x) から 2(y) へ移動させてから、　　=> 　　if n>1:
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　    test(n-1,x ,6-x-y)

2番(n)の円盤を 1(x) から 3(y) へ移動させて、
1番(n)の円盤を 2(x) から 3(y) へ移動させます。
```

test(1,1,2) で代入して考えると、前述の構成だと
if n > 1 にはハマらないので pass.
その段階で "1番(n)の円盤を 1(x) から 2(y) へ移動" とprint を使って表示出来れば OK です。 

```
2枚(n)の円盤を 1(x) から 3(y) へ移動したいのですが、=> def test(n , x , y): 
1番(n)の円盤を 1(x) から 2(y) へ移動させてから、　　=> 　　if n>1:
　　　　　　　　　　　　　　　　　　　　　　　　　　　　        test(n-1,x ,6-x-y)
　　　　　　　　　　　　　　　　　　　　　　　　　　　　      print(f"{n}を{x}=>{y}へ")
2番(n)の円盤を 1(x) から 3(y) へ移動させて、
1番(n)の円盤を 2(x) から 3(y) へ移動させます。
```

ちょっと説明が難しいのですが、
test(1,1,2) は print(f"{1}を{1}=>{2}へ") とイコールになります。
それを抜けると、test(2,1,3) の時の print(f"{2}を{1}=>{3}へ") に
自動的につながります。
最後の "1番(n)の円盤を 2(x) から 3(y) へ移動" はどうしましょうか。
私はこんな風にしてみました。

```test.py
def test(n,x,y):
    if n>1:
        test(n-1,x,6-x-y)
    print(f"{n}を{x}=>{y}へ")
    if n>1:
        test(n-1,6-x-y,y)
```

うーん、解説するかは考え中です(笑)。
スーパーユーザとは

#スーパーユーザとは

- 一般ユーザとは別に、Linuxのユーザの中で`管理者権限を持つ特別なユーザ`のこと。

- ユーザ名がrootであることから**`「rootユーザ」`**とも呼ばれる。

- システムの設定ファイルを変更したり、新しいアプリケーションをインストールしたりと、あらゆる操作が許可された強い権限を持つユーザである。

- inuxを動作させる上で必須のファイルを削除するなど、危険な操作も実行できてしまうので、操作を誤ると、Linuxシステム自体を破壊してしまう恐れがあるので注意。

- 通常は一般ユーザでログインして操作し、必要なときだけスーパーユーザとして作業するというように、必要最小限の利用に留めるようにする。

- 一般ユーザからスーパーユーザに変わる方法として、`suコマンド`と`sudoコマンド`がある。
運用エンジニアの道具箱【Excel & Google Spreadsheet 関数】

株式会社オズビジョンのユッコ (@terra_yucco) です。

一社目はともかく、二社目で自社サービスの開発・運用エンジニアになった身として、思った以上に使うなって思っているツールは断トツで **Excel & Google Spreadsheet** です。
ただ、プレゼン資料を作ったり、複雑な集計・分析を必要としない運用業務においても「最低限これは必要だろう」というレベルで道具として使えていないエンジニアが多いので、独断と偏見で、これだけ覚えておけばいいだろうっていう関数を列挙しました。何かの参考になれば！

※だいたいどれも Excel, Google Spreadsheet 両方で使えると思いますが、片方でしか使えないものもあるかと思います。

# データ処理系
## if

- 条件に合うものを抜き出すときのお約束
- e.g.) `=if(条件, trueの場合の処理, falseの場合の処理)`

## and, or

- 上記の `if` を利用するときに、複数の条件を使うときのお供
- e.g.1) `=if(and(条件A,条件B), 条件Aも条件Bも両方trueの場合の処理, どちらかもしくは両方がfalseの場合の処理)`
- e.g.2) `=if(or(条件A,条件B), 条件Aと条件Bいずれかもしくは両方trueの場合の処理, 両方がfalseの場合の処理)`

## count, counta, countif

- データ件数を数える関数。何かが入っていたら数えたり、条件に合致するものだけ数えたりできる
- e.g.1) `=count(A:A)`
    - A列で値が入力されているセルの数
- e.g.2) `=countif(A:A, ">=20")`
    - A列で20以上の値が入力されているセルの数

## sum, sumif

- データ内容を合計する関数。条件に合致するものの合計を取ったりできる、ここからさらに割合出したりとかにも使う
- e.g.1 ) `=sum(A:A)`
    - A列の値合計を表示
- e.g.2) `=sumif(A:A, ">=20", B:B)`
    - A列が20以上のものについて、対応する(同じ行数の)のB列の値を合計して表示

## vlookup

- 別シートからデータを引っ張ってくるのに利用
- **これだけは絶対形式も覚えてしまうべき、さっと使えるかどうかでかなり効率違う**
- e.g.) `=vlookup(A1, B:D, 3, false)`
    - B列からA1と同じ値を持つセルを探し、対応するD列の値を表示
    - 値が見つからない場合は `#N/A` などのエラー値になる
- ちなみに姉妹関数の `hlookup` は、通信系組み込み6年+LAMP Web系6年、で学習以外で利用したことがありません

## isna

- vlookup と isna の組み合わせはよく使う、検索して見つからなかった場合などという形で if と組み合わせる
- e.g) `=if(isna(vlookup(A1, B:D, 3, false)), "NOT FOUND", vlookup(A1, B:D, 3, false))`
    - B列からA1と同じ値を持つセルを探し、対応するD列の値を表示
    - 値が見つからない場合は "NOT FOUND" と表示

## unique

- Google Spreadsheet 限定かも
- 重複データを除いて、それぞれの件数・合計値を取得したい場合などに使う
- e.g.) `=unique(A:A)`
    - A列の値をユニークにして出力

## right, left, mid

- 文字列の切り出し
- e.g.) `=right(A1,5)`
    - A1セルの最後5文字を表示する


# 見た目を整える系
## trunc

- 結果を小数点以下切り捨てる
- e.g.) `=trunc(A1)`
    - A1セルの値を小数点以下で切り捨てて表示

## text
- 日付のフォーマット整えてラベル付けするときなどに
- e.g.) `=text(A1,"YYYYmm")`
    - A1セルに入っている日付を`YYYYmm`形式で表示する、A1に`2020/09/30`が入ってたら`202009`

# 番外 (知っておいてほしい細かいこと)
## `&` 文字列結合

セルの値同士を結合したり、vlookup のためにユニークなキーを複数カラムの組み合わせで作ったりするときによく使う。

## セルの相対参照と絶対参照

これを理解しないと、コピペで数式がずれたり、使いまわせるものが使いまわせなくなったりすることも。
`A1`, `$A1`, `A$1`, `$A$1` はそれぞれ違う。

## セルの書式

日付が変な数字になる！などの大半はこれ。
桁数の大きい数字に E が入って壊れてる！なども大半これ。

# まとめ

運用業務でよく使うなと感じた Excel & Google Spreadsheet の関数を列挙しました。
※勿論他にも便利な関数はたくさんありますし、知っていれば知っているほど選択肢が広がることは否定しません。
ですが、多分これだけ覚えておけば、入社してすぐに渡された CSV からでも、(定義さえわかれば) 条件に合わせた抽出がサッと出来るかと思います('ω')

エンジニアにとって Excel & Google Spreadsheet はツールなので、よく使う関数あたりはサッと覚えてしまって楽しましょう！
【Golang】 Go言語　ProducerとConsumerについて

今日はGoのProducerとConsumerというものについて学習したのでそれについてアウトプットしていきます。

##前提知識
- Goの基礎文法
- チャネル
- Goroutine

このあたりの知識があると今回の記事は理解しやすいと思います。
分からない方はチャネルとGoroutineについては僕の方でも記事を書いているので良ければ参考にしてください！
[【Golang】Go言語　channel（チャネル）について](https://qiita.com/Kiyo_Karl2/items/94a269632725eb100cd0)
[【Golang】Go言語基礎 Goroutineとは？](https://qiita.com/Kiyo_Karl2/items/626502fa116881933aad)


##Producer、Consumerとは？
まずは、以下の図をご覧下さい。
![スクリーンショット 2020-09-30 223000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/4ec71c3d-2db5-9766-e64f-2c23717c790b.png)

func mainから走らせた並行処理（Producer）での処理結果をチャネルに送信し、送られてきた値をConsumerで処理していくといった流れです。
具体的に言うと、色々なサーバーへいってログを解析してきて結果をチャネルで送信し（Producer）、送られてきたチャネルの値をConsumerで受信し、処理するといったことで使われるようです！

言葉だけではわからないので、実際にコードを書いてみてみましょう。


```golang

package main

import (
	"fmt"
	"sync"
)

func producer(ch chan int, i int) {
	// なんらかの処理
	ch <- i * 2
}

func consumer(ch chan int, wg *sync.WaitGroup) {
	for i := range ch {
		fmt.Println("process", i*100)
		wg.Done()
	}
}

func main() {
	var wg sync.WaitGroup
	ch := make(chan int)

	//Producer
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go producer(ch, i)
	}

	//Consumer
	go consumer(ch, &wg)
	wg.Wait()
	close(ch)
}
```

```
**実行結果**
process 0
process 400
process 200
process 600
process 800
process 1000
process 1200
process 1400
process 1600
process 1800
```

まず、wg変数とチャネルを作りch変数に格納します。
ここで**Producer**を生成します。
wg.Add(1)とすることで並行処理の個数をインクリメントしています。（ここでは10回ループさせるのでwgに10個の並行処理があることを伝えている）
そして**producer関数**に引数としてchとiを渡しgoステートメントを付けることで並行処理を走らせます。

**producer関数**では何らかの処理がされ、**i * 2**したものをチャネルに送信します。
そして、その処理が終わったら**consumer関数**にchとwgのアドレスを渡します。
**consumer関数**では**producer関数**から送られてきたチャネルの値を取り出しrangeでループ処理をします。ループ処理の内容は、i * 1000 を出力し、wg.Doneでこの処理が終わったことを伝えます。これを10回繰り返しています。

これが終わったら wg.Waitにいき（ここでは処理が10回終わるまで待っている）**close(ch)でチャネルが閉じたことを記述します。**

ここでの注意点として、**consumer自体もGoroutineなので処理が10回終わった後でもまだチャネルから値を取ろうとしており、rangeを回すためにproducer関数からチャネルが送られてくるのを待っています。**
producer関数では10回値がチャネルに送られることがわかりますが、consumer関数は10個値が送られてくるなんてことは知らない状態です。チャネルの終わりを告げない限りと次の値をループしようとします。なんて健気なんでしょう。。
ですので、「もうこれ以上producer関数からは値を送信しないよ～」ということをclose(ch)としてチャネルが閉じたことを記述する必要があるのです！

##最後まで読んでいただきありがとうございます！
この記事が少しでも理解の助けになれば幸いです！感想やご指摘などあればコメントいただけますと幸いです！
SNSボタンのアドブロック対策

アドブロックは必要な方には必要不可欠です。
広告を見たくない、ギガを少しでも減らしたい、というニーズがあります。

現にあたしも利用しています。

#しかし
アドブロックが昨今強化され、SNSボタンに対してもブロックするようになりました。

#対策はとても簡単

Twitter なら、Twitterという文字列をなくし、t という省略文字にする

Facebook なら Facebook という文字列をなくし、f という省略文字にする

画像でSNSシェアリンクを使用したい場合、その画像ファイル名に twitter facebook という文字列を入れない

その他、アイコンジェネレータでもある程度対策が可能です。

#ちょっとした問題
これらはHTMLやCSS、場合によってはJavaScriptにまで影響します。

どの要素に置換したか、しっかりと把握する必要があります。
cron って？？

#【cron】

業務内で出てきたので、この機会にまとめました。
次から次に新しい用語が出てきて毎日大変ですが仕事が楽しいです。

##cronとは。

設定したスケジュールに従って、指定されたプログラムを定期的に起動してくれるもの。

いつにプログラムを動作させるかを前もって指示を出しておく。
そうすることで指定した時間の間、プログラムが実行される。
→定期的に何回も動いているプログラムなどが一般的。
　1回だけ動かすものは、cronの意味はない。

##cronは、ITの常識である。

多くのUNIX系のOSで標準的に利用される常駐プログラム（デーモン）の一種。
Linux運用で欠かせないツールである。

##私が携わっている業務での使い方。

・cronによって、日時起動で終了時刻までループ処理（バッチ処理）で使用している。
・プログラムでのcronの設定は、分、時、日、曜日、月まで細かく指定している。
・システムのチェック、バックアップ処理などにcronを使っている。
Maven



AndroidStudioでたまに目にする[Maven](http://wild-data-chase.com/index.php/2019/04/06/post-699/#outline__4)
なんやこいつ、と思っていたけど、昔のビルドシステムらしい。

http://wild-data-chase.com/index.php/2019/04/06/post-699/#outline__4
伸びるエンジニア、伸びないエンジニア

# はじめに

同じぐらいの年齢で、同じような環境でも、エンジニアとして1年も働いていると差が出てくる。

それは

プログラミングのセンスだとか、
論理的思考力だとか、
やる気の問題とか、

そういった言葉で片付けられてしまうケースもあるけれど、個人の性格・思考によることも多い。

今日は伸びる/伸びないの一因のひとつである、
**『コーチャブル』
『謙虚さ』
『現状維持バイアス』**
について解説してみる。

# ティーチングとコーチング

コーチャブルについて語る前に、コーチングについて触れておく。

コーチングは、「ティーチングとコーチングの違い」という文脈で語られることが多い。
この違いを知るまでは混同しがちな言葉だが、大きな違いがある。

**ティーチング(Teaching)**とは、答え・ゴールを教える方法。
**コーチング(Coaching)**は、答えやゴールを考えさせる方法。

プログラミングをしていると、後輩から

「なぜかエラーで動かないんです」

と質問を受けることは多いのではないだろうか。
その際、あなたは以下の2つのうち、どちらの接し方をするだろうか？

* *「これはたぶんこういう理由で動かないから、こうすれば直るよ」*
* *「まずはどういうエラーが起きている？」「そのエラーはどこが原因だと思う？」「それはどうやって調べたら分かりそうかな？」*


前者が**ティーチング**、後者が**コーチング**の接し方である。

ティーチングのみだと、教えられる側は教える側に依存してしまう。確かにすぐに答えは得られるし感謝もされるかもしれないが、別のケースには応用が効きづらい。

コーチングを受けることで、自らの頭で考え、解決までのプロセスを体感することで、応用の利く知識が身につく可能性が上がる。

とはいえ、右も左も分からない分野の質問に対しいきなりコーチングされても考える取っ掛かりが無く答えられない。
また、緊急事態の際に悠長にコーチングをやっている場合でないことも多い。
そのため、ティーチングが悪でコーチングが万能、というわけではない。時と場合によって使い分けが必要。

# コーチャブルとは

コーチングは確かに効果的なマネジメント手法ではあるが、万能ではない。

イギリスのことわざで
*You can lead a horse to water, but you cannot make him drink.(馬を水辺を連れていくことはできるが、水を飲ませることはできない)*
というものがある。
要するに、その場に導くことはできても、最終的にそれを受け入れるか、実行するかは本人次第であるということ。

周りからの意見を素直に受け入れるか、自分にできると思えるか、その後行動するか…それら多くの性質をひっくるめて、**コーチャブル**という言葉がある。

>コーチャブルとは、コーチングを受け入れられる姿勢やその人の性質のことを意味します。
例えば「正直さ」「謙虚さ」などがコーチャブルな人物の性質として挙げられます。

引用：[コーチャブルな人材とは何か？チームを強くするために大切な資質](https://www.ssaits.jp/blog/mgt/team-work/coachable.html)


一流のスポーツ選手を育て上げたコーチは、果たしてどんな選手でも一流に育て上げるか？というとそうではなく、**コーチャブルである選手を選んで育て上げる**という話もある。

周囲からのアドバイスや成功例を見て、

*「そのやり方は自分に合ってないから参考にならない」
「あの人だから上手くいったんでしょ」
「自分には無理」*

と考えてしまう癖があると、コーチャブルな状態とは呼べない。

また、薫陶を受けて、その一瞬は
「確かに大切だな」
と思いつつも、一向に自分の行動に紐付けられない、行動しない場合も、コーチャブルとは呼べない。

この、**コーチャブルか否か**が、『伸びるか伸びないか』の根底にあることが非常に多い。

# 謙虚さ

コーチャブルが含有する要素の一つに『謙虚さ』がある。
自らの至らない点を自覚し、素直に受け止め、変化に前向きになること。

「自分は謙虚だ」と思っていても、果たしてそうだろうか。
以下メッセージに「うっ」と痛いところを突かれた感覚になる方も多いのでは。

>一見謙虚だが謙虚ではない人間の特徴は、変わるつもりがない。なぜ変わるつもりがないかというと実は今のままの自分でいいとどこかで思っている。それは意欲がないか、過大評価をしているか、体裁の方を成長よりも優先している。口癖は、でも、だけど、が多い。

引用：[為末大さんTwitter](https://twitter.com/daijapan/status/1208399028800696321)

# 現状維持バイアス

人間には現状維持バイアスが働く。

*「そもそも変わろうと思えない」
「変わる必要性は分かるけど、勇気が出ない」
「変わるための知識や時間がない」（と思い込んでいる）*

等があるが、そもそも人間も元は動物。
狩猟をやっていたような大昔は

* いつもと違う森に入ったら未知の野生動物に襲われるかもしれない
* 食べたことのないキノコを食べたら毒で死ぬかもしれない

と、自らのルーチンを崩すことの方がリスクが高く、現状維持をする方が生命を脅かさなかった時代の本能である。

そのため、意識的にせよ無意識的にせよ、変わることを恐れるのは自然なことである。

しかし、現在はVUCA(変動性、不確実性、複雑性、曖昧性)と呼ばれる激動の時代である。
さらに、その中でも特に移り変わりの激しい、IT業界・エンジニアという職種を選んだのであれば、**変化を恐れて現状維持をすることは、緩やかな死に向かっている**ということ。

目の前に命の危機が迫っていると回避しようとするが、この変化は本当に緩やかな死なので、現状維持バイアスが勝り、「自分には必要ない」「自分にはできない」という理由を、必死に作ってしまう。

新たな挑戦の機会が舞い込んでも、コーチャブルでないと「これは自分に合わない方法だ」と決めつけてしまう。
他に何も行動を起こさず「自分に合った勉強方法」を、半年・1年探し続けて、大きく成長できた人を私は見たことがない。
とりあえずあらゆることに手を出して、その中で見つけていく方が圧倒的に近道となるはず。

# 最後に

伸び悩みに関して、プログラミングのセンス等を言い訳にしがち。
確かにプログラミングに対する素質・適正というものは存在するというのが私の考えではあるものの、そのレイヤーの話をする以前の問題であることも多いのではないだろうか。

経験を重ねていくと、今までの経験が挑戦の邪魔をしたり、後輩から学ぶ謙虚な姿勢がどんどん失われやすい。
傲慢になっていないか？謙虚でコーチャブルな状態か？を、常に自問自答していきたい。
Qiita初投稿

####初投稿です。
プログラミングスクールで3か月のカリキュラムを終えたのち現在就職活動中
投稿の練習がてら、何か投稿してみようと思い記事を書いています。

####現在の学習状況
3か月のカリキュラムを終え初心者に毛が生えた程度の知識と技術です。
スクールで学んだ言語は**HTML&CSS/Ruby/RubyOnRails/Javascript**です。
カリキュラムを進め簡単なサイトだったりポートフォリオは作れるようになったが
今後どのような学習を進めていけばいいのか不安です。
とりあえずカリキュラムで学んだ言語をProgateで全部修了しようと思っており
同時進行で**「地頭力を鍛える」**と**「RubyOnRails速習実践ガイド」**で学習を進めています。

一通り学習したらカリキュラムでは少ししか勉強していない**Javascript**を
**「Webデザインの現場で使えるVue.jsの教科書」**で学習していこうと思っています。

####今後
カリキュラムで学んだことが自信が持てるレベルまで行ったらSQLやJavaの学習を進めます。
近い将来2年ほどでプログラミングを使った副業をしていきたいので勉強を頑張っていきたいと思います。


おすすめの学習方法やそんなやり方じゃダメだなどご教授いただければ幸いです。
【初心者向け】コーディングは難しい言葉を複雑に書く作業ではない。いかに綺麗に書けるかと頭を悩ませるものである。

# どうも7noteです。プログラミング・コーディングの勉強始めて1週間以内の超初心者向けの記事で。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/discussion/beautifulcoding/
【rails】　each_with_index、each.with_indexの違いと使い方

本記事では初心者の私がrailsで新たに学習した
「each_with_index、each.with_index」
の意味と使い方についてアウトプットして参ります。

この記事を読むと、これらの2つのメソッドの違い、使い方を理解できます。

#each_with_index、each.with_indexの違いと使い方

この2つのメソッドはどちらも
配列の要素を順番に取り出しているメソッドです。

```csharp

food = [noodle, pasta, bread]
#配列foodを用意
food.each_with_index do |food_name, i|
put "#{i}番目に食べたのは#{food_name}です"

#結果
0番目に食べたのはnoodleです
1番目に食べたのはpastaです
2番目に食べたのはbreadです
```

のようになります。

ただ、each_with_indexは０から始まるため１から始めるのには

```csharp

put "#{i+1}番目に食べたのは#{food_name}です"
```

としなければなりません。

一方each.with_indexメソッドを使うと、より簡単に好きな数から配列の番号を始めることができます

使い方

```csharp

配列名.each.with_index(開始させたい値) do |item, i|
```

例

```csharp

food = [noodle, pasta, bread]
#配列foodを用意
food.each_with_index do |food_name, i|
put "#{30}番目に食べたのは#{food_name}です"

#結果
30番目に食べたのはnoodleです
31番目に食べたのはpastaです
32番目に食べたのはbreadです
```

以上です。
RYZEN7＋RADEONでPC組んでみた

#グラボの調子が悪いのです・・・
起業時に買って長年使用したPCのグラボがいよいよ調子悪い。
負荷がかかるとブルースクリーンが出る。
最近は動画編集するのでリソースも足りない事だし・・・

ここは思い切ってPCを新たに作る・・・か！
予算は13万円以内

ちなみに、旧マシンのスペック
　GALLERIAゲーミングPC
　CPU:Core i7-2600K
　マザーボード：ASRock H67DE
　メモリ：16GB
　グラボ：GeForce GTS450 1GB
　HDD：SATA HDD 1TB×2
　OS:Windows10 Pro
　※当時遊んでいた、某FPSゲーム（今はもうない）の推薦パソコンを購入

#パーツの選定
〇CPU
今回組むにあたり、IntelのCPUを採用する気は全くなかった。Intel製Core i7 10700とAMD製RYZEN 7 3700Xの価格差はほぼ無いに等しいし、コア数も同じだが、第3世代RYZENのPCIe 4.0対応が大きかった。
物理的I/Oは必ずボトルネックになるので、早いに越したことはない

と言う事で、RYZEN5でもよかったが、コア数を重視してRYZEN 7とした

〇マザーボード
マザーボードをケチると、後のカスタマイズで思わぬ費用がかかる場合があるので、次世代RYZENも搭載可能であろうB550チップセットを選択し、ASRock製　B550 Steel Legendを使うことにする。
B550チップセットで価格を抑えたい人は、「B550M Steel Legend」という選択もアリかと

〇グラフィックカード
ゲーム用途ではないが、動画編集はするので「それなり」のグラボが欲しい・・・
ただ、せっかくGen4対応のCPUやマザーボードを使うので、RADEONを選択。

何となく、CPUがAMDで、グラボがNVIDIAって何か相性悪そうな感じしません？（笑
という事で、ASRock RADEON RX 5500 XT Challenger D 8G OCを選択

ASRock製を選んだ理由は、マザーボードと合わせたかったから


〇メモリー
G.Skill　Trident Z RGB F4-3200C16D-16GTZRXを選択

〇電源
ケーブルの取り回しがしやすいフラットケーブルを採用している、SilverStoneのST75F-GSを採用

〇SSD
FireCuda520SSD 500GBを選択
※この選択は後に失敗とわかる・・・

〇ケース
PCを光らせるにあたり、背面ガラスのケースが欲しかったので、値段も安いNZXT製のH510 CA-H510B-W1 （マットホワイト/ブラック）を選択

〇その他手持ちで準備した物
iVANKY Displayport ケーブル
Windows10 ProのDSP版
Enermax T.B.RGB 14cmファン 2個パック


#新マシンのスペックまとめ＆価格
ツクモネットショップさんで購入しました

　CPU:Ryzen 7 3700X 39,578円(税込)
　マザーボード：B550 Steel Legend 21,948円(税込)
　メモリー：Trident Z RGB F4-3200C16D-16GTZRX 10,580円(税込)
　グラボ：Radeon RX 5500 XT Challenger D 8G OC 23,976円(税込)
　SSD：FireCuda520SSD 500GB 14,938円(税込)
　電源：SST-ST75F-GS V3 10,428円(税込)
　ケース：H510 CA-H510B-W1 （マットホワイト/ブラック）  8,965円(税込)

**合計　130,963円(税込)**



![パーツ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/c617f37e-8222-774f-fd55-4210d10a2dc1.jpeg)


#第3世代RYZENのみで体感出来る、驚異のPCIe 4.0
今回組んだPCで一番恩恵が大きいのはPCIe 4.0のSSDですね
SATAのSSDをはるかに超え、体感でも明らかに早い事が分かります。
これだけは現Intel製CPUでは体感出来ない

調子にのり、ベンチマークを取ってみたところ・・・
![diskベンチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/5b61b592-46b0-b911-5149-f508dee579c3.jpeg)

あれ？Writeが5GB超えてない？　2.5GB？？？

色々調べてみたところ、Writeが5GB超えるのは1TB以上のSSDのみらしい
しまった！SSDケチるんじゃ無かった！

というか・・・Write2.5GBでもこの速さなのね。

#RADEONという選択はアリ！！
今回グラボにRADEONを採用しましたが、2万弱で買えるグラボとしてはかなり優秀ではないでしょうか？
以前は出来なかった「○○しながらエンコード」が出来るのは感動

とりあえずFF14のベンチマークを・・・
![ff14_3840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/e731f10b-dc34-b201-a338-421d7239ffd0.png)

![ff14_2560.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/9075ee97-cbd9-e052-22a6-7969d11c67ec.png)

![ff14_1920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/fc2e59bb-baca-bc2c-f637-20a348d71c56.png)


#RYZEN＋RADEONで組んでみて
PCを組むこと自体は簡単で、極論ドライバーが使えたら組めます。
難しいのは部品構成を考えるところだが、一番楽しい時間でもある。

![20200821_064814136_iOS.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/ee75c1bf-33a2-6304-28e8-fe02eb18bc5d.jpeg)
IPと日付の正規表現

```
SELECT 1 FROM DUAL WHERE REGEXP_LIKE('14.232.230.251','^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$')

CHECK (REGEXP_LIKE(IPV4,'^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'))

SELECT 1 FROM DUAL WHERE REGEXP_LIKE('20200229','^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))0229)$|^(((19|2[0-9])[0-9]{2})02(0[1-9]|1[0-9]|2[0-8]))$|^(((19|2[0-9])[0-9]{2})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))$|^(((19|2[0-9])[0-9]{2})(0[469]|11)(0[1-9]|[12][0-9]|30))$')

CHECK (REGEXP_LIKE('20200229','^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))0229)$|^(((19|2[0-9])[0-9]{2})02(0[1-9]|1[0-9]|2[0-8]))$|^(((19|2[0-9])[0-9]{2})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))$|^(((19|2[0-9])[0-9]{2})(0[469]|11)(0[1-9]|[12][0-9]|30))$'))

```
ubuntu18.04をクリーンインストールした後にROSを導入するまでとそのコマンドの解説

<br>
特に難しいことがあるわけではないが、クリーンインストールすることが多かったので一応書いておきます。

##まずはカーネル周りの整備
上から

・カーネルの更新
・apt-getにてインストールできるパッケージの一覧を更新
・所持しているパッケージを最新版に更新

```
sudo apt-get install linux-generic-hwe-18.04-edge
sudo apt-get update
sudo apt-get upgrade
```
<br>
##続いてpythonなどの開発環境のインストール
上から

・pipのインストール
・ジュピターノートのインストール
・pipによるTensorflowのインストール
・pipによるopencvのインストール

```
sudo apt-get install python3-pip python3-pandas python3-sklearn
sudo apt-get install jupyter-notebook
sudo pip3 install  tensorflow pandas-ml
sudo pip3 install opencv-python
```
<br>
##次はROSのインストール
以下のサイトの通りにインストールするだけです。

http://wiki.ros.org/melodic/Installation/Ubuntu

##まとめ
とりあえずこれだけ。後々更新していく予定。
「1バイトのUTF-8シーケンスのバイト1が無効」の解決メモ

使用不許可APIチェックツールを利用した際、「1バイトのUTF-8シーケンスのバイト1が無効です」のエラーが出て、調査をしました。
その解決方法をメモとして残ります。

## 使用不許可APIチェックツールとは
SpotBugsのプラグインを活用して、Javaコーディング規約にて規定されている使用許可API以外のAPIを使用していないかチェックをするツールです。
ツールに関するの詳細説明は[ここ](https://github.com/nablarch-development-standards/nablarch-style-guide/blob/master/java/staticanalysis/unpublished-api/README.md)を参照できます。

## 利用環境
* Apache Maven 3.6.2
* Java 1.8
* windows 10
* SpotBugs 3.1.5
* eclipse Photon Release 4.8.0


## 問題とその解決
### 問題
Mavenを使用して、使用不許可APIチェックツールをプロジェクトに導入し、「mvn spotbugs:check」を実行した際、以下のエラーが出てました。

```
[INFO] Done SpotBugs Analysis....
[DEBUG] BugInstance size is 1565
[DEBUG] Error size is 0
[DEBUG] canGenerate is true
[DEBUG] ****** SpotBugsMojo generateXDoc *******
[DEBUG] xmlOutput is true
[DEBUG]   Using the xdoc format
[DEBUG] Mojo Locale is
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:54 min
[INFO] Finished at: 2020-09-30T11:11:47+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] 1バイトのUTF-8シーケンスのバイト1が無効です。 -> [Help 1]
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1バイトのUTF-8シーケンスのバイト1が無効です。
```

### その解決
POMのプロジェクト設定情報に以下のコードを追加します。
```
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
```
負数を含む整数除算でマイナス無限大方向の丸めを行う

整数除算について、 0 方向の丸めとなる処理系を使って悩んだお話。

整数除算演算子を div とすると、

- 8 div 3 → 2
- 7 div 3 → 2
- 6 div 3 → 2
- 5 div 3 → 1
- 4 div 3 → 1
- 3 div 3 → 1
- 2 div 3 → 0
- 1 div 3 → 0
- 0 div 3 → 0
- -1 div 3 → 0
- -2 div 3 → 0
- -3 div 3 → -1 
- -4 div 3 → -1 
- -5 div 3 → -1 
- ・・・

これをマイナス無限大方向の丸めとしたい

- 8 div 3 → 2
- 7 div 3 → 2
- 6 div 3 → 2
- 5 div 3 → 1
- 4 div 3 → 1
- 3 div 3 → 1
- 2 div 3 → 0
- 1 div 3 → 0
- 0 div 3 → 0
- -1 div 3 → -1
- -2 div 3 → -1
- -3 div 3 → -1 
- -4 div 3 → -2 
- -5 div 3 → -2 
- ・・・


整数除算や丸め関数は処理系などによってどの方向の丸めとなるかが異なる。
そういったことを気にせず、ライブラリなどを呼ばずにさくっと解決したい。


# 剰余の違い

x が被除数、y が除数、mod が剰余演算子とすると、

(x - (x mod y)) div y  

でいいかな・・・

しかしながら剰余演算は罠。
上記の式でマイナス無限大方向の丸めを実現するためには、

| 5 mod 3| -5 mod 3 | 5 mod -3 | -5 mod -3 |
|:---:|:---:|:---:|:---:|
|2|1|-1|-2|

となる必要がある。しかしながら剰余演算子がこのような動作をするかはこの限りではなく、挙動は処理系によって異なる。手元のPythonだと上記のようになったが、手元のCで試した所、以下のようになった。

| 5 mod 3| -5 mod 3 | 5 mod -3 | -5 mod -3 |
|:---:|:---:|:---:|:---:|
|2|-2|2|-2|

恐らく、Pythonのような剰余をするものは元々整数除算をマイナス無限大方向に丸めるだろうから、このような企みは意味がないことになる。

# 整数除算と剰余の関係

数学的に考えるなら、以下が成り立たなければならない。

y(x div y) + x mod y = x 

処理系内部でこれが成り立たないとマズイ気がするので、上記の剰余の仕組みに対応する除算は以下のようになるはず。

## (マイナス無限大方向の丸め)

|| 5 / 3| -5 / 3 | 5 / -3 | -5 / -3 |
|:---:|:---:|:---:|:---:|:---:|
|整数除算|1|-2|-2|1|
|剰余|2|1|-1|-2|

## (0方向の丸め)
|| 5 / 3| -5 / 3 | 5 / -3 | -5 / -3 |
|:---:|:---:|:---:|:---:|:---:|
|整数除算|1|-1|-1|1|
|剰余|2|-2|2|-2|

マイナス無限大方向の丸めを想定した処理をしたいけれども、0方向の丸めの処理系で行うには？ あるいは、処理系を気にせずに書くやり方は？

通常なら処理系で場合分けしたり、正負の場合分けをしてから整数除算をしたりなどということになるがそれもめんどくさい。

> ライブラリなどを呼ばずにさくっと解決したい。

「さくっと」ではなく、トリッキーだがこのような方法を使う。

- x と y の符号が異なる場合は、x に ( z - y ) を足し、x' を作る
 - z は y が正の数なら-1 , 負の数なら 1
 - x' を y で0方向丸め整数除算を行う 
- x と y の符号が同じ場合は何もしない

これを実現するために、

quotient は処理系の整数除算演算子
abs() は処理系の絶対値取得関数
sign() は処理系の正負判定関数、sign(1) → 0, sign(0) → 0, sign(-1) → -1 とする。
 

なお、sign 関数が無い場合は絶対値取得関数abs()を使い以下で代用

(((abs(x*y*2+1)/(x*y*2+1))-1)/2)


 x + sign(x*y)*(y-abs(y)/y)
これで、x' が得られる。


0方向丸め整数除算はイカの通り


abs(x') / abs(y) * ( sign(x*y) *2 + 1 )


全部まとめて

abs( x + sign(x*y)*(y-abs(y)/y)) / abs(y) * ( sign(x*y) *2 + 1 )

> x と y の符号が同じ場合は何もしない

と書いたが

> 正負の場合分けをしてから整数除算をしたりなどということになるがそれもめんどくさい。

の通り、場合分けしなくてもいいように

 x + sign(x*y)*(y-abs(y)/y)

ということで  sign(x*y) で同じ符号の場合はゼロになってなにもしないようにしている。

また、この演算は「マイナス無限大方向の丸め」 ／ 「0方向の丸め」いずれの処理系でも同じ結果を返す。
AI自動運転ラジコンカープロト (4-3 Visual SLAM (RTAB-Map) #1)

# はじめに
Dense Visual SLAMのRTAB-Mapパッケージで自律走行を試してみました。AutowareはORB_SLAM2で自己位置推定ができるのですが、生成されたPointCloudマップを活用したかったので今回はRTAB-Mapを使用しました。

# 前提
- Jetson AGX Xavier
- RealSense D455
- JetPack 4.2
- ROS melodic
- RTAB-Map

# インストール
```
$ sudo apt install ros-melodic-rtabmap ros-melodic-rtabmap-ros
```

# マップ作成
RTAB-MapとRealSenseのノードを立ち上げてマニュアルで走行させてマップを作成します。車両の速度をかなりゆっくりにしないと自己位置を簡単に見失って失敗します。今回は狭いエリアで試してみました。

```:rtabmap_terminal
$ roslaunch rtabmap_ros rtabmap.launch rtabmap_args:="--delete_db_on_start" \
frame_id:=camera_link \
depth_topic:=/camera/depth/image_rect_raw \
rgb_topic:=/camera/color/image_raw \
camera_info_topic:=/camera/color/camera_info \
rtabmapviz:=false rviz:=true rgbd_odometry:=true
```

```:realsense_terminal
$ roslaunch realsense2_camera rs_aligned_depth.launch 
```

![rtabmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109483/526bd190-f6ae-c491-4d56-52be59108af0.png)


# 自己位置推定
マップ作成後、下記のコマンドを実行すると/rtabmap/localization_poseに自己位置が出力されるので、このデータをもとに車両を制御します。制御方法は別途まとめる予定です。

```
$ roslaunch rtabmap_ros rtabmap.launch  \
frame_id:=camera_link \
depth_topic:=/camera/aligned_depth_to_color/image_raw \
rgb_topic:=/camera/color/image_raw \
camera_info_topic:=/camera/color/camera_info \
rtabmapviz:=false rviz:=true \
rgbd_odometry:=true localization:=true 
```

# 走行デモ
下記の動画は3倍速再生です。作りが甘いので少しフラフラしています。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">RTAB-Map Autonomous Driving <a href="https://t.co/ZcYCGBBaIQ">pic.twitter.com/ZcYCGBBaIQ</a></p>&mdash; tutu (@tutu68018594) <a href="https://twitter.com/tutu68018594/status/1311303191833620480?ref_src=twsrc%5Etfw">September 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 目次ページへのリンク
[目次](https://qiita.com/tutu/items/604b123fd1153b99f6a5)