OmniAICreator/Qiita-1.07M huggingface dataset:
たった3手順でとげとげボールをつくる

# はじめに
今回はBlenderでとげとげボールを作っていきます．モーニングスターを作りたい人，ウイルスを作りたい人などなど，ぜひみていってください．

# 目次
1. ICO球を作る
1. とげを作る
1. とげをつける

# ICO球を作る
Shift + A で 新規オブジェクト作成し，「メッシュ」→「ICO球」で作成する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/f22866c1-f750-409e-2c4d-d3f684441e59.png)

今回は，値を以下のようにする．
細分化を大きくするとより細かくなり，円に近づく．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/22146efc-35be-b25f-37c1-aae8de750c1a.png)

操作しやすいように見えないようにしておく．

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/dd863db8-0f07-b3c5-b848-f7aa6571c92f.png) |
|:-:|
|  ↓|
|  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/e70b5f09-08b1-e72d-1d48-ca00d6988156.png) |

                    


# とげを作る
Shift + A →「メッシュ」→「円柱」で円柱を作成する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/5bb07bc6-6377-d7b8-ebd7-d3e718817863.png)

値を以下のように頂点数を少なくすると，円柱角張るようになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/b427df70-f59f-3caa-a50b-7bbe8f28c393.png)

# とげをつける
ICO球をクッリクした後，Sifttを押しながら円錐をクリックする．
右クリックを押し，「ペアレント」→「オブジェクト」を押す.
これで円錐とICO球が親子関係となります．→シーンコレクションでは，ICO球の中に円錐がいます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/c3a47da9-7be8-dc9d-b0a2-d77cb75282e8.png)

次に，ICO球をクリックした後，オブジェクトプロパティを開きます（オレンジ色の四角を押す）．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/8766fa98-a06d-bdd5-25ef-89db0576274a.png)

そこのインスタンス化を開き，面を選択する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/b6610262-584a-9bfe-f52d-662513e49672.png)

すると，下の図のようにICO球の各面に円錐がつきます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/adfb524b-49d7-6d13-238b-d524b20e83db.png)

あとは，シーンコレクションから円錐をクリックし，Sでいい感じに大きさ調整してください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/48696c5c-0f50-99e8-d3b7-6b6e34a4d553.png)

最後にICO球を選択し，右クリック→スムーズシェードを選択すると，とげとげボールの完成です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/7e160242-f8c7-9b08-21b8-cc293ddeacb5.png)


# おわりに
今回はとげとげボールを作りました．親子関係にして，各面になにかをつけるというものは他にも応用できると思うので，ぜひ覚えておいてください．それではみなさん，よいエンジニアライフを〜👋
【Laravel】プロジェクトにenvファイルが何故か存在しなくて見つからない場合の対処方法

# envファイルが無い！存在しない！
```
作成日: 20240625
最終更新日: 20240625
```

## はじめに
なぜか自分が遭遇した不具合...<br>

## 目次

