OmniAICreator/Qiita-1.07M huggingface dataset:
TWELITE で Lチカの続き(GPIO論理チェック)

「TWELITE で Lチカ」
https://qiita.com/nanbuwks/items/b9b5c16838d5d4626639
「TWELITE で Lチカの続き(シリアルUART出力)」
https://qiita.com/nanbuwks/items/7194db5680b65c9cc2bd

の続きです
「DIO - TWENET_JP」
https://sdk.twelite.info/hw-api-rifurensu/perifuraru/dio

には、
> 負論理について
TWELITE 無線マイコンにおいては、電源投入のリセット時のポート状態は High (Vcc) レベルになるため、TWELITE NET では原則として High(Vcc) レベルを 0, Lo(GND) レベルを 1 としています。


とあります。Lチカでは  vPortSetHi(LED); および vPortSetLo(LED); を使いましたが物理ピンのHigh,Lowとどのように対応しているでしょうか。

また、GPIOポートを読み込んだ時の論理と物理ピンのHigh,Lowとどのように対応しているでしょうか。

以下のコードで調べてみました。


```

#include <AppHardwareApi.h>
#include "utils.h"
#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"
#include "serial.h" 
#include "fprintf.h"
#define LED 12
#define INPUT 10
tsFILE sSerial0Stream;
static tsSerialPortSetup sSerial0;


static void vProcessEvCore(tsEvent *pEv, teEvent eEvent, uint32 u32evarg)
{
    bool_t inputdata;
    static int counter=0;
    if (eEvent == E_EVENT_TICK_TIMER) {      // 4ms timer
        counter++;
        if (  0 == counter % 1000 ) {
            vPortSetHi(LED);
            vfPrintf(&sSerial0Stream, "LED High\n\r");
            inputdata = bPortRead(INPUT);
            vfPrintf(&sSerial0Stream, "input=%d\n",inputdata );
        }
        if ( 250 == counter % 1000 ) {
            vPortSetLo(LED);
            vfPrintf(&sSerial0Stream, "LED Low\n\r");
        }
    }
}


void cbAppColdStart(bool_t bStart)
{
    if (!bStart) {
    } else {
        vPortAsOutput(LED);  // GPIO set
        vPortAsInput(INPUT);  // GPIO set
        ToCoNet_Event_Register_State_Machine(vProcessEvCore); // add Event handler
        // serial init

        static uint8 au8SerialBuffTx[32];
        static uint8 au8SerialBuffRx[16];

        sSerial0.pu8SerialRxQueueBuffer = au8SerialBuffRx;
        sSerial0.pu8SerialTxQueueBuffer = au8SerialBuffTx;
        sSerial0.u32BaudRate = 115200;
        sSerial0.u16AHI_UART_RTS_LOW = 0xffff;
        sSerial0.u16AHI_UART_RTS_HIGH = 0xffff;
        sSerial0.u16SerialRxQueueSize = sizeof(au8SerialBuffRx);
        sSerial0.u16SerialTxQueueSize = sizeof(au8SerialBuffTx);
        sSerial0.u8SerialPort = E_AHI_UART_0;
        sSerial0.u8RX_FIFO_LEVEL = E_AHI_UART_FIFO_LEVEL_1;
        SERIAL_vInit(&sSerial0);

        sSerial0Stream.bPutChar = SERIAL_bTxChar;
        sSerial0Stream.u8Device = E_AHI_UART_0;

        vfPrintf(&sSerial0Stream, "Hello World!\n\r");
    }
}

void cbAppWarmStart(bool_t bStart) { return; }
void cbToCoNet_vRxEvent(tsRxDataApp *psRx) { return; }
void cbToCoNet_vTxEvent(uint8 u8CbId, uint8 bStatus) { return; }
void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) { return; }
void cbToCoNet_vHwEvent(uint32 u32DeviceId, uint32 u32ItemBitmap) { return; }
uint8 cbToCoNet_u8HwInt(uint32 u32DeviceId, uint32 u32ItemBitmap) { return FALSE; }
void cbToCoNet_vMain(void) { return; }
```


# 結果


|物理ピン状態|出力命令|bPortRead(INPUT); の取得値|
|:---:|:---:|:---:|:---:|
|High|vPortSetHi(LED);|0|
|Low|vPortSetLo(LED);|1|
cygwin で docker のコンテナ内シェルを使う [docker exec -it bash]

# cygwin で docker のコンテナ内シェルを使う
### 環境
- windows10
- cygwin
- Docker Desktop CE for Windows

## 概要
そのままでは動かなかったので忘備録として残すことに。

* 以下のように apt-cyg でエラーが出る場合は更新する

```console
$ apt-cyg install gcc-g++
Cache directory is /packages
Mirror is http://mirrors.kernel.org/sourceware/cygwin
--2020-09-10 17:31:34--  https://cygwin.com/key/pubring.asc
cygwin.com (cygwin.com) をDNSに問いあわせています... 8.43.85.97
cygwin.com (cygwin.com)|8.43.85.97|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3049 (3.0K) [text/plain]
`/tmp/tmp.2B5Pa48nYk' に保存中

/tmp/tmp.2B5Pa48nYk                               100%[=============================================================================================================>]   2.98K  --.-KB/s 時間 0s

2020-09-10 17:31:35 (12.5 MB/s) - `/tmp/tmp.2B5Pa48nYk' へ保存完了 [3049/3049]

TRUSTEDKEY_CYGWIN: FAILED: Hash does not match https://cygwin.com/key/pubring.asc.
Error: TRUSTEDKEY_CYGWIN has been updated, maybe. But sometimes it may has been cracked. Be careful !!!
at : /usr/local/bin/apt-cyg: fetch_trustedkeys: 745

```

* winpty が入っていない場合は winpty のインストールをする

```console
$ docker exec -it busy_williamson bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
```

## apt-cyg の更新
- apt-cyg を download

```console
$ cd /usr/local/bin
$ wget https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
--2020-09-10 17:39:36--  https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.108.133
raw.githubusercontent.com (raw.githubusercontent.com)|151.101.108.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68542 (67K) [text/plain]
`apt-cyg.1' に保存中

apt-cyg.1                                         100%[=============================================================================================================>]  66.94K  --.-KB/s 時間 0.03s

2020-09-10 17:39:48 (2.40 MB/s) - `apt-cyg.1' へ保存完了 [68542/68542]
```

- apt-cyg の入れ替え

```console
rm apt-cyg
mv apt-cyg.1 apt-cyg
chmod +x apt-cyg
```

## winpty のインストール
- gcc-g++, mingw64-x86_64-gcc-g++ のインストール

```console
$ apt-cyg install gcc-g++
$ apt-cyg install mingw64-x86_64-gcc-g++
```

- winpty のインストール

```console
$ mkdir winpty （ダウンロードするディレクトリ、適宜用意してください）
$ cd winpty

$ wget https://github.com/rprichard/winpty/archive/master.zip
$ unzip master.zip

$ cd winpty-master/
$ ./configure
$ make
$ make install
```
## docker exec -it bash 
- コンテナコンソール利用

```console
winpty docker exec -it busy_williamson bash
```


以上、お疲れさまでした！
findで検索したファイルを消すのは-deleteが良い

#はじめに
データベースからバックアップしたファイルを検索し、削除するシェルスクリプトを書くタスクがありました。
ファイルを検索するにはfindコマンドがあることは知っていましたが、検索→削除までを一括で行うコマンドはないかと調べていたので、まとめます。

#-exec というアクションがあるらしい
僕が求めていた、検索→削除までを一括で行うコマンドをググっているうちに-execアクションを実行すれば良いというサイトが多く出てきました。

こんな感じですね。

```html:sample
# find /ディレクトリ/~ -exec ls -l {} \;
```

ほぼ全てのサイトがこの書き方だったんだけど、よくわからなかったです。

#-deleteという簡単なコマンドがあるらしい
会社の先輩に聞きました。末尾に-deleteオプションを付ければ良いらしいです。

```html:sample
# find /ディレクトリ/~ -delete;
```

こっちのほうが簡単ですね。

以上です。
UVLayoutを使ってオブジェクトを敷き詰める

![UVlayout00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669759/a7e38d6a-9f79-493f-f486-96c99642f74d.jpeg)
UVLayoutはUVだけでなく裏技的な使い方で、オブジェクトを敷き詰めるのに使えます。

参考: 
「Houdini 17 Quicktip: (Ab)Using The UV Layout SOP For Geometry Packing」
https://vimeo.com/296292351


Entagmaさんのチュートリアルを参考に試してみました。

![UVlayout02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669759/4021e7b1-e077-687c-37b0-3f60d1ecec7a.jpeg)
こんな感じのオブジェクト（重なっているので実際はもっとたくさんあります）を円形の地面に敷き詰めます。
オブジェクトは平面でなくても、なんでも良いようです。適当に並べておけばOKです。

