OmniAICreator/Qiita-1.07M huggingface dataset:
【Vue warn】: Property or method "name" is not defined on the instance but referenced during render の解決方法

# はじめに
Vue.jsで開発しているときにエラーに出くわしたので備忘録としてここに残しておきます。
ちなみにめちゃくちゃ初歩的なエラーでした。。笑

# エラー

```vuejs:erroe
【Vue warn】: 
Property or method "name" is not defined on the instance but referenced during render 
```

- 意味
    - プロパティまたはメソッドのnameがインスタンスで定義されていないのに、レンダリング中に参照されてるよ

- 原因
    - dataプロパティでnameのデフォルトの値が設定されていなかった

# 対処法
dataプロパティでnameのデフォルトの値を定義してあげることで解決できました。

```vuejs:app.vue
<script>
export default {
  // ...code
  data() {
    return {
      name: "",
      //　...code
  },
  // ...code
}
```
7日間の投稿をグラフ化 ~application.jsファイルが大事~

★基本的には先駆者の方のサイトを見れば大半はできます！
ほぼ出来ていると思うんですが、中々グラフが表示されなかったので、メモとして残します。

↓↓↓素敵な先駆者のサイトはこちら(いつもめっちゃわかりやすくて助かってます！！！)↓↓↓

https://qiita.com/ki_87/items/37e9f42c118f87416aa6

但し、記述を丸パクリしてもグラフが出現せず 
こんな感じにしたいのに、、、otz

![スクリーンショット 2022-06-26 15.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2717077/f1f73124-92bf-4636-e91d-f0bb34978545.png)


gemのインストールは間違っていないと思ったので、怪しいなぁーって思っていた
「application.js」ファイルで検索をかけたところ、、、
```
import Chart from 'chart.js/auto';
import jQuery from "jquery"
global.$ = jQuery;
window.$ = jQuery;
global.Chart = Chart;
```
これを追記したら動きました♪

ちなみに、、、グラフの記述はこんな感じです！
```php:book.rb
  scope :created_today, -> { where(created_at: Time.zone.now.all_day) } 
  scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) } 
  scope :created_2days, -> { where(created_at: 2.days.ago.all_day) } 
  scope :created_3days, -> { where(created_at: 3.days.ago.all_day) } 
  scope :created_4days, -> { where(created_at: 4.days.ago.all_day) } 
  scope :created_5days, -> { where(created_at: 5.days.ago.all_day) } 
  scope :created_6days, -> { where(created_at: 6.days.ago.all_day) } 
  scope :created_this_week, -> { where(created_at: 6.day.ago.beginning_of_day..Time.zone.now.end_of_day) } 
  scope :created_last_week, -> { where(created_at: 2.week.ago.beginning_of_day..1.week.ago.end_of_day) } 
```

↓↓↓イケメン風に描きたい人向け↓↓↓(僕はブサ面の小心者の初心者なのでこのままです。。。)

https://qiita.com/ki_87/items/d22238d14b298ef22a85



```php:show.html
   <canvas id="myLineChart"></canvas>
  <script>
    $(document).on('turbolinks:load', function() {
      var ctx = document.getElementById("myLineChart");
      var myLineChart = new Chart(ctx, {
        type: 'line',
        data: {
          labels: ['6日前', '5日前', '4日前', '3日前', '2日前', '1日前', '今日'],
          datasets: [
            {
              label: '投稿した本の数',
              data: [
                <%= @books.created_6days.count %>,
                <%= @books.created_5days.count %>, 
                <%= @books.created_4days.count %>, 
                <%= @books.created_3days.count %>, 
                <%= @books.created_2days.count %>, 
                <%= @books.created_yesterday.count %>, 
                <%= @books.created_today.count %>
              ],
              borderColor: "rgba(0,0,255,1)",
              backgroundColor: "rgba(0,0,0,0)",
              tension: 0.4
            }
          ],
        },
        options: {
          title: {
            display: true,
            text: '7日間の投稿数の比較'
          },
          responsive: true,
          scales: {
            y:{
              suggestedMin: 0,
              suggestedMax: 10
            },
            x:{
              stacked: true
            },
          },
        }
      });
    });
  </script>
```
【js】for...ofでDOM要素を一文字ずつ加工したテキストアニメーション例

