OmniAICreator/Qiita-1.07M huggingface dataset:
お金のない世界を想像してみる

**最近お金の価値 について考える日々が続いてます**

僕が関わっている量子耐性ブロックチェーンの発明の関係ですね。

詳しくは僕のnoteへ↓

>[記事①:渡辺さんの特許「多変数暗号方式＝量子耐性」が備わるとブロックチェーンは真価を発揮して最強になる](https://note.com/kosaka_/n/nba6d69d8b5d5)


>[記事②:渡辺さんの特許「多変数(量子耐性)暗号✖️ブロックチェーン」で「発言歴が消えない」「絶対に乗っ取られない」「事業者をみんなでチェックする」民主的なSNS（事業創造パートナー求む）](https://note.com/kosaka_/n/n76c259e42f65)


>[記事③:強いて言えばこれは「ポストゼロ知識証明」という発明。事業者やユーザーは量子コンピュータによる未来の攻撃に対し完璧にリスクフリーになる](https://note.com/kosaka_/n/n6a54e3498cea)

**この技術はフィンテックと掛け合わさることで、お金や金融の概念をがらっと変えられる（はず）**

もしくは発展させられる革新性を持っています。だけどなかなか人に説明するのが難しいのも事実。（誰か助けて！）

今僕たちがありがたがっているお金。

自分のお金だと思っていても実は違ったりします。

今までの時代はそれで良くも悪くも回っていたけど市場の拡大とともに信用創造 がエスカレートしすぎたことで、いろいろな弊害が起きています。

こうした時代背景をみると、今注目を集めているフィンテックの真の価値は**「お金の民主化」**なんじゃないかと僕は思ってます。

**今僕たちが信頼してるお金はそれ自体に価値があるわけではなく・・・**

それが決済なり寄付なりで「移動したとき」にはじめて価値が生まれる、ということかもしれません。

なので、お金そのものをありがたがっている人ほど前澤さんの「お金配り」みたいな行為を品がないと闇雲に批判します。

当然それによって生まれた価値には一切気づかないか気づいても目を背けます。

**お金に人が支配されるのではなく、人がお金を支配する**
とでもいいますか、お金が民主化された世界とは、そんな世界のことなんじゃないかな。

**そして、お金が民主化されたその先にある世界が「お金のない世界」**

なんだと思います。

==================


**アクセスが多い他の記事**


**【多変数(量子耐性)暗号方式の特許を使って事業創造したい方求む！】**

- 標準化されるべきメイドインジャパンの知財です。
- ブロックチェーンの強力な補完技術でもあります。
- キーワードは＝**データ管理の主権をユーザー側に**。
- GAFAM超えを目指せます。


>→[記事①:渡辺さんの特許「多変数暗号方式＝量子耐性」が備わるとブロックチェーンは真価を発揮して最強になる](https://note.com/kosaka_/n/nba6d69d8b5d5)


>→[記事②:渡辺さんの特許「多変数(量子耐性)暗号✖️ブロックチェーン」で「発言歴が消えない」「絶対に乗っ取られない」「事業者をみんなでチェックする」民主的なSNS（事業創造パートナー求む）](https://note.com/kosaka_/n/n76c259e42f65)


>→[記事③:強いて言えばこれは「ポストゼロ知識証明」という発明。事業者やユーザーは量子コンピュータによる未来の攻撃に対し完璧にリスクフリーになる](https://note.com/kosaka_/n/n6a54e3498cea)


**【僕の略歴】**

- 新潟で面白いことやりましょう！


>→[記事①:何かワクワクできることを一緒にやりましょう](https://note.com/kosaka_/n/ne312cba752ba)


>→[記事②:新潟で面白いことやりましょう！](https://note.com/kosaka_/n/na8dc65342b29)


>→[記事③:地方ベッドタウンの宅地210坪を「坪47円」で買えた理由とその秘訣](https://note.com/kosaka_/n/nab5e7d013d28)


**【連絡先】**

- 遠慮なくメールください！
- メール→ tadahide@protonmail.com
- ライン→ tora3307tora
- - twitter→@Tadahide_Kosaka
セッションとクッキーについて

本日は、クッキーとセッションについて簡単な記事を
書いてみたいと思います。

少し前にログインした、サイトにもう1度ログインしようとしたら
ログイン状態になっていた。その都度ログインを行わなくてもいい
便利な機能、これが可能なのはセッションとクッキーという仕組みが
あるおかげです。

### セッション
セッションとは、Webサービスにおいて情報を一時的に記憶しておく仕組みです。
ショッピングサイトで買い物カゴに商品を入れて維持できるのはこの仕組みが
利用されています。
情報を一時的に保存し、保持することでサイトを離れても再度ログインした時にログイン状態や買い物カゴ
の情報を維持したままショッピングが再開できます。

### クッキー
クッキーとは、ブラウザが持っている、データを保存できる領域のことです。
セッションは一時的にデータを保存できるが、その保存先はデータベースではなく
ブラウザです。
ブラウザにあるセッションの情報の保存場所のことをクッキーとよびます。

以上が簡単にですがセッションとクッキーの説明です。
知らない間にこの仕組みを利用していたわけですね！！
今度時間を作ってもっと深堀りしていきたいと思います。
【Android】ボタンの影が切れないようにする

![Screenshot_1615260439.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/c7e9503b-f980-6c57-e5a9-0bd84200cc53.png)

親Viewに下記コードを設定することで、ボタンの影が切れなくなります。

```xml
android:clipChildren="false"
android:clipToPadding="false"
```
![Screenshot_1615260550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/f8c09a61-1b29-ec3f-5e2c-8966a500109d.png)
OpenCVで画像に余白を追加

# 概要
PythonのOpenCVで画像に余白を追加するプログラムを作りました．
同じフォルダー内にある画像に対して一括で処理できます．

# 開発環境
- Windows10
- Python ver3.7.7
- OpenCV ver3.4.1

# コード
~~~python
import cv2
import os
import glob
       

def main():
    BLUE = [255,0,0]
    img_files = glob.glob('*.png')

    for f in img_files:
        img = cv2.imread(f)
        fname, fext = os.path.splitext(f)

        height, width, channels = img.shape


        #画像の下に余白追加
        output = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=BLUE)     
        cv2.imwrite(fname+"_blue_flame.png", output)

if __name__ == "__main__":
    main()
~~~
BLUEのかっこ内の数値はRGBの値を指定しており，数値を変えることで他の色も指定できます．このコードではcopyMakeBorderを使っており，元の画像の上下左右に青色を50ピクセル分追加します．
数値をいじることで追加する余白の量や，色を変更することができます．

# 出力される画像
入力した画像はこちらです．
<img width="200" alt="sports_soccer_hiza_sliding.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177046/f3fe7c3b-2d38-0c1a-7035-cfe59855f160.png">
出力された画像はこちらです．
<img width="200" alt="sports_soccer_hiza_sliding_blue_flame.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177046/fc4c2a32-ea0d-4bcb-2fa1-84249a8b9253.png">　　

このように元画像に余白として青色が追加されています．
元の画像（いらすとや）の背景は透明なのですが，余白追加の処理をすると背景が黒くなっています．


背景が透明ではない画像（スキマナースの画像を使用）では，以下のように問題なく使用できます．
<img width="400" alt="cut57_pizza-600x401.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177046/752e4a23-c890-f5ba-5b58-4d4bd62983cc.jpeg">　<img width="400" alt="cut57_pizza-600x401_blue_flame.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177046/8aac4c31-4d73-eb93-1593-77849588eb93.png">

#使い方
上に示すコードが記されたファイルと，余白を追加したい画像を同じフォルダーに入れて，コードを実行すればOK
フォルダーに入れた画像は一括で処理されます．
処理後は元の画像も残ります．
パスを指定すれば，別に同じフォルダーじゃなくてもOK
画像の拡張子に合わせて，コードを書き換える必要あり（今回はpngを指定）．

#参考にしたサイト
OpenCV 画像上の基本的な処理　
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_core/py_basic_ops/py_basic_ops.html
copyMakeBorderの機能についてより詳しく記述してあります．

[Python3.6]OpenCVで画像を4分割
https://qiita.com/kino15/items/56c0fffce4c14a875199
コードだけではなく，記事の書き方も参考にしてます．
cloud-initでpackage-update-upgrade-installの頻度を指定する

* Ubuntu 20.04 にて確認

## 参考

* [python - How to properly use runcmd and scripts-user in cloud-init? - Stack Overflow](https://stackoverflow.com/questions/33666237/how-to-properly-use-runcmd-and-scripts-user-in-cloud-init)

## 設定

### 設定前

* 起動時に待たされる。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/6373d3c9-8b1d-3d54-fe6e-e510dea24028.png)


### 1度も実行させたくない場合

* コメントアウトする


```sh
sed -i \
 -e 's/^ - package-update-upgrade-install/# - package-update-upgrade-install/' \
 /etc/cloud/cloud.cfg
```

以下のようになる。

```yml:/etc/cloud/cloud.cfg
cloud_final_modules:
#- package-update-upgrade-install
```

### OS起動ごとに毎回実行させたい場合

* /etc/cloud/cloud.cfg.d/99_custom.cfg

```yml:/etc/cloud/cloud.cfg.d/99_custom.cfg
cloud_final_modules:
 - [ package-update-upgrade-install, always ]
```

* OSを再起動し、毎回`package-update-upgrade-install`が実行されることを確認。

![upgrade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/eb305a56-5d1a-e123-4ab1-e0341781ad0e.png)

### 1度だけの実行の場合

```sh
$ cloud-init-per -h
Usage: cloud-init-per frequency name cmd [ arg1 [ arg2 [ ... ] ]
   run cmd with arguments provided.

   This utility can make it easier to use boothooks or bootcmd
   on a per "once" or "always" basis.

   If frequency is:
      * once: run only once (do not re-run for new instance-id)
      * instance: run only the first boot for a given instance-id
      * always: run every boot
```


```yml:/etc/cloud/cloud.cfg.d/99_custom.cfg
cloud_final_modules:
 - [ package-update-upgrade-install, once ]
```

* 設定してから次回OS再起動時は実行される。2回目以降は実行されない。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/1c33d770-3053-dcf9-38c6-61ea8fc3b4a3.png)

実行されていないことが確認できる。
Composer dump-autload してもClass Not Found

# なにがおきたか
現在携わってるLaravelのプロジェクトで微妙な点として、
`composer dump-autoload`ではクラスマップを作成できない

というのも、ディレクトリ構成と名前空間が一致しなさすぎるため

なので`composer dump-autoload --optimize`でPSR-4を無視してロードしていた

しかし、ある日それをしても`Class Not Found`になった

# 原因
いつのまにか開発環境のComposerが2系になっていた
2からはPSR-4違反ができないようになっていた

>Composer 1.10で導入された警告に従って、無効なPSR-0 / PSR-4構成は、最適化オートローダーモードで自動ロードされなくなります。ほとんどの場合、これらの警告は、とにかく自動ロードすることを意図していないクラスに対するものであったため、大きな問題は予想されませんが、アップグレードする前にこれらをクリーンアップする方が安全です。

https://blog.packagist.com/composer-2-0-is-now-available/

なので1にダウングレードします

```bash
composer self-update --1
```

これで、1の最新になるのであとは`composer dump-autoload --optimize`する

本当は修正して規約に従いたいけど違反が多すぎる
渡辺さんの特許「多変数暗号方式＝量子耐性」が備わるとブロックチェーンは真価を発揮して最強になる

**友人の発明のPRを手伝ってます**

先日、友人の渡辺さんが自身の特許「多変数(量子耐性)暗号」についてプレスリリースを行いました。

>[量子耐性ブロックチェーン、および、その実装技術の完成について](https://prtimes.jp/main/html/rd/p/000000001.000069149.html)

>[関連記事:強いて言えばこれは「ポストゼロ知識証明」という発明。事業者やユーザーは量子コンピュータによる未来の攻撃に対し完璧にリスクフリーになる](https://note.com/kosaka_/n/n6a54e3498cea)

量子コンピューターが悪用される時代に備え、ポスト量子分野の研究は急務です。日本国内の産学官でも研究は進んでいますが、イノベーションは生まれていないのが現状です。

**日本政府もThe Clean Networkの枠組みに参加してますが・・・**

せっかく国内に今回発表したようなポテンシャルの高い技術があるのでもう少し小さな民間企業の知財に目を向けてもいいんじゃないでしょうか。

サトシナカモト の発明したブロックチェーンはとても革新的です。ですが現行のブロックチェーンは不完全でまだまだブラッシュアップの余地があります。

**金融分野でのブロックチェーンの活用には量子耐性（ポスト量子暗号）が不可欠。現在流行りのフィンテックのサービスはどれも「単なるITだよ」**

と友人の渡辺さんは言います。

たとえば一例を挙げると、自分のアカウントにログインする際、僕たちはIDとパスワードを自分で管理していると錯覚しがちですが、管理しているのはサービス事業者側のサーバーです。

ここに決定的な弱さがあるので不正侵入やアカウント乗っ取り、不正送金が後をたたず、量子コンピューターが悪用される世界ではこれがもっとひどくなります。これは安全と言われているブロックチェーンについても同じです。

ブロックチェーンのネットワーク自体は安全ですが、そこにアクセスしアクションを起こすための「鍵の管理方法」に不完全さが残っています。マウントゴックス事件のようなことが日常茶飯事になります。

**NISTはポスト量子の研究を進めてますが、未だ標準化できていない**

渡辺さんはそれを実現し国内特許までは取りました。

今回発表した技術は超簡単にいうと「鍵自体を無くせばいいよね」という発想を「多変数ログイン」「非可換アルゴリズム」によって実現しています。

自分のアカウントへのログイン認証が事業者側のサーバーからユーザー側に移ると言うか、ちょっと僕の知能では正確に表現できないですが、発明した渡辺さんは「鍵管理が民主化される」とよく言っています。

オンラインバンキングの口座やSNSなど、アカウントの乗っ取りが無くなりますし、ログインした先がブロックチェーンを用いたサービスであればアクティビティが改竄できないので不正が抑止されます。

管理者がいるブロックチェーンなら不正送金を遮断することも可能です。遮断してもそこに至るまでの記録が残っているので、後から法的な正当性をみんなで検証できるため民主的です（ユーザーみんなで事業者をチェックする仕組み）。

**僕はあくまでも後方支援しかしてませんが**

友人がこの発明を持っていること、そしてこの技術に関われていることを心から誇りに思っています。

とはいえ社会実装にはライセンシーやパートナーシップが欠かせません。

この技術の価値に未来を見出した方はぜひご連絡をお待ちしています。

[METEORA SYSTEM Co., Ltd.](http://meteora.co.jp/)

==================


**アクセスが多い他の記事**


**【多変数(量子耐性)暗号方式の特許を使って事業創造したい方求む！】**

- 標準化されるべきメイドインジャパンの知財です。
- ブロックチェーンの強力な補完技術でもあります。
- キーワードは＝**データ管理の主権をユーザー側に**。
- GAFAM超えを目指せます。


>→[記事①:渡辺さんの特許「多変数暗号方式＝量子耐性」が備わるとブロックチェーンは真価を発揮して最強になる](https://note.com/kosaka_/n/nba6d69d8b5d5)


>→[記事②:渡辺さんの特許「多変数(量子耐性)暗号✖️ブロックチェーン」で「発言歴が消えない」「絶対に乗っ取られない」「事業者をみんなでチェックする」民主的なSNS（事業創造パートナー求む）](https://note.com/kosaka_/n/n76c259e42f65)


>→[記事③:強いて言えばこれは「ポストゼロ知識証明」という発明。事業者やユーザーは量子コンピュータによる未来の攻撃に対し完璧にリスクフリーになる](https://note.com/kosaka_/n/n6a54e3498cea)


**【僕の略歴】**

- 新潟で面白いことやりましょう！


>→[記事①:何かワクワクできることを一緒にやりましょう](https://note.com/kosaka_/n/ne312cba752ba)


>→[記事②:新潟で面白いことやりましょう！](https://note.com/kosaka_/n/na8dc65342b29)


>→[記事③:地方ベッドタウンの宅地210坪を「坪47円」で買えた理由とその秘訣](https://note.com/kosaka_/n/nab5e7d013d28)


**【連絡先】**

- 遠慮なくメールください！
- メール→ tadahide@protonmail.com
- ライン→ tora3307tora
- twitter→@Tadahide_Kosaka
rails db:migrate:resetでDISABLE_DATABASE_ENVIRONMENT_CHECK=1と出た時

##エラー内容
開発でrails db:migrate:resetを本番環境でした際に、

```ruby
$ rails db:migrate:reset RAILS_ENV=production

Creating network "child_app_default" with the default driver
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

```
とエラーが出た。

##対処法
DISABLE_DATABASE_ENVIRONMENT_CHECK=1をつけてあげるだけ！

```ruby
$ rails db:migrate:reset RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```
これで実行できます！
【SalesForce, Apex】SOQLでn日前のレコードを取得したい時にLAST_N_DAYS:nを使ったけど思い通りにはならなかった


# n日前を起点にそれ以前のデータを取得するという条件を作りたい

```sql
SELECT Id From Account WHERE CreatedDate <= n日前
```

## LAST_N_DAYS:nが使えるかな？
こんな条件になるのですが、 `n日前` をSOQLの日付リテラルが使ってできないかなーと思いながら見ていて
`LAST_N_DAYS:n` がそれっぽくできるかなと思ったんですけど、

> 数値 n が指定されている場合、本日から、その n 日前までが指定されます。
これには、過去の日だけではなく、本日も含まれます。たとえば、LAST_N_DAYS:1 には、昨日と本日が含まれます。

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm
思い通りにいかなかった。

> 過去の日だけではなく、本日も含まれます

こう書いてある通り、その期間を含んで条件を作るんですよね。つまり、

```sql
CreatedDate <= IN (2/12, 2/13, 2/14, 2/15) 
```
こんな書き方はないけど、↑みたいなイメージになる。

要するに、

```sql
CreatedDate <= 2/15
```
と変わらない。


## LAST_N_DAYS:nを活かして期待するレコードを取得するとしたら？

```sql
SELECT Id
From Account
WHERE CreatedDate <= last_n_days:3
  AND CreatedDate != last_n_days:3
```
こんな感じになるんですけど、分かりづらいですね。


# 結果
Apex側で三日前の値を作り、クエリ文にbindして作る感じにするというところに落ち着きました。

```Apex
Date threeDaysAgo = Date.today() - 3;
Datetime dateTimeOfThreeDaysAgo = Datetime.newInstance(threeDaysAgo, Time.newInstance(0, 0, 0, 0));
String query = 'SELECT Id FROM Account WHERE CreatedDate = :dateTimeOfThreeDaysAgo';
```

いい方法あったら教えてください。
Elixirでlikeを使う例（クエリ）

```elixir

product = "XPS-13"
like = "%#{product}%"

from(p in Product,
  where: like(p.product_name, ^like),
  select: %{product_id: p.id, description: p.product_desc}
) |> Repo.all

```


### 参考

https://elixirforum.com/t/ecto-query-using-like-ilike-in-query/23384

https://hexdocs.pm/ecto/Ecto.Query.API.html#like/2
VMware上ゲストOSのIPアドレスを固定化する

# VMware上ゲストOSのIPアドレスを固定化する

とある事情で、有線LANでインターネットとつながったWindows10上で
動作しているゲストOSにおいて、
DHCPで動的に割り当てたIPアドレスではなく、固定のアドレスを設定する必要が
生じました。本記事はその備忘録的なまとめです。

## 作業環境

* Windows10 （ホストOS）
* VMware Workstation 16 Player
* Ubuntu 18.04（ゲストOS）
* まったりできる部屋(/・ω・)/

## 用意するもの

* グローバルIPアドレス
* 休憩用のおやつ（300円まで）

## 設定前に：動的割り当て範囲・固定IPの確認

WindowsでC:/ProgramData/VMware/vmnetdhcp.conf を開きます。
（※C:/ProgramDataフォルダは隠しファイルの表示を有効にしていないと表示されません！）  
vmnetdhcp.confではDHCPによるIP動的割り当てについての設定が以下のように記述されています。

~~~ py
# Virtual ethernet segment 8
subnet 192.168.65.0 netmask 255.255.255.0 {
range 192.168.65.128 192.168.65.254; # default allows up to 125 VM's
option broadcast-address 192.168.65.255;
option domain-name-servers 192.168.65.2;
option domain-name "localdomain";
option netbios-name-servers 192.168.65.2;
option routers 192.168.65.2;
default-lease-time 1800;
max-lease-time 6500;
}
host VMnet8 {
    hardware ethernet xx:xx:xx:xx:xx:xx;
    fixed-address 192.168.65.1;
}
# End
~~~

上から3行目、range で始まる行が、DHCPによって動的に割り当てられる
IPアドレスの範囲です。

そして下部 host VMnet8 {..} の中にある fixed-address が固定的なプライベートIPアドレスです。  
今回はこのプライベートIP⇔グローバルIPのNAT関係をつくって、
ネットワーク接続できるように設定します。

## Windows側設定 

* 「Windowsキー + R」でncpa.cplと入力し、コントロールパネルの「ネットワーク接続」を開きます。
* 「VMware Network Adapter VMnet8」のような項目があるかと思いますので、ダブルクリックで開きます。
* 表示されたダイアログの左下にある「プロパティ」ボタンをクリックします。
* 表示されたプロパティの中央部分、「この接続は次の項目を使用します」から、  
「インターネットプロトコルバージョン４(TCP/IPv4)」をダブルクリックします。
* 「次のIPアドレスを使う」を選択し、プライベートIP、サブネットマスク、デフォルトゲートウェイ、DNSアドレス([8.8.8.8](https://otona-life.com/2019/05/28/13017/)など)を入力します。

## ゲストOS側設定

* ゲストOS側のネットワーク設定を開きます。Ubuntu18.04なら右上のボタンから開けます。
* 「有線」の項目にある設定ボタン（歯車マーク）を押し、IPv4タブを選択します。
* 「IPv4メソッド」から「手動」を選択し、下部にアドレス、ネットマスク、ゲートウェイを記述します  
* 「適用」をクリックし、ゲストOSを再起動します。

## これで最後！NAT設定

先ほどDHCP設定を確認するために訪れたC:/ProgramData/VMware配下の
vmnetnat.confを開きます。

いろいろ書いてありますが、途中に[incomingtcp]という記述があると思います。
この下に「特定のポートにTCPセグメントが飛んできたときの設定」を書いていきます。

例えばこんな感じ。

~~~ py
[incomingtcp]
# Use these with care - anyone can enter into your virtual machine through these...

3300 = 192.168.65.1:3300
~~~

上のように書くと、「ホストOSの3300番ポートにやってきたTCPセグメント」が、
「ゲストOS(192.168.65.1)の3300番ポート」に転送されます。

vmnetnat.confを保存したら、VMwareのNATサービスを再起動するため
[管理者権限で開いたpowershell](https://pc-karuma.net/windows-10-powershell/)で以下の2つのコマンドを打ち込みます。

~~~ bash
$ net stop "VMWare NAT Service"

$ net start "VMWare NAT Service"
~~~

設定はこれで終了です！
ホストOS側から「localhost:3300」でアクセスできるようになります。

## 参考

* https://akng-engineer.hatenablog.com/entry/2019/01/03/140549
* https://designare.jp/blog/noda/vmware%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A.html

## 追伸

今回、セキュリティ対策的な部分のことは省いています。
この記事を参考にしてもらえるのは嬉しいですが、例ではグローバルIPアドレスを使って
（インターネット全体から）アクセスできるようにしているので、試すときはその危険性を
認識した上、自己責任でお試しください。

なお、休憩用のおやつにはイオンに売っていた「香ばしく焼き上げたオーツ麦の
クッキー」を使用しました。さくさくして美味しかったです。
301リダイレクトするためにXserverから.htaccessを編集する（wordpress）

ぱぱっと簡単にメモ。
リダイレクト処理は本当苦手、借りてるサーバーによって記述の仕方が違うらしいしあんまり詳しく解説してるサイトもなかった。

##概要
今回は同じドメインで異なるディレクトリへのリダイレクト処理を行う。
結論、記述するところはこの部分`BEGIN WordPress`
これの中身に記述。

```
# BEGIN WordPress
# `BEGIN WordPress` から `END WordPress` までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^itero.html$ /itero/$1 [R=301,L]
</IfModule>

# END WordPress
```
今回付け足したのは`RewriteRule ^itero.html$ /itero/$1 [R=301,L]`
ｈｔｍｌファイルで反映されてたものディレクトリで反映させるための処理。

##まとめ
毎回調べてるけどわかっていない、なぜなら書き方理解してないから。
今回はうまくいったのでよしとする。

他にもhttpからhttpsのリダイレクトだったり、条件によって記述の場所や書き方が違ってくるから腹立つ。

一番楽なのは、外部サイトからのリダイレクト処理。Xserverのコントロールパネルから指示に従ってやれば簡単にできるとのこと、まだやったことはない。

##参考文献
https://www.afi-b.com/beginner/archives/course/course_site/10766
[Kotlin] Enumを名前だけで参照する

# なやみ

KotlinでEnumを扱うときにもCのように名前だけでアクセスしたい

# 解決策

ファイル頭でワイルドカードを使ってEnumをインポートすれば名前だけで使える！

```kotlin
import Hoge.Prefecture.*

class Hoge {
    enum class Prefecture {
        Hokkaido, Aomori, Iwate, Akita, Miyagi, Yamgata, //,,,
    }
    
    fun getSouvenir(pref: Prefecture): String {
        return when(pref) {
            //Prefecture.Hokkaido -> {
            Hokkaido -> { //Prefecture.が要らない
                //...   
            }
        }
    }
}
```
QiitaのマイページにTwitterのロゴマークを設置する方法

#概要
Qiitaのマイページの名前の真下にTwitterのロゴマークを設置する方法を紹介します。
Twitterのロゴをクリックすると、Twitterのマイページに遷移できるようになります。

やり方をご存知でない方が、少しでも調べる時間を短縮できればと思い記事を作成しました。

#完成写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/8bab484c-591f-9c75-227d-863df63a273b.png)


#設置方法
###❶マイページの「プロフィールを編集する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/ec587324-efc1-b42c-e9fe-4110468c1e7a.png)


###❷プロフィール内の「アカウント」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/f74a7ee3-e401-4abc-594f-ad6bf6353983.png)

###❸①の○をクリックし、②の「更新する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/6ed8d75f-166b-d957-169d-b0544795f4c4.png)


以上です。
【PHPとNodejs デコレータパターンの実装を比較してみる】

同じようなことをしたい場合この２つの言語でどんな差があるのか気になったので比較してみた。

Node.jsはシンプルにかけるなーと感じました。

##PHP

以下のクラス図に沿って実装してみる

![36593375-1D87-471B-8BA7-DD339B465525_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530710/41c56e4d-20db-7f23-305d-bee1a9a304aa.jpeg)

他のほとんどの言語でもおなじような実装になるとおもう。

#####\<\<interface>> Component 

```php
interface Component {
    public function operation();
}
```

#####ConcreteComponent

```php
class concreteComponent implements Component{
    public function operation(){
			
    }
}
```

#####Decorator

```php
class Decorator implements Component{
    private $component;

    public function __construct(Component $component){
        $this->component = $component;
    }

    public function operation(){
        
    }
}
```

#####ConcreteDecorator

```php
class concreteDecorator extends Decorator{
    public function __construct(Component $component){
        parent::__construct($component);
    }
    // デコレートする関数をここに書く
    public function addedBehavior(){
        parent::operation(); //ここの返り値をデコレートしたりする
    }
}
```

##Node.js
できるだけ上の画像と同じようなイメージで実装してみる。
もとになるcomponentオブジェクトを拡張（デコレート）するときを考える。
Proxyパターンにおけるオブジェクトの拡張も同じように実装できるらしい
注意点は、もとのオブジェクトを上書きしているというところ。
###オブジェクト拡張
#####Decorator

```jsx
exports.decorate = (component) => {
    // デコレートする関数
    component.addedBehavior = () => {

    }
    return component
}
```

#####component（拡張したいオブジェクト）

```jsx
function component(){}
component.prototype.operation = () => {return 'hello'}

module.exports = new component()
```

#####concreteDecorator

```jsx
const component = require('./component')
const decorator = require('./decorator')
decorator.decorate(component)

console.log(component) //componentにaddedBehavior()が拡張されている
```
####オブジェクト合成
既存のオブジェクトを残したまま拡張したい場合、合成という手法を取る
内部で既存オブジェクトを持ち、既存オブジェクトのメソッドを呼び出すときは処理を委譲させる。

```javascript
exports.decorate = (component) => {
    const proto = Object.getPrototypeOf(component)

    const Decorator = function(component){
        this.component = component
    }

    Decorator.prototype = Object.create(proto)

    Decorator.prototype = {
        // デコレートする関数
        addedBehavior: () =>{
        
        },
        operation: () => {
            return this.component.operation.apply(this.component, arguments)
        }
    }
    
    return new Decorator(component)
}
```
BootstrapValidator良い参考リンク

#いくつかの良い参考リンクを貼り付け。

http://bootstrapvalidator.votintsev.ru/api/

http://bootstrapvalidator.votintsev.ru/validators/

https://higashidadan.com/web/js/validator.html

https://github.com/nghuuphuoc/bootstrapvalidator/blob/master/demo/validators.html

https://www.c-sharpcorner.com/article/powerful-form-field-validator-for-jquery-and-bootstrap-using/

https://www.zhuangyan.cn/BootstrapValidator-guide/
[VisualStudio/ダンプ] WER(WindowsErrorReporting)を使ったダンプ採取と解析

# ダンプ関連記事

https://tera1707.com/entry/2022/02/06/144447#WindowsDump

# やりたいこと

何かの原因でアプリがおちてしまう、クラッシュしてしまうという現象が起きた時に、その原因を調べたい。
特に、自分のPCでVisualStudioでデバッグ実行して、落ちた部分でbreakさせて調査をしたいが、自分のPCでは起きてくれず、リモートデバッグも出来ない状況というときに、なんとかして手がかりを得たい。

# 別解

以前、下記の記事でProcDumpというツールを使ってダンプファイルを作るということをした。

ProcDumpを使ったダンプファイルの作成と解析
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f

ProcDumpでもダンプ採取はできるが、そちらとの違いは、下記かなと思う。

- ProcDumpの方が、アプリがクラッシュしていなくても、アプリ内部で指定の例外が起きているだけでもダンプを取れる（WER(今回のやり方)だと、クラッシュしないとダンプ取れない）
- WERの方が、専用のexe等を持ってこなくてもよいので、簡単に準備、ダンプ採取できる。（ProcDumpはツールをダウンロードして対象のPCにもっていかないといけない）

USBメモリ等を使ってexeファイルを入れることができないような環境でテストや評価をしているときで、アプリがクラッシュしてしまう場合は、レジストリの設定を行うだけでダンプ採取できるWERの方がやりやすいかもしれない。

# やり方

下記のレジストリの設定を行う。

`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps`

|キー名|概要|
|:--|:--|
|DumpFolder|ダンプファイルの出力先フォルダを指定する。|
|DumpCount|出力先フォルダに残すダンプファイルの数を指定する。<br>例えば2にすれば、3つ目のダンプが出来た時には最初の1つ目を自動で消して、残るファイルを2つにしてくれる|
|DumpType|0：カスタムダンプ<br>1：ミニダンプ<br>2：フルダンプ|
|CustomDumpFlags|DumpTypeに0(カスタムダンプ)を指定したときに、どういうダンプにするか指定できる。<br>※個人的には大きなダンプファイルが保存できないなどの制約がなければ、DumpTypeは2(FullDump)にしてデバッグしやすいようにすべきではと思う(のでこの値は設定しない)|

例）`C:\dumps`にダンプを最大2つまでのフルダンプのファイルを保存しようとした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d2bfc137-5ef5-2364-2f49-e0f1fbd0a68a.png)

上記レジストリの設定をした状態で対象のアプリがクラッシュすると、`DumpFolder`で指定したフォルダにダンプファイルが出来上がる。そのダンプファイルをVisualStudioで開くなどして、クラッシュ時の解析を行う。

# regファイルで簡単レジストリ登録

下記の内容で、regファイルを作成すれば、簡単にWERの設定ができる。(win11で確認)

ダンプ5ファイル、フルダンプを採取の場合は下記。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpCount"=dword:00000005
"DumpFolder"="C:\\dumps"
"DumpType"=dword:00000002
```

このテキストを「WER.reg」などの名前で保存して、対象のPC上で管理者で実行すれば、WERの設定をポンと行うことができる。

参考：[.regファイルでレジストリキーと値をポンと登録する](https://tera1707.com/entry/2024/04/15/215957)

# 実験

### ダンプファイルの採取実験

以前作った、クラッシュするプログラムを使って実験する。
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

上記コードでクラッシュさせると、dmpファイルが指定のフォルダに出来上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/f000ddcc-cf29-2f74-c23a-effcf0f8aece.png)

### 解析

上で出来たダンプファイルを、VisualStudio2019で開く。
以降の操作は、以前の記事のやり方(ProcDumpで採取したダンプの解析)と同じでOK。
https://qiita.com/tera1707/items/26b7d19e7ae1b4978f9f#visualstudio2019%E3%81%A7%E3%83%80%E3%83%B3%E3%83%97%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86

### ミニダンプとフルダンプの違い
こちらにメモした。
https://qiita.com/tera1707/items/e64fad902e51122852e9

# 参考

MS公式  WERを使ったダンプの採取方法
https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps
git mergeが出来なかった

いつも通りfetchをしてmergeをしようとしたら出来なかった

エラー文は

```sh
warning: could not open directory ~~~
```

が出てきた。

[こちらの記事](https://qiita.com/Mitsuzara/items/6bbf0798bffce6921a46)を参考にしてエディターを閉じたがうまくいかなかった。

弄っていたら他の所でもエラーが起きた。

```sh
warning: could not open directory
```

これはブランチを切り替える時に誤って保存してしまったファイルが原因だった。

それを削除したらこちらのエラーは解決出来た。

それからもう一度最初のエラー文を見た所、そこにあるはずがないからファイルが存在していた。

だからそのファイルを同じように削除したら解決出来た！

やはりエラー文はしっかり読んで、それについてよく検討するべきであることを再度実感した。
CSSでhover時に荒ぶらせない

##hoverさせると荒ぶってしまう。
hoverなどを利用してボタンの色を変えたり、サイズを変更したりして何らかのアニメーションをつけることがあるかと思います。そんなとき範囲を考えて実装しないとマウスの挙動によってびっくりするぐらいアニメーションが荒ぶります。

####荒ぶるボタン
<p class="codepen" data-height="296" data-theme-id="dark" data-default-tab="css,result" data-user="moririn3464" data-slug-hash="RwGqXgy" style="height: 296px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="css bad_animation">
  <span>See the Pen <a href="https://codepen.io/moririn3464/pen/RwGqXgy">
  css bad_animation</a> by moririn3464 (<a href="https://codepen.io/moririn3464">@moririn3464</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


これはアニメーションする要素とhoverの判定をする対象が同じために起こります。
hoverが適用された瞬間にサイズが変わり、hover状態が解除され元のサイズに戻ろうとします。
しかし、マウスポインタが残っていると再度hoverが適用されるので、またサイズが変わります。
ループの完成です。

##回避策
これを回避するには、hover要素と実際にアニメーションする要素を分ける必要があります。
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="moririn3464" data-slug-hash="rNMQXZj" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="css good_animation">
  <span>See the Pen <a href="https://codepen.io/moririn3464/pen/rNMQXZj">
  css good_animation</a> by moririn3464 (<a href="https://codepen.io/moririn3464">@moririn3464</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

アニメーションさせる要素の親要素にhoverを適用することで、
hoverが適用されている要素の状態は変化しないので、荒ぶることなくアニメーションが完了します。


##まとめ
hoverでアニメーションさせるときは変化させる要素そのものにhoverを指定しない。
arduinoでsudoku

#概要

arduinoでsudoku(数独)やってみた。

#問題

2 0 5 1 3 0 0 0 4
0 0 0 0 4 8 0 0 0
0 0 0 0 0 7 0 2 0
0 3 8 5 0 0 0 9 2
0 0 0 0 9 0 7 0 0
0 0 0 0 0 0 4 5 0
8 6 0 9 7 0 0 0 0
9 5 0 0 0 0 0 3 1
0 0 4 0 0 0 0 0 0


#サンプルコード

```

int sudoku[9][9] = {
	{2, 0, 5, 1, 3, 0, 0, 0, 4},
	{0, 0, 0, 0, 4, 8, 0, 0, 0},
	{0, 0, 0, 0, 0, 7, 0, 2, 0},
	{0, 3, 8, 5, 0, 0, 0, 9, 2},
	{0, 0, 0, 0, 9, 0, 7, 0, 0},
	{0, 0, 0, 0, 0, 0, 4, 5, 0},
	{8, 6, 0, 9, 7, 0, 0, 0, 0},
	{9, 5, 0, 0, 0, 0, 0, 3, 1},
	{0, 0, 4, 0, 0, 0, 0, 0, 0}
};
int flag = 0;

int check(int r, int c, int ch) {
	for (int i = 0; i < 9; i++)
	{
		if (ch == sudoku[r][i])
		{
			return 0;
		}
	}
	for (int i = 0; i < 9; i++)
	{
		if (ch == sudoku[i][c])
		{
			return 0;
		}
	}
	for (int i = r / 3 * 3; i < r / 3 * 3 + 3; i++)
	{
		for (int j = c / 3 * 3; j < c / 3 * 3 + 3; j++)
		{
			if (ch == sudoku[i][j])
			{
				return 0;
			}
		}
	}
	return 1;
}
int answer() {
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			if (0 == sudoku[i][j])
			{
				return 0;
			}
		}
	}
	return 1;
}
void dfs(int r, int c) {
	if (flag == 1)
	{
		return;
	}
	if (r == 9)
	{
		if (answer() == 1)
		{
			flag = 1;
		}
		return;
	}
	if (0 == sudoku[r][c])
	{
		for (int ch = 1; ch <= 9; ch++)
		{
			if (check(r, c, ch) == 1)
			{
				sudoku[r][c] = ch;
				if (c + 1 < 9)
				{
					dfs(r, c + 1);
				}
				else
				{
					dfs(r + 1, 0);
				}
				if (flag == 0)
				{
					sudoku[r][c] = 0;
				}
			}
		}
	}
	else
	{
		if (c + 1 < 9)
		{
			dfs(r, c + 1);
		}
		else
		{
			dfs(r + 1, 0);
		}
	}
}

void setup() {
	Serial.begin(115200);
	Serial.printf("\nok\n");
	dfs(0, 0);
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			Serial.print(sudoku[i][j]);
			Serial.printf(" ");
		}
		Serial.printf("\n");
	}
}
void loop() {
	delay(10);
}






```

以上。
Nginx で 499 が発生したので再現させた話

# 今回の問題
Nginx ＋ php-fpm で構成しているサービスで 499 エラーが結構な頻度で発生

## どんな作りか
- SPA で1画面でAPIを平均で5本くらい実行している
- EC2 は複数台構成

## まずやったこと
Nginx のログをひたすら解析
発生している画面を特定したり、重いAPIを特定したり、499 を出しているのが画面単位なのか、API単位なのか、とかとか

## 見えてきたこと
- リクエストが重い（レスポンスに1秒以上かかっているAPIが多発している）時間帯に発生していることが多い（画面で呼ばれる API のうち複数本 499 になっている）
- しかし平時でも発生はしている（画面で呼ばれる API のうち単発で 499 になってる）
- 特定のサーバで 499 が多め（全体的に重め）
- バランシングは問題ない様子

## 再現してみた
1. 画面を開く
2. バックでAPIを呼び出している間、ローディング中の画面が表示されるので、ブラウザのリロードボタンを押す
3. ローディング中画面でブラウザのリロードの「×」ボタンを押す

**→ Nginx のログに 499 が吐かれた**

わかってしまえば至極当たり前なことで、API のレスポンスが遅くてローディング中の画面がずっと表示されてて、リロードして、それでも返ってこないので×を押して止めてみる、というのは誰しもやるということだった。

>特定のサーバで 499 が多め

これに関してはインスタンスガチャで引いちゃった疑惑があるので今回はちょっと置いておく。

じゃぁ「次にどうするの？」ということになるが、EC2のスペックあげるとか php-fpm の設定見直すとかそういうことになるのかな、と。
ここから先はインフラ屋さんに任せたい。
漸化式 - 例題４

## 10. Snを含む漸化式

```math
ex)　S_n = 4a_n - 6n \\

\begin{array}{l} \\
n = 1のとき\\
S_1 = a_1 = 4a_1 - 6 \\
a_1 = 2\\
a_{n+1} = S_{n+1} - S_n \\
= (4a_{n+1} -6(n+1)) - (4a_n - 6n) \\
= 4a_{n+1} -4a_n -6 \\
\therefore a_{n+1} = \frac{4}{3} a_n + 2 （特殊型）\\
\\
特殊解\alphaは、\alpha = \frac{4}{3}\alpha + 2 \rightarrow \alpha = -6 \\
a_{n+1} - 6 = \frac{4}{3}(a_n - 6) \\
a_n - 6 = (a_1 - 6) (\frac{4}{3})^{n - 1} \\
a_n = -4 (\frac{4}{3})^{n - 1} + 6 \\
\end{array} \\
```

- [wolframalphaで確認]()

## 11. 隣接3項型

```math
ex)　a_{n+2} - 5 a_{n+1} + 6 a_n = 0, a_1 = 4, a_2 = 1 \\

\begin{array}{l} \\
\alpha^2 -5 \alpha + 6 = 0 を解くと、\\
(\alpha - 2)(\alpha -3) = 0 \Rightarrow \alpha = 2, 3 \\
\\
\begin{cases}
a_{n+2} - 2 a_{n+1} = 3(a_{n+1} - 2 a_n) \cdots ① \\
a_{n+2} - 3 a_{n+1} = 2(a_{n+1} - 3 a_n) \cdots ② \\
\end{cases}\\
①より\\
\begin{array}{l}
a_{n+1} -2 a_n &= (a_2 -2 a_1) 3^{n-1} \\
&= -7 \cdot 3^{n-1} \cdots ①' \\
\end{array}
\\
②より\\
\begin{array}{l}
a_{n+1} -3 a_n &= (a_2 -3 a_1) 2^{n-1} \\
&= -11 \cdot 3^{n-1} \cdots ②' \\
\end{array} \\

①' - ②' より\\
a_n = 11 \cdot 3^{n-1} -7 \cdot 3^{n-1}

\end{array} \\
```

- [wolframalphaで確認](https://ja.wolframalpha.com/input/?i=a%28n%2B2%29-5a%28n%2B1%29%2B6a%28n%29%3D0%2Ca%281%29%3D4%2Ca%282%29%3D1)

- （重解の場合）

```math
ex)　a_{n+2} - 6 a_{n+1} + 9 a_n = 0, a_1 = 1, a_2 = 5 \\
\\
\begin{array}{l} \\
\alpha^2 -6 \alpha + 9 = 0 を解くと、\\
(\alpha - 3)^2 = 0 \Rightarrow \alpha = 3 \\
\\
a_{n+2} - 3 a_{n+1} = 3(a_{n+1} - 3 a_n) \\
\begin{array}{l}
a_{n+1} -3 a_n &= (a_2 -3 a_1) 3^{n-1} \\
a_{n+1} -3 a_n &= 2 \cdot 3^{n-1} \\
a_{n+1} &= 3 a_n + \frac{2}{3} \cdot 3^n （指数型）3^{n+1}で両辺を割る\\
\frac{a_{n+1}}{3^{n+1}} &= \frac{a_n}{3^n} + \frac{2}{9} \\
\frac{a_n}{3^n} &= \frac{a_1}{3^1} + \frac{2}{9}(n - 1) \\
\frac{a_n}{3^n} &= \frac{1}{3} + \frac{2}{9}(n - 1) \\
\frac{a_n}{3^n} &= \frac{2}{9}n + \frac{1}{9} \\
a_n &= 3^n (\frac{2}{9}n + \frac{1}{9}) \\
a_n &= 3^{n-2} (2n + 1) \\
\end{array} \\

\end{array}
```

## 12.連立漸化式

```math
ex) 
\begin{cases}
a_{n+1} = 4a_n - b_n \\
b_{n+1} = 2a_n + b_n　a_1 = 4, b_1 = 1\\
\end{cases}

\begin{array}{l} \\
\end{array} \\
```

- [wolframalphaで確認]()
漸化式 - 例題２

# 漸化式 - 例題

## 4.特殊解型

```math
ex)　a_{n+1} = 4a_n - 3, a_1 = 2 \\
\begin{array}{l} \\
特殊解\alphaを求める。\\
\alpha = 4 \alpha - 3 \\
\therefore \alpha = 1 \\
\\
a_{n+1} - 1 = 4(a_n - 1) とおける \\
a_n - 1 = 4 \cdot 4^{n-1} \\
a_n = (a_1 - 1) \cdot 4^{n-1} + 1 \\
a_n = 4^{n-1} + 1 \\
\end{array} \\
```

- [wolframalphaで確認](https://www.wolframalpha.com/input/?i=a%28n%2B1%29%3D4a%28n%29-3%2Ca%281%29%3D2&lang=ja)

## 5.指数型

```math
ex)　a_{n+1} = 3a_n +4 \cdot 5^n, a_1 = 2 \\
\begin{array}{l} \\
両辺を5^{n+1}で割ると \\
\frac{a_{n+1}}{5^{n+1}} = \frac{3}{5}\frac{a_n}{5^n} + \frac{4}{5} \\
特殊解\alpha は、\alpha = \frac{3}{5}\alpha + \frac{4}{5} より、\alpha = 2 \\
\frac{a_{n+1}}{5^{n+1}} - 2 = \frac{3}{5}(\frac{a_n}{5^n} - 2) \\
\frac{a_n}{5^n} - 2 = (\frac{a_1}{5^1} - 2)(\frac{3}{5})^{n-1} \\
\frac{a_n}{5^n} - 2 = (\frac{2}{5} - 2)(\frac{3}{5})^{n-1} \\
\frac{a_n}{5^n} = - \frac{8}{5}(\frac{3}{5})^{n-1} + 2 \\
a_n = -8 \cdot 3^{n-1} + 2 \cdot 5^n
\end{array} \\
```

- [wolframalphaで確認](https://www.wolframalpha.com/input/?i=a%28n%2B1%29%3D3a%28n%29%2B4*5%5En%2Ca%281%29%3D2&lang=ja)

## 6.Ｎ次式型

```math
ex)　a_{n+1} = 2a_n + n^2-2n+3, a_1 = -3 \\
\begin{array}{l} \\
a_{n+1} + \alpha (n+1)^2 + \beta (n+1) + \gamma = 2(a_n + \alpha n^2 + \beta n + \gamma) \\
\Leftrightarrow a_{n+1} = 2a_n + \alpha n^2 + (-2\alpha + \beta)n -\alpha -\beta + \gamma \\
これを元の漸化式と比較すると\\
\left\{
\begin{array}{l} 
\alpha &= 1\\
-2\alpha + \beta &= -2 \\
-\alpha -\beta + \gamma &= 3 \\
\end{array}
\right \}
\therefore \alpha = 1, \beta = 0, \gamma = 4 \\
よって\\
a_{n+1} + (n+1)^2 + 4 = 2(a_n + n^2 + 4) \\
a_n + n^2 + 4 = (a_1 + 1^2 + 4) \cdot 2^{n-1} \\
a_n + n^2 + 4 = (-3 + 1^2 + 4) \cdot 2^{n-1} \\
a_n = 2^n -n^2 - 4 \\
\end{array} \\
```

- [wolframalphaで確認](https://www.wolframalpha.com/input/?i=a%28n%2B1%29%3D2a%28n%29%2Bn%5E2-2n%2B3%2Ca%281%29%3D-3&lang=ja)
WSL2 + Ubuntu 20.04 で npm実行時「bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory」と出た際の対応

初投稿になります、よろしくお願いします。

# 環境
wsl2
Ubuntu20.04

# 状況
```shell
npm install
```
を実行後
`bash: /mnt/c/Program Files/nodejs/npm: /bin/sh^M: bad interpreter: No such file or directory`
のエラーに遭遇

# 原因
windowsのPATH(/mnt/~)がubuntuに取り込まれ、元々windowsにインストールされたnpmが実行されようとしたことが原因

# 対処法
https://hackmd.io/@badging/wsl2#Troubleshooting-PATH より引用

~/.bashrc に以下を追加

```bash:.bashrc
PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g') # PATH変数からwindows側のPATHを取り除く
```
追加出来たら再度ログインし、windowsからインポートされたPATHが無いことを確認。

```bash
echo $PATH
```

## 追記
/etc/wsl.conf 内に`appendWindowsPath=false`を記述することでPATH環境変数を引き継がないように出来ることを知りました。

```:/etc/wsl.conf
[interop]
appendWindowsPath=true
```


# 後談
対処したのちqiitaに投稿しようと検証で一度.bashrcを編集前に戻したが、症状が出ず…。
色々試していた中でbashがキャッシュを保持してることを知り削除したことが再現できなかった理由かもしれません。
そもそも.bashrcに書かなくてもキャッシュを削除してれば解決していた可能性も有り。

```bash:PATHのキャッシュ削除
hash -r
```

# 参考
https://qiita.com/antimalware_service_executable/items/89a620b3e6728ddc48a4
https://stupiddog.jp/note/archives/951
https://github.com/microsoft/WSL/issues/1890
TypeError: Cannot read property ‘XXXX’ of undefined

#解決方法

■type definition（types installか自分でライブラリの型定義を定義する）

```
$ yarn add -D @types/XXXX
```

or

■const require

```
import uuid = require('uuid/v4')
```

or

■Dynamic import

```
const uuid = require('uuid/v4')
```
chmodをWindowsで使う

chmodはコマンドプロンプトやPowershellでは使えません。
代わりにcaclsを使うというのがよくある話です。

しかし、chmodでは

```
chmod [option] 所有者の設定値・グループの設定値・その他の設定値　ファイル名
```
と、数字とファイル名を並べればいいのに対し、caclsは

```
cacls ファイル名　/g ユーザー名:アクセス権
```
とユーザー名を書く必要があります。

私はchmodのグループ、その他のユーザー名がどうなっているのかわからなかったので時間をかけてしまいました。
#結論

```
net user
```
これで出てきたユーザー名に対してアクセス権を割り振る。

※ちなみにファイル名の後の /g は権限を与える場合です。
アクセス権なし（chmodで言う0）にしたい場合は /p にするなど適宜変更してください。
veritas-s3-transformを使ってみた

S3に画像などをアップロードするにはmulter-s3を使っているのですが、「サムネイルも欲しい、そしてcontent-typeも設定して欲しい」というリクエストに対応した話です。

https://github.com/myahal/uploadS3withThumb

他のモジュールも試してみたのですが、content-typeの指定をできるものが見当たらず「みなさん、S3に画像アップロードするときはapplication/octet-streamでやるのが標準なのだろうか？」と思っていたところ、veritas-s3-transformを見つけました。

TypeScriptで書かれているということで、型定義ファイルもあると期待したのですが、`index.d.ts`は

```
export {};
```
というスッキリした世界だったので、自力で型定義ファイルを**雑に**用意しています(@types/multer-s3をベースtransformやshouldTransformを追加すれば大丈夫でした）。

## 変換ルールの記述

基本的にはmulter-s3と同じ感じで使えますが、`shouldTransform`と`transforms`という、アップロード時の変換定義が入ります。

```TypeScript
    shouldTransform: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, key: boolean) => void) {
      cb(null, file.fieldname == 'image2')
    },
    
    transforms: [
      {
        id: 'original',
        key: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, key?: string) => void) {
          cb(null, Date.now().toString() + file.originalname)
        },
        transform: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, key?: sharp.Sharp) => void) {
          cb(null, sharp())
        }
      },
      {
        id: 'thumbnail',
        key: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, key?: string) => void) {
          cb(null, Date.now().toString() + 'thumb'  + file.originalname)
        },
        transform: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, key?: sharp.Sharp) => void) {
          cb(null, sharp().resize(100, 100))
        }
      }
    ]
