OmniAICreator/Qiita-1.07M huggingface dataset:
ショートカットの学校（Mac編）

## はじめに

Windows編に続き、Mac編として、ショートカットをまとめておきたいと思います。普段はWindowsを使うことが多いので、自分の備忘録がメインとなります。

https://qiita.com/yoshi_yast/items/b3e4d2a310a5005e0352

※下記のレベルは私見です。覚えたいもの優先して列挙しています。

## 幼稚園から高校まで
### 幼稚園

基礎の基礎。必須のショートカットだと思います。

| キー        | 説明                   |
|-------------|------------------------|
| command & A | すべて選択             |
| command & C | コピー                 |
| command & V | 貼り付け               |
| command & X | コピー＆切り取り       |
| command & Z | 操作を元に戻す         |
| command & S | 上書き保存             |
| command & F | 検索                   |
| command & W | 最前面のウィンドウを閉じる  |
| command & Q | アプリを終了する            |
| command & D | WindowsのDeleteキーに相当   |
| command & Tab | アプリやウィンドウを切り替える |

### 小学校
ここまで知れば快適なMacライフを過ごせると思っています。

| キー          | 説明             |
|-------------|--------------------|
| command & D | 選択したファイルを複製する |
| command & delete  | 対象ファイルをゴミ箱へ捨てる |
| command & M | 最前面のウィンドウを最小化する |
| command & T | 新しいタブを開く |
| command & N | 新規ウィンドウを開く          |
| command & ctrl & F | フルスクリーン表示の使用 |
| command & ctrl & Q | コンピュータをロックする |
| command & shift & 3 | 全体のスクリーンショットをファイルに保存  |
| command & shift & 4 | 選択した範囲のスクリーンショットをファイルに保存  |

### 中学校
下記のショートカットを使っていると、ショートカット使っているなぁ自分で感じたりします。

| キー                 | 説明                                           |
|--------------------|----------------------------------------------|
| Ctrl & F3 + Enter   | エクスプローラを開く             |
| Ctrl & F3 + 矢印で選択後 Enter  | Dockからアプリを起動する    |
| command & spaceバー | spotlight検索フィールドの表示/非表示 |
| command & カンマ (,)    | 最前面のアプリの環境設定を開く |
| command & shift & N    | Finderで新しいフォルダを作成する    |
| F11     | ディスクトップ表示（もう一度押すと元に戻る） |

### 高校
個人的には、Nice to haveだと思います。

| キー            | 説明                     |
|-----------------|------------------------|
| command & 1     | Finder ウインドウの項目をアイコン形式で表示にする       |
| command & 2     | Finder ウインドウの項目をリスト形式で表示にする         |
| command & 3     | Finder ウインドウの項目をカラム形式で表示にする         |
| command & 4     | Finder ウインドウの項目をギャラリー表示にする           |
| command & option & esc | App を強制終了する           |
| command & option & D | Dock の表示／非表示を切り替える           |
| command & option & L | 「ダウンロード」フォルダを開く           |


## おまけ
ショートカットを使うならキーボードを自在に操らないといけないです。タイピング練習ソフト＆サービスはたくさんありますが、タイピングクラブはとてもわかりやすく練習を進められるので、初心者にお勧め。

タイピングクラブ

https://www.typingclub.com/

## 参考URL
https://support.apple.com/ja-jp/HT201236
Windows10にWSLでUbuntu入れてみた

使ってみたいソフトがWindows版がなかったので、Ubuntuを入れることにしました。
Linuxなんて何年ぶりだか。。。
今はWindowsStoreから手軽にインストールできるのね。

手順のメモを兼ねて、Qiitaに初投稿してみます。


## 1. "Windows Subsysytem for Linux"をOnにする

- Windowsの”設定”→”アプリ”→”アプリと機能”を開き、
一番したにある、”プログラムと機能”をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400992/e7bb7d6e-5c9a-c839-0b00-f3c64bc89592.png)

- Windows Subsysytem for Linuxにチェックを入れる
![capture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400992/24bf5669-df61-820e-09d8-4d460a53b7bc.png)

## 2. WindowsStoreから、Ubuntuをインストールする

- ”ubuntu”で検索をかけると、バージョン違いなどでいくつか出てきましたが、最新のバージョンをインストールしました。
![capture3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400992/f3f0a3e5-14ca-a50a-28e3-8aea52823c28.png)

※あとでいろいろ確認してみると、通常はバージョン名の無いものを入れるのが、よいみたいです。

無事インストールを終えて起動！

## 3.コマンドプロンプトしかでてこない。。。
IDとパスワードを入れると、プロンプトが表示されます。
でもね、windowシステムがほしいなあ。。。

