OmniAICreator/Qiita-1.07M huggingface dataset:
タスクに埋もれたときこそGTDが効果的！自己タスク管理はGet Things Doneでこなしていこう！

この記事は、[Digital Identity Creative Div. Advent Calendar 2020 25日目] (https://adventar.org/calendars/5030)  の記事です。

こんにちは、DI制作チームの能勢です。メリークリスマス！
早いもので2020年ももうすぐ終わりますね。今年は新型コロナウイルスという見えない敵と戦いながらのビジネスでした。非常事態宣言も発令されたし、リモートワークもあったし、テレカンが大幅に増えたし、ニューノーマルが目白押しでした。

そんな変化の波についていくには、爆速でこなしていくか、管理するか、という2つの方法があります。今回は管理する側の話です。だって爆速でタスクこなしても追いつかないですよ、なぜか。

## デビットアレンのGTD (Get Things Done)は簡単なタスク管理方法
![Getting-Things-Done-Wikipedia.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237054/a62517a4-8afc-e214-ce4e-c5d395a7001c.jpeg)
[Get Thnigs Done (GTD)] (https://en.wikipedia.org/wiki/Getting_Things_Done)

GTDはとてもシンプルなタスク管理方法です。特別なツールも不要です。誰でもすぐに始めることができます。

GTDは以下の観点から行います。

* すべてのタスクを可視化する
* それぞれ重要度、期限、難易度を仕分けていく
* やるべきもの、次にやるべきものを定義していき、無理のない計画をたてる
* 実行する

という感じのシンプルさです。とても一般的ですが、忙殺されるとこれができなくなってしまいます。そのため、日常的にGTDをやることが重要なのです。

[提唱者デビッド・アレンさんに聞く、GTD実践法 (1/3)] (https://www.itmedia.co.jp/bizid/articles/0806/17/news098.html)

## GTDで得られる「頭が空っぽの状態」の気持ちよさ

タスクに忙殺されていると、いつもどこか落ち着かない、常に疲弊した状態に陥ることがあります。この状態が続くと、集中力が乏しくなり、マルチタスク状態が続き、ミスを連発してしまい、ミスすれすれの状態が続くなど、良いことがありません。

しかし、GTDはやるべきタスクが明確なので、「何をやればよいか」「あといくつやれば終わりか」が可視化されています。これはモヤモヤとあれこれ心配する必要がなく、タスクに集中することができます。この状態が「頭が空っぽ」になる状態と近く、集中力を最大限に引き出すことができるのです。

忙殺している人におすすめなGTD。Amazonでも関連書籍がたくさん売っているので、ぜひぜひ探してみてください。
自分のおすすめはこれです。

* [はじめてのGTD ストレスフリーの整理術] (https://amzn.to/37PA4RG)

一年の計は元旦にあり。そのためにも、年内にタスクの棚卸しをして、しっかりと計画を練るようにしましょう！

Merry X'mas & A Happy New Year!!
CloudWatch Agentの再設定について

全然大した話ではないけどドキュメントに明記されているのを見つけられなかったのでメモ。

CloudWatchエージェントの設定を見直したいときは単純に、同じ名前で新しいJSONを設定(fetch-config)をするだけでOK。

取り込まれた設定は以下dirに名前ベースで分けて置かれるので、ここの中身を確認すれば置き換えられたことが分かる。
また追加(append-config)するとこの場所に2つ目以降の設定ファイルが置かれることもわかる。
_/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d_
＊当然だがwizardで作られたbinフォルダに転がってるJSONは置いてあるだけ

### おまけ
メモリ使用量などのmetrics監視を入れて設定を食わせるとエラーになるときがあり、
エラーだけ見ても原因が分かりづらいが、単にcollectdが無くてエラーになっていることがある。
aptか何かで入れるだけでOK。
JavaScript~for文・while文~

#はじめに
今回は繰り返し処理であるfor文とwhile文です。
While文は、条件式がtrueならば制限なく繰り返します。
for文は、決められた回数だけ繰り返します。
それぞれについて説明していきます。
#for文
for文は処理を繰り返すときに使います。
for文を書くときは、以下の部分に注意する必要があります。

・「繰り返す回数」を初期値で設定する
・「条件を満たす場合の処理」を記述する

構文は次のようになります。

```JavaScript:構文
for(初期化処理; 反復の条件; 反復の終わりの処理){反復処理}
```

for文は、「10回まで繰り返し」などのように、決められた回数内で繰り返し処理を行いたい場合に使われます。
実例を使って説明します。

```JavaScript:実例
for (let index = 0; index < 10; index++){
  console.log(index);
}
```
初期化処理: let index = 0;なのでindexに0が代入されます。
反復の条件: index < 10 なのでindexが10以上になるまで繰り返します。
反復の終わりの処理: index++なので処理が終わることにindexが1増えていきます。
処理としては以上でこれを繰り返していきます。

while文
「while文」では、条件式がtrueである間は繰り返し処理が実行されます。
繰り返される回数は決まっていません。
構文は次のようになります

```JavaScript:構文
while (反復の条件){反復処理}
```

このように反復の条件しか記載がないため、反復がいずれ終了するように記述が必要です。
これを実例で説明します。

```JavaScript:実例
let count = 0;
while (count < 10){
  console.log(count);
  count += 1;
}
```
これは変数の値が10以上になるまで加算し続けるコードです。
#continue
for文やwhile文で繰り返し処理をしている途中で処理を抜けるために使用します。
実例は次にようになります。

```JavaScript:実例
for (let index = 0; index < 10; index++) {
  if (index % 2 === 0){
  continue;
 }
//indexが2で割った余りが0の場合は、これ以降の処理はスキップされる。
console.log(index);
}
```
#終わりに
繰り返し処理についての記事でした。
最後まで読んでいただきありがとうございました。
【Laravel】Collection型の空値判定 isEmpty()


## 困りごと
PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのCollection型の空判定でハマってしまったので、同じような方が減ることを祈って投稿します。下図のように、ある条件で検索を行い、Collection型で返ってきた値に「データが入っているか」or「空」であるかを判定して、表示を分岐をさせる方法についてです。下図のような表示をさせたいという設定で書いています。
![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/e1b41a26-7df8-b9da-4dd4-9b17c7700908.png)

>コレクション型とは？
>Object型の一種で、Laravel独自の型でデータベースからデータを取得した際等はこの型になっています。コレクションで利用可>能なメソッドは全部で100個以上あります。メソッドチェーンで記述が可能です。

## 開発環境
PHP 7.2.34 / Laravel 6.20.5

## 結論
Collection型の空判定はisEmpty()メソッドが優秀。


``` controller.php
public function search(Request $request)
    {   
       //バリデーション
       $request->validate([
            'departured_on' => 'required',
            'reverted_on' => 'required|after:departured_on',
        ]);

       //検索
       $searches = Schedule::where(['departured_on','<=',$request->departured_on],
                                    ['reverted_on','>=',$request->reverted_on],
                                    ])->get();
       return view('view',compact('searches'));
    }
```

```view.php
//・・・略
<form action="" method="post">
  @csrf
  <input　type="datetime-local" name="departured_on">
  <input　type="datetime-local" name="reverted_on">
  <input type="submit" value="検索">
</form>
<div id="output"> 
  @if(isset($searches))   //  検索ボタンの判定(検索ボタンが押された時にtrue） 
     @if($searches->isEmpty()) // 検索条件に合う登録があるか判定（登録があった時にtrue）  
        <p>検索条件に合う登録がありません。</p>
     @else
        <table>
           <tr>
              <th>出発日</th>
              <th>返却日</th>                     
           </tr>
           @foreach ($searches as $search)
           <tr>
              <td>{{$search->departured_on}}</td>
              <td>{{$search->reverted_on}}</td>
           </tr>
           @endforeach 
        </table>
     @endif
   @else  //  検索ボタンの判定(検索ボタンが押されていない時)
     <p>検索してください。</p>
   @endif
 </div>
```

この例では、コントローラーから返ってきた値がもしも空であれば「検索条件に合う登録がありません。」、データが入っていればデータを表示します。このような空判定をする際には isEmpty()メソッド を用います。`if($var),isset($var),empty($var),is_null($var)`では判定できません。コントローラーから渡された値はCollection型であるためです。
公式ドキュメントにもCollection型の空判定にはisEmpty()メソッドを使うように書かれています。
https://laravel.com/docs/5.6/collections#method-isempty
>The isEmpty method returns true if the collection is empty; otherwise, false is >returned: 
>
> collect([])->isEmpty();   // true

## 最後に
コレクション型についての理解が甘く、私は３時間ほどハマってしまいました。
また、is,isset,empty,null,""などの空判定は初学者にとっては少し理解が難しい部分だと思います。
これらを再度復習し、この記事の厚みも今後増やしたいと思います。
（もしこの記事に誤りがありましたらご教授いただけると幸いです。）
Type:JSONに、INSERTができない人へ

### 現状の問題
MySQL version 5.7.30

MySQLで、type:jsonの列を作ったのですが、なぜかinsertできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/886390c8-6c89-5ecf-d44e-5877e19c959a.png)
### 解決策: json_encodeを使用する

まず、テーブルを作ります。(type:jsonの列あり)

```
create table sample_json(id int, json_data json);
```

次にこうすればinsertできるはずなのですが..できない。なんでや..

```
insert into sample_json values(1, '{"from" : "Japan", "name" : "Taro"}');
```

↓ 修正

```
insert into sample_json values(1, "{\"from\": \"Japan\", \"name\": \"Taro\"}");
```

データベースに登録されました〜やったね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/9aa276fa-6d04-64ae-aa9d-59069b9b4d7c.png)

### 解説

なぜ、こんな変な形にしたらいけるんでしょうか？
文字列をjson形式に変換しないといけないからです。（以下のような変換です。）

```
'{"from" : "Japan", "name" : "Taro"}'　→　"{\"from\": \"Japan\", \"name\": \"Taro\"}"
```

```php
# 変数jsonを定義
$json = '{"from" : "Japan", "name" : "Taro"}';
# json_encode(?, JSON_UNESCAPED_UNICODE)で、日本語状態で、文字列をjson形式に変換。
# json_encodeだけだと、jsonの最初と最後に「"」がついてしまうので、mb_substr()を2つ使い、それらを削除。
$newjson = 
 mb_substr(
  mb_substr(
   json_encode($json, JSON_UNESCAPED_UNICODE)
  , 1)
 , 0, -1);
# 出力: {\"from\" : \"Japan\", \"name\" : \"Taro\"}
print($newjson);
```


参考
[【MySQL】JSON型のカラムを操作する場合の落とし穴](https://plugout.hateblo.jp/entry/2019/11/22/230534)
[MySQLでJSONデータを扱ってみよう！JSON型の使い方とは？](https://style.potepan.com/articles/19439.html)
[【JavaScript】javascriptでのデータオブジェクトのkeyに「：（コロン）」があるときのアクセス](https://www.aipacommander.com/entry/2016/09/19/131205)
TypeScriptで連番の配列を１行で作成する



# tl;dr
`[...Array(n)].map((_:undefind, idx:number) => idx))`で連番の配列を作成できます。

# 説明
`[...Array(number)]`を実行すると、number個の`undefined`の一次元配列を返します。

```Javascript
const foo = [...Array(5)]
console.log(foo)
```
実行結果：

```
[ undefined, undefined, undefined, undefined, undefined ]
```

そこで、map関数のindexを使って値を作成します。

```Typescript
const foo = [...Array(5)].map((_:undefined, idx:number) => idx)
console.log(foo)
```

実行結果：

```
[ 0, 1, 2, 3, 4 ]
```

以上。
雑なsharepoint運用基礎講座3 番外編　vs Notes

全体総括の前に、かなり色々思うところのあったNotesからの移行について自分の意見を纏めたくなったので挟みます。

自分向け思考メモに近いかもしれない。

## Notes？
ざっくり言うとグループウェアとしてはno1なほど世界に顧客がいる商用の製品ですね。とは言え昨今はインターネット上で山ほど競合他社のツールがありますし、近年IBMから他社に売られた為、結構売上とか将来性とか色々ヤバいんじゃね？とか言われていたような気がします。(私の観測範囲)

## Notes機能メモ
…あくまで私の見聞きした範囲ですが。

1. Notesは親玉みたいなサーバを置いて、active directlyをNotesのユーザと連携してくれる機能を使うことが多い(dominoとかはこれ目当て)
2. 構成にもよるけど1システム=基本1DB=1つのnsfファイルに収まっており割とポータブル。クライアントとnsfファイルだけで実は見れる。動き的にはクライアントアクセス時にデータとソースで分けて読み込んでるのかな？ちなみにwebとして見る場合はなんらかの表示処理(サーバ)を挟んで三層かと思います。
3. ドメイン言語的な概念で、かなり処理のカスタマイズができる
4. 親玉サーバのユーザ情報を融通してもらって子サーバを作りやすい。
5. 故に__野良サーバ、野良処理が乱立する__
6. また、DB同士のコラボレーションがしやすく、__他のDBのサイトを直接埋め込んだり__とかも出来るようです。その自由さに白目剥いた。
7. ドキュメント(情報の1単位？)の作成の使い勝手が全般的に良い、または少しのカスタムで非常に良くなる　コピー機能とかステータス管理とか。。、
8. アクセス制御が「基本入らせる」がベースで、かなりきめ細かく除外ルールを追加できる
9. クラスタリングとかバックアップもサーバのConfig次第でやってくれます。ここら辺は多分バージョン依存。なので蓋を開けたらひっそり大掛かりな構成だったりするかもだよ。流石に設計書には書いてあると思いたいけど…
10. オンプレが多い&GUIは古いけどやはり早い。あとなんだかんだ信頼性はある

## いうても時代はsharepointだから移行しますというそこの貴方へ

まず初めに声を大にして言いたいのですが、私は別に__Notesがオワコンだとも思っていませんし、share pointへの移行が必達だと思いません。__
~~むしろカリカリチューンされてるNotesのピーキーさは割と好きだなって思ったよ。安定してるし反応早いし~~

金銭以外のメリットデメリットを受け入れられるのか、をよく検討して、必要なら移行、でいいと思います。
ただ金銭以外のメリデメ、ちゃんと調べてますか？
現行通り使えたらそれでいい、とかなってませんか？

情報共有基盤をガラガラ仕様変えるところはまああまりなく、「既存通り」という要件になりがちですが、リニューアルではなく、デコミッション&新規作成である、とスタンスを考え直すよう誘導すべきであるという事を、ここではお伝えしたいです。

~~犠牲者を増やさないために。~~


## 「現行通り」でハマる道筋

ざっくり要因は以下です。
1. FIT&GAPが「現行通り」により、具体的な差を共有出来てないまま製造に入る
2. あらかた出来上がってからこれじゃ使えないと言われる
3. デスマーチ

かなり乱暴な例えを挙げます。

Notesからシェアポに移行するのって、仕事用PCを普段使ってたLinuxからWindowsに切り替えるみたいなインパクトじゃないのかな、って思うんですよね。
大きいカテゴリとしては「GUIのあるOS」なので、論理的には以前出来たことは大体出来ますし変えることによるプラスアルファもありますが、普通気軽に勧めないですよね。

なんででしょう？設計思想も利点も欠点も違うから、単なるアプリ載せ替えでは終わらないからだと私は考えます。
製造工数がいくら少なくても、ビジネスを乗っけるアプリの思想が違うならビジネス面(つまりユーザー周り)を作り直しになるので、広義のシステムとしては__リニューアルじゃなくて新規作成として臨む方が正しい、__と思います。
つまり、__現行通り、という言葉からイメージされる想定よりめっちゃ手間暇掛かります。__

ここがお客様としても割と理解していないし、開発側も何故か割と気にしていないパターンが多いような気がしてます。
開発が言わなきゃ誰がいうんだよ、というツッコミはありがたくいただいておきます。私もそう思うよ。


マクロ視点では上記の通りで、ミクロな機能でも、単なる掲示板としての使い勝手は実は数段落ちたりする(私見)のでカスタムが必要です。HTMLとcssで、ちょいちょい出来ますから見栄えはいいんですけどね。
これはsharepointの設計思想的に情報掲示に特化していないし、もうしょうがないところだと個人的には飲み込んでいますが、、~~コピー機能くらいはデフォルトであってもいいと思うしドラフト(下書き)くらいはあってもバチは当たらないと思うんですよね。既存改修が嫌なら専用のリストライブラリ実装すると救われる命もあるから検討して欲しい~~

結果として、エンドユーザーからは出来ないことにクレームが入り、ごめんなさい出来ればいいけど、場合によっては以前のシステムの利点を実装する方向に倒れるとも思います。

かくして「高いコストを払ってMacもどきのWindowsが出来たけど重いし不安定なんだけど💢」みたいな、製品の良さが活かされないカスタム沼が広がってるんじゃないかなあって。


あくまで私見ですが。

~~事業直結のシステムなら手抜きせずコストをかけてやるでしょうけど、特に情報共有基盤って何故だか適当に扱われるのに止まったらなんで落ちるんだ！緊急時に参照出来ないだろうが！って言われるイメージがあるんですけど~~

## 解決策は「既存通り」ではない事を知らせる　の難しさ

長々と書いた通り、そもそも当該システムの利用目的自体を変えることになりますので、作り直しであり、ユーザの教育し直しであり、業務プロセスを作り直す必要があるのですが、、
まあ大概この手の簡易(と思われてる)情報共有システムのご予算とか気にし方って手薄なお客様が多い気がします。

ご予算が少ないと…やはり作り直しとか言い出すと引いてしまうので…現行通りと、言わざるを得ないのか…というのをひしひしと感じています。
まあそんなデスマーチは自分たちもお客さんも双方望まないと思うので、最初からゲロった方が良いと個人的には思う次第です。。
Raspberry Pi稼働環境を最新に保つ

## 概要

Raspberry Piの稼働環境を常に最新状態に保つため、必要なコマンドをまとめておきます。

## Raspberry Pi OSをアップデート

1. Raspbian OS/Raspberry Pi OSのバージョンを確認します。

    ```shell
    cat /etc/debian_version
    ```

    ```text
    9.13
    ```

    ```shell
    cat /etc/issue
    ```

    ```text
    Raspbian GNU/Linux 9 \n \l
    ```

    ```shell
    cat /etc/os-release
    ```

    ```text
    PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
    NAME="Raspbian GNU/Linux"
    VERSION_ID="9"
    VERSION="9 (stretch)"
    VERSION_CODENAME=stretch
    ID=raspbian
    ID_LIKE=debian
    HOME_URL="http://www.raspbian.org/"
    SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
    BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    ```

    ```shell
    lsb_release -a
    ```

    ```text
    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 9.13 (stretch)
    Release:        9.13
    Codename:       stretch
    ```

1. Raspbian OS/Raspberry Pi OSを最新版に更新します。

    ```shell
    sudo apt update
    sudo apt upgrade
    sudo apt autoremove
    ```

    ```shell
    sudo vi /etc/apt/sources.list
    ```

    ```text
    #deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
    deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
    ```

    ```shell
    sudo apt update
    sudo apt dist-upgrade
    ```

1. Raspbian OS/Raspberry Pi OSのバージョンを確認します。

    ```shell
    cat /etc/debian_version
    ```

    ```text
    10.7
    ```

    ```shell
    cat /etc/issue
    ```

    ```text
    Raspbian GNU/Linux 10 \n \l
    ```

    ```shell
    cat /etc/os-release
    ```

    ```text
    PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
    NAME="Raspbian GNU/Linux"
    VERSION_ID="10"
    VERSION="10 (buster)"
    VERSION_CODENAME=buster
    ID=raspbian
    ID_LIKE=debian
    HOME_URL="http://www.raspbian.org/"
    SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
    BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    ```

    ```shell
    lsb_release -a
    ```

    ```text
    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 10 (buster)
    Release:        10
    Codename:       buster
    ```

- 参考

    バージョンとコードネームの一覧はこちらを参照してください。
    [Debian のリリース](https://www.debian.org/releases/index.ja.html)

## ファームウェアをアップデート

1. ファームウェアのバージョンを確認します。

    ```shell
    vcgencmd version
    ```

    ```text
    Nov 30 2020 22:14:49 
    Copyright (c) 2012 Broadcom
    version ab1181cc0cb6df52bfae3b1d3fef0ce7c325166c (clean) (release) (start_x)
    ```

1. ファームウェアをアップデートします。

    ```shell
    sudo rpi-update
    ```

1. アップデート完了後、リブートします。

    ```shell
    sudo reboot
    ```

1. ファームウェアのバージョンを確認します。

    ```shell
    vcgencmd version
    ```

    ```text
    Dec 15 2020 18:35:32 
    Copyright (c) 2012 Broadcom
    version 4b4aff21f72c5b9ba39d83c7b0f8fa910a6ef99b (clean) (release) (start_x)
    ```
Notion Advent Calendar 2020を書きました

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 25日目のエントリです。
24日目は[Notionで継続的なKPTを行う](https://qiita.com/pictiny/items/2d06460633072ddb7852)でした。

# Notionアドベントカレンダー
実は2019年もNotionのアドベントカレンダーをやっていました。去年、[アドベントカレンダー](https://qiita.com/advent-calendar/2019)を眺めていたら、Notionのアドベントカレンダーがなかったので [Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) を作って一人で書きました。去年投稿したアドベントカレンダーの記事は、今年一年でいろんな方に読んでいただいたようです。
Notionはとても使いやすく簡単なツールで、ヘルプも充実していますが、シンプルながらも多機能なので、やりたいことをどう実現すればいいのかわかりにくいのかもしれません。

去年はNotionの基本的なチュートリアルやTipsを中心に運用例を交えて紹介しました。もうこれ以上紹介する主要な機能はないかな、と思ったのですが、今年のNotionのリリースノートを見ていたらまだまだ紹介できることがありました。
そんな感じで[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion)は今年アップデートされた機能が中心になりました。

# まとめ
今年のアドベントカレンダーを振り返ってみると、Notionがこの1年で進化したことがよくわかるアドベントカレンダーになったかと思います。
来年のアップデートにも期待したいですね！2021年もNotionを活用していきましょう！
P2P なぜなにTorrent 2021 用 ネタ集め(1) プラットフォーマに依存しないサービス


libtorrent の version 2 の RC版 が 出ました。
最近はP2P系の技術を追っていませんでしたが、良い機会なので、追ってみようかと思います。

で、そのレポートの1回目です。
今回の記事には以下の効用があります。

- libtorrent の 開発環境の Dockerfile 
- libtorrent の hello world の コード

# Index
[プラットフォーマに依存しないサービス](https://qiita.com/kyorohiro/items/721ba469fbfcfb2390a3)
[Libtorrrent の使い方](https://qiita.com/kyorohiro/items/78a39a45a6883fa68112)

# プラットフォーマと検閲

2020年の アメリカの大統領選挙で、Google などのビックテックによる多くの検閲が行われました。
それによって、プラットフォーマーによる検閲が多くの人の知るところになりました。

以前から、Google Drive のファイルが勝手に消される
※ わかり易いところで 二次元のポルノなど https://news.yahoo.co.jp/byline/yamamotoichiro/20191124-00152188/
など、このような事は、一部の界隈では知られていましたが、今まで知られていませんでした。


今、検閲のしないプラットフォーマーが望まれています。
しかし、検閲のないプラッフォームはありません。宗教的倫理観やサービスの趣旨によって必ず検閲をする必要が出てきます。

わかり易いところだと、グロい画像や、暴力的な内容や、そもそもそのサービスの意図に沿わない内容の情報などです。


# プラットフォーマに依存しない P2P

**これらの検閲の問題は、プラットフォーマーの倫理観では解決できません。プロトコルによって解決すべきものです。**

## Bittorrent ネットワークでの 例 と 可能性

ここでは、Bittorrent を例に P2Pでこの問題が解決される例を上げます。

Torrent の 　プロトコル では、 データーをダウンロードする人は、そのままデータの配信者になります。

プラットフォーマーが負っていた責任は、利用者が持つ事になり。プラットフォーマーが検閲を行う必要がなくなります。



# Bittorrent の ネットワークに参加してみよう

実際に Bittorrent の ネットワークに参加してみましょう..

## BitTorrent とは
Bittorrent は ファイル を共有する P2Pネットワークです。 
https://ja.wikipedia.org/wiki/BitTorrent

データーのダウンロードする人が、データーの配信者になるという特徴をもっています。

## libTorrent

この記事では、 Bittorrent に参加するのに、 libtorrent を利用します。  
https://www.libtorrent.org/


## 開発環境
Docker 環境を用意しました。

https://github.com/kyorohiro/libtorrent_codeserver

### 準備

```
git clone https://github.com/kyorohiro/libtorrent_codeserver
cd libtorrent_codeserver
```

```
cd res 
git clone https://github.com/arvidn/libtorrent
cd libtorrent
git checkout RC_2_0
git submodule init 
git submodule update
```

### code-server (vscode ) を立ち上げる

```
docker-compose build
docker-compose up -d
``` 

libtorrent も このタイミングでビルドしています。

## 起動してHello World

code-server が無事に立ち上がっていれば、 "http://127.0.0.1:8443/ "
※ 127.0.0.1 は 環境に依存します


## ビルド

```
g++ main_simple_torrent.cpp  -ltorrent-rasterbar -lpthread
```

## 実行

```
./a.out xxx.torrent
```

xxx.torrent は　あなたが指定した Torrent ファイル


# 次回
とりあえず動作させる事ができるようになったと思います。
次回は、torrent について、解説しながら
libtorrentの使い方をマスターしていきます。


# PS

## Code

https://github.com/kyorohiro/libtorrent_codeserver

## REF

https://www.libtorrent.org/


## Other
dev.to にも投稿した
https://dev.to/kyorohiro/code-server-for-libtorrent-2-0-1m85

以前にまとめた Torrent 関連の情報
"なぜなに Torrent 2014"  https://nazenani-torrent.firefirestyle.net/
Dart で書かれています。 Dart2系では動作しません。
npm

npm(Node Package Manager)とはパッケージ管理システムの一種。
パッケージを共有、取得する機能がある。

例）.
expressもパッケージの一つ
npm install expressでインストール。
const express = require('express');
const app = express();


ejs:htmlとjsを両方記述できるnode.jsのパッケージ
npm install ejs
【Unity(C#)】TrailRendererにMeshColliderを付与する

##Unityゲーム開発者ギルド Advent Calendar 2020
この記事は[Unityゲーム開発者ギルド Advent Calendar 2020](https://adventar.org/calendars/5200)の25日目です。

##はじめに

タイトルはTrailRendererに当たり判定を与えるための手法です。


以前に別のアプローチとして、
**TrailRendererの頂点座標に当たり判定用のオブジェクトを生成する**
という記事を書きました。

【参考リンク】：[【Unity(C#)】TrailRendererの頂点座標を取得する方法](https://qiita.com/OKsaiyowa/items/bfcc4a661b8cc2102e86)

しかし、数が多いと処理がカクつく原因になるので今回の手法もメモしておきます。

##コード

```C#:適当なオブジェクトにアタッチ　別途TrailRenderderのPrefabを用意する

using UnityEngine;

/// <summary>
/// お絵描き機能　適当なオブジェクトにアタッチ
/// </summary>
public class TrailMeshCreateTest : MonoBehaviour
{
    [SerializeField] private Transform _paintObjParent;
    [SerializeField] private GameObject _paintObjPrefab;

    private GameObject _tmpPaintObj;

    private void Update()
    {
        Vector3 worldClickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition + Camera.main.transform.forward);

        //マウス押した瞬間
        if (Input.GetMouseButtonDown(0))
        {
            _tmpPaintObj = Instantiate(_paintObjPrefab, worldClickPos, Quaternion.identity,_paintObjParent);
        }

        //マウス押し続けている間
        if (Input.GetMouseButton(0))
        {
            _tmpPaintObj.transform.position = worldClickPos;
        }

        //マウス離した瞬間
        if (Input.GetMouseButtonUp(0))
        {
            MeshCrate();
            _tmpPaintObj = null;
        }
    }
    
    /// <summary>
    /// Mesh生成
    /// </summary>
    private void MeshCrate()
    {
        //TrailRendererの頂点情報からメッシュを生成する
        TrailRenderer paintObjectTrailRenderer = _tmpPaintObj.GetComponent<TrailRenderer>();
        //子にコライダーだけ持つオブジェクトを作成する
        GameObject colliderContainer = new GameObject("Collider Container");
        colliderContainer.transform.SetParent(_tmpPaintObj.transform);
        MeshCollider meshCollider = colliderContainer.AddComponent<MeshCollider>();
        Mesh mesh = new Mesh();
        paintObjectTrailRenderer.BakeMesh(mesh);
        meshCollider.sharedMesh = mesh;
    }
}
```

ロジックとしてはまずTrailRendererを持つオブジェクトの子に
MeshColliderのみを持つオブジェクトを生成します。

次に、TrailRendererのBakeMeshメソッドを使用し、
描画したTrailRendererと同じ形状のメッシュを生成します。

最後に、MeshColliderに先ほど生成したメッシュを適用すれば完了です。


ちなみに、子にコライダーだけ持つオブジェクトを作成している理由は
オフセット(座標)が0でないとコライダーの生成位置がずれるからです。
下記GIFがわかりやすいです。

![CreateMeshQiita2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/b74825bd-c847-6d56-a495-ffcab25aec65.gif)

TrailRendererを持つオブジェクトにMeshColliderを直接付与すると、
生成したTrailRendererの座標分だけMeshColliderの位置がずれてしまいます。

##デモ

以上を踏まえてのデモです。
今回は2Dで平面的にTrailRendererを動かしているのでコライダーがいびつですが、
三次元な動きならさらにきれいなMeshColliderが生成されます。

![CreateMeshQiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/e0476348-694b-4ca5-9dc7-32cdda902165.gif)

##参考リンク
[TrailRenderer.BakeMesh](https://docs.unity3d.com/ScriptReference/TrailRenderer.BakeMesh.html)
MapReduce/Hadoopについて簡単に解説してみた(学習まとめ)

##始めに

今さら感はありますが、今回は「MapReduce/Hadoop」について解説していきたいと思います。
MapReduceは、世界中のWebをクロールして集めた膨大なデータから検索インデックスを生成するために、
googleが編み出した分散バッチ処理の技術です。その後、MapReduceを紹介するgoogleの論文から、
Hadoopというオープンソースのクローン実装が生まれました。
Hadoopは、今や巨大ポータルサイトや大規模なSNSサービスの背後で使われています。



##本文

MapReduce/Hadoopでは、特定のタスクについて一台の巨大なサーバーで集中的に処理するのでなく、複数台のコモディティ(より小型で低性能なマシン)を使って、同時に並列・分散して処理を進めていきます。(※このほうがビッグデータを処理する上で有利だそうです)。
「マスターノード」と呼ばれるタスク全体を管理してスケジューリンングするマシンと、「ワーカーノード」と呼ばれるタスクを実際に実行していくマシンに分かれてシステム(≒ネットワーク)全体を構成します。
全てのタスクは「Map」と「Reduce」の２つのジョブに分割されて、各ワーカーノード上で実行されます。
まず初めにMapが実行されて、続いてReduceが実行されるという流れです。(※厳密には、両者の間に「Shuffle」という工程があります)。
ここで、MapReduceという技術・アルゴリズムは「Key-Value」を扱うものなので、MapとReduceに入力するデータも、これらが出力するデータも共にKey-Valueということになります。
Mapが元のデータに一定の変換・加工を施し、それを次の工程であるReduceに引き継がせて、Reduceが変換・加工後のデータを元に集計したり、統計学的な処理をします。(※かなり端折って説明しました💦)(※実際の工程としては「パーティショニング」「マージ」「ソート」・・・などがあります)。



##終わりに
今回は、「MapReduce/Hadoop」について非常に簡単に解説してみました。
次回は、MapReduce/Hadoopについてもっと深く、応用例も交えた形で解説してみたいです。
次回からもよろしくお願いいたします。
プログラム未経験の40代グラフィックデザイナーが、UI/UXデザイナーに転生し、再起動します

この記事は、プログラミングに苦手意識のある
以下のような40代さんに捧げます。

・プログラミングに興味を持ったばかり
・コロナで転職を迷っている
・遅いスタートにふんぎりがつかない
・脳内をフルインストールし直したい

迷ってる人の背中をドンと押してあげたい。
何をいまさら、と思っている方の視点を少し、上に持ち上げたい。
そういう想いもあり、ここに体験談を綴ります。

ーーーーーーーーー

初めまして！　Nenpaです。
私はもともと、DTPのグラフィックデザイナーをしていたのですが、
コロナで職を失ったことをきっかけに、
もう一度、自分をフルインストールし直したく、
現在、プログラミングスクールで必死で勉強中です。

HTMLとCSSがギリギリわかる程度の私ですが
プログラミングスクールの授業内容で、
「機能美・操作性」と「プロダクトのそもそも・体験のデザイン」を追求するような分野「UI/UX」に興味を持ち、この度、UX/UIデザイナーになることを決意しました。

自分自身の卒業までのアドベントカレンダーとして。
また、目標を宣言し、実行意識を高めるために、更新していきます。

まずは、宣言から。「UI/UXデザイン」はじまりの第一歩です。

書く人：
2020年のクリスマスからQuitaはじめました。
来年の目標は「行動する！」
2020.慎重派 → 2021.軽いノリで行動!へスライド中。
Nenpa
iPhoneから手軽にNotionにメモを保存する方法

#はじめに
　最近、絶賛ハマり中のメモアプリのNotion。Notionをより快適にするアプリを一つ紹介します。

##手軽にメモを保存

↓Notionとは別のアプリですが、Notionにメモを保存することに特化したアプリです。
[Fast Notion](https://apps.apple.com/jp/app/fast-notion/id1505194382)

##使い方
Web上のNotionのpageを入力しておくことで、「Post」を押すと、指定しておいたpageにメモが投稿される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/809f1110-15e7-57e7-c9ca-611e72e735c5.png)

##最後に
　ふと頭に浮かんだことを、Twitter感覚で、Notionに保存することができるので、スマホでは使い勝手が若干悪いNotionを少し便利にしてくれます。
Railsチュートリアル備忘録（3章 3.3.2）

## 環境
macOS Catalina 10.15.5
Rails 6.0.3

Railsチュートリアルとそれに付随するいろいろを書いていきます。
Githubに慣れたいので、チュートリアルは第6版に準拠しています。

## 3.3.2 Red
/static_pages/aboutというURLからビューを表示させたい。
`$ rails t`からどのような順番で確認していくか？

###結論
①`config/routes.rb`にURLを作る
②`app/controllers/static_pages_controller.rb`にaboutアクションを作る
③`app/views/static_pages`に`about.html.erb`（ビュー）を作成する

###概要
test追加

```test/controllers/static_pages_controller_test.rb
test "should get about" do
    get static_pages_about_url
    assert_response :success
  end
end
```
↓
`$ rails t`

```
NameError: undefined local variable or method `static_pages_about_url'
```
「`static_pages_about_url'（URL）が見つからない」
↓
①
routes.rbにURLを作る

```php:config/routes.rb
get  'static_pages/about'
```
（/static_pages/aboutというURLに対してGETリクエストが来たら、StaticPagesコントローラのaboutアクションに渡す）
↓
`$ rails t`

```
AbstractController::ActionNotFound:
The action 'about' could not be found for StaticPagesController
```
「StaticPagesコントローラにaboutアクションがない」
↓
②
static_pages_controller.rbにaboutアクションを作る

```php:app/controllers/static_pages_controller.rb
def about
end
```
↓
`$ rails t`

```
ActionController::MissingExactTemplate: 
StaticPagesController#about is missing a template for request formats: text/html
```
「`StaticPagesController`で`about`のテンプレートが無い」
↓
③
`app/views/static_pages`に`about.html.erb`を作成する
（テンプレート＝`views`内のデータ なので、例えば`about`アクションは`about.html.erb`というビューに関連付けられるため。
今回は`static_pages`に関するビューなので該当のフォルダに置く）

`$ touch app/views/static_pages/about.html.erb`を実行するとファイルが作成されました。
↓
`$ rails t`
結果は green になりました。
アドベントカレンダー23日目：SREを読んでみた「リリースエンジニアリング」編④

前回は、リリースエンジニアリングでGoogleの自動化ツールであるRapidとその関連ツールについてみていきました。
今回は、リリースエンジニアリングの最後の章として、設定管理について、見ていきます。
世間では、アドベントカレンダーの企画は終了したようですが、この連載には関係ありません。最後まで行きます。

## 設定管理
設定管理は、リリースエンジニアとSREが密に協力すべき領域の一つです。
設定の変更によって、サービスが不安定になってしまうことが十分考えられるからです。
Googleにおいて、システム及びサービスの設定のリリースと管理のアプローチは、時間の経過とともに変化しています。ですが、いつにおいても、設定をメインのソースコードリポジトリへ保存することと厳格なコードレビューが強制されます。

* 設定でのメインラインの使用
Borg上のサービスそしてBorg以前のシステムにおいて、使われた方法です。
この方法では、開発者とSREはメインブランチのヘッドにある設定ファイルを変更します。この変更はレビューされた後に、動作中のシステムに適用されます。これによりバイナリのリリースと設定の変更は分離されます。
この方法は単純でわかりやすいですが、プロダクション環境の設定との間に差ができてしまうのが欠点です。

* MPMパッケージへの設定ファイルとバイナリの同梱
複数の設定ファイルを持つプロジェクトやリリースサイクルごとの設定ファイルが変更されるプロジェクトの場合、バイナリと設定ファイルを含めたMPMパッケージを作成することができます。
この方法は、バイナリと設定ファイルが密に組み合わされているので、柔軟性が制限されますが、一つのパッケージをインストールすればいいので、デプロイメントは単純になります。

* MPMの「設定パッケージ」への設定ファイルのパッケージ化
バイナリと設定は密結合になる傾向があるので、バイナリと設定ファイルのスナップショットをリリースします。ビルドIDを用いれば、過去の特定の時点での設定を再構築できます。
複数のパッケージをまとめてインストールする場合には、ラベル機能を使うことができます。新しいバージョンがリリースされた場合、新バージョンのパッケージにラベルが付けられます。

* 外部ソースからの設定ファイル読み込み
設定ファイルを頻繁に変更したり、動的に変更が必要なプロジェクトは、ソースコードレポジトリへアクセスできるファイルシステムに保存することができます。

## まとめ
* 設定管理は、ケースバイケースに応じて、適切に適用する。
* リリースエンジニアリングは、後付けで行われることが多いが、できるだけ早くリリースに関するリソースを確保する必要がある

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　97-100
楽天ひかり IPoEのクロスパス設定


1年間無料ということで、ソフトバンク光を解約して楽天ひかりを契約しました.ソフトバンク光の時は、IPoE契約をしていましたが1年後は料金が上がるのとルータが必ずレンタル品ということで不満がありました。以下に手順を記載します.

##インターネット接続の種類

#####PPPoE(IPv4)
　スマートフォンやパソコンなど多くのネットワーク機器が増えたことにより通信がとても遅くなった.
####IPoE(DS-Lite)(IPv6)
　新しい通信方式であり、使用ユーザが少ないことからとても早い.IPv6という方式を採用しており、IPv4の通信もIPv6経由で通信するため輻輳の影響を受けない.

##全体の流れ

1.ソフトバンク光に電話して事業者変更番号を取得
　 電話番号( 0800-111-2009 )
　※平日16時という穴場の時間を狙いました.

2.楽天ひかりに申し込み
　 申し込み時に、事業者変更番号と光回線に記載のあるCAF*****が必要となります.
　 ※光電話やオプションがある場合は別途記入が必要です.

3.工事日の連絡を受ける
　 今回は転用なので工事はありませんが、光回線の契約をソフトバンク光から楽天ひかりへ変更されます.

4.IPv6の開通
　 ここでとてもイマイチな事案が発生しました。IPv6をソフトバンク光の時も使用をしており、ソフトバンク側がIPv6の登録情報を消すことで楽天ひかりで使用できるようになります.これは、ソフトバンク側が事業者変更手続きを完了し、ステータスが解約になっていることを意味します.この手続きを楽天ひかりが作業前日??くらいに連絡をしている関係で"IPv6開通エラー"の連絡が届きました。ソフトバンクがスグに手続きをしてくれたおかげで2日ほどで開通できましたがこれができていないとIPoEの設定をしていても通信ができません.

##ルータの準備と設定
※ひかり電話の場合は少しコンフィグ変わります.
楽天ひかりでIPoEを使用する場合は、クロスパス方式に対応したものを準備する必要があります.
https://network.mobile.rakuten.co.jp/hikari/about/ipv6/xpath/
家電量販店で売っているルータは、定期的に調子が悪くなるので今回は、YAMAHAのRTX810を使用しました。
また、クロスパス方式の他に有名なtransix方式もあります。transixの場合は、FQDNで指定可能ですがクロスパス方式は事前にIPv6アドレスを確認してIPv6アドレスを指定しなければいけません.以下の操作をコマンドプロンプトやターミナルで実施下さい.

```:クロスパスのIPv6アドレス確認
nslookup 
set type=AAAA
dgw.xpass.jp
   -->   dgw.xpass.jp	has AAAA address 2001:f60:0:200::1:1
```

これをルータに設定するとこんな感じです.
IPv6の場合は、フィルターをきちんと設定しましょう.

```:ルータの設定コンフィグ
login password encrypted *
administrator password encrypted *
ip route default gateway tunnel 1
ipv6 prefix 1 ra-prefix@lan2::/64
ip lan1 address 192.168.1.222/24
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 secure filter in 1010 1011 1012 2000
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 106
ipv6 lan2 dhcp service client ir=on
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint address 2001:f60:0:200::1:1  ※ここにクロスパスのアドレス
 tunnel enable 1
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 2000 reject * * * * *
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * tcp
ipv6 filter dynamic 106 * * udp
telnetd host lan
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.1.50-192.168.1.100/24
dns server dhcp lan2
```
※Fastcomにて測定
通信速度も250MB出ておりとても快適です.　
以上、メモとして残します.

##参考資料
(IPoEの仕組み)
https://www.mfeed.ad.jp/transix/dslite/dslite.html
(YAMAHAのコンフィグ参考)
https://network.yamaha.com/setting/router_firewall/ipv6/ds-lite
(参考書籍)　※とてもおすすめ※
https://www.jpne.co.jp/books/v6plus/
Excelは何のエンコードでCSVファイルを読めるのか決着を付けよう

# 結論
UTF-8 with BOM (Byte Order Mark)でエンコードするといいっぽい。
# 結論だけでは短すぎるので、背景
CUIでの処理が多いとはいえ、ちょっとした分析をしたり、非IT領域の方にデータを提供したりするときなど、ExcelでCSVファイルを読み出したいことは意外にある。
ところが、大体プログラムでUTF-8やらShift_JISやらでCSVに吐き出してそのままExcelで開くと文字化けする。
「データ」リボンの「テキスト/CSVから」で読み込めば読み込みの際の文字コードを指定できるじゃないかというツッコミはあるかもしれないが、**面倒くさい**。
最初からExcelが開けるエンコードがあるはず、と思い検索を掛けても意外に引っかからない。ということで思い当たるエンコードを調べた結果、上の結論に至った。
# エンコードを変えられるソフト
プログラミング用のエディタならだいたい対応しているが、たかがCSVの文字コード変換なので軽いものがよさそう。
WindowsではNotepad++, MacではSublime Textなどだろうか（完全にここは好みが反映されている）。
# BOMとはなんだろうか
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)の記事参照。
このファイルがUnicodeで、何でエンコードされているかを示すファイル頭の数バイトのデータ。ちょっと前までWindowsのNotepadで勝手に付いてしまい他OSとのテキストファイルのやり取りに一癖を加えていたやつだった。Excelではまだ勝手に付いてしまうし、付いていないと読み出しに失敗するようだ。
基本情報技術者　Chapter13~20

セキュリティマネジメントの３要素　機密性　完全性　可用性

システム開発の流れ　企画→要件定義→開発→運用→保守

プロジェクトマネジメント　作業範囲を把握するためのWBS(Work Breakdown Structure)

プログラミング　インタプリタ方式とコンパイラ方式

3層クライアントサーバシステムはビジネスロジックに変更があってもサーバ側だけ修正すればいい
オンライントランザクション処理とバッチ処理
【FileMaker】あんなにめんどくさかったバーコードが簡単にできた。。。

2015年のAdvent Calendarでは、[【FileMaker】バーコードを作ろう（追記：2019/05/29）](https://qiita.com/tyuma/items/c32494e22cd8087ba528)と、バーコードをFileMakerで作る過程を紹介しました。
技術の進歩は日進月歩ではなく、秒進分歩だなーとバージョンが上がるごとに感じています。
そしたら、FileMaker 19では、addonであっけなくさくっと（びっくりしすぎたので、形容詞２個重ねました）できた。。。

# FileMaker バージョン
FileMaker 19から提供されているaddonを使います。
様々なaddonについては、公式の[こちらのMarketplace](https://marketplace.claris.com/ja/category/add-on.html)で確認してください。

# 作り方
## 設定
1.アドオンで、「バーコードジェネレータ」を選択します。
![スクリーンショット 2020-12-25 23.06.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/db1557a8-7596-7399-080d-94c5221e68e4.png)
2.バーコード生成したいレイアウトにぽろっと落とします。
![スクリーンショット 2020-12-25 23.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/66e52499-ec7f-27aa-4e4d-563ef260fce9.png)
3.こんなのができます。
![スクリーンショット 2020-12-25 23.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2731f69a-1a14-bf2b-cee9-6669bacac008.png)
歯車マークで必要なフィールドを確認します。
![スクリーンショット 2020-12-25 23.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/4236153f-c5ba-d229-8965-48428367b01c.png)
4.必須項目をフィールド定義します。
歯車マークを見ると、必要なのは
・バーコードに入れる数字
・生成したバーコードを入れるオブジェクトフィールド
のようなので、フィールドを作ります。
![スクリーンショット 2020-12-25 23.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a82cea43-15a3-1ac4-a788-6766932e43d5.png)
5.それぞれのフィールドをセットします。
![スクリーンショット 2020-12-25 23.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/c28cc8b2-eb21-7d34-a771-bdc7fd115337.png)
![スクリーンショット 2020-12-25 23.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f7da7c61-46a8-94d2-b936-d09617985b83.png)
6.生成するバーコードを選択します。
できればここでQRコードも作成できれば、すっごく楽なんですけど。。。
ないので、今回はCODE39を作ります。
![スクリーンショット 2020-12-25 23.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/d8d4af0f-32ca-8e49-fc23-c2fa78175f7c.png)
そのほかは特に設定しなくてもOKです。

作るのは、ここまでです。
では、データを入れてみましょう。

# バーコードを生成する
バーコードデータを入力したら、バーコードボタンをクリックします。
![スクリーンショット 2020-12-25 23.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/a2122948-d80f-54d9-d3e2-50a494594ba5.png)

できた！
![スクリーンショット 2020-12-25 23.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b3b6c0f6-96bc-a759-059e-a81d1393d356.png)

# 嘘みたいに簡単
この記事の最初にリンクした、5年前の記事をみてください。
フォントをインストールしたり、計算式で「*」を入れたりとしていましたが、その工程が全くありません。
他にもaddonがありますので、試しに使ってみてください。
ゲームをリセットする方法

#はじめに

**本記事では、ゲームのリセット(ゲームシーンを読み込み直す)方法について
解説します。**

##C#スクリプトを作成する
**まずは、リセットさせるためのコードを書く、
C#スクリプトを作成します。(名前はResetとしています)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/b20038c1-4263-6987-025a-5ec7241fdddc.png)
　　　　　　　　　　　　↓　　　↓　　　↓　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/36e1c8a4-3a5e-4454-fc02-30b2cd6bf71f.png)

##スクリプトを書く
**実際にリセットするコードを書きます。
追加する内容は、**

```csharp
using UnityEngine.SceneManagement;
```

**と**

```csharp
        if (Input.GetKeyDown("r"))
        {
            SceneManager.LoadScene(0);
        }
```

**の部分です**

**ここでは、「R」のキーを押したら、リセットするというコードになっています。**
   
```csharp 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//この行を追記

public class Reset : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown("r")) //このif文を追記
        {
            SceneManager.LoadScene(0);
        }
    }
}
```

**このスクリプトを保存して、適当なオブジェクトに付けます。
(常に存在する、Main Cameraあたりがおススメです)
「R」のキーを押して、ゲームが読み込み直されるか確認してみてください**

今回の内容は以上です。
目を通していただき、ありがとうございました！
【初心者でもわかる】CSSで文字の上に点「・」をつけて強調させる方法

# どうも7noteです。<span><ruby>こ<rt>・</rt>ん<rt>・</rt>な<rt>・</rt>か<rt>・</rt>ん<rt>・</rt>じ<rt>・</rt>に文字の上に点をつける方法</ruby></span>

2種類の方法で文字の上に付けていきたいと思います。

## 方法１： HTMLだけで行なう方法

```index.html
<!-- HTMLだけで行なう方法 -->
<p><ruby>こ<rt>・</rt>ん<rt>・</rt>に<rt>・</rt>ち<rt>・</rt>は<rt>・</rt></ruby></p>
```
**完成例**
<p class="text1"><ruby>こ<rt>・</rt>ん<rt>・</rt>に<rt>・</rt>ち<rt>・</rt>は<rt>・</rt></ruby></p>



ただ、タグの意味に対して使い方が間違っているので非推奨です。
`<ruby>`は本来漢字等にルビを振るためにあるタグなので、装飾や強調として使う使い方はあまり正しい使い方ではありません。

## 方法2： CSSの疑似要素を使って作る方法

```index.html
  <p class="dots"><span>こ</span><span>ん</span><span>に</span><span>ち</span><span>は</span></p>
```

```style.css
.dots span {
  position: relative; /* 基準値とする */
}
.dots span::before {
  content: "・";       /* 文字の上に置くものを指定 */
  position: absolute; /* 相対位置とする */
  top: -1em;          /* 縦方向の表示位置を調整（-1emくらいがちょうどいいかんじ） */
  left: 0;            /* 横方向の表示位置を調整 */
}
```

**サンプル**
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/db778a13-a9b3-91bb-382e-f087af138402.png)

色を変えたり、「・」以外の文字や画像などでも可能です。

## 方法3： `text-emphasis`を使う

IE無視でもいいならこのプロパティが一番綺麗に実装することができます。

```index.html
  <p class="dots">こんにちは</p>
```

```style.css
p {
  text-emphasis: filled;
  -webkit-text-emphasis: filled;
}
```

こちらの方法の方が装飾としてCSSを利用したやり方なので、綺麗です。


※[@scivola](https://qiita.com/scivola)さんに教えていただきました。ありがとうございます。


## まとめ

見た感じHTMLだけでいけるからといってタグの意味にそぐわない作りをしていると、googleに嫌われるページになってしまう可能性があります。
装飾的な意味でつけるものはCSSで作るような意識をしてコーディングをやっていきましょう。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Linuxでディレクトリ構成を維持して古いファイルを移動する

#やりたいこと
古いファイルを別のディレクトリに退避したい。安いストレージをマウントしているディレクトリへと。

こんな感じ。

```
#移動元
/home/hogehoge/aaa/file1  2019/12/24 更新　←これを移動する。古い
                └  file2  2020/12/24 更新　←これはそのまま。新しい

#移動先
/cheep/backup/

ここに
/cheep/backup/aaa/file1
こうなるようにしたい！
```

#やりかた
rsyncをつかう。

```
cd /home/hogehoge
rsync --remove-source-files -t -p -R $(find ./ -type f -mtime +365) /cheep/backup/
```
※注意　findの結果が０件だと引数の足りないrsyncになります。事前にファイルがあるか確認した方が良いです。

もっといい方法があるはず。。。誰か教えて。
Qiita投稿の基本【Qiita】

#タイトルの書き方

「#」を１つ文字の右につけると、文字が大きくなりタイトルっぽくなる。

#コードの載せ方
①「```」を上下につけた間にコードを入れると、プレビューでコードの黒い画面に表示される。


②上の「```」の右に「csharp」と記載　→　コードの文字色が変化してわかりやすくなる。


③上記に「csharp:●●」のように●にコードの場所名を記載すると、コードの上にコード記載場所が表示される



#写真の貼り付け方法

基本的にドラッグアンドドロップが主流


#自身の学習用での投稿

「Qiitaに投稿」の右矢印の「限定共有投稿」か「Qiitaに投稿」を用途によって選ぶことができる。
「一時保存」も可能。

#最後に
人生初めてのQiitaへの記事投稿でした。
他にもQiitaではこんなことができるみたいなことがあればコメントいただければ有り難いです。
【初心者】PHPで文字列の中に特定の文字列が含まれているのかチェック

# 文字列の中に特定の文字列が含まれているのかチェックしたい
以前、文字列の中に特定の文字が何回含まれているのか？という記事を書いた。
https://qiita.com/wakiyo1017/items/177f3312c720bf01e6ef
今回は、文字列の中に特定の「文字列」が含まれているのかチェックするためにはどうするか学んだ。
プログラミングを勉強していて面白い事は、答えがいくつもあってそのどれもが正解だというところなのだけれど、この方法もいくつもあるらしい。
そのうち二つを残しておく。
## strpos
```php
$str = "abcdefg";
$s = "cd";
echo strpos($str, $s);
// 以下出力結果
2
```
strposは特定の文字列が含まれている場合は、その文字列が何文字目から含まれているかを返してくれるようだ。
含まれていない場合は、false を返してくれるので、含まれているかを確認するためには、if文を用いて…

```php
if(strpos($str, $s) === false){
  echo "nothing";
}else {
  echo "find";
}
```
こんな感じで使用した。


## preg_match
```php
$str = "abcdefg";
$s = "cd";
echo preg_match("/$s/", $str);
// 以下出力結果
1
```
preg_matchは正規表現を使うパターン。
含まれる場合には"1"を、含まれていない場合には"0"を返してくれる。

どちらの方法も、頭の片隅に入れておいて損はないのではないかと思ったので、覚えておこう…
2020年を振り返る@Rails Girls

この記事は、[Rails Girls アドベントカレンダー2020](https://qiita.com/advent-calendar/2020/railsgirlsjapan)  最終日の記事です。

Ruby3.0リリースされましたね！

ということで（？）、毎年自分の中で恒例になっている今年の振り返りを書いていこうと思います。

## Rails Girls Nagoya 5th @ 2020/01/31-02/01
久方ぶりにNagoyaで開催しました。（オーガナイザー兼コーチサポートしてました）
この頃はまだCOVID-19の感染者も全国で１日数人程度と少数ではあったものの、
やはり感染防止への配慮はしたほうがいいよね、ということで除菌ウェットティッシュ、
アルコール消毒液、マスクの希望者への配布など、感染防止に配慮をした状態での
開催となりました。無事にイベント終了することができ、コーチ・スタッフの皆様にも
色々と配慮していただき、めちゃくちゃ感謝しています。

今となって振り返れば、このタイミングで出来てよかったな・・・と思っています。
Nagoyaの後は、Ehime、Tokyoと続いていましたが、Tokyoを最後に、
現在までオフラインでのRails Girlsイベントは開催できていません・・・。

## Rails Girls Kobe 5th @ 2020/3/21-22 -> 延期（時期未定)
コーチとして参加予定でしたが、延期となりました。
次、開催されるときには、またコーチとして立候補します・・・！

## Rails Girls Gathering Japan @ 2020.12.12
初めてのオンラインイベントとして開催。
COVID-19の影響で、Rails Girlsを開催できない状況が続いていたこともあり、
何かできることはないか？ということで、LT大会を実施することになりました。
想像以上の参加者に参加していただけたし、楽しんでもいただけたようで、よかったです。
今後も、こういうイベントができるといいなあ・・・と個人的には思っています。

## Rails Girls Nagoya more! & Rails Girls Nagano more!（定期開催、各々月１回程度）
こちらはもともとオンラインが通常営業化されていたので、COVID-19の影響はなし。
輪読会、もくもく会、ビブリオトーク（読んだ本の紹介）などなど。
＃あと、NagoyaとNaganoってなんとなく間違い探しっぽいよね・・・

## Rails Girls 合同more!
各地のmore!の参加者がオンライン上で集まって、igaigaさんの話を聞いたり、もくもくしたり、ということもやりました。
（igaigaさん、その節はありがとうございました・・・！！）
オンラインって、ほんと物理的な距離をゼロにしてくれるなあ・・・としみじみ感じたイベントでもありました。


ということで、今年１年、いろいろとありすぎた年でした・・・。
来年も、未だ先が見えない中ではありますが、できることからコツコツと、
何かしらRails Girlsの活動をしていきたいです！
[RSpec] テストの準備


今回はRSpecの 導入と用途 についてまとめています。
こちらの記事を参考させていただきました。

https://qiita.com/tatsurou313/items/c923338d2e3c07dfd9ee

# RSpec
**`用途`**
Ruby on Railsのテストコードを書くために用いられるGemです。
Railsの開発現場ではRSpecが主流のようですね。

**`導入方法`**
1, group :development, :test内にRSpecを記述し、インストール
(インストールするバージョンは RSpec の公式サイトを元に適宜修正してください)

```言語:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]

  gem 'rspec-rails', '~> 4.0.0'   <= #追記
```
```言語:ターミナル
% bundle install
```
---

2, 使用したいアプリケーションにRSpecをインストール

```言語:ターミナル
% rails g rspec:install
  Running via Spring preloader in process 16410
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```
---

3, テストコードの結果をターミナルに可視化

```言語:.rspec
--require spec_helper
--format documentation  <= # こちらを記述すると結果が見えるようになります
```
---

4, テストファイルの生成
RSpecではテストコードのことをスペックと言います。
例えばModelのテストコードはModelSpecです。

```
# rails g rspec:(テストしたいMVC) ファイル名　

% rails g rspec:model user
  Running via Spring preloader in process 24477
      create  spec/models/user_spec.rb
```
---

5, 生成したスペックの確認
RSpecでMVCのテストを行うためには、rails_helper.rbファイルを読み込む必要があり、
１行目でファイルを読み込んでいるのです。
因みにrails_helper.rbは、Rspecでテストする際に、`共通の設定を書いておくファイル`です。


```spce/models/user_spec.rb
require 'rails_helper'   <= # １行目にこの記述があることを確認

end
```
EX1:roman numerals



# 講義サイト

[roman numerals](https://qiita.com/daddygongon/items/2d0a73a51ddab2d9da1b) 


# お題：数字の変換

アラビア数字を受け取り、ローマ数字を返すmethodを作る. 
アラビア数字は1や2など、ローマ数字はIやIIなど.

ローマ数字の特徴として、
・1:I, 2:II, 3:III など特定のアルファベットを重ねて数字を表現する.
・桁が繰り上がる時(10:X)と、その中間(5:V)で文字が切り変わる.
・大きい順に並べて書かれる(6:VI, 13:XIII).
・ただし↑↑の節目の直前には小さい数を大きい数の左に書く(4:IV, 9:IX).

理屈では分かりにくいので、詳しくは[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%9E%E6%95%B0%E5%AD%97)参照. 　


# 実装例

使う文字は I, V, X, L, C, D, M のVII種類 
特に曲者なのが IV や IX など、単純にアルファベットを重ねるだけでは表せない数字たち　なので、この数字たちも特別扱いして記述する. 

```ruby

class Integer
  def to_roman
    romannum = ['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M']
    romanval = [ 1,  4,   5,   9, 10,  40,  50, 90, 100, 400, 500, 900, 1000]
    romannum = romannum.reverse
    romanval = romanval.reverse
    result = ''
    len = romannum.length

    i = self

    for j in 0...13
      case
      when i == 0;
	break
      else;
	for k in 0...13
	  case
	  when i - romanval[k] >= 0
	    result += romannum[k]
	    i = i - romanval[k]
	    break
	  end
	end
      end
    end

    result
  end
end

input = [1,2,4,5,6,9,10,11,14,15,19,38,42,
	 49,51,97,99,439,483,499,732,961,999,1999]


if $PROGRAM_NAME == __FILE__
  input.each do |i|
    puts "#{i} #{i.to_roman}"
  end
end
```

引ける数を大きい順から引いていく処理を繰り返した,

実行結果はこんな感じ. 確認した限りでは数は合っている

```ruby
1 I
2 II
4 IV
5 V
6 VI
9 IX
10 X
11 XI
14 XIV
15 XV
19 XIX
38 XXXVIII
42 XLII
49 XLIX
51 LI
97 XCVII
99 XCIX
439 CDXXXIX
483 CDLXXXIII
499 CDXCIX
732 DCCXXXII
961 CMLXI
999 CMXCIX
1999 MCMXCIX
```


# note

・正直プログラムの出来としては悪い方だと思う.
　 2重forループを使っているので計算量の面で不安
  (ローマ数字は4000未満の数字しか表せないため、今回に限っては問題ないのだが).
 　時間かけすぎる為打ち切っているが精度のよいプログラムの作成を心掛けたい.
・どうも乗除算を駆使すればより簡単に求められるらしい？



------
 - **source** ~/grad_members_20f/members/batamon-427/roman_numerals.org
gcloud,kubectlインストール後のちょっとした設定

gcloud, kubectlインストール後からクラスタ等を操作するまでの雑記。

## 環境

macOS Catalina 10.15.4

## 内容

```sh
# プロジェクト一覧を表示する
$ gcloud projects list
# プロジェクトを設定する
$ gcloud config set project <project_name>
# 上で設定したプロジェクトを確認する
$ gcloud config list
# プロジェクトのクラスター一覧を表示する
$ gcloud container clusters list
# kubernetes設定ファイルを更新する
$ gcloud container clusters get-credentials <cluster_name> --region <region>
# ファイルの更新を確認する
$ cat $HOME/.kube/config
# コンテキスト一覧を表示する
$ kubectl config get-contexts

```

## 参考

- [gcloud](https://cloud.google.com/sdk/gcloud/reference)
- [install kubectl](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/)
path通し方メモ。参考にしないでください

注意！lsコマンド使えなくなりました。参考にしないでください。

自分用メモですけど、誰かの役に立ってください

```
cd ~    //ホームディレクトリへ
```
```
open .zhsrc
```


.zshrcファイルにて下記を追記すると、lsコマンドやopenコマンドが使えなくなりました。

```
export PATH=$(パッケージをインストールしたとき表示されパスを入力):使えるようにしたいコマンド
```
```
source ~/.zshrc
```
【FileMaker】WebAPIを実装するときに心掛けていること

今年はなんとWebAPIの実装が多かった年でしょう！
というくらい、WebAPIに始まり、WebAPIに終わると言っても過言ではない今年でした。

# どんなWebAPIを使ったの？
[Google GMail API](https://developers.google.com/gmail/api)
[Google Calendar API](https://developers.google.com/calendar)
[スマレジAPI](https://smaregi.jp/product/api.php)
[郵便番号API](http://zipcloud.ibsnet.co.jp/doc/api)
[Rakuten Rapid API](https://api.rakuten.co.jp/ja/)
[Rakuten API](https://webservice.rakuten.co.jp/document/)
こんなところでしょうか。。。
（ぐったり）

# 何を頼りに作ったの？
OAuth2.0入門書は必読です。
その名も、「[OAuth徹底入門](https://amzn.to/3nSSuXt)」
7６８ページあります。
ボリューミーですが、OAuth2.0の隅から隅まで書いてあります。

あとは、上記WebAPIのサイトです。
英語のページは技術英語なのでなんとなく理解できますし、もしわからない場合は、Chromeの自動翻訳（これがまた滑らかな翻訳！）で乗り越えました。

しかし、サイトではFileMakerで作ることを前提にはしていないので、とにかくcurlとJSONでやるにはどうするか、を中心に読み解きました。

# 何かコツってあります？
コツというか、とにかく以下の３点に限るな、と思いました。
1.定数はカスタム関数化せよ
2.処理はカプセル化せよ
3.エラー情報保存必須の法則

## 1.定数はカスタム関数化せよ
とにかくスクリプトへのベタ書き厳禁です。
外部接続なので、接続先のURLやパラメータが変わった場合、いちいちスクリプトを直さないといけません。
ベタ書きを全てのスクリプトで修正するなんて、途方もないことをやりたくないので、定数やURLは極力カスタム関数で定数化しておきます。
JSONのキーなども定数化しておくと、綴りを間違わずに済みます。

## 2.処理はカプセル化せよ
狭義の「[カプセル化](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96)」は、処理（メソッド）と変数（データ）などをセットにして考えますが、FileMakerでは狭義の意味で使うとかなりしんどいので、擬似的にカプセル化します。

ロケットを発射する時を考えてください。
ロケット台から発射しますよね？
海の底から発射するのはサンダーバードくらいに止め、FileMakerからロケットを飛ばす（外部接続）ときは、極力ロケット台を限定します。

つまり、外部接続をするユーティリティスクリプトを、一つのフォルダにまとめておくのです。
API接続のcurlを書くのは、ここだけ、と決めるのです。
他のスクリプトからは、このユーティリティフォルダにある外部接続スクリプトを呼ぶようにします。

## 3.エラー情報保存必須の法則
外部接続する、ということは、FileMakerだけで解決できないエラーが発生する可能性が高くなる、ということです。
とにかく、エラーは拾えるだけ拾っておきましょう。
エラーを解決するのに実装するのは以下の2つです。
・直前に出たエラーを保存
・curlで外部接続をした際の構文の履歴

直前に出たエラーは、直接原因がわかればこれだけで済みます。
しかし、その前に投げたcurlが原因だったかもしれません。
なので、curlで飛ばした構文も履歴として残しておくように一つテーブルを作って蓄積させたり、ログに吐き出したりしておきます。
これだけでかなりエラー解析が楽になるはずです。

# 他に追加するTipsはありますか？
## 1.JSONはJSONで処理せよ
curlで受信する情報は、JSONであることが多いです。
なので、JSONがなんとなく苦手だから、、、とFileMakerで改行区切りのパラメータでスクリプト間でやりとりをする、というのは、改行区切りをJSONに直したりする処理が増えてしまうのがネックです。
ネック、というのは、パラメータをJSONに変換するコストやメンテナンスが発生した時の労力や時間のコストの部分になります。
JSONを扱うなら、スクリプトの引数などもJSONでやりとりをした方が処理的に変換が少なく済み、また、スクリプトの作りに統一感が生まれ、メンテナンスがしやすくなります（これ大事）。

## 2.仕様をまず読め
サイトのサンプルだけを動かすだけでFileMakerに実装していくのは危険です。
どんなエラー（落とし穴）があるかわかりません。
OAuth2.0を扱うなら[OAuth2.0の仕様](https://openid-foundation-japan.github.io/rfc6749.ja.html)を、[RESTFul API](https://ja.wikipedia.org/wiki/Representational_State_Transfer)ならその仕様を、独自のWebAPIならそのサイトで公表されているヘルプやドキュメントをじっくり読んで実装しましょう。
FileMakerだけで解決しないことが多いことだからこそ、FileMakerのこと以上に読み込んでおく必要があると思います。（＞自戒）

## 3.回避できないエラーがあることを忘れるな
空から降ってくるエラーは、天変地異のようなものです。
絶対ゼロにはできません。
「エラーが絶対起こらないシステム」を目指すのではなく、「エラーが起こった時の処方箋を用意しておくシステム」を目指していきましょう。

# 外部接続ありきで実装するFileMaker
昨今のFileMakerは、様々な世界とつながれるようになりました。
外部接続をすることが多くなって世界が広くなるということは、それだけFileMakerの作りも外部接続ありきで実装し、改修のしやすさをさらに仕込んでいくと、後々のメンテナンスで「あの時の自分、ありがとう」と感謝されると思います。

では、来年もいろんなAPIに出会えますように。
【Ruby on Rails】同一の一覧画面でのカテゴリー別の商品の表示方法

#同じindexファイルを使用してカテゴリー毎に属する商品を表示させる為に必要な手順

ECサイト等を作成した際、**一つのindexページでカテゴリー毎に商品を表示させたい!!**なんて状況に遭遇することがあると思う。
例えばファッション系のECサイトなら、メンズのカテゴリーを押したらメンズに属した商品を表示、アウターを選択するとアウターのみが一覧画面に表示されるような処理を施したり...みたいな。
どんなサイトでも当たり前のように搭載されている機能だが、いざ開発者の立場に立って実装してみるとどのような処理をすればいいのか頭を悩ませる方は多いのではないだろうか。

その場合、下記の様な手順を踏むことでそうした条件をクリアすることができる。
それでは早速張り切っていってみよう。


## ①商品一覧画面にて使用するカテゴリーリンクの表記を記述した部分テンプレートを作成

 ```erb:app/views/products/category_search.html.erb
:
<tbody>
    <% categories.each do |category| %>
    <tr>
      <% if category.is_active == true %>　
      <td>
        <%= link_to category.name, products_path(category_id: category.id), class: "text-secondary" %>
      </td>                    <%# products_pathに引数としてcategory_idを渡す %>
      <% end %>
    </tr>
    <% end %>
</tbody>
:

```

まずeach文でそれぞれのカテゴリーに対応するリンクを用意する。
リンク先にはこの記述の書かれているindexページを指定するが、その時に`pathの引数にカテゴリーidを与える`必要がある。
ちなみに上記の処理を行うにはアソシエーションが必要になるのでモデルの記述を忘れずに。

**上記の記述は画面上のこの部分に相当**
ちなみに商品がマリリンモンローになってしまっているのは私の趣味なので、ここは適当にショートケーキとかに脳内変換しておいてほしい。
　　　　　↓
![スクリーンショット 2020-12-22 17.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936377/7232dd9f-1143-8d3e-1c1f-19fa6368770e.png)

##②コントローラの方で受け取った引数を元にカテゴリーに所属した商品のみをindexページに反映させる

```sql
Started GET "/products?category_id=1" for 118.240.8.212 at 2020-12-25 12:54:22 +0000
Cannot render console from 118.240.8.212! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by ProductsController#index as HTML
  Parameters: {"category_id"=>"1"}
  Category Load (0.2ms)  SELECT  "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/products_controller.rb:8
  Rendering products/index.html.erb within layouts/application
```

次にコントローラ内でパラメーターの値を元に対象データを探し出す処理をさせる。
①の結果、パラメーターには上記のように**category_id**が代入されて送られてきているのがわかる。
そのidを元にまず`カテゴリーを特定`し、その後`カテゴリーに紐付けれた商品を特定`するようプログラムを記述する。

```rb:app/controllers/products_controller.rb
class ProductsController < ApplicationController

  def index
    @products = Product.all
    @categories = Category.all
    @tax = TAX
    if params[:category_id].present?
      #presentメソッドでparams[:category_id]に値が含まれているか確認 => trueの場合下記を実行
      @category = Category.find(params[:category_id])
      @products = @category.products
    end
  end
```

これにより**category_id = x**に紐づいた商品のみをindexページに表示させることができる。
ちなみにこの際表示されたviewページのURLを確認すると(...com/products?category_id=1)のような表記になっているが、これは`リンクのpathに渡した引数（category_id）が反映されたもの`である。
何はともあれこれで無事にカテゴリー毎の商品の表示手順が完了した。
皆さんもぜひお試しを。


記載内容に間違いがあった場合はご連絡頂けると嬉しいです。
ご連絡お待ちしております。
Amazon IVSがすごすぎる件

こんにちは！Life is Tech!OBで秋葉原校でCMをやっておりますがはくです！
この記事はLife is Tech ! メンター Advent Calendar2020 #2の20日目の記事です。
(なお、本記事は所属組織には一切関係せず、個人の見解となります。)

さて今日なのですが、このオンライン中心となってしまった世の中、皆さんいきなりライブ映像配信サーバーを用意しないといけないことってありますよね。あると思います。

そんな皆さんに今年の7月に発表された [Amazon Interactive Video Service (Amazon IVS) ](https://aws.amazon.com/jp/ivs/)を紹介したいと思います。
Amazon IVSを使うとなんと **2ステップ**　でライブ映像配信サーバーを作成できます。

### ステップ1 IVSコンソールを開き、チャンネルを作成をクリック
![スクリーンショット 2020-12-25 22.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145867/ecdc8554-2eab-df71-64d9-6f0167247b35.png)

### ステップ2 チャンネル名を決めてチャンネルを作成！
(必要に応じて細かい設定)
![スクリーンショット 2020-12-25 22.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145867/2b19adbc-c078-fde2-9314-afa0830435cf.png)

この２ステップだけで映像配信サーバーを作成することができます！
普通だったらサーバー用意して、OSや各ミドルウェアを準備して、、、とかなり面倒なのですが、Amazon IVSを使用するとものの数分でライブ映像配信サーバーを用意することができます。

ちなみにサーバーは以下のような感じで出来上がります。

![スクリーンショット 2020-12-25 22.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145867/cea7631b-c591-e4d7-34fd-08b0820979d1.png)

取り込みサーバーの値をOBSなどに入れて、再生URLをWeb等に埋め込むことによって一瞬でライブ映像配信の環境を作ることができます。
ちなみに、IVS謹製のプレーヤー用のSDKも用意されております！

Amazon IVSではライブ配信サーバーがサクッと作れるようになりましたが、このようにAWSサービスを使って、サーバーの構築保守から解放されるサービスは他にもたくさんあります。

是非是非いろんなAWSサービスを触ってみて使いこなしてみてください！！！