- [envファイルが無い！存在しない！](#envファイルが無い存在しない)
  - [はじめに](#はじめに)
  - [目次](#目次)
- [Laravelプロジェクトにenvファイルがない場合](#laravelプロジェクトにenvファイルがない場合)
  - [隠しファイルが非表示になっている](#隠しファイルが非表示になっている)
  - [envファイルを手動で作成する](#envファイルを手動で作成する)
- [あとがき](#あとがき)


# Laravelプロジェクトにenvファイルがない場合

## 隠しファイルが非表示になっている
ありえないと思うが一応可能性として挙げる<br>

## envファイルを手動で作成する
1. 下記URLから.env.exampleをダウンロードする<br>
https://github.com/laravel/laravel/blob/master/.env.example
1. プロジェクト直下に移動して、名前を.envに変更する
1. 「php artisan key:generate」を実行してAPP_KEYを生成する
    ``` powershell
    php artisan key:generate
    ```
1. 「php artisan config:cache」でenvのキャッシュをクリア
    ``` powershell
    php artisan key:generate
    ```

# あとがき
なぜenvファイルが無かったのだろうか？git cloneしてきたとかじゃなくて直で作ったのになあ(操作ミスで消しちゃった？)
調べたときに同様の現象が発生している人はいたけど、初学者が1サイト見ただけで解決できるような情報残してるとこなかったから記事にしてみました。

よかったらTwitterフォローしてね！
フォロバしまっす！

https://twitter.com/rioLi0N
FlutterでAndroidビルド時に「your project requires a newer version of the kotlin gradle plugin.」というエラーになる

## 自分の環境
- macOS Sonoma 14.4
- Flutter 3.22

## 経緯
AndroidのエミュレータでFlutterアプリのデバッグのためビルドしたところ、「your project requires a newer version of the kotlin gradle plugin.」というエラーが出てしまった。
調べても対応方法で一致するものを見つけられなかったので、備忘録として残します。

## 原因
要求するKotlinおよびGradleのバージョンが不一致であること。
私の場合はGradleは問題なく、Kotlinが原因だったのでKotlinのバージョンアップで対応しました。

## よく見かける対処法
/android/build.gradle のbuildscriptを編集するというもの。
しかし3.16以降だとこの記載が消えたらしい。（なぜ）
そのためこの方法を諦めました。

![スクリーンショット 2024-06-26 5.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839842/0a3bbca0-bc2d-1ad5-9020-678a6794c3be.png)

## 実際にやったこと
/android/setting.gradle を変更しました。
以下のようにpluginsの一番最後にkotlinのバージョンを指定しました。（もともと2行だったので追加してます）

![スクリーンショット 2024-06-26 5.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839842/7d821289-0b97-4376-6957-06691928d676.png)

ペースト用：
```
id "org.jetbrains.kotlin.android" version "1.9.10" apply false
```

Kotlinのバージョンは以下から確認できます。
https://kotlinlang.org/docs/releases.html#release-details

これでビルドが通るようになりました。
解答用紙 自動作成アプリ「ASaGe」の紹介

解答用紙を自動で作成する Windows アプリケーション「ASaGe」をリリースしました。

https://shared-idea.net/ASaGe/

## 概要
中学校・高校でよく使用される、問題用紙から独立しているタイプの解答用紙を作成できます。
その他、模範解答の入力や、プリントアウト、PDF出力にも対応しています。

## 特徴
### シンプルな操作
まず、ASaGe の操作パネルをお見せします。

![mainpanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080922/9e2c49df-4726-06c8-ee34-fecb3d6eb8b6.png)

たったこれだけです。
このUIパーツの少なさから分かる通り、ASaGe の最大の特徴は、何といっても「シンプルな操作」です。

基本的な操作は、

1. 解答欄の大きさを指定する
2. 追加ボタンを押す

の2手順のみ。
これを繰り返すだけで、標準的な解答用紙は完成してしまいます。

![introduction.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080922/f50e1fa5-2eed-b3b9-b599-77bb267054ff.gif)


従来、解答用紙の作成には、Excel が使用されてきましたが、

- 罫線を引く
- 問題番号を振る
- 用紙サイズに合わせて、行・列幅の調節

というステップを、解答用紙が完成するまで何度も繰り返す必要がありました。

また、表計算ソフトという特性上、

- 行幅・列幅を変更すると、シート全体に影響する
- 途中に解答欄を挿入すると、それ以降の解答欄の表示がすべて崩れる

等の理由で、レイアウトの変更が容易に行えず、手作業で微調整をする必要があります。

ASaGe を使用することで、これらの煩雑な操作が一切不要になります。

### プレビュー表示と完成品との差異がない
Excel でよく聞く厄介事の一つに、「画面上での見た目と、プリントアウトした完成品の見た目が異なる」というものがあります。
ASaGe では、出力時に表示物をキャプチャし、その画像を参照してプリントアウトを行うため、画面表示と完成品との間にずれが起こることはありません。

## 技術スタック
フレームワーク：.Net Maui + MVVM Toolkit
プログラミング言語：C# + Xaml
UIコンポーネント：Syncfusion .Net Maui

## 仕組みの概要
MVVM の区分にのっとって、大まかな役割を紹介します。
### バックエンド（Model）
設定値を保持する役割を担っています。

大問、小問、枝問 という 3 階層に対応しており、そのすべてが、解答用紙をルートとする木構造でつながっています。
1⃣ の中に (1) (2) が入っていて、(1) の中に a b が入っている、という感じです。

### バックエンド（ViewModel）
View から受け取った入力値を Model に渡す役割と、
Model で保持している値を、View 用に加工する役割を担っています。

Model には、状態の復元に必要な最低限の情報だけが保持されているので、実際の表示に必要な演算は、ここで行っています。
（500px で表示する、2 個目の問題だから問題番号は 2⃣ だ 等）

### フロントエンド（View）
View から受け取った値を表示する役割と、ユーザーの入力を ViewModel に渡す役割を担っています。

解答欄の罫線の描画は、直線を組み合わせることで実現しています。

## 縦書きについて
ASaGe は、国語科での使用も想定しており、縦書きにも対応しています。
ですが、使用しているフレームワークやツールが縦書きに対応していない場面が多々ありました。
そのため、縦書きに関しては、常にアドホックな対応が必要になりました。
例えば、縦書き時のフォントは、左に90°倒した魔改造フォントを使用し、文章全体を右に90°回転させることで、縦書きに見せています。

![font.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080922/1d444dab-66fa-f99d-6fb1-de8ea19745ef.png)

右から左への書字方向は対応されているんですが、縦書きには当分対応はないでしょうね…

## 今後の機能追加予定
今後も定期的にアップデートを続ける予定です。

- [採点斬り 2021ver](https://qiita.com/phys-ken/items/4fac021504d7fe6b98b2) との連携機能
- 模範解答の文字数に応じた、サイズの自動調整機能
- ショートカットキー

以上の機能を、Pro 版に実装予定です。
簡単ないいねカウンターをつくりました

# はじめに
ずっと作りたかった「無限いいねボタン」の一例を作れたので紹介します。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="RwmJMEw" data-pen-title="simple likes counter" data-user="Kohki-Takatama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Kohki-Takatama/pen/RwmJMEw">
  simple likes counter</a> by Kohki_Takatama (<a href="https://codepen.io/Kohki-Takatama">@Kohki-Takatama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 参考

基本的に、以下のコードを参考にしています。

https://qiita.com/nagomi-753/items/7ff34b2bf29770f90ea3

# 変更点

変更後のコードは以下のリポジトリ。

https://github.com/Kohki-Takatama/simple_likes_counter

:::note
**`hover`から`active`に変更**
`hover`したときではなく、クリックした時（`active`）にツールチップを表示するため
:::
:::note
**`opacity`を変更**
`hover`の場合は`opacity`が`0`から`1`になることでフェードイン表示される。
今回はクリックすぐに表示をしたいため、デフォルトで`opacity: 1`に設定
:::
:::note
**クリックを離した後、フェードアウト**
`transition: visibility 0s 2s;`により、`2s`遅れて`visibility: hidden`になります。
その間に、以下のアニメーションによりフェードアウトします。
```css
animation: fadeOut 0.5s forwards;

@keyframes fadeOut {
  to {
    opacity: 0;
  }
}
```
:::
:::note alert
**`-webkit-transition`から`transition`に変更**
`-webkit-transition`は非推奨のため
:::

# おわりに

以上、簡素ではありますが「連打できるいいね機能」の雛形でした。

Reactで`useState`使うとか、絵文字から図形にする・クリックエフェクト等ボタンとしてリッチにするとか、夢が広がります。
改善案等あればぜひお待ちしております。
Athenaでdouble型(実数型)を取得したら指数表記になってたので変換した話

# はじめに
LambdaとAthenaを使ってデータを取得、返却するプログラムを作りテストをしたところ「0.0003」などの小数が「3.0E-4」などの指数表記で帰ってきていました。
1つのLambdaで指定したテーブルの全列を取得できるような仕様にしており、特定の列をCASTするといったアプローチは取れなかったため指定されたテーブルのスキーマーをもとに取得列を動的に作成するLambdaを作成しました。

# 本題
```python:main.py

import json
import awswrangler as wr

DATABASE = 'database_name'
TABLE_NAME = 'table_name'
OUTPUT_LOCATION='s3://example'

    
def lambda_handler(event, context):
 
  try:

    # テーブルの列名、型を取得
    query = f"""
        select 
            * 
        from information_schema.columns 
        where LOWER(table_name) = LOWER('{TABLE_NAME}')
        ;
    """
    df = wr.athena.read_sql_query(sql=query, database=DATABASE, s3_output=OUTPUT_LOCATION)

    # 型がdoubleの時はdecimalにcastする(decimalにすると指数表記じゃなくなる)
    str_columns = ""
    for index, row in df.iterrows():
      str_columns += f"cast({row["column_name"]} as decimal(38,10)) as {row["column_name"]}" if row["data_type"] == "double" else row["column_name"]
      str_columns += ","
    str_columns = str_columns[:-1] # 最後のカンマを削除
    
    
    query = f"""
        select
        {str_columns}
      from {TABLE_NAME}
        ;
    """
    df = wr.athena.read_sql_query(sql=query, database=DATABASE, s3_output=OUTPUT_LOCATION)
    response = {"data":json.loads(df.to_json(orient='records'))}
    return {
      'statusCode':200,
      'body': json.dumps(response)
    }
    
  except Exception as e:
    print(e)
    return {
      'statusCode': 500,
      'body': json.dumps({ 'error': 'faild' }),
    }

```

# おわり
今回は全てのテーブルで同じように動作させるためにこのような手段を取りましたが本来はあまり使わなそうな手段だと思います。
ですが、同じような悩みがあるかたの参考にしていただければ嬉しいです。

そして、この記事を書きながら思いました。
修正前はboto3でathenaを実行して結果をそのまま出力していましたが、今回はawswranglerを使っているのでうまいこと変換してくれていないかと。
忘れていなければ確認してみようと思います。

# 追記
やはりawsranglerの場合0.003の形で表示されていました...
簡単なPythonのC++コード生成ツール #1

## code-generation

最近は生成AIでコード生成も簡単にできますが、特定のルールで多数の類似コードを作りたい時など、一般的なツールを使ったほうが良いこともあります。

code-generationはPythonのモジュールでC++コードを簡単に作ることができるので試してみました。

https://pypi.org/project/code-generation/

#### インストール

```console
$ pip install code-generation
```

#### ファイルの作成

```example.cpp```というファイルを作成

```python
from code_generation import code_generator
cpp = code_generator.CppFile('example.cpp')
```

#### 定数
`CppFile`は文字列型を受け取り、そのまま書き込むことができます。

```python
cpp('int n = 0;')
```
↓（作成されたコード）
```
int n = 0;
```

#### for文

`block`とwith文で書きます。with文の処理は中括弧の中に入ります。

```python
with cpp.block('for(int i=0; i<n; ++i)',''):
    cpp('sum += i;')
```
↓
```c++
for(int i=0; i<n; ++i)
{
  sum += i;
}
```

#### while文

for文と同様に`block`とwith文で書くことができます。

```python
with cpp.block('while(i<n)',''):
    cpp('i++;')
```
↓
```c++
while(i<n)
{
  i++;
}
```

#### 関数

`CppFunction`を使うことで関数を定義することができます。
`ret_type`は戻り値の型、`is_constexpr`はconstexpr関数かどうかを表します。また、`documentation`は関数についてのコメントを記載します。
また、関数内の処理は別に定義しておき、`implementation_handle`に入れます。ここでは`functionBody`としています。
関数の引数は、`add_argument`で指定します。
最後に`render_to_string`でファイルに書き込みます。

```python
from code_generation import code_generator
from code_generation.cpp_function import CppFunction

cpp = code_generator.CppFile('example.cpp')

def functionBody(self, cpp):
    cpp('return n < 1 ? 1 : (n * factorial(n-1));')

factorial_function = CppFunction(name='factorial',
                                 ret_type='int',
                                 is_constexpr=True,
                                 implementation_handle=functionBody,
                                 documentation='/// calculates and returns the factorial of \p n.')

factorial_function.add_argument('int n')
factorial_function.render_to_string(cpp)
```
↓
```c++
/// calculates and returns the factorial of \p n.
constexpr int factorial(int n)
{
  return n < 1 ? 1 : (n * factorial(n-1));
}
```

#### 配列

配列は`CppArray`を使って書くこともできます。
`name`は変数名、`type`は型、`array_size`は初期値のサイズです。
その他にも`is_static`,`is_const`などを指定できます。
要素は`items`によってstr型のリストで指定します。
最後に`render_to_string`でファイルに書き込みます。

```python
from code_generation import code_generator
from code_generation.cpp_array import CppArray

cpp = code_generator.CppFile('example.cpp')

cpp_array = CppArray(name='arr',
                     type='int',
                     is_static=False,
                     is_const=False,
                     is_class_member=False,
                     array_size=3)
cpp_array.items = ['1', '2', '3']
cpp_array.render_to_string(cpp)
```
↓
```c++
int arr[3] = {1, 2, 3};
```

#### クラス、構造体

クラスや構造体もwith文を使うことで書くことができます。
with文ではcpp.blockの第二引数に指定した文字列が、中括弧の終わりに付きます。
先程は空文字でしたが、クラスでは`;`にしておきます。

```python
with cpp.block('class A', ';'):
    cpp.label('public')
    cpp('int member1;')
    cpp('double member2;')
```
↓
```cpp
class A
{
public:
  int member1;
  double member2;
};
```

`code_generation`では、以上のようにPythonでC++コードを作成できます。
Pythonでループ処理を掛けるなど、動的に類似コードを生成することもできるので、色々と使い道があると思います。
ITパスポート 通信プロトコル

・通信プロトコル
コンピュータ同士がネットワークを通して通信するときに使う規約（約束事）

・TCP/IP
インターネットで利用されているプロトコル

・アプリケーション層のプロトコル
HTTP
Webページの送受信プロトコル
SMTP
電子メールの送信・配送プロトコル
POP
電子メールの受信プロトコル（端末で管理）
IMAP
電子メールの受信プロトコル（サーバで管理）
NTP
PCなどの時刻合わせプロトコル
FTP
ファイル転送のプロトコル
・MIME
日本語や音声、画像などのマルチメディア情報も取り扱えるようにした電子メールの規格

・OSI基本参照モデル
異機種間でデータ通信ができるように必要な機能を７階層にわけ標準化したモデル
アプリケーション層、プレゼンテーション層、セション層、トランスポート層、ネットワーク層、データリンク層、物理層
csvのヘッダーを書き換えるシェルスクリプト

# はじめに
csvを出力したのちに、**「ヘッダーを変更したいなぁ」** と思ったことはありますでしょうか？
そんな要望に応えて、シェルで簡単にヘッダーを変更できるスクリプトを実装しました。

その内容をアウトプットいたします。

# 実装
```sh
#!/bin/bash

INPUT_FILE="test.csv"
OUTPUT_FILE="output.csv"

keys=("abc" "def" "ghi")
values=("ABC" "DEF" "GHI")

TEMP_HEADER_FILE="temp_header.csv"

# 1行目（ヘッダー）を取得し、一時ファイルに保存
head -n 1 "$INPUT_FILE" > "$TEMP_HEADER_FILE"

HEADER=$(cat "$TEMP_HEADER_FILE")

# ヘッダーを変換ルールに基づき置換する
for i in "${!keys[@]}"; do
    HEADER=$(echo "$HEADER" | sed "s/${keys[$i]}/${values[$i]}/g")
done

# 修正後のヘッダーを書き込む
echo "$HEADER" > "$OUTPUT_FILE"

# ヘッダーを除いたデータ部分を追加
tail -n +2 "$INPUT_FILE" >> "$OUTPUT_FILE"

# 一時ファイルを削除
rm "$TEMP_HEADER_FILE"

echo "ヘッダーを修正したCSVファイルを $OUTPUT_FILE に出力しました。"
```

# 解説
まずはヘッダーを読み込み、変数`HEADER`に入れます。
今回のメインは、以下の記載です。

```sh
for i in "${!keys[@]}"; do
    HEADER=$(echo "$HEADER" | sed "s/${keys[$i]}/${values[$i]}/g")
done
```

`keys`と`values`を用意しているので、ヘッダーの文字列で一致する文字列を置換することをしています。
ここで、該当の文字列が存在すれば、一気に変換をしています。

# まとめ
文字列を変換するのに、`sed`コマンドを使用しました。
他にもシェルコマンドはたくさんあるので、色々と勉強していきます。

最後までご覧いただき、ありがとうございました。
ラズパイでpygameを使ったアプリでウィンドウにフォーカスを当たっていなくてもジョイスティックの入力を取得したい

# 結 論
xvfbを使って、仮想ディスプレイを作成して起動しましょう！

# 検証した環境
ラズパイ4Bで確認しました。
```bash
$ uname -a
Linux raspberrypi 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

# 背 景

- ラズパイでGPIOに色んなでデバイスを接続して、ジョイスティックから操作したい
- イベント処理やジョイスティック入力が機能として入っているので、[pygame](https://www.pygame.org/news)を選定
- ラズパイはディスプレイに接続していない
    - デバッグ用にGUIを利用することがあるが、基本的にはディスプレイなしで実行したい
# 問題点
- pygameの仕様上、**ウィンドウにフォーカスが当たっていないと、ジョイスティックの入力が取得できない。**
    - pygameのイベントの「pygame.JOYBUTTONDOWN」を来ない
    - ジョイスティックのボタンを押しながら、get_buttonしても入力が取得できない
    - よって、HDMIでディスプレイに接続するか、VNCで入らないと基本的にジョイスティックが使えない

# 解決方法
-  xvfbという、仮想ディスプレイを作成してスクリプトを起動する
-  xvfbとは？
    - 画面出力を表示せずに、すべてのグラフィック操作を仮想メモリ内で行うプログラム
    - X virtual framebufferの略
    - ソースは[wikipedia](https://en.wikipedia.org/wiki/Xvfb) 

# 具体的な解決方法

xvfbのインストール

```bash
$ sudo apt update
$ sudo apt install xvfb
```

xvfbでpythonを起動
```bash
$ xvfb -a python main.py
```

# おわりに
ラズパイ × pygameはおすすめです！
マネジメントコンソールでパスキー設定してみた ~JAWS-UG CLI専門支部と私~

# はじめに
本記事は　JAWS-UG IAM専門支部 #44L IAM要素解析: パスキー (MFA)に参加したレポートです
後半（きっと記事のほとんど）が作者とCLI支部との関わり(回顧録?ポエム?)的な内容となってしまうため、レポートだけ興味がある方は前半だけでも読んでいただければ幸いです。
(Qiitaが微妙ならnoteに移動するかもしれません)

# 参加の経緯
参加のモチベーションはこんな感じでした
- [connpassの勉強会告知](https://jawsug-cli-advanced.connpass.com/event/320710/)に記載の通り、AWS re:Inforce 2024で発表されたIAMのパスキー対応というのがどういったものか、手を動かしてみたい
- お昼時の勉強会なら参加できる
- 久しぶりに波田野さんとお話ししたい（オンラインですが）

# パスキーの使い道について
[AWS公式の記事](https://aws.amazon.com/jp/blogs/news/aws-adds-passkey-multi-factor-authentication-mfa-for-root-and-iam-users/)にもあるようにパスキーはパスワードの次の第２要素の認証として利用されます。
将来的にはパスワードに取って代わるものだとより便利になるよね（暗号化されていてもパスワードがインターネット上を通るよりもセキュアになる）という話もありました。

個人的には設定してみてパスキーが便利だなと思った理由を挙げると
- スマホに登録されている仮想MFAが増えてくると、いざ入力するときにどれだっけ？となってしまう
- スマホから離れていてもAWSマネコンにログインできる
  ポケモンスリープをやっており、夜間寝室にスマホを置いている状態でアクセスできるはめちゃ便利！（ちなみにアカウントを子供用にしてしまったため友達登録はできません、、、）

ちなみに、ハンズオンではiCloud Keychainでの例となっておりましたが、私は会社用MacでAppleIDを連携していないため、エラーとなりました。Google Chrome Plofileで設定しました

ぜひ、皆様もパスキーを利用して快適なAWSライフを！

# 久しぶりのCLI支部の参加について(ここから後半)
勉強会にて昼間の勉強会はコアな内容で開催されていると波田野さんがコメントされている通り、興味を持った分野について深掘りができます。またハンズオン形式なので実際にAWSに触れながら勉強できるのも有り難かったです。
一通りやった後、アンケートに答えると波田野さんからその場で拾ってもらえたこともとても嬉しかったです！
（アンケートって終わった後に書くケースが多く、アンケートから相互コミュニケーションができるのは貴重な経験でした。オンラインだとラジオでハガキが読まれたような感覚になりました。そういえば、CLI支部ではハンズオンの最後に自己紹介とハンズオン中のはまったポイントを発表していたので、同じ感じなのかなとも思いました）


久しぶりと書いたのは、CLI支部に初めて参加したのは#0だったのですが、自分の過去のテキストを見ると2014年7月22日となっていました。。。波田野さん凄すぎます。。。もうすぐで10年経つんですね！

私が社外で初めて登壇したのはCLI支部の#11で[OpsWorksをCLIで触ってみた](https://www.slideshare.net/slideshow/ops-works-aws-cli11/44162427)というネタでした。
[コワーキングスペース茅場町Co-Edo](https://coworking.tokyo.jp/)での勉強会の後に何度か飲みにいく機会もあり、社外の人とのつながりも楽しいなと初めて思った日が懐かしいです。

当時はまだ仕事でAWSをほとんど触っていなかったものの、興味があって2010年頃？から自分でAWSアカウントを契約し色触っていました（まだ持っている最初のアカウントにはまだap-northeast-1bがあった）。ただ本を読んでもよく分からない部分も多く、勉強会があったことに感謝しています（今も）

CLI支部に参加するようになり、その縁でJAWS DAYS 2015の時にIntel Edisonのハンズオンスタッフをやらせてもらいました。今思い返してもつよつよなエンジニアの方々の中に1人で参加したのは貴重な経験でした！

10年間に、オンプレミス案件のPMで徹夜が続いたり、AWS案件を経験したり、SREになり、結婚して育児に悪戦苦闘したり、、、と振り返れば、色々なことを経験している中で、波田野さんがずっと勉強会をされていることに感謝という言葉だけで言い表せられない、畏敬の念という表現になるかもしれません。

波田野さんのようなSamuraiやHEROに少しでも近づけるようにアウトプットし続けます

最後に、「IAM(ホントに)なんも分からん」



最後まで読んでいただいた皆様、ありがとうございました！！


追伸：CLI支部がいつの間にかCLI専門支部になっていたw
グラフデータを用いてニューラルネットワークを構築する

# 1. はじめに
概要だけ簡単に書きます。Pythonによる実際のモデル構築とかはChatGPTに聞けば勝手にやってもらえると思うので、どういうタスクに使えるのか？他モデルと比較した時の長所は？等、コンペでのモデル選択になるべく役立つような形で説明します。
# 2. グラフデータとは？
こちらの記事で超ざっくり説明してます。

https://qiita.com/iamtaro/items/a0bae824e1de9acc1a82

# 3. ニューラルネットワークとは？
ニューラルネットワーク（NN）とは、複数の人工ニューロンを層状に組み合わせてデータのパターンを学習し予測を行うアルゴリズムの総称です。画像処理で使う畳み込みNN、グラフデータを処理するグラフNN、時系列データや言語データなど順番が大事なデータを処理するリカレントNN等、様々なものがあります。入力データの種類に応じて呼び名が変化しています。本記事ではグラフデータを扱うのでグラフNN（以下GNN）を取り上げます。

# 3. モデルの構造
最初に入力データの紹介だけして、モデルの内部構造である入力層・中間層・出力層について順を追って説明させていただきます。
# 3.1 入力データ
GNNモデルは、「ノード」と「エッジ」とノード間で送られる「メッセージ」の3つを特徴量とするNNです。あまりにも手書きすぎますが、入力データのイメージは下図の通りです。

![IMG_0010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/f45689eb-c263-6a65-31b2-6c73815cca1a.jpeg)

mがメッセージでhがノード（頂点）の特徴量、eがエッジ（辺）の特徴量です。ノードとエッジの情報を集約してメッセージが計算できます。計算方法には和、平均、最大値を求める方法などがあります。

# 3.2 入力層
グラフデータを入力します。ノードの特徴量行列Xと隣接行列Aを特徴量とします。隣接行列とはノード間の接続を総当たり表のような形式で行列で表したものです。詳しくは「2.グラフデータとは？」で貼っ付けた記事をご覧ください。

# 3.3 中間層
ニューロンの集合体が層状に重なっています。ニューロンに特徴量を入れる→そのニューロンに設定された重みをかける→次のニューロンにその結果を渡す、ということを繰り返します。あまりにも手書きすぎますがイメージ載せときます↓

![20240624.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/ecaa634c-d05e-c47b-b268-a82d49760ffc.jpeg)

最終的に活性化関数というものをかけて特徴量Hを更新していくので数式で表すと次の通りとなります。

![スクリーンショット 2024-06-26 0.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820324/eb26ea8e-f0c4-f9cb-479b-39131ae17955.png)

# 3.4 出力層
出力されたデータと教師データの差を計算します。
誤差が小さくなるように重みをちょっとずつ変えていきます。この重みの変え具合を「学習率」と呼びます。
後に紹介する損失関数と活性化関数を利用し、誤差が小さくなっていくよう中間層の重みを更新していきます。

# 3.5 損失関数と活性化関数とオプティマイザ
・出力結果を非線形的に変換する関数が活性化関数です。
・損失関数により出力結果と正解データの誤差を計算できます。誤差の最小値を計算するためには損失関数を微分することで傾きが0になる極小値を求めます。
・しかし局所解になってしまうリスク（勾配消失問題）があります。そうならないように誤差を最小化しつつ中間層のパラメータの更新を行うのがオプティマイザです。

# 4. おわりに
時間ある時に具体的な実装のところも記事にしたいと思ってます。間違ってるところあれば教えてください！！
タイトルにグラフデータと入れたのに、ニューラルネットワークの一般的な解説になってしまった、、、
interface vs type alias

## type alias とinterface 宣言
オブジェクトの型を宣言する方法には、`type`文を使った型エイリアス（type alias）による宣言と`interface`を使った`interface`宣言があります。

https://qiita.com/axoloto210/items/b4b61484438b487a68eb


本記事では型エイリアスとinterface宣言の差についてみていきたいと思います。
## 宣言時に使える構文
オブジェクトの宣言時に使える構文が型エイリアスと`interface`宣言とでは異なります。
### 型エイリアスにしかできないこと
基本的には型エイリアスにしかできないことの方が多くあります。

まず、型エイリアスではMapped Types による型の構成が可能で、`interface`宣言では使用できません。

https://qiita.com/axoloto210/items/f019854bc9c6af2f0979

ほかにも、型エイリアスではオブジェクト型以外の型を宣言可能です。

### interface宣言にしかできないこと
`interface`宣言でできることは型エイリアスでも代用できるものが多くありますが、Declaration Merging については`interface`宣言特有の性質だと言えます。

https://qiita.com/axoloto210/items/bccc48dd900f86bd47bd

型エイリアスで同名の型を宣言すると型エラーとなりますが、`interface`宣言の場合には型エラーとはならず、1つの`interface`として扱われるようになる性質があります。

## エラーメッセージの種類
型エイリアスと`interface`とでエラーメッセージの内容が異なる場合があります。

以下は、`interface`宣言による型のプロパティが足りないときにでる型エラーメッセージです。
```ts
interface Fish {
  name: string
}

interface Fish {
  weight: number
  height: number
}

const salmon: Fish = {
  name: "Salmon",
};
```
```
Type '{ name: string; }' is missing the following properties from type 'Fish': weight, height ts(2739)
```
`interface`宣言のときのエラーメッセージには、`weight`と`height`が無いという旨のエラーメッセージになっています。

一方で、同様のことを型エイリアスと交差型で確認してみると、エラーメッセージの種類が少し変わります。
```ts
type Name = { name: string }

type Size = {
  weight: number
  height: number
};

type Fish = Name & Size

const salmon: Fish = {
  name: "Salmon",
};
```
```
Type '{ name: string; }' is not assignable to type 'Fish'.
Type '{ name: string; }' is missing the following properties from type 'Size': weight, height ts(2322)
```
型エイリアスのときのエラーメッセージには、`{ name: string; }`が`Fish`型の変数に代入できないという旨のメッセージが追加されており、エラーコードも`interface`宣言のときとは異なっています。

## コンパイラのパフォーマンスの違い
複数のオブジェクト型を合併して1つのオブジェクト型として宣言したいときに、`interface`宣言では`extends`を使用して表現できます。
型エイリアスの場合には、交差型`&`を使って同様の型を表現できます。

型エイリアスと交差型による型の宣言に比べて、`interface`と`extends`によって宣言する方がコンパイラのパフォーマンスが上がるという違いがあるようです。

型エイリアスでは再帰的にプロパティをマージを行い、場合によっては`never`型ができてしまうのに対し、`interface`宣言では1つのオブジェクト型にまとめられて平坦な構造になるため、パフォーマンスが良くなるようですね。

>Using interfaces with extends can often be more performant for the compiler than type aliases with intersections

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#differences-between-type-aliases-and-interfaces

https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections
経理事務OLが基本情報技術者試験（FE）に挑戦してみた

はじめまして。今年からITの勉強を始めようと、IT系の資格の登竜門である基本情報技術者試験を受験し、合格した際の受験体験を記事にしました。



## ・プロフィール
社会人10年目　商社の経理事務をやっています
最近、仕事でExcel VBAを使うことが増え、プログラミングに興味を持ちました
現在、PHP、MySQL、HTML、CSSを独学で勉強中

## ・試験概要


https://www.ipa.go.jp/shiken/kubun/fe.html


パソコンを用いたマークシート方式(CBT方式)で都合がいい時期に、随時受験可能
科目A、科目Bで構成され、ともに600点/1000点以上で合格

### ・科目A
テクノロジ系、マネジメント系、ストラテジ系の問題が出題され
60問/90分、四択形式
### ・科目B
アルゴリズム（16問）とセキュリティ（4問）に関する問題が出題され
20問/100分、選択形式



## ・勉強期間
1月17日から4月29日の約3か月間勉強しました。
ITに関する知識がほとんどないところからのスタートだったので用語が難しく
試験の際、問題文を読むだけで時間が足りなくなりました。

特に科目Bアルゴリズム問題は1題解くのにめっちゃくちゃ時間がかかり、時間がギリギリの中、焦りながら残りのセキュリティ問題を解いた感じでした。


結果は科目A 750点、科目B 675点で、1回目でなんとか無事合格でした。

![スクリーンショット 2024-06-22 211904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68011/3a4ee0e8-7ef0-c1f1-b213-d76842fa6d80.png)



## ・勉強の進め方
### ①参考書を読む
最初の約2か月間は参考書（**令和06年 イメージ＆クレバー方式でよくわかる かやのき先生の基本情報技術者教室**）を買い通勤時や土日を使って読み、
参考書に載っていた問題を解きました。
2周しても覚えられない、理解出来ない分野を、ネットやYoutube動画を調べ解説を見て理解を深めました。


### ②過去問で実践する
受験の1か月前になってから過去問にとりかかりました。
過去問道場の平成30年春期～令和5年の8回分を解き、解けなかったところを何度も重点的に復習しました。
科目Aの知識問題はスマホで通勤時間に解き、科目Aの基礎理論の計算問題や科目Bは土日を使ってノートに問題を写経しながら解きました。

https://www.fe-siken.com/fekakomon.php

### ③科目Bのオリジナル問題
アルゴリズム問題が過去問を解くだけでは不安だったので試験2週間前に

参考書（**令和06年 基本情報技術者 パーフェクトラーニング過去問題集**）を買いアルゴリズムのオリジナル問題を解きました。


### 勉強してみて
大事だと思ったのは、用語やアルゴリズムを理解することです。
最初ノートに用語やその意味をただ書いて暗記していたのですが頭に入ってこなくて、参考書の確認問題も全く解けませんでした。

困ったなーと思っていろいろネット、Youtubeで用語を検索したところ
いろんな解説があり、読んだり見たりして少しずつ理解することで、
問題も解けるようになりました。

特にこちらのサイトが専門的な用語をわかりやすく解説してくださっていて
助けていただきました。

https://wa3.i-3-i.info/index.html


科目Bのアルゴリズム問題に関しては過去問をYoutubeやネットで解説しているものがたくさんあり、それらを参考にしてノートに何度も写経しました。
過去問だけでは心配だったので**令和06年 基本情報技術者 パーフェクトラーニング過去問題集**も解きましたが、
問題集のオリジナル問題と似たような問題が出題されたので、やっていて良かったと思いました。

### ④受験当日
受験当日は2時間前くらいに受験会場近くのカフェに寄り、過去問道場で苦手な問題などを見直してから、余裕を持って会場に向かいました。

試験はCBT方式で、後で見直すように問題をチェックすることが出来たので自身のない問題は飛ばしてチェックしておき、余った時間で再度見直して解きました。



## ・試験を受けてよかった事
ITに関する幅広いことを学べました。

会社でもDXを推進する動きがあり
勉強した事を生かせるのではないかと思います、

また、プログラミングに興味が湧いたので
今度はWEBアプリ作成に挑戦したいと思いました。


## 結び
ここまで、読んでくださりありがとうございました。
Qiitaで記事を書くのが初めてで読みにくい文章だったかと思いますが、
社会人でこれから資格にチャレンジしようと思っている方の参考になれば幸いです。
ルートユーザーを使うのは極力控えよう

# これダイジョブなの？！

ある日、生徒会にGoogle Classroomを導入するために情報の担当の先生に依頼したところ衝撃的なことを目にしました...
Googleでは組織を作れるのですが、一番上の管理者だからという理由でルートユーザーを使っていました。

あれ、もしかして一般の方の間ではルートユーザーを使うことに抵抗を持っていない...？

このことがあったので注意喚起としてこの記事を書きました。

# ルートユーザーとは

組織を作れるサービスで存在する、そのサービスの全ての権限を持つユーザーのことです。
いわば神のような存在です。
しかし、この神は悪魔にもなり得ます。

# なんで使っちゃだめなの？

前提として「人間は愚か」ということを忘れてはいけません。
いくら気をつけても、いつかは間違えることがあります。
例えば徹夜を3日続けているとか、風邪だとか、そういうことです。

退職した人のアカウントを消すために削除ボタンを押したつもりが、組織自体を消してしまい全てのデータが消えてしまう...
なんてことが起こったらどうしますか？

# どうすればいいの？

使わない！！！

これに限ります。管理者で何か特別な権限が必要ならばそれを許可したユーザーを作成してください。
その中では、組織や超重要な設定を消せないようにしていればミスは減るでしょう。

# ルートユーザー (AWS編)

ここからはAWSを例にルートユーザーの危険性を説明します。

- アカウントの完全削除
- 支払い情報の変更
- 管理者用のIAMユーザーの作成

このようにアカウントを完全に削除することができます。
その場合はそのアカウント内で作成された全てのリソースが削除されてしまいます。

支払い設定を間違って変更してしまった場合にはうまく引き落としがされなくなったりして
AWSが使えなくなる可能性があります。

# まとめ

**ルートユーザーは使わない！！！**
**使わせない！！！**

これに尽きます。
もし使わざるを得ない場合は、そのアカウントを使う際には細心の注意を払いましょう。
また一人で作業するのではなく、複数人で作業することでミスを減らすことができます。
近々取りたい資格備忘録

最近✕✕が忙しいので手が回らないと言って理由を付けては資格試験を受験しなくなりました。加えて受験したい資格のレベルが相対的に高い物を選択する傾向が強まっている傾向にあり、ある程度まとまった期間計画的に受験対策をする必要が有ることも、思うように手が着かない理由だと思います。よって、今後2〜3年で取りたい資格を備忘録も兼ねてまとめておこうと思います。

# 技術系の資格

* ~~KCNA~~ 2024年取得
* ~~AWS Solution Architect Associate~~ 2024年取得
* ~~CKA~~ 2024年取得
* データベーススペシャリスト
* 技術士(情報工学部門) 1次試験
* ネットワークスペシャリスト
* 画像処理エンジニア検定 エキスパート
* 第二種電気工事士
* 第1級陸上無線技士
* アルゴリズム実技検定
* 生成AIプロンプトエンジニア検定
* ~~量子エンジニア(アニーリング式)認定試験~~ 2024年取得
* 量子エンジニア(ゲート式)認定試験
* Python 3 エンジニア認定データ分析実践試験
* Pythonとネットワークの自動化基礎検定
* Python 3 エンジニア認定実践試験(再)

# 基礎科目系の資格

* 統計検定 準1級
* 実用数学技能検定 1級

# 語学系の資格

* 実用英語技能検定 準1級
LiONのロゴに込めた想い

# LiONのロゴに込めた想い

私は、LiON（LinuC Open Network）運営メンバーとして活動しています。
このLiONのロゴを考案し、採用いただきました。
具体的な技術の話ではないですが、今回はこのLiONのロゴに込めた想いを共有させていただきたいと思います。
## LiONとは？
LiONは、<strong>「アウトプット共創型 エンジニアコミュニティ」</strong>と位置付けています。

ひと言で表現すると
<strong> 「多様性を認め合い、エンジニア同士が個人の成長を感じながら作り上げていくコミュニティ</strong>
です。
ベンダーフリーの試験を提供されているLPI-Japanと有志エンジニアが集まってできたコミュニティで2024年2月に発足しました。

私はLinuCシステムアーキテクトの試験開発に携わらせていただいたご縁で、このコミュニティにも発足時より関わっています。

## ロゴに込めた想いとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951855/b1a08bb4-742a-1a0f-95cd-5f44df99d980.png)

<font color="red">赤：LiON</font>、<font color="royalblue">青：LinuC</font>、<font color="green">緑：OSS-DB</font>、<font color="orange">オレンジ：HTML5</font>
>まず、4色をLiONと３つの認定資格で紐づけました。
>LiONは4つのプロジェクトを持っています。
>それを重ね合わせて。（何色がどのプロジェクトかはそれぞれの感じ方で良いと思っています）
>デザインに込めた想いは、多様性(※1)と共創(※2)。そして、あらゆる方向へ進んで広がっていくコミュニティ。そんなことを表現しました。（したつもりです(笑)）
>※1 多様性：色も向きも違う同じ図形で表しています
>※2 共創：それぞれの個性が集まって一つになる、一つの新たなカタチをつくることを表しています

上記は、ロゴを決めるときに作った説明です。
この「」(_カッコ_)が4つバラバラな方向に向いているロゴ。 _カッコ_ は実は矢印を表現しています（少し省略し過ぎ（笑））
このロゴは、資格取得やイベントを通してエンジニアとして成長させてくれたLPI-Japanへの感謝とこのコミュニティに込めた想いをカタチと色で表現しています。

_カッコ_ が4つありますが、これはコミュニティの軸となっている4つプロジェクトを表しています。
**「試験開発プロジェクト」**
**「学習教材作成プロジェクト」**
**「地方創生協力プロジェクト」**
**「学習支援活動プロジェクト」**
そして、<strong>LiON、LinuC、 OSS-DB、HTML5</strong>をイメージして4色で表現しました。

多様性と共創、つまりは「あらゆる方向へ進んで広がっていく」ことではないかと思ったんです。
これからエンジニアを目指す方、初学者、若手、ベテラン、講師、インフラエンジニア、アプリエンジニア、データベースエンジニア、どの技術やフェーズで活躍しているかは関係なく、それぞれがそれぞれの<strong>”得意”</strong>や<strong>”好き”</strong>を発揮しあらゆる方向に共に広がっていく。
この矢印はそんな推進力をイメージしています。

## 名刺やバッジにも採用

このロゴは、コミュニティで発行している名刺やデジタルバッジにも使われています。
次はグッズにもしちゃおうか（笑）
なんて妄想は膨らみますが、コミュニティと事務局で慎重に話をしていきたいと思います！

ちょうど、「学習支援活動プロジェクト」として始まったLinuCレベル1の春期講座が終わるところです。（2024/6/28まで）
夏期講座、秋期講座も予定されています。
私は業務の関係でもう少し後の出番としますが、こちらもこれからLinuCを取得される方々の助けになればと思っています。

おかげさまで、コミュニティは200人を超えるまでに増えました。もっと大きくなってこのロゴに込めた想いのように、全てのエンジニアに寄り添うコミュニティにしたいと運営メンバーとして思います。
そんな訳で、少しでも関心を持たれた方は、LiONサイトを覗いてみてください。
<a href="https://linuc.community/ "target="_blank" rel=”noopener”>LiONコミュニティサイト</a>

最後まで読んでいただき、ありがとうございました m(_ _)m
漢数字を含むテキストの漢数字部分を半角数字に変換するPythonスクリプト

世の中には数字を漢数字で出力してくるサービスがまあまあ有りまして、（Amaz○n Transcribeっていうんですけど）

例えば「1972年」などは、「千九百七十二年」などと出力してきます。

また別のシステムでは「一九七二年」などと表示してきます。

見栄えが悪いので、一律半角数字にしたいです。

調べたところ、kanjizeというライブラリが有りました！

https://qiita.com/nagataaaas/items/154751c4f23b468e1c15

---
とてもよいライブラリですが、
テキストをまるっと投げると、当然ながらエラーになってしまいます。

    >>> kanji2number('千九百七十二')
    1972
    >>> kanji2number('千九百七十二年')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 166, in kanji2number
        result = _kanji2number(given, kanjis)[0]
      File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 196, in _kanji2number
        fraction = parse_short(kanjis)
      File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 220, in parse_short
        raise ValueError(f"Kanji `{kanji}` seems to be invalid.")
    ValueError: Kanji `千九百七十二年` seems to be invalid.


結局のところ、今回の用途「漢数字を含むテキストの漢数字部分だけをまるっと半角数字にしたい」を達成するためには、
自分でどこからどこまでが漢数字であるかを見つける必要がありました。

そんな経緯で、ゴリッとスクリプト実装した次第です。
　


    import kanjize
    
    kanji_nums   = '〇一二三四五六七八九'  # 零はTranscribe結果で出てきた気がするけど一旦除外する
    kanji_units1 = '千百十'                # 前に1〜9がなくても数字に変換する単位
    kanji_units2 = '京兆億万'              # 数字に変換する際、必ず前に1〜9がある
    
    def myk2i(text):
        conv_text = ""
        kanji_num_list   = [c in kanji_nums   for c in text]
        kanji_unit1_list = [c in kanji_units1 for c in text]
        kanji_unit2_list = [c in kanji_units2 for c in text]
    
        begin_index = -1
        end_index = -1
        for i in range(len(text)):
    
            if (begin_index < 0):
                # 漢数字beginサーチ
                if (kanji_num_list[i] or kanji_unit1_list[i]):
                    begin_index = i
            else:
                # 漢数字endサーチ
                if (not(kanji_num_list[i]) and
                    not(kanji_unit1_list[i]) and
                    not(kanji_unit2_list[i])):
                    end_index = i
    
            # 特殊対応。サーチ中に末尾に到達したケース
            is_text_end = (i == (len(text)-1))
            if (begin_index >= 0) and is_text_end:
                end_index = i + 1
    
            # コピー
            if (begin_index >= 0):
                if (end_index >= begin_index):
                    # 漢数字を数字に変換してコピー
                    conv_text += str(kanjize.kanji2number(text[begin_index:end_index]))
    
                    if (not(is_text_end)):
                        # 判定で見つかった漢数字ではない部分もコピーする
                        # テキスト末尾が数字の場合は変換してコピー済みだからこの箇所は遠さない。
                        conv_text += text[i]
    
                    # サーチリセット
                    begin_index = -1
                    end_index = -1
    
                else:
                    # サーチ中なのでコピーしない
                    pass
            else:
                # 今の文字をそのままコピーする
                conv_text += text[i]
    
        return conv_text

---

# 動かしてみる

    >>> print(myk2i("千九百七十二年一一月九日はジャコビニ彗星の一ヶ月後です"))
    1972年11月9日はジャコビニ彗星の1ヶ月後です

やりました。テキストをまるっと投げ込むことができました！
【Rails】debrideで未使用のメソッドを検出する方法

debrideというGemを使用することで未使用の可能性のあるメソッドを検出できます。

https://github.com/seattlerb/debride?tab=readme-ov-file

## 導入方法
Gemfileに以下を追記し、`bundle install`します。

```Gemfile：Gemfile
group :development do
  gem "debride", "~> 1.12", require: false
end
```

ターミナルで以下のコマンドを実行し、ホワイトリストを作成します。

```terminal
$ rails routes > routes.txt
$ debride_rails_whitelist routes.txt log/production.log | sort -u > whitelist.txt
$ echo up >> whitelist.txt
$ echo down >> whitelist.txt
$ echo change >> whitelist.txt
$ bundle exec debride --rails --whitelist whitelist.txt .
```

以降、`bundle exec debride --rails --whitelist whitelist.txt .
`で未使用メソッドの確認ができます。

使用されているメソッドが未使用の可能性があるメソッドとしてリストアップされた場合には、そのメソッドを`whitelist.txt`に追加します。
【小ネタ】AWS SDKでCost ExplorerのAPIを実行してAWSの使用料を取得する

## ちょっと再履修

過去の資料を漁っていたのもあるんですが、コストアラートで送られてくるメールを見落としがちなので`AWS SDKでCost ExplorerのAPIを実行してAWSの使用料を取得する方法`を復習します。

できたら何かしらのプラットフォームに自動通知していきたい。（LINEとか？）

過去の資料

[【とりあえずハンズオン】AWS×LINEで実践！AWS利用料返信Botをつくろう](https://qiita.com/ymd65536/items/f352632aad904bd02b1c)

## ソースコード

昔のコード抜粋でなんとなく記載します。

LINE botに使ったコードだと、モジュール化されていないので使いにくい気がするのと
今はAWS以外も触っているので他のクラウドの利用料金がとれるようなモジュールとして作っていきたい気がします。

```python
import os
import boto3
import json
import calendar
from datetime import datetime, date

ce_client = boto3.client('ce')


def main():
    try:
        response = ce_client.get_cost_and_usage(
            TimePeriod={
                'Start': datetime.strftime(start_day, '%Y-%m-%d'),
                'End': datetime.strftime(end_day, '%Y-%m-%d')
            },
            Granularity='MONTHLY',
            Metrics=['UnblendedCost'],
        )
        result_message = response['ResultsByTime'][0]['Total']['UnblendedCost']['Amount']

    except Exception as e:
        # boto3 Client error でも以下の文が表示される
        err_res = e.response['Error']['Message']
        message = '[Error]' + '\n' + 'specify up to the past 12 months.'
        result_message = datetime.strftime(start_day, '%Y-%m-%d') + "-" + datetime.strftime(
            end_day, '%Y-%m-%d') + "\n" + message + "\n" + err_res
    return result_message
```

## IAM

過去の資料から漁ってきたポリシーはちょっと権限が強いので見直したほうが良さそうです。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ce:GetCostAndUsage",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "logs:CreateLogGroup",
      "Resource": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:*"
    },
    {
      "Effect": "Allow",
      "Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": [
        "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws/lambda/aws_cost_bot:*"
      ]
    }
  ]
}
```

## まとめ

他のクラウドもやっていきつつ、快適に利用料金を見ていきたいのでboto3のCost Explorer APIを復習しました。本格的にマルチクラウド対応の料金確認モジュールを作っていきたいです。

## おわり
Linuxディスク容量不足の調査と対策法まとめ

## Linuxのディスク容量が不足したときの対応方法
ディスク容量を圧迫している原因を特定して、不要なファイルがあるなら削除をおこないます。削除ができない場合はディスクの拡張を行うしかありません。

ディスク容量圧迫の原因を調査するにはdfコマンドとduコマンドを使用します。

dfでディスク使用率確認して、duでファイルを特定します。

## Linuxディスク容量調査コマンド

### dfコマンド
dfは「disk filesystem」の略でディスクの使用状況を表示するために利用します。マウントポイントも確認することができます。まずはdfコマンドでどのファイルシステムの容量がひっ迫しているかを確認します。

**実行結果**
```
df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      ext4       50G   20G   30G  40% /
tmpfs          tmpfs     1.9G  1.0M  1.9G   1% /dev/shm
/dev/sdb1      xfs       100G   60G   40G  60% /mnt/data
```
・Filesystem: ディスクのデバイス名やファイルシステムの識別子。
・Type: ファイルシステムの種類。
・Size: ディスクの総容量。
・Used: 使用済み容量。
・Avail: 利用可能な容量。
・Use%: 使用率（パーセンテージ）。
・Mounted on: マウントポイント。


-Thはオプションで以下の意味があります。
| オプション | 説明 | 
| :-- | :-: | 
|-T(type)| ァイルシステムのタイプ（種類）を表示| 
|-h（human-readable）| 人間が読みやすい形式で出力（例えば、バイト数をKB、MB、GB単位で表示）。| 
 
 ### duコマンド
du は "disk usage" の略です。このコマンドを使うと、ディレクトリやファイルがどれだけのディスクスペースを消費しているかを確認できます。

**基本構文**
```
du [オプション] [ファイル/ディレクトリ]
```
duコマンドのオプションは以下のようなものがあります。

| オプション | 説明 | 
| :-- | :-: | 
|-s（summarize)「概要」| 合計だけを簡潔に表示、指定したディレクトリの合計サイズを知りたい場合に便利です。| 
|-h（human-readable）| 人間に読みやすい形式で出力（サイズをKB、MB、GBで表示）|
|-c（total）| すべての項目の合計を最後に表示。| 
|-a（all）| 指定したディレクトリ内の全てのファイルとディレクトリのディスク使用量を表示| 

**実行結果**

```
$ du -shc /* | sort -rh
3.3G    total
2.4G    /usr
834M    /opt
74M     /var
46M     /aws
4.8M    /etc
1.2M    /tmp
108K    /run
104K    /home
4.0K    /srv
4.0K    /root
4.0K    /mnt
4.0K    /media
4.0K    /local
4.0K    /boot

```

まずは対象のファイルシステムのどのディレクトリの使用率が高いかを確認します。-sオプションを使用することでディレクトリごとの容量を確認できます。sortに-hオプションをつけることで数値の後に接尾辞（例えば、K、M、G など）が付いたデータをソートすることが可能になります。

duコマンドで容量の大きいディレクトリが判明したら、そのディレクトリに対してさらにduコマンドを実行することで、対象のファイルを絞り込んでいけます。

```
$ du -ah /usr/ | sort -rh | head -10
2.4G    /usr/
1.1G    /usr/local
450M    /usr/local/aws-cli/v2
450M    /usr/local/aws-cli
425M    /usr/bin
384M    /usr/local/lib
376M    /usr/lib64
338M    /usr/share
225M    /usr/local/aws-cli/v2/2.17.10/dist
225M    /usr/local/aws-cli/v2/2.17.10
```

ファイルを特定する時は-aオプションを付けることで、指定したディレクトリ配下のすべてのディレクトリ、ファイルの容量を調べることができます。数が多い場合はheadコマンドで表示数を絞りましょう。この例ではサイズの大きい上位10個を表示しています。


## 容量を圧迫する要因
### ログファイルの増加
特にログローテーションの設定が適切でない場合は古いログが削除されず、ファイル容量を圧迫要因になります。適切にローテーションや削除の設定をする必要があります。

### 一時ファイルの蓄積
一時ファイルやキャッシュがディスクスペースを占有することがあります。特に、/tmpや/var/tmpディレクトリに大量のファイルが溜まることがあります。

以下参考記事

https://qiita.com/NumLock7019/items/98c44e166b18c67c9998

https://qiita.com/frozencatpisces/items/fab2972238329e5c2198

https://zenn.dev/big_tanukiudon/articles/7c6b4299cae979


https://fullstacklife.net/linux/linux-disk-full/

https://zenn.dev/supersatton/articles/a2a3e1fb994e69

https://eng-entrance.com/linux-storage

https://www.skyarch.net/blog/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8F%E3%81%8C100%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%A8%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%8B%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF
Udemyをどう始めようか ~私を支えてくれた神サイト~


# Udemyとは？
Udemy（ユーデミー）は有料の教育動画のサイト。
プログラミングからデザイン、マーケティングなどなど幅広く学べる。

[公式サイト](https://www.udemy.com/)

# なぜUdemyを使うのか？
## 1. 価格が安い
「おいおい。どの講座を見ても27000円とかするじゃん。」と思うかもしれないが、Udemyはセールが多い。１ヶ月に３回ほどセールをやっているペースである。
セール時には、なんと最安で1200円になったりする。
ハンズオンの講座で50時間の動画であれば、手を動かかすと70時間くらいになるはずだ。
学生のお財布にも優しいのではないかと思う。

:::note warn
2024年の初夏のセールではいつもの最低価格1200ではなく1300円だった。
円安の影響だろうか...
:::

## 2. 質が高い
Youtubeでも良い動画は確かにあるが当たりはずれが多い。
しかしUdemyでは長時間で細かい部分まで解説している動画が多いのに加え、全額の返金対応もしている。

:::note warn
返金対応は購入後30日以内でポリシーに違反していないことが条件。
[返金ポリシー](https://support.udemy.com/hc/ja/articles/360050856093-Udemy%E3%81%AE%E8%BF%94%E9%87%91%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)
:::

## 3. サポートが充実している
サービスは日進月歩で変化し続けている。今まで使えていた機能が使えなくなったり、非推奨になって新しいものに置き換わったりする。
しかしUdemyの人気講座の多くは、対応までしっかりしている。
講座の動画の前に注意事項が追加されたりする。
さらにQ&A機能で質問ができるので、分からないことも質問できるし、他の人の質問も見ることもできる。


# まずはここを見よう
動画の詳細ページでは以下の情報に注意しよう。

- 要件
- 解説
- このコースの対象受講者

この欄を見て **何を勉強するのか**・**自分のレベルに合っているのか**を確認しよう。

![Udemy_page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/ac821f84-c369-8b0c-5880-adb09a1060f6.png)

引用。[Git： もう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/course/unscared_git/?couponCode=KEEPLEARNING)

# 英語の動画もみてみよう
リスニングは難しい、しかし世の中には自動で字幕をつけてくれる拡張機能を開発する人がいる。
Video CC translator を使えば日本語の字幕に対応していない動画でも日本語字幕を表示してくれる

https://chromewebstore.google.com/detail/video-cc-translator/fhbpmacbgklobobcieiaoibpjhdnmcfn
Sequence MakerとVBAを使用して🐸カエルの歌🎵を演奏する

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerには専用コマンドというものが用意されており、それを使うとVBAの処理を呼び出すことができます。この記事ではSequence MakerとVBAを使用してカエルの歌を演奏する方法を解説します。なぜカエルの歌かと言えば、梅雨入りしたからです。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

また、Sequence MakerからVBAの処理を呼び出す方法は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/2c13cd388cede0fe9234

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## VBAの実装
パソコンで音を鳴らす最も簡単な方法はビープ音を使用することです。ビープ音はVBAからBeep関数を呼ぶことで鳴らすことができます。
今回は音程と長さを指定して音を鳴らす関数「Melody(音程, 長さ)」を作成しました。
なお、休符は音程に「休」を指定することにします。
ExcelのVBAエディタを起動し、標準モジュール内に以下を記述します。

```vb
Option Explicit

'Beep関数とSleep関数を使用するための宣言
#If Win64 Then
    Declare PtrSafe Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
    
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
#Else
    Declare Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
    Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

'Beep音を鳴らす処理
Sub Melody(tone As String, time As Integer)

    Dim toneInt As Integer
    Dim timeInt As Integer
    
    timeInt = 500 * 4 / time

    If tone = "休" Then
        
        Sleep timeInt
    
    Else
    
        Select Case tone
            Case "ド"
                toneInt = 262
            Case "レ"
                toneInt = 294
            Case "ミ"
                toneInt = 330
            Case "ファ"
                toneInt = 349
            Case "ソ"
                toneInt = 392
            Case "ラ"
                toneInt = 440
            Case "シ"
                toneInt = 494
        End Select
        
        Call Beep(toneInt, timeInt)
    
    End If

End Sub
```

## Sequence Makerから演奏する
Excelのセルに以下を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/83adc549-5524-f29b-4615-fc2b25ac682a.png)

以下にコピペ用のコードも示します。

```
#MACRO(Melody,ド,4)
#MACRO(Melody,レ,4)
#MACRO(Melody,ミ,4)
#MACRO(Melody,ファ,4)
#MACRO(Melody,ミ,4)
#MACRO(Melody,レ,4)
#MACRO(Melody,ド,2)
#MACRO(Melody,ミ,4)
#MACRO(Melody,ファ,4)
#MACRO(Melody,ソ,4)
#MACRO(Melody,ラ,4)
#MACRO(Melody,ソ,4)
#MACRO(Melody,ファ,4)
#MACRO(Melody,ミ,2)
#MACRO(Melody,ド,4)
#MACRO(Melody,休,4)
#MACRO(Melody,ド,4)
#MACRO(Melody,休,4)
#MACRO(Melody,ド,4)
#MACRO(Melody,休,4)
#MACRO(Melody,ド,4)
#MACRO(Melody,休,4)
#MACRO(Melody,ド,8)
#MACRO(Melody,ド,8)
#MACRO(Melody,レ,8)
#MACRO(Melody,レ,8)
#MACRO(Melody,ミ,8)
#MACRO(Melody,ミ,8)
#MACRO(Melody,ファ,8)
#MACRO(Melody,ファ,8)
#MACRO(Melody,ミ,4)
#MACRO(Melody,レ,4)
#MACRO(Melody,ド,2)
```
さて、準備ができたら、一番最初のセルを選択し「コマンド送受信」ボタンを押してみましょう。
なかなかシュールなメロディーが聴こえてきますよ。。。。🐸

## まとめ
今回はSequence Makerを使用してカエルの歌を演奏してみました。
もはや計測器制御とは関係ない状態になっていますが、音が鳴らせるといろいろと便利です。例えば、何か処理が終わった合図として音を鳴らすとか、何か測定異常が発生したときに音を鳴らすとか、いろいろ使える・・・かもしれません？
GoogleAppScriptで学籍番号を検索してみよう


# 問題提起

私の高校では小テストを[Google Forms](https://www.google.com/intl/ja_jp/forms/about/)で行っている。しかし私はある点に憤慨している。
それは毎回のテストで学籍番号を入力しなければならないことだ。これはデジタルの良さを完全に消している。
テストのたびに番号を間違えないように言われるが人間は愚かなのだ。間違えるに決まっている。

小テストを作成するときにこのような作りにしている学校も多いのではないのか？

この記事のゴールはメールアドレスから学籍番号を取得するGoogle Apps Scriptを作成することである。
これが完成すれば他のサービスでも学籍番号を取得ができるようになる。

# 環境

この記事では以下のサービスを利用する。

- Google Apps Script
- Google Sheets

# 解決策

## 1. 学籍番号を記録するスプレッドシートを作成する

まずは学籍番号を記録するスプレッドシートを作成する。
以下の画像のようにAの列に学籍番号をBの列にメールアドレスを記録する。

![Sheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/a98136e9-9216-a054-0e68-f070f8d9e8b8.png)

## 2. Google Apps Scriptを作成する

次にGoogle Apps Scriptを作成する。
Google Apps ScriptはGoogleのサービスを自動化するためのスクリプト言語である。

1. 拡張機能 -> Google Apps Scriptを選択する。
![GoogleAppButton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/014c843a-3a91-d872-2a14-eeb4432b5076.png)

2. 以下のスクリプトを作成する。

```javascript
function searchStudentCode(email) {
  // ここを変更するとどのシートでも動作します。
  const SPREADSHEET_ID = "1PYtXAVw_YC7QLCD16G9yeAxamUbnBpwhWsN3jRZ0cdA";
  const SHEET_NAME = "シート1";
  //====================================================================

  // GoogleスプレッドシートをIDで開く
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);

  // シートからすべてのデータを取得
  var data = sheet.getDataRange().getValues();

  // データをループしてメールを見つけ、対応する学籍番号を返す
  var studentId = "";
  for (var i = 0; i < data.length; i++) {
    if (data[i][1] == email) {
      studentId = data[i][0].toString();
      break;
    }
  }

  // 学籍番号を返す
  return studentId;
}

// 上の関数が動くかどうか確かめる
function testSearchStudentCode(e) {
  var email = "aaa@gmail.com";
  var studentId = searchStudentCode(email);
  Logger.log(studentId);
}

```

このコードのtestSearchStudentCodeを実行すると、A列にある学籍番号が取得できる。
```
  const SPREADSHEET_ID = "1PYtXAVw_YC7QLCD16G9yeAxamUbnBpwhWsN3jRZ0cdA";
  const SHEET_NAME = "シート1";
```
この部分は自身のスプレッドシートのIDとシート名に変更する。
IDとは
![ID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/efc175e1-c827-b1ff-172f-b9a16b057ef6.png)
スプレッドシートのURLの中にある「/d/」と「/edit」の間の文字列である。

シート名とは左下のタブに表示されている名前である。
![SheetName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/f8e63ec0-a7e2-227d-dfac-a2dc116e5e92.png)

上部のタブにある実行を押すと許可が求められるので許可する。
![Tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/c996040a-d90d-ee14-ef1b-7ecde55918a8.png)

## 3. 動作を確認する

![Test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/364c6f56-c9e9-2b20-7e04-de1f8a8b3f66.png)

このようにtestSearchStudentCodeを実行すると学籍番号が取得できる。
emailを変更することで他のメールアドレスの学籍番号も取得できるので確認してみてほしい。
ユーザーが自分でsqlをシステムに安全に打ち込めるようにする方法

## はじめに

システムの利用者が自分で SQL を作成して実行したい場合、安全にそれを行うための方法について解説します。特にビュー(View)を利用することで、ユーザーが安全にクエリを実行できる環境を提供することができます。

## ビュー(View)の活用

ビューとは、データベース内の仮想テーブルであり、SELECT 文の結果をテーブルのように扱える機能です。ユーザーが直接テーブルにアクセスするのではなく、ビューを通じてアクセスすることで、以下のようなメリットがあります。

1. **セキュリティの向上**: ユーザーが直接テーブルにアクセスすることを防ぎ、必要なデータのみを提供することでセキュリティを高めます。
2. **データの一貫性**: ビューを通じてデータの一貫性を保つことができます。
3. **簡略化**: 複雑なクエリをビューに隠蔽することで、ユーザーが簡単にデータを取得できるようにします。

## ビューの定義方法

ビューを定義する際には、以下のようにします。

```sql
CREATE VIEW user_data_view AS
SELECT user_id, user_name, email
FROM users
WHERE active = 1;
```

この例では、users テーブルからアクティブなユーザーの ID、名前、メールアドレスのみを提供するビューを作成しています。

## ユーザーへのビューの提供

ユーザーがビューを利用してクエリを実行する方法について説明します。ユーザーには、ビューに対する SELECT 権限のみを付与します。

```sql
GRANT SELECT ON user_data_view TO user_role;
```

これにより、ユーザーは user_data_view ビューに対して SELECT 文を実行できるようになります。

## データの更新操作を制限する

ビューを利用しても、ユーザーが誤ってデータを更新してしまうリスクがあります。そのため、以下のようにビューに対する UPDATE、INSERT、DELETE 操作を制限することが重要です。

1. 読み取り専用ビューの作成:

データベースによっては、読み取り専用のビューを作成するオプションがあります。

```sql
CREATE VIEW user_data_view AS
SELECT user_id, user_name, email
FROM users
WHERE active = 1
WITH READ ONLY;
```

2. トリガーを使用して制限:

トリガーを使用して、ビューに対する更新操作を防ぐこともできます。

```sql
CREATE TRIGGER prevent_update_on_view
INSTEAD OF UPDATE ON user_data_view
BEGIN
  RAISE_APPLICATION_ERROR(-20001, 'ビューに対する更新は許可されていません。');
END;
```

## サンプルクエリ

ユーザーが自身で SQL を作成して実行する例を示します。

```sql
SELECT user_name, email
FROM user_data_view
WHERE user_name LIKE 'A%';
```

このクエリでは、ユーザー名が「A」で始まるアクティブなユーザーの名前とメールアドレスを取得しています。

## 注意点

ビューを利用する際には以下の点に注意してください。

1. パフォーマンス: ビューが複雑になると、クエリの実行パフォーマンスに影響が出る可能性があります。
2. 更新操作: 通常、ビューは SELECT 文に使用されますが、特定の条件下で更新操作(INSERT, UPDATE, DELETE)を行うこともできます。ただし、更新操作には制限があるため、慎重に設計してください。
3. ビューの維持管理: ビューを作成した後も、基となるテーブル構造の変更に伴いビューの再定義が必要な場合があります。

## まとめ

ビューを活用することで、ユーザーが自分で SQL を作成してシステムに安全に打ち込める環境を提供できます。これにより、ユーザーの利便性を向上させながら、セキュリティとデータの一貫性を保つことが可能です。

以上が、ユーザーが自分で SQL をシステムに安全に打ち込めるようにする方法の解説です。ビューをうまく活用して、安全で効率的なシステム運用を目指しましょう。
Ansibleは出てこない「エンダーのゲーム」のお話　：　技術者が長く会社で（チームで）続けられる条件

24本書いたら疲れてしまいました・・^^;
ちょっと閑話休題です。

## SF「エンダーのゲーム」　
引用: https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE%E3%82%B2%E3%83%BC%E3%83%A0

最近はAnsibleの出典になったとご存じの層も多いようで。
初出は1977年（短編）なんですね、古い。自分はハヤカワ書房の日本語初版だったはずなので1987年に読んだわけです爆。

自分アンシブルは全然覚えてなくて、エンダーといえば、続編の「死者の代弁者」「ゼノサイド」もそうなんですが、ヒューマンドラマというか人間描写の方にすごく惹かれた記憶があります。

といってもすごく素敵、あこがれる系の逆で、こんな刃物で切るようなスッパリ感、現実突き放しに救いようない感、孤独感にショックを受けた、に近かったかなと。実社会はきびしいんだなあきっと・・と思ったんじゃなかったかと。

エンダーのゲームですが当時SNSはおろかインターネットも一般に存在しない時代でしたけど、すでにステマ的な手法でエンダーたちが世論形成をしていくシーンがあったと思います。
そういった先見性は現実が凌駕しつつあるので現代ではまさに Future in the Past  ですね。
アンシブルもそうですがSFなのでいろいろ面白いネタはあると思います。ですが、バガーという異星人にエンダーたちが勝てた本質はテクノロジーではなく、チーム力・組織力だったんだと思います。

## 私が長いことこの会社にいられた理由

***IT資質：並***
***入社当時のITスキル・リテラシー：同期中下から3割以内にいた自信あり***
***IT好きか？：いやあんまり・・ほかの業種落ちたのでしょうがなく笑***

な私が１度も会社辞めず続けてこれた理由は

## 仲間がいる（いた）から

以上です。
同じ仕事を共有して、失敗と成功を分かち合える仲間たちがたくさんいます（いました、亡くなった方も含めて（過労死じゃないですよw））

プライベートもそうですが、仕事に絞りますと、
***・わからないことをなんでも聞ける社風だった（です）　聞ける人もあちこちにいた（います）
・仕事の仕方がわからないなどもブラザーが教えてくれた。ブラザーでない人もあれこれとにかく世話焼いてくれた。
・トラブっても（それが深刻なトラブルであればあるほど）周りからエキスパートが寄ってきました。よってたかって（という表現がほんと最適）解決まで手伝ってくれた。(会社組織上もそういう体制が常にあります、というのもありましたがそこまでいかないトラブルも一人になることはなかった。)***


ということで、

コナンのおじいさん

***「人は一人で生きてはいけない、いや、生きてはいかんのだ、仲間を探せ。」***

は至言金科玉条だと思う次第です。

***技術屋は孤独です、エンダー並みに孤独です。***

***だから、信頼できる仲間を探して（つくって）ください♪***


## p.s
年次の上下関係も意識したことほぼないですねたとえ社長でも（仕事で社長と一緒したことはないけど爆。会長はありますが上下関係の意識はなかったです、お客様に提案活動するメンバー同士な関係でした♪）。技術者としてはスキル有無、その他ケイパビリティに敬意を払う、能力主義が中心ですね。スぺキャラはいるけども爆、年次・役職をたてに上からいう人は私の会社にはいません断言できます。私の同期辺りに役員さんが複数いますが、普通です。同期辺りな関係性が仕事上での関係性です。役員のロールが必要な場合は即役員モードになってくれますからありがたいだけです。こういう会社はすべてではないのかもしれませんね。。これはラッキーだったのかもしれません。他も普通そうなのかもしれません。

もう一つ大事なのは ***達成感*** ですね。仕事で達成感（太田さんが言えなかったカタストロフじゃなくてカタルシスに近い方w）を感じられるか、は当たり前ながら重要です。
自分は相手が喜ぶ・満足する、というところに達成感を感じることが多いです。最新最先端でなくてもいい（むしろ最先端じゃない枯れた方がトラブルなく良い場合もたくさんあると学びました）、ハッピーになってくれれば。
Git コミットの取り消しまとめ

## はじめに
皆さんは直前のコミットの粒度やコミットするファイルを変えたい場合どうコミットを取り消していますか？
また、コミットメッセージはどうやって変えていますか？
今回はコミットの取り消し方法についてまとめてみようと思います。

## コマンドからコミットを取り消す
一般的にコミットを取り消すには`git reset --soft HEAD^`のコマンドを使用して取り消していると思います。
直前のコミットを取り消してくれます。
```bash
$  git commit -am "test"
[main 32a5f91] test
 1 file changed, 1 insertion(+)

 $ git reset --soft HEAD^
```

## GitLensから取り消す
実はVScodeの拡張機能であるGitLensからもコミットの取り消しを行えます。
私はこのやり方をよく使います。
まず、GitLensの拡張機能を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/8cfe0dba-061e-bd6a-6b32-a0dfde27869f.png)

すると、左のソース管理にCOMMITSやBRANCHES、REMOTES等が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/4f3b5a62-0a03-16cc-b5b6-2e93954b6770.png)

CoMMITSを開くと、コミット履歴をみることができます。一番新しいコミットの戻る矢印のようなものをクリックするとコミットを取り消せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/421d3fd5-6d68-a5c5-5bc9-0b6a22f77ae9.png)

## コミットの名前を変更する
コミットの内容は同じでいいが、コミット名は取り消したいといったときには以下のコマンドでコミット名を変更します。
```bash
git commit --amend -m "コミット名の変更"
```

## まとめ
個人的には、GitLensを使用して、履歴を確認しながらコミットを取り消すのがやりやすいと思いました。
皆さんもぜひやってみてください。