[Ubuntu Wiki](https://wiki.ubuntu.com/WSL?action=subscribe&_ga=2.178930531.610594294.1590660171-356669655.1590660171#Installing_Packages_on_Ubuntu "Ubuntu Wiki")に、Xwindowシステムを入れましょうとありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400992/fd218b80-b5ad-127d-0e82-3a164253656a.png)

次回はこちらを入れてみます。
Zoomでライブストリーミング

streampack の Tana です。

Zoomでのミーティングや勉強会などの配信を

- 大多数に配信したい
- あとで追っかけて再生したい
- アーカイブを見たい
 
ケースが多くはないですが、少なからずあるかと思います。

この記事ではZoom から YouTubeへの配信になりますが、
配信先を変えるだけで他のライブストリーミングサービスも可能です。

その辺りも含めて設定方法について説明します。

## 前提

- Zoomアカウントを持っている
- ライブ配信を許可しているYouTubeアカウントを持っている

## Zoom側の事前設定

[Zoom設定](https://zoom.us/profile/setting)にアクセスし、`カスタムライブストリーム配信サービス` を ON にします。

<img width="1219" alt="live-for-zoom.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/5699ec41-3d9b-5bad-525f-4b811a3fe8e9.png">

## YouTube側の準備

Zoomに設定するための下記の情報を　YouTubeライブページにて取得します。

- Stream URL
- Streak Key
- 視聴URL

YouTubeライブのイベントを作成すると、下記のように `Stream URL` と `Stream Key` が払い出されますのでコピーします。
![youtube-streamkey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/fd95a736-0ec7-500a-1eb8-df357dd47530.png)

右上の共有ボタンから視聴用のURLを取得します。
![Live_streaming_-_YouTube_Studio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/80acd006-32c1-5680-edcf-2778bf870c2e.png)

`注意: プライバシー設定(公開/限定公開/非公開)は事前に確認しておきましょう。`

## Zoomにて配信開始

Zoom の新規ミーティングを作成した後に、`詳細` から "カスタムライブストリーム配信サービス" を選択します。(YouTube を選択することもできますが、YouTube API などの許可が必要。)

<img width="678" alt="スクリーンショット 2020-05-26 16.02.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/54187f86-849d-0f09-8c9c-c80ddcffe35d.png">

先ほど取得した YouTubeの配信情報をセットします。

<img width="701" alt="zoom-with-custom-live.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/fa9582f6-51b0-631f-37fa-f8f955b33255.png">

YouTubeの視聴URLからZoomが配信されていることが確認できます。

<img width="919" alt="zoom-live-watching.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/995f312a-3687-9894-e3f1-19d5ac22e47f.png">

## まとめ

YouTubeにZoom映像を配信することは、アカウントを持っていれば簡単にできます。
また、自前の配信サーバー・サービスにも送ることができるので、クローズドなサービスに配信する場合にも活用できるかと思います。
letsencrypt Attempting to renew cert from /etc/letsencrypt/renewal/ produced an unexpected error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping.

エラーが出た。

```

Attempting to renew cert from /etc/letsencrypt/renewal/ produced an unexpected error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping.
Attempting to renew cert (caba-ageha.com) from /etc/letsencrypt/renewal/caba-ageha.com.conf produced an unexpected error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping.


```

# nginxを一旦停止させてから作業をしてねという意味

さぁ、nginxを停止してから更新しよう。

```

// Nginxの停止
systemctl stop nginx

// SSL証明書の更新
/usr/bin/certbot-auto renew

// Nginxの再起動
systemctl restart nginx

```

`OK`


certbot の renew サブコマンドは、標準で期限切れが近い (30 日未満) の証明書だけを自動で更新してくれる便利なサブコマンドです。 期限切れが近い証明書がなければ letsencrypt のサーバーへのアクセスがなく、余計な負荷をかけないので、1日2回実行が推奨されています。


# cron にしたい

毎日の 午前 6:30 に実行

```

# 分 時 日 月 曜日 <実行コマンド>
30 6 * * * /usr/bin/certbot-auto renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" --quiet

```

これで動く。

また、cronでcertbot-autoが正常に動いているかをチェックするために

```

# lets encrypt の ログを一覧
ls -ltr /var/log/letsencrypt
vim /var/log/letsencrypt/letsencrypt.log #このファイルが最新の cron の日時になっていれば、 certbot は動いているということになる。

```

# 期限が残っていても強制的に更新

`force-renewal` は 期限が残っていても強制更新。
更新制限にひっかかる可能性があるので、
あんまり使わないほうが良いみたい。

```

8 10 9 * * /usr/bin/certbot-auto renew --force-renewal --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" --quiet

```


# 最終設定

僕の場合は、
毎月1日に確実に更新していきたいので。

```

30 6 1 * * /usr/bin/certbot-auto renew --force-renewal --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" --quiet

```

こんあ塩梅ですね。


以上
nvidiaのdockerでroot以外のユーザでGPUを使う

#はじめに
NvidiaはDokcerのサポートを強化しています。NGCなどから、イメージをダウンロードしコンテナとして実行が可能です。
なにかとバージョン依存の多いdarknetだのopenCVだのをつかうにあたって、dockerがとても便利だとおもって、[openCVのイメージ](https://qiita.com/sowd0726/items/57a4e867d358283bdf20) だの[darknetのイメージ](https://qiita.com/sowd0726/items/0da7128150f4a11ad30f)だのをつくって、さあこれから使おうとおもって、User追加してみたら、rootじゃないとGPUが使えませんでした。

#やったこと
なかなか検索してもひっかからなかったので、ここに書いとくことにしました。
解決策は以下
[nvidia-docker seems unable to use GPU as non-root user](https://forums.developer.nvidia.com/t/nvidia-docker-seems-unable-to-use-gpu-as-non-root-user/80276)

Dockerfileにすろと、こんなの足しとけばいけました。

```Dockerfile
RUN useradd -m ${USER} && \
    echo ${USER}:${PASSWD} | chpasswd && \
    echo "${USER} ALL=(ALL) ALL" >> /etc/sudoers
RUN sudo usermod -a -G video ${USER}
```
上記の[darknetのイメージ](https://qiita.com/sowd0726/items/0da7128150f4a11ad30f)をもとにするんだったらこんな感じ
ついでに、[Dockerでapt-get upgrade](https://qiita.com/sowd0726/items/690e3bc94cada24f2a09)もしてからユーザ追加してます。

```Dockerfile
FROM darknet:100
ENV USER="hoge"
ENV PASSWD="hogehoge"
ENV HOME=/home/${USER}
RUN apt-get -y update
RUN echo '* libraries/restart-without-asking boolean true' |  debconf-set-selections
RUN apt-get -y upgrade
RUN apt -y install xfce4-terminal
RUN useradd -m ${USER} && \
    echo ${USER}:${PASSWD} | chpasswd && \
    echo "${USER} ALL=(ALL) ALL" >> /etc/sudoers
RUN sudo usermod -a -G video ${USER}
USER ${USER}
WORKDIR ${HOME}
CMD ["/bin/bash"]
```
EC2にDockerをインストールして自作イメージからコンテナを起動してみる。

# 調べが足りないだけかもしれませんが。。
[Dockerのインストールガイド](https://docs.docker.com/engine/install/)で、AmazonLinuxでのインストール方法が見つからなかったので、自分がやった手順を残しておこうと思います。

# 環境
以下の環境で試しました。

<table>
<th>大項目</th>
<th>中項目</th>
<th>値</th>
<tr>
<td rowspan="2">EC2</td>
<td>インスタンスタイプ</td>
<td>t2.micro</td>
</tr>
<tr>
<td>OS</td>
<td>Amazon Linux 2</td>
</tr>
<tr>
<td colspan="2">Dockerリポジトリ</td>
<td>Docker Hub</td>
</tr>
</table>

# yumでインストールできました。
なんとなく、こんなコマンドでいけるのでは？
と、打ち込んでみたら、大当たり。

```sudo yum install docker```

# systemctlでdockerサービスを起動
インストールしたら、勝手にサービスが上がってくるだろうと思ってたら、そうではないようです。
以下のコマンドで、dockerサービスが起動できます。

```sudo systemctl start docker```

# docker login
docker login時はサーバを指定しました。

```sudo docker login https://index.docker.io/v1/```

# docker pull
ここから、先はつまづくことはなかったです。(イメージ名はサンプルです。)

```sudo docker pull myaccount/sampleapp:latest```

# docker container run
macで作ったRailsのアプリが、いとも簡単に起動しました。

```sudo docker container run -d -p 8080:3000 myaccount/sampleapp:latest```
Linuxサーバの時刻を現在時刻と同期させる（CentOS７）

#CentOSの時刻同期設定をします。

信頼出来るタイムスタンプがログに残っていることが障害調査の重要な手がかりとなるため、正確な時刻の確保はサーバ管理の根本であります。

以下、CentOSサーバ立ち上げ時の時刻同期の手順を備忘録として記します。


現在、2020/05/29 午前９時20分　

#CentOSサーバの時刻を確認

```:システムクロック
date
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635477/3b40c3ab-67cd-2b09-ae37-bc05d9c8d1f5.png)

ズレてますね

修正作業に入ります。

#設定作業
CentOS7では時刻同期にntpdではなく、chronyd を使って時刻を同期します。
かといって、CentOS 7 で ntpd がもう使えなくなったわけではありませんが、
CentOS 7 では なるべく chronyd を使うようにし、CentOS 8 では ntp が廃止されたため、chronyd 一択となります。


##chronydサーバのインストール

```:CentOS
yum -y install chrony
```

```
rpm -qa | grep chrony 
chrony-3.4-1.el7.x86_64
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635477/df16cf45-d87a-bb79-85cc-c4a8ffd9327a.png)

#Chrony NTP Client設定
`/etc/chrony.conf` を修正し、NTP クライアント設定を実施します。

修正箇所は、`line: 02 ～ 09` までで、それ以外はデフォルトのままです。
ただし、グローバルへ接続できる場合・かつ グローバルの名前解決できる環境の場合は、 centos.pool.ntp.orgのデフォルト設定でOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635477/c5802e29-d5cb-e151-402f-6c67d324abb7.png)

そして、port 0 を追加すると Chrony が NTP サーバとして動作しなくなります。 すなわち 123番ポートを listen しなくなります。 (クライアントとして動作します)

#chronyサービス起動

ntp サーバが動いている場合には (主に CentOS 7)、事前に停止してから chronyd を起動してください。
##ntpd停止

```:CentOS７
# systemctl stop ntpd.service


# systemctl disable ntpd.service
```
##chronydサービス起動


```:CentOS7
# systemctl enable chronyd.service
```
###chronyが使える状態になっているか確認します。

```
# systemctl list-unit-files --type service | egrep "(ntp|chronyd)"
chronyd.service                             enabled
ntpd.service                                disabled
ntpdate.service                             disabled
```
###chronyを再起動します
```
# systemctl restart chronyd.service
```
#Chrony時刻同期確認

```
# chronyc sources
```
アスタリスク(星印) * が付いているサーバが現在時刻同期が行われているサーバです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635477/7153bce7-4281-9b80-6b9c-e46f227d1912.png)

また、Chrony が NTP サーバとして動作してないことを確認するために、123 番ポートを Listen してないことを確認します。

```
# ss -taun | grep 123
※123番ポートで listen してないこと（何も出力されなければ、OK）
```
以上、CentOS 7～8 NTP クライアント時刻同期設定 でした
【Vue.js】ナビゲーションガード(beforeRouteEnter)を使って前のページのURLを取得する

# やりたいこと
VueRouterで遷移するページで、一つ前のページのURLなどを取得して、
それに応じてページ内のパーツの表示非表示を切り替えたい。

# beforeRouteEnterで取得しようとしたが・・・
今回はあるComponentのみで、前のURLが必要だったので、VueRouterのナビゲーションガードの`beforeRouteEnter`を使用してみました。
[公式のドキュメント](https://router.vuejs.org/ja/guide/advanced/navigation-guards.html#%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%83%93%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AC%E3%83%BC%E3%83%89)

```vue:hogeComponent.vue
<template>
  <div>
    // 前のURLに応じてここの表示非表示を切り替えたい
    <div v-if="prevRoute.name =='hoge'"></div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      prevRoute: null,
    };
  },
  created() {
  },
  beforeRouteEnter(to, from, next) {
    next(vm => {
      vm.prevRoute = from;
      console.log(vm.prevRoute);
    });
  },
  methods: {
  }
};
</script>
 ```

これで`this.prevRoute.name`：**前のページで表示していたComponentの名前**
`this.prevRoute.path`：**前のURL**が取得できます。

しかし、ここで一つ問題が・・・！
nextに渡したコールバック関数はVueライフサイクルフックのmountedよりも後に実行されてしまうので、
ページを描画するタイミングでは`prevRoute.name`や`prevRoute.path`が存在しませんよ〜
というエラーが出てしまう。。。。
[beforeRouteEnterのnextコールバックの実行タイミング](https://qrunch.net/@TsulalaAsagiri/entries/sMnTdXJp9YUCkTwv)はこちらの記事を参考にさえていただきました。
ちなみに、コンポーネント描画後であれば、`this.prevRoute.name`などで取得できます！


# Vuexを使ってみる

そこで、`beforeRouteEnter`で取得した前のページのデータをVuexのStateで管理し、
`computed`でVuexのStateからデータを取得するという方法をとる事にしました。
もっと簡単な方法があればぜひ教えてください・・・！

```vue:hogeComponent.vue
<script>
//省略
  beforeRouteEnter(to, from, next) {
    //　ここでVuexに前のページの情報をStateに渡す！！
    next(vm => {
      vm.prevRoute = from;
    });
  }
</script>
 ```

# 実装方法

```vue:hogeComponent.vue

<script>
import store from "../../../store/index";
import { mapMutations, mapGetters } from "vuex";

export default {
  data() {
    return {
      prevRoute: null
    };
  },
  beforeRouteEnter(to, from, next) {
    store.commit("route/setPrevRoute", from);
    next(vm => {
      vm.prevRoute = from;
    });
  },
  computed: {
    prevRouteChild() {
      return this.$store.getters["route/getPrevRoute"];
    }
  }
};
</script>
```

```vue:store/modules/route.js
const state = {
    prevRoute: []
};

const mutations = {
    setPrevRoute(state, from) {
        state.prevRoute = from;
    }
};

const actions = {};

const getters = {
    getPrevRoute: state => state.prevRoute
};

export default {
    namespaced: true,
    state,
    mutations,
    getters,
};
```

```vue:store/index.js
import Vue from "vue";
import Vuex from "vuex";
import route from "./modules/route";

Vue.use(Vuex);

export default new Vuex.Store({
    modules: {
        route
    }
});
```
これで初期描画のタイミングで表示非表示を切り替えることができました！
何か間違ってたら、是非教えてください＾＾

# 参考ページ
[beforeRouteEnterのnextコールバックの実行タイミング](https://qrunch.net/@TsulalaAsagiri/entries/sMnTdXJp9YUCkTwv)
【EC2・Rails】unicorn.logのエラーIs the server running on host "3.114.69.77" and accepting 	TCP/IP connections on port 5432?  (PG::ConnectionBad)の解決法

デプロイをしている最中のエラー。
Postgresqlを使っています。

unicorn.logの結果は下記の通り。


```
Is the server running on host "3.114.69.77" and accepting
	TCP/IP connections on port 5432?
 (PG::ConnectionBad)
```


##原因はいくつかある。

###Ec2内のデータベースにアクセスできる権限がない。

アプリディレクトリでpsql -lと打って下記のように表示されれば、権限がない可能性があります。

<img width="344" alt="スクリーンショット 2020-05-26 12.10.1610.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/5d5f7cda-565b-ed8e-23f9-d88deff49566.png">

\lで確認しても権限がない。
portfolioの部分にアクセス権が書いていない。

<img width="866" alt="スクリーンショット 2020-05-26 12.34.5234.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/c7a55ae6-1a1b-d4cb-4750-430cf1864a68.png">

したがって下記のコマンドで権限を追加します。

```
$  su - postgres  #管理者権限でDBに入る。

$  psql postgres

$  psql -U postgres -d postgres #postgresユーザで入る。

$  su postgres

$  psql -l

$  GRANT ALL PRIVILEGES ON DATABASE portfolio to postgres;  #これで権限を追加できる。
```

<img width="960" alt="スクリーンショット 2020-05-26 18.51.4451.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568461/a8d4ab57-3e50-1cb1-02c9-d326f61278fe.png">

しかしunicorn.logのエラー文は変わらず。

###database.ymlの本番環境のhost名はlocalhostかIPを指定する。
database.ymlの本番環境のhost名でlocalhostかIPを指定することによって解決。


以下のようなルールがあるとのこと。


####production環境の host名をdbにするのは、dockerを使って内部ネットワークを利用するときに使用する。
####そうでない場合は、host名は、dbのホスト名かIPを指定する。
####同じサーバー内で動かすのであれば、localhostでも良い。
laravelの認識で間違っていたこと　その１~Route-Controller間のパラメーター~

#laravelのRoute-Controller間のパラメーター間違い
##言い訳
youtubeなんかの動画や初心者用のwebページなどをみてlaravelにおけるroute-controller間のパラメーターの受け渡しを学びました。（学んだつもりでした。）
まさか他の人が沼にハマるまいとは思いますが、救済する1本の蜘蛛の糸になれば幸いです。

##科学の力ってスゲー
フレームワークを利用し始めた当初簡単にsqliteのようなデータベースと接続し、簡単にSELECTできる（値を引っ張ってこれる）ことに感心していました。
「（データがあるテーブル名が`posts`の場合）え？`Post::find(1)`だけでid=1の（レコードの）データをもって来れるの！？科学の力ってスゲー。」

###間違い
実際にハマっていた間違い↓

```web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/post','PostsController@index');
Route::post('/post/{id}','PostsController@detail');
//ルートの設定postで一覧画面、その後ろに数字をつけることで、そのidの詳細画面に行けるようにする　
```
```PostController.php
namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;

class PostsController extends Controller
{
    public function index()
    {
        $posts = Post::all();
        //postsテーブルの全データ取得

        return view('ichiran',['posts' => $posts]); 
        //表示は「ichiran.blade.php」の方に引数postsを渡して任せる
    }

    public function detail(Post $post)
    {
        $title = $post->title; 
        $body = $post->body; 
        //例えば/postページから/post/1へと遷移した時は$id=1のデータが勝手に取得される

        return view('shousai',['title' => $title,'body' => $body]); 
        //表示は「shousai.blade.php」の方に引数title,bodyを渡して任せる
        //普段は$postをビューの方に渡してそっちで{{ $post->title }}としていますよ、念為。
    }
}
```

`/postページから/post/1へと遷移した時は$id=1のデータが勝手に取得される`なんて程、人生は甘くはないんですねぇ。
何万回試そうが、$id=1のデータは取れず…
###最初に見つけた解決策1
```PostController.php
namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;

class PostsController extends Controller
{
    //略

    public function detail(Post $post,$id)//<-new
    {
        $post = Post::find($id);
        //routeの方で{id}と指定したためcontrollerで使いたい時にはfunctionの引数に指定すれば使える
        //よって/post/1へと遷移したら$id=1のデータをfindすることができる

        $title = $post->title; 
        $body = $post->body; 

        return view('shousai',['title' => $title,'body' => $body]); 
    }
}
```

でもこれなんかスマート（ここで言うスマートとは「引数が多くなってるなぁ、function内の記述もちょっと多いし…なんかもっと削れないんかなぁ」程度のこと）でないなぁ…

###試行錯誤し、行きついた解決策2
まずrouteをちょっと変更し、{id}ではなく{post}にします。
そうすると…

```web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/post','PostsController@index');
Route::post('/post/{post}','PostsController@detail');
```
```PostController.php
namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;

class PostsController extends Controller
{
    //略

    public function detail(Post $post)//<-new
    {
        $title = $post->title; 
        $body = $post->body; 

        return view('shousai',['title' => $title,'body' => $body]); 
    }
}
```

これだけで`$title`には{post}に渡された数字のデータが入るんですね。ビックリです。

いつも{id}で指定していたので、「なんでリソースコントローラー作るとeditには勝手に任意のデータが読み込まれるのだろう…リソースコントローラー専用なのか、ずるいな」と思っていました。

##からくり
detailファンクションの引数にPostモデルのインスタンスを指定してあげた（いわゆるDI）変数名とrouteで指定した変数名を合わせることで、URL内で指定した数値のデータをモデルから持ってくることができるんですね。

え？それの次が知りたい？
それはもっと偉い人に聞いてください。
Docker超入門！Apacheを使ってhtmlを表示してみよう！

# 目的

- Dockerを学ぶ最初の一歩として自分の知識を整理しながら基礎をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Docker バージョン | 19.03.8 | こちらの方法で導入→[Docker Desktop for Mac をインストールする](https://qiita.com/miriwo/items/b4d41c45a12b1ae7f91e) |

# 概要

1. イメージのダウンロード
1. コンテナの作成
1. htmlの表示
1. 確認

# 詳細

1. イメージのダウンロード
    1. 下記コマンドを実行してApacheのイメージのダウンロードを行う。(DockerではApacheはhttpdという名前で扱われている。)

        ```terminal
        $ docker pull httpd
        ```
    1. 下記コマンドを実行して現在インストールされているイメージの一覧を出力しApache(httpd)が存在する事を確認する。

        ```terminal
        $ docker images
        >REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
        >httpd                  latest              d4e60c8eb27a        12 days ago         166MB
        ```
1. コンテナの作成
    1. 下記コマンドを実行してイメージからコンテナを作成し、作成したコンテナを起動する。
        - `-d`はデーモンモードにて起動するオプションである。
        - `-p 物理マシンのポート番号:コンテナのポート番号`はポート設定を行うオプションである。(物理マシンとは、みなさんのMacBookやWindowsPCを指す。)
        - 下記コマンドの意味は「デーモンモードにて、物理マシンのポート番号8080番とコンテナのポート番号80番をつないでイメージからApache(httpd)のコンテナを作成します」である。

        ```terminal
        $ docker run -d -p 8080:80 httpd
        ```
    1. ブラウザにて下記にアクセスする。
        - [http://localhost:8080](http://localhost:8080)
    1. 下記の様に表示される事を確認する。

        ![スクリーンショット 2020-05-28 19.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/21d0edea-ed7d-50f7-8bb9-59fb5aba9aeb.png)

    1. 下記コマンドを実行して現在起動しているコンテナの一覧を表示する。

        ```terminal
        $ docker ps
        ```

    1. 下記コマンドを実行して一旦Apacheのコンテナを停止する。(コンテナ名は先のコマンド`$ docker ps`のNAMESの内容)

        ```terminal
        $ docker stop コンテナ名
        ```
1. htmlの表示
    1. 下記コマンドを実行してhtmlファイルを格納するディレクトリを作成する。

        ```terminal
        $ mkdir -p /tmp/html
        ```
    1. 下記コマンドを実行してhtmlファイルを作成する。

        ```terminal
        $ echo "Hello Japan" >> /tmp/html/index.html
        ```
    1. 下記を実行してdockerコンテナ先のディレクトリにマウントする。(`$ docker run -d -p 8080:80 -v "物理マシンにあるhtmlファイルの親ディレクトリのフルパス(マウントするディレクトリ):コンテナ側のディレクトリ(マウント先のディレクトリ)" httpd`)

        ```terminal
        $ docker run -d -p 8080:80 -v "/tmp/html/:/usr/local/apache2/htdocs/" httpd
        ```
1. 確認
    1. ブラウザにて下記にアクセスする。
        - [http://localhost:8080/](http://localhost:8080/)
    1. 下記の様に表示される事を確認する。

        ![スクリーンショット 2020-05-28 21.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/23a7af14-f5ed-9b44-ef45-550bcc4367f9.png)
【EC2】本番環境でgit pull origin masterをしたのにCSSの変更が適用されない際の対処法

本番環境でアプリのディレクトリまでいき、下記を実行する。

```
bundle exec rake assets:precompile RAILS_ENV=production
```

で、アプリを再起動する。


```
$  sudo service nginx restart
$  sudo systemctl restart  postgresql
$  ps -ef | grep unicorn | grep -v grep
$  bundle exec unicorn_rails -c /var/www/rails/Portfolio/config/unicorn.conf.rb -D -E production
```

終了です。
vagrant+virtualbox+ansibleで開発者用無料サブスクリプションが登録/自動サブスクライブされたRHELを使用する




#vagrant+virtualbox環境におけるRHELの利用

##問題

RHEL環境における検証を、test-kitchenにてローカルで行う場合、vagrant + virtualboxかdockerの利用が一般的と思える。
RHEL系では、centosが簡易に使用可能だが、RHELと完全に同じとはならない。

vagrantを直に使用する場合にも同様。

RHELを使用する場合、dockerは、RHEL8からはpodmanなどの利用となり、dockerhubにも公式なrhelのイメージは見つけられなかった事から、やや使いにくい。

##ソリューション

###vagrant + vartualbox 環境においてRHELを使用し、ansibleのredhat_subscriptionモジュールにてサブスクライブを行う。


#### 1. Red Hat Developer program membership に登録する

http://developers.redhat.com/register
にアクセスし、以下を入力してアカウントを作成する。

- ユーザー名 (Red Hat ログイン ID) 
- メールアドレス
- 職務内容
- パスワード

この内、サブスクライブには以下を使用する

- ユーザー名 (Red Hat ログイン ID) 
- パスワード

#### 2. Vagrantfile (or kitchen.yml) にてRHELを指定する

Redhatのオフィシャルなイメージは無いという理解なので、ここでは以下のboxを使用させていただく


RHEL8系
https://app.vagrantup.com/generic/boxes/rhel8

RHEL7系
https://app.vagrantup.com/generic/boxes/rhel7


```yaml:kitchen.ymlの例
---
platforms:
- name: rhel8
  driver:
    name: vagrant
    box: generic/rhel8  # <= ここに指定

suites:
- name: dev
  provisioner:
    name: ansible_push
    playbook: site.yml
    chef_bootstrap_url: nil
```


#### 3. playbookから、ansibleのredhat_subscriptionモジュールを使用し、レジストレーションを行なう

```yaml:site.yml
- hosts: all
  tasks:

  - name: Register and auto-subscribe to available content
    redhat_subscription:
      state: present
      username: foo  # <= 登録したユーザー名 (Red Hat ログイン ID) 
      password: bar　# <= 登録したパスワード
      auto_attach: true
      force_register: true
    register: r
    until: r is succeeded

  - name: メイン処理タスク
...

```

ここではシンプルにtasks:の先頭で実行しているが、pre_tasks:にて指定しても良いでしょう。
インターネット接続が必要。
初回は数分を要するが、再実行時にはすぐに終了する。
その為、kitchen convergeによる再実行を多用するケースに向いている。
たまに失敗する為、untilを使用。デフォルトでリトライ3回、リトライ間隔5秒。

https://docs.ansible.com/ansible/latest/modules/redhat_subscription_module.html

ユーザー名、パスワードの単純なハードコードを避けるならば、例えば以下の様な対応が可能。

- ansible vaultを使用する
- ~/.bash_profileなどから環境変数経由で受け渡す

##### 環境変数経由で受け渡す例

```bash:~/.bash_profile

...
export REDHAT_SUBSCRIPTION_USERNAME="foo"
export REDHAT_SUBSCRIPTION_PASSWORD="bar"
...
```

```yaml:task
- name: Register and auto-subscribe to available content
  redhat_subscription:
    state: present
    username: "{{ lookup('env', 'REDHAT_SUBSCRIPTION_USERNAME' ) }}"
    password: "{{ lookup('env', 'REDHAT_SUBSCRIPTION_PASSWORD' ) }}"
    auto_attach: true
    register: r
    until: r is succeeded
```



## サブスクライブしたシステムの削除

CI/CDのテストで作成、廃棄を繰り返していると新たにサブスクライブできなくなる
その場合、以下などからログインして、廃棄してもう使用しないシステムを削除する事で対応できる

https://access.redhat.com/management/systems
Cloud Pak for Data (Watson Studio)でpandasデータをExcel形式でデータ資産に保存する

project_libを使った分析プロジェクトのデータ資産へのファイル保存方法は[別の記事](https://qiita.com/ttsuzuku/items/eac3e4bedc020da93bc1#%E3%83%87%E3%83%BC%E3%82%BF%E8%B3%87%E7%94%A3%E3%81%B8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BF%9D%E5%AD%98-%E5%88%86%E6%9E%90%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)に書きましたが、Excel形式で保存するには少しコツが必要でした。
いろいろ調べていたら、stackoverflowの[こちらの記事](https://stackoverflow.com/questions/56538138/saving-dataframe-as-excel-file-into-ibm-cloud-object-storage-with-python)が有効でした。

実際にやってみた例を記載します。

```python:使ったpandasデータフレーム
# サンプルデータ Iris
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['iris_type'] = iris.target_names[iris.target]
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/febaa91f-02be-690e-c328-b3db440c8530.png)

このデータをExcel形式で保存してみます。
流れは、pandas.to_excelで一旦環境内にExcelファイルとして保存し、

```python
# 一度Excelファイルとして環境内に出力する
filename = 'iris.xlsx'
df.to_excel(filename, index=False)
!pwd
!ls -l

# -output-
# /home/wsuser/work
# total 12
# -rw-r-----. 1 wsuser watsonstudio 8737 May 28 06:53 iris.xlsx
```

ioバイトストリームとして読み込んで、project_libで分析プロジェクトに保存します。

```python
from project_lib import Project
project = Project.access()

import io

with open(filename, 'rb') as z:
        data = io.BytesIO(z.read())
        project.save_data(filename, data, set_project_asset=True, overwrite=True)
```

分析プロジェクトに保存されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/cbccae29-5e81-8b86-d192-e59438cc59a7.png)

念のため、ダウンロードして中身を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/4f4a2065-da8a-5e22-313f-370ef9f02871.png)
無事、150行のIrisデータがExcel形式で保存できました。
【Rails】Devise、ActiveStorage、S3でユーザーアバターの実装 

# 概要
タイトルの通りです。
事前にActionTextを使用していた関係で一部手順が抜けている部分もあるかもしれませんがご了承ください。
CarrierWaveを使用した記事も書いたのですが、ActiveStorageの方が何かと便利そうです。
[【Rails】Devise、CarrierWave、S3でユーザーアバターの実装](https://qiita.com/chabudai/items/2f41f960d5a68fd34e91)

# 環境
Ruby:  2.7.1
Rails: 6.0.2.2
Devise導入済み
(gem 'devise', '~> 4.7', '>= 4.7.1')

# 手順
今回は「avatar」という名称で実装してますが好みでimageなどに変更してください。

## ActiveStorageのインストール
以下の手順で「active_storage_attachments」と「active_storage_blobs」の二つのテーブルが作成されます。

```zsh
$ rake active_storage:install

# DBマイグレーション
$ rake db:migrate
```

## モデルの設定
これで画像が「active_storage_attachments」テーブルの「record_type」カラムに「User」で保存されるようになります。
今回は1枚の画像のみ保存できればいいので「has_one_attached」としています。
複数枚保存する方法もありますがそちらは別記事に譲ります。

```ruby:app/models/user.rb
class Comment < ApplicationRecord
  has_one_attached :avatar
end
```

## Deviseのstrong parametersを追加
今回は編集画面でのみアバターを設定できるようにします。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
    # deviseのpermitted_parameterを追加する
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:account_update, keys: [:avatar] )
      # 登録時も必要であればsign_upを追加
      # devise_parameter_sanitizer.permit(:sign_up, keys: [:avatar] )
    end
end
```

## S3の設定
こちらの記事を参考にしてください。
[Railsでaction text(active storage)の画像保存先をaws s3に変更した](https://w-muro.github.io/blog/log/2020/05/20/Rails%E3%81%A7Action-Text(Active-Storage)%E3%81%AE%E7%94%BB%E5%83%8F%E4%BF%9D%E5%AD%98%E5%85%88%E3%82%92AWS-S3%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F)

## アバターの保存と表示
アバター保存画面

```html:app/views/users/registrations/edit.html.erb
<%= form_with model: @user, url: user_registration_path, local: true do |f| %>
  <div class="field">
    <%= f.label :avatar %>
    <%= f.file_field :avatar %>
  </div>

  <div class="actions">
    <%= f.submit "保存" %>
  </div>
<% end %>
```

アバター表示画面

```html
<% if @user.avatar.attached? %>
   <%= image_tag @user.avatar %>
<% end %>
```

## 画像が表示されない場合
image_processingをインストールしてみてください。

```ruby:Gemfile
# rails6であればすでにあるとおもうのでコメントアウトを外してください。
gem 'image_processing', '~> 1.2'
```

```zsh
$ bundle
```

# 後書き
こちらの記事を参考にすれば保存した画像の整形なども簡単にできます。
[Active StorageのVariantの指定方法いろいろ](https://qiita.com/kazuomatz/items/3cdbd2c40576c2e9d89b)

冒頭に書いたように最初はCarrierWaveを使用していたのですが、それだとS3のパブリックアクセスブロックをオフにしてURLからアクセスできるようにしなければならなかったのでActiveStorageの使用に切り替えました。
設定もこちらの方が楽でした。

# 参考
[Active Storage の概要](https://railsguides.jp/active_storage_overview.html)
[【Rails 5.2】 Active Storageの使い方](https://qiita.com/hmmrjn/items/7cc5e5348755c517458a)
C#のグローバル変数を実現する上で一番わかりやすかった記事って結局これだった


嘘をつきました、記事より、いただいたコメントの方が分かりやすかったです。

@albireoさんより紹介

```
public static partial class App
{
    static public string Cnstr = "";        // グローバル変数の宣言
    static public string ID= "";
    public string NonStatic = "abc";        // エラーになる

　　//頑張って分かるやりかた。
　　//１、「エラーになる」と「・・・の宣言」の違いを比較する。
　　//２、クラス名称を別例（もう一つの例）と比較する。普通のクラス宣言とも比較する。
　　//３、for文やif文などで条件分岐から値を取得する場合にもCnstr、つまりグローバル変数が使える便利。
　  //　　でもクラス内だけならクラスのグローバル宣言要らない可能背があるかも？
｝

//外部クラスでグローバル変数をつかう。
    private void Btn_Update_Click()
    {
       Cconsole.WriteLine(App.Cnstr);        // App で宣言されたグローバル変数を利用
    }
```
@shiracamus さんより以下のコメントをいただきました。
一般的に「クラス変数」と呼ばれるものですね。
オブジェクト指向では、依存するクラスを減らす努力が必要です。
つまり、クラス間の依存をなくす。

何故なくすかっていうと、何も考えずに文字を羅列すると
「複数のクラスに色々またがってるから管理が面倒。かつ危険」
「このクラスって何してるん？あれ？」ってなりそう
「引継ぎの時面倒」「作り直ししたくなる」
なんだけど。何でかぐぐる。

これが分かりやすかった。と紹介しましたが・・・嘘でした。
https://w.atwiki.jp/cs00/pages/11.html
これ中身

```
//グローバル変数を設定。
    public partial class App : Application
    {
        static public string Cnstr = "";        // グローバル変数の宣言
        static public string ID= "";
    }

//グローバル変数をつかう。
    private void Btn_Update_Click()
    {
        App.Cnstr = "SQL";        // App で宣言されたグローバル変数を利用
    }
```
@shiracamusさんより、
「クラスの数を複数設けないように努力する必要が有る。」というアドバイスもあり
グローバル変数用のクラスを設けなくてもいいことがわかりました。
CentOS ファイアウォール停止方法

業務の中でファイアーウォールを無効化しなくてはいけない場面でよく手順があやふやになるので備忘録として記します。

#CentOS7のファイアーウォールについて

CentOS7から初期状態で有効になっているファイアウォールが、今までの「iptables」から「firewalld」に変更になっています。自動起動設定を見て見ると「firewalld」がenable（有効）で、「iptables」がdisabled（無効）となっていることがわかります。

#firewalld自動起動設定確認

```
#systemctl is-enabled firewalld
enabled
```

#iptables自動起動設定確認

```
#systemctl is-enabled iptables

disabled
```
#CentOSでのファイアーウォール停止方法

ファイアウォールの停止方法ですが、CentOS7から一部のサービスを除いて「systemd」管理されているので、「systemctl stop firewalld」コマンドを使用して「firewalld」を停止させます。

##firewalld停止

```
#systemctl stop firewalld
```
##firewalld停止確認
「systemctl status firewall」コマンドを使用することで、「firewalld」のステータスを確認することができます。
Active欄が「Active: inactive(dead)」と表示され、サービスが停止されていることが確認できます。

```
#systemctl stop firewalld
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635477/94ff2e81-8a3f-567e-8937-3b676a81f042.png)

#firewalld自動起動停止

サーバの再起動後も「firewalld」を自動起動させないようにするには、「systemctl disable firewalld」コマンドを使用します。

```
#systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
```
## 設定確認
自動起動が停止されていることを「systemctl is-enabled firewall」コマンドを実行して確認します。
コマンド実行結果が「disabled」と表示されれば自動起動が停止されています。

```
#systemctl is-enabled firewalld 
disabled
```
#firewalld自動起動設定
停止させた自動起動を開始させたい場合は、「systemctl enable firewall」コマンドを実行することで自動起動の設定を行うことが出来ます。

```
#systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/basic.target.wants/firewalld.service'
```
##設定確認
自動起動の設定がされていることを「systemctl is-enabled firewall」コマンドを実行して確認します。
コマンド実行結果が「enabled」と表示されていれば自動起動が設定されています。

```
#systemctl is-enabled firewalld
enabled
```
以上です。
CefSharpでFlashを再生する方法

# はじめに
CefShrapでFlashが使えるようにする方法がけっこう複雑だったので、まとめておきます。

# pepflashplayer.dllのダウンロード
CefSharpではFlashがサポートされていないので、FlashのDLLファイルを用意する必要があります。
[こちら](https://jp.dll-files.com/pepflashplayer.dll.html)からバージョン28.0.0.137のものをダウンロードしてください。
最新のDLLだと動かないので注意してください。

ダウンロードしたらファイルを解凍し、pepflashplayer.dllを
プロジェクトフォルダ\bin\Debug
にコピーしておきます。

# Flashの設定
CefSharpではFlashがデフォルトで無効化されているので、パラメータで設定します。

```C#
CefSettings settings = new CefSettings();
// レンダリングを最適化
settings.SetOffScreenRenderingBestPerformanceArgs();
// Flashを有効化
settings.CefCommandLineArgs.Add("enable-npapi", "1");
settings.CefCommandLineArgs.Add("ppapi-flash-path", "pepflashplayer.dll");
settings.CefCommandLineArgs.Add("ppapi-flash-version", "28.0.0.137");
settings.CefCommandLineArgs.Add("debug-plugin-loading", "1");
settings.CefCommandLineArgs.Add("allow-outdated-plugins", "1");
settings.CefCommandLineArgs.Add("always-authorize-plugins", "1");
settings.CefCommandLineArgs.Add("disable-web-security", "1");
settings.CefCommandLineArgs.Remove("enable-system-flash");
settings.CefCommandLineArgs.Add("enable-system-flash", "1");
settings.CefCommandLineArgs.Add("plugin-policy", "allow");
settings.CefCommandLineArgs.Add("disable-plugins-discovery", "1");
Cef.Initialize(settings);

// 自動再生を許可
var contx = Cef.GetGlobalRequestContext();
Cef.UIThreadTaskFactory.StartNew(delegate
{
    contx.SetPreference("profile.default_content_setting_values.plugins", 1, out string err);
});
cefBrowser = new ChromiumWebBrowser("https://www.google.co.jp/");
```

これで再生できるようになるはずです。
シンプルにRailsでStripeを動かす（コンソールで決済してみる）

## RailsでStripe gemをinstall

```
gem 'stripe'
```


## RailsでStripe設定ファイルを手動で作る

```
config/initializers/stripe.rb
```

## RailsでStripeを鍵をセット

```stripe.rb
Rails.configuration.stripe = {
    :publishable_key => "あなたのPublishable key",
    :secret_key => "あなたのSecret key"
 }

 Stripe.api_key = Rails.configuration.stripe[:secret_key]
```

## RailsでStripe決済する

```
% rails c

> amount = 500
> token = 'tok_jp'
> order_id = 'sample_order_id'
> charge = Stripe::Charge.create(
    amount: amount,
    currency: 'jpy',
    source: token,
    metadata: { order_id: order_id },
  )
```
螺旋状にオブジェクトを生成する

# 説明

Unityで螺旋状にオブジェクトを生成します。

[前回](https://qiita.com/beckyJPN/items/e9c90ea3943866cb6e18) は円状にオブジェクトを生成しました。
そのコードから単に、Z軸を少しずつずらしているだけです。

奥行きの距離を表すために、Length設定値を復活させています。
また、位置決めの前に Z軸の 足し算を行っているので、
初期値は1回分足し込み分を引いています。

![20180615000750.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/0649f83a-bc54-0bec-c56a-b82377679b03.jpeg)


数が少ないと、わかりにくいのでオブジェクトを100個生成してみました。

![20180615000753.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/2e442e54-2b67-80af-7ce3-a5a2ce2610f0.jpeg)


# コード

前回まで Creater って書いていた。。
Creatorでした・・・

```cs
using UnityEngine;

public class SpiralObjectCreator : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 100; // 生成するオブジェクトの数

    [SerializeField]
    private float radius = 5f; // 半径

    [SerializeField]
    private float repeat = 5f; // 何周期するか

    [SerializeField]
    private float length = 50f; // Z軸の長さ


    void Start () {

        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π
        var oneLength = length / itemCount; // Z軸の1単位
        var z = transform.position.z - oneLength; // Z軸初期位置 (生成前に足しこみをしているので、一回分引いておく)

        for (var i = 0; i < itemCount; ++i)
        {

            var point = ((float)i / itemCount) * oneCycle; // 周期の位置 (1.0 = 100% の時 2π となる)
            var repeatPoint = point * repeat; // 繰り返し位置

            var x = Mathf.Sin(repeatPoint) * radius;
            var y = Mathf.Cos(repeatPoint) * radius;
            z += oneLength;

            var position = new Vector3(x, y, z);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }
		
    }
	
}
```

# GitHub

https://github.com/becky3/unity-test-Spiral
円状にオブジェクトを生成する

# 説明

Unityで円状にオブジェクトを生成します。

[前回](https://qiita.com/beckyJPN/items/6c3ab70a1602c89d2c04)のサインカーブにオブジェクト生成するものからの発展です。

ちょっとリファクタリングしてますが、yの生成方法は前回と同じです。
さらに、xを同様にCosで求めるだけで、円形になります。

それぞれの周期が半分ずつずれてるので、うまい具合に円になってくれるのですが、
xとyにそれぞれCosとSin与えておけば円になるって覚えとけばなんとかなります。

![20180613233826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/2397ac26-80d0-3efc-338a-b4c925c13fb6.jpeg)


あと、距離は円ということで 半径radiusに置き換えました。
円形なので、繰り返しについては正直意味がないんですが、
次の発展絵使えるのでとりあえず残しています。


また、真ん中の球はコピー元のオブジェクトです。
邪魔な場合は、createObjectにPrefabを指定するか、
円を生成後、createObject自体を消滅させても良いでしょう。


![20180613234044.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/cee8461f-67b2-6e41-e9cc-f2a86b1821a6.jpeg)


# サンプルコード

```cs

using UnityEngine;

public class CircleObjectCreater : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 40; // 生成するオブジェクトの数

    [SerializeField]
    private float radius = 5f; // 半径

    [SerializeField]
    private float repeat = 2f; // 何周期するか

    void Start () {

        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π

        for (var i = 0; i < itemCount; ++i)
        {

            var point = ((float)i / itemCount) * oneCycle; // 周期の位置 (1.0 = 100% の時 2π となる)
            var repeatPoint = point * repeat; // 繰り返し位置

            var x = Mathf.Cos(repeatPoint) * radius;
            var y = Mathf.Sin(repeatPoint) * radius;

            var position = new Vector3(x, y);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }

		
    }
	
}

```

# GitHub

https://github.com/becky3/unity-test-Circle
サインカーブ状にオブジェクトを生成する

# 説明

Unityでサインカーブ状にオブジェクトを生成します。

![20180612232450.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/319e2dce-d61e-179e-c313-9dc3dcbcfc42.jpeg)


赤線は説明用の手書きです。

sinカーブを2周期で、20個のオブジェクトを生成。
全体の距離が20で、上下の振幅を2倍大げさに見せています。

各オブジェクトの配置間隔は `距離 / オブジェクト数` で求めています。

createObjectに設定したGameObjectを繰り返して貼り付けます。

![20180612232453.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/45d7d77c-278e-4542-7832-8ed9d4dd4fee.jpeg)


パラメータの詳細はコードのコメントを参照してください。

# サンプルコード

```cs

using UnityEngine;

public class ObjectCreaterCurve : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 20; // 生成するオブジェクトの数

    [SerializeField]
    private float length = 20f; // アイテムの広がる距離

    [SerializeField]
    private float expantion = 2f; // 高さ変動の拡大値

    [SerializeField]
    private float repeat = 2f; // 何周期するか


    void Start () {

        var unit = length / itemCount; // オブジェクトの配置間隔
        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π

        for (var i = 0; i < itemCount; ++i)
        {

            var ratio = (float)i / itemCount; // 周期の位置 (1.0 = 100% の時 2π となる)

            var x = i * unit;
            var y = Mathf.Sin(ratio * oneCycle * repeat) * expantion;

            var position = new Vector3(x, y);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }

		
	}
}

```

# プロジェクトファイル

gitHubにプロジェクト毎アップロードしています。
https://github.com/becky3/unity-test-SinCurve
.bashrcと.bash_profileの違い

# .bashrc/.bash_profile/.profile それぞれに何を書くのか

- ~/.bash_profile
-> 余計なものを書かない。  
ログイン時に一回だけ実行する設定を書く
.profileと.bashrcを読み込む設定だけ書く

- ~/.bashrc
シェルを起動するたびに実行したい設定を書く
ex.) EDITOR変数, プロンプト設定

- ~/.profile
bashに依存しないものを書く
ex.) 環境変数, GUI設定

# 上記を踏まえての設定
``` 
.bash_profile
# .profileを読み込む
if [ -f ~/.profile ] ; then
. ~/.profile
fi
# .bashrcを読み込む
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

```
.bashrc
# gitのブランチ名と改行
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
# default:cyan / root:red
if [ $UID -eq 0 ]; then
    PS1='\[\033[31m\]\[\033[00m\]\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '
else
    PS1='\[\033[36m\]\[\033[00m\]\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '
fi
```

```
.profile
# rubyの環境変数設定
export PATH=$HOME/.nodebrew/current/bin:$PATH
eval "$(rbenv init -)"
```


# 参照
https://techracho.bpsinc.jp/hachi8833/2019_06_06/66396
Microsoft TeamsでMarkdownのハイパーリンクを使ってシンプルに表示させる方法

Microsoft Teamsを使う機会が増えてきて、もともとちょっとは気になってたのですが、**長いURLを貼り付けると、会話の全体がちょっと見づらくなる。**まぁ、でも、そんなものかとあまり深くは考えてなかったのですが、ちょっとした瞬間に「もしかしてMarkdownでいけるんじゃない!?」って思って調べてみたら、Markdown形式をサポートしてました。
さすが！そして、知らなかった。。。
という訳で、Markdown形式のハイパーリンクを使うと以下のようになりますよ。
＊リンク先は、AmazonのEchoDotですが深い意味はありません（長いURLって何かなと思いまして）。

# 書き方
\[ 文字 ]( リンク先 )
一般的な書式と一緒です。

# Markdown形式のハイパーリンクを使った場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/56340610-a93c-4bed-7064-1792f735c270.png)

# 何も考えずにURLを張り付けた場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/65d00f5b-eca0-3de4-db24-e6262b9b4fba.png)

# マイクロソフトのページ
ちゃんと書いてありました(笑)
[Teams でマークダウンの書式を使用する](http://support.microsoft.com/ja-jp/office/teams-でマークダウンの書式を使用する-4d10bd65-55e2-4b2d-a1f3-2bebdcd2c772#bkmk_availableactions)
WSL2 所感

Windows 10 May 2020 Update（バージョン2004）がついにGAされて、待望のWSL2が使えるようになったので、さっそく入れてみたので、よかったところ、悪かったところなどのメモ。
今のところBSODやBT機器が使えないといった巷に出ている不具合は踏んでない。

# WSL2の導入
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
にしたがって実行していくだけなので割愛。

```
wsl --set-version Ubuntu 2
```

が数分で終わります、って表示されてるのに1時間ぐらい終わらず、ちょっとあせった。

# Xの利用方法が変わった
WSL1では、X410をはじめとするXserverを使うのに、

```
export DISPLAY=localhost:0.0
```
とやっていたが、それではXサーバが見つかならなくなってしまった。

仮想マシン方式になったため、WSLからはlocalhostでホストが見れなくなってしまったのが原因らしい。
https://x410.dev/cookbook/wsl/using-x410-with-wsl2/

上のX410の記事にあるとおり、

```
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
```
で解決。上記記事には確認コマンドも乗っていて、これでわかったIPアドレスに対してnetcatするとよいようだ。

```
nc -v 172.30.32.1 6000
```
実際、自分の環境もファイアウォールにブロックされていて、はじめ設定したのにXが見つからず、切り分けに便利だった。


# Docker for Windwosが便利になった
以前から、Docker for WindowsがWSL2とうまくインテグレーションできることは聞いていたが、実際便利になりましたね。
すでに、Docker for Windowsを導入済であれば、Windows 10 May 2020 Update（バージョン2004）にバージョンアップ後の起動時に、「WSL2使えるけど変更する？」的なことを聞かれるので、それでおしまい。簡単。

今のところ見えてる良くなったところは以下の3点

- tcp://localhost:2375をexposeしなくてもWSLから使える
- WSL内のディレクトリもボリュームマウントできる
- WSLの一般ユーザでdockerコマンドが使える

最後は、純粋なLinuxなら、どうせ `sudo docker` してるし、そこまで大きな良いポイントではないけれど、前半ふたつは良いですね。

これまで、https://qiita.com/gentaro/items/7dec88e663f59b472de6 にあるように、一旦ホスト側にもってきてから、``docker run -v /c/path/to/data:data``みたいにしなくてはならず、補完も効かず不便だったので。 ``docker run -v `pwd`:data`` だけでマウントできるの捗る。
TCP2375ポートを不用意にexposeしておくのも、やっぱり心配だったし。

# ネットワーク系のコマンド類が実行できるようになった
tcpdumpとかWSL1では実行できないコマンドも使えるようになってます。
あとは、WSL1のころはPhantomJSとかも動かず、electronいじったときにつらかった覚えがありますが、最近electron触ってないので、そこはよくわからない。PhantomJSも終わっちゃったはずだし。。

# まとめ
まだ使って数時間なので、他にも気付いたら追記していきます。
OSSに貢献したい

# はじめに

OSSに貢献したい！その貢献をGitHubでアピールしたい！しかし、ハードルが高い…自分なんかができるのだろうか…

そんな悩みを抱えている人でも入門しやすいオススメ貢献内容について紹介します。

# オススメ貢献内容

## Typoの修正

OSSとはいえ、ドキュメントやコメント、変数などにTypo（打ち間違え）が残っている場合があります。誰かがやるであろうと思われがちなこれらこそ修正を提案してみてはどうでしょうか？

## ドキュメントの翻訳

READMEなどドキュメントはほとんどの場合、英語で書かれているかと思います。その中で、多言語対応を試みてみるプロジェクトもたまに存在します。ここで提案してみてはどうでしょうか？

## GitHub Actionsの導入・改善

最近、GitHub ActionsというGitHub上で動作するCIツールが現れました。まだまだ利用されていないため、プロジェクトへの導入の提案や、まだまだ磨かれていない内容を修正してみてはどうでしょうか？

## 単体テストの追加

単体テストは重要です。テスト項目の見直しや充実化は大事なので、喜んでもらえます。

## フォーマットの統一

たまにコードのフォーマットがバラバラなプロジェクトとが見られます。そもそもプロジェクトとしてフォーマットの定義がなされていない場合もあります。修正や仕組みの導入を提案してみてはどうでしょうか？

筆者はフォーマッターによって整えたコードをプルリクエストをした時に、「これ、自動でやってくれる仕組みもあったらうれしいなー！誰がやってくれないかなー！チラッ（雑な翻訳）」というコメントをもらいました。それにより、自動フォーマットの仕組みを作る機会をいただきました。

ただし、場合によってはほとんどのコードを変更する大規模な変更になる可能性があるため、相談も必要です。

# おわりに

実は自分自身の過去の気持ちです。一歩踏み出せない人の気持ちは十分わかります。ただ、一歩踏み出したあと、OSSとの距離はかなり縮まるかと思います。まずは一歩、踏み出してみてください！
WindowsでMono.Data.Sqliteを使う

Mono には SQLite のバインディングが付属しています。それを Windows の .NET Framework から使ってみます。

シリーズの記事です。

1. [SQLitePCLRawが動作する組み合わせを探る](https://qiita.com/7shi/items/8846bf14b74a26e014a6)
2. [Microsoft.Data.SqliteをWindowsとWSLで共有する](https://qiita.com/7shi/items/9fbb88786d8a5a6212ab)
3. WindowsでMono.Data.Sqliteを使う ← この記事
4. [Mono.Data.SqliteでDapperを使う](https://qiita.com/7shi/items/f7ec381f5bac184e0b24)

# 概要

これまで SQLitePCLRaw と Microsoft.Data.Sqlite を試して来ました。

パッケージの依存関係やバージョンなど、細かいことを気にしないとうまく動きませんでした。依存するライブラリも多く、ちょっとしたスクリプトから気軽に使えるという感じではありません。

Mono には System.Data.SQLite からフォークした Mono.Data.Sqlite が付属します。

* [System.Data.SQLite との比較 - Microsoft.Data.Sqlite | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/standard/data/sqlite/compare)

> 2005 年に、Robert Simpson は ADO.NET 2.0 用の SQLite プロバイダーである System.Data.SQLite を作成しました。 2010 年に、SQLite チームがプロジェクトのメンテナンスと開発を引き継ぎました。 また、2007 年に Mono チームがコードを Mono.Data.Sqlite としてフォークしたことも注目すべき点です。

* 紹介：[SQLite | Mono](https://www.mono-project.com/docs/database-access/providers/sqlite/)
* ソース：[mcs/class/Mono.Data.Sqlite](https://github.com/mono/mono/tree/master/mcs/class/Mono.Data.Sqlite)

これが Windows でも動けば、環境構築が楽そうです。

# テスト

[前回の記事](https://qiita.com/7shi/items/9fbb88786d8a5a6212ab)と同じテスト DB を使用します。

```sql:hello.sql
CREATE TABLE user (id INT, name text);
INSERT INTO user VALUES (1,"Foo"),(2,"Bar");
```
```shell-session:作成
sqlite3 hello.db ".read hello.sql"
```

テストコードを移植します。どちらも ADO.NET に準拠しているため基本的な使い方は同じです。ライブラリの参照とファイルの指定を書き換えただけです。

```fsharp:test.fsx
#r "Mono.Data.Sqlite.dll"
open Mono.Data.Sqlite
let id = 1
do
    use connection = new SqliteConnection("URI=file:hello.db")
    connection.Open()

    let command = connection.CreateCommand()
    command.CommandText <- @"
        SELECT name
        FROM user
        WHERE id = $id"
    command.Parameters.AddWithValue("$id", id) |> ignore

    use reader = command.ExecuteReader()
    while reader.Read() do
        let name = reader.GetString 0
        printfn "Hello, %s!" name
```

Mono で実行します。バンドルされているので環境構築の手間がありません。

```text:実行結果
$ fsharpi test.fsx
Hello, Foo!
$ fsharpc test.fsx
Microsoft (R) F# Compiler version 10.2.3 for F# 4.5
Copyright (c) Microsoft Corporation. All Rights Reserved.
$ mono test.exe
Hello, Foo!
```

# Windows で使う

Windows の .NET Framework から使おうとすると、ライブラリが見付からないためエラーになります。

```text
$ ./test.exe

ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Mono.Data.Sqlite, Vers
ion=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756'、またはその依存関係の 1 つが読み込めませんで
した。指定されたファイルが見つかりません。
   場所 <StartupCode$test>.$Test$fsx.main@()
```

[SQLite の公式サイト](https://www.sqlite.org/)から Windows 用の DLL をダウンロードして置きます。

Mono のライブラリをコピーします。

```text
cp /usr/lib/mono/4.5/Mono.Data.Sqlite.dll .
```

これで無事に動きます。

```text
$ fsiAnyCpu.exe test.fsx
Hello, Foo!
$ ./test.exe
Hello, Foo!
```

ファイルを 2 つコピーするだけなので、お手軽に使うには良さそうです。
初心者によるプログラミング学習ログ 329日目

#100日チャレンジの329日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
329日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>329日目 2h<br>・ポートフォリオ作成2h<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1266097101647130624?ref_src=twsrc%5Etfw">May 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>