```
上記の場合は、fieldnameが`image2`の場合のみ変換を行う。オリジナルとサムネイルをアップロードするが、オリジナルは変換なしで、サムネイルはリサイズしてアップロード、という意味になります。

## content-typeの指定

multer-s3と同じです

```TypeScript
    contentType: function (req: Express.Request, file: Express.Multer.File, cb: (error: null, mime?: string, stream?: NodeJS.ReadableStream) => void) {
      cb(null, file.mimetype)
    },
```
Pythonでリリース申請一覧のための準備資料[改訂版]


#背景
Pythonでものづくりしようと思う。
・Python習得のため
・見せるものを作るため
が目的です。
#仕様
##リリース申請一覧のための準備資料
##内容
・ファイル名と拡張子が分離している
・拡張子によりファイルの種類が判別できる 
・ファイルの種類ごとに分類する
     →　フォルダ構成による実現する。
・一覧のファイル形式はCSV形式
・言語はPython3
・フレームワークは想定しない。
追加
・フォルダ名を記載する
・子フォルダ孫フォルダの中身も同様に記載する。
・準備のためのツールなので完全は目指さない。

　
#手順
1 該当プロジェクト直下のファイル名を取得する
2 ファイル名と拡張子を取得する
3 拡張子の種類ごとにCSV形式で書き出す

#コード
```py
from pathlib import Path
import csv
import os

