OmniAICreator/Qiita-1.07M huggingface dataset:
[PHP]オブジェクト指向でさっそく躓いたって話。

# オブジェクト指向とは
細かい話は先人が山ほど解説しているのでここでは、
プログラムを｢オブジェクト｣と呼ばれる細かいパーツに分けて組み立てていくよ、という考え方とだけ。
#### $this を付け忘れてエラーが多発
学び始めてからすぐに、`$this`というものに悩まされました。コードを書いていると、よくエラーが出てしまい、原因を探してみるとどうやら`$this`を付け忘れていたのが原因でした。
###### よく陥った悪い例
最初こんな感じでコードを書いていました。
```php
class OmochaBox {
    private $omochas = [];

    public function addOmocha($omochaname) {
        // おもちゃを追加するメソッド
        $omochas[] = $omochaname; // これが間違い
    }
}
```
これだとエラーが出るか、もしくは欲しい実行結果にならないか。
###### 正しいコード
```php
class OmochaBox {
    private $omochas = [];

    public function addOmocha($omochaname) {
        // 正しくは $this を使う！
        $this->omochas[] = $omochaname;
    }
}
```
`$this` を使わないと、クラスのプロパティにアクセスできないんですよね。この `$this` が「今このオブジェクト自身」を指していて、`$this->omochas[]` って書かないと $omochas はどこの配列かわからなくなっちゃうみたいです。
特に今回自分が作っていたものはインスタンスが一つしかない場合が殆どで、作っている側の目線だと｢一つしかないんだからこれに決まってるじゃん｣なんですが、
そんなこと言語側はちゃんと指定してもらわないとわからんよ、ということらしい。
#### $this を付け忘れていた理由
* 変数みたいに扱っていた
最初、クラスの中で定義した変数は自動的に使えると思っていたんです。だから、わざわざ $this を書かなくても、プロパティにアクセスできるんじゃないかって思ってました。
* 変数とプロパティの違いを意識していなかった
普通に変数を書いている感覚で `$omochas[]` ってやっちゃってました。でも、クラスの中のプロパティは外部の変数とは違って、ちゃんと`$this`を付けて
｢そこの！｣クラスのプロパティだと指をさして教えてあげないといけない。そこが自分の頭の中で上手に解釈できていなかったのが今回のエラー祭りの原因かなと。

#### 学んだこと
* `$this`は、そのクラスのインスタンスを指す。
* クラス内で定義されたプロパティにアクセスするときは、必ず `$this->プロパティ名` でアクセスする必要がある。
* `$this` を忘れると、エラーが出てそのプロパティにアクセスできない。


これを何回かやらかして、ようやく少し慣れてきた感じです.
しっかり意識さえすればなんてことはないんですが、それまでが大事なんだなと痛感しました。

似たようなミスで躓いた人がいたら、参考になればいいなぁと。
勾配ブースティングランダムフォレストはいかほど

先日、KaggleのコンペでLightGBMのモデルを50個作って予測の平均値を使って割といい成績とったのがあったのですが、それから考えるに勾配ブースティングランダムフォレストを作ってみるとどうなんだろうと考えてライブラリを使って実装してみました。
# ライブラリ
```Python3
from sklearn.datasets import make_blobs
from lightgbm import LGBMClassifier as LGBMC
from sklearn.ensemble import BaggingClassifier
import numpy as np
import matplotlib.pyplot as plt
```

# 可視化関数
```Python3
def visualize_classifier(model, X, y, ax=None, cmap='brg'):
    ax = ax or plt.gca()
    # Plot the training points
    ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=cmap,
               clim=(y.min(), y.max()), zorder=3)
    ax.axis('tight')
    ax.axis('off')
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    # fit the estimator
    model.fit(X, y)
    xx, yy = np.meshgrid(np.linspace(*xlim, num=200),
                         np.linspace(*ylim, num=200))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
    # Create a color plot with the results
    n_classes = len(np.unique(y))
    contours = ax.contourf(xx, yy, Z, alpha=0.3,
                           levels=np.arange(n_classes + 1) - 0.5,
                           cmap=cmap, clim=(y.min(), y.max()),
                           zorder=1)
    ax.set(xlim=xlim, ylim=ylim)
```
では実際にデータセットを使ってやってみましょう
# データセット
```Python3
x, y = make_blobs(n_samples=300, centers=4, random_state=0, cluster_std=1.0)
plt.scatter(x[:, 0], x[:, 1], c=y, cmap="brg")
plt.show()
```

# 勾配ブースティングランダムフォレスト
```Python3
visualize_classifier(BaggingClassifier(estimator=LGBMC(), n_estimators=50), x, y, ax=None, cmap='brg')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/6247a5ef-c744-55cc-a5ad-001371ca1c81.png)

## ランダムフォレストとの比較
```Python3
from sklearn.ensemble import RandomForestClassifier
visualize_classifier(RandomForestClassifier(), x, y, ax=None, cmap='brg')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/9ce27005-4320-73b9-51fe-d69f7ce07c67.png)

ギザギザが多いですね。

# まとめ
きれいになった
Pythonのリストとセットの違い

Pythonにはさまざまなデータ構造が用意されており、その中でも頻繁に使用されるものに「リスト（`list`）」と「セット（`set`）」があります。

### リストとは？
リストは、順序付けられた要素のコレクションです。リストの各要素にはインデックスが割り当てられており、そのインデックスを使って要素にアクセスできます。

#### リストの特徴:
- 順序を保持: リストは要素の挿入順序を保持します。
- 重複を許可: リストは同じ値の要素を複数回持つことができます。
- インデックスによるアクセス: リストの要素にはインデックスを使ってアクセスできます。
- ミュータブル: リストは変更可能であり、要素を追加、削除、変更ができます。

```python
my_list = [1, 2, 3, 4, 5]
print(my_list[2])  # 3 （インデックス2の要素にアクセス）
my_list.append(6)  # 要素を追加
print(my_list)  # [1, 2, 3, 4, 5, 6]
```

### セットとは？

セットは、順序がなく、重複しない要素のコレクションです。セットは数学の集合のように、重複する要素を自動的に排除します。要素に順序がないため、インデックスによるアクセスはできません。

####  セットの特徴:
- 順序がない: セット内の要素には順序がありません。
- 重複を許可しない: セットには同じ値を複数回含めることはできません。
- インデックスがない: インデックスを使ったアクセスはできません。
- ミュータブル: セットは変更可能であり、要素を追加、削除できます。
- 集合演算が可能: 和集合、積集合、差集合などの集合演算がサポートされています。

```python
my_set = {1, 2, 3, 4, 5}
my_set.add(6)  # 要素を追加
print(my_set)  # {1, 2, 3, 4, 5, 6}

# 重複する要素は無視される
my_set.add(3)  
print(my_set)  # {1, 2, 3, 4, 5, 6} （3は追加されない）
```

### リストとセットの違い

|特徴	|リスト (list)	|セット (set)|
|---|---|--|
|順序	|順序を保持	|順序を保持しない|
|重複の許可	|重複した要素を持つことができる	|重複した要素は持てない|
|インデックス	|インデックスを使ってアクセスできる	|インデックスを持たない|
|ミュータブル	|変更可能	|変更可能|
|速度	|リストの探索時間はO(n)	|セットの要素検索はO(1)の平均時間|
|集合演算	|サポートされていない	|和集合、積集合、差集合などが可能|


### リストとセットの使い分け

####  リストが適している場合

- 順序が重要な場合: データの順序を保つ必要がある場合、リストが適しています。
- 重複を許容する場合: 重複するデータをそのまま扱いたい場合、リストを選びます。
- インデックスでアクセスしたい場合: インデックスで直接要素にアクセスしたい場合はリストが便利です。

#### セットが適している場合

- 重複を排除したい場合: 重複するデータを自動的に排除したい場合はセットが便利です。
- 高速な要素検索が必要な場合: データが多く、頻繁に存在確認や検索を行う場合はセットが効率的です。
- 集合演算を使いたい場合: データ間の和集合、積集合、差集合を処理する必要がある場合、セットが強力です。


### 例 

- 重複要素の違い

```python
# リストでは重複が許可される
my_list = [1, 2, 2, 3]
print(my_list)  # [1, 2, 2, 3]

# セットでは重複が排除される
my_set = {1, 2, 2, 3}
print(my_set)  # {1, 2, 3}


```

- アクセスの違い

```python
# リストはインデックスでアクセス可能
my_list = [1, 2, 3]
print(my_list[1])  # 2

# セットはインデックスでアクセスできない
my_set = {1, 2, 3}
# print(my_set[1])  # エラーになる


```

- 検索と速度

```python
# リストでの要素検索
my_list = [1, 2, 3, 4, 5]
print(3 in my_list)  # True （O(n)）

# セットでの要素検索
my_set = {1, 2, 3, 4, 5}
print(3 in my_set)  # True （O(1)）


```

- 集合演算 

```python
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 和集合
print(set1.union(set2))  # {1, 2, 3, 4, 5}

# 積集合
print(set1.intersection(set2))  # {3}

# 差集合
print(set1.difference(set2))  # {1, 2}


```


### 参考

https://docs.python.org/ja/3/tutorial/datastructures.html
応用情報技術者試験の受験してきたので勉強法や当日の立ち回り　(令和6年)

---
# はじめに
令和6年度秋期試験を受けてきました。
区分は応用情報技術者試験(AP)です。

こちらの試験受験日から合格発表まで期間があるため今のうちに勉強法や試験当日の動き方について忘れないうちにまとめていきます。

:::note info
2025/01追記
こちら無事合格できていました！
結果待ちの状態で執筆していましたが、合格体験記と当日の参考にしてください。
:::

## 筆者のスペック
- インフラ(クラウド)エンジニア経験5年
- 基本情報技術者試験は合格済み
- 普段はオンプレミス、AWS、Azureのインフラを担当
- プロジェクトマネジメント経験は1,2年