# 一文字ずつフェードインアニメーション
よく見かけるテキストアニメーションのサンプルです。スクロール監視などと組み合わせていい感じに活用できそう。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="rNdBOGo" data-user="__m-sato__" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/__m-sato__/pen/rNdBOGo">
  文字アニメーション</a> by __m-sato__ (<a href="https://codepen.io/__m-sato__">@__m-sato__</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## サンプルコード
```script.js
document.addEventListener('DOMContentLoaded', function() {
            const el = document.querySelector('.animate-title');
            const str = el.innerHTML.trim() // -> trim()メソッドで、文字列の両端の空白を削除した文字列を格納
            let concatStr =  ''; // -> for文でタグ付与されたものを格納する変数を用意
            for(let c of str) {
                c = c.replace(/\s+/, '&nbsp;') // -> replace()メソッドで文字列の中の半角スペースを実態参照に置換し新しい文字列として返す。
                concatStr += `<span class="char">${c}</span>`; // -> 文字列にクラス付与加工して結合
                }
            el.innerHTML = concatStr; // ->  文字列にクラス付与加工した要素を、html要素に代入
            
            
            const btn = document.querySelector('button');
            btn.addEventListener('click', () => {
                el.classList.add('inview');
            });

            el.addEventListener('animationend', () => {
                setTimeout(function() {
                    el.classList.remove('inview');
                },900)
            })
        })

```

### for...of
```js
for(let c of str) {
                c = c.replace(/\s+/, '&nbsp;') // -> replace()メソッドで文字列の中の半角スペースを実態参照に置換し新しい文字列として返す。
                concatStr += `<span class="char">${c}</span>`; // -> 文字列にクラス付与加工して結合
                }
            el.innerHTML = concatStr;
```
取得した要素をfor...ofで一文字ずつクラス付与加工してループ。それを新しい要素として代入しています。
半角スペースが渡ってくる場合は実体参照に置き換えて正常に描画されるようにしています。
Linuxサーバを複数ユーザで共有

# 本記事で出来ること
複数のユーザがパスワードを使用してLinuxサーバにログインできるようにする。
パスワードポリシーは数字・英大文字・英小文字・記号を１つ以上必要とした８文字以上のパスワードとする。
初回ログイン時にパスワード変更をさせる。

# 環境
* CentOS 7.9

# ユーザ追加
```terminal
〇監理者になっておく
$ sudo su

〇ユーザ追加
#useradd <username>
（例）# useradd test
```

# ユーザのパスワード
```terminal
# passwd <username>
2度パスワードを入力する

〇初回ログイン時にパスワード変更される方法
1.パスワード設定時にオプション「-e」を付ける
# passwd -e <username>
2度パスワードを入力する

2.次回ログイン時にパスワードを変更させる
# passwd --expire <username>
```
# パスワードログインを許可する
```terminal
# vi /etc/ssh/sshd_config

〇変更前
PasswordAuthentication no

〇変更後
PasswordAuthentication yes
```
sshdをリスタートする。
```terminal
# systemctl restart sshd
```

# パスワードポリシーの変更
```terminal
# vi /etc/pam.d/system-auth

〇変更前
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= 

〇変更後
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=0
```
|項目|説明|
|:-------|:---|
|minlen　　 |パスワードの最低文字数|
|dcredit　　|パスワード内に必要とする数字の数|
|ucredit　　|パスワード内に必要とする英大文字の数|
|lcredit　　|パスワード内に必要とする英小文字の数|
|ocredit　　|パスワード内に必要とする記号の数|

つまり`minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=0`のパスワードポリシーは
`数字・英大文字・英小文字・記号を１つ以上必要とした８文字以上のパスワード`である。
セグメンテーションの神ソフト「EIseg」をubuntu20でインストールするまで。

**1.セグメンテーション「EIseg」とは**
 GitHub　https://github.com/PaddleCV-SIG/EISeg
![141130688-e1529c27-aba8-4bf7-aad8-dda49808c5c7 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345719/8f96e6fc-2dad-1e0c-39c7-577b9da1a963.gif)

どうやら、クリックだけでセグメンテーションが可能らしい。
手でやるセグメンテーションは地獄なので、なんてありがたい。
しかし、インストールまで1日を要したのでUbuntuでのハマりポイントをここに記します。

**2　導入**
最初の環境
-Ubuntu22.04　
-Python 3.10.4 
-venv で仮想環境を構築
まず、Ubuntu22で導入を試みました。
謎のエラーが出てどうにも無理でした。　
 
**3　再導入**
Ubuntu22は公式でも動作確認してないので、あきらめてUbuntu20で
環境
-Ubuntu20.04　
-Python 3.8.10

-venv で仮想環境を構築
```terminal
python3 -m venv venv
. venv/bin/activate
```

公式では、pipで入るらしいので。
```terminal
pip install eiseg
eiseg
ModuleNotFoundError: No module named 'paddle'
```
paddleがないらしい、正式にはPaddlePaddle
```terminal
pip install PaddlePaddle
```
入りました。versionは2.3.0、推奨は> = 2.2.0なのでOKかな
これでどうだ、ところが、

```terminal
eiseg
「TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates」
```
どうもprotocのバージョンが高すぎる様子
そこで、動作するバージョンが確認できたversion=3.18.1　があるよう
（もっといいのがあるかもしれません）。
```terminal
pip install protobuf==3.18.1
eiseg
```
起動しました。
モデルを読み込ませて、ポチポチするだけで、
![Screenshot from 2022-06-26 13-00-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345719/b5691456-a4f3-cf85-2160-942ec1f0eaf8.png)

できました。
Dokker使ってもいいんだろうけど。

OSの変更疲れた。

**参考記事**
・EISeg
　https://github.com/PaddleCV-SIG/EISeg/blob/develop/README_EN.md
・AIを使った自動セグメンテーションマスクツール「EISeg」のセットアップ方法
　karaage0703
　https://zenn.dev/karaage0703/articles/1ba7411080e9c5
・たった数クリックでセグメンテーションのマスクを作る！？　Edge Flowの紹介　
　@koshian2　
　https://qiita.com/koshian2/items/8beab322ff20228658d8
・Windows10 AnacondaでEISegを導入してアノテーション　
　https://circleken.net/2022/01/post78/
SMB(139, 445)攻略メモ

# SMBの攻略メモ
HTBでSMBが検出された際の攻略方法。
自分用の備忘録です。悪用厳禁。


# 対象の前提
・Windowsマシーン

# 手順
###  1.Enum
- enum4linux -a -u "guest" -p "" {target IP}
ターゲットに対して、「guest」ユーザ。パスワードなしで接続試行。
sharesに対してアクセスができることを確認したため、次の手順。

### 2.Access & Get Files
- smbclient -U "guest" //{target IP}/shares
接続ができたら、dirコマンドなどで、shares配下にどんなファイルがあるかチェック。
目ぼしいファイルがあれば下記でダウンロード。 
・mask ""
・recurse
・prompt
・mget *
Test-Connectionを使ってTCPポートをスキャンする


### foreachループを使って、対象のIPアドレスの到達性とTCPポートの状態を確認する

### ユースケース
+ foreachでテキストのリストと変数の配列から対象を取り出す
+ foreachの中でforeachを回すネスト構造
+ **Test-Connection** の **-TcpPort**オプションでポートの状態を確認


以下、環境です。
**Windows 10 Enterprise**
**PowerShe 7.2.5**

※ Windows Powersell（5.1）では、-TcpPortのオプションは使えないので注意
※ 参考サイト：[Microsoft : Test-Connection](https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Management/Test-Connection?view=powershell-7.2 "pwsh 7.2") 

``` ipAddrList.txt
172.22.1.201
172.22.1.170
172.22.1.179
172.22.1.81
172.22.1.26
172.22.1.25
172.22.0.1
172.22.0.2
```
+ IP到達性を確認したいIPアドレスリスト


```tcpScanPort.ps1
$ipAddrs = (Get-Content ./ipAddrList.txt)
$scanPorts = @(22, 80, 443)

Start-Transcript C:\Temp\scanResult.txt

foreach ($ips in $ipAddrs) {
    $pingResult = Test-Connection $ips -Count 1 -Quiet
    IF ($pingResult -eq "True") {
        foreach ($port in $scanPorts) {
        $scanResult = Test-Connection $ips -IPv4 -TcpPort $port -TimeoutSeconds 1
            IF ($scanResult -eq "True") {
                Write-Host "Host:" $ips "Port:" $port "is open"
            } else {
                Write-Host "Host:" $ips "Port:" $port "is closed" 
            }
        }
    } else {
        Write-Host "Host:" $ips "is NOT reachable!"
    }
}

Stop-Transcript
```
+ 実行結果

```
PS C:\Users\MashCannu> .\tcpPortScan.ps1
Transcript started, output file is C:\Temp\scanResult.txt
Host: 172.22.1.201 Port: 22 is closed
Host: 172.22.1.201 Port: 80 is closed
Host: 172.22.1.201 Port: 443 is closed
Host: 172.22.1.179 is NOT reachable!
Host: 172.22.1.170 Port: 22 is closed
Host: 172.22.1.170 Port: 80 is closed
Host: 172.22.1.170 Port: 443 is closed
Host: 172.22.1.81 Port: 22 is closed
Host: 172.22.1.81 Port: 80 is closed
Host: 172.22.1.81 Port: 443 is closed
Host: 172.22.1.26 Port: 22 is closed
Host: 172.22.1.26 Port: 80 is open
Host: 172.22.1.26 Port: 443 is open
Host: 172.22.1.25 Port: 22 is closed
Host: 172.22.1.25 Port: 80 is open
Host: 172.22.1.25 Port: 443 is closed
Host: 172.22.0.1 Port: 22 is closed
Host: 172.22.0.1 Port: 80 is closed
Host: 172.22.0.1 Port: 443 is closed
Host: 172.22.0.2 is NOT reachable!
Transcript stopped, output file is C:\Temp\scanResult.txt
PS C:\Users\MashCannu>
```

### コード解説

``` line1.ps1
$ipAddrs = (Get-Content ./ipAddrList.txt)
$scanPorts = @(22, 80, 443)
```
+ IPアドレスはテキストファイル、ポートは配列からとってくる

``` line2.ps1
Start-Transcript C:\Temp\scanResult.txt

... code ....

Stop-Transcript
```
+ コードの実行結果を**Start/Stop-Transcript**でテキストファイルに保存

``` line3.ps1
$pingResult = Test-Connection $ips -Count 1 -Quiet
$scanResult = Test-Connection $ips -IPv4 -TcpPort $port -TimeoutSeconds 1
```
+ **Test-Connection**の結果をBoolean型で取得し、それぞれの変数に入れる
※ **-Quiet** と **-TcpPort** のオプションを付けると返値はBoolean型になる。


``` line4.ps1
foreach ($ips in $ipAddrs) {
    $pingResult = Test-Connection $ips -Count 1 -Quiet
    IF ($pingResult -eq "True") {
        foreach ($port in $scanPorts) {
        $scanResult = Test-Connection $ips -IPv4 -TcpPort $port -TimeoutSeconds 1

    } else {
        
    }
```
+ 最初の**foreach**ループで対象のIPアドレスの到達性を確認する
+ IF文で到達性を判断し、到達できた場合は次の**foreach**ループを回す
+ 到達できない場合は、elseブロックないの記述を処理
UiPath 代表的な文字列操作 【VB.NETメソッド】

初投稿です！よろしくお願いします。

現在、私はUiPathの資格の勉強をしています。（UiRPAアソシエイト資格）

代表的な文字列操作ができるVB.NETメソッドをまとめたいと思いましたので記事にしました。

### VB.NETメソッドその１

値→**C:\Files\ファイル.txt**

| 構文規則 | 結果 | できること |
|:-:|:-:|:-:|
| FilePath  | C:\Files\ファイル.txt |  変数の値を表示する |
|  FilePath.Contains("ファイル").toString |  TRUE | テキストに特定の単語または、フレーズが含まれているかどうかをチェック |
FilePath.EndsWith(".txt").ToString|TRUE|テキストの末尾に、特定のフレーズが含まれているかどうかをチェックする|
|FilePath.StartsWith("C:").ToString|TRUE|テキストの先頭に、特定のフレーズが含まれているかどうかをチェックする|
|FilePath.Replace（".txt","csv"）|C:\Files\ファイル.csv|テキスト内の単語またはフレーズを置き換える|
|FilePath.Substring（9）|ファイル.txt|特定のインデックスや長さで指定された、文字列の一部を取得する|
|FilePath.ToLower|c:\files\ファイル.txt|テキストを小文字に変更する|
|FilePath.ToUpper|C:\FILES\ファイル.TXT|テキストを大文字に変更する|
|FilePath.Insert(6,"TEST").ToString|C:\FilTESTes\ファイル.txt|文字と位置を指定して、挿入する|
|FilePath.Remove(9,2)|C:\Files\イル.txt|文字の位置、文字数を指定して削除する
|FilePath.Epuals("ファイル").ToString|FALSE|２つの文字列が同一かどうかを判断する|
|FilePath.IndexOf("ル").ToString|12|先頭から文字を検索し、見つからないときは-1を返す
FilePath.length|17|文字列の長さを取得|



### VB.NETメソッドその２

| 値 | 構文規則 | 結果 |   できること|
|:-:|:-:|:-:|:-:|
|  "C:\Files\ファイル.txt" |  FilePath.Split("\\"c) | Index0 C:, Index1 Files, Index2 ファイル.txt  |  特定の区切りでテキストを分割 |
|  "　" |  String.IsNullOrEmpty(Text1) | nullではありません  |  指定された文字列がnullまたは空の文字列であるかどうかを示す |
|"　"|String.IsNullOrWhiteSpace(Text1)|nullまたは空白文字列です|指定された文字列がnullまたは空であるか、空白文字だけで構成されているかどうかをしめす|
|"C:\Files\{0}.txt"|String.Format(FilePath1,"ファイル")|C:Files\ファイル.txt|テキスト形式でデータを組み合わせる|
|" 空白を 含む 文字列 "|"【"+IncludeSpaceText.Trim+"】"|【空白を 含む 文字列】|先頭および末尾に含まれているスペースを取り除く|

### まとめ

使用頻度が多そうな文字列操作もたくさんありますね。
今回紹介したのも「代表的なもの」なので、これ以外の操作に関しては都度調べて実装し、自身に落とし込んでいきたいです。

見ていただいてありがとうございました。
VScodeでGPUが認識されず使えない（colaboratoryのipynbファイル）

# colaboratoryのipynbファイルを、ローカルPCのVScodeで実行したらGPUが認識されず使えない

・新規でipynbファイルを作成したことで解決
・理由はわからない。
・colaboratoryからダウンロードしたipynbファイルになんらかの情報がのこっているのかな。

colaboratoryで学習をまわしていたが頻繁にセッション切断されるため、ローカルPCのgpuで学習させようと思いました。
colaboratoryからipynbファイルをダウンロードしてVScodeに取り込んで実行しましたが、GPUが利用できなかった。

GPUはRTX3080laptop
CUDA11.7、cuDNNv8の最新

VSCode上でvenvで仮想環境を作り、Pytorchのバージョンは1.11 cuda
https://pytorch.org/

colaboratoryからダウンロードしたipynbファイルで実行すると
```python
import torch
torch.__version__,torch.cuda.is_available()
```
結果は、`('1.11.0+cpu', False)`


新しくipynbファイルを作成し実行すると

結果は、`('1.11.0+cu113', True)`

どうゆうこっちゃ。

##### 参考にした情報
https://rupic.hatenablog.com/entry/2020/03/24/021455
https://zenn.dev/ryu2021/articles/3d5737408b06fe
AtCoder Beginner Contest 257

## [A - A to Z String 2](https://atcoder.jp/contests/abc257/tasks/abc257_a)

O(1)
計算式(X-1)/Nを思いつくか。
またはシミュレートする。

```C++:C++
#include <bits/stdc++.h>
string S = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main() {
    int N, X;
    cin >> N >> X;
    cout << S[(X-1)/N] << endl;
    return 0;
} 
```

## [B - 1D Pawn](https://atcoder.jp/contests/abc257/tasks/abc257_b)

O(Q)
シミュレートする。

```C++:C++
#include <bits/stdc++.h>

int main() {
    int N, K, Q;
    cin >> N >> K >> Q;
    vector<int> A(K+1), L(Q);
    for(int i=1;i<=K; i++) cin >> A[i];
    for(auto &l:L) cin >> l;

    for(auto &l:L){
        if(A[l] == N) continue;
        else if(l == K) A[l]++;
        else if(A[l]+1 < A[l+1]) A[l]++;
    }

    for(int i=1; i<=K; i++){
        cout << A[i];
        if(i<K) cout << ' ';
        else cout << endl;
    }

    return 0;
}  
```

## [C - Robot Takahashi](https://atcoder.jp/contests/abc257/tasks/abc257_c)

O(N^2)はTLEになる。
そこでO(NlogN*2)にすることにした。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)

