OmniAICreator/Qiita-1.07M huggingface dataset:
TCP/IP stack 、Etehrnet(84)

Specification of Ethernet Interface
https://www.autosar.org/fileadmin/user_upload/standards/classic/19-11/AUTOSAR_SWS_EthernetInterface.pdf

p.12
>2 Acronyms and abbreviations

| Abbreviation / Acronym | Description |
|:--|:--|
|TCP/IP Stack|Ethernet communication stack|

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# TCP/IP stack 

### RFC 792 
INTERNET CONTROL MESSAGE PROTOCOL
http://tools.ietf.org/html/RFC792
### RFC 793 
TRANSMISSION CONTROL PROTOCOL
http://tools.ietf.org/html/RFC793

## document
The TCP/IP Protocol Stack
http://www.technologyuk.net/computing/computer-networks/internet/tcp-ip-stack.shtml
>TCP/IP model has four layers. From lowest to highest, these are the link layer, the internet layer, the transport layer, and the application layer, as shown below.

What is the TCP/IP Stack
https://learningnetwork.cisco.com/thread/5769
>The OSI Model as you know has 7 layers, the TCP/IP stack which is the most common Protocol suite in use today has 4.


TCP/IP Model: What is TCP IP Stack? Protocol Layers, Advantages
https://www.guru99.com/tcp-ip-model.html
> All these four layers work collaboratively to transmit the data from one layer to another.
Application Layer
Transport Layer
Internet Layer
Network Interface

Microchip's TCP/IP Stacks
https://www.microchip.com/SWLibraryWeb/product.aspx?product=TCPIPSTACK
>Microchip provides several TCP/IP Stacks to provide a foundation for embedded network applications by handling most of the interaction required between the physical network port and your application.