![node.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669759/101b5d9f-e0b8-1549-2607-ea13f0a933d1.jpeg)
ノードはこんな感じ。
敷き詰めるオブジェクトを第1インプット、地面の形状（ここでは円形）を第2インプットに繋ぎます。


![UVlayout01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669759/57e9f8bf-0e55-53aa-a8ca-d020b87e17ae.jpeg)


UVLayoutの**UV Attributeの「uv」を「P」に変える。**その横の「XY Projection」を変えることで向きを指定。
ここでは「ZX Projection」に変えて上を向くようにします。

これだけだと1x1の大きさの正方形に収まるように調整されるので、第2インプットの形状にあわせて並べるように設定します。

**「Targets」 の「Pack Into」を「Islands From Second Input」に設定。
その下のUV Attributeも「P」に変え、その横の「XY Projection」を「ZX Projection」に変えます。**
C++&Win32 API 現在のスレッドのスタック情報を取得する

C/C++では変数はいくつかのメモリ領域に確保されますが、ローカル変数の多くはスタックに確保されます。このスタックの情報、特に現在のスレッドのスタック情報を取得するにはWin32 APIの`GetCurrentThreadStackLimits`関数が利用できます。

```cpp
void GetCurrentThreadStackLimits(
  PULONG_PTR LowLimit,
  PULONG_PTR HighLimit
);
```

[GetCurrentThreadStackLimits function (processthreadsapi.h) - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits)

この関数はスタックのアドレス下限`LowLimit`と上限`HighLimit`を返すので、その差`HighLimit - LowLimit`からサイズが得られます。これをC++&STLで実装したコードを以下に示します。

```cpp
// Win32 APIで現在のスレッドのスタックのアドレス上限・下限とサイズを取得する。
//

#include <iostream>
#include <iomanip>

#define STRICT
#define NOMINMAX
#include <Windows.h>

int main()
{
	// UNICODEの有効化
	// locale::ctypeは数値出力時のカンマ非表示に必要
	std::wcout.imbue(std::locale("", std::locale::ctype));

	ULONG_PTR lowLimit, highLimit;
	GetCurrentThreadStackLimits(&lowLimit, &highLimit);
	auto size = highLimit - lowLimit;
	std::wcout << L"スタックのアドレス下限：0x" << std::setw(16) << std::setfill(L'0') << std::hex << lowLimit << std::endl;
	std::wcout << L"スタックのアドレス上限：0x" << std::setw(16) << std::setfill(L'0') << std::hex << highLimit << std::endl;
	std::wcout << L"スタックのサイズ：0x" << std::setw(16) << std::setfill(L'0') << std::hex << size << L"(" << std::dec << size << L")" << std::endl;

	int a = 0;
	ULONG_PTR pa = reinterpret_cast<ULONG_PTR>(&a);
	std::wcout << L"ローカル変数aのアドレス：0x" << std::setw(16) << std::setfill(L'0') << std::hex << pa << std::endl;
	std::wcout << L"aがスタックに含まれる：" << std::boolalpha << (lowLimit <= pa && pa <= highLimit) << std::endl;

	return 0;
}
```
Go言語で kintoneアプリのフィールド情報をCSV出力するコマンドラインツールを作った話し