current = Path()
data = [(path, Path(path).suffix.replace('.', ''))
        for path in current.glob('**/*')]

csv_path = Path('sample.csv')
if csv_path.exists():
    print ("ファイルが存在します。")
with open(csv_path, 'w') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_file.write('メイン\n')
    compare = ""
    for path, suffix in data:
        #print(str(path))
        if str(path).rfind('/') > 0:
            subdirname = str(path)[0:str(path).rfind('/')] + '\n'
            if (subdirname == compare):
                print("")
            else:
                csv_file.write(subdirname)
            compare = subdirname
        csv_writer.writerow([path, suffix])
``` 
#アウトプット 説明のために　フォルダ名部分を強調加工しています。

##メイン
.DS_Store,
combi_c3_3.py,py
css,
fizzBuzz.py,py
sample.csv,csv
html,
test.py,py
jpg,
csv,
.idea,
##css
css/style.css,css
html
html/index.html,html
html/access.html,html
html/gallery.HTML,HTML
##jpg
jpg/catch.jpg,jpg
jpg/logo.JPG,JPG
##csv
csv/sample.csv,csv
.idea
.idea/encodings.xml,xml
.idea/vcs.xml,xml
.idea/workspace.xml,xml
.idea/modules.xml,xml
.idea/misc.xml,xml
.idea/sample4.iml,iml

#動画
本ページのデモです。
https://www.youtube.com/watch?v=IMV3Sc35y0w
日付正規表現

^[0-9]{4}/[0-9]{2}/[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}\s



^[0-9]{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$

^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$

/^[0-9]{4}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.([0-9]{3}){1,3}$/
js 非同期処理のファイルをrequire

#初めに
nodeで複数回使う処理をモジュール化して利用する際に非同期処理をすることができずに詰まったのでその解決方法の備忘録です。

#環境
node: v10.14.2
express: 4.16.0

#発生していた問題
```javascript:main.js
//express の基本的なコードは省略しています
const Check = require('./check.js'); //moduleの読み込み