int N;
string S;
int W[200000+1];
vector<int> child, parent;

int f(int X){
    int t1=0, t2=0;
    auto itr1 = lower_bound(child.begin(), child.end(), X);
    if(itr1 != child.end()) t1 = itr1 - child.begin();
    else t1 = child.size();
    auto itr2 = lower_bound(parent.begin(), parent.end(), X);
    if(itr2 != parent.end()) t2 += parent.end() - itr2;
    return t1+t2;
}

int main() {
    cin >> N >> S;
    rep(i, N) cin >> W[i];

    rep(i, N){
        if(S[i] == '0') child.push_back(W[i]);
        else parent.push_back(W[i]);
    }
    sort(child.begin(), child.end());
    sort(parent.begin(), parent.end());

    int ans=0;
    rep(i, N){
        if(S[i] == '0') ans = max(ans, f(W[i]+1));
        else ans = max(ans, f(W[i]));
    }
    cout << ans << endl;

    return 0;
} 
```
rails serverの実行時にyarnに関するエラーが出たときの対処法

`'rails server'`を実行したら、下記のようなエラーが出た。

```エラー内容
========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.22.19
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
```


対処法
---
こちらの記事を参照し、yarnの再インストールするのかと理解。
https://qiita.com/___fff_/items/2df7fb111954fd0db4ed

しかし、初学者でファイル操作を誤るとリカバリーが大変なので、とりあえず
`'yarn instal'`を実行したら、エラーが出なくなった。



大丈夫なのか・・・？
SwiftのTableViewの再利用機能によってCell内のUIButtonのtagがうまく取得できない

Swiftのテーブルビューはスクロールする際にセルを再利用する。
そのため、テーブルビューのセル内にUIButtonを設定している場合、
スクロールするとUIButtonのTagとindexPath.rowと整合性が合わなくなってしまう問題に直面した。

:::note alert
よくあるセル内にUIButtonを設定するコードでは、
タップしたセル内のUIButtonのindexPath.rowとsender.tagが合わない
:::
```Swift
// Cellの内容   
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

     // UIButton
     let button = UIButton()
     button.tag = indexPath.row
     // 押下時動作
     button.addTarget(self, action: #selector(buttonAction), for: UIControl.Event.touchUpInside)
     cell?.addSubview(button)
     return cell!
}

