OmniAICreator/Qiita-1.07M huggingface dataset:
商用Nginx Plusトライアル版 利用方法まとめ

商用版のNginx Plusのトライル版が利用できる事を最近しったのでその利用方法のまとめ記事です。

## 1. 環境
- OS: CentOS 7.9 (3.10.0-1160.49.1)
- nginx-plus: nginx/1.21.3 (nginx-plus-r25-p1) 

## 2. トライアル版の申し込み

下記サイトよりトライアル版を申し込みできます。

https://www.nginx.co.jp/free-trial-request/

ページ右下に必要な情報を記載して、送信ボタンを押してください。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/42cfe308-d2ea-6d3d-3e14-a88d56dad8bd.png">

しばらくすると下記のようなメールが飛んできますので、リンクをクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/dab2782d-48ef-d23f-9486-f0cd3bf2768e.png">

証明書と鍵をダウンロードしておきます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/33afa3f3-aaa7-ae54-947e-0a144b41b22d.png">

## 3. OS設定

```bash
yum -y update
reboot

mkdir -p /etc/ssl/nginx
# 上記フォルダに先ほどダウンロードした下記の鍵と証明書を入れておきます。
# nginx-repo.key
# nginx-repo.crt
```

## 4. Nginx Plusインストール

```bash
yum install -y ca-certificates vim wget epel-release
wget -P /etc/yum.repos.d https://cs.nginx.com/static/files/nginx-plus-7.4.repo
yum install -y nginx-plus

# 証明書と鍵が無い状態でリポジトリだけ登録した状態だと下記のようになります。
Loaded plugins: fastestmirror
Repo nginx-plus forced skip_if_unavailable=True due to: /etc/ssl/nginx/nginx-repo.crt
Repo nginx-plus forced skip_if_unavailable=True due to: /etc/ssl/nginx/nginx-repo.key
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                                                                               | 8.6 kB  00:00:00
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
epel                                                                                                                                               | 4.7 kB  00:00:00
https://pkgs.nginx.com/plus/centos/7/x86_64/repodata/repomd.xml: [Errno 14] HTTPS Error 400 - Bad Request
Trying other mirror.
(1/3): epel/x86_64/group_gz                                                                                                                        |  96 kB  00:00:00
(2/3): epel/x86_64/updateinfo                                                                                                                      | 1.0 MB  00:00:00
(3/3): epel/x86_64/primary_db                                                                                                                      | 7.0 MB  00:00:00
No package nginx-plus available.
Error: Nothing to do

```

## その他

せっかくなので、次回は冗長化した状態でNginx Plusでないとできないことを
やっていきたいと思います。
Laravel Duskの小技メモ（Basic認証・存在有無で条件判定など）

Laravel Duskに関する、公式サイトにはなかった内容の備忘録です！

## 1. Basic認証
例えば、ユーザー名がaaa, パスワードがbbb, ドメイン名がccc.example.comなら以下のようになります。

```php:basiciLoginTest.php
$browser->visit('https://aaa:bbb@ccc.example.com/');
```



## 2. ある要素があるかどうかで条件分岐
```php:xxxTest.php
if($browser->element('.class-name')){
// 処理
}
```


## 3. 実際にブラウザ上でテストの挙動を見る

```php:DuskTestCase.php
protected function driver()
    {
        $options = (new ChromeOptions)->addArguments(collect([
            '--window-size=1920,1080',
        ])->unless($this->hasHeadlessDisabled(), function ($items) {
            return $items->merge([
                '--disable-gpu',
                // '--headless',  // この行をコメントアウトすると実際のブラウザの挙動が見られます
            ]);
        })->all());
```
【Rails】マイグレーションを利用したテーブルの作成について

#マイグレーションを利用したテーブルの作成について

##マイグレーションは以下の2段階に分けて行う。
1段階目：「マイグレーションファイルの作成」

```
rails g model~

#実は「rails g model~」のコマンドでモデルを作成した際に
#モデルと一緒にマイグレーションファイルが作られる。（db/migrate）
```



2段階目：「マイグレーションファイルの実行」

```
rails db:migrate

#このコマンドでマイグレーションファイルを元にテーブルが作られる。
```

##マイグレーションファイルのその後
マイグレーションファイルは、実行したらその後は基本的に編集しない。
実行したら終わり。

##開発を進めていく中で新しくモデルを作ることになったら？
モデルとマイグレーションファイルを作り、マイグレーションファイルを実行するという流れで進んでいく。

※実際の開発現場では、モデルは数十個存在する。
開発途中でテーブルに変更を加えることはよくあるので
マイグレーションも実際の現場では、モデルの数以上に存在します。

>引用元：基礎から学ぶ Ruby on Rails: １週間の短期間講座！楽しく学ぶRailsの新しい入門書
WSL上cronをwindows起動時に自動実行する


https://loumo.jp/archives/24595
>Windows Subsystem for Linux(WSL) では cron も利用できるのだが、デフォルトでは無効になっているようだ。


ということで。上記記事を噛み砕いてかつ`bat`を簡単にしたもの。記事通りでも`visudo`をいじればできるけど簡略化。

##1. Startup フォルダを開く
###方法A.
 `C:\Users\Nyanko\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
  ユーザ名は自分のものに。
###方法B.
![385e27679a761aef9fa82a79964a70ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542831/2532b51b-2717-0a8f-c51d-773d83d07461.png)

  `Windows キー + R`同時押し後出るウィンドウ上で，`shell:startup`

##2. bat ファイル置く
 以下なファイルを上記で開いたフォルダ以下に置く。`.bat`で。
```$ wsl -u root -- service cron start```

##3. 確認
Windows 再起動後，`wsl`上の`ubuntu`かなにかを開いて，
`$ sudo service cron status`
実行した後，`*  cron is running`が出ればok
音楽だって立派なHack！　作曲初歩の初歩１

# 作曲
## 作曲やりたいけど出来ないって藻掻いている人が多い
というわけで、作曲のために必要なことを取りまとめます。

# 結局は音を扱うということ
## ４オクターブ目のラの音は、440Hz

（自然Aは432Hzで、441や442を使う場合もありますが…)
このラ（A）の音が調律に使われる音でもあるので、基準となっています。

## 整数倍の周波数が持つ特性

整数倍の周波数の音は、基準となる音に対して、以下の関係を持ちます。

- 共振増幅（ハウリング）
- フィルター

例えば、440Hz と 880Hz の音が同時に発声された場合…
もし他のエネルギーに変わらないと仮定すれば、勝手に増幅して鳴り止みません。
これが、「響き」の正体です。
なお、例のような2倍などの偶数倍は、オクターブの上下になっています。

周波数が位相の場合は、打ち消し合う関係性になります。
位相によるフィルターはノイズキャンセリングにも応用されています。
他にも、エフェクターによる人為的なフィルターもあります。

どちらも、音に関してとても重要な物理学的な反応です。

## 大切なのは奇数倍

実は、整数倍の音は、上のような特性が壊れません。
なのでそれは、奇数倍（3倍,5倍など）でも関係が壊れません。
実は、周波数を3倍ずつ上げていくだけで、全ての音階（12音階）が出てきます。
なので、その関係性を円として図示したものも存在するぐらい、この関係性は大事です。

気になった方は、4度圏、5度圏　という単語で調べて見てください。

# 次回

[調（キー）](https://qiita.com/johnny-shaman/items/89d172b4a90f714010cf)についてお話します。
Slackに画像を投稿する最小限度のPythonスクリプトの作り方

この記事では、Slackの特定のチャンネルに画像を投稿するシンプルなPythonスクリプトを作成するための基礎知識を共有します。

この記事で利用しているスクリプトで、以下の記事で利用している Google Photos へアップロードするスクリプトを置き換えると、Slack へ撮影した画像を定期的に投稿する簡易 Network カメラが作成できます。

https://qiita.com/aikige/items/46684487c8af1070a069

## 利用するもの

[Your Apps]:https://api.slack.com/apps
[Python Slack SDK]:https://slack.dev/python-slack-sdk/
[WebClient]:https://slack.dev/python-slack-sdk/web/index.html
[aikige/slack-photo-uploader]:https://github.com/aikige/slack-photo-uploader

- [Python Slack SDK] の [WebClient] 機能
- Slack Webサイトのアプリケーション管理画面（[Your Apps]）
- サンプルスクリプト（[aikige/slack-photo-uploader]）
    - サンプルスクリプトの内容は、Slack SDKの files.upload の [Sample Code](https://api.slack.com/methods/files.upload/code) とほぼ同様です。

## 実行に必要な準備

### 1. Slack Webサイトでの処理: アプリケーションとTokenの作成

1. [Your Apps] にアクセスし、"Create New App" ボタンから新シアプリケーションを作成します。

2. "Create an app" の画面で "From an app manifest" を選択してください（処理が簡単なので）。

3. Workspace を選択し、"Enter app manifest below" の画面で以下の Manifest を貼り付けます:

    ```
    _metadata:
      major_version: 1
      minor_version: 1
    display_information:
      name: Image Uploader
      description: Upload image from python scripts.
      background_color: "#880000"
    features:
      bot_user:
        display_name: Image Uploader
        always_online: false
    oauth_config:
      scopes:
        bot:
          - files:write
    settings:
      org_deploy_enabled: false
      socket_mode_enabled: false
      token_rotation_enabled: false
    ```

1. "Image Uploader" という名前のアプリケーションに、 `files:write` のパーミッションが付与されるので、"Review summary & create your app" の画面で "Create" ボタンを押してアプリケーショの作成を終了してください。

1. 作成されたアプリケーションの管理画面の "Features" 以下にある "OAuth & Permissions" のページに移動し、"OAuth Tokens for Your Workspace" の部分にある "Install to Workspace" というボタンを押して、投稿対象の Workspace に作成したアプリケーションをインストールします。

1. インストールが終わると、先程のページの "Bot User OAuth Token" の欄に Bot 用の　OAuth Token が表示されますので、この値を記録してください。

### 2. Slack のアプリケーション上での処理: 投稿先チャンネルIDの取得

1. Slack アプリ（例:Mac向けのSlackクライアント）投稿先のチャンネルを選択し、チャンネル情報を表示して、最下部に記載されているチャンネルIDを取得してください。

### 3. スクリプトの準備

1. [aikige/slack-photo-uploader] を Clone します。

1. レポジトリにある、`requirements.txt` を用いて、依存ライブラリをインストールします（slack_sdk が必要です）:    

    ```
    pip install -r requirements.txt
    ```

1. `config.json` というファイルに、取得した OAuth Token と 投稿先のチャンネルIDを記載します。

    ```
    {
        "bot_token": "xoxb-xxxxxxxxxxxxx-yyyyyyyyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzz",
        "channel_id": "12345678901"
    }
    ```

## スクリプトの実行

以下のように実行して、画像が投稿されれば成功です。

```
python slack_photo_uploader.py SOMEIMAGE
```

## スクリプトの解説

ユーザとやり取りしない、投稿専用のボットの作成は非常に簡単です。

1. 基本的に、Bot 用の OAuth Token を引数として与えて、`WebClient` オブジェクト（以下では `client`）を生成します。
1. `client.files_upload` メソッドに投稿先のチャンネルIDと、画像のファイル名を指定して呼び出すと投稿されます。

## 動作確認した環境について

この記事の内容は Raspberry Pi OS Lite で動作確認しました。

```
$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
$ python --version
Python 3.9.2
$ pip list | grep slack
slack-sdk            3.13.0
```
【Rails】ActiveRecordの機能について

# ActiveRecordの機能について

・RubyのコードをSQLへ変換する機能


・ActiveRecord経由でデータベースから取得したデータを自動的にインスタンス化して返す機能

```
>id = 1
>book = Book.find(id)  