router.get('/',  async function (req, res) {
  let result = await Check(req.session.authentication, req.session.user);
  if (result[0]) {
    console.log("result[0] = ture")
  }else{
    console.log("authenticationデータが正しくありません")
  }
```

```javascript:Check.js
const express = require('express');
const Users = require('../models/user'); //dbの読み込み

module.exports = (authentication, user) => {
  console.log("Check_1")
  if (!authentication || !user) {
    console.log("値が存在しません");
    return false;
  } else {
      Users.findOne({
      where: {
        systemid: user
      }
    }).then((result) => {
      if (authentication == result.session) {
        console.log("認証成功");
        return [true, result]
      } else {
        console.log("認証失敗");
        return [false, null];
      }
    })
  }
}
```

上記のコードを走らせると予想されログの出る順番は

```console
check_1
認証成功
result[0] = true
```

だが実際には下記ログが出る

```console
check_1
UnhandledPromiseRejectionWarning: TypeError: Cannot read property '0' of undefined
認証成功
```

async await で非同期にしているにもかかわらず非同期になっていないのが問題

#原因と解決
```javascript:Check.js
const express = require('express');
const Users = require('../models/user'); //dbの読み込み

module.exports = async (authentication, user) => {
  console.log("Check_1")
  if (!authentication || !user) {
    console.log("値が存在しません");
    return false;
  } else {
    let result = await Users.findOne({
      where: {
        systemid: user
      }
    })  //.then((result) => {
 
    if (authentication == result.session) {
     console.log("認証成功");
      return [true, result]
    } else {
      console.log("認証失敗");
      return [false, null];
    }
     })
  }
}
```
原因はCheckの処理で.thenををつかっていたことが原因だった。
実際の動きを理解しているわけではないがおそらく.thenをつかったモジュールをasync await で非同期に処理しようとしたことが原因ではないかと考えられる。
そのため.thenの記述をなくしasync await で処理すれば問題なくなった。

#終わりに
.thenで揃えたらどのような挙動になるか試していないので機会があれば試してこの記事に加筆しようと思う。
WSLのコマンド

WSLのコマンドを忘れやすいので、メモ。
## 一覧表示系
|No|コマンド|意味|
|:-:|:--|:--|
|1|wsl -l -v| すべてのディストリビューションについての詳細情報を表示します。|
|2|wsl -l --a|現在インストール中またはアンインストール中のものを含めてすべてのディストリビューションを一覧表示します。|
|3| wsl -l --r|実行中のディストリビューションを表示します。|
|4| wsl -l --q|ディストリビューション名のみを表示します。|

## 実行系
|No|コマンド|意味|
|:-:|:--|:--|
|1|wsl -d <ディストリビューション>|指定したディストリビューションを実行します。|
|2|wsl -t <ディストリビューション>|指定したディストリビューションを終了します。|
|3|wsl --shutdown|実行中のすべてのディストリビューションを終了します。|

## インポート・エクスポート
|No|コマンド|意味|
|:-:|:--|:--|
|1|wsl --export <ディストリビューション> <ファイル名>|ディストリビューションをtarファイルにエクスポートします。標準出力の場合は、ファイル名を - とすることができます。|
|2|wsl --import <ディストリビューション> <インストール場所> <ファイル名>|指定したtarファイルを新しいディストリビューションとしてインポートします。標準入力の場合は、ファイル名を - とすることができます。|

## 設定系
|No|コマンド|意味|
|:-:|:--|:--|
|1|wsl --set-default <ディストリビューション>|既定のディストリビューションを設定します。|
|2|wsl --set-default-version <バージョン>|新しいディストリビューションの既定のインストールバージョンを変更します。|
|3|wsl --set-version <ディストリビューション> <バージョン>|指定のディストリビューションのバージョンを変更します。|
|4|wsl --unregister <ディストリビューション>|ディストリビューションの登録を解除します。|
エクスプローラの今すぐ使えるアドレスバー芸

まず、エクスプローラで**ALT+D**キーを押すと、アドレスバーがフォーカスされます。
即座にパスをコピーしたいときなんかに便利です。

次に、このアドレスバーに**cmd**と打ち込んでEnterを押すと、

そのフォルダをパスとしたコマンドプロンプトが開きます。

これだけでも結構便利ですが、まだスタートラインです。

##小手調べ：フォルダを作る
アドレスバーに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/2750b774-0479-f121-3137-b86c7b151024.png)

```
cmd /c mkdir test
```
と打ちEnterを押すと、一瞬コマンドプロンプトが起動して終了します。
これは、**cmd**コマンドのオプション `/c` で、さらにコマンドを指定しているからです。
その`/c`の後ろに

```
mkdir test
```

が渡されているので、「test」というフォルダが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/99f6e3ee-7ec4-3775-77d9-7de1e4d4616c.png)

##本命：フォルダ内のファイル名一覧をテキストで取得する
これが、意外と出来ないんですよね。（macだとさらっとできたりするんですかね？）
複数ファイルを選択してCTRL+Cなどコピーしてもそれはファイル自体をコピーしたことになってしまいますし。
そこで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/839e85d3-9491-6590-0bd4-5927e8b980fa.png)

```
cmd /c dir /b | clip
```

これは先ほどの `cmd /c` でコマンドプロンプト起動しつつ、さらに実行するコマンドとして `dir /b` という、フォルダ内のファイル名一覧表示を指定しています。　それをさらに `| clip` パイプ(**|**)で**clip**（クリップボード）につなげる事で、ファイル名一覧をクリップボードにコピーされます。

その後メモ帳等で貼り付け(CTRL+V)すれば、今回の例なら
>test

というフォルダ名がペーストされます。便利ですね？
AzureWebApps上に構築したSPA+REST APIのウェブアプリにAADで認証を設定してみた

# はじめに
## 構成
- フロントエンドはReactで作成し、AzureWebAppsにdeploy
- RestAPIはPythonで作成し、AzureWebAppsにdeploy
- フロントエンドとRestAPIのAzureWebAppsは別リソース
- 認証・認可は、AzureADを使用

## やりたいこと
- AADで認証済みのユーザーのみウェブアプリにアクセスしてRestAPIも実行できる

## この記事では扱わないこと
- WebAppsへのアプリのdeployは出来ている前提とする
- Static Web Appsは使わない
- API Managementは使わない

# やったこと

## フロントエンド側に認証設定
- フロントエンド側のWebAppsのコンソールからApp Service認証を「オン」にして、Azure Active Directoryを選択します
![スクリーンショット 2021-03-09 9.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708540/66487529-8f52-d448-fd38-cf691ab855f8.png)
- 細かい設定は後回しにして、簡易モードで認証設定します
![スクリーンショット 2021-03-09 9.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708540/b3ec4cf2-e940-1fa1-bfa4-66c8003cdabc.png)

単純な認証は、これだけでOKです。
ブラウザからWebアプリを開くと、AADでの認証を求められます。
![スクリーンショット 2021-03-09 10.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708540/03a35d55-f3f5-30cd-d2b1-4a904acfb7cb.png)



## RestAPI側に認証設定
- フロントエンド側同様に、RestAPI側もWebAppsのコンソールからApp Service認証を「オン」にして、Azure Active Directoryを選択します
- 詳細モードに切り替えて、クライアントID、発行者のURL、クライアントシークレットを入力してください
    - この値はフロントエンド側の同じ画面（AADの設定の詳細モード）を開いて、コピーしてください
        - そうすることで、フロントエンド側と同じ認証情報でRestAPIを呼び出すことができます
![スクリーンショット 2021-03-09 9.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708540/245d51e6-14d5-edcc-4a87-217bc90e7f58.png)

とりあえず、これで、コンソールから認証の設定ができました。



## APIを呼び出す
- 認証を設定した状態ですと、何もしなければAPI呼び出しが401エラーになります
- `access_token`を`Authorization`ヘッダーにつけることで、APIを呼び出すことが出来ます
- `access_token`は、フロントエンド側で認証後に`.auth/me`にアクセスすることで取得可能です

## `access_tokenを` 更新する
- `.auth/me`から取れるtokenは、残念ながら有効期限が切れても更新されません
- 更新するには、`.auth/refresh`を呼び出してください
- ただし、何も設定をしないと、うまく更新されてくれませんでした。下記の設定が必要だと思われます。
    - Azure Resource Explore( https://resources.azure.com ) を開く
    - フロントエンド側のWeb Appsのリソースの認証設定にたどり着く
        -  `subscriptions > ** <subscription_name** > resourceGroups > **_ <resource_group_name> ** > providers > Microsoft.Web > sites > ** <app_name>** > config > authsettings`
    - additionalLoginParamsを下記のように書き換える。`<app_id>` はAADのアプリクライアントID
      - `"additionalLoginParams": ["response_type=code id_token", "resource=<app_id>"]`
- このあたり、よく分かってないので間違えているかもしれません。Azureのドキュメントを貼っておくので、そちらを読み解いてもらえればと。
    - https://docs.microsoft.com/ja-jp/azure/app-service/app-service-authentication-how-to

## 431エラーを回避する
- ここまでで問題なく動けばOKですが、431エラーが出ることがあります。
- 認証設定によりヘッダーが追加されて、ヘッダー長が長すぎることが原因です。
- 環境変数で `WEBSITE_AUTH_DISABLE_IDENTITY_FLOW=true`を設定することで回避出来ます。
- これも正直良くわかってないです。Azure OSS Developer Supportに記事があったので、そちらを参照してください。
    - https://azureossd.github.io/2020/07/25/HTTP-431s-on-Azure-App-Services-Linux/

# まとめ
AzureWebApps上に構築したSPA+REST APIのウェブアプリにAADで認証を設定できた

## 必要な設定
- コンソールからフロントエンド側のWebAppsに認証を設定
- コンソールからRestAPI側のWebAppsにも認証を設定
- https://resources.azure.com から、トークンの更新の設定
- 環境変数に`WEBSITE_AUTH_DISABLE_IDENTITY_FLOW=true`をセット

## APIを呼び出す時にやること
- `.auth/refresh`を呼び出してtokenを更新
- `.auth/me`を呼び出してaccess_tokenを取得
- access_tokenを使用して、APIを呼び出す

# お試しで書いてみたAPI呼び出しのコードです。
https://github.com/k-ibaraki/azure-webapps-auth-sample/blob/main/sample-front/src/App.js#L17-L51
terraformのsubstr関数について

使い方でちょっと迷ったのでメモ。

3つの引数が必要なことと、文字を出力することしかわからなかったので`terraform console`コマンドを使ってsubstr関数がどんなものか試した。

# 注意
この記事はTerraform v0.12.24 で実行したものです。
1.0.6では「全ての文字列を取得する。」項目で実行してるコマンドで想定の結果にならないことを確認しています

# substrとは

任意の文字列から指定した数値の文字から指定した文字の値までを取得する関数。
substrは3つの引数を使用していて、

`substr("文字列", 数値, 数値)`で記載する必要がある。内訳は、

```
substr(検索したい任意の文字列, 何文字目から取得するかの指定, 何文字目までを取得するかの指定)
```

これだけだと味気ないのでterraform consoleコマンドで試してみる。

# 検証

terraform consoleコマンドで関数を試せるようにする。

```
terraform console
>
```

## 1文字目から10文字目までを取得する。
注意したいのが、1文字目を取得する時は1でなく0を使用する。

```
> substr("test terraform", 0, 10)
test terra
```

## 全ての文字列を取得する。
引数の数値を全て0にすれば文字列全ての値を取得する。

```
> substr("test terraform", 0, 0)
test terraform
>
```

# 終わり
この関数について日本語の記事が無かったので作成。
実際使ってみないとわからない仕様もあったので試して良かった。
（備忘用）sequelizeのraw trueとget plain true

# raw true
プレインオブジェクトにする

``` js
Model.findAll({
 raw: true,
 //Other parameters
});
```

# get plain true
ネストしたオブジェクトもgetする

``` js
const users = await db.users.findAll({})
   .map(el => el.get({ plain: true })) // add this line to code