@objc func buttonAction(_ sender: UIButton) {
     print("buttonTag", sender.tag)
}
```





:::note info
以下のコードではセル内のUIButtonのindexPath.rowが正確に取得できる。
sender.tagは使用していない。
:::
```Swift
@objc func buttonAction(_ sender: UIButton) {
    var superview = sender.superview
    while let view = superview, !(view is UITableViewCell) {
        superview = view.superview
    }
    guard let cell = superview as? UITableViewCell else {
        print("button is not contained in a table view cell")
        return
    }
    guard let indexPath = tableView.indexPath(for: cell) else {
        print("failed to get index path for cell containing button")
        return
    }
    print("button is in row \(indexPath.row)")
}
```


参考サイト
[indexpath row after a press button in a table view cell](https://developer.apple.com/forums/thread/67265 "apple developper")
ReactのaxiosでAWS lamdaをたたいたらCORSエラー

この前からAWS SAMにと取り組んでます。AWS上にlamda関数は構築できてブラウザからアクセスでは正常に帰ってくるけど、reactのaxiosで叩いたら、でました。いつも引っかかるやつ。CORSエラーです。

`
Access to XMLHttpRequest at 'http://localhost:3000/hello' from origin 'http://localhost:3001' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
`

下記記事に助けられました、localでも同じです。かんしゃかんしゃ。

https://syachiku.net/react-axios-cors/

lamda関数の返り値に以下の内容でheaderを付与します。

```
    return {
        'statusCode': 200,
        'headers': {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "POST,GET,PUT,DELETE",
            "Access-Control-Allow-Headers": "Content-Type"
        },
        'body':json.dumps({
            "message":"hello world"
        })
```

これでaxiosを使ってlamdaを実行できました。
【UiPath】UiPathを使ったスクリーンショット（全画面）

# はじめに
初めましてQiita人生初投稿です。
個人的にUiPathの学習をしている中で、
UiPathのスクリーンショット取得について自分で色々試してみたことを書きたいと思います。

# 前提条件
この記事を書くにあたって、使用した各ツールのバージョンは以下の通りです。
* UiPath Studio 2022.4.3 Community License
※モダンデザインで作成
* Microsoft Edge 103.0.1264.37

# UiPath Activityを使用したスクリーンショット
UiPathにはスクリーンショットを取得するアクティビティ
スクリーンショットを作成（Take Screenshot）が存在しています。
このアクティビティを利用することで、スクリーンショットを簡単にファイルに保存することが可能です。

UI Automation＞アプリケーション＞スクリーンショットを作成
![tmp001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/08a5b27f-a85d-65ba-8c27-b313ce51b0a6.png)

# 全画面のスクリーンショット（スクロール画面）
スクリーンショットを作成するアクティビティだけでは、スクロール有の画面全体のキャプチャを撮ることは出来ません。
そこで以下の方法で試してみることにしました。

## ブラウザの機能を使用して全画面キャプチャを取得
ブラウザのデベロッパーツールを利用して、全画面のキャプチャを撮ることができます。
今回はEdgeのWEBキャプチャを利用してみました。

* 全体
![スクリーンショット 2022-06-26 134443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/09586ed9-03d7-f854-a0b6-cd04d6bb495e.png)

1. Edgeを開き、"天気予報"と検索する
![tmp003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/a223aaee-39e7-d437-960a-2b23f14c4467.png)

2. Edge Webキャプチャショートカットを実行し、ページ全体をキャプチャを押下する
![tmp004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/b9a2719e-ca80-aa78-6293-86a5c7beda54.png)

3. 保存ショートカットを押下して、画像を保存する（デフォルトだとダウンロードフォルダへ保存されます）
![tmp005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/3fb50cac-be78-1930-1922-6ffca5d64984.png)
:::note info
各アクティビティ終了後に、5秒の待機時間を入れています。
待機時間を入れない場合、処理速度が追い付かず、正常にキャプチャを撮ることができません。
![tmp006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/e8ca75ec-5e07-c3e0-aafb-af875a6c77af.png)
:::

# 最後に
今回はEdgeのWEBキャプチャの機能使って、ページ全体のキャプチャを取得してみました。
簡単にページ全体のキャプチャを取得出来るので、エラー時のページの状態取っておく場面等で活用できると思います。
CTF情報収集のiOSアプリを作った

# CTF情報収集 アプリ

## 概要
本記事では、SwiftUIでCTF情報を収集できるアプリケーションを開発したので、実装方法の紹介をしようと思う。

## アプリビュー
　　　　<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/59f8e785-01c2-59da-b60d-7d89f87f3997.png">　　　　　　　　　<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/849f776c-55d2-6229-eed0-e1ba6291888c.png">

## 実装方法
開発言語: SwiftUI

SwfitUIで[CTF Time](URL "https://ctftime.org/")のAPIを叩き表示している 

## カレンダーにイベント追加できるようにした
※追記(2022/8/17)
　　　　　<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/142450f0-6b86-8b13-26e2-b4a8bbfc0a4a.png">　　　　　<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/140dc3a3-fcfd-9fb6-85be-323efee78cf7.png">　

倍くらい使いやすくなった。最高
## 今後の展開
CTFの情報だけでなく、セキュリティ関連のニュースも表示するように拡張していく。

## リリース
リリースを開始しました。
https://apps.apple.com/jp/app/ctftime/id1641469059
30代半ばのAtCoder入水記事

# はじめに
　水色になったので前から書きたかった色変記事を書きます。[2022/6/18 ABC256](https://atcoder.jp/users/rchaser53/history/share/abc256)で水色になれました。開始が2020/5/31 ABC169が初参加なので大体2年1ヶ月くらいかかったことになります。そこそこ苦労したので記事を書いてしまうくらいには嬉しいです。

![スクリーンショット 2022-06-19 20.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99025/e9f179d9-165b-63a3-e45a-f0338429f242.png)

# 誰
　アラサーのうちにAtCoder水色になりたかったアラフォーのWebエンジニアです。直近はDevOpsエンジニアとして社内および関連会社で扱っているPrivate NPMの開発/運用をしています。プログラミングは社会人スタートで競技プログラミングは2020/5ごろにはじめました。

# 使用言語
　使用言語はRustです。出自がフロントエンドエンジニアなので初回だけJavaScriptを利用しました。とても辛かったので直ぐにRustに切り替えました。Rustを選んだ理由は単純にRustの勉強にもなるかなと考えたことが理由です。しかし実際のところ使用する文法や関数などに非常に偏りがあり効果の程は微妙でした。Rustの長所の1つだろう非同期処理などについても全く学ぶことができません。冷静に考えると当たり前なので想像力に欠けているといえるでしょう。
　JavaScriptほど顕著ではありませんがRust自体も競技プログラミングの言語としては機能が大分不足している気はします。例えばsetのlower_boundとかはないので[ABC217 D. Cutting Woods](https://atcoder.jp/contests/abc217/tasks/abc217_d)みたいな問題は辛いです。こいつを解こうとすると座標圧縮してセグ木に乗せてlower_boundする必要があります(他の解き方もあるとは思います)。ちなみに本番では綺麗に爆死しました。あとデフォルトの型がi32なのも嫌です。結構な回数オーバーフローでWA出してます。はるかに高いパフォーマンスを出しているRust使いの方々はいらっしゃるので実力があれば大した問題ではないのだとは思います。

# やったこと
　2022/6/19現在AtCoderのRustのAC数は1453。LeetCodeのRustのSolvedは211です。途中で灰〜水色の手頃な問題は尽きてしまいました。困ったので同僚が最近やっているLeetCodeの過去問を解くことにしました。結果、徐々にパフォーマンスが伸び水色に到達することができました。
　これはLeetCodeが良いのではなくシンプルに解いている問題の数が少ないことが原因で、yukicoderなど他のもサービスを使っても同様の結果になると思います。最近どうもパフォが伸びないとお悩みの方、別のサービスの過去問を解いてみると良いのかもしれません。少なくとも私には効果がありました。

# やること
　大きく分けて2つあります。使用言語をC++に切り替えることと青パフォを出すために青およびFの過去問を解くことです。
　上でも書きましたが個人的にRustは競技プログラミングにはあまり向いていない気がします。なので競技プログラミングで利用者が多いC++を使ってみるかなという所存です。あとACL使ってみたいのと最近利用できる言語を増やしていないので増やすかという気持ちがあります。
　初めて2年過ぎましたがコンテストで青パフォを1回も出したことがありません(1400以上のパフォーマンスは3回)。改めて書くまでもないことですが青色になるためには青パフォ出す必要があります。そのためにも今まで解けなかった問題をまず解ける必要になるのかなと思っています。なので腹を括って青およびFの過去問を解いていきたいと思います。基本的に見たことタイプの問題は茶色とかでも普通に解けないことが多いので、引き続きLeetCodeないし何某かのサービスで問題を解いていこうとは思います。
　
# おわりに
　最初の目標であった水色は到達しました。次の目標は青色です。アラフィフになるまでに実現できれば良いなと思います。何年先になるかは不明ですが、その頃にまた記事が上がっていたら読んでもらえると嬉しいです。それでは
よく使われるn進数　基数と桁の重み

# 基数
n進数のnの部分が基数と呼ばれる。

## 気づき　
基数があるから何なんだろう？

# ２進数の進み方
２進数の上げていくと
1,10,100,1000,10000,100000
この２進数が表す数字は、
1, 2,  4,   8,   16,    32
になる。

# 数値の読み方、理解の仕方
３３２.５mを見て判断するのは
100の位に３
10の位に３
１の位に２
１/10の位に５
が入っていることだ。
一桁一桁同士は同じではない。
それぞれに違いがある。
・１００の位が１０の位を表すことはできない。
・```小数点から３桁目の数字は１００の位の数字```を表す。
これを各桁の重みという。

# 気づき
もう一回見ると
２進数が１００の場合は３桁目にしか１があるので４を表す。

# n進数の重み
nのn-1乗の法則で決まる。

# 気づき
まだ説明しきれないからこれから理解していこう。
これがこれから基数変換と言うものに使われるらしい。
確かに
１００は２進数で表せるが１００で表せる４は２進数ではない。
８、１６進数だ。
これだと変換できることは理解できる。

だからと言って基数変換の大切さがまだわからない。

出典 キタミ式イラストIT塾 基本情報技術者 令和３年
【Flyway】Found more than one migration with versionX.X.Xは、ファイル名が違う場合でも、バージョンが同じだと発生する。

# エラー内容
```
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found more than one migration with version 1.0.0
Offenders:
-> /プロジェクトの配置ディレクトリパス/プロジェクト名/target/classes/db/migration/V1.0.0__users.sql (SQL)
-> /プロジェクトの配置ディレクトリパス/プロジェクト名/target/classes/db/migration/V1.0.0__books.sql (SQL)
```

# エラー原因
マイグレーションのファイルのバージョン衝突が起きていることが原因。
バージョンが同じだと、ファイル名が違う場合でも、エラーが発生する。

:::note warn
ファイル名が違う場合でも、起きるエラーが起きる組み合わせ
- V1.0.0__users.sql
- V1.0.0__books.sql
:::

# 解決方法
バージョン名をそれぞれ、違うものにする。

:::note warn
例
- V1.0.0__users.sql
- V1.0.1__books.sql
:::

# なぜ違うファイル名でも、バージョンが同じだと、衝突エラーが起きるの？
Flywayは、バージョンで、マイグレーションの実行順序を決めていて、バージョンが同じだと、どのファイルをどの順序で、実行すればいいか分からなるからです。
nvmをインストールする方法【nvm/Node.js/zsh/npm】

# nvmのインストール手順（zsh）

#### 1. nvmをインストール
```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```

#### 2. .zshrc に以下を記述して保存
```.zshrc
source ~/.nvm/nvm.sh
```

#### 3. nvmのインストールを確認する
```
nvm -v
```

#### 4. nvmを使ってNode.jsのバージョン12をインストールする
```
nvm install v12
```

#### 5. Node.jsのインストールを確認する
```
node -v
```
英語学習アプリで学ぶ差別化戦略

# 英語学習アプリで学ぶ差別化戦略

## 本記事の目的

英語学習アプリを紹介しながら差別化戦略について学ぶ。

## なぜ英語学習アプリ？

１．僕が興味ある
２．市場が大きい＆利用者が多い -> 競争が激しい
３．２．のため、多くの英語学習アプリは差別化する必要があり、多様な製品が市場に存在する

## 差別化の本質

結論：「別の軸を足す」行為。
別の軸を足すと深く刺さる人が出てくる。そういう人をターゲットにするイメージ。
具体的に見ていく。

## 事例集
### 事例１：　英語 + 「おしゃれ」 = Drops

雰囲気：おしゃれ
難易度：低

[Drops](https://languagedrops.com/)
![drops-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/413881da-d337-da97-f996-0d0bc3a2b80f.gif)


感想：
実際やってみると、音・視覚・振動を上手く使っていて操作が凄く気持ちいいし、おしゃれ
配色とかめちゃくちゃ綺麗。
apple製品好きな人に刺さりそう。

### 事例２：　英語 + 「クール」 = Lingvist

雰囲気：かため
難易度：中

[Lingvist](https://lingvist.com/)
![Screen Shot 2022-06-26 at 12.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/8630cb3c-49ec-ae5c-dba5-776087b51f88.png)

感想：
ちゃんと勉強してる感じがあるのが良い。
難易度もそこそこあるので歯ごたえあった。
他のアプリは気持ちよさの優先度が高かったりするので難易度が低くなりがちな中、こういう歯ごたえあるアプリは少し貴重。
「勉強のやる気そこそこあります！」みたいな人に刺さりそう。

### 事例３：　英語（TOEIC） + 「ゲーム」 = HAMARU

雰囲気：楽しそう
難易度：不明

[HAMARU](https://play.google.com/store/apps/details?id=com.studioms32.ms020&hl=en&gl=US)
![HAMARU.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/cb73d5c7-46cb-a801-3e9d-f18e7da0fc0f.gif)

感想：
一番ゲームっぽくて楽しそう（まだやったことない）。
怠惰な男子高校生的な「勉強らしい勉強したくないです！」みたいな人に対して刺さりそう。

### 事例４：　英語　+ 「ポップ」 = Duolingo

雰囲気：楽しそう＊親しみやすい
難易度：低

[Duolingo](https://www.duolingo.com/)
![Screen Shot 2022-06-26 at 12.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/9e5356c0-07a3-def2-396c-bc419b42994a.png)


感想：
言わずと知れたアプリ。
「とりあえず勉強するか」みたいな人でもとっつきやすい。
市場的には一番間口が広いけど、逆に深く刺さる人は他のアプリに比べて少なそうなイメージ。
とっつきやすさからVtuberが配信していたりする
　↑英語学習アプリとしては偉業（と思う）

あと、UIの素晴らしさが頭一つ抜けている。
語順を選択する問題ではドラッグ＆タップ両方受け付けるとか、そういう細かいところでストレスが無い。

## 感想

英語学習アプリの豊富さから学んだことは、大きい市場に対しては差別化戦略によって市場を取っていけることもあるよということ

「レッドオーシャンだから避ける」よりは「レッドオーシャンだから差別化する」戦略のほうが上手くいきそう

## 読者への課題

自分の好きな領域で同様の記事を作ってみる（レッドオーシャンほどやりやすいはず）

書き上がったら紹介してください
褒めに行きます
Interface って一体なんなの？

こんにちは。masafumiです。
現職場に転職してきて約半年が経ちました。
GoやPerl、DDD、API実装、テストコードなど日々新しい知識に触れ、まだ分からないことだらけですが、一つ一つ自分の身にできていってるのではと感じます。
最近、新しいプロジェクトが始まり、そこからほとんどGo言語でのコーディングにシフトしましたが、その中でこの **Interface** というやつが特に最初よく分からなかったので、現状の私なりの理解をまとめたいと思います。


# Interfaceとは？

職場の先輩の「まずは公式ドキュメントを見る」という心がけに私も習って、まずはGo言語公式の「[A tour of Go](https://go-tour-jp.appspot.com/methods/9 "Interfaces")」の中でのInterfaceの定義を再確認してみます。

「Interfaceとはメソッドの集合」
Interfaceはメソッドのシグネチャーの集合です。
従って、Interfaceの中に含まれる型は全てメソッドである必要があります。
A tour of Goの中では、例として以下のような　Interfaceを作っています。

```go:interraces.go
//Abs()というメソッドを持つ 'Abser' という名のInterface型を用意する
type Abser interface {
    Abs() float64
}

type MyFloat float64

// 絶対値を返すメソッド Abs()の実装内容
// Abs()はMyFloat型のためのメソッド
func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}
```

これはオブジェクト指向的に言うと、Abs()というメソッドを持った（満たす）Abserという**クラス**を用意した、ということになります。
従って、Abserから作られたインスタンスは Abs()メソッドを使えることになります。


```go:interraces.go
func main(){
    var a Abser
    f := MyFloat(-2.5)
    // f := -2.5  // 不可

    a = f
    fmt.Println(a) // -2.5
    fmt.Println(f) // -2.5

    fmt.Println(a.Abs()) // 2.5
}
```

ここで、 `f := -2.5` とした値をAbserインターフェース型の変数 `a`に代入することはできません。
なぜなら、Abserインターフェース型に集められたメソッド(Abs())は、MyFloat型のためのメソッドであるため、それ以外の型を代入することはできないためです。


# Interface と interface{}は違うみたい

```go
var i interface{}
```

変数宣言の時に使われているこの `interface{}`は何だ？と思ってました。
チュートリアルによると、これは

*The interface type that specifies zero methods is known as the empty interface:（メソッドが一つもないinterfaceは "空のインターフェース"という）*

らしいです。
メソッドが無いからそのメソッドの型に縛られない。
だから interface{} 型で宣言すれば、どんな型でも持てるということになるんですね。


# Interfaceは何が便利なのか？

Interfaceの良いところとして、

- 実装と使用を切り離して考えられる
- 依存性の逆転ができる

とよく言われます。
私も最初はよく分かりませんでしたが、最近少し分かってきた部分があります。

実際の開発を想定すると、Interfaceとその実装を作るパッケージ、実際に使うパッケージは分かれることになると思います。

## ペペロンチーノを作ってほしい！作り方は別に何でもいい！美味しければ！

**実装と使用を切り離して考えられる**という点は、私も先輩に教えてもらってとても理解しやすかったです。
パッと浮かんだ例として、ペペロンチーノの作り方を例に書いてみました。

- main.go : ペペロンチーノを作ってもらう側
- food.go : ペペロンチーノを作る側

各ファイルは上記のような役割のイメージです。
Interfaceとは結局メソッドの塊であり、使ってもらってナンボです。
従って、メソッドを使ってもらう側、つまりペペロンチーノ作成を依頼される food.go　側でペペロンチーノを作るというInterfaceを実装し公開する（先頭を大文字にして）べきであると考えました。

food.go側で実際のペペロンチーノの作り方のメソッド `Cooking()`を実装しました。こちらを `Peperoncino`インターフェースを通して公開します。

main.go側では特にペペロンチーノの作り方は知りません。でもとにかく作ってもらえればいい、美味しければいいのでこのメソッドを使って作ってもらうことができました。

これこそが、**実装と使用を切り離して考えられる**という、Interfaceのメリットなのだと思います。


```go:main.go
package main