#findメソッドでデータベースからデータを取得。
#そして返ってきた結果をbookという変数へ代入している。
#このbookに入っているものがBookのインスタンス。
```

>引用元：基礎から学ぶ Ruby on Rails: １週間の短期間講座！楽しく学ぶRailsの新しい入門書
技術系の動画まとめ

# はじめに
**技術系の動画**をまとめてみました。

見ている動画の種類が増えてきて、都度思い出して検索するのも大変なので、Qiitaに纏めておこうといった狙いです。

完全個人の趣味なので、**まとめにかなり偏りがあると思います**が、ついでに誰かの役にも立てそうなら是非ご活用ください・・！

また個人的な利便性のため関連しそうな勉強会やConnpass情報も貼っています。
(勉強会に参加登録しないと動画が見れない物もあります。)

今後も良さそうな**技術系の動画**を見つけたら追記していこうと思います。
(ついでに追記して欲しい物、良さそうなやつあればコメントいただければ)


## JS
JSなので、フロント、バックの人どちらでも見れそうです！

https://www.youtube.com/channel/UC8cSEtE64EryVpQDVqHM_Gg

## Node
https://www.youtube.com/watch?v=JWmMS9MO0WM&t=1240s

### Connpass
https://nodejs.connpass.com/

## Node-RED
https://www.youtube.com/channel/UCciftUuyeH9sv47YjZ2q4hA

### Connpass
https://node-red.connpass.com/

## Go
**リリースパーティ**など、都度見ておくと役立ちます。

https://www.youtube.com/channel/UCP17E44U_x_clA5MMSlKL-g

### Connpass
https://gocon.connpass.com/

https://golangtokyo.connpass.com/


## Rust
数少ない**Rust**のConferenceです。
開催されるタイミングで参加登録が必要だったはずです。

https://rust.tokyo/

## Kotlin
数少ない**Kotlin**のConferenceです。

https://www.youtube.com/channel/UCUHghWVHS1GbgE1vbiq5vYw

#### Connpass
https://server-sider-kotlin.connpass.com/

## Android
https://droidkaigi.jp/2021/

https://www.youtube.com/channel/UCgK6L-PKx2OZBuhrQ6mmQZw


## 転職サイト系
### Forkwell
すごく**沢山の種類の動画**があるので、普通に楽しめます。
**技術毎にシリーズ化**？したやつなど勉強になります。

更新頻度も高めな気がします。
新しい動画は、Connpassに登録してみると良さそうです。

https://www.youtube.com/channel/UCWHQMR_g93ZcbJLLHBoEp3A

#### Connpass
https://forkwell.connpass.com/

### Findy
こちらは**Connpass**に登録する必要があるかと思います。

#### Connpass
https://findy.connpass.com/

### LAPRAS
https://www.youtube.com/channel/UCbS5odeFMOYbowgSOUfytgA/featured

#### Connpass
https://lapras.connpass.com/


## 企業主催系
企業のやつは他にも色々あった気がしますが、最近見ているのが少なく他に思い出せませんでした。

### Mercari
Goの動画は、勉強になる&結構楽しい動画も沢山ある気がします。

https://www.youtube.com/channel/UCTnpXQ-1q2MNBvqf_qTOExw

#### Connpass
https://mercari.connpass.com/

### クラスメソッド
https://www.youtube.com/channel/UCU7WS2W00hmVFrR640ZCYPQ

## 個人主催系
こちらも他にも色々あった気がしますが、パッと思いついた物だけ・・(Youtuber色が強いのは一旦省きました・・)

### 徳丸さん
https://www.youtube.com/c/hiroshitokumaru


## その他
### 技術書典
https://www.youtube.com/channel/UCC0E4GrhFNgRCDt_aMXSmvQ

#### Connpass
https://techbookfest.connpass.com/
ディレクトリ内に転送されたファイルの検知をトリガーに処理を開始する方法

# はじめに
受信したファイルを検知する方法は複数存在しますが，今回はinotifyというAPIの使用により検知します．

# install 
Debian系のLinuxディストリビューション(DebianやUbuntu)の場合は，下記のコマンドでインストールすることができます．

```
$sudo apt install inotify-tools
```

今回はUbuntu20.04上でインストールを行うため，こちらのコマンドを使います．

Ubuntu14.04からは「apt-get」ではなく「apt」コマンドが推奨されているらしいので，時代に合わせましょう．

なお，RedHat系のLinuxディストリビューションの場合は下記のコマンドを用います．

```
&yum install inotify-tools
```

# 使用方法

inotify-toolsでは，inotifywaitというコマンドを用いることでファイルシステムイベントを表示させることができます．

オプションとして-mをつけることで複数回イベント通知が行われるようになり，-e <event>をつけることで，特定のイベントのみを通知するようにフィルタリングします．

以上を踏まえてディレクトリ内に転送されたファイルの検知をトリガーに処理を開始する方法を書くと，以下のようになります．

```sample.sh
watch=(-e CREATE -e CLOSE_WRITE -ATTRIB -m)
inotifywait ${watch[@]} /home/user/kanshi | while read notice
do
if [ "`echo $notice | awk "{print \$2;}" | grep CREATE`" ]
then
    echo "処理開始"