```


raw trueのほうが、パフォーマンスはいいかも？
（sequelizeオブジェクトの生成コストがないかも）
FuelPHP pagenation ページネーション

```
controller.php

$config = array(
	'pagination_url' => 'http://localhost/fuel/welcome/index/',
	'total_items'    => 10,
	'per_page'       => 5,
	'uri_segment'    => 'page',
);

// 'mypagination' という名前の pagination インスタンスを作る
$pagination = Pagination::forge('mypagination', $config);

$data['example_data'] = DB::select('id', 'value')
							->from('pagination')
							->limit($pagination->per_page)
							->offset($pagination->offset)
							->execute()
							->as_array();

// オブジェクトを渡し、ビューの中に echo で出力される時に表示される
$data['pagination'] = $pagination;

// ビューを返す
return \View::forge('welcome/index', $data);
```

```
view.php

<?php 
echo '<pre>';
echo print_r($example_data);
echo '</pre>'; 
?>

<?php echo Pagination::instance('mypagination')->render(); ?>
```
Chrome JavaScriptを無効にする

# 目的

- ChromeでJavaScript（以降js）を無効にする方法をまとめる

# 方法

1. Chromeを開き三点リーダーボタンをクリックする。

    ![Google_と_laravel6_Carbonを使用して先月の月を取得する_-_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fa6fe04e-5121-fc88-5bf1-638f2bbea59b.png)

1. 設定をクリックする。

    ![スクリーンショット_2021-03-08_15_54_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6d2ea588-faa8-2fce-5301-b120452e5f56.png)

1. 「サイトの設定」をクリックする。

    ![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/93c3481e-3839-3eef-001a-8a12f08c9f2b.png)

1. 「JavaScript」 をクリックする。

    ![設定_-_サイトの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e662f060-717e-5b49-4197-2c8f5ee2ec68.png)

1. オンオフのボタンをクリックして無効にする。

    ![設定_-_JavaScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ae0b822e-8c82-1330-ee0d-6a042aa4760a.png)
FuelPHP mail送信（Gmail）

１、Googleのセキュリティ設定をする
２、app/config/email.php にある設定ファイルを下記の通りに編集 (無ければpackageからコピー) 


```
/**
 * Mail driver (mail, smtp, sendmail, noop)
 */