import (
    "fmt"
    "food"
)

func main() {
    var p Peperoncino
    var chef Chef
    p = chef

    // ペペロンチーノを作ってもらう。ただし、こちらからはどう作られるのかは知らない。とにかく作ってもらえれば良い。
    fmt.Println(p.Cooking())
}

```

```go:food.go
package food

type Peperoncino interface {
    Cooking() string
}

type Chef string

// ペペロンチーノの具体的な作り方を実装している
type (c Chef) Cooking() string {
    pasta := 1
    olive_oil := 1
    onion := 1
    chili := 1
    bacon := 1
    return "Done!!
}

```

他にも、私が思うInterfaceのメリットは、実装と使用を切り離せることによって、**実装がまだ未完成でも、使用する側でとにかく開発を進められる**というところです。

上記の例で言うと、 `Cooking()`メソッドは、最悪引数と返り値だけでも書けていれば使用する側で使用できます。
アプリケーションの開発の自由度が上がるという点でも、Interfaceは便利なものだと感じられます。
ELBの用語要点まとめ２

・ヘルスチェック
ターゲットグループ内の各ターゲットが正常に動作しているかを定期的に確認。ターゲットから正常に応答が返ってくればELBからターゲットへの転送を行い、異常があればターゲットへの転送を停止する。ただし、ELBのヘルスチェックにはターゲットの復旧機能はないので、AWS Auto Scalingにて自動的に復旧させる設計が必要。

ヘルスチェックの主な設定機能
１、正常な閾値ー「非正常」の状態のリソースを「正常」と判断するまでのヘルスチェック連続「成功」回数
２、非正常な閾値ー「正常」の状態のリソースを「非正常」と判断するまでのヘルスチェック連続「失敗」回数
３、タイムアウトーヘルスチェックを失敗とみなす応答がない時間
４、間隔ーヘルスチェックの間隔

・アクセスログ
ELBに送信されるリクエストを記録しログをAmazon S3に保存。記録されたログはトラフィックの分析やコンプライアンスの監査に利用。アクセスログには、クライアントのアクセス日時、接続元IPアドレス、ポート番号、ステータスコードなどクライアントの接続情報が記録。

・ELB自身のスケーリング
ELBにはリクエスト数の増減に応じてELB自身が自動的にスケーリングする機能がある。リクエスト数が増加したらELB自身を自動的にスケールアウト（追加）し、リクエスト数が減少したらスケールイン（削除）して元の状態に戻る。

【ELB経由の暗号化通信】
ELB経由でクライアントとターゲット間の通信を暗号化させるには、暗号化する通信の範囲とサーバー証明書の配置によって3つの方法がある。

１、クライアントとELB間の通信を暗号化する
○ELBにサーバー証明書を導入する
クライアントとELB間で通信を暗号化し、ELBとターゲット間は平文の通信（暗号化されていない通信）を行う方法。クライアントとELB間での通信の暗号化・復号をELBが行うため、ターゲットに暗号化・復号による負荷が発生しません。すべてのELBが対応。

２、クライアントとターゲット間の通信を暗号化する
○ELBとターゲットにサーバー証明書を導入する
クライアントとELB間、ELBとターゲット間で別の暗号化通信を行う方法。暗号化接続はELBが終端となり、ELBから別の暗号化接続を確立して通信。ELB、ターゲットに暗号化・復号による負荷がかかりますが、クライアントからターゲットまでの通信すべてを暗号化できます。ALB、CLBが対応。

３、ターゲットにサーバー証明書を導入
ELBでは暗号化・復号せず、直接クライアントとターゲット間で暗号化通信を行う方法です。ターゲットに暗号化・復号による負荷が発生しますが、ELBによる暗号化・復号の遅延を発生させずに通信全てを暗号できます。NLB、CLBが対応。


SNIを利用したELB経由の暗号化通信
通常のサーバー証明書は、一つのパブリックIPアドレスを持つサーバーに対して一つのドメイン名が紐づく。
例えば「example.com」と「example.co.jp」の2つのドメイン名を持つWebサーバーの場合、ドメイン名ごとに異なるパブリックIPアドレスを取得してサーバー証明書を導入する必要があります。しかしELBからドメイン名を複数持つWebサーバーへ通信を転送しようとすると、クライアントから見たWebサーバーのパブリックIPアドレスは窓口であるELBのパブリックIPアドレスしかないため、通常のサーバー証明書では対応できません。
SNI（Server Name Indication）は、暗号化通信で使用するサーバー証明書をパブリックIPアドレスではなくドメイン名によって判断する技術。SNIに対応したELBに複数のサーバー証明書を導入すると、ELBが宛先ドメイン名から適切なサーバー証明書を判断してサーバーへ通信を転送します。SNIはALBとNLBが対応。
MacにPythonインストールをしたとき困ったことまとめ

# 概要と経緯
新しいMacBookAirを購入しました。
```
MacOS Monterey
メモリ：8GB
ストレージ：256GB
```
もう一台古いMacBookProの環境を整えようとした時のナレッジとして記載します。

## Pythonインストール
- Command Line Toolsのインストール
ターミナルを起動し
```zsh:zsh
$ gcc
```
を実行。そうすると
![pic01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/7962907b-1401-5dc4-e98f-e6e40b4b01b4.png)
と表示されたので、そのまま`[インストール]`。を押下。
「電源つなげ！」みたいな催促もポップアップで出たりしますがそこは**新Mac!**
無視してお元気バッテリーで続行。少々時間がかかりましたが、無事`Command Line Tools`はインストール完了。

## Homebrewのインストール
お次はHomebrewのインストールです。ターミナルを起動して
```zsh:zsh
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
を実行。なんやかんやと実行されていきます。そして、
```zsh:zsh
Press RETURN to continue or any other key to abort
```
の表示が出るので「仰せの通りに」と`[RETURN]`キーを押下。
また、なんやかんやと実行されて完了したようだったので、
```zsh:zsh
$ brew install python3
```
と最新版Python3をインストールを試みる。・・・も
```zsh:zsh
brew: command not found
```
## あっれーなんで進まないの？
「今のシェルがおかしい？」とか思って
```zsh:zsh
# 今のシェルの確認
$ echo $SHELL
# 使えるシェルの閲覧
$ cat /etc/shells
# 変更してみたり
$ chsh -s /bin/sh
```
などしましたがあまり意味がないようで。（最終的にはzshを使用）