Go言語の自習の仕上げに、[yaclik](https://github.com/sy250/yaclik) という小さなコマンドラインツールを作ったのでその紹介です。

kintoneアプリからレコードを取得・登録などを行う、Go言語で書かれたコマンドラインツールに、cli-kintoneがあります。

https://github.com/kintone/cli-kintone

今回試しに作ったのは、kintoneアプリの[フィールド情報](https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields)をAPIで取得して、CSV形式でターミナルに表示するだけのツールです。
それ以上のことは何も出来ないのですが:sweat_smile:、kintoneアプリのフィールド一覧がドキュメントで必要になった時には使えるかと思います。

出力できる情報は下記の３つだけです。

1. フィールドコード
2. フィールド名称
3. フィールドタイプ

一応テーブル内のフィールドにも対応していますが、その際のフィールドコードにプレフィックスとして

`~SUBTABLE~<フィールドコード>` のように表示します。

必要に応じて、CSVファイルに出力した後に編集ください。:bow_tone1:

ファイルは下記に置いてあります。

https://github.com/sy250/yaclik

ビルドしたバイナリファイルもリリースにアップしていますが、Mac版のみです。

Windowsで試されたい方はソースからビルドいただければと思います。


# 使い方
Macの場合です。

下記からバイナリファイルをダウンロードします
https://github.com/sy250/yaclik/releases

適当なディレクトリにて実行します。
`./yaclik -h`でコマンドライン引数を表示します。

```text
Usage of ./yaclik:
  -a string
    	App ID (default "0")
  -d string
    	Domain name
  -n string
    	User login name
  -o string
    	Output format (default "csv")
  -p string
    	User login password
```

`-o json`でJSON形式で出力します。

## 出力サンプル
kintoneの顧客サポートパックにある、問い合わせ管理アプリの情報を出力しています。

```
$ yaclik -a <APP_ID> -d <SUB_DOMAIN> -n <USER_ID> -p <USER_PASSWORD>
field_code,label,type
レコード番号,レコード番号,RECORD_NUMBER
更新日時,更新日時,UPDATED_TIME
カテゴリー,カテゴリー,CATEGORY
対応詳細,対応詳細,SUBTABLE
~SUBTABLE~対応内容,対応内容,MULTI_LINE_TEXT
~SUBTABLE~添付ファイル,添付ファイル,FILE
~SUBTABLE~対応日時,対応日時,DATETIME
電話番号,電話番号,LINK
作成日時,作成日時,CREATED_TIME
ご担当者名,ご担当者名,SINGLE_LINE_TEXT
詳細,詳細,MULTI_LINE_TEXT
更新者,更新者,MODIFIER
作成者,作成者,CREATOR
問い合わせ種別,問合せ種別,RADIO_BUTTON
ステータス,ステータス,STATUS
対応状況,対応状況,DROP_DOWN
受付日時,受付日時,DATETIME
対応担当者,対応担当者,USER_SELECT
期限,期限,DATE
作業者,作業者,STATUS_ASSIGNEE
ルックアップ,会社名,SINGLE_LINE_TEXT
```

# 少し便利な使い方
Macでは、引数を別のシェルスクリプトにしてあげたり、作成するファイル名もファイルに一覧として登録すると便利だと思います。

出力するファイル名の一覧として下記を用意

```file
1-顧客台帳.csv
2-問い合わせ管理.csv
```

ドメインやログイン情報として下記を用意

```env.sh
export DOMAIN=<サブドメイン>
export APP_ID=<ログインID>
export PASSWORD=<パスワード>
```

```bat.bash
for file in `cat list`
do
  echo "$file"
  [[ ${file} =~ ^([0-9]+)-(.*)$ ]];
  app=${BASH_REMATCH[1]}
  ./yaclik -a ${app} -d $DOMAIN -n $APP_ID -p $PASSWORD | nkf -Ws > ${file}
done
```
Laravelでcreateを実行してもカラムの値がNULLになってしまうときの解決策

## 問題
- `Laravel`で`create`を実行したが、値を指定したのに挿入される値は`NULL`になっていた。
- `Laravel`で`create`を実行した際、**`SQLSTATE[HY000]: General error: 1364 Field (カラム名) doesn't have a default value`**が発生した。

## 解決策
**モデルを見直す**

自分の場合、モデルで該当のカラムを`$fillable`の対象に記入していなかった。

```app\Model.php
class Model extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 
    //(ここにcreateを実行してもNULLになってしまっていたカラムを指定する)
    ];
```

### 原因
`Laravel`では、モデルを通して`create`などを利用しデータベースにレコードなどを保存する際、悪意あるユーザーが勝手にカラムなどを作成し、その人が実質上の管理者とならないように管理者を保護する機能が標準で備わっている。
そのため、`$fillable`などで`create`で作成、挿入する対象のカラムを指定しないと、`Laravel`が悪意あるユーザーかもしれないと思ってしまい、自動で`NULL`を入れて保護してしまうことが原因だった。

**`create`などでデフォルトの値を設定していないカラムは、`$fillable`などで保護するのを忘れないようにしよう!!**

## 参考資料

- [【Laravel】DBにデータを保存する方法。createとinsertの違いなど](https://qiita.com/katsunory/items/87a73297f44a65f1474f)
aws構成図を作成するため graphviz + diagrams の vscode の環境を chocolateyで30分ぐらいで作る

# はじめに
AWSのシステム構成図を書くのにdiagramsといういいツールがあるというので環境作成した時のメモです
30分ぐらいでできます。

## 環境
windows10 pro

### 順番
1. chocolatey インストール
2. graphviz インストール
3. python インストール
4. diagrams インストール
5. vscode インストール

## 1. chocolatey インストール
powerShell を管理者モードで起動します
(スタートメニューの上で右クリック)

`Get-ExecutionPolicy` を `AllSigned` にします

```
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\lunar> Get-ExecutionPolicy
Restricted

(↑ Restricted なので、AllSigned に設定します)

PS C:\Users\lunar> Set-ExecutionPolicy AllSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"):A
PS C:\Users\lunar> Get-ExecutionPolicy
AllSigned
PS C:\Users\lunar>
```

chocolateyをインストールします

```
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

おわり


## 2. graphviz インストール
powerShell で実行します

```
choco install graphviz -y
```
おわり

## 3. python インストール
powerShell で実行します

```
choco install python -y
```

commandプロンプトを起動して確認します

Win + r で cmd と入力してエンター

```
>python --version
Python 3.8.5
```

おわり

## 4. diagrams インストール

commandプロンプトで実行します。

```
pip install diagrams
```
おわり

## 5. vscode インストール
powerShell で実行します

```
choco install vscode -y
```

### 5.1 settingsでpythonのpathを設定する

※ 個々の環境に合わせます。choco で何も指定せずにインストールしていたら下記になります。

```
{
    "python.defaultInterpreterPath": "C:\\Python38\\python.exe",
}
```

### 5.2 エクステンションを追加する
下記の Python extension for Visual Studio Code を追加します。
https://marketplace.visualstudio.com/items?itemName=ms-python.python


おわり



## 動作確認

クラスメソッドさんの記事のコードを使います

Diagramsを使ってPythonでシステム構成図を描く
https://dev.classmethod.jp/articles/diagrams-introduction/


vscodeを起動して上記の sample.py をコピペして実行すると下記ができました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128663/1fadd3aa-30a2-5cae-c9a4-5a3a247bc853.png)


以上で完了です。
CI/CDとは ~備忘録~

### CI/CDとは
CI/CDは簡単に言うと「構築・テスト・デプロイ」を自動化するシステムのことです。CI/CDを使うと、コードの変更が発生するたびに自動でテストが行われるため、テスト実行のしわすれ、環境依存のテストをなくすことでの品質を向上させることができます。しかし、テストの自動化と言っても、CI/CDサービスやツールが自動でテストを作成してくれるわけではないです。あくまで、実行するテストは自分たちで書く必要があり、CI/CDは主にそれらを任意のタイミングで自動で実行してくれるものになります。CI/CDはアジャイル開発の浸透と発展に伴って普及し始めている。アジャイル開発はプロダクトを少しずつ開発していく手法のこと。アジャイル開発で重要なことはスピードになります。いかに早くテスト・デプロイを行うかがアジャイル開発のカギとなる。これをCICDを使用する事で実現することが出来る。


・CI(Continuous Integration)とは
CI(継続的インテグレーション)とはチームメンバーが頻繁に作業を統合するソフトウエアの開発手法です。通常は各人が少なくとも毎日統合を行い、1日に複数の統合を行うことになります。各統合は自動的にビルド・テストによって検証され、統合エラーを早く検出します。これにより統合の問題が大幅に減少し、チームで迅速にソフトウエアを開発することができる。このCI（継続的インテグレーション）を実現するには、CIツール（サーバー）が利用されます。有名なCIサーバーとしてJenkinsがある。
流れとしては、開発者がVCS(Version Control Systems：バージョン管理システム(Gitなど))に変更をコミット→コミットをトリガーにしてCIサーバーが変更を検知→CIサーバーがVCSからソースコード・リポジトリの内容をコピー→CIサーバーが指定されたワークフローを実施→必要に応じてチャットやメールで進捗状況がアップデートされるといった感じです。
利点としては、1日に何度もインテグレーションすることでリスクを低減することができ、バグや不具合というのがインテグレーションのたびに発見され修正が行われる。そののため、チーム全体が常に最新のソースコードにアクセスすることができる。


・CD（Continuous Delivery/Deployment）とは
CD(継続的デリバリー)はCI(継続的インテグレーション)を拡張した手法でビルドやテストだけでなくリリースプロセス全体を自動化する。リリースのスピードを上げることで素早く市場からフィードバックを得ることが出来、ソフトウエアに反映させることが可能。Deliveryは本番環境に自動的にデプロイする「前まで」を自動化し、Deploymentは本番環境に自動的にデプロイするまでのことです。そのためCDはアプリケーションの構築・デプロイ・テスト・リリースのプロセスを自動化するプロセスのことになります。最終的にデプロイする判断はビジネス側になるため、本番環境へのデプロイの前にビジネス側のテストや品質チェックが行われる。





<参考にさせていただいたサイト>
<a href = "https://www.youtube.com/watch?v=T-lk2cPGI7s">猿でもわかる CI/CD</a>
ActionController::UnknownFormat in 〇〇Controller#アクション名

■環境
rails', '~> 5.2.4'

ECサイトを作成中に起きた初めてのエラーでした。
備忘録も兼ねて記載致します。

indexのページからshowページへ遷移しようとすると下記のエラーが！

![スクリーンショット 2020-09-10 17.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660239/1582482f-c727-d54e-2129-aeab25ea72cb.png)

結論としては超超初歩的なミスでした…

![スクリーンショット 2020-09-10 17.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660239/fb76c55b-a60d-6d19-2d9c-2835cf00fb1f.png)

「show.htmel.erb」　→「show.html.erb」へ修正し、無事解決しました。

恐らく、同様のエラーが出ている方はページ作成が出来ていないか、もしくは私のようにページの名前にミスがある可能性が高いのでよくご覧ください。

簡単な内容ですが以上となります。
リストで利用できるメソッド

#リストで利用できるメソッド
リストには、sort()の他にも便利なメソッドが定義されています。
よく使われるメソッドについて、簡単に解説します。

* l.reverse()メソッド：並び順を逆にする

リストの中身をすべて逆順で返す
reverse()
>l = [o,l,l,e,h]
>print(l.reverse())

reversed()
リストの並び順を反転します。
元のオブジェクトには何の影響も与えないとのことなのでreversed()を使うのが良いのではないかと思います。
>list_A = [o,l,l,e,h]
 
>for x in reversed(sample_list):
>    print(x)

l.reverse()を調べた結果からいうとリストの文字列を反転したいだけならスライスのほうが、安全そうでした。
[::-1]を使用すると逆順のリストが帰ってきます。なので、文字列リストを反転する場合は以下の様な形になります
>print([o,l,l,e,h][::-1])

* append()メソッド：末尾に追加する

L.append(追加する要素)
末尾に要素を追加したい場合に使用する
>list_A
>[h, e, l, l, o]

>list_A = [h, e, l]
>list_A.append([l, o])

>list_A
>[h, e, l[l, o]]


* extend()メソッド：末尾にシーケンスを追加する

L.extend(追加するシーケンス)
一つのリストの末尾に追加したい場合にextend()メソッドを使用する。
要素を追加したい場合に使用するとエラーが発生するのです注意
>list_A = [h, e, l]
>list_A.extend([l, o])

>list_A
>[h, e, l, l, o]

* remove()メソッド：要素を削除する

L.remove(取り除く要素)
リストLのなかから取り除く要素を探し出し、要素をL自体から削除します。
>l = ['h, e, l, l, o]

>l.remove(‘h’)
>print(l)

> ['e, l, l, o']

引数として指定された要素が見つからない場合は、例外（エラー）を発生します。
>l = ['h, e, l, l, o]

>l.remove(‘a’)
>print(l)

>ValueError: list.remove(x): x not in list
【React Native】TextInputにselectionColorを設定するとAndroidで文字が見えなくなる

# 前提
- React Native 0.62.2

# 問題
- カーソルの色をカスタマイズしようと、TextInputにselectionColorプロパティを設定すると、Androidでは透過が起きず、文字が見えなくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224815/c1240799-570c-f1d8-1ed4-57e087a4b0a8.png)

# 解決方法
- 以下のように半透明の色を直接指定する

```js
selectionColor='rgba(0, 0, 0, 0.5)'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224815/58b4f315-3aaa-007e-8b54-cc73d159df3f.png)

# 参考文献
- https://stackoverflow.com/questions/54368090/how-to-make-selectioncolor-prop-in-textinput-transparent
javascript関数ドリル　初級編zipObject関数の実相のアウトプット

## zipObject関数の課題内容

詳細はこちら
　　　↓
https://js-drills.com/blog/zipobject/

##zipObject関数の取り組む前の状態
関数は断片的にはわかっているが、どんな関数の種類などわからない状態
##zipObject関数に取り組んだ後の状態
オブジェクトに文字列を入れるときは []になることを忘れていたので思い出せてよかった
##zipObject関数の実装コード（答えを見る前）
自力では全然わかりませんでした
##zipObject関数の実装コード（答えを見た後）
```js
function zipObject(props = [], values = []) {
  const zippedObject = {};
  for(let i = 0; i < props.length; i++) {
    const prop = props[i];
    const value = values[i];
    zippedObject[prop] = value;
  }

  return zippedObject;
}

console.log( zipObject(['a', 'b'], [1, 2]) );
// => { 'a': 1, 'b': 2 }

```
【ターミナル改造⑧】zinitでzshで利用できるRustツール一式を用意

## はじめに
- Macの標準シェルとなったzshを拡張するためのプラグイン管理として[oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)を利用していたが、動作の観点で[zinit](https://github.com/zdharma/zinit)という軽量のツールへ変更。
- 同時に、普段利用しているRust製コマンドツール([ripgrep](https://github.com/BurntSushi/ripgrep)や[exa](https://github.com/ogham/exa))の管理も行えることが判明。
- そこで、今回の記事ではzinitの導入・ツール設定方法を記述していく。

## 環境
- Mac OS X 10.15.6

## 手順

### zinitインストール
- 手元の環境に、[zinit](https://github.com/zdharma/zinit)(軽量で高速なzshプラグイン管理ツール)を、以下のコマンドでインストールする。
- **※zinitの基本使用やその他プラグインの利用は[こちらを参考](http://zdharma.org/zinit/wiki/INTRODUCTION/)**

```zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
```

- コマンド入力後、`~/.zshrc`に以下の内容が自動入力されるため、確認する。

```zsh
### Added by Zinit's installer

#省略

source "$HOME/.zinit/bin/zinit.zsh"
autoload -Uz _zinit
### End of Zinit's installer chunk
```

- 以下のコマンドで確認。

```zsh
zinit self-update
```

### 利用ツール選定
- 今回、zinitで管理するRust製コマンドツールは以下。
  - [ripgrep](https://github.com/BurntSushi/ripgrep)
      - 高速grep代替ツール
  - [exa](https://github.com/ogham/exa)
      - 高速ls代替ツール
  - [bat](https://github.com/sharkdp/bat)
      - 高速cat代替ツール
  - [fd](https://github.com/sharkdp/fd)
      - 高速find代替ツール

### zshrc設定
- 利用ツール選定完了後、以下のプラグイン内容を`.zshrc`へ記述
    - **※[2021/10/11追記]ripgrepのインストールに関して、@noraworld さんからの[コメント](https://qiita.com/t_o_d/items/983d2c6a29c0d3e46a75#comment-005e6b5d8a7d690bc835)の通りM1 MacやRaspberry Pi 4では以下の方法では利用できないため、「方法2」のやり方をお試しください。**

```zsh
### Added by Zinit's installer
# 省略
### End of Zinit's installer chunk

# ripgrep
# 「方法1」
zinit ice as"program" from"gh-r" mv"ripgrep* -> rg" pick"rg/rg"
zinit light BurntSushi/ripgrep
# 「方法2」
# if [ "$(uname -i)" = "aarch64" ]; then
#  zinit ice from"gh-r" as"program" bpick"*aarch64-unknown-linux-gnu*" pick"rg"
#  zinit light microsoft/ripgrep-prebuilt
# elif [ "$OSTYPE" =~ "darwin" ]; then
#  zinit ice from"gh-r" as"program" bpick"*apple-darwin*" pick"rg"
#  zinit light microsoft/ripgrep-prebuilt
# fi

# exa
zinit ice as"program" from"gh-r" mv"exa* -> exa"
zinit light ogham/exa

# bat
zinit ice as"program" from"gh-r" mv"bat* -> bat" pick"bat/bat"
zinit light sharkdp/bat

# fd
zinit ice as"program" from"gh-r" mv"fd* -> fd" pick"fd/fd"
zinit light sharkdp/fd

# alias設定は適宜
# alias ls='exa'
```

- 記述後、保存してターミナルで、以下のコマンドで読み込み。

```zsh
source ~/.zshrc
```

- ツールのダウンロードが始まるため、終了後に各種コマンドを入力。
- 確認できたら完了。

## 参考
- [Github](https://github.com/zdharma/zinit)
- [ドキュメント](http://zdharma.org/zinit/wiki/)
- https://github.com/zdharma/zinit/issues/278
GASのcalendarで「CalendarApp.Calendar.createEventのメソッドのシグネチャと一致しません」というエラーが出る問題の解決方法



```
CalendarApp.Calendar.createEventのメソッドのシグネチャと一致しません。
```

というエラーが出てしまう問題について、原因を調べた所

createEventの第２引数、第３引数のデータ型は本来Dateオブジェクトである必要がある。

自分はここで文字列形式のデータになってしまっていたので、date型に修正すると
期待通り動作した。
【symfony4】ユーザー認証の実装

#UserEntityの作成

## UserInterface,\Serializableを継承
```
/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @UniqueEntity("email")
 */
class User implements UserInterface,\Serializable
{
     /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;
    
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $password;

    /**
     * @ORM\Column(type="integer")
     */
    private $userRoll;
    
    /**
     * @ORM\Column(type="string", length=255,unique=true)
     */
    // ユニークキーの設定
    private $email;

    public function serialize()
    {
        return serialize([
            $this->id,
            $this->email,
            $this->password,
            $this->userRoll,
            ]);
    }

    public function unserialize($serialized)
    {
        list($this->id,
            $this->email,
            $this->password,
            $this->userRoll
            ) = unserialize($serialized,['allowed_classes'=>false]);
    }

    public function eraseCredentials()
    {}

    public function getSalt()
    {
      return null;
    }

    
    public function getRoles()
    {
        return [$this->getUserRoll()];
    }

    public function getUsername()
    {}
}
```
# コントローラー
## ユーザー作成
```
   /**
     * ユーザー登録
     * 
     * @param Request $req
     * @param UserPasswordEncoderInterface $passwordEncoder
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function create(Request $req,UserPasswordEncoderInterface $passwordEncoder)
    {
        $form = $this->createForm(UserType::class, $user);

        $form->handleRequest($req);

        if ($form->isSubmitted() && $form->isValid()) {

            $password = $passwordEncoder->encodePassword($user, $user->getPassword());
            $user->setPassword($password);

            $manager = $this->getDoctrine()->getManager();
            $manager->persist($user);
            $manager->flush();


            return $this->redirectToRoute(
                'admin_user_find' , [
                    'id' => $user->getId(),
                ]);
        }
        return $this->render($this->twig_base . 'create.html.twig', [
            'form' => $form->createView()
        ]);
    }
```
Nuxt.jsでFacebook Customer Chatを導入

思ったより情報が落ちてなかったので、残しておきます。

Customer Chat Pluginとは名の通りFacebookページに顧客からチャットが飛ばせるよっていう仕組みで、こんな感じのMessengerアイコンがサイトに表示されるようになります。

![スクリーンショット 2020-09-10 16.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/b1215eb3-c36c-09df-e639-fca9e70ff630.png)


## FBページからCustomer Chatの設定

最近UIが変更されたので、ちょっとわかりやすくなったかもしれません。

ページの左側にあるメニューから、設定を選択
![スクリーンショット 2020-09-10 17.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/5d4e0bb7-a2a9-33dc-bf43-1583bc564444.png)

メッセージを選択
![スクリーンショット 2020-09-10 17.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/96a014ea-4fb0-8704-240b-7c5ea72a32bc.png)

半分より下くらいに、 `ウェブサイトにMessengerを追加` とのメニューが表示されるので、利用を開始ボタンを押します。
![スクリーンショット 2020-09-10 17.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/ff359fed-39b7-a92b-645d-882ad69321ca.png)

そうすると、stepダイアログみたいな表示になるので最後まで進めます。
最後にスニペットがでてくるので、コピペしておきましょう。
![スクリーンショット 2020-09-10 17.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/9630dad4-bb38-ecab-e849-458365c3defc.png)

## Nuxt側の設定

ぺたっとスニペットを貼り付けるだけだと楽なんですけど、実際にフレームワーク使ってるとそうはいかなかったりしますよね。

ここではPluginとして読み込んでいきたいと思います。

### pluginファイルの作成

さっきのスニペットを以下のように書きます。

ここはVueインスタンスで利用できるようにしてますが、Injectしても良さそうですね。

```json
  import Vue from = 'vue'

  const vueFb = {}
  vueFb.install = function install(Vue, options) {
    (function (d, s, id) {
      var js
      var fjs = d.getElementsByTagName(s)[0]
      if (d.getElementById(id)) { return }
      js = d.createElement(s)
      js.id = id
      js.src = 'https://connect.facebook.net/en_US/sdk/xfbml.customerchat.js'
      fjs.parentNode.insertBefore(js, fjs)
    }(document, 'script', 'facebook-jssdk'))

    window.fbAsyncInit = () => {
      window.FB.init(options)
      Vue.FB = window.FB

      // ここでEventのSubscribeしておくと、ハンドリングがやりやすかったりします
      // FB.Event.subscribe ~
    }
    Vue.FB = undefined
  }

  Vue.use(vueFb, {
    appId: YOUR FACEBOOK ID,
    autoLogAppEvents: true,
    xfbml: true, // ここをfalseにすると任意のタイミングでParseすることができます (表示) 
    version: Graph API Version (v3.3 etc)
  })  
```

### nuxt.config.jsの追加

clientだけでいいと思うので、modeはclientで指定しています。

```json
plugins: [
    { src: "~/plugins/fb.js", mode: 'client' },
```

### 任意の場所にhtmlを追加

Ex. default.vue

```json
<template>
  <div id='app'>
    <nuxt/>
    <div class="fb-customerchat"
      :page_id="YOUR PAGE ID"
      theme_color="#0084ff">
    </div>
  </div>
</template>
```

これで終わりです。


## まとめ
導入はめちゃくちゃ簡単ですね！

まだ安定していませんが、無料でChatサポートができるので個人で開発している方とかはかなりいいんじゃないかなと思います。
もし何かできない、動かないってなった場合はお気軽にDMで質問してください。
javascriptの基礎(whileとfor)

## はじめに
以下のサイトを使用し、javascriptを学習しています。
[現代の JavaScript チュートリアル](https://ja.javascript.info/)

以下、備忘録として残します。

## 用語
> #### イテレーション
  - ループ本体1回の実行のこと
 
## whileとfor
> ## whileループ
> - condition が true の間、ループの本体の code が実行される
> - 下のループは i < 3 の間、i を出力する
>
```javascript
let i = 0;
while (i < 3) { // 0, 次に 1, 次に 2 を表示
  alert( i );
  i++;
}
//ループは3回イテレーション
//i++がない場合永遠に繰り返される
```
> ## forループ
> - 下のループは 0 から 3 までalertを実行する
>
```javascript
for (let i = 0; i < 3; i++) { // 0, 次に 1, 次に 2 を表示
  alert(i);
}
```
> #### forループの動き
  - `begin`	(i = 0)	ループに入ると1度実行される
  - `condition` (i < 3) すべてのループのイテレーションの前にチェックされる、もしも false の場合ループを停止
  - `step` (i++) 各イテレーションで、条件チェックの前に本体の後に実行される
  - `body` (alert(i)) 条件が真の間繰り返し実行される
 
> #### ループ処理のアルゴリズム(とても分かりやすい考え方)
>
```javascript
begin を実行
→ (if condition → body を実行し step を実行)
→ (if condition → body を実行し step を実行)
→ (if condition → body を実行し step を実行)
```

> #### インライン変数宣言
- ループの中だけで使える変数
>
```javascript
for (let i = 0; i < 3; i++) {
  alert(i); // 0, 1, 2
}
>
alert(i); // エラー, そのような変数はありません
```
- ループの外で変数宣言していれば、ループ外からでも使える
>
```javascript
let i = 0;
>
for (i = 0; i < 3; i++) { // 既存の変数を使用
  alert(i); // 0, 1, 2
}
>
alert(i); // 3, ループの外で宣言されているので使える
```

> #### 省略もできる、書き方
> - beginを省略
>
```javascript
let i = 0; // すでに i を宣言し代入済み
>
for (; i < 3; i++) { // "begin" 不要
  alert( i ); // 0, 1, 2
}
```

> - stepを省略
>
```javascript
let i = 0;
>
for (; i < 3;) {
  alert( i++ );
}
```

## break(ループを終わらせる)
> 通常ループは条件が偽になると停止するが、breakディレクティブでループから出ることを強制できる
>
```javascript
let sum = 0;
>
while (true) {
  let value = +prompt("Enter a number", '');
  if (!value) break; // 
  sum += value;
}
>
alert( 'Sum: ' + sum );
```
WSL2上のDockerでMySQLを構築する際のpermissionsの対策

# 前書き
WSL2 MySQLで検索してもなかなかpermissionの解決方法が見つからずにハマった人の為に記載する。（どいつもこいつもWindowsのDockerとリンクしやがって・・・GPU使わんのかい！）

# 環境

- Windows10 Insider Preview 2004(20206.1000)
- 4.19.128-microsoft-standard
- Ubuntu 20.04 LTS

# 現象
``docker-compose up -d``でコンテナ起動をさせると以下のような感じでMySQLのコンテナが起動できない。

```bash
root@pc-name: docker-compose logs mysql
mysql_1   | mysqld: Cannot change permissions of the file 'private_key.pem' (OS errno 1 - Operation not permitted)
mysql_1   | 2020-09-10T05:04:53.449233Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for private_key.pem
mysql_1   | 2020-09-10T05:04:53.449629Z 0 [ERROR] [MY-010119] [Server] Aborting
```

こいつ（``permission``）の対応策について記載したい

# 対応
`` /etc/wsl.conf ``にマウントオプションを追加する。

```:追加するマウントオプション
[automount]
options = "metadata"
```


WSL2初めの方は基本存在しないと思うので以下の手順で対応する。
WSL2のディストリビューションに```/etc/wsl.conf```を作成。


```bash
# ルートでログイン
user@pc-name:sudo -i
# wslのディストリビューションにwslの設定ファイルを新規作成
root@pc-name: sudo touch /etc/wsl.conf
# 設定ファイルを編集する。
root@pc-name: vi /etc/wsl.conf
```

マウントオプションを変更する。 ``i``でviコマンドをinsertモードにして以下を入力。

```
[automount]
options = "metadata"
```
ESCを押下後、上書き保存(``:wq``)し、WSLを再起動。

```bash
# ルートログアウト
root@pc-name:exti
# wsl ログアウト
user@pc-name:exit
# WSL シャットダウン
wsl --shutdown
# WSLを起動＋ログイン
wsl
```
これで再度Docker関係でPermissionのエラーが消えていると思います。

# おまけ
以下のようなログは/var/lib/mysqlのマウントディレクトリが既に存在する為
そのディレクトリを削除することで解決する。

```bash
root@pc-name: docker-compose logs mysql
...
mysql_1   | 2020-09-10T05:00:42.590708Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
mysql_1   | 2020-09-10T05:00:42.590714Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
mysql_1   | 2020-09-10T05:00:42.590777Z 0 [ERROR] [MY-010119] [Server] Aborting
```
毎回go.modとmain.goを作るのがめんどくさい

#コマンドで生成すればよかった

###gogen.go
```
package main

import (
	"io/ioutil"
	"log"
)

func main() {
	if err := ioutil.WriteFile("go.mod", []byte("module sample"), 0755); err != nil {
		log.Fatal(err)
	}
	if err := ioutil.WriteFile("main.go", []byte("package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n    fmt.Println(\"Hello World\")\r\n}\r\n"), 0755); err != nil {
		log.Fatal(err)
	}
}

```

##実現方法
* 適当なディレクトリを作成する
* そこにgogen.goを作る
* 上記のコードをgogen.goにはっつける
* go install gogen.go

##使い方
Go書き始めたい時に空ディレクトリ作る
そこの階層でコマンドプロンプト開いて下記を実行
```gogen```
go.modとmain.goが作られる

※動かない環境もあるかもしれない
※モジュール名はsample固定

#あとがき
サクッと書き始めたい時に割とめんどうだったりするので作った。
なんで今まで気付かなかったんだろう・・・
【初心者でもわかる】別タブで開く時（外部リンク）だけ自動でマークを付ける方法

# どうも7noteです。ちょっとした自動化の小技を紹介。

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

https://naruweb.com/coding/blank-icon/
axios

#axiosを使ってデータのやり取りをする

npm install axios
import axios from "axios"

cloud firestore rest api検索
結果
https://firestore.googleapis.com/v1/projects/YOUR_PROJECT_ID/databases/(default)/documents/cities/LA

YOUR_PROJECT_IDとcities/LAを変える

```
methods:{
    createComment(){
      axios.post(”https://firestore.googleapis.com/v1/projects/scrapoo/databases/(default)/documents/comment2”,
      {
        fields:{
          name:{
            stringValue:this.name
          },
          comment:{
            stringValue:this.comment
          }
        }
      }
      )
      .then(response=>{
        console.log(response)
      })
    }
  }
```

getもpostもおなじurl

baseurlなどの共通の設定はmain.jsで読み込む
なぜならmain.jsが最初に読み込まれるから
pythonでwordとexcelレポートを自動作成


#excel編

##excel作成


```python
import openpyxl as opy
book = opy.Workbook()
```

##シートの名前を確認


```python
sheet1 = book.active
sheet1.title
```

##シートの名前を変更

```python
sheet1.title = 'mysheet_1'
```

##excelファイルを作成

```python
book.save('make_excel.xlsx')
```

##既にあるファイルを開く

```python
my_made = opy.load_workbook('make_excel.xlsx')
```

##指定のシートを編集する

```python
sheet2 = my_made.active
table = my_made[sheet2.title]
```



##セルを指定して文字を書き込む

```python
table['A1'] = 'How is the weather today'
```

##セルの書式変更する

```python
from openpyxl.styles import Font
table['A1'].font = Font(bold=True,italic=True,size=28)
```



#word編

pip install でdocxを指定するのは3.4まで
それ以降はパッケージ名をpython-docxで指定する。



##ファイルを作る

```python
import docx
doc = docx.Document()
```

##文章の書きこみ

```python
doc.add_paragraph('How is the weather today')
doc.add_paragraph()
doc.add_paragraph(today_list)
doc.add_paragraph()
```

##画像の挿入

```python
doc.add_picture('pict.png')
```

##ファイルの保存

```python
doc.save('make_word_today.doc')
```



#以上
jQuery　checkboxに応じて切り替え

jQueryについて、progate初級だけやり、あとは必要なものを調べていく方式で見つけたものをメモしていく。javascriptっぽいのは慣れない・・・`()`多いし`''`も多くない？:rolling_eyes:
 プライバシーポリシー的なものに応じた人だけボタンが押せるようにしたいことがあったので、調べたことを備忘録に残す。

#checkboxに応じて送信ボタンの有効/無効を切り替え
###`disabled` 「ボタンの非活性」
`disabled`属性をbuttonタグにつけるとそのボタンが非活性化される！
知らなかった。事前にHTMLの方に`disabled`をつけておく。
##checkboxを用意

```html
<input type="checkbox" id ="check" name ="privacy-policy">
<button type="button" id="button" disabled>ボタン</button>
```
##jQuery部分

```javascript

    $('#check').change(function () {
        if ($(this).is(':checked')) {
                $('#button').prop('disabled', false);
            } else {
                $('#button').prop('disabled', true);
            }
    })
```

###`change`メソッド
`input` `textarea` `select`で要素の中身が変更されたときにイベント処理が行われるメソッド。

###`is`メソッド
セレクタに一致するかを調べる。
**返り値はtrue、false**


###`prop`メソッド
HTMLのid、class、nameなどの属性を取得したり、checkedの属性を取得するのに使う。
新しい値を設定するときは、第二引数に設定したい値を入力する。
form.labelで文字をエスケープしたときの実装メモ

```
<%= form.label :title, "件名", for: "title" %>
<%= form.text_field :title, id: "title", placeholder: "件名を入力してください" %>
```
上記のlabelの中の件名を`<span>件名<span>`としたい。(bootstrapをあてる関係で)
しかし

```
<%= form.label :title,"<span>件名</span>", for: "title" %>
```
としても意図した挙動にはならない。
これはhtmlタグが文字列として認識されてしまうから。
なので"<span>件名</span>"の部分だけエスケープさせたい。
エスケープで検索すると、html_safe、raw、sanitize等いくつかメソッドがあるとのこと。


（参考）
https://madogiwa0124.hatenablog.com/entry/2017/09/16/105843
https://railsguides.jp/action_view_overview.html#sanitizehelper

Railsガイドより、
> html_safeやrawではなく、後述の#sanitizeメソッドを使うことが推奨されています。セキュリティ上の問題が生じるため、ユーザー入力に対して#html_safeや#rawを使ってはいけません。

とあることから
ユーザー情報を入力するためのinputタグなどにはsanitizeメソッドを、ユーザー情報以外であればhtml_safeやrawを使うっぽい。

```
ユーザー情報入力フォーム　→　sanitize
ユーザー情報以外の入力フォーム　→　raw
入力フォーム以外　→　html_safe
```

こんな感じ？？

実際のオプションの指定の仕方は`https://api.rubyonrails.org/`を参考に、以下のように実装したら期待した表示に。

```
<%= form.label :title, '<span>件名</span>'.html_safe, for: "title" %>
<%= form.text_field :title, id: "title", placeholder: "件名を入力してください" %>
```


## ちなみに
https://api.rubyonrails.org/
でlabelを検索すると
ActionView::Helpers::FormBuilderのlabelとActionView::Helpers::FormHelperのlabelが引っかかった。
この違いって何？？？と悩んだのでメモ

FormHelperはform_tag
FormBuilderはform_fom、form_with

今回はレシーバがフォームヘルパオブジェクトじゃなくてフォームビルダオブジェクトになるので、FormBuilderのlabelのオプション指定を調べて実装する必要があった。

### レシーバとは

```
obj.method
```

こういう記載があるところの

```
obj(レシーバ).method(メソッド)
```

この前の部分。

aaa.label_tag("hoge".html_safe)
上記だとこのaaaの部分。

今回だとform_withで実装しているため、form.labelのレシーバはFormBuilder
OS自作　2日目

##ブートプログラム内にデータを保存する
・ブートプログラムに制御が移った時にセグメントレジスタの値を初期化する
・アセンブラはプログラムが0x0000番地にロード、実行されるものと仮定している
　→ブートプログラムが0x7C00番地にロードされていることをORG命令で知らせる

###ALIGN命令について
・アライメント：メモリからデータを読み込むときにプロセッサのビット数に合わせてデータの境界を調整する必要がある

##文字を表示する
・BIOSコール
　；入出力機を動作させるための関数
・int で出力用のBIOSコール

##文字列の表示
文字の表示を繰り返す

##コンピュータを再起動する
・BIOSコールを使って再起動を行う
・再起動する際には文字列を表示する
良い質問するポイント３選

#はじめに
良い質問するのは大変難しいですよね。
結局何を質問したいのか、どういう状況なのか伝わらないことが多々あります。

質問する際に、**回答しやすい質問**を心掛けますが、質問の仕方について考察したことがありませんでした。
そこで、**質問テンプレート**を把握することで、大分改善出来るのでは？考えました。

この記事では、テンプレートの作成を目的に、良い質問のポイントをまとめていきます。
良い質問するポイントは、以下３点であると考えました。

 - 今どんな状況か？
 - 仮説・検証したか？
 - どう答えて欲しいか？
 
以上３点のポイントをクリアすることで、良い質問が生まれると考えます。
それでは１つずつ解説していきます。

#今どんな状況か？
質問の冒頭で、**現在の状況**を伝える必要があります。

 - 何がゴールで、期限はいつなのか？
 - どのようなエラーが発生しているか？
 - どのような手順を踏んだのか？


上記３点を簡潔に伝える必要があります。

```:今どんな状況か
【何がゴールで、期限はいつなのか？】
   来週、○○チームの開発体制の変更があり、今週中に開発環境構築する必要があります。


【どのようなエラーが発生しているか？】
   ○○を実行した際に、○○というエラーが発生しました。


【どのような手順を踏んだのか？】
   実行した手順は以下の通りです。
    1. （実行コマンド）
    2. （実行コマンド）
 
（実行コマンド）を実行した際に、以下のエラーメッセージが表示されました。
  ※エラーメッセージを添付
```

#仮説・検証したか？
前章でお伝えした状況に対して、自分が**どのようにアプローチしたのか**説明します。

 - 仮説：エラーメッセージから、解決方法を考察する
 - 検証：仮説を検証する。解決しない場合、仮説に戻る

上記２点を簡潔に伝える必要があります。

```:仮説・検証したか

【仮説の説明】
   エラーメッセージを検索し、○○がインストールされていないことが原因であると考えました。
   ■ 引用
　　> （検索記事の引用を添付）

【検証結果】
   ○○をインストールしたところ、以下のエラーが出力され、インストール出来ませんでした。
   （エラーメッセージを添付）
```

#どう答えて欲しいか？
直接的な解決策だけでなく、手がかりになるサイト・ドキュメントを教えて欲しい旨を伝えます。
自分が**どのサイトを参考**に、仮説・検証を実施したかを伝えると親切だと思います。

```:どう答えて欲しいか
【何を答えて欲しいかを明確にする】
   エラー解決について、"手がかりとなるサイト・ドキュメント"を教えて頂けると幸いです。

【自分が参考にした記事】
   仮説・検証実施にあたり、以下サイトを参考に致しました。
　　・（サイトURL①）
　　・（サイトURL②）
```

#まとめ
本記事を通して、良い質問するポイントについて具体例を紹介しつつ、考察させて頂きました。
記事冒頭でも書きましたが、"回答しやすい質問"がベストであるため、試行錯誤しつつ、質問テンプレートをアップデートしていくことが重要です。
以下のQiita記事が大変参考になりました。本記事で考察した質問テンプレートだけでなく、「質問のレベル」「質問のタイミング」について、詳しく記載されています。

 - [質問は恥ではないし役に立つ](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)
 

#参考
 - [エラーが解決出来ない時に質問するまでの最低限中の最低限。](https://twitter.com/KOUICH1039/status/1286825224592211968)
 - [質問は恥ではないし役に立つ](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)
input type="file" をまともにする

ファイルアップロードのUI(input type="file")は厄介です。ブラウザによって表示方法が異なるのにCSSでのカスタマイズが難しいし、Chrome以外では添付したファイルをキャンセルできないという問題もあります。ですが、JavaScriptを使えば、

 1. CSSでカスタマイズ可能
 2. 添付したファイル名を表示可能
 3. 添付したファイルをキャンセル可能

にできます。

## 元のHTML

```html
    <form method="POST" enctype="multipart/form-data">
        <ul>
            <li><input type="file" name="file1"></li>
            <li><input type="file" name="file2"></li>
        </ul>
        <input type="submit" value="UPLOAD">
    </form>
```

```input type="file"``` な要素が2つあります。なのでJavaScriptでコントロールするときには対象を特定する必要があります。

## 修正版HTML

よくあるのは ```input type="file"``` な要素を非表示にした上で ```label``` 要素で囲み、```label``` のクリックで ```input type="file"``` のポップアップを連動させるというやり方です。ですが、JavaScript を使うのであれば ```label``` にこだわる必要はありません。むしろ ```label``` にはデフォルトで連動のアクションがあるため扱いが面倒です。

```label``` の代わりに ```span``` で囲むことにします。目印のために ```class="upload"``` としています。

```HTML
    <form method="POST" enctype="multipart/form-data">
        <ul>
            <li><span class="upload">
                <input type="file" name="file1">
                <input disabled>
                </span></li>
            <li><span class="upload">
                <input type="file" name="file1">
                <input disabled>
                </span></li>
        </ul>
        <input type="submit" value="UPLOAD">
    </form>
```

```span``` の中には2つ ```input``` 要素があります。一つは元々の ```input type="file"``` な要素、もう一つはファイル名を表示するために追加した要素です。追加した要素は表示のためだけに使うので、```disabled``` にしています。アイコンなどを追加したい場合は ```span``` 要素の中に入れればクリック時にポップアップと連動します。


## 追加のCSS

以下のCSSを追加します。

```CSS
    form .upload {
        display: inline-block;
    }
    form .upload input[type="file"] {
        display: none;
    }
    form .upload input[disabled] {
        pointer-events: none;
    }
```

```span``` 要素はクリックを「受け止める」必要があるため、inline-block にします。元々の ```input``` 要素は非表示にし、追加した ```input``` 要素はクリックを「素通し」するので ```pointer-events: none;``` とします。この設定がないと Firefox では追加した ```input``` 要素がクリックを「消費」してしまい、```span``` までクリックが伝わりません。

## コントロール用JavaScript

以下のJavaScriptを追加します。

```JavaScript
    $(function(){
        $('.upload').on('click', function(){
            $(this).find('input').val('');
            $(this).find('input[type="file"]').trigger('click');
        });
        $('.upload input[type="file"]').on('click', function(event){
            event.stopPropagation();
        });
        $('.upload input[type="file"]').on('change', function(){
            if (this.files.length) {
                $(this).parent().find('input[disabled]')
                    .val(this.files[0].name);
            }
        });
    });
```

  1. ```span``` 要素(```class="upload"```)がクリックされたときは、内部にある2つの ```input``` 要素をともにクリアし、```input type="file"``` な要素をクリックすることでポップアップを起動します。
  2. ```input type="file"``` な要素がクリックされたときに親要素へのイベント伝播を停止します。これを行わないと再度 ```span``` がクリックされることになるので無限ループになってしまいます。
  3. ポップアップから戻ったとき、ファイルが選択されていればそのファイル名を追加した方の ```input``` 要素に表示します。

jQueryを使ったので簡潔に書けました。生のDOM操作関数でも記述可能と思いますが、かなり面倒になると思います(私にはその根気はありません)。

- [完成品](https://kobalab.net/xiumai/demo/upload.html) (見映えはCSSで修正)
swiftメモ（自分用）

自分用メモ

・tableViewでのreturn cell で、検索数以上に表示数を設定すると
ループして表示されるので、return cell では表示数をカウントしたものを設定する。

-------

・Label内のフォントサイズを自動調節する。

【Xcode】UILabelの文字サイズを自動調整する
https://an.hatenablog.jp/entry/2017/12/03/234839


-------
tableViewのクラッシュは解決したので、別記事にしました。
GPU関連の用語集

<h2>概要</h2>
GPUを使用して機械学習を行うときに使用するツールだったりの用語を解説する

<h2>用語集</h2>
<h3>GPUとは</h3>
グラフィックスなどの描画に関して計算処理を行うプロセッサ
グラフィックスなどに特化して高い処理能力を持っていたGPUをグラフィックス以外にも応用しようと開発されたものがCUDAである

<h3>CUDAとは</h3>
GPUを使用するためのプログラミング環境を提供するもの
画像認識などの機械学習で用いられている

<h3>CUDA Toolkitとは</h3>
CUDAを使用するためのソフトフェアであり、GPUサーバにインストールする

<h3>NVCCとは</h3>
CUDAコードをコンパイルするNvidia CUDAコンパイラのこと
ホストコード（CPU用のコード）とデバイスコード（GPU用のコード）に分離し、デバイスコードをコンパイルし、GCCなどのコンパイラがホストコードをコンパイルする

<h3>GCCとは</h3>
複数のプログラミング言語のコンパイラである
　　
　　
　　
　　
　　

以上
随時追記します
THETA Plug-in で LED を制御する

# この記事について
THETA の Plug-in を実装する際に、THETA本体のLEDを点灯させる方法をまとめます。
（自分用のメモの目的が強いですｗ）

# THETA V の LED について
THETA VのLEDについて記載します。 Z1も同じだと思うのですが実機を持っていないのでわかりません。

## LED の指定、色の指定について
### LED Target
THETA V には8個のLEDが用意されています。
![THETAのLED](https://theta360developers.github.io/plugin-guide/img/custom/led-all.png)
※画像は https://theta360developers.github.io/plugin-guide/tutorialcolor/ より直リンク

Plug-in SDK では、それぞれ `LedTarget.LED1` ～ `LedTarget.LED8` と定義されています。
このうち、Plug-in内で自由に使用できるのは`LED3`～`LED8`までです。

### LED Color
この8個のLEDのうち、`LED3` (Wi-FiマークのLED)については色を指定することができます。
Plug-in SDK では、`LedColor.RED` `LedColor.GREEN` `LedColor.BLUE` `LedColor.CYAN` `LedColor.MAGENTA` `LedColor.YELLOW` `LedColor.WHITE` として色が定義されています。

ちなみに、色の視認性はあまり良くありません。例えば`CYAN`と`BLUE`は区別がつきにくいです。同様に`RED`と`MAGENTA`、 `YELLOW`と`WHITE` も区別しにくいです。ざっくり「赤か青か緑か白か」くらいしか選択肢がないと考えておいたほうが無難です。

## Plug-in 内でLEDを点灯・点滅・消灯させる

`PluginActivity` を継承したクラス(一般的には`MainActivity`)にて、以下ようにメソッドを呼び出します。

### LEDを点灯させる `notificationLedShow`
```java
notificationLedShow(LedTarget.LED3);
```
引数に点灯させるLEDを指定します。なお `LED3` を指定した場合は色は青となります。

### LEDを消灯させる `notificationLedHide`
```java
notificationLedHide(LedTarget.LED3);
```
引数に消灯させるLEDを指定します。

### LEDを点滅させる `notificationLedBlink`
```java
notificationLedBlink(LedTarget.LED3, LedColor.WHITE, 500);
```
引数に点灯させるLED, LEDの色, 点滅間隔(ミリ秒) を指定します。
色の指定ができますが、`LED3`以外のときは無視されます。
点滅間隔の有効値は 250～2000 です。

### `LED3` を指定の色で点灯させる `notificationLed3Show`
```java
notificationLed3Show(LedColor.WHITE);
```
`LED3` 専用の点灯メソッドが用意されています。引数にLEDの色を指定します。

# 参考
https://theta360developers.github.io/plugin-guide/tutorialcolor/
https://theta360developers.github.io/plugin-guide/tutorialcommunication/
FirebaseのFunctionsのconfigを取得、設定する方法

## 取得・確認
Firebase SDKを使っていて、Firebase Cloud Functionsのconfigの
環境変数に何が設定されているか確認したい場合に使います。

### どの環境に向いているか確認

例ではproduction-projectに向いています。
この時点でfirebase系のエラーが出た人はfirebase-toolsが入っているか、ログインされているかを確認してください。

```bash
$ firebase use
Active Project: production (production-project)

Project aliases for /Users/MyUserName/projects/firebaseProject:

  development (development-project)
  staging (staging-project)
* production (production-project)
```
### 現在の環境構成を取得する

詳細は下記のURLの通リです。
https://firebase.google.com/docs/functions/config-env?hl=ja#retrieve_current_environment_configuration

何も設定されていない場合は`{}`だけが表示されます。

```bash
$ firebase functions:config:get
{
  "fb": {
    "token": "this-is-token_hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14hogehoge7hoge14"
  }
}
```

## 設定・登録（例: tokenの登録）

`firebase use`で向き先を確認してください。
もしも想定している向き先でない場合は`firebase use develop`の様に向き先を指定して変更してください。

### tokenの生成

```bash
$ firebase login:ci

Visit this URL on this device to log in:
{ここにURLが表示される}

Waiting for authentication...

✔  Success! Use this token to login on a CI server:

{ここにTokenが表示されるのでコピーしておく}

Example: firebase deploy --token "$FIREBASE_TOKEN"
```

#### 環境構成の設定（config)


```bash
$firebase functions:config:set fb.token={コピーしておいたtoken}

✔  Functions config updated.

Please deploy your functions for the change to take effect by running firebase deploy --only functions
```

### 設定した状態の確認

```bash
$ firebase functions:config:get
{
  "fb": {
    "token": "{登録したtokenが表示される}"
  }
}
```
LambdaでAPIを立てるときに気を付ける点

## はじめに
EFSをLambdaで利用できるようになり、機械学習等のサイズの大きいファイルを運用できるようになりました。
ただ、依然LambdaやAWSのサービスには制約が存在しています。
本稿では、画像処理のAPI構築を通して、EC2の代替としてLambdaを利用を検討する際に考慮した点をまとめていきます。

## 構築するAPI概要
Lambdaを利用するにあたって、構築するAPIの仕様を知ることは大前提です。
今回検証したのは、GPUを利用しないPythonの画像処理APIです。
利用するパッケージは以下の通りです。

* requirements.txt

```
requests==2.24.0
boto3==1.14.14
certifi==2020.4.5.2
chardet==3.0.4
cycler==0.10.0
decorator==4.4.2
dlib==19.20.0
idna==2.9
imageio==2.8.0
kiwisolver==1.2.0
matplotlib==3.2.2
networkx==2.4
numpy==1.19.0
opencv-contrib-python==4.2.0.34
opencv-python==4.2.0.34
Pillow==7.1.2
pyparsing==2.4.7
python-dateutil==2.8.1
PyWavelets==1.1.1
requests==2.24.0
scikit-image==0.17.2
scipy==1.5.0
six==1.15.0
tifffile==2020.6.3
urllib3==1.25.9
```

以上のパッケージをフォルダに格納します。

```bash
$ pip install -t target -r requirements.txt
$ du -d 1 -h
389M    ./target
```

389MBになりました。
また、下記のモデルを利用します。  

```bash
$ ls -lh
-rwxrwxr-x 1 ec2-user ec2-user 96M Jun 24 06:14 sp_human_face_68.dat
```
パッケージとモデルで合計485MBとなります。  

本APIでは1500×1500の画像をbase64で受け取り、処理結果をbase64で返します。
おおよそ、ペイロードサイズは以下の通りです。

```bash
$ ls -lh
-rw-r--r-- 1 ec2-user ec2-user 3.7M Jun 25 12:12 request.json
-rw-rw-r-- 1 ec2-user ec2-user 3.6M Jun 25 12:29 response.json
```

画像処理はm5.largeのインスタンスで実行したところ、約6秒ほどで完了しました。

## 検討段階
まず、下記のページを参考に、サービスの制約をクリアできるか確認しました。
  
* [AWS Lambdaの制限](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html)
* [Amazon API Gateway のクォータと重要な注意点](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html)  

特に注意したのは以下の項目です。

1. デプロイパッケージサイズ
  * Lambdaにアップロードできるデプロイパッケージのサイズは、レイヤーを含めて250MBという制限があります。  
    今回は、パッケージとモデルで制限を超えているため、EFSの利用を決定しました。

1. タイムアウト
  * Lambdaのタイムアウトは15分で実施されますが、API Gatewayを利用する場合は30秒となっています。
    加えて、API Gatewayには複数の形式があり、それらの特徴を考慮することも必要です。  
    下記を参考に、今回はREST APIの形式にしました。
      * [知れば納得！HTTP API と REST API の VPC リンクは違うんやで。](https://dev.classmethod.jp/articles/difference_between_rest_api_and_http_api_each_vpc_link/)

3. ペイロードサイズ
  * LambdaやAPI Gatewayには、リクエスト・レスポンスのボディを含めたペイロードに制限があります。  
    HTTP APIやREST APIでは10MB、Lambdaでは同期の設定において6MB、非同期で256KBとなっています。

## 環境検証
Lambda＋EFS＋API Gatewayで環境を構築可能か確認するために実施した内容を記します。  

1. ペイロードの確認
  * Lambdaのコードに実際のレスポンスを仕込み、リクエストを投げて制限に触れないかを確認します。  
    テストは、REST APIのダッシュボードにおけるリソースタブにて簡単に実施できます。  
    メッセージをPOSTに設定し、リクエスト本文に実際のデータ(base64の文字列)を入力しました。

2. ウォームスタート・コールドスタートの実行時間の違い
  * Lambdaでは、毎回EC2においてコンテナを起動するため、初期の実行に時間を要します。  
    起動したコンテナは一定期間後に停止するため、アクセスが疎になると、再度コールドスタートとなります。  
    連続して実行した場合と、時間を置いて実行した場合の実行時間に違いが発生します。  
    また、handle_requestの実装・非実装や、EFSとLambdaレイヤーへの配置を分けることにより実行時間に違いが発生する可能性があります。

3. 同時アクセス数の増減に対するスループット
  * Lambdaでは同時に1,000まで実行することができます。  
    EFSという同一ディレクトリを利用する場合は、共通のファイルを利用する際の注意が必要です。

## おわりに
今回はLambdaでAPIを構築する際に気を付けた点についてまとめました。
上記の他にも、APIのセキュリティやVPCの切り分け等、考慮すべき点はあるかと思います。
構築するサービスの諸元値に合わせて、AWS内でも適切なアーキテクチャを選定する必要がありそうです。
DevOpsとは～備忘録～

### DevOpsとは
DevOps(Developers Operarions)とは簡単に言うと、開発・運用が協力する取り組みや姿勢のことです。DevOpsを取り入れる前は、開発と運用がそれぞれ独立した組織として仕事をしていました。開発はリリースするまでの作業（設計・開発）を担当し、運用はリリースであったりそれ以降の業務を担当してます。そのため、自分が担当することのみを考え開発者と運用者での意思疎通がうまく行われず、相手の作業が必要な時は相手に依頼をするということを行っていました。そのため、開発側は運用の協力なしではデプロイが出来ない、作ったものをすぐにデプロイしたくてもできない、運用側は運用上の考慮が不十分であるソフトウェアを管理しなければならないといった課題があった。このような課題を解決するためにDevOpsが誕生した。要は開発(Developers)と運用(Operations)が協業し始めたという感じ。
DevOpsを取り入れることで、あらかじめ運用への影響を考えたソフトウエアを開発・運用することが出来、インフラやツールなどの情報やリソースの共有により必要な時に必要なものにアクセスしやすくなった。DevOpsにおいて重要なことは早い段階でフィードバックを得たり、Try & Errorを行いやすくすることです。
CentOS7: Vim最新版 -> GitHub

vimのバージョン7がインストールされているときの備忘録。
-> バージョン8へアップグレード

####必要なパッケージのインストール
```
# yum update
# yum grouplist
# #インストールされてる、できるグループパッケージ一覧表示
# 開発用ツールグループのインストール
# yum groupinstall "Development Tools"
# yum install ncurses-devel
```
####標準パッケージのアンインストール

```sh:
#インストールされているパッケージを調べる。
$ sudo rpm -qa | grep vim
vim-filesystem-7.4.629-6.el7.x86_64
vim-common-7.4.629-6.el7.x86_64
vim-enhanced-7.4.629-6.el7.x86_64
vim-minimal-7.4.629-6.el7.x86_64
#パッケージのアンインストール
$ sudo yum remove vim-filesystem vim-common vim-enhanced
```
####githubからのダウンロード

```
# git clone https://github.com/vim/vim.git
```
####ビルド

```
# cd ./vim
# make
# make install
```
####確認

```
# vim --version
```

####エイリアス登録
```sh:.bashrc
+ alias vi='vim'
+ alias v='vim .'
```

LGTMお願いします！
モチベーションがあがります！
javascrpitで自動更新処理


## 60秒で自動更新
```javascript

const timer = 60000    // ミリ秒で間隔の時間を指定
window.addEventListener('load',function(){
  setInterval('location.reload()',timer);
});
```

## イベント実行時に画面も更新
- /stopへリクエストして、5秒後に画面リロード

```javascript
    handleClickStop() {
        const request = axios.create({
            baseURL: "http://localhost:8080"
        })
        request.post("/stop")
        setTimeout(window.location.reload(),5000);
    }
```



## 参考
https://designsupply-web.com/media/knowledgeside/4431/