fi
done
```

今回のsample.shでは，監視するファイルイベントとしてCREATE(ディレクトリ名kanshiにファイルが送信された時)とCLOSE_WRITE(ファイルの転送が完了した時)，そしてATTRIB(メタデータが変更されたとき)の3つをトリガーに設定しています．

/home/user/kanshiの中を監視して，もしCREATEを検知したら処理開始がechoされるようになっています．

CREATEのみをトリガーとしたい場合はCLOSE_WRITEは不要です．

if文の中ではinotifywaitコマンドを変数noticeとした上でCREATEが表示されるはずの行と位置を抜き取り，「CREATEが表示されるなら」という条件に設定しています．

その他のイベントや使用例については，https://qiita.com/stc1988/items/464410382f8425681c20 を参考にすると良いと思います．
パスワード入力欄を、作成しよう

ファイルに、パスワードを入れたい時があるので、
パスワードをつけたいなぁと、思いました
なので、パスワード認証画面を、投稿させていただきましたぁ



<h1>背景の設定</h1>
```ruby
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>パスワード認証画面-パスワードを入力</title>
</head>
//背景
<body>
<body style="background-image: url(あんこ.jpg);">

```
<h2>パスワードの設定と、パスワードに正解したときのページジャンプ
</h2>

```ruby


<script type="text/javascript"><!--
function myEnter(){
   myPassWord=prompt("パスワードを入力して頂いて、okボタンを、押してください。","");
/パスワード
if ( myPassWord == "3-1seikatu" ){
/パスワード入力に成功したとき移動するページ
    location.href = "3-1seikatu.html";
} else if(myPassWord == "vzvvz") {
    location.href = "https://z.html";



/パスワードを間違えた
} else {
   alert( "パスワードが違います!あぁ残念" );
}
		
//	if ( myPassWord == String.fromCharCode(112,97,115,115,104,121) ){
   // location.href = String.fromCharcode(104,46,112,97,115,115)+".html";
//}""



		
//   else{
   //   alert( "パスワードが違います!あぁ残念" );
  // }
}
// --></script>
<center>
<form>
```
<h3>ボタンの上に置く言葉とボタンに書く言葉</h3>
```ruby

/ボタンの上に置く言葉

  <p>対象年齢　G　</p>
  <p>パスワード認証画面
/パスワードを入力するためのボタン 
    <input type="button" value="パスワードお願い" onclick="myEnter()">
  </p>
</form>
</center>

	
</body>
</html>

```

僕が、使用している、パスワード画面の背景は、![Something went wrong]()
です。
ファイル名は、あんこ.jpg　で、保存してください
上記が、パスワード認証画面に使う、プログラムコードです。
参考にしてください
form input type="file"のCSSを変える方法

# 目的
form、type="file"の デフォルトのCSSを変更する
![Screen Shot 2022-01-06 at 14.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977965/1339f578-83ab-9ab3-7387-0ffe65575029.png)

# 手順
* 新しいlabelを用意する
* デフォルトのボタンをdiplay:noneで削除
* 新しいlabelのCSSを変更する

## 新しいlabelを用意する
```html
<label for="file-upload" class="custom-file-upload">
      Custom Upload
</label>
<input type="file" name="image" id="file-upload">
```

## デフォルトのボタンをdiplay:noneで削除
```css:デフォルトのボタンを削除するCSS
  input[type="file"] {
    display: none;
}
```

## 新しいlabelのCSSを変更する
```css:新しいlabelに効かせるCSS
.custom-file-upload {
    border: 1px solid #ccc;
    display: inline-block;
    padding: 6px 12px;
    border-radius: 4px;
    background-color: rgb(241, 241, 241);
    cursor: pointer;
}

```
このCSSセレクタはlabelのCSSと一致させる。
好きなCSSを設定可能

## 完成イメージ
![Screen Shot 2022-01-06 at 14.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977965/6c7b1815-ff98-3f65-c81f-3cd4754643b2.png)


## 追記 アップロードしたいファイルを選んだ後にファイル名を表示させる
デフォルト機能のようにセレクトしたファイル名を表示させたい場合
ファイル名を表示するための<span>などを追記、javascriptで表示させる必要がある

```html:ファイル名を表示させるための場所
<span id="file-selected"></span>
```

```javascript:以下の記述がファイル名を表示させる機能
$('#file-upload').bind('change', function () { var fileName = ''; fileName = $(this).val(); $('#file-selected').html(fileName); })
```

### (補足)HTML内にインラインで記述したい場合
javascriptを読み込むのを忘れないこと
これを忘れると以下のエラーが出る
`Uncaught ReferenceError: $ is not defined`

```html:インライン表記の場合
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>  <script>
$('#file-upload').bind('change', function () { var fileName = ''; fileName = $(this).val(); $('#file-selected').html(fileName); })
</script>
```
上記をhtml内ボディ閉じタグの上あたりに記述

## 完成イメージ

![Screen Shot 2022-01-06 at 15.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977965/aa93cbe9-5bfc-5112-ab16-16244343cf58.png)
SFTP環境構築 - WinSCP

# WinSCP

WinSCP を使ってコマンドラインから SFTP のファイル転送を自動実行できるようにします。

## サイト設定

まず WinSCP を GUI で起動します。

Login 画面で [New Site] をクリックし、各項目を入力した後に [Save] で保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/e613b398-c6d3-e3c9-f77d-565c32366bc6.png)

[Site name] は任意の名前を指定し、[Save password] にチェックを入れて [OK] で進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/a1f1af66-1396-9f84-251c-124a48a8545c.png)

作成した Login 情報をダブルクリックし接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/d3e9b8cf-e53d-f905-38a9-1171f9074f54.png)

Warning が出た場合は [Yes] で進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/48b70860-307a-13e3-e408-ff10c1281553.png)

[Password] を入力して [OK] で進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/efe3400c-c4c8-fddb-4bf0-e8a4786eb583.png)

ログインできることを確認したら WinSCP を閉じます。
鍵認証の場合は別途必要な設定を行います。

## スクリプト設定

次で設定するバッチファイルから呼び出します。

```file:script_test.txt
# バッチモードをオン
option batch on
# 確認の無効化
option confirm off
# リモートのディレクトリ移動
cd /home/admin/sftp_data
# バイナリモード
option transfer binary
# アップロード
put C:\Apps\WinSCP\test_data.txt
# ダウンロード
get test_data2.txt C:\sftp
# 終了処理
close
exit
```

## バッチファイル

[Site name] が admin@192.168.0.99 の場合です。

```file:script_test.bat
c:
cd \apps\winscp
winscp.exe /console /script=script_test.txt /log=C:\temp\winscp.log admin@192.168.0.99
```

作成したバッチファイルを実行して正常に動作することを確認します。

## スケジュール化

Windows の [タスク スケジューラ] にバッチファイルを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/0b7ddeb1-d627-1b78-19d4-9bf24980ba10.png)

トリガーの時間調整を行い正常に動作することを確認します。

以上で完了です。
Go Modulesの使い方

## v2以上のバージョンを持つライブラリのimport
[golang/goのWiki](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) に書いてある通り、v2以上ではモジュールのパスに `/vN` をいれる必要がある。これを読むだけだとわかりにくいのだが、具体的には、importする際に `import "github.com/k0kubun/pp"` のかわりに

```go
import (
    pp "github.com/k0kubun/pp/v3"
)
```

とする必要がある。`/v3` なしで書くとgo.mod内で `v3.0.1+incompatible` とかになってしまう。

k0kubun/ppのリポジトリがディレクトリをv3で開始していたり、ブランチにv3を持っていたりといったことをする必要はない。

## go mod tidy

```bash
go mod tidy
```

をやるとgo.modがいい感じになる。使わなくなったものを消したい時などに使うとよさそう。

## Go Modulesのリリース

普通にgit tagを `vX.Y.Z` で打つ。打たないと、ちゃんとGo Modulesで使ってる人には更新が行かなくなりそう。

## tools.go
[tools.go という文化](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module) があるらしい。k0kubun/pp みたいな、一時的には使うけどそれを使うコードをコミットするわけではないみたいなライブラリも、tools.go 内でimportしておくと、k0kubun/pp を使う度にgo.modに差分を出すことを防げてよさそう。

```go:tools.go
package main