## ググってみたら答えあり
**MacBookAirのCPUをチェックしたら?**
っていうのがあり早速確認。
```zsh:zsh
$ sysctl -a machdep.cpu.brand_string
# 実行結果：Apple M1
```
と出ました。その場合
1. 「Finder」>「検索窓」で`ターミナル`を検索
1. `ターミナル`を右クリックして[情報を見る]をクリック
1. [ターミナルの情報]がポップアップで開く
1. その中の[一般情報：]を開けると下の方にある`Rosettaを使用して開く`にチェックを入れる
![pic02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/2466d6ac-87f2-409b-80e0-ea91691860f0.png)
1. ターミナルを再起動
1. 再度Homebrewをインストール
```zsh:zsh
$ brew -v
# 実行結果：Homebrew 3.5.2
```
と無事インストール完了！(^▽^)!

#### 【別解】こんな方法あったのかぁ
調べれば、いろいろ情報は出てきまして
[【MacBook】M1対応したHomebrewをインストールしてみた](https://www.teamxeppet.com/macbook-m1-homebrew-install/)
というのもございました。これなら問題なくM1でもいけるようです。ご興味ある方はお試しあれ。

## 気を取り直してPythonインストール
```zsh:zsh
$ brew install python3 #実行結果：OK
$ python3
#出力結果： [Clang 13.1.6 (clang-1316.0.21.2)] on darwin
#出力結果： Type "help", "copyright", "credits" or "license" for more information.
>>> 
```
無事、Python3も環境を整えることができました。

## まとめ
そうじゃなくてこうしてみれば？っていうご意見などございましたら諸先輩方からのお知恵募集しております。
どうぞよろしくお願いします（^▽^）
【Core Web Vitals】LCP施策まとめ


# LCPとは
LCPとは、ユーザーに優れたユーザーエクスペリエンスを実現するための核になる、Core Web Vitals(コアウェブバイタル)の３指標の一つです。
Largest Contentful Paintの略で「ページの表示速度」や「読み込み時間」を示す指標です。
直訳すると「最大コンテンツの描画」となり、正確にはそのページにおける最もサイズの大きなコンテンツの読み込みにかかる時間のことです。
2.5秒以内であれば良好、4.0秒以上だと不良と評価され、その間は改善の必要性ありと判断されます。

## LCP測定方法
1. DeepCrawl
1. [PageSpeed Insights](https://pagespeed.web.dev/?utm_source=psi&utm_medium=redirect&hl=ja)
1. Google Search Console
1. Web Vitals
1. Lighthouse

## LCPスコアが低下する原因とそれぞれの施策

### 1.サーバー応答時間が長い
ブラウザがサーバーからコンテンツを受信するのに、時間がかかればかかるほど、
レンダリング（受け取ったデータの描画）する時間がかかってしまいます。
サーバーの応答速度はTTFB（サーバーの初期応答時間）という指標で表され、このTTFBの遅延がLCPの低下につながります。
##### 施策
* サーバーを最適化
* ユーザーから地理的に近いCDNを活用する
* キャッシュの活用
* サードパーティの接続時間を早める

<br>

### 2.JavaScriptとCSSのレンダリングブロック
サイトを読み込む際、サーバーからレスポンスを受けたら処理が開始され、そのレスポンスの中身のHTML、CSS、JavaScriptのコードをどのようにレンダリングします。
その際、JavaScriptやCSSの処理に時間がかかるため、不要なJavaScriptやCSSが多いとLCPの低下につながります。
##### 施策
* コード内のスペースやコメント削除によるJavaScriptやCSSの最少化
* 不要なJavaScriptやCSSファイルの削除
* 初期の読み込みで不要なものは非同期で読み込む
* JavaScriptの調整

<br>

### 3.リソースの読み込み時間が遅い
多くの場合、読み込み速度に影響を与えるのが画像です。
`<img>`、要素内の`<svg><image></image></svg>`、`<video>`、`url() 関数`を介して読み込まれた背景画像が含まれている要素、テキストノードやインラインレベルのテキスト要素を含むタグ以外の文字データなどのリソースが膨大にあるとLCPの低下につながります。
##### 施策
* 画像の最適化と圧縮
* 不要な画像を減らす
* 重要なリソースをプリロード
* テキストファイルの圧縮
* Adaptive servingを活用する
* Service Workerを使ったキャッシュ利用

<br>

### 4.クライアント側のレンダリングが遅い
クライアント側のレンダリング速度の改善には、以下のような施策をおこないます。
##### 施策
* JavaScriptの最小化
* JavaScriptの非同期化
* サーバーサイドレンダリングを使用する

<br>

**参考**
https://gmotech.jp/semlabo/seo/blog/corewebvitals_lcp/
https://growthseed.jp/experts/seo/optimize-lcp/
https://innova-jp.com/core-web-vitals-lcp/
Laravel 画像のプレビュー表示

# 概要
<!-- 発端や概要を記載 -->
前回（[Laravel UI登録画面で画像保存処理を実装](https://qiita.com/homifu/items/5b94da256b7d1a4f5417)）からの続きです。画像を選んだときにプレビューを表示させる機能です。
![スクリーンショット 2022-06-26 12.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724488/3604e162-877f-afc7-5931-6c4e6208b34b.png)


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [コントローラーの編集](#Chapter1)
1. [登録画面（View）の編集](#Chapter2)
1. [JS読み込み部分の追記](#Chapter3)
1. [javascriptをViewに追記](#Chapter4)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# コントローラーの編集
strage/app/public/imgにprofile.jpgを保存して、コントローラーで画像が保存されなかったらprofile.jpgを保存するようにさせる。
```PHP:RegisterController.php
protected function create(array $data)
    {
        if (isset($data['icon_image_path'])) {
            $icon_image_path = $data['icon_image_path']->store('img', 'public');
        } else {
            $icon_image_path = "img/profile.jpg"; // nullからimg/profile.jpgに変更
        }
```

<a id="#Chapter2"></a>
# 登録画面（View）の編集
```PHP:register.blade.php
<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data">
                        @csrf
                        {{-- アイコン画像プレビュー表示 --}}
                        <div class="text-center">
                            <img id="icon_img_prv" class="img-thumbnail h-25 w-25 mb-3"
                                src="{{ asset('/storage/img/profile.jpg') }}">
                        </div>
                        {{-- アイコン画像 --}}
                        <div class="row mb-3">
                            <label for="icon" class="col-md-4 col-form-label text-md-end">{{ __('アイコン') }}</label>
                            <div class="col-md-6">
                                <input id="icon" type="file" class="form-control" accept="image/*"
                                    name="icon_image_path" onchange="setImage">
                            </div>
                        </div>
```

<a id="#Chapter3"></a>
# JS読み込み部分の追記
〜3.3.1.min.jsをJS記載部分に追加する。
```PHP:layouts/app.blade.php
<!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
```

<a id="#Chapter4"></a>
# javascriptをViewに追記
```PHP:register.blade.php
<script>
    // アイコン画像プレビュー処理
    // 画像が選択される度に、この中の処理が走る
    $('#icon').on('change', function (ev) {
        // このFileReaderが画像を読み込む上で大切
        const reader = new FileReader();
        // ファイル名を取得
        const fileName = ev.target.files[0].name;
        // 画像が読み込まれた時の動作を記述
        reader.onload = function (ev) {
            $('#icon_img_prv').attr('src', ev.target.result).css('width', '150px').css('height', '150px');
        }
        reader.readAsDataURL(this.files[0]);
    })
</script>
```
今回はこれで以上です。画像ファイルを選択したときにプレビューが表示されます。
Chrome拡張機能さわってみた

Chromeの拡張機能の開発が、そこまでハードルが高いものではないことを知ったのでいじってみました

https://github.com/GoogleChrome/chrome-extensions-samples

上にサンプルがあるので、こちらを参考にしました。

# ファイル構成
2つのファイルで構成できます。
* manifest.json : 拡張機能についての定義ファイル
* やりたいことのプログラムファイル : jsやhtml etc...

# API
https://developer.chrome.com/docs/extensions/reference/

上から、APIを確認できます。
MV2(Manifest V2)のものもあったりして、利用できないものもあるので注意が必要です。

# 試してみた
### コード
```json:manifest.json
{
	"name": "apa",
	"manifest_version": 3,
	"version": "1.0",
	"permissions": ["activeTab","scripting","tabs"],
	"background": {
		"service_worker": "apa.js"
	},
	"action": {
        "default_title": "apa"
    }
}
```
`manifest_version`は、最新の３を記述。ここで、MV2(Manifest V2)を使用するのであれば、別を記述すれば良いはず（3で良い）。
`permissions`は、APIを使う際に必要なものを記述します。

```js:apa.js
var apa = (function(){
	alert("count up apa~");
});

var cnt = 0;

chrome.action.onClicked.addListener((tab) => {
    console.info(tab);
	chrome.scripting.executeScript({
		target: { tabId: tab.id },
		function: apa
	},
    ()=>{
        console.info("conosole print apa~");
    });

    cnt++;
    chrome.action.setBadgeText({ text: String(cnt) });
    chrome.action.setBadgeBackgroundColor({
        color: '#FFC0CB'
    });
});
```
内容は、検索バー横の拡張機能アイコンをクリックすると、アイコンのバッチがカウントアップしていくものです。

### 拡張機能登録
Chrome設定 > 拡張機能 > ディベロッパーモードオン > パッケージ化されていない拡張機能を読み込む
から、準備したディレクトリをアップする。

![スクリーンショット 2022-06-26 12.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294183/71b5af46-22b9-6a5e-3010-7af7599a68d2.png)


### 動作
クリック前
![スクリーンショット 2022-06-26 12.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294183/fa7bb12a-745c-b104-9900-5d428d19cccc.png)

クリック後
![スクリーンショット 2022-06-26 12.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294183/c847e199-ae5a-7fe6-7f53-accaeeb679a0.png)

## つまずいたこと
### `Unchecked runtime.lastError: Cannot access a chrome:// URL`
拡張機能の一覧ページ`chrome://extensions`で、実行するとエラーが出るようです。
コードに不備があるかと思ってしまいましたが、↑以外のページであれば問題ないです。

https://zenn.dev/akinatty/scraps/6527e9859258f8

### console.logが出ない
Chromeの検証ツールで、ログが出るかと思っていたが、拡張機能のログはそこには出ないです。
登録した拡張機能の詳細 > ビューを検証 > Service Worker で起動する検証ツールでログが確認できます。


# 感想
コード修正後に更新するだけで動作確認できるので、ローカルでも開発速度が落ちなくてスゴいと感じました。
触ってみた程度でしたが想像以上に手軽に開発できたので、何か作りたいものが見つかれば公開までのレベルで開発してみたいです。
herokuにデプロイできない

久しぶりの投稿です。宜しくお願いします。
別にサボっていたわけではないんです。ただずっと一つの問題に立ち向かっていて、ようやく解決の糸口を掴んだので記事を書くことにしました。（まだ解決はしてない）

どんな問題かというと、題名にある通り、「herokuにデプロイできない」という内容です。

実際に行ったもは、以下です。
```ruby:terminarl
git push heroku master
```

エラーは以下です。
```ruby:terminarl
remote:        Compilation failed:
remote:        error Command "webpack" not found.
```

これはつまり「webpackがありませんよ」ということのようだったので、存在を確かめるべく、以下を実行。
```ruby:terminarl
npx webpack -v
```
すると、
```ruby:terminal
webpack: 5.73.0
webpack-cli: 4.10.0
webpack-dev-server 4.9.2
```
なんとしっかり存在している。。。ここで一生頭を悩ませていました。

調べていると、npmで管理されているpackage.jsonに問題があるようでした。
例えば、yarn コマンドを実行すると、以下エラーが出ました。
```ruby:terminal
../../package.json: No license field
```
最初は、license　指定がされていないせいでこのエラーが出ているんだ、と思いました。
実際にファイルを確認してみると、
```ruby:package.json
{
  "name": "hello_app",
  **"license": "UNLICENSED",**
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "turbolinks": "^5.2.0"
  }
```
ちゃんとある。。。これでもずっと頭を悩ませました。
ふと、「../../package.json」これをクリックできることに気が付き、中を見てみると、
```ruby:package.json
{
  "dependencies": {
    "node-cleanup": "^2.1.2",
    "tmp": "^0.0.33"
  }
}
```
内容が違う。。。ということに気が付きました。つまり、このディレクトリで認識しているファイルと、
自分が使いたいファイルが違う、ということに気が付きました。
確かによくみると、ディレクトリの構成がおかしい、、、全く気がつかなったです。

ただ、これをどうやって自分が使いたいディレクトリにするのかわからず調査中、という状況です。

今日は溜まった分長くなりましたが、解決策がわかる方がいたら教えてください。。。
プログラマの数学を読んで

[プログラマの数学](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E6%95%B0%E5%AD%A6-%E7%AC%AC2%E7%89%88-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B079JLW5YN/ref=sr_1_1?keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E+%E6%95%B0%E5%AD%A6&qid=1654435417&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%80%80%E3%81%99%2Caps%2C193&sr=8-1)を読んで、要点を整理
自分の解釈も織り交ぜているのでそれを踏まえてもらえると
（少しでも気になったら読んでみることをオススメします）

# プログラマにとっての数学
- 日々のプログラミングをより良く理解するため
    - 数学を学ぶことで、プログラミングの土台を固めることに繋がる
        - プログラミング < コンピュータ科学 < 数学
    - 普段のプログラミングに、数学的な考え方は取り込める
      - 問題の構造を見抜き、それをシンプルに表現する
        - 高度な数学の知識を必要とすることはそれ程多くない
            - 専門分野によると思うけど

# 問題の構造を見抜いて一般化する
- 基本的な流れ
    - 問題を単純化して（簡易なケースで）試してみる
    - そこから構造について仮説を立てる
    - その仮説が正しいことを証明する
    - ※ 具体的なテクニックは後述
- 結果が一般化される（式で表現される）ことで、
  - 他の問題にも適用できるようになる
    - 単調な繰り返し作業はコンピュータに任せられる
        - 直接には数えられないほど多くのものを数え上げれる等

# 具体的なテクニック
上記過程で使える考え方について

## 問題空間を把握する
- 「難しい」と感じる問題にぶつかったら、まずその問題空間の広さを理解する
    - その空間が広ければ広いほど、解答するのが難しくなる
- 見つけたい解答がそもそも存在しているのか
    - 例えば、「計算不可能な問題」について
        - コンピュータで解ける問題は無限にあるが、その無限はカウンタブルに限られる
            - 全ての問題の集合は、カウンタブルよりももっと大きな無限になる
- その次に探索すべき問題空間を狭められるか
    - 探すのに役立つ前提条件はあるか
    - 例えば、散らかった部屋で本を探す場合、
        - 本棚の中にある
        - 本棚は一列に並んでいる

## 大きな問題は、小さなまとまりに分けて解く
- 様々な問題の切り分け方がある
  - 問題の構造を捉えるために、問題の分類を試みる
- 「true/false」による2分割
  - ある条件が「成り立つ場合」と「成り立たない場合」
- 「剰余」によるグルーピング
  - 余りが何になるかで、どのグループに入るかが決まる
    - 偶数は２で割ると余りが０になる整数
  - 剰余を上手く使うと、バラバラに見えるものを同一し分類できる
    - 対象が無数にある問題に周期性を見つけ出すと、剰余を使って少ない個数の問題に落とし込める
        - 10^1億日後の曜日
          - 実用的なパリティチェックにも使われている
- 「再帰」による、同形の小問題への分割
    - 小さな規模なら解けるが、大きな規模になると解けない場合、その問題を、一回り小さい問題を使って表現する
        - 一回り小さい問題は「既に解けたもの」として扱う
        - 有名な問題として、ハノイの塔
    - 収束の方向性としては、大きいものから小さいものへ
- 「帰納」による、同形の小問題への分割
    - 数学的帰納法（基数と帰納の2ステップ）を証明することで、無数の証明の代わりになる
        - 大きな問題を同形のn個の小問題に分割しているイメージ
    - 収束の方向性としては、小さいものから大きいものへ

## ファンタジーの法則
- 別世界と行き来することで問題を解決する
    - 「こちらの世界」で解けない問題があったら、
    - それを「別世界」に持っていき、そこで解き、
    - 得られた答えを「こちらの世界」に持って来る
- 例えば、「論理の世界」について
    - 自然言語の曖昧さを避けるための道具として、論理式、真理値表、ベン図、カルノー図等がある
        - 特にカルノー図は、論理式をシンプルな形に変換できて便利
    - 現実世界において、一見「複雑なルール」を、
    - 「論理の世界」で「論理式」として扱い、論理式・カルノー図の変換によって「単純化した論理式」にして、
    - 現実世界において、「単純なルール」として利用する
- どれだけの世界を持っているかが重要
    - その分問題を解く際の手がかりになる
    - 例えば、「指数の世界」を持っていれば、大規模な問題を取り扱いやすい形に変換できる
        - 例えば、バイナリサーチによって、大量の情報に対して高速に検索を行える

# 終わりに
普遍的な話としては、問題理解に尽きるのだと思う。
問題理解できたのであれば、式として表現できる。
様々な問題に取り組む際、それをある種の式で定義して、パラメータ最適化するという流れを意識していきたい。
しばらく使っていなかったNodeをアップデートする

過去にダウンロードしていたNode.jsを現在の安定版に更新しました。
いずれまた使うのでメモしておきます。




## homebrewのバージョンアップ
    % brew update

    % brew -v
    Homebrew 3.5.2
    Homebrew/homebrew-core (git revision e95d9224d91; last commit 2022-06-26)
    Homebrew/homebrew-cask (git revision 9713bf8928; last commit 2022-06-25)

homebrewを最新版に更新完了


## nodebrewのバージョンアップ
    % brew upgrade nodebrew

    % nodebrew -v
    nodebrew 1.2.0

nodebrewも最新版に更新完了


## node.jsのバージョンアップ（推奨版に）
現在の推奨版がv16.15.1なのでそれにバージョンアップする

    % nodebrew install-binary v16.15.1
    Fetching: https://nodejs.org/dist/v16.15.1/node-v16.15.1-darwin-x64.tar.gz
    Warning: Failed to create the file                                             
    Warning: /Users/username/.nodebrew/src/v16.15.1/node-v16.15.1-darwin-x64.tar.gz
    Warning: : No such file or directory
    curl: (23) Failure writing output to destination

ディレクトリ無しのエラーが発生。
何らかの原因でディレクトリを消してしまったのかと思いますので、新しくディレクトリを作成します。

    % mkdir -p ~/.nodebrew/src

ディレクトリ作成後、再度インストールを実行

    % nodebrew install-binary v16.15.1
    Fetching: https://nodejs.org/dist/v16.15.1/node-v16.15.1-darwin-x64.tar.gz
    ######################################################################### 100.0%
    Installed successfully

node.jsの推奨版のインストールが完了

## 使用設定

    % nodebrew use v16.15.1
    use v16.15.1

    % nodebrew ls
    v16.15.1

nodeのバージョンを確認

    % node -v
    v16.15.1

全ての設定が完了


### 参考サイト
[Node.jsのバージョンアップ for Mac](https://qiita.com/Hide-Zaemon/items/cbb4497237843a729994)
入試問題の「 13 (number)」を 調べてみた。

オリジナル
・The sum and the difference of 2 consecutive squares: 13 = (2＾2 + 3＾2) = (7＾2 - 6＾2).

https://en.wikipedia.org/wiki/13_(number)

https://ja.wikipedia.org/wiki/13

# おすすすめの過去問があれば教えて下さい。

# 参考

数字の13は、におい?ますね。＜

https://qiita.com/mrrclb48z/items/7c16cb5141a495bc5307

△ABCの辺の長さ15,14,13　＜

https://qiita.com/mrrclb48z/items/3472af702bbb615606ad

# 補足

「鎌倉殿の？人」というのもありました。