'driver' => 'smtp',   
   /**
    * SMTP settings
    */
    'smtp' => array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => 465,
        'username' => 'googleusername',
        'password' => 'googlepassword',
        'timeout' => 5,  // this can be whatever you want
        'starttls' => true,
    ),
    /**
    * Newline
    */
    'newline' => "\r\n"
```
３、メールを送るファイルを作成

```
// インスタンスを生成する
$email = Email::forge();

// 送信者のアドレスを指定する
$email->from('hoge@gmail.com', 'My Name');

// 受信者のアドレスを指定する
$email->to('hoge@gmail.com', 'Johny Squid');

// 表題を指定する
$email->subject('This is the subject');

// 送信者のアドレスを複数指定する場合

// $email->to(array(
//     'example@mail.com',
//     'another@mail.com' => 'With a Name',
// ));

// 本文を指定する。
$email->body('This is my message');

try
{
    $email->send();
}
catch(\EmailValidationFailedException $e)
{
    //バリデーションが失敗したとき
}
catch(\EmailSendingFailedException $e)
{
    //ドライバがメールを送信できなかったとき
}
```
「0から作るDeepLearning」の7章を写経した時のエラー原因

こんにちは！

今日のエラー原因を書きます。

使用した本：「０から作るDeepLearning」

リポジトリしたプログラム　→　deep-learning-from-scratch

#1 「simple.convnet.py」について
・9割方写し間違いで文法的な間違いはなかった。

#2 「train.convnet.py」について
・34、36行目での写し間違いがあった。

#エラー対策
・移し直すのみ

以下結果です↓
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167125/16e3b2d9-0fdf-510b-9135-be62f9385dcc.png)


#所感
写経のスピードが早くなってきている実感があります。大体この量だと1時間で写せると予測できるようになりました。
後、手を使うと読んでるだけでは気付かなかった疑問を見つけることができるなって感じました。
今後もちょっとずつプログラムに触れ続けていきたいです。