[![A Story about the TCP/IP Protocol Stack](http://img.youtube.com/vi/ZGhEdLntk3Q/0.jpg)](https://www.youtube.com/watch?v=ZGhEdLntk3Q)

[![TCP/IP Stack Tutorial](http://img.youtube.com/vi/R30zDT7KVM8/0.jpg)](https://www.youtube.com/watch?v=R30zDT7KVM8)


[![What is TCP/IP?]
(http://img.youtube.com/vi/PpsEaqJV_A0/0.jpg)](https://www.youtube.com/watch?v=PpsEaqJV_A0)



[![OSI and TCP IP Models - Best Explanation]
(http://img.youtube.com/vi/3b_TAYtzuho/0.jpg)](https://www.youtube.com/watch?v=3b_TAYtzuho)

# Ethernet


IEEE 802.3 ETHERNET WORKING GROUP
http://www.ieee802.org/3/
https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8457469


[![What is Ethernet?]
(http://img.youtube.com/vi/HLziLmaYsO0/0.jpg)](https://www.youtube.com/watch?v=HLziLmaYsO0)


[![How does Ethernet work? (animated)]
(http://img.youtube.com/vi/5u52wbqBgEY/0.jpg)](https://www.youtube.com/watch?v=5u52wbqBgEY)

# reference

Autosar list of reference, abbreviation and term.(118-97/237): English(40b)
https://qiita.com/kaizen_nagoya/items/dca9c66502dd2ae4b042

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

# 文書履歴(document history)
ver. 0.01 初稿 　　20200216
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Windows10でゼロから始めるC#

# インストール

## とにかく早く始めたい

Windows10で始める人は、インストール **不要。**
C#は、Microsft開発の言語であり、
Windows10であればC#に必要なモジュールはプリインストールされています。

（注意）しかし、こちらは古いバージョンです。
最新バージョンで問題ないコードの記法が、コンパイルエラーになったりします。


## 最新バージョンで始めたい

最新版のC#のモジュールを使用するためには、モジュール取得しましょう。
[**visual studio 2019**](https://visualstudio.microsoft.com/ja/downloads/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=button+cta&utm_content=download+vs2019&rr=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fvisualstudio%2Finstall%2Finstall-visual-studio%3Fview%3Dvs-2019
)をインストールすればよいです。


# 準備

C#は、**cs拡張子**のプログラムファイルにコードを記載します。
csファイルを、**コンパイル**して、**exe拡張子**の実行ファイルを生成します。
コンパイルは、windows環境であれば **csc** というコマンドを実行します。

*.cs
  ↓ cscコマンド
*.exe


まずは、cscコマンド にパスが通っているか以下のコマンドで確認しましょう。

```sh 
where csc 
```

パスが設定されていなければ、csc.exeファイルがあるフォルダをシステム環境変数のPathに追加しましょう。

以下の実行したバージョンのフォルダにcsc.exeファイルあることを確認しましょう。

## とにかく早く始めたい

以下のフォルダにプリインストールされたcsc.exeファイルがあるはずです。

```
C:\Windows\Microsoft.NET\Framework64\{version}\
C:\Windows\Microsoft.NET\Framework\{version}\
```

## 最新バージョンで始めたい

visual studio 2019 community をダウンロードした環境では、以下のようなパスにcsc.exeがあります。

```
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn
```


csc.exeファイルを見つけたらシステム環境変数のPathに追加してあげます。追加するパスは、任意のひとつでよいです。


# プログラミング

まずは、最初の第1歩、**HelloWorld**。
プログラム作成から、実行までを簡単に記載します。

## プログラム作成

Hello Worldサンプル

```cs:HelloWorld.cs
using System;

class HelloWorld {
    static void Main() {
        Console.WriteLine("Hello world!");
    }
}
```

## コンパイル実行

cscコマンドでコンパイルを実行。

```sh
csc HelloWorld.cs 
```

成功すれば、exeファイルが同じフォルダに生成されます。

## プログラム実行

生成されたexeファイルを実行。

```
>HelloWorld.exe
Hello world!
```

できました。
Ionic4 ion-radio-group デフォルトでチェックをつける方法

#はじめに
`ion-radio-group`を使えば、どれか１つだけにチェックをつけさせれるので便利です。

しかし、`[(ngModel)]`でデータバインディングをさせようとすると、デフォルトでチェックをつけられなくなります。。。

今回はデータバインディングを実現させつつ、**デフォルトでチェックをつけたいと思います！**（厳密には見かけ上、データバインディングを実現させている感じです）

**この記事の例はYes or Noの二択しかない場合に有効かと**


#`[(ngModel)]`でデータバインディングをさせようとすると、デフォルトでチェックをつけられなくなる
#まずはOKなパターン

```html:home.page.html
  <ion-list>
            <ion-radio-group>
              <ion-item>
                <ion-label>アイテム１</ion-label>
                <ion-radio [checked]="true" value="true"></ion-radio>
              </ion-item>
              <ion-item>
                <ion-label>アイテム２</ion-label>
                <ion-radio value="false"></ion-radio>
              </ion-item>
            </ion-radio-group>
          </ion-list>
```

<img width="242" alt="スクリーンショット 2020-02-15 21.08.37.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/21caec78-360c-1e58-b944-ad3e4c93f207.jpeg">

##無理なパターン

```html:home.page.html
<ion-list>
            <ion-radio-group [(ngModel)]="dayEvent.items" name="items">
              <ion-item>
                <ion-label>アイテム１</ion-label>
                <ion-radio [checked]="true" value="true"></ion-radio>
              </ion-item>
              <ion-item>
                <ion-label>アイテム２</ion-label>
                <ion-radio value="false"></ion-radio>
              </ion-item>
            </ion-radio-group>
          </ion-list>
```

（かなり省略した.tsファイルですが、、、）

```typescript:home.page.ts
item = true;
item2 = false;

dayEvent: DayEvent = {
    items: this.item,
    items2: this.item2
  };
```

<img width="240" alt="スクリーンショット 2020-02-15 21.10.47.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e6fd0642-a0a7-305f-1f66-f7119015ea86.jpeg">

これだとデフォルトでチェックがつかないのです。。

おそらくですが、原因は`ion-radio-group`に対して`[(ngModel)]`を使っているから。
[こちら](https://forum.ionicframework.com/t/default-radio-group-not-working/117814/8)を参考に。。。


#ngModelを使わずにデータバインディング（っぽいこと）
まずはhtml

```html:home.page.html
<ion-list>
            <ion-radio-group [(ngModel)]="dayEvent.items" name="items" (ionSelect)="onChangeHandler($event)">
              <ion-item>
                <ion-label>アイテム１</ion-label>
                <ion-radio [checked]="dayEvent.items === true" value="true"></ion-radio>
              </ion-item>
              <ion-item>
                <ion-label>アイテム２</ion-label>
                <ion-radio [checked]="dayEvent.items === false" value="false"></ion-radio>
              </ion-item>
            </ion-radio-group>
          </ion-list>
```

次にtsファイル

```typescript:home.page.ts
item = true;
item2 = false;

dayEvent: DayEvent = {
    items: this.item,
    items2: this.item2
  };

onChangeHandler(event) {
    if (event.target.value === 'true') {
      this.dayEvent.items = true;
      console.log(this.dayEvent.items);
    } else if (event.target.value === 'false') {
      this.dayEvent.items = false;
      console.log(this.dayEvent.items);
    }
  }
```

これでデフォルトでチェックをつけつつ、ngModelでバインドされてるかのようになりました。
QCADをmacで使う

QCADはDXFをそのまま扱う，最近お気に入りの2次元CADソフトです。

Windows版で，Community Editionとして使う方法がありまして，

https://drafting.hito-log.com/2019/04/10/post-22/

Macにおいても，表示される以下を削除すれば良さそうです。

<img width="420" alt="スクリーンショット 2020-02-15 17.18.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/2ba4da48-b229-188a-32d2-b2f4658e28f7.png">

これらはアプリ本体を「パッケージの中身を表示」すると見えました。

CADソフトは，データの概念や操作方法を習得するのがすこし時間がかかります。それでも，QCADは割と素直かと思います。

ショートカットキーが充実しておりまして，
https://qcad.org/archives/shortcuts/shortcuts_en.pdf

オブジェクトを選択して[M][V]とタイプすることで，移動モードにできます。回転は[R][O]です。これを覚えるだけで，かなり作業が早くなります。

オブジェクトをまとめるのに，「レイヤー」と「ブロック」という2つの概念があります。併用すると少しトラブルを起こすようなので，私はなるべく「レイヤー」に限定して使うようにしています。「現在のレイヤーにペースト」といったシャレた機能はないようでして，その場合はペースト前のレイヤー名を揃えておくと良いようです。

本家ページ

https://qcad.org/en/


（2020/3/8 追記）
Serene Linux でも試してみました。
公式ページのガイド通り，ダウンロードしたスクリプトを走らせると，インストールされました。
上記のプラグインは，私の場合は

`/home/ユーザー名/opt/qcad-3.24.2-trial-linux-x86_64/plugins/`

にありました。削除しました。
zshにPATHを通す方法

どうもこんにちはしゅうといいます。
最近Laravelの学習をしています。Laravelのコマンドを使う際にホームにパスを通したほうが後々の作業が楽だと思いターミナルでパスを打ち込みました。
しかし、ターミナルを再起動したらホームからLaravelのコマンドが使えないのであれ？と思い、原因をずっと調べていました。
やっと昨日解決したのでここにまとめておこうと思います。

### 達成したいこと
zshにLaravelのPATHを通してホームディレクトリからLaravelコマンドを使えるようにする。


### 発生している問題
下記のPATHをターミナルに打ち込む。

```
export PATH="$PATH:$HOME/.composer/vendor/bin"
```
そして下記のコマンドを打つことで、PATHが保存され再起動した後もホームからLaravelコマンドが使えるはず、、、

```
source ~/.zshrc
```

しかし、僕の場合は保存されませんでした。（原因はわかりません。）




### 解決方法
まずホームディレクトリに移動します。

```
cd ~
```
次に、下記のコマンドでディレクトを一覧を表示します。
（ターミナルでコマンドを打つ際はオプションというものをつけることができます。今回の場合は[-a]です。これは隠しファイルも表示するオプションになります。色々あるので調べてみるのもいいかもしれません。）

```
ls -a
```
表示されたもののなかに```.zshrc```というのもがあると思います。
これを編集していきます。

下記のコマンドを打つことでテキストエディタを開いて```zshrc```を編集することができると思います。

```
open .zshrc
```
ファイルが開いたと思います。（開かない場合はわかりません）
僕の場合は```#environment paths```以下のコードがありませんでした。
このファイルにPATHを追加して```source ~/.zshrc```をターミナルで入力することで
ターミナルを再起動してもホームディレクトリからlaravelコマンドが使えるようになります。

```
.zshrcファイルの中身
#
# Executes commands at the start of an interactive session.
#
# Authors:
#   Sorin Ionescu <sorin.ionescu@gmail.com>
#

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# Customize to your needs...

# environment paths(ここでパスを追加します)
# Larvel
export PATH="$PATH:$HOME/.composer/vendor/bin"
#PostgreSQL
export PATH=“$PATH:/usr/local/Cellar/postgresql/12,1”

```
###まとめ
最近Macの標準ターミナルがbashからzshへと変わりました。
bashの設定をzshに移す作業をしてないのでそれがPATHが追加されなかった原因かもしれません。

homebrewで管理しようと思いhomebrewからzshをインストールし、zshのフレームワークであるpreztoを導入する際にいろいろなファイルを移動したり消したのが原因かもしれません。

一つコマンドを打つことで様々な操作ができる反面、初学者にとってはやっている意味がわからないとめんどくさいことになります。
ターミナルでいろいろ設定するときはしっかりそのコマンドの意味や、影響などを調べてから行うべきということを学びました。

下記の本でターミナルの勉強することにしました。
https://www.amazon.co.jp/dp/B01NBK3TCY/ref=cm_sw_em_r_mt_dp_U_hKjsEbBHYD9TA
JavaScript 指定した文字の前後の切り出し

JavaScriptを使用して、指定した文字の前後の文字列を切り出す方法を紹介します。

```js
var str = 'abcdefghij';
```

```js
// dより前の文字が欲しい
var cut1 = str.substr(0, str.indexOf('d'));

console.log(cut1);

// 結果
abc
```

```js
// dより後の文字が欲しい
var cut2 = str.substr(str.indexOf('d') + 1);

console.log(cut2);

// 結果
fghij
```

## 関数の紹介
### indexOf()
文字列の中に指定した文字があるかを探してあれば、そのインデックス（先頭を0とした順番）を返却する。

今回の場合は、指定した「d」と言う文字が4番目にあるので3と言うインデックスが返却される。

### substr()
substr(開始位置, 終了位置)とすることで、開始位置から終了位置までの文字を切り出すことができる。

今回の場合は、

```js
str.substr(0, str.indexOf('d'))
```
とすることで、文字列の0番目から3番目までの文字列が切り出されるので、返却値が以下のようになる。

```
abc
```


また、substr(数字)とすることで、指定した数字から末尾までの文字を切り出すことができる。
今回の場合は、

```js
str.substr(str.indexOf('d') + 1)
```

とすることで、文字列の4番目から末尾までの文字が切り出されるので、返却値が以下のようになる。

```
fghij
```
PerlのAtCoder向けVSCode設定(tasks.json)

# はじめに
競技プログラミングには、タイムトライアル要素もあります。
そこで、ワンタッチでプログラム実行できるセッティングを行いました。
# Perl の実行コマンド
AtCoderのPerl実行コマンドは、次の通りです。

```
	Perl -X Main.pl
```
これをローカルで毎回実行しないといけないわけです。
# tasks.jsonの設定

```tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "perl",
            "type": "shell",
            "command": "perl",
            "args": [
                "-X",
                "${workspaceFolder}/main.pl"
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": false,
                "clear": true
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
tasks.jsonを設定しますと、

|Ctrl + Shift +B|
|:-----:|
で設定したコマンドが実行されます。
# 簡単な補足

+ "command": "perl" **perl.exeへのパスが通っていない場合はフルパスを設定**
+ "args": [ "-X", "${workspaceFolder}/main.pl" ] **ファイルを開くではなく、フォルダーを開くを使用した場合、ソースへのパスを上手いことやってくれる**
+ "presentation": { "reveal": "always", "focus": true, **ターミナルを開きフォーカスを当てるので、データの入力が簡単**

# 実行例
[ABC 086 A - Product](https://atcoder.jp/contests/abc086/tasks/abc086_a)

```
> Executing task: perl -X C:\Users\user\Documents\atcoder\abc086a\main.pl <

3 4
Even
```

文法誤りの場合

```
> Executing task: perl -X C:\Users\user\Documents\atcoder\abc086a\main.pl <

syntax error at C:\Users\user\Documents\atcoder\abc086a\main.pl line 
13, near "print"
Execution of C:\Users\user\Documents\atcoder\abc086a\main.pl aborted 
due to compilation errors.
ターミナルの処理が終了しました (終了コード: 255)
```

# まとめ
+ ~~本来はビルドタスク~~ プログラマーには、三つの美徳が絶対に必要です
+ Thanks Larry.
+ Perlに限らずほかの言語にも応用可能です
+ 競プロ、頑張りましょう

参照したサイト
[VSCodeのタスク機能でRails Serverをコマンド一発で起動する](https://qiita.com/suzuki_sh/items/968ba9aeb312c8742f4e)
hstackやvstackでできないことをdstackで

```
a = np.array(['1', '2'])
b = np.array(['a', 'b'])
```
aとbを合わせて次のようにしたい

```
array([['1', 'a'],
       ['2', 'b']])
```
hstackやvstackでできなかったので下記のようにやった。

```
>>>np.dstack((a, b))
array([[['1', 'a'],
        ['2', 'b']]])
>>>np.dstack((a, b)).shape
(1, 2, 2)
>>>c.reshape(c.shape[1], c.shape[2])
array([['1', 'a'],
       ['2', 'b']], dtype='<U1')
```
volatilityの作法 その11

#概要

volatilityの作法、調べてみた。
plugin作ってみた。

#サンプルコード

プロセスを列挙

```
import volatility.plugins.taskmods as taskmods

class MyPlugin2(taskmods.DllList): 
    """This is my example plugin2"""
    def render_text(self, outfd, data):
        for process in data:
            outfd.write("Process: {0}, Pid: {1}\n".format(process.ImageFileName, process.UniqueProcessId))

```

以上。
htmlで検索フォームを作成する。


htmlでフォームを作るってみます。

ECサイトとかだと検索BOXって絶対必要なものなのでここに作り方まとめます。ただ今回は、実際に検索を実行させることはしません。ただ単純にhtmlとcssで検索フォームを作成するだけです。

作りたいもの。

<img width="258" alt="スクリーンショット 2020-02-16 09.27.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/e3db5e43-194d-43f6-7ba2-6bedd2b5f8b9.png">

こんな感じの検索box.


## formタグの属性

まずフォームを作成するにはformタグ、inputタグを使用する必要があります。


```html:

<form action="https://qiita.com" method="GET">
   <!-- ここには<input>タグを入れる -->
</form>

```


・ **action** → 入力されたデータをどこのURLに送信するかを指定する。


・ **method** → GETとPOSTが一般的。GETはサーバーに「やあサーバ、このリソースをくれよ。」と指示。POSTはサーバーに「やあサーバ、このデータを見て適切な結果を返してよ。」 と指示するもの。（参考:[MDN](https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data)） ちなみに、検索formは入力した値に対してその検索結果をサーバーから取得したいのでGETです。



## inputタグの属性

```html:


<form action="https://qiita.com" method="GET">
   <input class="form-text" type="seach" placeholder="検索 …">
</form>


```

・ class → cssを適用させるためにclass名をつける。

・ type → このinputは何に使用されるのかを選ぶ。今回はseachに使用するのでsearch（参考:[HTMLクイックリファレンス](http://www.htmq.com/html5/input.shtml)）

・ placeholder → input box内に表示させる文字列。


##CSSでスタイリング

最後にCSSで整えれば出来上がり。

```css:

.form-text{
    font-size: 16px;
    padding: 10.130px;
    width: 191px;
}

```

完成！

<img width="258" alt="スクリーンショット 2020-02-16 09.27.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/e3db5e43-194d-43f6-7ba2-6bedd2b5f8b9.png">
Mac + nodebrew で node の特定バージョンをインストールして使う ( 反映されない場合は nodebrew use )

https://github.com/hokaccha/nodebrew

# 手順

```
# curl でインストール
$ curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 24634  100 24634    0     0  10729      0  0:00:02  0:00:02 --:--:-- 10729
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

# パスを設定
# ~/.bash_profile などに書いておくと良い

$ export PATH=$HOME/.nodebrew/current/bin:$PATH

# 特定のバージョンをインストール
$ nodebrew install v13.6.0
Fetching: https://nodejs.org/dist/v13.6.0/node-v13.6.0-darwin-x64.tar.gz
######################################################################################################################################## 100.0%
Installed successfully

# まだ反映されていない
$ node -v
v13.8.0

# 反映するには use 
$ nodebrew use v13.6.0
use v13.6.0

# 反映された
$ node -v
v13.6.0
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2990








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Mac で nodebrew のバージョンが何故か反映されない

なぜか2つのパスに nodebrew がインストールされてしまっていた様子

- `/usr/local/var/nodebrew/`
- `$HOME/.nodebrew/`

強制的に `/usr/local/var/nodebrew/current` を削除したところ反映されるようになったが、良い子はマネしてはいけないかもしれない。

```shell
node -v
v13.7.0

which node
/usr/local/var/nodebrew/current/bin/node

rm -rf /usr/local/var/nodebrew/current

nodebrew ls
v13.8.0

current: v13.8.0
Fetching: https://nodejs.org/dist/v13.8.0/node-v13.8.0-darwin-x64.tar.gz
######################################################################################################################################## 100.0%
Installed successfully

nodebrew install v13.8.0

nodebrew use v13.8.0
use v13.8.0

node -v
v13.8.0

which node
/Users/yumainaura/.nodebrew/current/bin/node
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2989








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Forbidden You don't have permission to access this resource出た時の解決策

#結論
公開ディレクトリ先のvar/www/htmlのhtmlディレクトリの所有者をapacheに変更した

#まずは現在の所有者を確認してみる。

```
[root@ip-172-31-28-29 html]# cd ..

[root@ip-172-31-28-29 www]# pwd
/var/www

[root@ip-172-31-28-29 www]# ls -l
total 0
drwxr-xr-x 2 root     root    6 Oct 22 22:59 cgi-bin
drwxrw-rwx 3 ec2-user apache 51 Feb 15 09:43 html
```
所有者がec2-userになっていたので今回のエラーが出ていました。

![エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/f30bcf9f-0d4f-950e-becd-394f56cbb5c3.png)



#所有者をapacheに変更する
chown -R apache:apache 実行させるフォルダ

```
[root@ip-172-31-28-29 www]# chown -R apache:apache html

[root@ip-172-31-28-29 www]# ls -l
total 0
drwxr-xr-x 2 root   root    6 Oct 22 22:59 cgi-bin
drwxrw-rwx 3 apache apache 51 Feb 15 09:43 html

[root@ip-172-31-28-29 www]# systemctl restart httpd
```
これで所有者がapacheに変更しました。
念のためsystemctl restart httpdを行い再起動させましょう。


無事、表示することができました。
![apache所有者.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/ad9bc973-c7a6-aa19-9cc3-3cd8496dcf0d.png)



#htmlディレクトリ先のファイルの所有者は？
関係無かったですが、htmlディレクトリ先のファイルの所有者も公開しておきます。

```
[root@ip-172-31-28-29 html]# pwd
/var/www/html

[root@ip-172-31-28-29 html]# ls -l
total 8
drwxrwxrwx 2 ec2-user ec2-user 19 Feb 15 09:43 test
-rwxrwxrwx 1 ec2-user root     11 Feb 12 23:17 test.html
-rw-r--r-- 1 ec2-user root     22 Feb 14 14:45 test.php
```
【Apache】ドキュメントルートに配置する重要性を学んだ。

<h1>概要</h1>
設定ファイルを変更した状態でphpMyAdminを立ち上げようとしたら表示されなかった
⇒パス指定は間違ってない
⇒ドキュメントルート(/var/www/html)配下にphpMyAdminを置けていないからと気が付く

<h1>試したこと</h1>
①まずは以下にアクセス
``http://192.168.33.10/phpmyadmin/index.php
``

したものの、画面は表示されず「Not found」で表示されず。

②ダウンロードしたphpMyAdminをドキュメントルートに移動
移動後、再度アクセス
``http://192.168.33.10/phpmyadmin/index.php
``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481718/f9fa5518-ff27-69b1-f723-5696e2feb9d7.png)


<h1>まとめ(今後の課題)</h1>
・どこにアクセスしているのか把握していなかったのが原因。
(座学として学習してるだけだとイメージがつかめなかったので今躓いててむしろ良かった、、、)
・Linuxにインストールしてからアプリを立ち上げる方法についても今後身に付けていきたい。
⇒GUIからインストールするのも同じくらい楽ではあるけど「動けばいい」マインドから卒業したい。
イテラブルなクラス

pythonのイテレータって、結構重宝する機能な気がして個人的には好きなんですが、
バージョン毎に挙動が違ってちょっとややこしい。

https://qiita.com/Ryuichirou/items/c18d31f549038169c711

↑こちらの記事にたどり着いてスッキリしました。


#python3.7におけるイテラブルなクラス

```python
class A(object):
    def __init__(self):
        self.no_list = [1, 2, 3]
    def __iter__(self):
        for no in self.no_list:
            yield no
        else:
            return

a = A()

for no in a:
    print(no)

for no in a:
    print(no)
```

■実行結果
1
2
3
1
2
3

イテレータは、対象を配列のように扱えるようにします。
クラスにイテレータを実装すると、クラス変数は**まるで配列であるかのように**
for in 構文を使えます。
二回実行しても、イテレータはちゃんとリセットされてるので、
また配列の先頭から処理されます。

#python3.6系以前

```python
class A(object):
    def __init__(self):
        self.no_list = [1, 2, 3]
    def __iter__(self):
        for no in self.no_list:
            yield no
        else:
            raise stopIteration()
```
3.6系以前だとこんな感じ。**配列の終端を例外で通知**していた。
例外を柔軟に使ってて、これはこれで良い気がするんだけど、
3.7系でこれをやると配列の終端に達した時に、本当に**例外がアプリコードへスロー**されます。
```
RuntimeError: generator raised StopIteration
```
つまり、for in 構文の外側でtry/exceptしないといけません。
せっかくクラス変数が配列のように**直感的に**扱えるようになるのに、これでは台無しです。
ということでpython3.7系では最初のように記述するのが正解です。

python3.7系では、例外は**例外なく**アプリへスローすべき、というポリシーになったんでしょうか。
個人的には3.6系以前の柔軟な例外の使い方も好きなんですが・・・
Mac で nodebrew が動かない ( #node )

brewが使えないというひどい罠が。

# Error

```
nodebrew list
No such file or directory at /usr/local/bin/nodebrew line 575.
```

# Resolve

https://github.com/hokaccha/nodebrew#install

```
brew uninstall nodebrew
```

```
curl -L git.io/nodebrew | perl - setup
```

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```
not installed

current: none
nodebrew ls
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2988








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ブラウザでQRコードを読めるようにした際のメモ

# サマリ
先日作成したwebcamの動画ストリーミングアプリにQRコードの読み取り機能を設けました。
<img width="800" alt="screenShot.png" src="https://tetunori.github.io/HTML5WebcamTester/images/screenShot.png">

# 成果物
[こちら](https://tetunori.github.io/HTML5WebcamTester/)にアクセスするだけで使えます。[ソースコード](https://github.com/tetunori/HTML5WebcamTester)もOSSでどうぞ。

使い方については、[前回の記事](https://qiita.com/tetunori_lego/items/4d0da075224abbaa4389)を参照してください。
カメラが起動したらQRコードが大きく映るようにカメラ前においてください。無事に読み取りができれば、→側のテキスト領域に読み込んだデータが追記されていきます。

# SWのポイント
## QRコード読みとりのライブラリ
[こちらの記事](https://qiita.com/diggy-mo/items/5caf1fcf157fc29e9451)を参考にさせていただき、モダンな記載になっていて、その中でもメジャーな[jsQR(@cozmo)](https://github.com/cozmo/jsQR)を選択してみました。結果的に、すごい簡単に使えて最＆高です。どれくらい簡単か↓

```HTML:index.html
  <!-- QR decoding -->
  <script src="https://cozmo.github.io/jsQR/jsQR.js"></script>
```

```Javascript:index.js
// imageData is data written in a canvas
const code = jsQR( imageData.data, imageData.width, imageData.height, {
  inversionAttempts: "dontInvert",
} );
console.log( code.data );
```
嘘だろっていうくらい簡単にデコードできました。とりあえず300msecくらい毎のデコードでいいかなと思って設定していますが、100msec毎でも問題なく動いていたので、パフォーマンス上げたい方は変更してもらえますと幸いです。
なお、カメラのピントを合わせることが出来なかったり、たくさんQRコードが存在するとどれを読んでいるのか不明だったりするので、その辺は読み取り方に工夫がいります。

## お役立ち: VSCode LiveServerのHTTPS対応
今回の実装をするにあたり、超絶便利なVSCode LiveServerはデフォルト設定から変更しています。ローカルのPC環境でiPhoneからもLiveServerにアクセスしてほしいのですが、カメラを使用するには、localhostかhttpsでないといけないので、そのあたりの設定を変更しています。やるべきことは下記の2点です。

### VSCode LiveServerのHTTPS化
[こちらの記事](https://qiita.com/ma2shita/items/297c812a6cd09b5e82c8)にばっちり手順が書いてあります。Windowsですとopensslをインストールする必要があるので、そちらは事前にやっておきましょう。opensslがあれば、たった1行でオレオレ証明書cert.pem, key.pemが作成できます。どこか適当なフォルダに配置しパスをLiveServerのsettingに書いておきましょう。

### Serverへのアクセス先をローカルホストから変更
外部のスマホからアクセスしたいので、こちらもLiveServerの設定からIPアドレスを変更します。具体的には下記の設定に、自分のPCのIPアドレスを設定します。Windowsであれば、`cmd`から`ipconfig`して取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542654/1ce2cbba-2811-76e0-2500-541454b51900.png)

### iOS側で確認
PCとiPhoneなどが同一のネットワークにつながっていれば、iPhoneのSafariから`<IP Address>:5500`にアクセスするとスマホ側からもLiveServer機能が使えるはずです。ちゃんとコード編集すると自動リロードしてくれます。。。が、コードの編集が反映されていない時が多いので、その場合はSafariの設定からキャッシュの削除をしてみてください。その点は面倒ですね。

以上ですが、LiveServerの便利さを伝えたかっただけの記事です。失礼しました。
（ドラフト/メモ）Dockerコンテナベースで動作するメールサーバ


１．Mailu
https://github.com/Mailu/Mailu

・Mailuで簡単にWebUI付きのメールサーバを立てる
https://qiita.com/kter/items/7cad987794b6610e4983


２．mailcow
https://mailcow.email/

３．tomav/docker-mailserver
https://github.com/tomav/docker-mailserver

```
    Postfix with smtp or ldap auth
    Dovecot for sasl, imap (and optional pop3) with ssl support, with ldap auth
        Dovecot is installed from the Dovecot Community Repo
    saslauthd with ldap auth
    Amavis
    Spamassasin supporting custom rules
    ClamAV with automatic updates
    OpenDKIM
    OpenDMARC
    Fail2ban
    Fetchmail
    Postscreen
    Postgrey
    basic Sieve support using dovecot
    LetsEncrypt and self-signed certificates
    Setup script to easily configure and maintain your mailserver
    persistent data and state (but think about backups!)
    Integration tests
    Automated builds on docker hub
    Plus addressing (a.k.a. extension delimiters) works out of the box: email for you+extension@example.com go to you@example.com

Why I created this image: Simple mail server with Docker

Before you open an issue, please have a look this README, the Wiki and Postfix/Dovecot documentation.
Requirements

Recommended:

    1 CPU
    1-2GB RAM
    Swap enabled for the container

Minimum:

    1 CPU
    512MB RAM

Note: You'll need to deactivate some services like ClamAV to be able to run on a host with 512MB of RAM. Even with 1G RAM you may run into problems without swap, see FAQ.
```
・Dockerでメールサーバーを建てたときのメモ
https://blog.netaka.net/mailserver_on_docker/
git pushを取り消す方法

# 本記事の対象者
「git pushした後に間違いに気が付いてしまった！」
「git pushする前に戻りたい！」

そんな方に向けてこの記事を書いています。

# 主な対処法
- git resetコマンド（履歴が残らずに修正できる）
- git revertコマンド（履歴を残して修正する）

## 対処法1.git reset
`git reset`を実行すると、前のコミットの状態に戻ることができます。主にhardとsoftの2つのオプションを利用します。

```
$ git reset --hard HEAD^
```
このコマンドを実行するとcommit,add,ソースの変更を取り消すことができます。

しかし、ローカルでの変更等は残して、git pushだけ取り消したいという場合があると思います。その場合は以下のコマンドを実行してください。

```
$ git reset --soft HEAD^
```
このコマンドを実行するとコミットのみを取り消すことができます。

### 注意点１
`git reset`の後に、修正した内容をpushしようとすると、以前のコミットとコンフリクトしてエラーとなり、pushできません。

そのため、「-f」オプションをつけて強制的にpushする必要があります。

```
$ git push -f origin HEAD
```
これで何事もなかったように修正することができます。

### 注意点２
過去の履歴を書き換えてしまうので、チーム開発をしているとコンフリクトが起きる可能性があります。

### 注意点３
`git reset`の際に、直前のコミットのみ取り消すのであれば「HEAD^」で良いですが、直前のn個のコミットを取り消すのであれば「HEAD~n」と指定する必要があります。

## 対処法2.git revert
変更を取り消すのではなく、打ち消すことができます。（履歴は残る）
`git reset`とは異なり、過去の履歴を書き換えることがないため、安全だと言えます。

```
$ git revert HEAD
```
このコマンドを実行すると、過去のコミットを打ち消す、新しいコミットができるので、

```
$ git push origin HEAD
```
を実行すると再度pushすることができます。

### 注意点
`git revert`は安全な取り消し方法ですが、不要な履歴が増えてしまうので、個人開発などでは`git reset`の方が良いかもしれません。

## まとめ
誤って`git push`してしまった時の対処法は２つあります。

 - git resetコマンド（履歴が残らずに修正できる）
 - git revertコマンド（履歴を残して修正する）

それぞれメリット・デメリットはあるので、その場に応じたコマンドを選択しましょう。
自動楽器

サウンドミニハッカソン＃８自動楽器
https://effectorhack.connpass.com/event/164867/
のイベントで作った備忘録です。

#できたもの

https://twitter.com/tatmos/status/1228640715976015872

#苦労したところ

モーターをまとめて動かそうとすると動きが悪くなる
３つくらいまでなら割と動く。
たくさんつけると、休ませながらでないと動きが悪くなる。

モーターを動かし続けてしまったりすると、モーターや回路に悪いことがおこるので気を付ける。

#プログラム

グレイコードなシーケンスをもとに、
3つのモーターまでを同時に動かすような形にしてみた。
シリアルモニターに出力される数字が1のモーターが動作するイメージ。

初回動作時はモーターが元気だけど、これでも動きがかなり弱まってしまうので、
ディレイの値を大きめにした方が良いかも。

``` 20200216.ino
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(7, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);

    Serial.begin(9600); 
}

void mPlay1(int val)
{
  byte b = (val & 0x01) != 0;
  if(b){digitalWrite(7, HIGH);};

  b = (val & 0x02) != 0;
  if(b){digitalWrite(12, HIGH);};

  b = (val & 0x04) != 0;
  if(b){digitalWrite(11, HIGH);};
}

void mPlay2(int val)
{
  byte b = (val & 0x08) != 0;
  if(b){digitalWrite(10, HIGH);};
  
  b = (val & 0x10) != 0;
  if(b){digitalWrite(9, HIGH);};

  b = (val & 0x20) != 0;
  if(b){digitalWrite(8, HIGH);};
}

void mStop()
{
  digitalWrite(7, LOW);  
  digitalWrite(12, LOW);  
  digitalWrite(11, LOW);  
  digitalWrite(10, LOW);  
  digitalWrite(9, LOW); 
  digitalWrite(8, LOW);   
}



int v = 1;
// the loop function runs over and over again forever
void loop() {

  v = v ^ (v >> 1);
  v++;

  Serial.print(v, BIN);
  Serial.print("\n");

  mPlay1(v);
  delay(50);
  mStop();
  delay(50);
  
  mPlay2(v);
  delay(50);
  
  mStop();
  delay(500);
}
```

ディレイを多めにしたときのモーターの動き
https://twitter.com/tatmos/status/1228829692259471365

・・・
追記(21-08-12)：
ArduinoMegaを使って数は増やしていますが、基本同じ構成
https://www.nicovideo.jp/watch/sm39075386
loadBodyTrackedAsync が使えない際の対処法

## 現象

WWDC 2019で紹介されていたARKit & RealityKitのサンプルコードを実装した際、`loadBodyTrackedAsync`がEntity型のメンバーではないというエラーが表示された。

![スクリーンショット 2020-02-16 8.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190870/05a8fbfe-d35b-32f5-f072-2c9fd97a2785.png)

## 対処法

ビルドの矛先を`Generic iOS Device`もしくは`実機`に向ける。

![スクリーンショット 2020-02-16 8.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190870/d15937fc-c09c-48e4-606d-c9f53353bf83.png)

## 関連リンク

- [Bringing People in AR](https://developer.apple.com/videos/play/wwdc2019/607)
- [Apple Developer Forums](https://forums.developer.apple.com/thread/118598)
IBM Quantum ExperienceとBlueqatで作った2進数の加算回路にHゲートを適用して量子っぽさを体感してみる

量子コンピュータ初心者です。[前回](https://qiita.com/Zensa55/items/c9025fdf10bb287d50ef)IBM Quantum ExperienceとBlueqatを使って2進数の加算回路を作ってみましたが、たぶんこんな疑問があると思います。

**普通のデジタルな計算と変わらないのでは・・・？**

そうですね。[前回](https://qiita.com/Zensa55/items/c9025fdf10bb287d50ef)は4回計算して4つの答えを得ました。これでは普通に電卓たたくのと大差ありません。今回はここに$H$ゲートを適用して量子の重ね合わせを使った計算を行い、量子っぽさを体感してみます。


#加算回路にHゲートを適用する
[前回](https://qiita.com/Zensa55/items/c9025fdf10bb287d50ef)Circuit Composerで作成した加算回路のq[0]とq[1]に$H$ゲートを適用します。準備はこれだけ。
Measurement Probabilityの結果を見ると4つの値が並んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/02e7f709-10fc-dbee-c523-46d64bf102f3.png)

##加算回路の復習
この加算回路ではq[0]とq[1]が入力ビット、q[2]とq[3]が出力ビットでした。そして以下のように計算することを想定していたのでした。

|入力1 q[0]  |入力2 q[1] |出力1桁目 q[2] |出力2桁目 q[3] |
|---|---|---|---|
|0  |0  |0  |0  |
|1  |0  |1  |0  |
|0  |1  |1  |0  |
|1  |1  |0  |1  |

##結果を確認する
Circuit Composerではq[3],q[2],q[1],q[0]と量子ビットの順番とは逆に結果を出すので、並んでいる4桁の数字は先頭2つが出力値、後ろ2つが入力値です。先の表の右から左へ数字が並んでいると思っていただければOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346401/6c43882c-1c68-ce11-5baa-2d669df86544.png)

ということで、$H$ゲートを入れることで1つの回路で4つの計算を同時に行うことができました！

##発想の飛躍が必要（たぶん）
このようなことが起きるのは$H$ゲートを適用することで、q[0],q[1]が0と1の値を50%ずつ持つ、つまり0でもあり1でもあるという量子の重ね合わせ状態になるためです。確定的ではない値を入力値として、計算すると確定的な結果が出てくるというのはいかにも量子っぽく、普通の計算とはかなりイメージが違うので発想の飛躍が必要そうな気がしてます。


#Blueqatで計算してみる
同じ計算をBlueqatでもやってみます。書くのはたったこれだけ。短い・・・

```python
from blueqat import Circuit
Circuit().h[0,1].ccx[0,1,3].cx[1,2].cx[0,2].m[:].run(shots=100)
```

計算するとこんなふうに4つの結果が返ってきます。Circuit Composerとは逆でq[0],q[1],q[2],q[3]の順番で結果が出ていることに注意してください。

```python
Counter({'0000': 23, '0110': 31, '1010': 25, '1101': 21})
```

まだ量子プログラミングはじめて数日ですが、量子プログラミングはセットアップまでが大変だけれども計算は一撃みたいな印象を持ちました。このあたりが量子コンピュータが注目される理由なのかもしれません。

#参考資料
[Blueqatチュートリアル 重ね合わせを使った足し算](https://github.com/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/009_basic_adder_hadamard.ipynb)
Font Awesomeの主要SNSアイコンのコピペ集


結構Awesome Fontって使うことが多いのかなと思うんですが、毎回Awesome Fontのページまで行って、アイコン探して、コピペしてって手間なんですよね。

だからコピペ集を作ることにしました。


##まずはkit

これは無料登録して自分で作らなきゃいけないみたい。


https://fontawesome.com/kits

このkitは<head>タグの最後に入れます。


##そして、いざコピペ集。

### Instagram

<img width="68" alt="スクリーンショット 2020-02-16 07.06.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/a88424b7-1f44-7042-6fe0-c9446836498f.png">



```html:

<i class="fab fa-instagram"></i>
```


###Twitter

<img width="91" alt="スクリーンショット 2020-02-16 07.07.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/1d5d9077-f8e7-f8c2-33d0-a7c08d7575c4.png">

```html:

<i class="fab fa-twitter"></i>
```


###Facebook

<img width="86" alt="スクリーンショット 2020-02-16 07.09.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/fc020f8f-ebef-40b7-0669-241132ec783e.png">

```html:

<i class="fab fa-facebook-f"></i>
```

<img width="88" alt="スクリーンショット 2020-02-16 07.09.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/df6f6daf-3832-b472-2d99-734b38f22bfd.png">

```html:

<i class="fab fa-facebook"></i>
```

<img width="89" alt="スクリーンショット 2020-02-16 07.10.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/44a95c95-dc15-3da4-38f2-af4f58ae1fdc.png">


```html:

<i class="fab fa-facebook-square"></i>
```


取り急ぎ以上。

追加希望ありましたらコメント欄にどうぞ。
db:create で ActiveRecord::NoDatabaseError の原因が factory_bot_rails だった話

ググっても引っかからなかったので取り急ぎメモ

# 結論

```diff:Gemfile
- gem 'factory_bot_rails'
+ gem 'factory_bot_rails', require: false
```

# 背景

`bin/rails db:create` や `bundle exec rake db:create` 等で `ActiveRecord::NoDatabaseError: Unknown database 'xxxxx'` というエラーが発生した。いや、その DB を作れと言ってるんだが...？

スタックトレースを追うと `factory_bot` に関する怪しげな部分が見つかった。以下は GitHub Actions 上での例。

```
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/trait.rb:12:in `instance_eval'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/trait.rb:12:in `initialize'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/definition_proxy.rb:173:in `new'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/definition_proxy.rb:173:in `trait'
/home/runner/work/xxxx/xxxx/spec/factories/articles.rb:70:in `block (2 levels) in <main>'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:18:in `instance_eval'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:18:in `factory'
/home/runner/work/xxxx/xxxx/spec/factories/articles.rb:2:in `block in <main>'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:49:in `instance_eval'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:49:in `run'
/home/runner/work/xxxx/xxxx/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:7:in `define'
```

応急的に `require` するまで `factory_bot_rails` をロードしないようにして解決した。

```diff:Gemfile
- gem 'factory_bot_rails'
+ gem 'factory_bot_rails', require: false
```

あとは `FactoryBot` を使いたい場所で `require` すれば良い。

```diff:spec/support/factory_bot.rb
+ require 'factory_bot_rails'
+
  RSpec.configure do |config|
    config.include FactoryBot::Syntax::Methods
  end
```
ジェネレータで大量データをCSVにファイル分割して書き込む

みんな大好きジェネレータ。クラスとか定義せずにジェネレータだけで綺麗に書けるぞ。

## 背景

もともとは仕事で書いたコード。先日開催された[PHPerKaigi 2020](https://phperkaigi.jp/2020/)で[ジェネレータの事例紹介](https://fortee.jp/phperkaigi-2020/proposal/5b1651a5-0a01-4b49-b338-e332f981bf5d)として出したので、ここで見せます。

## 要件

 * データベースから値を取り出してCSVにダンプしたい
    * レコード数 = とにかくいっぱい
    * 全レコードを1クエリで全部取得するのはメモリ量としてもDBの負荷としても許容できない
 * CSVは表計算ソフトで読み込ませる必要がある
    * 表計算ソフトという括りではExcelに限らず65535行以上のCSVを扱えるのは稀なので、ファイルには65534レコードごとにファイルを分割する。

## 実装

おいらは3重ループとか4重ループとか多重ネストさせるのは絶対に嫌なのでジェネレータで処理を分割しました。

```php
#!/usr/bin/env php
<?php

/**
 * 実行すると記事一覧を CSV として吐き出すスクリプト
 */

// 無限ループしないように最大値を明示
$limit = 100000;
$base_dir = __DIR__ . '/csv/';

// DBコネクション: 今回は使わないのでダミー値
$con = null;

/**
 * データベースからとってきた値を無限に吐き出すよ
 *
 * @return \Generator<array>
 */
$articles_generator = function (int $step) use ($con, $limit) {
    while (true) {
        $min = $min ?? 0;
        $max = $min + $step;

        // $min から $max までの区間のレコードを全取得
        $articles = fetch_db($con, $min, $max);

        foreach ($articles as $article) {
            yield $article['id'] => $article;
        }

        // デバッグ出力は STDERR に書き込む
        fwrite(STDERR, "{$article['id']}\n");

        if ($max >= $limit) {
            return;
        }

        $min += $step;
    }
};

/**
 * 65534 レコードごとに別のCSVファイルに書き込むジェネレータ
 */
$csv_generator = function ($header) use ($base_dir) {
    while (true) {
        $i = $i ?? 0;
        $i++;

        $path = $base_dir . "records-{$i}.csv";

        echo $path, PHP_EOL;
        $fp = fopen($path, 'w');

        if ($fp === false) {
            throw new LogicException("Open failure: {$path}");
        }

        // CSV ヘッダ行
        fputcsv($fp, $header);

        // ヘッダ行を抜いて 65534 レコード書き込む
        foreach (range(2, 65535) as $_) {
            $row = yield;

            fputcsv($fp, $row);
        }

        fclose($fp);
    }
};

// ジェネレータ初期化時にCSVのファイルヘッダ(カラム)を注入
$csv = $csv_generator(['id', 'name']);

// 1回のDBリクエストで1000レコードづつ処理する
foreach ($articles_generator(1000) as $id => $article) {
    // CSV 書き込み
    $csv->send([
        $article['id'],
        $article['name'],
    ]);
}

/**
 * ダミーのDB取得関数
 *
 * @return array<array{id:int,name:string}>
 */
function fetch_db($con, int $min, int $max): array
{
    return array_map(
        function ($id) { return ['id' => $id, 'name' => "dummy value {$id}"]; },
        range($min, $max - 1)
    );
}
```

## 雑感

 * 雑に`while (true)`とか書いてるけど、ちゃんと停止します
 * `$articles_generator`ではDBから値を取り出すことだけに専念します
 * `$csv_generator`はファイルに値を書き込むことだけに専念します
    * ジェネレータはこのように反復して呼び出される処理にも実はぴったりフィットします
    * [継続](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A)は力なり。継続万歳！
 * この実装だとユニットテストを書くにはちょっとだけ抽象化が足りてない感ありますね
    * 特にファイルに書き込むあたり
    * 動作確認できれば十分な書き捨てのスクリプトならこんなもんかな、と…
 * 無限ループって怖くね？
    * だって同じことが繰り返されるんだぜ？
       * それはどんなコードでもそう
       * 無限ループに落ちないように終了条件は十分検討が必要
 * 書き捨てじゃないコードならクラスで定義すればいいのでは？
    * それはそうかもしれない。
pyreboxの作法 その4

#概要

pyreboxの作法、調べて見た。
侵入検知、やってみる。

#方針

プロセスを監視して、あやしいの見つけたら、停める。

#写真


![Screenshot from 2020-02-16 06-27-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7fe0d6c6-6252-c169-beea-f5ade902352e.png)

#環境

host: debain 9.0 64bit
guest: windows xp sp3 32bit

#サンプルコード

calc.exeが見つかったら、shを呼ぶ。

```
from __future__ import print_function
from ipython_shell import start_shell
from api import CallbackManager

cm = None
pyrebox_print = None

def new_proc(params):
    '''
    Process creation callback. Receives 3 parameters:
    '''
    global pyrebox_print
    global cm
    pid = params["pid"]
    pgd = params["pgd"]
    name = params["name"]
    pyrebox_print("New process: %s" % (name))
    if name == "calc.exe":
        pyrebox_print("kenti sh call.")
        start_shell()

def initialize_callbacks(module_hdl, printer):
    '''
    Initilize callbacks for this module.
    '''
    global cm
    global pyrebox_print
    pyrebox_print = printer
    pyrebox_print("[*]    Initializing callbacks0")
    cm = CallbackManager(module_hdl, new_style = True)
    cm.add_callback(CallbackManager.CREATEPROC_CB, new_proc)
    pyrebox_print("[*]    Initialized callbacks0")

def clean():
    '''
    Clean up everything.
    '''
    global cm
    print("[*]    Cleaning module0")
    cm.clean()
    print("[*]    Cleaned module0")


if __name__ == "__main__":
    print("[*] Loading python module0 %s" % (__file__))



```

以上。
CentOS7環境下でPostgreSQL-12をPython3.6で使うためにpsycopg2をインストールする

# インストールエラーの背景
psycopg2をpipでインストールするとPython3でPostgreSQLにアクセスする。という記事を見かけます。

    # pip3 install psycopg2

などとしても、色々とエラーが表示されてインストールされません。
そこで、エラーメッセージ中に表示されていた

<http://initd.org/psycopg/docs/install.html>

にアクセスして方法を見つけましたので紹介します。

# マシンの環境

- CentOS Linux release 7.7.1908 (Core)
- pgdg12リポジトリによるpostgresql12.x86_64 12.2-1PGDG.rhel7
- baseリポジトリによるpython3.x86_64 3.6.8-10.el7

# 対処
Build prerequisitesに書かれていることを順に試してみます。


- gcc がインストールされていなければインストールする。  
    
        # yum install gcc

- python3-develがインストールされていなければインストールする。

        # yum install python3-devel

- libpq-devをインストールする。って書いてあるけど、これは、postgresql12-develになる。

        # yum install postgresql12-devel

- PATHに、pg_configの入っているディレクトリを指定する。

        # export PATH=/usr/pgsql-12/bin:$PATH

# 結果
これで、pip3でpsycopg2がインストールできる。

    # pip3 install psycopg2
    WARNING: Running pip install with root privileges is generally not 
    a good idea. Try `pip3 install --user` instead.
    Collecting psycopg2
      Using cached https://files.pythonhosted.org/packages/84/d7/6a93c99b5ba4d4d22daa3928b983cec66df4536ca50b22ce5dcac65e4e71/psycopg2-2.8.4.tar.gz
    Installing collected packages: psycopg2
      Running setup.py install for psycopg2 ... done
    Successfully installed psycopg2-2.8.4

# 確認
    # python3
    Python 3.6.8 (default, Aug  7 2019, 17:28:10)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
    Type "help", "copyright", "credits" or "license" for more 
    information.
    >>> import psycopg2
    >>> quit()
    #

これで、上手く、psycopg2がインストールできました。
viの移動系コマンド

vimの操作に慣れないので、逆引き用
<追記>少し古いけど便利そうな[チートシート](https://namaraii.com/files/vim-cheatsheet.pdf)があった。

###ノーマルモード

#### 文字単位
左 `h`
右 `l`
上 `k`
下 `j`
※数字との組み合わせ可能
`9j`なら9行分下へ、`4l`なら4文字分右

#### ワード単位
次の単語 `w`
前の単語 `b`
※数字との組み合わせ可能
`3w`なら3単語分次へ、`4b`なら4単語分前へ移動

#### 行単位
行頭 `0` または `^`
行末 `$`
任意の行 `:数字`　※`:6`ならファイルの6行目に移動

#### ページ単位
1ページ次 `ctl + f`
1ページ前 `ctl + b`
半ページ次 `ctl + d`
半ページ前 `ctl + u`

#### ファイル単位
ファイル先頭 `gg`
ファイル末尾 `G`

※　ちょっと編集についてのメモ
現在の行以降〜ファイル末尾までのインデントを一段深くする `>G`

###ビジュアルモード

基本的にノーマルモードと同じ。コピー時にはノーマルモードと同じく(選択して)`y`

矩形選択 `ctl + v`


|コマンド|結果|
|:----------------:|:-----------------:|
|h|1文字左|
|l|1文字右|
|k|1文字上|
|j|1文字下|
|w|1単語次|
|b|1単語前|
|ctl + f|1ページ次|
|ctl + b|1ページ前|
|ctl + d|半ページ次|
|ctl + u|半ページ前|
|0|行頭|
|^|〃|
|$|行末|
|:数字|指定行へ|
|gg|ファイル先頭|
|G|ファイル末尾|

参考
https://vim-jp.org/vimdoc-ja/index.html
https://vim.jp.net/bypurpose.html
https://vim.jp.net/setup_unix_setting.html
VScodeのremote developmentでTypescriptの開発を1秒で始められるコンテナを作ったよ

#はじめに
1秒はうそです｡
Microsoftが提供しているnodeJSのremote developmentテンプレートをもとにTypescript版を作成した｡
#開発環境
- ESlint
- Prettier
- VSCode:インデントが色つくやつ（indent-rainbow）
- インデントは4幅ハードタブ

# 使い方
以下のコマンドでリポジトリからクローンして､別のリポジトリに初期化します｡

```
git clone https://github.com/nakamuloud/vscode-remote-ts.git
mv vscode-remote-ts my-new-app
cd my-new-app
rm .git
git init
```

# devcontainer.jsonについて
情報が全然なかったので軽くまとめます


```json
{
	"name": "Typescript",
	"dockerFile": "Dockerfile",
	"service": "ts-dev",
	// Use 'appPort' to create a container with published ports. If the port isn't working, be sure
	// your server accepts connections from all interfaces (0.0.0.0 or '*'), not just localhost.
	"appPort": [
		3000
	],
	// Comment out the next line to run as root instead.
	"remoteUser": "node",
	"containerUser": "node",
	// Use 'settings' to set *default* container specific settings.json values on container create. 
	// You can edit these settings after create using File > Preferences > Settings > Remote.
	//VSCodeの設定はここにまとめる｡remote development上でVSCodeの設定をJSONで弄ろうとするとここを編集しろと言われる
	"settings": {
		"terminal.integrated.shell.linux": "/bin/sh",
		"editor.codeActionsOnSave": {
			"source.fixAll.eslint": true
		},
		"editor.renderWhitespace": "all",
		"editor.insertSpaces": false,
		"editor.renderLineHighlight": "all",
		"editor.formatOnSave": true
	},
	// Add the IDs of extensions you want installed when the container is created in the array below.
	//remote developmentをビルドするときに､インストールされる拡張機能
	"extensions": [
		"dbaeumer.vscode-eslint",
		"VisualStudioExptTeam.vscodeintellicode",
		"esbenp.prettier-vscode",
		"oderwat.indent-rainbow"
	]
}

```
例外が発生したら一定時間待機してからリトライする

JavaScriptではSleepに相当する処理が無いので気軽にリトライができない。async/awaitがあれば比較的簡単に解決できるが、IEにそのような機能は無い。

Promiseを使うことで解決できる。Promiseであれば[polyfillがある](https://github.com/stefanpenner/es6-promise)ためIEでも利用できる。

ただ、いざ書いてみると大変面倒だったためメモしておく。

```javascript
function retry(fn, opt){
    opt = opt || {};
    opt.times = opt.times || 3;
    opt.delay = opt.delay || function() { return 1000 }; // ExpornentialBackoff したいとき
    opt.abort = opt.abort || function() { return false }; // 中断したいときは true を返す
    opt.count = 0;
    opt.error = [];

    // 初回は即実行して欲しい
    var promise = new Promise(function(resolve,reject){
        var result;
        try{
            result = fn()
            resolve(result);
        }catch(e){
            opt.count++;
            opt.error.push(e);
            reject(opt);
        }
    });
    var i = 0;
    for(; i < opt.times; i++){
        promise = promise.catch(function(opt){
            // リトライは間隔を開けて欲しい
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    var result;
                    try {
                        if (opt.abort()) { return }
                        result = fn();
                        resolve(result);
                    }catch(e){
                        opt.count++;
                        opt.error.push(e);
                        reject(opt);
                    }
                }, opt.delay());
            });
        });
    }
    return promise;
}
```

以下の必ず例外を発生する関数を `retry` に投入すると、コンソールに1秒間隔で日付を6回(1+5回)表示し、最後に "fail" を表示する。

```javascript
function fail() {
    console.log(new Date());
    throw 1;
}
retry(fail, { times: 5 }).catch(function(e){ console.log("fail") })
```

一方で、例外を発生しない場合は日付が1回表示されて終了する。

```javascript
function pass() {
    console.log(new Date());
}
retry(pass, { times: 5 }).catch(function(e){ console.log("fail") })
```

更に、以下は途中で正常終了するため、コンソールには 1, 2, 3, pass が表示されて終了する。

```javascript
var i = 0;
function safe() {
    i++;
    console.log(i);
    if (i < 3) { throw 1 }
}
retry(safe, { times: 5 }).then(function(){ console.log("pass") }).catch(function(e){ console.log("fail") })
```

以上
414エラーに遭遇した話

## はじめに
あるWebシステムを開発中、HTTPの414エラーに遭遇したので、実際に出ることがあるということ忘れないためにメモしておきます。

## そもそもステータスコード414とは？
- 400番台ステータスコード
    - リクエスト失敗である場合のコード
- 414ステータスコード
    - URIが長過ぎるためにサーバーの処理可能範囲を超えている 

## なぜ起きたか
開発していたシステムではGETパラメータを多用している状況でした。修正を加えたところ、GETパラメータの値の文字列がかなり長くなってしまい結果414エラーが起きるケースが増えてしまいました。
つまり現状その414エラーは誰でもURLを長くすれば起こすことができるようになっています。
例えば、`https://test.com?a=a&a=a&a=a&a=a&a=a&a=a&a=a&a=a.........&a=a` のようなリクエストを送ると414エラーとなるということです。

# Apacheの設定
`LimitRequestLine `の設定でデフォルトではURLの長さは`8190 `となっています。
許容バイト数を長くすることもできますが、必要な数値に合わせるべきであるため異常に長くするのはよくないと思います。

## 対策
問題点としては以下がありました。
- 表示される画面がApacheのデフォルトのエラー画面
- ユーザーの通常の操作で起こりえてしまう（URLをユーザーが異常に長いURLに書き換えるとエラーになってしまうのは404エラーが起きてしまうのと同様のため問題ではない）

解決策としては、以下になります
- GETパラメータの長さが異常に長いのが原因だったため、POSTメソッドに変更してサーバに渡したいパラメータはメッセージボディで渡すことで、URLを短くする

## Apacheを使っているサイトはどこでもApacheのデフォルトに画面が表示
いくつかApacheを仕様していいるサイトを探して長いGETパラメータをつけたURLでアクセスするとやはりApacheのデフォルトの「Request-URI Too Large
」の画面が表示されました。
この画面は見えちゃっていいものなんですかね。。。
404エラーの場合は独自の404エラーページを表示していますが、414の場合もそういった画面が出るようにした方がユーザー的にはいいのかなと個人的に思います。

## 所感
WebサーバをApacheを利用しているサイトを探しましたが、なかなか見つかりませんでした。古そうであったり小規模な企業のサイトで使われている感じですかね。
nginxを利用している会社が多い感覚でした。今後もう少しWebサーバの知識を深めていきたいですね。