以下のような方は私と経験が近く参考になるかと思います。
-  インフラエンジニア
-  文系出身などで計算問題に苦手意識がある

# 教材
- [徹底攻略 応用情報技術者教科書 令和6年度](https://book.impress.co.jp/books/1123101067)
    - 全体的な用語確認
- [令和06年【秋期】応用情報技術者 パーフェクトラーニング過去問題集](https://gihyo.jp/book/2024/978-4-297-14224-7)
    - 午後試験対策
- [応用情報技術者試験過去問道場](https://www.ap-siken.com/apkakomon.php) 
    - 午前試験対策

# 午前試験の勉強
午前試験は7月の申し込み完了後から試験前日までの期間勉強していました。
応用情報の午前試験の約半分は過去問からの出題ということもあり、覚えている問題が多ければ多いほど得点源になるため、試験直前まで繰り返し演習をするようにしていました。

### 参考書学習
まず最初に[徹底攻略 応用情報技術者教科書 令和6年度](https://book.impress.co.jp/books/1123101067)を約一か月かけて読み込みを行いました。

正直なところこの期間はもったいない時間の使い方でした。
試験申し込み時に参考書は購入していましたが、試験勉強のモチベーションが上がりきらずダラダラと参考書を読んでいました。
約800ページあるとはいえある程度分野を絞るなどすればよかったなと今では感じています。


8月後半に参考書を一周したら続いては過去問道場で問題演習です。

### 午前問題演習
過去道場のアカウントは作成していなかったので、直近10回分の過去問一回分を適当に選んで85問ワンセットで繰り返しポチポチしていました。たまに気分転換に過去10回以外の古い試験なども解いていました。
慣れてきたら過去問2から5回分をまとめて選択し、10月に入ってからは選択可能な過去問全部からランダムに出題をしていました。

### 過去問以外の対策
そのほかの午前問題対策としては話題のIT用語の確認を行っていました。
例えば生成AI関連の用語です。
ちょうどAWSのAWS Certified AI Practitioner 試験がベータ版で提供されていたため、生成AIの勉強としてAWSドキュメントから基本的な生成AI用語を学習していました。

ほかには機械学習用語としてG検定の用語解説をしているサイトなども準備していました。
の
また、[IPA](https://www.ipa.go.jp/)のニュースなども定期的にチェックしてトレンドとなる用語についても少し目を通すようにしていました。

午前問題の過去問以外の問題は正直予想が難しいので、ヤマを張るくらいの気持ちで過去問対策をメインとしてトレンドの用語は押さえておくくらいでいいかと思います。(実際1，2問くらいラッキー程度でした)


# 午後試験の勉強
こちらはあまり対策していません。
[令和06年【秋期】応用情報技術者 パーフェクトラーニング過去問題集](https://www.ap-siken.com/apkakomon.php) に記載されてる過去問を4回分を2周くらい行ったくらいです。

また、プログラミングやデータベースなど業務的にやっていない分野については当日にも選択する可能性は低いので飛ばしていました。
以下の分野を一応対策しました。
- セキュリティ（必須）
- 経営戦略
- システムアーキテクチャ
- ネットワーク
- 組込みシステム
- サービスマネジメント
- プロジェクトマネジメント
- システム監査

心の中では出たとこ勝負だなという気持ちだったため、出題の感覚をつかむことと、文字を書く練習と思って対策していました。
### 文字を書く対策
特に文字を書く練習というところは重要です。
普段キーボードでしか文字を入力せず、また文字を書く際にはボールペンを使うため、シャープペンシルや鉛筆で文字を全然書いてません。
大学入試以来の鉛筆を触ってない方も一定数いると思います。

ちょっとした漢字も変換頼りで忘れてないか、文字を書く感覚を忘れてないかをつかむためにも午後問題対策は実際に筆記をしてみることをお勧めします。
(実際に本番中に多層防御の御の文字が思い出せず、問題用紙で必死に探して制御の文字を見つけて事なきを得ました。)



# 試験対策のまとめ

午前問題は大体ランダム出題で7割8割くらいの正解率で本番を迎えました。
午後試験の情報セキュリティ以外の選択問題は4つに絞らず、当日問題を見て判断しようくらいの気持ちでした。

# 試験は当日
続いて試験当日です。
私は大学が試験会場でした。
事前に証明写真含めた準備は完了していたため、当日は朝頑張って起きて試験会場に到着することが目標です。
9時半から試験開始ですが、9時10分には会場に到着するようにしておく必要があるため、逆算していくと9時前には会場の最寄駅に到着が必要です。自宅から一時間以上かかる場所であったため、前日にアラームはしっかりとかけていきました。
最寄駅から会場まではそれしき人たちが一列になって歩いているためついていけば自然と会場に到着できます。
ただ、付近のコンビニはかなり混んでいたため飲み物は準備しておいた方がよさそうです。


### 昼食
会場到着後、午前試験を受けた後の昼食の確保も重要です。
私は午前試験終了の50分前くらいに退出しましたが、会場の大学構内のベンチなど座れる場所はすでに埋まっていました。
事前におにぎりなどの軽食を準備しておくか会場近辺の飲食店を下調べしておくことも重要です。
昼食後は特にすることがないので会場に戻りましたが、会場に戻っている人に合わせて勉強をしていました。
もうできることはほとんどないので、語句の確認くらいしかやることはありませんでした。

### 午後の選択問題の選択
午後試験はまず解答用紙をみて自由記述が多すぎない設問を確認と問題を軽く見てイメージがしやすい問題かを確認しました。

前者は自己採点時に自信を持たすため記号や語句の回答が多い設問を見つけるため、後者は組み込みシステムなどでは特にシステムのイメージがしやすいかで文章の理解度が変わるためです。
ただし、実際に問題を解いたら難しいというパターンもあるので注意が必要です。

 # まとめ
以上、応用情報技術者試験を受験したときの試験対策と当日の会場内や午後試験の選定基準でした。
実務経験の有無でハードルが下がる分野がありますが、とはいえ試験範囲が広いのでそれなりに準備が必要です。
【ArticleHub Project ノート】01.プロジェクト紹介

# 「ArticleHub」
https://github.com/KyleAndKelly/ArticleHub
## 1.紹介

- Managerment System for News Article 
- ニュース、ブログなどの文章を管理するためのシステム

## 2.機能

- 認証コードに基づくログイン
-　権限の判断
- 文章内容リストのチェック（フイルター、ページネーション）
- 文章の編集
- 文章の削除
- 文章のアプロード（テクスト、写真など）

## 3.技術
- Boostrapに基づく、ペイジのタグとスタイルを作成する
- wangEditorプラグインを統合して、エデータを実装する
- 純粋なJavaScriptを使用して、CRUD業務を完了する
- Axiosを使用して、REST APIとやり取りする
- tokenを使って、権限の判断を行う
Djangoアプリでカスタムコマンドを作る方法

# はじめに
Djangoでは、manage.pyを通じてさまざまなコマンドを実行できますが、自分専用のカスタムコマンドを作成することも可能です。
この記事では、Djangoアプリにカスタムコマンドを実装する方法を解説します。

# カスタムコマンドとは？

カスタムコマンドは、Djangoの管理スクリプト(manage.py)から実行できる独自のコマンドです。以下のような用途に役立ちます。

- バッチ処理や定期実行タスク
- データベースの操作や初期化スクリプト
- 外部サービスとの連携スクリプト

例えば、`python manage.py mycommand`のように独自のコマンドを作成できます。

# カスタムコマンドの作成手順

## 1. Djangoアプリの準備
最初に、カスタムコマンドを配置するDjangoアプリを用意します。
既存のアプリを利用しても、新しくアプリを作成しても構いません。
今回は以下コマンドで`myapp`というアプリを作成しました。
```python
python manage.py startapp myapp
```

## 2. management/commandsディレクトリを作成
アプリ内に以下のようなディレクトリ構造を作成します。
myappとmycommandは適時自分のアプリとコマンド名に置き換えてください。
mycommand.pyを作成すると`python manage.py mycommand`でカスタムコマンドを実行できるようになるイメージです。
```
myapp/
├── management/
│   ├── __init__.py
│   ├── commands/
│       ├── __init__.py
│       ├── mycommand.py
```
`mycommand.py`が今回作成したカスタムコマンドの実装ファイルです。

## 3. コマンドの実装
作成したファイルにカスタムコマンドのロジックを記述します。
今回は以下のような簡単なサンプルコードを作成してみました。
```python:mycommand.py
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "サンプルのカスタムコマンドです。このコマンドの説明をここに記述します。"

    def add_arguments(self, parser):
        # オプションや引数を追加
        parser.add_argument("--name", type=str, help="名前を指定します")

    def handle(self, *args, **options):
        name = options.get("name")
        if name:
            self.stdout.write(f"こんにちは、{name}！")
        else:
            self.stdout.write("こんにちは！")
        self.stdout.write(self.style.SUCCESS("カスタムコマンドの実行完了しました。"))
```

サンプルコード解説:

- help
コマンドの説明を記述します。

- add_arguments
オプションや引数を定義します。
今回は`--name=名前`で名前を指定できるように設定しました。

- handle
コマンドのメイン処理を実装します。

- self.stdout.write
標準出力にメッセージを表示します。
self.styleで出力文字に色をつけることができます。

# カスタムコマンドの実行
作成したコマンドを以下のように実行します。
`mycommand`の部分は作成したカスタムコマンドファイルのファイル名になります。
```bash
python manage.py mycommand
```
### 実行結果
![スクリーンショット 2024-12-03 3.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314085/79c8d1a0-2859-bfab-0700-20c2d9be65e1.png)

# まとめ
Djangoのカスタムコマンドを使えば、バッチ処理やスクリプト処理のコマンドを簡単に実装できます。
アプリケーションの要件に合わせて、自由にカスタムコマンドを作成し、運用を効率化しましょう。

これを機にぜひ自分のプロジェクトにカスタムコマンドを取り入れてみてください！
Windows Serverについて

<h2>WindowsServerとは？</h2>
サーバーとして必要な機能（OS）をWindowsによって構成しているサーバー。
WindowsServerの中でもいくつかのエディションに別れており、使用する組織や機能、サーバー性能によって選定が必要となる。

▽WindowsServerエディション参考例▽
<dl>
<dt>WindowdServer2022 standerd</dt>
<dd>最小構成で性能要件（必要スペック）も低めなので、お手軽に構成可能！検証用とか学習用に最適</dd>
<dt>WindowdServer2022 Datacenter</dt>
<dd>全機能が無制限に使用が出来る！最強プラン</dd>
<dt>WindowdServer2022　Datacenter Azule Edition</dt>
<dd>Datacenter同様無制限で利用可能で、MS社のAZULEというクラウド環境とハイブリッド構成が可能！あらゆる案件・ビジネスに対応が可能となる</dd>
<dt>WindowdServer2022 Essentials</dt>
<dd>25名以内アカウント・50デバイス以内のサービス。小規模の事業者向けサービス</dd>

※MS社HPサイト…
https://learn.microsoft.com/ja-jp/windows-server/get-started/editions-comparison?pivots=windows-server-2025

<h2>WindowsServerの代表的な機能</h2>

数あるOSの中からWindowsを選んだ場合、こんな機能が使えますよという例です。会社員の方なら何となく見た事がある！なんか総務の人がこんな単語の話してたな！っていう機能や名前も出てくるのでは？！

▽WindowsServerOSの代表機能一覧▽
<dl>
<dt>ActiveDirectory</dt>
<dd>認証基盤であり、人材（アカウント・権限・許可＆拒否）や端末情報（PC・プリンター・ファイル）など各種情報を集中管理する機能です。これが存在する事で管理が簡単になる！</dd>
<dt>ドメインコントローラー</dt>
<dd>ActiveDirectory上でセキュリティ管理やユーザー認証をしたりするのに必要な機能でとても重要な役割を果たしている機能です。このドメインコントローラーがないとアクティブディレクトリは機能できない状態になります。</dd>
<dt>WindowsDefender</dt>
<dd>名前の通りウイルス対策ソフトで2016以降のエディションでは標準搭載されています。</dd>
<dt>サーバーマネージャー</dt>
<dd>WindowsServerの各種設定やサーバーの状態管理を簡単にするためのソフトです。標準搭載されており視覚的に分かりやすく管理が可能</dd>
<dt>ウィンドウズ展開サービス（WDS）</dt>
<dd>これがあれば、ウィンドウズOSを一斉に多数のコンピューターへインストール展開が可能！大企業でPCが数百台規模の会社なら必須ですね…</dd>
<dt>リモートデスクトップ</dt>
<dd>ネットワークを介して、パソコンAから遠く離れたパソコンBを遠隔で操作することが出来る機能！直接触らなくても各種設定や調整・確認も可能になります</dd>
<dt>Hyper-V</dt>
<dd>MS社が提供している仮想化の仕組み。WindowsServer上で別のOSをインストール・動作させることが出来る。これによりサーバー１台で複数のOSを構築し、起動するなどサーバーの持つ能力を論理的に分割して使用することが出来る！</dd>

<h2>インストールの種類について</h2>
とあるサーバーにWindowsServerOSをインストールする際、2種類の方法がありこの種類によって操作性や挙動なども異なる
<dl>
<dt>フルインストール（デスクトップエクスペリエンス）</dt>
<dd>消費メモリやディスク量が多い代わりに、GUIでの操作が可能で簡単。さらに各種サーバー機能の組み合わせなども可能なのでよりフレキシブルに対応が可能となる。</dd>
<dt>ServerCoreインストール</dt>
<dd>フルインストールに比べるとGUI操作が出来ず、CLIのコマンド入力を駆使する必要がある為難易度が高い。ただし消費するメモリ量やディスク量が少ないのいでより堅牢な動作が可能。</dd>

<h2>まとめ</h2>
WindowsServerの機能を改めてみると、自分が会社員時代によく体験していたのはリモートデスクトップ機能を使って、遠隔で総務の人に「ちょっとPC調子悪いんで見てほしいっす」と言って調整してもらってた記憶があります。アカウントを追加したり遠隔で操作したり…WindowsServerの機能だったのか……と実感した勉強となりました！

※当方、未経験からエンジニアへ転職した為備忘録活用をしております。
説明不足や意味が分からん！という箇所あるかと思いますが暖かい目で見て頂けますと幸いです。
MIT App Inventorで行うビジュアルプログラミング&Pythonとの比較


## 目次
１. はじめに
２. 準備
３. 変数
４. リスト
５. 繰り返し（for文）
おわりに

## １. はじめに
MIT App Inventorでプログラミング学習につかえるんじゃね？？と思い，記事を書いてます！
pythonのコードも記載し比較できるようにしました．
この記事は定期的に増やしたいと思っています！

:::note info
Python
本記事で記載しているpythonのコードはGoogle Colaboratoryで動きます．
[Google Colaboratory](https://colab.google/)はGoogleのブラウザでPythonを実行できサービスです．環境構築が必要ないのですぐに開発スタートできます！
:::


## ２. 準備
本記事では，MIT App Inventorで以下のデザイナー画面でブロックを組んでいます．
デザイナー画面にはButtonとTextBox２つ，Labelを入れます．

:::note info
ポイント！
AICompanionを行っているときに画面をリセットしたいときには，「Connect」の「Refresh Companion Screen」をクリックします．
:::

![スクリーンショット 2024-11-09 151054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/e723ed77-a597-f405-f8d2-1fd722e8eb6a.jpeg)


## ３．変数
変数とはプログラミングで使う「入れ物」のようなものです。数値や文字列など、様々なデータを一時的に保管しておくことができる場所です．

##### 変数のメリット
同じデータを何度も書かなくて済む: 一度変数に代入したデータは，何度も使うことができます．
プログラムの可読性向上: 変数にわかりやすい名前をつけることで，プログラムの理解が容易になります．
柔軟なプログラム作成: 変数の値を変更することで，プログラムの動作を簡単に変えることができます．

#### Pythonでの実装
```python:
age = 20  #変数ageに20という数値を代入
name = "太郎"   #変数nameに"太郎"という文字列を代入

print(f"{name}さんは{age}歳です．")

# 出力
# 太郎さんは20歳です．
```

#### MIT App Inventorでの実装
変数にはテキストや数値を代入することができます．ほかにもリストや辞書，画像を代入できます．
変数はブロック画面の左側，オレンジ色の`Variables`にあります．青色のブロックは数字ブロック，ピンク色のブロックはテキストブロックです．

・`initialize global ___ to`はスクリーンが表示さえたときに，この変数に代入されます．
![initialize global ___ to](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/c5373108-28d7-1a38-637f-ef205c0d45cf.png)

・`set global ___ to`は処理の途中で変数の値を変えることができます．以下では，TextBoxに入力した値（名前・年齢）を文章にして出力しています．
![set global ___ to](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f9b0b42c-806c-01b5-f40d-f930bb805a1e.png)


## ４. リスト
リストとは，複数のデータを順番に並べて管理するための箱のようなものです．

##### リストの特徴
__複数のデータを格納:__ 数値、文字列，さらには他のリストまで、さまざまな種類のデータを格納できます．
__順序がある:__ リスト内のデータは，順番を持って並んでいます．最初の要素、2番目の要素といったように，インデックスと呼ばれる番号でアクセスできます．
__要素の追加・削除・変更が可能:__ リストの内容は，プログラムの実行中に動的に変更できます．要素を追加したり，削除したり，既存の要素を別の値に書き換えたりすることができます．

#### Pythonで実装
```Python:
shopping_list = ["牛乳", "卵", "パン", "リンゴ", "バナナ"]
print(shopping_list)

# 出力
# ["牛乳", "卵", "パン", "リンゴ", "バナナ"]
```

#### MIT App Inventorで実装
リストのブロックは水色の`Lists`にあります．`create empty list`は何も入れないときに，`make a list`は複数の値を同時に書き込むときに使用します．ほかにも，いろいろなリストのブロックがあります！
![List](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/7f9218f0-f990-a300-ac54-97559ed2fd06.png)


## ５. 繰り返し（for文）
for文はある処理を繰り返し実行したいときに使うプログラミングの制御構造です。
例えば、「1から10までの数を順番に表示する」といったような場合に利用します。

#### Pythonで実装
```Python:
for i in range(1, 5, 1):
    print(i)

# 出力
# 1
# 2
# 3
# 4
```
#### MIT App Inventorで実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/ce190fbd-acec-7b0a-16af-c96c963346e2.png)

## 6. 繰り返し（for文＋リスト）
リストをfor文で使用する方法です．

#### Pythonで実装
```Python:
shopping_list = ["牛乳", "卵", "パン", "リンゴ", "バナナ"]

for item in shopping_list:
    print(item)

# 出力
# 牛乳
# 卵
# パン
# リンゴ
# バナナ
```
#### MIT App Inventorで実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/794f1037-1d2b-46a1-c271-7c17da7734c6.png)
これだと，一瞬でfor文が終わってしまい，最後のバナナしか見ることができない．





## おわりに
この記事はもっと，もっと記述していきたい．
【AWS CDK】コンテナにCDK環境を構築してみた！

# はじめに
<!-- 発端や概要を記載 -->
本記事ではコンテナを使ってCDK環境を構築する内容になります。
試行錯誤をした上で実現できた内容になりますので、拙い箇所が多々ありますが都度メンテナンスしていきますのでご了承ください。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. コンテナ環境を準備をする
2. AWS CDK環境構築をする
3. プロジェクトを作成する
4. まとめ

<!-- 各チャプター -->
# コンテナ環境を準備をする
まず最初にコンテナ環境の準備をしていきたいと思います。
事前に必要な物はこちらになります。

| 項目 | 説明 |
|:-----------|:------------|
| vscode | 皆大好きコードエディタ |
| Dev Containers | vscodeの拡張機能 |
| Docker | コンテナ型仮想環境用のプラットフォーム |

上記のインストール方法については本ブログでは対象外とさせてください。

### 作業用のディレクトリを作成する

コンテナ環境用にディレクトリを作成します。

```
mkdir aws-cdk-containa-container
```

さらに、作成したディレクトリの中に以下ディレクトリを作成します。

```
mkdir .devcontainer
```

### Dockerfileを作成する

.devcontainerの中にDockerfileを作成します。
ベースイメージはubuntuを指定し、cdk環境に必要なパッケージを事前にインストールしておきます。

```Dockerfile
# ベースイメージとしてUbuntuを使用
FROM ubuntu:latest

# パッケージリストを更新し、Node.jsとnpmをインストール
RUN apt update && \
    apt install -y nodejs npm

# AWS CLIをインストール
RUN apt update && \
    apt install -y curl unzip && \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install

# TypeScriptをグローバルにインストール
RUN npm install -g typescript

# AWS CDKをグローバルにインストール
RUN npm install -g aws-cdk

# 作業ディレクトリの設定
WORKDIR /workspace

# コンテナのエントリーポイントとしてBashを起動
CMD ["/bin/bash"]
```

### devcontainer.jsonを作成する

devcontainer.json は、Visual Studio Code（VS Code）で開発環境をコンテナ化する際に使用される設定ファイルです。
このファイルに
- イメージのビルド
- バインドマウント
を記述しておきます。

```jsonc
{
    // 開発コンテナの名前を定義する
    "name": "aws-cdk-container",
    "workspaceFolder": "/workspace",
    
    // 指定されたDockerfileを使用して開発コンテナのイメージをビルドする
    "build": {
        "dockerfile": "Dockerfile"
    },
    
    // ホストのディレクトリをコンテナ内のディレクトリにバインドマウントする設定
    "mounts": [
    "source=/aws-cdk-containa-container,target=/workspace,type=bind"
  ]
}
```

### vscodeからコンテナにリモート接続する

最後にvscodeからコンテナを起動し、リモート接続していきます。

1. vscodeで「cmd + p」を押下
2. 「>Dev Containers: Open Folder in Container」と入力してEnter

コンテナが起動しますので、少し待ちます。
ターミナルにてコマンドラインが表示されたら完了となります。

# AWS CDK環境を構築する

では、CDKを始めるためのセットアップ作業をしていきましょう。

### AWS CLIの設定を行う

認証情報を設定していきます。

```
aws configure
```

| 項目 | 説明 |
|:-----------|:------------|
| AWS Access Key ID | IAMユーザーのアクセスキー        |
| AWS Secret Access Key | IAMユーザーのシークレットキー |
| Default region name | 作成したいリージョン |
| Default output format | json |

アクセスキー/シークレットキーは
1. 右上のIAMユーザー名をクリック
2. セキュリティ認証情報をクリック
3. アクセスキーを作成
で取得することができます。

下記コマンドで設定した内容を確認することができます。

```
aws configure list
```
これにて、準備作業は完了になります。

# プロジェクトを作成する
では、いよいよAWS CDK環境を構築していきます。

### AWS CDK用の作業ディレクトリを作成する

cdkプロジェクトを作成するためのディレクトリを用意します。
以降このディレクトリで作業していきます。

```
mkdir cdk
```

### CDKプロジェクトを作成

ではお待ちかねのcdkプロジェクトを作成していきましょう！
languageにはtypescriptを指定します。

```
cdk init app --language typescript
```

これで環境構築は完了となります。

# まとめ
今回はコンテナ環境でCDK環境を構築してみましたが、.devcontainer.jsonの知識が無かったので苦労しました汗
ですが、仮想環境での制作環境は整いましたので苦労した甲斐がありました！
これからはTypescriptでガシガシリソース作成をメインにブログ投稿していきたいと思います。

では、またノシ
Web上のオンラインジムのサービスをリリースした話「開発とかの話」


![WebGym.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930020/9e20fe9b-9204-b658-a732-b06febe98716.png)

先日Web上のオンラインジムサービス「WebGym」をリリースしました！
私はプログラミング歴は長いですが、かじっていた程度で豊富な知識や技術がある訳ではありませんが、その僕が１つのWebサービスをリリースするまでの過程をシェアさせて頂きます。

この記事がこれからWebサービスを作る人に役立てばと思います、

https://hikaru-tec-blog.site/





<h1>WebGymってどんなサービス？</h1>
ジムって入会金だった、月額費がかかるし、いけない日があって勿体なかったりするよね。
だからWeb上で完全無料のWebジムがあったらいいんじゃない？って思ったので作りました。<br>
なぜ無料なのか？それは「誰にでも健康を」がモットーで、お金持ってても、持ってなくても健康でいてほしいから。<br>
ちなみに一回800円のチケットを買うとトレーナーから食事やダイエットのアドバイスを貰える機能もあります。

<h1>htmlとCSSでサイトを作る</h1>
htmlとcssでサービス紹介のLP的なサイトと、コンテンツを掲載しているメインサイトを作成しました。
僕自身html&cssは得意じゃないので辛かった。
<h1>画像とかイラスト作成はCanvaを使った</h1>
PhotoshopとかIllustratorは結構高かったので、普通にCanva使ったけど、めちゃ使えました。
<h1>収益化はどうするか悩んだ</h1>
AdSenseとか広告貼るのも考えたけど、ユーザーの体験を優先して。なしにして基本無料だけど<br>
課金制でパーソナルトレーニング機能をつけた。

<h1>これからどのようにして多くの人に知ってもらうか？が課題</h1>
もっともっと良いサービスにしていきたい。そして多くの人に知ってもらって「健康」が当たり前の世界になってほしい<br>
拙い文章ですみません。。
読んでくれてありがとうございました。
【Python】re.searchとre.findallの違いは？サンプルコードで解説

# 概要
Pythonの`re.search`と`re.findall`を使ってみたのでサンプルコードで紹介します。

# サンプルコードと解説

それぞれ以下の違いがあります。

・`re.search`：文字列全体を検索し、最初に一致した部分文字列を含むマッチオブジェクトを返す
・`re.findall`：文字列全体を検索し、一致するすべての部分文字列をリストとして返す

上記の通り、`re.search`は最初の一致を確認するために、`re.findall`は一致するすべての部分文字列を確認するために使用されます。

```py
import re


def find_all_emails(email_pattern, text):
    emails = re.findall(email_pattern, text)

    print("抽出されたメールアドレス:")
    for email in emails:
        print(email)


def search_first_email(email_pattern, text):
    emails = re.search(email_pattern, text)

    if emails:
        print("最初に見つかったメールアドレス:", emails.group())
        # 以下で呼び出してもOK
        # find_all_emails(email_pattern, text)
    else:
        print("メールアドレスが見つかりませんでした。")


text = """
- 田中: tanaka@example.com
- 佐藤: sato@example.com
- 鈴木: suzuki@example.com
"""

# メールアドレスの正規表現パターン
email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'

find_all_emails(email_pattern, text)
search_first_email(email_pattern, text)
```

上記の出力結果は以下です。

```
抽出されたメールアドレス:
tanaka@example.com
sato@example.com
suzuki@example.com
最初に見つかったメールアドレス: tanaka@example.com
```

コメントアウト部分で記載した通り、`emails`がある場合のみ`find_all_emails`を呼び出す、という条件付きの実行にしてもOKです（関数のカプセル化にはなりますが、柔軟性はやや落ちるので方針次第）。
C++で型変換するときのチートシート

# はじめに
他の方法が存在するかもですが、許してください。
あとテーブルが大きすぎて半分崩壊してます()

# 文字列型を変換するときのチートシート
横が変換元、縦が変換先です。

||__`char *`__|__`const char *`__|__`std::string`__|__`wchar_t *`__|__`const wchar_t *`__|__`std::wstring`__|
|-|-|-|-|-|-|-|
|__`char *`__|-|std::memcpyで別に宣言するかconst_cast<>|const char *を経由|std::wcstombs()|std::wcstombs()|wchar_t *を経由|
|__`const char *`__|constを付与して宣言するかconst_cast<>|-|.c_str()か.data()|std::wcstombs()|std::wstring_convert<>かstd::wcstombs()|std::stringを経由|
|__`std::string`__|std::string()|std::string()|-|char *かstd::stringを経由|const char *かstd::wstringを経由|std::wstring_convert<>|
|__`wchar_t *`__|std::mbstowcs()|std::mbstowcs()|std::wstringを経由|-|std::wcscpy()で別に宣言する|const wchar_t *を経由|
|__`const wchar_t *`__|std::mbstowcs()|std::wstring_convert<>かstd::mbstowcs()|const char *かstd::wstringを経由|constを付与して宣言|-|.c_str()か.data()|
|__`std::wstring`__|std::string()を経由|std::stringを経由|std::wstring_convert<>|std::wstring()|std::wstring()|-|

std::wstring_convert\<>の具体的な中身はstd::wstring_convert\<std::codecvt_utf8\<wchar_t>>です。
その他にも、std::static_cast<>を使用することができるものもあります。

# 数値型を変換するときのチートシート
横が変換元、縦が変換先です。
*=明示的変換。

||__`int`__|__`char`__|__`float`__|__`double`__|__`std::string`__|__`const char *`__|
|-|-|-|-|-|-|-|
|__`int`__|-|*|*|*|std::stoi()|std::atoi()|
|__`char`__|*|-|*|*|intを経由|intを経由|
|__`float`__|*|*|-|*|std::stof()|std::atof()|
|__`double`__|*|*|*|-|std::stod()|std::atod()|
|__`std::string`__|std::to_string()|数値のcharはintを経由,文字のcharはstd::string()|std::to_string()|std::to_string|-|文字列型の変換チートシートを参照|
|__`const char *`__|std::stringを経由|std::stringを経由|std::stringを経由|std::stringを経由|文字列型の変換チートシートを参照|-|
Pythonの...ellipsis とpassの違いとは？

Pythonにおける...（ellipsis）とpassは、一見似たような役割を果たしますが、それぞれ異なる用途と意味を持っています。

### ...（ellipsis ）

ellipsis は3つのドットで表現され、もともとは型ヒントや特殊なケースで使用されていました。現在では、次のような用途に用いられることがあります。

- 未実装のコードを示すplaceholder
関数やメソッドの中身を後から実装する予定がある場合に、...を記述して「ここにコードが入る予定である」と示すことができます。

```python
def my_function():
    ...
```

- スライスのプレースホルダーとして使用
特にNumPyなどのライブラリで、データの一部だけを操作したい場合、エリプシスをスライスの一部として使い、「他の部分はすべて含む」という意味を持たせることができます。

```python
import numpy as np
array = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(array[..., 0])  # 先頭のすべての次元を含み、最後の次元のみ0番目を選択
```

```text
[[1 3]
 [5 7]]
 ```

- Python 3.10以降での型ヒント
Python 3.10以降では、list[float, ...]のように、任意のサイズのリストを示す型ヒントとしても使われるようになりました。

```python
def process_numbers(nums: list[float, ...]) -> None:
    print(nums)
    
process_numbers([1.2, 3.4, 5.6])
process_numbers([7.1]) 
process_numbers([10.0, 20.5, 30.1, 40.0])  
```

```text
[1.2, 3.4, 5.6]
[7.1]
[10.0, 20.5, 30.1, 40.0]
```


```python
from typing import Any

def process_data(data: list[Any, ...]) -> None:
    print(data)

process_data([[1, 2, 3], ["a", "b", "c"], ["a", "b", "c", "d"]])  
```

```text
[[1, 2, 3], ['a', 'b', 'c'], ['a', 'b', 'c', 'd']]
```

### pass文
pass文は「何もしない」文で、コードの構造を維持したいが、そこに処理を追加したくない場合に使用されます。

- 空の関数やクラスの定義
関数やクラスを作成する際に、まだ具体的な実装がない場合に使用します。passを使うことで、構文エラーを避けつつ「ここに将来的な処理を追加予定」であることを示すことができます。
```python
def my_function():
    pass
```

- 制御構造のプレースホルダー
if文やforループなどの制御構造内でも、passを使用して空のブロックを作成することができます。これにより、コードの実行を妨げることなく構造を維持できます。

```python
for i in range(5):
    pass  # 何もしないループ
```

### どちらを使うべきか？
- pass は、クラスや関数、制御構造などで明示的に「何もしない」ことを示したい場合に使用します。
- ... は、スライスや未実装のコードに使うことで、「この部分は未完成」であることや「特定の次元を含む」といった意味を示すことができます。

以上のように、passとエリプシスは共に「何もしない」ためのツールですが、その意味合いや用途に応じて使い分けが求められます。
開発を始める前にOSの概要

自分でOSを1から作ってみる Advent Calendar 2024の1日目です。
# そもそもOSって何?
まあこの記事を読むような人にOSが何か知らない人はいないような気もしますが一応。
OSはオペレーションシステムの略でデバイスの基本的な機能を提供するソフトフェアです。我々が使っているwebブラウザなどのアプリケーションはすべてOSがあるからこそ動いているのです。OSの基本的な機能としてはメモリ管理、プロセス管理、キーボードやマウス、ディスプレイ、プリンタなどの入出力デバイスとアプリケーション間のやり取りの調整、UIの調整などがあります。
OSといえばwindowsやMac、Linuxなどが思い浮かぶ人が多いと思いますが、実は他にもOSはたくさんあって、自分で作ることもできます。
# 今回作成するOSについて
実はPCにはマザーボードに格納されたBIOSというプログラムがあって、それがOSの読み込みなどをやってくれます。BIOSはUEFBIOSとレガシーBIOSというものがあり、近年のPCはすべてUEFIBIOSになって来ています。しかし、このUEFIBIOSというものはなかなか曲者で初心者にとってはレガシーBIOSの方が圧倒的に使いやすいと思います。なので今回はレガシーBIOS向けのOSを作っていこうと思います。
これだけ聞くとレガシーBIOSの方がいいように聞こえると思いますが、開発が難しくなるだけで機能は圧倒的です。あと実は大きいOSを作る人にとってはレガシーBIOSでは2段階でブートプロセスを行わないといけなかったりもします。
あと今回作るOSはとりあえずC言語を中心で作ろうと思います。まあ有名だし基本的な言語なので作りやすいということが理由です。
# C言語は使えない!?
C言語を中心にして開発していくといったばかりですが、自分で作ったOSでは当然C言語なんて使えません。なぜならば、既存のCコンパイラはすでにあるOSのためのものなので、自作のOSでは使うことができないからです。なのでOSを作るためにはアセンブラも使っていかなければなりません。
# 今後の流れ
次の回からは実際にOSを作っていこうかと思っていますが、だいぶ面倒くさいと思います。しかし、本当にOSを作れるようになれば、OSを作れるというだけではなく、プログラミング系のすべてのことに対しての理解が深まると思います。一般には難しいと思われているポインタなどもこれが分かれば簡単に思えると思います。なのでぜひ頑張ってみてください。ただ面倒なだけの部分はコピペでいいと思いますが。
ABC379をPythonで（A～E）

トヨタ自動車プログラミングコンテスト2024#11(AtCoder Beginner Contest 379)の解答等の速報的まとめ

https://atcoder.jp/contests/abc379



# A問題
https://atcoder.jp/contests/abc379/tasks/abc379_a

入力を受け取って並び替える
```python:A
a,b,c = input()
print(b + c + a, c + a + b)
```
# B問題
https://atcoder.jp/contests/abc379/tasks/abc379_b

連続でk個Oがあったとき+1する
```python:B
n, k = map(int, input().split())
s = input()

ans = 0
cnt = 0
for s_i in s:
    if s_i == "O":
        cnt += 1
    else:
        cnt = 0

    if cnt == k:
        ans += 1
        cnt = 0

print(ans)
```
# C問題
https://atcoder.jp/contests/abc379/tasks/abc379_c

各$x_i$でソートした後、隣接した$x_i, x_{i+1}$間を計算すればいい
```python:C
def calc(s):
    return s * (s + 1) // 2 if s > 0 else 0


n, m = map(int, input().split())
x = list(map(int, input().split()))
a = list(map(int, input().split()))


data = [(x_i, a_i) for x_i, a_i in zip(x, a)]
data.sort()
if sum(a) != n:
    exit(print(-1))

if data[-1][0] < n:
    data.append((n, 0))

last = 1
cnt = 0
ans = 0
for x_i, a_i in data:
    if x_i - last > cnt:
        exit(print(-1))
    ans += (x_i - last) * cnt - calc(x_i - last)
    cnt = cnt - (x_i - last) + a_i
    last = x_i

print(ans)
```
# D問題
https://atcoder.jp/contests/abc379/tasks/abc379_d

鉢植えの高さを植えた時間を基準に見ればheapqでできる
（入れた順に先頭から出すだけなのでdequeでいい）
```python:D
from heapq import heappop, heappush

q = list()
time = 0
last = 0
for _ in range(int(input())):
    com = list(map(int, input().split()))
    if com[0] == 1:
        heappush(q, time)
    elif com[0] == 2:
        time += com[1]
    else:
        ans = 0
        while q and q[0] <= time - com[1]:
            ans += 1
            heappop(q)

        print(ans)
```
# E問題
https://atcoder.jp/contests/abc379/tasks/abc379_e

sが小さければ以下のようにすればいい
```python:demo
n = int(input())
s = input()

ans = 0
last = 0
for i, s_i in enumerate(s, 1):
    diff = diff * 10 + int(s_i) * i
    ans += diff

print(ans)
```
ただこのままだと、問題の設定でオーバーフローするので各桁ごとに計算する。

```python:E
n = int(input())
s = input()

accu = [0] * n
for i, s_i in enumerate(s):
    accu[i] += int(s_i) * (i + 1)

for i in range(n - 1):
    accu[i + 1] += accu[i]

lst = []
d = 0
for a_i in accu[::-1]:
    d += a_i
    lst.append(str(d % 10))
    d //= 10

ans = "".join(lst[::-1])
if d:
    ans = str(d) + ans

print(ans)
```
ESP32-S3 SD高速ファイル一覧取得

## Arduino IDEでファイル一覧の取得が遅い

2024 年現在でも、国内ではなぜか古い方法しかヒットしないためメモします。

ESP32 の Arduino IDE では、SD カード内のファイル一覧を取得する場合、SD.h を使用する古い方法しか検索でヒットしません。次のような感じです。

```c:以前の方法（遅い）
#include <SPI.h>
#include <SD.h>

...

  if (SD.begin(CS_PIN)) {
    FILE root = SD.open("/"); // ルート
    while (1) {
      File entry = root.openNextFile();
      if (!entry) {
        break;
      }
      if (!entry.isDirectory()) { // ディレクトリでなければ
        String fileName = entry.name();
        ... 
      }
    }
    root.close();
  }

```

この、旧来の方法はすべてのファイルをopenしているため非常に遅い処理となっています。

## FS.hを使った方法（超高速）

[FS.h](https://github.com/espressif/arduino-esp32/blob/master/libraries/FS/src/FS.cpp) で新たに定義された``getNextFileName``を使うとファイルのオープンを行わないため高速にファイルのシークが行えます。

```c:新しい方法
#include <SPI.h>
#include <FS.h>
#include <SD.h>

...

  bool isDir;
  
  if (SD.begin(CS_PIN)) {
    File root = SD.open("/");
    while (1) {
      String fileName = root.getNextFileName(&isDir);
      if (fileName == "") break; // ファイルがない場合
      if (isDir) break; // ディレクトリの場合
      ...
    }
    root.close();
  }

```
【Unity】3Dゲームは Virtual Camera か Cameraか

３人称視点のカメラを作りたかったのですが、うまくいかず、Virtual Cameraを導入しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/0aef8890-2eb1-6f9a-c550-3756d1819f25.png)


<font color="red">>## 24/11/10現在、Virtual Cameraに再度トライ中</font>

ただこれ、3.1.2は過去とAPI仕様が変わっていて、
　Follow
　LookAt
プロパティがなくなっていました。
→2以前で使っていた方は、Updateすると設定が適用できるらしいです。

調べたところ、
　Cinemachine Orbital Follow
をコンポーネントに追加すれば、ターゲットに追随してカメラを動かすことはできました。
（アンストしてしまったので画面ないですが、確か Traking Target にプレイヤーのGameObjectを設定すれば可能）

ただ、上のコンポーネントを使うと、positionが固定されてしまい、スマホのフリックに追随して回転させる、ということができなかったので、アンストして自前でいくことにしました。

一人称視点や、Steamなど決まった操作で動かす場合には、Virtual Cameraは有用かもしれません。
特にTerrainや壁の裏側を見えないというのは楽ですね。

Cinemachine Collider だけを使うということもできそうですが、今回は狙ったカメラワークにならなかったため、使いませんでした。

※続き（自前のCameraでどう実装したか）は、そのうち記載します！
 ちなみに、Cinemachine導入前・後で作成したモジュール(aab)の差は1.9MBでした。
react-routerでルーティングしているSPAをapacheで公開する


## 1. やりたいこと


react-routerやRemix SPAモードでビルドしたindex.htmlをapacheで公開したい


## 2. どうすれば良いか


### 2-1. リダイレクトを設定する


.htaccessファイルに以下を追加すればapacheがリダイレクトしてくれます


```apache:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]
```


上記のように設定すると、URLにファイルもディレクトリも存在しない場合にindex.htmlにリダイレクトされます。このとき、開くファイルはリダイレクトされていますがブラウザはURLを維持しているので、JavaScriptからURLを取得することでルーティングが適用されます


### 2-2. リダイレクトを有効にする


上記で上手く動かない場合はリダイレクトが無効になっています
その場合はhttpd.confに追加してrewrite_moduleとリダイレクトを有効にしてやります


```apache:/usr/local/apache2/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/usr/local/apache2/htdocs">
    AllowOverride All
    Require all granted
</Directory>
```


## 3. 全部httpd.confに書く場合


.htaccessでなくhttpd.confに同じ内容を書くこともできます
ドキュメントルートは別のところからvolumeでマウントしてきてたりするので、その場合はこっちの方がやりやすそう


```apache:/usr/local/apache2/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/usr/local/apache2/htdocs">
    Require all granted
    AllowOverride None
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.html [L]
</Directory>
```


## 参考にした記事


https://qiita.com/mugrow/items/3d89e836b29c0b3d2534
WindowsのDドライブにUbuntu24.04をインストールしてかんたんデュアルブート

### 個人PCのWindowsとUbuntuのデュアルブートは簡単に行える。


#### 前提
- CドライブにWindowsのシステムファイルのすべてが入っている。
- 万一の時のためにブート可能なWindows11ディスクイメージ(ISO)を作成した。
- rufusなどでusbにubuntuのブートメディアを作成した。
- usbから"Try Ubuntu"でLinuxに入った。以降Linuxで作業を行う。
- "disk"でDドライブに対応する場所(sda5など）を把握し、さらに"gparted"を使いDドライブをext4でフォーマットした。  

### 本題
- 「手動でパーティーションを編集する」でインストールする。
- ＋ボタンでDドライブに対応する場所を開き<u>マウントポイントを「/」にして</u>再度ext4でフォーマットしインストール完了。　


<br>



起動順位が気に食わない場合はメモ帳で

　/etc/default/grub

を開き

　GRUB_DEFAULT=0を
　GRUB_DEFAULT="Windows Boot Manager (on /dev/sda1)" ("sda1"は起動時に表示される場所)

などに変更する。


```
sudo update-grub
```

を実行し再起動すれば何もしなければ通常通りWindowsが立ち上がる。

<br>

時刻がずれるので

```
sudo timedatectl set-local-rtc 1
```

を打つのを忘れない。
RuntimeInitializeOnLoadMethodの実行順

`RuntimeInitializeLoadType` の指定による実行順序のメモ

1. SubsystemRegistration
2. AfterAssembliesLoaded
3. BeforeSplashScreen
4. BeforeSceneLoad
5. AfterSceneLoad


https://docs.unity3d.com/ja/2021.1/ScriptReference/RuntimeInitializeLoadType.html

検証コード
```c#
public class Initializer
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    public static void AfterSceneLoad()
    {
        Debug.Log(nameof(AfterSceneLoad));
    }
    
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void BeforeSceneLoad()
    {
        Debug.Log(nameof(BeforeSceneLoad));
    }
    
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
    public static void AfterAssembliesLoaded()
    {
        Debug.Log(nameof(AfterAssembliesLoaded));
    }
    
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
    public static void BeforeSplashScreen()
    {
        Debug.Log(nameof(BeforeSplashScreen));
    }
    
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
    public static void SubsystemRegistration()
    {
        Debug.Log(nameof(SubsystemRegistration));
    }
}
```
SleniumでiFrameのある要素を取得するには

### 環境

Ruby2.6
selenium

### 内容

ブラウザからDevToolsでElementsを確認すると、要素は確かに存在するが、SleniumからHTMLの要素を指定すると、**no such element** のエラーが出るときがあります。そのような場合は、**iFrame**が使われている可能性があります。

```sample.rb
puts driver.page_source
```

そのような事象が発生したときは、Sleniumから取得しているHTMLを調べてみよう。標準出力させてテキストにリダイレクトすれば簡単に確認することができます。

iFrameを使っている場合、DevToolsで表示されるように、すべてのHTMLが展開された形式で表示されるわけではありません。リダイレクトして取得したテキストファイルから要素を検索してみてください。iFrameを使っていれば、検索しても要素見つからないはずです。存在しない要素を指定したため、当然**no such element** と出てくるはずです。

iFrameを複数使っている場合は、どこのiFrameに該当の要素が含まれているかは、１個１個確認していく他ありません。

iFrameのタグでid = hogeで指定されていた場合は、この１行でiFrameを展開させることができます。

```sample.rb
driver.switch_to.frame 'hoge'
```

やり方は１つだけではなく、他にも色々とやりようはあるようです。

参考URL
https://www.selenium.dev/ja/documentation/webdriver/interactions/frames/
ディレクトリツリーと作成日時などのメタデータを取り出す python module

# TL;DR

入力されたディレクトリ以下のディレクトリと下記メタデータを取り出して JSON 形式で出力する Python module を作成しました。

| 項目 | 説明 |
| :----| :---|
| type | "Directory" or "File" |
| parent | 親ディレクトリの名前 |
| basename |ファイルのベース名 |
| hasPart |ディレクトリの場合、格納されているファイルとディレクトリのリスト | 
| contentSize | ファイルサイズ (bytes)|
| creationDatetime | 作成日時|
| modificationDatetime| 更新日時|

# 背景

ディレクトリツリーを出力するコマンドと言えば `tree` です。作成日時やファイルサイズなどを確認したいときは `ls` コマンドがよく利用されるでしょう。これらの両方を一覧で取得したい、そんな場面に私が遭遇しました。

これらのコマンドと他の様々なコマンドを組み合わせて、指定されたディレクトリ内のディレクトリおよびファイルのメタデータ（ファイルのベース名、サイズ、作成日時など）を取り出すことはできると思います。しかしながら CLI に不慣れな私にとってそれを作ることは正直面倒でした。それよりも普段使いしている Python を利用する方が楽だと感じ、コマンドラインツールを作りました。下記 GitHub リポジトリにて公開しています。

[Surpris/directory-structure-py](https://github.com/Surpris/directory-structure-py)

# インストール方法

## リポジトリから直接インストール

```sh
pip install git+https://github.com/Surpris/directory-structure-py.git
```

## ポータブル（Windows のみ）

2024/11/9 時点では [v0.1-portable](https://github.com/Surpris/directory-structure-py/releases/tag/v0.1-portable) で Windows 用 exe ファイルをリリースしています。そちらをダウンロードして展開することで利用可能です。展開先には batch ファイルと exe ファイルが入っていますが、batch ファイルの方にディレクトリツリーを取り出したいフォルダ or ファイルを drag & drop することで利用可能です。

# 使い方（pip インストールした場合）

基本的には `python -m` で使用できます。

```sh
python -m directory_structure_py <file_or_directory_path> \
    --dst <output_path> \
    --include_root_path \ // option
    --in_tree \ // option
    --to_tsv // option
```

オプションの説明は次の通りです。

|オプション | 説明 |
|:--- | :--- |
| dst | 出力先ファイルパス。このオプションがない場合、入力されたディレクトリまたはファイルが存在するディレクトリに結果が出力されます。|
| include_root_path | オプションが付いている場合、入力されたディレクトリまたはファイルのフルパスを含める。|
| in_tree | オプションが付いている場合、`hasPart` の中にディレクトリ内のデータのメタデータが含まれる形で出力されます。|
| to_tsv | オプションが付いている場合、TSV 形式でも結果を出力します。|

# アルゴリズムの説明

複雑な処理は入れていません。核となる関数は次の四つです。

* [get_metadata_of_single_file](https://github.com/Surpris/directory-structure-py/blob/main/directory_structure_py/src/main.py#L17)
* [get_metadata_of_files_in_list_format](https://github.com/Surpris/directory-structure-py/blob/main/directory_structure_py/src/main.py#L65)
* [_construct_tree](https://github.com/Surpris/directory-structure-py/blob/main/directory_structure_py/src/main.py#L158)
* [list2tree](https://github.com/Surpris/directory-structure-py/blob/main/directory_structure_py/src/main.py#L215)

## get_metadata_of_single_file

この関数は `pathlib.Path` クラスを利用してディレクトリまたはファイルのメタデータを取り出し、Dict 形式で出力します。

## get_metadata_of_files_in_list_format

この関数は再帰型関数です。`get_metadata_of_single_file` を使って取り出されたメタデータをリストにして出力します。メタデータリストは `contents` キーに格納されます。

## _construct_tree

この関数は再帰型関数です。`get_metadata_of_files_in_list_format` により出力されるメタデータリストに基づき、各ディレクトリの `hasPart` に含まれる名前に対応するディレクトリまたはファイルのメタデータを、そのメタデータリストから引っ張ってきて `hasPart` 内の名前と置き換えます。

## list2tree

この関数は `_construct_tree` のラッパー関数です。`_construct_tree` により出力されるメタデータツリーを `contents` キーの値として格納し、結果を出力します。

# まとめ

本記事では私が作成した、ディレクトリと `pathlib.Path` で取得できるメタデータを取り出して JSON 形式で出力する Python module である [directory-structure-py](https://github.com/Surpris/directory-structure-py) を紹介しました。このツールの出力結果は JSON 形式であり、これをヒトが見やすい形式で表示するツールの追加も検討しています。このツールの不具合や機能要望があればぜひ [Issues](https://github.com/Surpris/directory-structure-py/issues) に投稿いただければ幸いです。
dfとduがなぜか違う

df と du で報告されるディスク使用量が異なるという現象に出会いました。

df はファイルシステムが思っている使用量を返します。

du はファイル1つ1つのサイズを足し算した使用量を返します。

両者はほぼ同じ値を返すはずです。ところが、さまざまな理由で差異が出てきます。

私が出会ったのはこんな感じでした。

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        25G   18G  2.1G  71% /
/dev/sdb1        41G  115M   40G   1% /mnt/hoge

# du -sh /
6.5G    /
```

-----

6.5Gしか使ってないはずなのに、ルートパーティションは18Gも使っていることになっています。

検索してよくでてくる話は、プロセスが消したファイルを掴んでいて、df の方が大きく見えるという原因です。

`lsof /` あるいは `ls -la /proc/*/fd/* | grep deleted` で調べられます。

対処は、対象のプロセスを再起動する方法もありますし、OSごと再起動してしまうのも手でしょう。

しかし、私が経験したのは別の原因でした。

-----

原因：マウントポイントのマウント前にファイルが大量にあった。

```
# umount /mnt/hoge

# du -sh /
18G     /
```

いや、そこで食ってるとは思わないやん

![スクリーンショット 2024-10-13 192408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/24f0892c-6160-96b3-9107-189ed01afae2.png)

・・・

同様の現象に出会った方は「いいね」お願いします m(_ _)m
約10分でPythonで九九アプリを作る！

## イントロ

私の子供はどうも勉強嫌いが度を過ぎる傾向があり、どうしても宿題したくないという感じで手を焼いています。最近になって九九も間違うという感じ、でも練習したがらないという状況になっており、どうしたもんかという気になっていたんですが、幸い幼稚園のころから簡易的なプログラミングアプリは好きだったりしたので、九九アプリを作りながらなら勉強してくれるんじゃないか？と思い立ち、簡単な九九アプリを作ってみました。

## 条件

九九アプリは世の中にいろいろ転がっているんですが、ブラックボックス過ぎてもと思い、その場でコーディングしながら自前で作ろうと思いました。ただ、あんまり時間をかけるのもアレなので、「5分程度」でサクっと作れるというのが良いなぁと思い、UIは頑張らずコマンドライン操作できるもので、そんなに複雑なことをしなくてよさそうなPythonで作ってみました。

## 環境
とりあえず開発～実行で必要なソフトウェアはこんな感じ。
- Python 3.12.4
- Window PowerShell 5.1
- Visual Studio Code 1.95.2

## Ver.1 とりあえず動くものを。

まずは、とりあえず動けばいいので、何も考えずにざーっと、、、
```python 
# ライブラリのインポート
import random

# 変数の設定
times = 10

# プログラムの開始
print('これは九九アプリです。')

for i in range(1, times + 1, 1):
    print('----------------------------')
    a = random.randint(1, 9)
    b = random.randint(1, 9)
    print(str(a) + '×' + str(b) + 'は?' )
    kotae = a * b

    kaitou = int(input())
    print('あなたの回答：' + str(kaitou))
    if kotae == kaitou:
        print('正解!')
    else:
        print('間違い!')

# プログラムの終了
print('----------------------------')
```
という感じで、九九の問題を自動生成し、回答を入力すると正誤判定する形にしてみました。ここまでおおよそ5分ぐらい、Pythonインストール入れても10分ぐらいだったでしょうか。

## Ver.2 せっかくなので見直してみる。
実際に子供にやらせてみると、ところどころ間違うんですが、ただ正誤判定だけだといまいちなので、間違ったら何度もやり直させたりして学習がちゃんとできるようにしたいと思いました。また、せっかくなので正解数をもとに点数もつけてみたり、時間を計ってみたりとゲーム要素も追加。

```python
# ライブラリのインポート
import random
import time

# 変数の設定
point = 0
times = 10

# プログラムの開始
print('これは九九アプリです。')
print('開始するにはEnterを押してください。')
input()

start_time = time.perf_counter() 

for i in range(1, times + 1, 1):
    print('----------------------------')
    a = random.randint(1, 9)
    b = random.randint(1, 9)
    mondaibun = str(a) + '×' + str(b) + 'は?' 
    print(mondaibun)
    kotae = a * b

    while True:
        kaitou = int(input())
        print('あなたの回答：' + str(kaitou))
        if kotae == kaitou:
            print('正解!')
            point = point + 1
            break
        else:
            print('間違い!')
            point = point - 1
            print('もう一回答えてください。')
            print(mondaibun)

# プログラムの終了
end_time = time.perf_counter() 
print('----------------------------')
print('あなたの点数は' + str(point) + '点です。')
print(str(times) + '問解くのにかかった時間は' + str(int(end_time-start_time)) + '秒です。')
```
という感じに見直してみました。


実際に動作させてみると、こんな感じになります。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276592/8074aff3-e6ca-e467-ee2a-cf5cf1da11b4.png)


## アウトロ

実際に子供にやらせてみると、意外とすんなり使ってくれたし、九九の計算をランダムで出すのは結構面倒なので意外と良かったです。あと、子供の目の前でコーディングしながら作っていたのもあり、徐々にアプリが進化していくのが楽しかったようですね。

正直、作りとしては簡単すぎる気もしますが、子供の勉強意欲を出すにはこういうぐらいがちょうどいいのかも。
では。
【個人開発】財務諸表データを速攻で確認できるアプリをリリースした🎉

# 目次
- 財務諸表って見たことあります？
- 財務諸表検索アプリ「Compass」の技術スタック、構成の紹介
- 最後に

# 財務諸表って見たことあります？
　みなさん、企業の財務諸表を見たことはありますか？

　財務諸表とは企業の財務状況や経営成績をまとめた書類のことで、企業の1年間の「健康診断書」や「成績表」とも呼ばれています。

　財務諸表の中でも貸借対照表（B/S）、損益計算書（P/L）、キャッシュ・フロー計算書（C/F）は「財務三表」と呼ばれ、特に重要な書類とされています。

　...という説明をどこかで見たり聞いたりしたことはあるけれど、実際に財務諸表を見ようと思うと、企業のホームページに行って決算用のページに行って時には書類をダウンロードして...となかなか手間がかかります。

　そこで、財務諸表のデータを簡単に検索できるアプリ「Compass（コンパス）」を作りました！ユーザを企業の世界へと導いていく道しるべ（コンパス）になってほしいという願いと、企業（Company）へのパス（pass）になってほしいという願いを合わせて「Compass」と名付けました。
 
　アプリは以下のURLでリリースしているのでぜひ覗いてみてください！
https://compass-fr.com

# 財務諸表検索アプリ「Compass」の技術スタック、構成の紹介
　次に、今回作成したCompassで使用した技術、サービスをご紹介します。

### 技術スタック
- フロントエンド：React
- バックエンド：Go

　Goに関しては並列処理を簡単に記述できるため、バッチ処理など大量のデータを並列で処理したい場合は非常に有用です。Compassでは企業の財務諸表データを取得、加工するバッチ処理でgoの並列処理を使うことで処理時間をかなり短縮することができました。

### アーキテクチャ
　AWS をフル活用したアーキテクチャになっています。今回使用した主なサービスは以下の通りです。

- フロントエンド
  - Amplify（Reactアプリをホスティング）
- バックエンド
  - API Gateway（APIの受け口、Lambdaへの橋渡し）
  - Lambda（API Gatewayからのリクエストを処理）
- DB
  - DynamoDB（企業データを管理）
- その他
  - S3（財務諸表データなどを管理）
  - Route 53（ドメインを管理）

構成図▼
![compass-arch.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930855/aee8bbc2-f9e8-e527-e7f1-6f08b1fec28c.png)

### 工夫したポイント
　個人開発ということもあり、運用コストをなるべく抑えることを考え、使った分だけ料金を支払う「従量課金」で使用できるサービスを選びました。フロントエンドのAmplify、バックエンドのLambdaに加え、DynamoDBもキャパシティーモードをオンデマンドに設定することで従量課金の設定をすることができます。

# 最後に
　近ごろ投資に関する話題が盛り上がっていることもあり、企業の経営、財務状況を知ることの価値が以前より高まっているように感じています。企業分析の際にCompassが少しでもお役に立てば幸いです。

 　技術的な観点で言うと、個人開発で最もネックになる価格のことを考慮すると、Compass で用いた Amplify（フロント）+ Lambda（バックエンド）+ DynamoDB or S3（DB/ストレージ）の構成は選択肢になり得るのではないかと思います。皆さんもぜひ試してみてください！
イベントリポート「ITエンジニアのためのミートアップイベント2024 October」

## エンジニア2年生と25年生がキャリアをテーマにコラボLTしてみた！

LiON（LinuC Open Network）運営メンバーのにしかわです。
今回は、10月24日(木)に開催した「ITエンジニアのためのミートアップイベント2024 October」のイベントリポートを書きましたので、ご一読いただけると幸いです。
![スクリーンショット 2024-11-09 21.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951855/92df62db-f78b-2f18-4e2e-448b7bb2f13b.png)

このイベントのメインは、日本PostgreSQLユーザ会理事長の喜田紘介さんをお招きしてのトークセッションですが、その前談として、LiONメンバーの社会人2年生のSumireさんと『私のキャリア』をテーマにコラボLTさせていただきました。

### ノリで実現！
LiONでは、毎月イベントを開催しています。
オンラインとリアルで交互にやっているのですが、前回(8月)のリアルイベントにSumireさんが参加されていました。LinuC101勉強会の時にお話しさせていただいていて、印象に残っていたので、ノリで声を掛けさせていただき実現した自分の中では激アツの企画でした 笑

### 発表はバッチリ！
![20241024_192416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951855/7d54be48-bee6-fc90-d2d2-fd79c6ed4cc9.jpeg)

LTはSumireさんがメインで話をして、私が口を挟む形式で発表しました。
15分の待ち時間でしたが、テンポよく時間配分もバッチリ！！
Sumireさんは、JAVAのコミュニティにも参加されていて、発表も慣れていらっしゃる感じで、安心して発表していました。
でも、見守り感がすごいと後で笑い合ってましたけどね！

### キャリアって今も昔も同じ？
このLTの資料を作る過程で、気づいたことがあります。
タイパ、コスパと言われる今ですが、2年目でも25年目でも、それほどキャリアの考えは変わっていないということ。
コラボしようとは言ったものの、実は心の中では全然話が合わなくてやめようかとならないかなと心配してました。
Sumireさんが提示してきた資料を読んで、『おぉぉー、一緒やん！』と気づいたんです。
目標が講師や育成というところが大きな要因ではあるのですが、二人とも言語からスタートして、Sumireさんがこれから身につけたいもの、私が身につけてきたもの、これが本当にしっくりくるほど合致するのです。
- 様々な言語の<font color="LightCoral">仕様や設計思想</font>
- <font color="LightCoral">インフラ技術</font>（AWS、Docker）
- <font color="LightCoral">フレームワーク</font>（Spring Boot, Spring Security, JPA, Log4j）
- <font color="LightCoral">非機能要件</font>について（Webセキュリティ、パフォーマンスチューニング）
- <font color="LightCoral">心理学</font>、<font color="LightCoral">経営</font>や<font color="LightCoral">簿記</font>など

これらはSumireさんが身につけたいと思っているスキル、私は全部学んできました。
20年前も今も同じキャリアを身につけたいと思っている。
ということは、私からSumireさんの世代に受け継いでいけるものがたくさんあるってこと。
これはかなりのモチベーションアップにもなりましたし、Sumireさんが2年目でここまで
考えているということに驚きと尊敬もあります。

### 若い人から見た自分を再発見！
Sumireさんの感想としては、 ”大ボスみたいなにしかわさんが、実は大学では単位も取れなかったほど出来なかったことが新鮮で驚いた” とのこと。
言われてみれば、長年頑張ってきて、気づいたらコミュニティの運営までしてる。
でも、大学では3年間連続でC言語の単位を落とすほど出来なかったんです。
第二新卒枠でようやく入った会社でも、ボーナスが同期の半分というほどの出来の悪さ 笑
誰でも最初は初心者、頭の良さも人それぞれ。
私は、幸運にも、悔しさをバネにする力、人より努力する力があったので、Unix、Oracleと暮らしているんじゃないかと思うほどコマンド打ちまくって失敗を重ねて身につけたところから、キャリアが好転し始めます。
その後も紆余曲折はありましたけどね 笑
そんな話は若い方には新鮮なのかも知れません。
自分のキャリアを振り返る良い時間にもなりました。

### LTやってみよう！
LTってイベントで長い時間枠をもらって話したり、セミナー登壇したりするよりずっと身軽にハードル低く発表できます。
気づきももらえるし、聞いてくれた方々と繋がれたりもする。
懇親会のネタにもなりますしね 笑
興味あったら、ぜひLiONでLTしてください。
初心者の方も大歓迎です。

ここまでお読みいただきありがとうございました。
これからもLiON、そして日本のエンジニア文化を盛り上げるために頑張っていきます！

#### Special Thanks : 
#####  　　Sumireさん、LiON運営の皆さん、参加してくれた方々
【組織運営】デジタル創作サークルUniProjectができるまで(笑)


初めまして。

デジタル創作サークルUniProjectを創設、運営しているあかつきゆいとです。

今回は、UniProjectがいかにしてここまで成長したかをつらつら書いていきたいと思います。

## そもそもUniProjectってなんやねん

**デジタル創作サークルUniProject**とは、Discord上で活動しているプログラミングやデジタル絵、音楽制作など**デジタル創作活動を広範に行う誰でも入れるオンラインサークルです**。
おかげさまで、現在はメンバーも50人を突破し、ゆるーくふわっと活動しています。

https://uniproject-tech.net

## まずは外から見えるところから

とりあえず、簡単な方、**外部に対する宣伝など**ですね。

### まずは仲間内に

**何はともあれ仲間内から声をかけよう**。

私も最初は元から知り合いであった方達に声をかけました。
今もずっと変わらず活動を続けてくださっています。

元々からの知り合いが一番活動してくれる人だと思ってください。
まず、ここでどれだけの知り合いを引き込めるかも勝負です。

### 信頼できるプラットフォームに流す

これは、なかなか真似できないかもしれません。
私はS高等学校に在籍しているので、学園のチャットツールとして、Slackがあり、そこで宣伝をしました。

学園のSlackというだけで、ある程度検閲が入るので、信頼されやすくなると考えています。
大学生の方であれば、学内に広告貼ったりとかでもいいかもしれませんね。
(社会人の方であれば社内の掲示板とかに貼れるのかなぁ...)

### 何をやっているかを明確にする

何やってるところかあんまり想像つかないところには人が来にくいことがあるので、何をやっているか明確にすることも結構大事です。

ちなみに、UniProが何をやっているかというのは、これを見てもらえばだいたいわかるかと思います。

https://qiita.com/organizations/unipro-tech/profile

## 目に見えないところもしっかりと

お次はこちら。これが本当に難しい。私も試行錯誤、反省の繰り替えです。心がけていてもついNG行動をしてしまうこともあります...

そんな外から見えない部分や、そもそも目に見えない部分についての話です。

### 初めは軽い気持ちで

UniProの正式な発足日'24/04/01ですが、実は'23/12/31にはもうメンバー募集が仲間内でかかっていて、すでに何名か(現役員を含め)集まっていました。

元々、私が勝手に、**東京科学大学(旧東京工業大学)デジタル創作同好会traP**さんみたいなことをしたいとか言っていたのが発端で、要は**気軽なノリ**で作ったのが始まりでした。

何が言いたいかというと、**初めは軽い気持ちで初めてみるのもいいんじゃないかなぁ**ということです。
特に我々みたいなサークルのように、非営利であるならば尚更だと思います。

### ゆるーくふわっとの原則

UniProでは**ゆるーくふわっと**をモットーにしています。

みなさん、何かしら組織に参加したときに、どう思いますか？「活動しなきゃ」、「ダラダラしてたら迷惑かけちゃうかも」と思ったことありませんか？私ははあります。実際、そういう重圧で入りづらさを感じることもあると思います。

先の軽い気持ちで、という部分もそうですが、ゆるーくふわっとを心がけることで、**できる範囲でいいんだよ**という感覚を持って欲しいと思っています。軽い気持ちで参加して、まずは楽しさを感じてもらう、というのが大切だと思っています。

### 自分が積極的に活動する

当たり前みたいなこと言いますが、**活動してなんぼです**。
で、自分が積極的にやっていれば、**そのうち人が集まってきます**。

言い出しっぺが活動していないと、みなさんどう思います？「こいつ口だけかよ」とか、「さっさと動けよ」とかって私は思ってしまいますね...

だから、まずは、**運営がしっかり動いて、本気であることを示す**というのが結局一番大事なんじゃないですかね。

### なるべくネガティブにならない

これは、**こんなこと言っておきながら、まだ私は達成できてないです()**

なので、一般論での話です。ここは、UniProとして、というより、私の改善すべき点でもあるのですが、**人の意見を過度に否定しない**こと、これもだいぶと大事だと思っています。
~~達成できてないやつが何言ってんだという話ですが、~~ 心理的安全性という部分でも、過度に否定しすぎないというのはとても大切なことだと思っています。

## 技術系ならではの…

今まではどういったコミュニティでもある話ですが、今度は**UniProjectという技術系サークルならではの**ことを少し話そうと思います。

### 初心者さん向けのワークショップとか開いてみる

初心者さんって、Qiitaとか見てやってると思うんですよね。
ただ、それでも、わからない部分が多々あるわけで、**ワークショップなどを開いて一緒にやってみる**とかっていうのも、最初の第一歩としてはいいのかなぁと思いますね。

過去のWSですと、DiscordBotをJSやPythonで作ったりしましたね。
そろそろ(運営も多忙なんですけど)、やりたいなぁとは思ってます。

## まとめ

こんなところですかね。

要点は、

- ゆるふわをモットーに縛りをなるべくゆるく
- 初心者さんに優しく
- 宣伝をよく考えて流す

ってだけですね。