import (
    _ "github.com/k0kubun/pp/v3"
)
```
gawk　チートシート

# gawkチートシート

個人用メモです。

## -fオプション 入力フィールド区切り文字の設定

入力フィールド区切り文字の設定をします。

## -vオプション 変数の設定

プログラムの実行が開始される前に、変数varに値valを割り当てます。そのような変数値は、AWKプログラムの開始規則に利用可能です。

ビルトイン変数を書き換えることで、default動作を変更することもできます。

```shell
gawk -v RS="" '{gsub("aaa", "test"); print $0 }'
```

## gawkのビルトイン変数

変数名 | 説明
--|--
ARGC | コマンドライン引数の個数(gawkへのオプションと、プログラム指定は含みません)。
ARGIND | 現在処理中のファイル名が格納されている配列ARGVのインデックス。
ARGV | コマンドライン引数の配列。配列は、0からARGC-1までのインデックスを持ちます。ARGVの内容を変更することで、入力に用いるファイル名を変更することができます。
CONVFMT | 数値の変換フォーマット。デフォルト値は"%.6g"です。
ENVIRON | 現在の環境変数の値からなる配列。配列は、環境変数名によりインデックスされ、各要素の値はその環境変数の値です(例えばENVIRON["HOME"]は/home/arnoldとなるでしょう)。本配列に代入を行っても、gawkからリダイレクトやsystem()関数により実行されるプログラムの環境には影響を与えません(これは、将来のgawkでは変更される可能性があります)。
ERRNO | getlineのリダイレクト、getlineによる読み込み、close()関数の実行時のいずれかにシステムエラーが発生した場合、変数ERRNOにはエラーの内容を示した文字列が設定されます。
FIELDWIDTHS | 空白で区切られたフィールド長のリスト。もしこの値が設定されていれば、gawkはFSの値を用いてフィールド分割するかわりに、固定長のフィールド分割を行います。固定長のフィールド分割機能はまだ実験的なもので、gawkが改良されるに従って意味が変化する可能性があります。
FILENAME | 現在の入力ファイル名。もし、コマンドラインで入力ファイルが指定されていなければ、FILENAMEの値は``-''です。しかしながら、BEGINブロック内ではFILENAMEは未定義です。
FNR | 現在の入力ファイルにおける入力レコード番号。
FS | 入力フィールドセパレータ。デフォルトでは単一の空白です。上述のフィールドを参照してください。
IGNORECASE | すべての正規表現と文字列操作において大文字小文字の区別を制御します。もし、IGNORECASEが0でない値に設定されていれば、文字列比較、ルールのパターンマッチ、FSによるフィールド分割、RSによるレコード分割、~と!~による正規表現マッチ、定義済み関数gensub(),gsub(),index(),match(),split(),sub()において大文字と小文字の違いは無視されます。このため、IGNORECASEが0以外の値なら、/aB/は"ab","aB","Ab","AB"のいずれにもマッチすることになります。他のAWK変数と同様にIGNORECASEの初期値は0なので、通常は正規表現と文字列操作において大文字と小文字は区別されます。Unixでは、大文字小文字を無視する場合、ISO8859-1Latin-1文字集合全てを使用できます。注:3.0以前のgawkではIGNORECASEは正規表現操作のみに影響しました。現在は文字列比較にも影響します。
NF | 現在の入力レコードのフィールド数。
NR | 現在までに読み込んだ入力レコード数の合計。
OFMT | 数字の出力フォーマット。デフォルト値は"%.6g"です。
OFS | 出力フィールドセパレータ。デフォルトは空白です。
ORS | 出力レコードセパレータ。デフォルトは改行です。
RS | 入力レコードセパレータ。デフォルトは改行です。
RT | レコードターミネータ。gawkは、RSで指定される文字または正規表現にマッチする入力テキストを、RTに設定します。
RSTART | match()によりマッチした最初の文字の位置。0はマッチしなかったことを示します。
RLENGTH | match()によりマッチした文字列の長さ。-1はマッチしなかったことを示します。
SUBSEP | 多次元配列を実現する際に用いられる、配列のインデックスを結合する文字。デフォルト値は"\034"です。

## -i inplace 上書き

`-i inplace`で上書きできます。

```shell
gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
```

## 最短マッチ

*や、+は最長マッチなので、最短マッチを使用したいときは否定を使う

htmlタグ内を取得したい場合、`<.+>`ではなく、`<[^>]+>`にする。

```shell
gawk '{gsub("aaa[^;]+;", "test"); print $0 }'
```

[awk正規表現一覧](https://kore1server.com/385/awk%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E4%B8%80%E8%A6%A7)

## 行数指定

```sh
# 1行目
gawk 'NR==1{print}'

# 2行より下を出力
gawk 'NR>2{print}'

# ログの最後から見て、最初に登場する条件に一致した要素を出力
cat log.txt | tail -r | ggrep "ft" | gawk 'NR==1{print}'
```

## 合計

```sh
# 2列目の合計
gawk '{s += $2} END {print s}'

# 2列目と4列目の合計
gawk '{time+=$2; cpu+=$4} END {print time, cpu}'

# 2列目と4列目の合計(書式の指定)
gawk '{time+=$2; cpu+=$4} END {printf "std time: %d, cpu: %d\n", time, cpu}'
```

## 末尾の要素

```sh
# 末尾の要素
gawk '{print $NF}'

# 末尾から数えてn番目の要素
gawk '{print $(NF-n)}'
```

## cutも使おう

```sh
echo "/a41dc76cb007e/7.4/buster/fpm" | cut -d / -f 3-
```
Genie: POST の引数の処理

こちらと同じことを Genie で行いました。
[FastAPI: POST の引数の処理](https://qiita.com/ekzemplaro/items/77507876c1551c6464df)

```julia:post01.jl
using Genie
using Genie.Router
using Genie.Renderer.Json
using Genie.Requests

function launchServer(port)

	Genie.config.run_as_server = true
	Genie.config.server_host = "0.0.0.0"
	Genie.config.server_port = port

	println("port set to $(port)")

	route("/") do
		"Hello."
	end

	route("/sum", method = POST) do
	@show jsonpayload()
	@show rawpayload()
  	aa = jsonpayload()["aa"]
  	bb = jsonpayload()["bb"]
	sum = parse(Float64,aa) + parse(Float64,bb)
	rvalue = Dict()
	rvalue["wa"] = sum
	json(rvalue)
	end

	route("/diff", method = POST) do
  	aa = jsonpayload()["aa"]
  	bb = jsonpayload()["bb"]
	diff = parse(Float64,aa) - parse(Float64,bb)
	rvalue = Dict()
	rvalue["sa"] = diff
	json(rvalue)
	end

	Genie.AppServer.startup()
end

launchServer(parse(Int, ARGS[1]))
```

サーバーの起動

```bash
julia post01.jl 8000
```

クライアントからアクセス

```text
$ http POST http://127.0.0.1:8000/sum/ aa=12.1 bb=34.5
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Genie/Julia/1.5.3
Transfer-Encoding: chunked

{
    "wa": 46.6
}
```

```text
$ http POST http://127.0.0.1:8000/diff/ aa=12.1 bb=34.5
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Genie/Julia/1.5.3
Transfer-Encoding: chunked

{
    "sa": -22.4
}
```
PowerShellですべてのエクセルプロセスを終了させる


すべてのExcelプロセスを終了させるpowershellスクリプトです。

大量のエクセルファイルを開いたり閉じたりすると，エクセルプロセスが残り重くなるので，適切な感覚で下記スクリプトを組み込むとエクセルプロセスを強制終了させることができます。

```Powershell:Stop-Excelprocess.ps1
# Stop All Excel process
Get-Process -Name EXCEL* | Stop-Process

# 全てのプロセスが終了するまで待機
#   -gt : > 
while ((Get-Process -Name EXCEL*).count -gt 0)
{
    Start-Sleep -m 200
}

```
GitHubのプルリクエストにきれいな差分表示を付ける

## コード
Markdownのコードブロックにdiffを付ければ表示できます。
差分には「-」と「+」を付けましょう

    ```diff
    - gem 'rubocop', require: false
    + gem 'rubocop'
    ```

## 表示例
[![Image from Gyazo](https://i.gyazo.com/3c5e3440703675c3748bd6b9ecabb31f.png)](https://gyazo.com/3c5e3440703675c3748bd6b9ecabb31f)


なんとなくやってみたら思ったように動いてむっちゃ嬉しかった。
自動答え表示機能付き問題作成しよう

今回は、答え合わせボタンを、押すと、自動的に答えを点数を表示してくれる、WEBアプリを、作ってみたいと、思います!!!!!
下記のソースコードは、本当に動くものです
参考にしていただければ幸いです。



###答え合わせボタンを、押された時の答え



```html
<html>
<head>
<title>例題４</title>
<script type="text/javascript">
function kotae()
{
ten=0;
if(f.q1.value == "事件や事故が起きたとき :日本全都道府県") {f.q1.style.backgroundColor="aqua ";ten = ten + 25}
else f.q1.style.backgroundColor="red"
if(f.q2.value == "高松市") {f.q2.style.backgroundColor="aqua ";ten = ten + 25}
else f.q2.style.backgroundColor="red"
if(f.q3.value == "名古屋市"){f.q3.style.backgroundColor="aqua ";ten = ten + 25}
else f.q3.style.backgroundColor="red"
if(f.q4.value == "金沢市")  {f.q4.style.backgroundColor="aqua ";ten = ten + 25}
else f.q4.style.backgroundColor="red"
f.tokuten.value=

}
</script>
```
上記が答え合わせボタンを押された時の、答えを持ってくる場所です
<h2>次は、問題を、表示する</h2>

```html
<body>
<form name="f">
110は、どこで、いつ、使用されている電話番号ですか
<select name="q1">
<option>選択肢</option>
<option>雪がすごくいっぱいで大変な時:北海道</option>
<option>人が海におぼれたとき:アメリカ</option>
<option>事件や事故が起きたとき :日本全都道府県</option>
<option>しんどいとき:日本　一部</option>
</select>
です。
<p>
香川県の県庁所在地は 
<select name="q2">
<option>選択肢</option>
<option>名古屋市</option>
<option>松山市</option>
<option>金沢市</option>
<option>高松市</option>
</select>
です。<p>
愛知県の県庁所在地は 
<select name="q3">
<option>選択肢</option>
<option>名古屋市</option>
<option>松山市</option>
<option>金沢市</option>
<option>高松市</option>
</select>
です。<p>
石川県の県庁所在地は 
<select name="q4">
<option>選択肢</option>
<option>名古屋市</option>
<option>松山市</option>
<option>金沢市</option>
<option>高松市</option>
</select>
です。<p>
```

上記が、問題を表示して、入力欄を作成するところです
<h3>次は、答え合わせボタンを押したら、inputboxに、点数を表示する
　　作成です</h3>


```html
<input type="button" name="b1" value="答え合わせ" onclick="kotae()"> <p>
<input name=tokuten size="6">点
</form>
</body>
</html>
 <script type="text/javascript">
    const quiz = document.getElementById("quiz");
    questions.forEach(({question, selections, answer}, index) => {
      quiz.appendChild(document.createTextNode(question));
      const select = document.createElement("select");
      select.id = `q${index + 1}`;
      selections.forEach(selection => {
          const option = document.createElement("option");
          option.appendChild(document.createTextNode(selection));
          select.appendChild(option);
      });
      quiz.appendChild(select);
      quiz.appendChild(document.createTextNode("です。"));
      quiz.appendChild(document.createElement("p"));
    });
  </script>

</body>
</html>

```

実行結果は、こちらをクリック↓↓
http://www2.kuma.u-tokai.ac.jp/~kfuji/hp/JavaScript/js4dd.html
ホームページ販売しているので。
上記のすべてを、コピペして、利用すると、
なんと、この80行位で、自動答え表示機能付き問題が、作成できるのです

参考にしていただけると、幸いです
これからも、どんどん記事や、質問を、投稿するので、フォローをお願いします
まだ初心者のため、間違えるところが1個くらい出ると思うので、
お願いいたします
gsed　チートシート

# gsed

gsedのメモです。

## gsedオプション

### -e スクリプトの指定

```shell
-e script, --expression=script
    add the script to the commands to be executed
```

eオプションを使用することで、コマンドをどこに記載するか明確にsedに伝えることができます。
eオプションを使用しないと、第一引数、第二引数と意味が変わってきてしまうので、とりあえずつけて実行すればよいです。

### -i 上書き

上書き、もしくはバックアップファイルの指定

```shell
-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)
```

### -z 複数行を対象にする

基本的に一行ずつ処理が行われますが、複数行に対して処理をしたい場合はzオプションを指定します。行を跨いだ置換ができます。

```shell
-z, --null-data
    separate lines by NUL characters
```

## テクニック

### 行指定

ファイル内の指定の行数のみを変種するには、置換コマンドのsの前に数字をつければよいです。

```shell
# 1行目
sed -e '1s/abc/aaa/' <filename>

# 41 ~ 50行目
sed -e '41,50s/abc/aaa/' <filename>

# 最後の行
sed -e '$s/abc/aaa/' <filename>
```

### 区切り文字を変更する

```shell
 sed -e "s|src =|src =$(TMP)|" <filename>
```

### 行分割からnull文字分割に変更

GNUのsedは-z, --null-dataオプションを指定すると、行の分割を\nでなくnull文字で行ないます。

```shell
sed -z 's/\n/ /g' <filename>
```

### 空行を消去

```shell
sed -i '/^$/d' <filename>
```

### bash、zshのメタ文字に注意する

sedのスクリプトを囲むカッコでは、基本的にシングルクォーテーションを使用しましょう。

区切り文字|特殊文字
--|--
シングルクォーテーション | `'`
ダブルクオテーション | `\, $, "` 

### 基本正規表現と拡張正規表現

POSIXの正規表現には基本正規表現と、拡張正規表現があります。

意味|基本|拡張|注意点
-|-|-|-
POSIX文字クラス表現|[::]|[::]|環境差異大
照合要素|[..]|[..]|環境差異大
等価クラス|[==]|[==]|環境差異大
エスケープ|\|\|
グルーピング(部分正規表現)|\\(\\)|()|
部分正規表現に対する後方参照|\n|\n|awk, egrepでは使用不可
直前の正規表現と指定回数一致|\\{m,n\\}|{m,n}|awk,egrepでは使用不可,gun egrep, gawkでは基本正規表現使用可
直前の正規表現と0回以上の一致|*|*|
直前の正規表現と1回以上一致|\\+|+|sed,grepは基本正規表現
直前の正規表現と0回または1回一致|\\?|?|sed,grepは基本正規表現

## 表示出来ない文字を消去する

```
sed -i 's/[^[:print:]]//g' ファイル名
```
【Rails】「rails console」で書いたコードについて

「rails console」で書いたコードは原則として消えてしまう。
しかし、実行した結果は消えない。

つまり、「rails console」を使って
・「データベースへの登録」
・「データベースの更新」
を行うと、たとえ「rails console」を終了しても登録内容・更新内容は
データベースに反映されている。

※「データベースの更新」の場合は、「.save」メソッドを使って更新内容を保存しないとデータベースには更新内容が登録されないので注意。
iOS15からの'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene insteadに対応する

## はじめに
iOS15から`UIApplication.shared.windows`を使用すると`'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead`という警告が発火します。

今回はこちらの警告の解消法を記事にします。

## 環境
Swift version 5.5
Xcode version 13.2.1

## 原因
iOS15から、`windows`が非推奨になり,代わりに、`UIWindowScene.windows`を使えといっています。

## 対処法
このように書けば警告を解消できます。

```.swift
 let scenes = UIApplication.shared.connectedScenes
 let windowScenes = scenes.first as? UIWindowScene
 let window = windowScenes?.windows.first
```

`rootViewController`を定義したい場合は以下のように書けば動きます。

```.swift
 let scenes = UIApplication.shared.connectedScenes
 let windowScenes = scenes.first as? UIWindowScene
 let rootVC = windowScenes?.keyWindow?.rootViewController
```
## おわりに
ご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。

## おしらせ
現在、副業でiOSアプリ開発案件を募集しています！
全活動リンクをURLにまとめました。
https://linktr.ee/sasaki.ken

![LinkTree_200×200.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/e2dd3d99-db8b-a042-3f45-55933c34c59c.jpeg)
VSCode+TestExplorer+PHPUnitで'Run All Tests'が実行できない

# 環境
VSCode
+ [Test Explorer UI](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-test-explorer)
+ [PHPUnit Test Explorer](https://marketplace.visualstudio.com/items?itemName=recca0120.vscode-phpunit)

# 現象
個別のテストクラスは実行できるものの一括実行ボタンではエラーになる
（より正確には引数なしで実行されて、引数の一覧だけが表示される）

# 対処
phpunit.xmlを作成する
https://github.com/recca0120/vscode-phpunit/issues/42
MySQLのダンプファイルから、特定のテーブルのINSERT文を取り除く

## 目的

MySQLのダンプファイルから、とあるテーブルのINSERT文だけを取り除きたい。

## 理由

* 検証環境では利用しないテーブルで、かつそのデータ量(INSERT文)が非常に大きく、インポート時間が長い
* ダンプの出力そのものには手を入れない

## 方法

`sed` を使う。Windows環境でもWSLから使える。

## 具体例

gzipで圧縮されたMySQLダンプ（db-dump.sql.gz）から、3つのテーブルのINSERT文が書かれている行を除去して、再びgzipで圧縮して別名保存。

```
gzip -cd "db-dump.sql.gz" | sed -r '/INSERT INTO `(STOCK_C|STOCK_SET|FEE_PATTERN)`/d' | gzip > "./db-dump-sed.sql.gz"
```
Ruby 配列で重複した項目のみを取り出す

```ruby
arr = [1, 2, 3, 2, 4, 1, 5, 5]

arr.tally.filter_map { |k, v| k if v > 1 }.sort
=> [1, 2, 5]

arr.group_by{ |i| i }.reject{ |k,v| v.one? }.keys.sort
=> [1, 2, 5]

arr.filter_map{ |i| i if arr.count(i) > 1 }.uniq.sort
=> [1, 2, 5]
```

※2022/01/10追記
@jnchito さん から `Enumerable#tally` を使う方法をご提案いただきました。
https://qiita.com/akinov/items/3dad33174eb9e0c91f39#comment-075b6b4a1a80b624d417
配列の要素に対するInterlockedメソッドはスレッドセーフか？


マルチスレッドで配列の要素が`NULL`だったら値を入れるみたいな事がやりたかった。
アクセス頻度が高く`lock`ステートメントを使うと遅くて実用に耐えないので
`Interlocked.CompareExchange`でやりたいけど、大丈夫なんかいなというお話。

ソース的には雰囲気こんな感じ。

```
var array = new Class[N];

// (中略)

Interlocked.CompareExchange(ref array[i], new Class(), null);
```

結論としては「きっと大丈夫、たぶん」

まず配列の要素に対する`ref`はOK。
よって参照の割り当てはアトミックとされているので上記コードは理論上スレッドセーフとして成り立つはず。

ただやっぱりあまり例のない使い方で少し不安なので`Interlocked`の「分割不可能な操作」の正体について調べてみた。
ドキュメントには分割不可能な操作としか書かれていないので.NETのソースコードを追っていくと
どんどんネイティブな所に連れていかれ、最終的にはCPUレベルで実現しているという事がわかりました。
なので実装はCPUアーキテクチャによって変わりますが、x64の場合はこんな感じ。

```
// x64 
lock cmpxchg qword ptr [mem64],rdx
```

念のため検証コードも回してみましたが問題なさそう。

```
const int N = 1000;

var array1 = new object[100000];
var array2 = new object[100000];

var counter1 = 0;
var counter2 = 0;

// 非スレッドセーフ
Parallel.For(0, N, _ =>
{
	for (var i = 0; i < array1.Length; i++) 
	{
		if (array1[i] == null)
		{
			array1[i] = new object();
			Interlocked.Increment(ref counter1);
		}
	}
});

// スレッドセーフ
Parallel.For(0, N, _ =>
{
	for (var i = 0; i < array2.Length; i++) 
	{
		if (Interlocked.CompareExchange(ref array2[i], new object(), null) == null)
		{
			Interlocked.Increment(ref counter2);
		}
	}
});

Console.WriteLine($"{counter1}, {counter2}");
```

結果

```
173847, 100000
```

余談ですが、.NETのInterlocked回りのコードはコメントに色々書かれていて見ていて楽しいです。

# 参考
- [C# Reference - ref Keyword](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref)
- [C# Reference - .NET gabage collection](https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/)
- [SourceCode - Interlocked.CompareExchnage (.NET Framework)](https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.compareexchange)
- [SourceCode - Interlocked.CompareExchange (.NET Core)](https://source.dot.net/#System.Private.CoreLib/Interlocked.cs,a92390477e37baa8)
- [Windows API - InterlockedCompareExchange](https://docs.microsoft.com/ja-jp/windows/win32/api/winnt/nf-winnt-interlockedcompareexchange)
【Laravel】カラムのデータ型リスト

## カラムのデータ型リスト

| データ型 | 説明 |
| ---- | ---- |
| string | 文字列 |
| integer | 整数 |
| boolean | BOOLEANカラム |
| detetime | 日時 |
| bigIncrements	| 符号なしBIGINTを使用した自動増分ID（主キー） |
| unsignedBigInteger | 符号なしBIGINTカラム |

その他の参考資料：https://readouble.com/laravel/6.x/ja/migrations.html#creating-columns


## マイグレーションコマンド

| コマンド | 説明 |
| ---- | ---- |
| php artisan migrate |	マイグレーション実行 |
| php artisan migrate:status | マイグレーションステータス確認 |
| php artisan migrate:rollback | 直前に実行したひとまとまりのマイグレーションをロールバック |
| php artisan migrate:refresh | 全部ロールバックしてからマイグレーションし直す |
| php artisan migrate:fresh | 一旦全てのテーブルを削除してマイグレーションし直す |

※フレッシュコマンドはデータ削除をしてしまうため、実務では使用しない方が良い。
Salesforceでリードの取引開始済みの割合を表示する方法

Salesforceにはリードというオブジェクトがあり、一般的にはリードに入った顧客を取引開始済みをする運用になります。

よくあるお問い合わせとして
「特定の期間でリードが取引開始済みされた割合を知りたい」
つまり
『取引開始済み』となっているリード件数/特定期間に作成されたリード件数

をダッシュボードなどに表示したい　という要望があります。

今回はそのような要望を満たす方法をご説明します。


###ステップ1　レポートを作成
作成するレポートはレポートタイプ「取引開始済みのリード情報が関連するリード」を使用します
そして何かしらの項目をグループ化します
また、すべてのリードレコードではなく特定の期間や状況のリードの割合を見たい場合は検索条件で表示するレコードを絞り込みましょう

###ステップ2　レポートから数式を作成

数式設定は下記画像のように
・数式出力種別　は「％」
・数式は「CONVERTED:SUM/RowCount」です
![リード数式１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fce74dd4-d282-146a-456d-3fa9f9223254.png)

これでレポート作成は完了です。
下記画像のように割合が表示されていますね。
![割合１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cc39dd9d-957a-13fa-4bde-26a47ce98c10.png)

このレポートを使用しダッシュボードでも割合を表示させることが可能です
![ダッシュボード１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f7252185-4d99-6cad-14c8-9fdda197ffa7.png)
UbuntuでターミナルからVSCodeが開けなくなった時の対処法(WindowsPowerShell)

# 問題点
　WindowsPowerShellでUbuntu20.04からcodeコマンドでVSCodeを立ち上げていたものの、ある日突然Command 'code' not foundとのエラーメッセージが出て、VSCodeを開けなくなった。

# 考えられる原因
　前日にNode.jsのnpmのパスをWindowsに通していたので、その関係でUbuntu側のパスが変更された？

# 対処法
1. Ubuntuのユーザディレクトリに移動  
     $cd ~
1. ユーザディレクトリ内にある、「.bashrc」ファイルを編集   
    $ vim .bashrc  
1. bashの編集モード（挿入モード）に入る  
    $ i
1. 最後の行に以下の文を追加し、Windows側のVSCodeのパスを設定する  
    export PATH=$PATH:'/mnt/c/Users/ユーザー名/AppData/Local/Programs/Microsoft VS Code/bin'
1. 編集モード終了  
    Escボタンを押す
1. 保存してbashを終了  
    :wq
1. 編集内容の反映  
    $ source .bash_profile  
    $ source.bashrc
1. WindowsPowerShellの再起動  
    アプリを閉じて再度起動するだけ  

# 注意点
　私は以下の手順が抜けていたため、しばらく解決できずにいました。

- 編集内容の反映をしていない  
  これが抜けていたためか、bashの終了後再度bashrcのコマンドを打つと、「編集中のデータがあります」といった内容のエラーがでてきました。
- ターミナルを再起動していない  
  ただの凡ミスですが、私はWindowsPowerShellを開きなおさずにいたため、bash編集後もcodeコマンドが機能せず、混乱していました。

# 総論
　プログラミングやターミナル、環境設定自体初心者で、完全に初歩的な内容ですが、自分への備忘録として、また同じような課題に直面している初心者の方が簡単に手順を踏めるようにと、今回の記事を残すことにしました。
　今回の経験から、環境設定に関しては特に、自分でエラー原因などを調べてその対処法を探る自己解決力が求められると感じました。作業の内容や環境自体は人によってそれぞれで、他の人に聞いても一概には解決策が出せない場合もあるからです。今回調べながらも自力で解決できたことで、少しだけでもプログラミングに求められる自走力が身に付けられたかなと思いました。

# 参考、引用
「Snow System」さん記事  
https://snowsystem.net/other/windows/vscode-wsl-run-error/  
Qiita記事　「bashの編集」  
https://qiita.com/savaniased/items/d9d37d3b958c1f54237e  

　今回解決するにあたって、上記の記事を参考にさせていただきました。コマンド部分など、内容がかぶる部分も多いと思いますが、私が使用していたのがWindowsPowerShellで同じ状況の記事が見つからなかったことと、ほとんどターミナルを使ったことがない人にも手順が追いやすくなればと思い、すべての手順を一つにまとめて記事にさせていただきました。著作権上問題がある場合は、記事を削除させていただきます。
$Heroku push rejected due to an unrecognized error; error: failed to push some ref

### 初めに
今回この記事では、herokuにデプロイするする際に私が遭遇したエラーについて解決方法をこの記事で書いていきたいと思います。実はこのエラーは[こちら](https://stackoverflow.com/questions/8273226/heroku-push-rejected-due-to-an-unrecognized-error-error-failed-to-push-some-re)に記事が出ているのですが、英語の記事読むには抵抗があるという方に向けて書いております。参考になれば幸いです。
***

### 今回のエラー
```
// herokuにpushをするコマンド
$ git push heroku master

// pushの作業が行われて一見成功したように見えても下にエラーが吐かれる
//上に出ているターミナルのログは省略
! Heroku push rejected due to an unrecognized error. 
! We've been notified, see http://support.heroku.com if the problem persists.
```
***
### エラーの解決

最初にこのエラーに遭遇したときに、エラーを読むとherokuにpushはherokuが認識できないエラーによって拒否されましたと表示されており、heroku側が認識できないエラーってなんやねんって思っちゃいました笑

調べているうちに[こちら](https://stackoverflow.com/questions/8273226/heroku-push-rejected-due-to-an-unrecognized-error-error-failed-to-push-some-re)の記事を見つけて読み進めているとどうやらgitのlocal側で変更を加えた後に追加されていないファイルがあることが原因でpushが行えなかったらしいです。たまに、```$git add . ```で追加されないこともあるらしいので、その際には直接```$git add ファイル名```で追加してあげましょう。

### 解決手順
```
//どのファイルが差分を引き起こしているのかの確認
$git status

//差分を引き起こしているファイルを追加し、コミットを行う。
$git add .
または
$git add ファイル名

$git commit -m"コミットメッセージ"

//差分が消えたのかどうかを確認する(on branch cleanみたいな感じでファイル名が出力されなければOK)
$git status

//差分が消えたことが確認できたらherokuにpush
$git push heroku master
```
***
### 最後に
herokuにデプロイする際は、私も何度もエラーに遭遇しましたが、基本的にはターミナルのログを見ると書いてあることが多いのでしっかりとみてあげましょう。それでは快適なheroku Lifeを！
ChromebookにWSLのXクライアントを転送

Chromebook(Lenovo Ideapad duet)にwsl2のXクライアントを転送しました。同じようなことをしている人があまり見当たらなかったため、記録として残します。なお、ChromebookとWindowsおよびWSLはVPNソフトのZerotier Oneで繋がっています。

#実現方法
chromebook ↔ windows ↔ wslの経路をポートフォワーディングします。
まずchromebookからwindowsに接続し、「windowsからwsl(windows上のlocalhost)」への経路をポート10022にポートフォワードします。

```terminal:terminal_on_chromebook
ssh [windows_user]@[windows_IP_address] -L 10022:localhost:22
```

次に、chromebookの別のターミナルから以下を実行します。

```terminal:other_terminal_on_chromebook
ssh -XC -p 10022 [wsl_user]@localhost
```

xeyesなどを起動すると、ChromebookにGUIが表示されます。

```terminal:other_terminal_on_chromebook
xeyes
```

以上
Jenkins を導入する on macOS (Big Sur)

# Jenkins (LTS) を install
```
brew install jenkins-lts
```
# Jenkins を (ひとまず) 起動する
```
brew services start jenkins-lts
```
# 指示に従って、unlock & plugin installation
まぁここまでで何も問題はなかった
# troubleshooting
## git-lfs がないっていわれる
```
stderr: git-lfs filter-process --skip: git-lfs: command not found
```
こういう message. これに関してはいろんな解決方法がwebにはあるんだけど、一番簡単に済ませたかったので、以下の方法をここではリコメンドする。
そもそもの原因は、git-lfs が /usr/bin ではなく /usr/local/bin にあるため。なので、Jenkins自体のpath設定に/usr/local/bin を含めることを大方針とする。
ということで、[このコメント](https://issues.jenkins.io/browse/JENKINS-52857?focusedCommentId=351711&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-351711)を参照
Dashboard > Manage Jenkins > Manage Nodes and Clouds > (select a node) > Configure > Node Properties > turn on Environment variables
PATHの設定を追加。以上で git lfs も通るようになりました。
Homebrewのformulaを整理についての備忘録

## 依存していないfomulaの一覧
```
$ brew list | xargs -I{} sh -c 'brew uses --installed {} | wc -l | xargs printf "%20s is used by %2d formulae.\n" {}' | grep '0 formula'
```

## 依存関係も一緒に削除
```
$ brew rmtree <不要なfomula>
```
※ `rmtree` は `tap` しないと使えないので以下を実行してからとなります。

```
$ brew tap beeftornado/rmtree
```


## 最後にクリーンアップ

```
$ brew cleanup
```

## 依存関係を確認

どこから依存されているかは brew uses `--installed` を確認する。

```
$ brew uses --installed ca-certificates
curl                      fastlane                  libssh2                   openldap                  openssl@1.1               rtmpdump                  ruby
```
mountとumountのコマンド

## はじめに
最近よく触るので忘れぬうちに。

## mount
### 現在のマウント状況を見たい
一覧でがーっと

```
mount
```

意図したマウント状況を見たい時とか

```
mount | grep xxx
```

## umount
### マウントしたディレクトリをアンマウントしたい

この場合`yyy`ディレクトリのマウントが削除される。
一発で消えるのでご注意を

```
umount /xxx/yyy/
```

## 再起動しても消えないように
OSが再起動したときに自動でmountしてくれるように仕込みます。

### fstabに追記
`/etx/fstab`にviで追記する。
こちらの記事を参照させて頂きました:pray:
https://chiritsumo-life.com/20200723/linux-cifsmount/

この最後の`0 0`ってなんじゃい！て疑問はこちらの記事が解決してくれました。感謝です！
https://profaim.jp/tools/soft/linux/auto_mnt.php

`mount -a`はこの/etc/fstabを読みに行くらしいので、OS再起動が難しい環境の場合は

```
①mountコマンドが通ることを確認
②umount
③fstabに書いてあげる
④mount -a でエラーが出ないことを確認
```

で動作確認と定義してもよさそうですね。
mount -aはmountで何がマウントされているか確認してから叩く。

## おわりに
mountは要root権限だと思います。
（もちろんそうじゃない環境もあるかと）

異なるOSの特定ディレクトリを共有する、ってやったことがなかったので新鮮でした。

簡単ですが以上です！
【Project Euler】Problem 9: 特別なピタゴラス数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 9. ピタゴラス数

原文 [Problem 9:  Special Pythagorean triplet](https://projecteuler.net/problem=9)

**問題の要約：ピタゴラス数の3つの数の和が1000となるもの3つの積を求めよ**

ピタゴラス数はProject Eulerではよく出てくるので、今後のために基本ピタゴラス数を無限に発生させる関数**pyth**を作ります。

```python
import itertools, math
def pyth():
  for m in itertools.count(2):
    for n in range(1,m):
      if (m%2)==(n%2): continue
      if math.gcd(m,n) != 1: continue
      yield m*m - n*n, 2*m*n, m*m + n*n

g = pyth()
for i in range(5):
  print(next(g))
#(3, 4, 5)
#(5, 12, 13)
#(15, 8, 17)
#(7, 24, 25)
#(21, 20, 29)
```

後は3つの和の倍数が1000になるものを見つければよいだけです。

```python
import numpy as np
g = pyth()
while True:
  p = next(g)
  s = sum(p)
  if 1000 % s == 0:
    m = 1000 // s
    ansp = np.array(p)*m
    break

print(f"Answer : {ansp.prod()}, {ansp}")
```

（開発環境：Google Colab）
Python: FastAPI: @app.middleware("http") を複数書くとどうなる？

```python
...
@app.middleware("http")
async def f1(req: Request, call_next):
    print(f"⭐️{sys._getframe().f_code.co_name}")
    return await call_next(req)

@app.middleware("http")
async def f2(req: Request, call_next):
    print(f"⭐️{sys._getframe().f_code.co_name}")
    return await call_next(req)

@app.middleware("http")
async def f3(req: Request, call_next):
    print(f"⭐️{sys._getframe().f_code.co_name}")
    return await call_next(req)
...
```

↓

```
⭐️f3
⭐️f2
⭐️f1
```
逆順にコールされた。
【Project Euler】Problem 8: 数列の中の最大積

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 ８． 数列の中の最大積

原文 [Problem 8: Largest product in a series](https://projecteuler.net/problem=8)

**問題の要約：1000桁の数列の中の13桁の各桁の積の最大値を求めよ**

Pythonのように文字列の長さに制限がないとかなり簡単に書けますね。文字列$s$は長いので下の方に載せました。

```python
import numpy as np
L = 13
mprod = [0,0,0]
for i in range(len(s)-L):
  s1 = s[i:i+L]                                  # cut sub-string
  p1 = np.array(list(map(int,list(s1)))).prod()  # product
  if p1 > mprod[-1]:
    mprod = [i, s1, p1]  # [position, string, product]
print(f"Answer : {mprod}")
```

```Python
s = '73167176531330624919225119674426574742355349194934'\
'96983520312774506326239578318016984801869478851843'\
'85861560789112949495459501737958331952853208805511'\
'12540698747158523863050715693290963295227443043557'\
'66896648950445244523161731856403098711121722383113'\
'62229893423380308135336276614282806444486645238749'\
'30358907296290491560440772390713810515859307960866'\
'70172427121883998797908792274921901699720888093776'\
'65727333001053367881220235421809751254540594752243'\
'52584907711670556013604839586446706324415722155397'\
'53697817977846174064955149290862569321978468622482'\
'83972241375657056057490261407972968652414535100474'\
'82166370484403199890008895243450658541227588666881'\
'16427171479924442928230863465674813919123162824586'\
'17866458359124566529476545682848912883142607690042'\
'24219022671055626321111109370544217506941658960408'\
'07198403850962455444362981230987879927244284909188'\
'84580156166097919133875499200524063689912560717606'\
'05886116467109405077541002256983155200055935729725'\
'71636269561882670428252483600823257530420752963450'
```
構造化プログラミングについての解説

ありがちな処理で構造化プログラミングについて考えてみる

## 要件

データベースから何かのデータを取得し、加工したうえでファイルに出力する


## 要件を分解する

まず要件を分解して処理の概要を決める

* データベースから処理対象セットを取得する
* 処理対象セットを何か加工してリストを作る
* 出力用リストをファイルに出力する

これをフローチャートにすると以下

![structured_programming_fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031/6b4e9817-1f28-2e2c-f7d5-f2557bba1ed3.png)

## 処理概要を実装可能なレベルに分解する

実装するためには処理内容をもう少し細かく分解して適当な粒度にまとめる必要がある

* データベースから処理対象セットを取得する
    * 処理対象セットを取得するためのクエリーを構築する
    * クエリーを実行する
    * クエリー実行結果から処理対象セットを構築する
* 処理対象セットを何か加工して出力用リストを作る
    * 処理対象セットの全件に対して以下の処理を実行する
        * 合計を計算する
        * etc,...
* 出力用リストをファイルに出力する
    * 出力用リストの全件に大して以下の処理を実行する
        * リスト要素をファイルに出力する

フローチャートはこうなる

![structured_programming_fig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031/2027b464-d049-42c7-c51b-7dbe45715cf4.png)


## 実装

### 良くないパターン 1

全てを1メソッドに書く

```csharp
class DataExport{
    public void Export(){
        // データベースから処理対象セットを取得する
            // 処理対象セットを取得するためのクエリーを構築する
            var query = "select * from Table1 -- ,...";
            // クエリーを実行する
            // クエリー実行結果から処理対象セットを構築する
            var resultset = database.ExecuteQuery(query);
        // 処理対象セットを何か加工して出力用リストを作る
            // 処理対象セットの全件に対して以下の処理を実行する
            var total = 0M;
            var reportItemList = new List<ReportItem>();
            foreach(var item in resultset){
                var reportItem = new ReportItem(item);
                // 合計を計算する
                total += item.Amount;
                // etc,...
                reportItemList.Add(reportItem);
            }
        // 出力用リストをファイルに出力する
            // 出力用リストの全件に大して以下の処理を実行する
            using(var writer = new StreamWriter("report.txt")){
                foreach(reportItem in reportItemList){
                    // リスト要素をファイルに出力する
                    writer.Write(reportItem);
                }
            }
    }
}
```

これだと上で処理内容を分割して粒度によって分割した意味がなくなる

### ましなパターン

まとめた処理内容の粒度に従って適切にメソッドを分割する

```csharp
class DataExport{

    public void Export(){
        GetResultSet();
        CreateReportItemList();
        WriteReportItemList()l
    }
    ///<summary>データベースから処理対象セットを取得する</summary>
    private void GetResultSet(){
        // 処理対象セットを取得するためのクエリーを構築する
        var query = "select * from Table1 -- ,...";
        // クエリーを実行する
        // クエリー実行結果から処理対象セットを構築する
        var resultset = database.ExecuteQuery(query);
    }
    ///<summary>処理対象セットを何か加工して出力用リストを作る</summary>
    private void CreateReportItemList(){
        var total = 0M;
        var reportItemList = new List<ReportItem>();
        foreach(var item in resultset){
            var reportItem = new ReportItem(item);
            // 合計を計算する
            total += item.Amount;
            // etc,...
            reportItemList.Add(reportItem);
        }

    }
    ///<summary>出力用リストをファイルに出力する</summary>
    private void WriteReportItemList(){
        using(var writer = new StreamWriter("report.txt")){
            foreach(reportItem in reportItemList){
                // リスト要素をファイルに出力する
                writer.Write(reportItem);
            }
        }

    }
}

```

こうすると、要件に記述した内容が明確になり、処理内容を分割、まとめた内容とも比較し易い。
【Project Euler】Problem 7: 10001番目の素数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 7: 10001番目の素数

原文 [Problem 7:  10001st prime](https://projecteuler.net/problem=7)

まずは自力で奇数を順番に生成した素数で割って行って求めてみます。実行時間約16秒。

```python 
import itertools
pn=[2]
for n in itertools.count(3,2):
    for p in pn:
      divd = (n%p == 0)
      if divd: break
    if not divd: pn.append(n)
    if len(pn) >= 10001: break
print(f"Answer : {pn[-1]}")
```

安易ですが、前にも使ったsympyのnextprimeは,何番目か指定できるので一発で瞬時に求まりました。

```python
from sympy import nextprime
print(f"Answer : {nextprime(1,10001)}")
```
Rspecのrequest specにて値の削除や更新、作成などのテストをする際の注意点

## 概要
Rspecのテストで、値を更新や削除などのデータ変更が加えられた際に
テストの記述の仕方について多少手間取ったので備忘録としてアウトプットします。

## 環境
Ruby '3.0.1'
rails '6.1.4'
rspec-rails '5.0.2'

## テストコード
### 前提
今回のテストはpostコントローラーにdeleteリクエストを送った際に、
該当する投稿データが削除されるといったテストを想定します。
__なお、実際のコードについては説明に重点を置くため簡易的に表記します。__

_*controllers/posts_controller.rb*_

```ruby
class PostsController < ApplicationController
  def destroy
    post = Post.find(params[:id]) # 左記のコードでは誰の投稿でも削除が可能になってしますので、
    post.destory                  # ユーザー自身の投稿のみ削除可能にするための条件分岐等を行ったほうが良い
  end
end
```

_*spec/requests/posts_spec.rb*_ __（失敗例）__

```ruby
RSpec.describe "Posts", type: :request do
  describe 'DELETE /destroy' do
    # 以降はFactory_Botで設定済みと仮定
    # UserモデルとPostモデルの関連付けも設定済みと仮定

    let!(:user) { create(:user) } # テストユーザーを生成
    let(:post_params) { { content: 'example_content' } }
    let!(:post) { user.posts.create(post_params) } # userの投稿データを作成

    before do
      delete posts_path(post) # 投稿データを削除するリクエストを送る
    end

    it 'userの投稿が削除される' do
      expect(user.posts).not_to include post #左記のように記載すると失敗する
    end
  end
end
```

_*spec/requests/posts_spec.rb*_ __（成功例）__

```ruby
RSpec.describe "Posts", type: :request do
  describe 'DELETE /destroy' do
    # 以降はFactory_Botで設定済みと仮定
    # UserモデルとPostモデルの関連付けも設定済みと仮定

    let!(:user) { create(:user) } # テストユーザーを生成
    let(:post_params) { { content: 'example_content' } }
    let!(:post) { user.posts.create(post_params) } # userの投稿データを作成

    before do
      delete posts_path(post) # 投稿データを削除するリクエストを送る
    end

    it 'userの投稿が削除される' do
      expect(user.posts.reload).not_to include post #修正
    end
  end
end
```

### 失敗の原因
失敗例で記載したexpect内の`user.posts`は最初の`let!`に定義したユーザーのデータが格納されてしまっているので
__deleteリクエストを送る前のデータ__を参照していることになります。
したがって成功例で示したように`user.posts.reload`とすることによって
`user.posts`の__データを更新__してあげなければならなかったようです。

## 備考
- モデル同士の関連付けについて確認したい場合 →
[Railsガイド](https://railsguides.jp/association_basics.html)
-  Factory_Botについて確認したい場合 →
[github](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md)