OmniAICreator/Qiita-1.07M huggingface dataset:
schemeを作ろうと思ったが難しかった（中間報告）

## 要約
Common Lisp のサブセットのインタープリタは（趣味で）何回か作った事のある私が、Schemeのインタープリタを趣味で、作ろうとしたら、大変苦戦中。
Common Lisp も Scheme も同じ Lisp系の言語として、同列に語られがちだが、インタープリタの作り方は、全く異なる。

**似て非なる言語である。**



## Schemeは、あなどられているかも知れない。

Schemeについて、よく聞く噂（都市伝説）として以下のものがある

> Schemeの仕様書は５０ページしかないので、誰でも簡単に作れる。
> 一番最初に自作言語作って遊ぶのなら Schemeでしょ。

とんでもなく、間違っていると、私は思う。
Common Lispのインタープリタを何回か作った私でも、頭を抱えて悩むくらいの難しい機能のオンパレードだ。

## 難しい機能の例

### call/cc

これが、Common Lispと、Schemeを区別する一番有名な機能かも知れない。
幸いこれには、日本語で読める大変良い記事があった。

https://daretoku-unix.blogspot.com/2015/01/3imp-1.html

私は、この記事を読んでschemeの自作を始めた。約１ヶ月で、call/ccが動くようになった。


### Tail リカージョンの最適化

私はschemeをJavaで作成している。
Clojureを作った、天才のリッチヒッキーさんでさえも、JavaのVMは関数型言語用に設計されていないので、「Clojure(on Java VM)で、Tail リカージョンの最適化をするのは無理」と書かれていた。

### 衛生的マクロ
define-syntax, syntax-rules という、Common Lispとは違うマクロシステムを搭載している。

これについて、色々検索してみたが、参考になりそうな日本語の記事は２つしか見つかっていない。

https://yhara.jp/RoadToSyntaxRules

https://practical-scheme.net/gauche/man/gauche-refj/makuro.html

後者は gauche という　schemeインタープリタを作成されている、川合史郎さんのページだ。

ただ、この２つの記事を読んでも、衛生的マクロの作り方は、よくわからないというのが正直な感想だ。
私の自作インタープリタ作成は、現在この衛生的マクロと格闘中。
年内にはなんとか動くようにしたいと思っているが、全く目処はたっていない。

### defineの中にdefineが書ける

こちらのページの例をお借りすると
http://www.nct9.ne.jp/m_hiroi/func/abcscm10.html

```Lisp
(define (my-map func)
  (define (map1 ls)
    (if (null? ls)
        '()
        (cons (func (car ls)) (map1 (cdr ls)))))
  map1)

```

こんな事が出来てしまう。

Common Lisp で局所関数を定義するための flet と labels は、なんてインタープリタやコンパイラを作成する人に優しいんだろうと感心してしまった。

そして、私は、defineの中にdefineを書く文を、インタープリタで実装する方法が全く思い浮かばない。


### ラベル付きlet

```Lisp:通常のlet
(let (<束縛仕様>*) <末尾本体>)
```

```Lisp:ラベル付きlet
(let <変数> (<束縛仕様>*) <末尾本体>)
```

ラベル付きletは、たぶんCommon Lispにはない筈。
letの次の変数は、何に使うかというと、この変数名を関数として呼び出すとループになる。（驚き）


### condも意外な違い

```
(cond <節1> <節2> ...)

<節> は二つの形式のいずれか一つをとる。
(<テスト> <式1> ...)
ここで <テスト> は任意の式である。あるいは 
(<テスト> => <式>)

```

Common Lispの t が elseに変わるのは知っていたが、 =>という構文は初めてみた。（驚き）

### 他にも色々

書き出すと、キリがないので、このあたりにしておくが、
- 分数
- exact (正確数), inexact
- char-foldcase

などに、苦しめられた。（今も苦しんでいるかも）


## インタープリタ作成者のための日本語の記事は本当に少ない

『schemeを学習するための日本語の記事は多数ある。』
色々な大学のサイトにも、schemeを学習するための資料がある。
（ほとんどが2000年頃だが、今でも大学で、schemeを教えているのだろうか。それとももうパイソンに変わっているのだろうか。気になる）

『しかし、インタープリタ作成者のための日本語の記事は本当に少ない』



**もしSchemeの仕様書は５０ページしかないので、誰でも簡単に作れる**
が本当だとしたら、Schemeを作成した日本人が、５人や１０人ぐらいはいて、記事を残してくれていても、いい筈だと、私は思う。

『それがないんだからscheme作りは簡単じゃない』と言いたい。


## 参考になりそうな記事をいくつか

1. お気楽 Scheme プログラミング入門

頻繁に参照させていただいている、上記のシリーズの中に
●micro Scheme 編 というシリーズがある。

http://www.nct9.ne.jp/m_hiroi/func/scheme.html

ここにインタープリタ作成の概要は、書かれている。
ただし、私が知りたかった call/ccの事は、たぶん書かれていない（筈）。


2.魔法言語リリカル☆Lisp

https://lyrical.bugyo.tk/
ゲーム用のスクリプト言語を作ろうとされている様子。
記事はアニメ好きの人にしかわからないかも。（私はアニメ好きだが）
しかし、githubページに、各種プログラミング言語で書かれたLispの実装があった。
この中に、C言語のソースを吐く小さなコンパイラがあった。ちょっと興味を持っている。
今やっているscheme作りが一段落したら、来年にでも、覗いてみようと思う。





## 川合さんは偉大だった

gauche を作られた、川合さんは本当に偉大だ。

私はJavaが主食なので、C言語やC++は、よく読めないし、川合さんが書いてくださっている衛生的マクロの記事も、読んでもなかなか理解できない。
それでも、記事を残してくれている事に感謝申し上げます。

## schemeインタープリタ自作記事教えてください

（できれば日本語で）良い記事をご存知でしたら、お教えください。
１０個ぐらいの関数を実装した記事では、参考にならないので、できれば、shceme base を全部実装したぐらいの記事が読んでみたいです。

Javaで書かれたschemeの実装(kawa, CISC)のソースは、読もうとはしましたが、Clojure同様にJVMの知識が必要になり挫折しました。
Javaを基本からまとめてみた【DAO基礎】

## 1.DAO(Data Access Objects)とは？

- データベースへのアクセスを行うクラスを作成し、そのクラスを通してデータベースにアクセスするデザインパターンのこと
- DBアクセス部分を分離したオブジェクト
- DAOにはDBアクセスを行うメソッドを実装する
- DB接続オブジェクトを分離するのが一般的
- DAOにはDBにアクセスするメソッドを定義する

```sampleDao.java
public class UserDAO {
    public List<String> selectAllId(){

    ~ ユーザ情報から全てのユーザIDを取得 ~

    return DBから取得したIDのリスト;
 }
}
public String selectNameById(string userId){

   ~ 指定の　ユーザIDから　名前を取得 ~
   
　　return DBから取得した名前;
```
## 2.DAOの利点

- ビジネスロジックは、DB詳細を知る必要がない
- DBアクセス部分を部品化するため、再利用性が上がる
- DBの変更があってもDAOのみ変更すれば良いため保守性が向上する

※ ビジネスロジック(業務処理):プログラムで主に実現したい処理





## 参考サイト
[【Javaデータベース入門 #19】DAO(Java) (Data Access Object・DB接続・クラス・メソッド)](https://www.youtube.com/watch?v=tOYHEXLwiwQ)
[【JavaDB10】DAOとは何かや使うメリットをわかりやすく解説](https://www.youtube.com/watch?v=mChY4J7Jc6o&t=154s)
【Python入門】変数のスコープについて

# Pythonの変数スコープの概念について
Pythonの変数のついてはLEGBルールという概念に基づきます。
LEGBはローカル、エンクロージング、グローバル、組み込み関数をスコープとして、スコープの検索順序を表します。各スコープについて説明します

# LEGBについて
変数を参照するとき、Pythonは以下の順序でスコープを検索します。
1. ローカル
1. エンクロージング
1. グローバル
1. 組み込み関数

各スコープについて解説をしてきたいと思います。

## ローカルスコープについて
関数内部で定義された変数は、ローカルスコープとなります。
関数内のみで有効となるため、関数外からのアクセスはエラーとなります。

``` python
def local_scope_function():
    #ローカルスコープ
    local_var = "ローカル変数"
    print(local_var)


def test_module():
    local_scope_function()
    # print(x) # NameError: name 'x' is not defined
```

## エンクロージングスコープについて
関数内にネストされた関数がある場合、ネストされた関数からアクセスができます。
ネストされた関数は、外部のスコープを参照します。

``` python
def enclosing_scope_function():
    #外側のスコープ
    enclosing_var = "外側の変数"
    def local_scope_function():
        print(enclosing_var)
    local_scope_function()


def test_module():
    enclosing_scope_function()
```

## グローバルスコープについて

上位で定義された変数がグローバル変数となり、どこからでもアクセスが可能となります。
```global```キーワードを使用して、関数内からグローバル変数を変更することが可能となります。
``` python
x = 10

def global_scope_function():
    global x
    x = 20

def test_module():
    print(f"{x=}")
    global_scope_function()
    print(f"{x=}")
```

global_scope_functionを以下のようにすると、global_scope_function内のxはローカル変数として扱われるため、グローバル変数xは更新されません。
``` python
x = 10

def global_scope_function():
    x = 20

def test_module():
    print(f"{x=}")
    global_scope_function()
    print(f"{x=}")
```

## ビルトインスコープについて
Pythonには標準ライブラリとして多くの組み込み関数や定数が定義されています。
これらについてはどこからでもアクセス可能となります。

``` python
# 例えばlenは組み込み関数となるため、どこからでもアクセス可能
print(len[1,2,3,4,5])
```

※ビルトインスコープについては念のため記載していますが、今回の説明する変数のスコープについての解説とは少し趣旨がずれるかもしれません。


# まとめ
Pythonではスコープを意識する必要があります。変数がどのスコープに属しているかでアクセス範囲が変わります。アクセス範囲についてはLEGBルールに従って決まります。
Node.js と ws でシンプルな WebSocketサーバー： Bufferオブジェクトで受けとった文字列データを UTF-8 の文字列にする

## はじめに
Node.js で下記の ws を使い、でシンプルな WebSocketサーバーを使う時の話です。

過去にも、その内容の記事を書いていたのですが、今回は Bufferオブジェクトで受けとった文字列を扱う話に関わる、シンプルな内容です。

●ws - npm
　https://www.npmjs.com/package/ws

### 背景の補足
とあるハッカソンで、WebSocket を使った PC とスマホ・ガジェット等を連動させる通信処理を実装しようとした時に、特定の複数の文字列をキーに、複数の動作を行わせることをやろうとしました。

そのテスト実装をした時、「文字列を送信する側が Bufferオブジェクトでデータを送る形」で、「受信側では、文字列変換した内容を扱いたい」という状況があってやった内容です。

## 実装内容
以下が本題です
今回、以下では、WebSocketサーバーの機能がある受信側の実装（かなりシンプルなもの）を示します。

`npm i ws` でパッケージをインストールして、下記のプログラムを作り、nodeコマンドで動かします（接続は、例えば localhost のポート番号 8080 になる形）。

```javascript
const WebSocket = require("ws");

const wss = new WebSocket.Server({ port: 8080 });

wss.on("connection", (ws) => {
  console.log("クライアントが接続しました");

  ws.on("message", (message) => {
    // console.log("受信したメッセージ:", message);
    // 受信したBufferをUTF-8で文字列に変換
    const textMessage = message.toString("utf-8");
    console.log("受信したメッセージ:", textMessage);
  });

  ws.on("close", () => {
    console.log("クライアントが切断されました");
  });
});

console.log("WebSocketサーバーがポート8080で稼働中...");
```

`const textMessage = message.toString("utf-8");` という部分の中で、「toString()」を使った UTF-8 の文字列への変換がポイントです。

●Object.prototype.toString() - JavaScript | MDN
　https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

上記のコードでコメントアウトしている `// console.log("受信したメッセージ:", message);` を有効にして、送信側から「1」という文字列を Bufferオブジェクトで送った時の出力が以下となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7280b214-a1bb-6cd9-c10a-ba8685705491.png)

出力を見ると、受けとった Bufferオブジェクトがそのまま出力された後、文字列に変換された後の出力も行われていること（UTF-8 で数字の「1」を示す「31」と、toString() で処理した後の文字列「1」が出力されていること）が確認できました。
Capacitorで新規Androidアプリを立ち上げた時のエラー解消

## 背景
Capacitorで新規Androidアプリを立ち上げようとした際、以下のコマンドを実行するとエラーが発生しました。

実行コマンド
```sh
npx cap add android
```

発生したエラー
```
Could not open settings generic class cache for settings file 'ファイルパス/settings.gradle' (/ファイルパス/.gradle/caches/8.2.1/scripts/er3mpjmafek4dm6hp4m5k0z22).
BUG! exception in phase 'semantic analysis' in source unit 'BuildScript' Unsupported class file major version 66
```

## エラーの原因
このエラーの原因は、インストールされていたJavaのバージョンによるものでした。

エラーメッセージ中の「Unsupported class file major version 66」は、Java 18以降のバージョンが使われていることを示しています。私のPCにはJava 22がインストールされており、このバージョンはGradleやAndroid Studioとの互換性に問題がありました。

## 解決方法
Javaのバージョンを22から17にダウングレードしたところ、エラーが解消されました。
Elixir Enum.sliceの紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はEnum.sliceについて学んだことをまとめます。
2024/10/13に開催したイベント[piyopiyo.ex #46：もくもく作業タイム](https://piyopiyoex.connpass.com/event/333287/)の成果です。

# 目的
Enum.sliceの使いどころを理解する。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.0
Erlang v27.0

# 前提
あらかじめ下記の変数を定義しておきます
```diff_elixir:iex
cart = [
  %{fruit: "apple", count: 3},
  %{fruit: "banana", count: 1},
  %{fruit: "orange", count: 6}
]
```

# Enum.slice/2
`Enum.slice(enumerable, index_range)`は、
- `enumerable`のうち`index_range`（ゼロベース）の範囲を要素を取り出し、リストにして返す
- `index_range`が負の値の場合、要素を後ろから数える
- `index_range`が`enumerable`の要素数の範囲外にあたる場合、ヒットした要素だけ取り出す

## 例1
```diff_elixir:iex
Enum.slice(cart, 0..1)
```
```
[%{count: 3, fruit: "apple"}, %{count: 1, fruit: "banana"}, %{count: 6, fruit: "orange"}]
```

## 例2
```diff_elixir:iex
Enum.slice(cart, -2..-1)
```
```
[%{count: 1, fruit: "banana"}, %{count: 6, fruit: "orange"}]
```

# Enum.slice/3
`Enum.slice(enumerable, start_index, amount)`は、
- `enumerable`のうち`start_index`（ゼロベース）を数えた地点を開始地点とし、`amount`個ぶんのを要素を取り出し、リストにして返す
- `start_index`が負の値の場合要素を後ろから数えた地点を開始地点とする
- `amount`に負の値は指定できない

## 例1
```diff_elixir:iex
Enum.slice(cart, 1, 2)
```
```
[%{count: 1, fruit: "banana"}, %{count: 6, fruit: "orange"}]
```

## 例2
```diff_elixir:iex
Enum.slice(cart, -2, 2)
```
```
[%{count: 1, fruit: "banana"}, %{count: 6, fruit: "orange"}]
```

## 例3
```diff_elixir:iex
Enum.slice(1..1000,-10, 3)
```
```
[991, 992, 993]
```

## 例4
```diff_elixir:iex
Enum.slice(1..1000,-10, -3)
```
```
** (FunctionClauseError) no function clause matching in Enum.slice/3    
```



# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
PlantUMLをAndroidStudioで書きたい

# はじめに
今回はシーケンス図やユースケース図を描くのに使えるPlantUMLをAndroidStudioで書けるようにしていきます
### 本文
前提として、macにhomebrewがインストールされていることとします。
その状態で、まずはhomebrewを使ってGraphvizをインストールします。
これは、プレビューを表示するためのものです。
インストールが終わったら、settings->pluginsからplantと入力すると下記のプラグインが表示されるので、インストールします。
![スクリーンショット 2024-10-13 9.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/e96a6b0d-1e72-0475-5455-97418c5004ff.png)
再起動を求めらるので、再起動をします。
あとは新規でファイルを作成しようとすると下記の画像のようにUMLファイルを作成できるようになります。
![スクリーンショット 2024-10-13 9.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638092/85c6a550-2b07-febc-fdc5-da32cb01f2f9.png)
### 最後に
今回はPlantUMLをAndroidStudioで書けるようにしました
どこかのタイミングで基本的なシーケンス図の書き方などを記事にしようと思います
ネットワーク内のIPアドレスを簡単にスキャンする方法（Windows & Ubuntu対応）

ネットワーク内でどのデバイスがアクティブなのか、つまりどのIPアドレスが現在使用されているかを把握することは、システム管理やトラブルシューティングに非常に役立ちます。本記事では、Windows PowerShellを使った方法と、Ubuntuで同様の役割を果たすスクリプトをご紹介します。

## Windows PowerShellを使用したIPアドレススキャン

Windows環境では、PowerShellを使って非常に簡単にネットワーク内のデバイスをスキャンすることができます。以下のスクリプトは、指定したIPレンジ内でどのIPアドレスが「アクティブ」なのかを確認できるシンプルなものです。

### PowerShellスクリプト例：

```powershell
1..254 | ForEach-Object {
    $ip = "192.168.11.$_"
    if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
        Write-Output "$ip - Active"
    } else {
        Write-Output "$ip - Inactive"
    }
}
```

### スクリプトの説明：
- `1..254` は、IPアドレスの最後のオクテット（192.168.11.x の「x」部分）をループする範囲を定義しています。
- `Test-Connection` コマンドは、指定したIPアドレスに対してPingを実行し、そのアドレスがアクティブかどうかを確認します。
- `Write-Output` は、アクティブな場合は「Active」、そうでない場合は「Inactive」と結果を出力します。

### 出力例：

```
192.168.11.1 - Active
192.168.11.2 - Inactive
192.168.11.3 - Active
...
```

このスクリプトは、ネットワーク管理者が一目でどのIPアドレスが使用中か確認できる便利なツールとなります。

## UbuntuでのIPアドレススキャン

次に、Ubuntuの環境でも同様の目的でIPアドレスをスキャンする方法をご紹介します。Linux環境では、`ping` コマンドとループ処理を組み合わせることで同じような結果を得ることができます。

### Ubuntuでのシェルスクリプト例：

```bash
#!/bin/bash
for i in {1..254}
do
    ip="192.168.11.$i"
    ping -c 1 -W 1 $ip > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "$ip - Active"
    else
        echo "$ip - Inactive"
    fi
done
```

### スクリプトの説明：
- `for i in {1..254}` でIPアドレスの範囲を指定しています。
- `ping -c 1 -W 1 $ip` で各IPアドレスに1回だけPingを送り、タイムアウト時間を1秒に設定しています。
- `if [ $? -eq 0 ]` でPingの成功（アクティブ）か失敗（非アクティブ）かを判定します。
- `echo` で結果を出力します。

### 出力例：

```
192.168.11.1 - Active
192.168.11.2 - Inactive
192.168.11.3 - Active
...
```

## 結論

今回紹介したように、Windows PowerShellやUbuntuのシェルスクリプトを使って簡単にネットワーク内のデバイスのIPアドレスをスキャンできます。どちらのスクリプトも非常にシンプルでありながら、システム管理者にとっては強力なツールです。日々のネットワーク管理にぜひ活用してみてください。
astroファイルでReactコンポーネントが動かない

## 概要
astroファイルでReactコンポーネントが動かなくて苦戦しましたので、対応策を残しておきます。

## エラー内容

```javascript:動かなかった記述
---
import InteractiveCounter from '../components/InteractiveCounter.jsx';
---

<InteractiveCounter />
```
以下のような状況でした。
* コンポーネントは表示される
* ボタンを押しても反応しない
* console.logも出力されない

## 対応策
```diff_javascript:動くようになった記述（コンポーネント部分だけ変更）
- <InteractiveCounter />
+ <InteractiveCounter client:load />
```

インポートするコンポーネントに `client:load` を付けただけで解消できました。
クライアントディレクティブというものがあり、その指定が無いと静的なHTMLとして解釈されるようです。
クライアントディレクティブはいくつか種類があり、状況にあわせてコンポーネントの動的化機能を制御できるようです。

https://docs.astro.build/ja/reference/directives-reference/#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96

## おわりに
公式ドキュメントあまり見ていなかったので苦戦してしまいました :innocent:
公式ドキュメントをちゃんと読みましょう。。。

なお、astroの公式ドキュメントはほとんどのページで日本語が用意されているので、大変助かります。

#### 公式ドキュメント
https://docs.astro.build/ja/guides/framework-components/#%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88
シェルスクリプトで素数を判定する

全然実務では使わないのですが、bashには factor というコマンドがあり素因数分解をすることができます。

```bash
~$ factor 8
8: 2 2 2
```

素数を指定すると
```
~$ factor 7
7: 7
```
このように `入力した値: 素因数分解した結果を半角スペース区切りしたもの` で出力されるため

```bash
### sosuu.sh
#!/bin/bash

INPUT=$1

factor $INPUT | awk '{if(NF==2)print $2"は素数です"}'
```
このように判定するスクリプトが簡単に書けます。

### 実行例
```
$ ./sosuu.sh 7
7は素数です
$ ./sosuu.sh 10
$
```
python try構文の話（自分用）

エラーハンドリング（例外処理）について記述する。

1.エラーハンドリングとは（例外処理）
-
pythonには様々なエラーが存在し、適切な処理をしない場合、そこで処理が中断される。
そのため予め発生しそうなエラーを予測し、対処法を定めておくことがエラーハンドリングである。（そもそもエラーが発生しないように作れないか考えることが重要）

```
SyntaxError:　# 原因 ⇒ 文法ミス（コロンやカッコの不足等）
if True print("Hello")  # コロンが必要

IndentationError: #原因 ⇒ インデントが正しくない場合に発生
def foo():
print("Hello")  # インデントが必要

NameError: #原因 ⇒ 存在しない変数や関数を参照しようとすると発生
print(undeclared_variable)  # 変数が未定義

TypeError: #原因 ⇒ 不正な型を持つオブジェクトに対して操作を行った場合に発生
print(1 + "2")  # 整数と文字列を足すことはできない

ValueError: #原因 ⇒ 正しい型ではあるが、不正な値を使った場合に発生
int("abc")  # 不正な文字列を整数に変換しようとした

IndexError: #原因 ⇒ リストやタプルのインデックスが範囲外になっている場合に発生
lst = [1, 2, 3]
print(lst[5])  # 存在しないインデックスにアクセス

KeyError: #原因 ⇒ 辞書に存在しないキーにアクセスしようとした場合に発生
my_dict = {"key": "value"}
print(my_dict["nonexistent_key"])  # 存在しないキーにアクセス

AttributeError: #原因 ⇒ 存在しない属性やメソッドにアクセスしようとすると発生
lst = [1, 2, 3]
lst.append(4)
lst.nonexistent_method()  # 存在しないメソッド

ZeroDivisionError: #原因 ⇒ 数値を0で割ろうとすると発生
print(1 / 0)  # ゼロで割ることはできない

ImportError: #原因 ⇒ モジュールのインポートに失敗した場合に発生
import non_existent_module  # 存在しないモジュールをインポートしようとした
```
2.try構文によるエラー処理
-
try構文を用いることで、予め想定しうるエラーが発生した際の処理内容を記述することが可能である。

<strong>try : </strong>
    処理内容
<strong>except : </strong>予め発生が想定されるエラー
    エラーに対する処理内容

```
# try構文によるエラーハンドリング

try:
    num = int(input("数字を入力してください: "))  # ユーザーが文字を入力した場合、エラーが発生する
    print(f"入力した数字は {num} です。")
except ValueError:
    print("無効な入力です。数字を入力してください。")
```
複数のエラー処理をすることも可能である。
```
# エラー処理を２つ設定してみる

try:
    num1 = int(input("1つ目の数字を入力してください: "))
    num2 = int(input("2つ目の数字を入力してください: "))
    result = num1 / num2
    print(f"{num1} ÷ {num2} = {result}")
except ValueError:
    print("無効な入力です。数字を入力してください。")
except ZeroDivisionError:
    print("ゼロで割ることはできません。")
```
except ブロック内でエラーの詳細を変数に格納し、エラーメッセージを取得することも可能。
```
# エラー詳細を出力してみる

try:
    num1 = int(input("1つ目の数字を入力してください: "))
    num2 = int(input("2つ目の数字を入力してください: "))
    result = num1 / num2
    print(f"{num1} ÷ {num2} = {result}")
except (ValueError, ZeroDivisionError) as e:
    print(f"エラーが発生しました: {e}")
```
3.elseブロック
-
エラーが発生しなかった場合にのみ else ブロックが実行される。
```
# elseブロックを設定してみる

try:
    num = int(input("数字を入力してください: "))
except ValueError:
    print("無効な入力です。")
else:
    print(f"入力した数字は {num} です。")
```
4.finally ブロック
-
finally ブロックは、エラーの有無にかかわらず必ず実行される。
ファイル操作やリソース解放に使う。try構文の末尾に記述する。

<strong>finally : </strong>
処理内容を記述
```
# finallyによる処理を設定してみる

try:
    file = open("data.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("ファイルが見つかりません。")
finally:
    if 'file' in locals():
        file.close()  # ファイルを必ず閉じる
        print("ファイルを閉じました。")
```
5.まとめ
-
適切なエラーハンドリングを考えた設計とすることも大事であるが、そもそもエラーが発生しないようにできないか？考えることが重要である。
【Kotlin】開催されているKotlinのイベントまとめ

# はじめに
みなさんはKotlinのカンファレンスなどのイベントには参加されておりますでしょうか？
お住まいの地域によっては参加するのが難しいなどあるかと思いますが、オンラインでも開催されていたりと、一昔前に比べて随分参加しやすい状況が確立されつつあるかと思います。
そこでカンファレンスなど興味がある方に向けて、全国で開催されているカンファレンスやイベントを簡単にまとめたいと思います。

# 1. Kotlin Fest

https://www.kotlinfest.dev/

#### 開催期間
- 2024年6月22日（土）
    - セッション：10:30～18:30
    - 懇親会：18:30～20:30

#### 特徴

今年のKotlin Festは約5年ぶりにオフライン形式で開催された技術カンファレンスです。
多様なセッションで、Kotlinの愛好者や開発者が知識を共有する場となっています。
400名限定のノベルティ付きチケットも販売されましたが、完売するほど人気のカンファレンスです。

# 2. KotlinConf Global 

https://kotlinconf.com/2024/

#### 開催期間
- 2024年5月23日～6月30日

#### 特徴
KotlinConf Globalは、JetBrainsが主催する世界規模のKotlin関連イベントの一環で、各地域のコミュニティでライブ配信やセッションを実施します。
日本国内でも地域ごとにミートアップ形式での参加が可能で、世界のKotlin開発者とつながる貴重な機会です。

# 3. Server-Side Kotlin Meetup

https://server-side-kotlin-meetup.connpass.com/

#### 開催期間
- 定期開催されているイベントによる

#### 特徴
このミートアップは、Kotlinのサーバーサイド開発に焦点を当てており、2〜3か月ごとに開催されています。
2024年のKotlin Festとの連携イベントも行われ、技術共有や交流を深める場となりました。

# さいごに
上記で挙げた以外にも名古屋や大阪など、主要都市で定期的にミートアップ形式のイベントが開催されています。
KotlinFest以外はオンラインでも参加が可能なイベントなので、敷居の高さを感じている方は是非参加を検討してみてください！
「ダウンロード数が上限を超えたため、現在このファイルはダウンロードできません」と Google Drive で表示された場合

## この記事の内容

この記事では Google Drive で以下のメッセージが表示され、ファイルのダウンロードができない場合の対応方法を説明します。

![Google Drive: Download Quota Is Exceeded](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/11126564-6a21-4241-c843-8169a6456095.png "ダウンロード数が上限を超えたため、現在このファイルはダウンロードできません")

## 対応方法

いくつか方法がありますが、下記の **方法 1.** を試してみて、それでもファイルのダウンロードができない場合は、 **方法 2.** を試すのが良いと思います。🤔

### 方法 1. Google アカウントでログインする

Google アカウントで**ログイン**した状態で、ファイルのダウンロードを試してみてください。

もしこれで成功すれば、これが一番簡単な方法です。🥳

### 方法 2. フォルダの共有を利用する

1. Google アカウントでログインし
1. ファイルが含まれる**フォルダを[共有]し**  
   ![GoogleDrive-shareFolder](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/f27baf6d-716d-b8d9-a5a9-5af661a165a6.png)
1. [**共有アイテム**]内からファイルをダウンロードしてください。

この方法もシンプルで良いと思います。

この方法が下記の **方法 3.** に比べて優れている点は、自分の Google Drive の空き容量を消費しない点です。🎉

### 方法 3. ファイルを自分のドライブにコピーする

1. Google アカウントでログインし
1. ダウンロードしたいファイルに対して[**コピーを作成**]を行い  
   ![GoogleDrive-createCopy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/7adb87ad-6f6e-06b7-9f7f-acf48e57acbb.png)
1. [**マイドライブ**]からコピーされたファイルをダウンロードする

👉 **方法 3.** では以下の手間と制限が発生するため、よりシンプルな **方法 2.** をお勧めします。

- ファイル名の末尾に「**のコピー**」という文字が付いてしまうため、それを修正する手間が発生する
- 自分の Google Drive の空き容量を消費するため、空き容量以上のファイルはダウンロードできない
- 消費された空き容量を回復させるため、ファイルのダウンロード後、ファイルを削除し、さらにゴミ箱からもファイルを削除する必要がある

## なぜこの方法でうまく行くの？

共有する方法にしろコピーする方法にしろ、いったん自分のドライブを介することで、Google Drive のダウンロードクオータの制限が、提供元ではなく自分のアカウントでの制限に変わるからです。

ちなみにどれだけの回数/ファイルサイズをダウンロードすると Google Drive でダウンロードクオータの制限に引っかかるかは、 Google は公開していません。  
(👉 [アップロードについては記載があります](https://support.google.com/a/users/answer/7338880))
ihex2monlをCMT対応してみた

もともと[CHOS](https://github.com/yamori813/CHOS)自体をダウンロードするためにwavファイルを吐くようになっていたのですが、CHOSで直接読めるようにCMTファイルの出力もできるようにしてみました。-CオプションでCMTファイルを吐きます。

https://github.com/yamori813/ihex2monl

これでz80floatをPC-8001対応を追加してみました。

https://github.com/yamori813/z80float

変換して出来上がったCMTファイルをmtoolsでUSBメディアにコピーしてCHOSでloadして実行できます。

```
LOAD "TEST1.CMT"
OK
MON
*G9000
 1.2345678D 02
```
OSとは

## OSとは
OSとはオペレーティングシステムの略称で **「基本ソフトウェア」** のこと。
PCやスマートフォンを使用する上で必要なソフトウェア。

**Mac、Windows、Linux、iOS、Android** などを指す。

PCやスマートフォンの基本操作をするために必要なもの。
PCを使用していて **<font color="Red">「当たり前だと思う機能」</font>** を全て提供してくれる。

**プログラムの中のプログラム。**
【覚書き】grepコマンドで文字列を検索する

# 初めに
ログ調査の際はgrepコマンドを使ってファイル検索を行っているのですが、普段はオプションなどあまり使用せず、使う際も毎回検索して調べてました。この際覚えようと思い調べたので、アウトプットします。

# grepコマンドとは
grepコマンドは、ファイル内の文字列を検索するコマンドです。
検索したい文字列と検索対象のファイルを指定することで、簡単に結果を出力することができます。
```sh
$ grep test test.txt
test1 111
test2 222
test3 333
test4 444
test5 555
```

# 便利なオプション
| オプション | 引数 | 説明 |
|:-:|:-:|:-:|
| -e | 検索する文字 | 検索する文字列を指定。複数個指定することでor検索が可能。 |
| -v | - | 検索文字列を**含まない**行のみ出力 |
| -c | - | 検索にマッチした行数を出力 |
| -i | - | 大文字と小文字を区別しない |
| -C | 行数 | マッチした行の前後の行も表示。引数で指定した行数分表示する。 |
| -n | - | 検索結果に何行目かを表示する|
| -m | 回数 | 指定回数マッチしたものが見つかったら処理を終了 |
| -q | - | 結果を標準出力しない |
| -r | - | 検索対象にディレクトリを指定した場合、サブディレクトリのファイルも検索 |
| -R | - | 検索対象にディレクトリを指定した場合、サブディレクトリのファイル（シンボリックリンクも含む）も検索 |


# 使用例

今回のディレクトリ構成は以下です。
```sh
./
  ├ test.txt
  └ sub/
      └ test2.txt
```

今回grepに使用するテキストファイルは以下です。

```sh
$ cat test.txt
test1 111
test2 222
test3 333
test4 444
test5 555
$
$ cat sub/test2.txt
test6 666
test7 77
```

## 使用例1：-eでOR検索
-eを複数用いることでOR検索をすることができます。
```
$ grep -e test1 -e test2 test.txt
test1 111
test2 222
```

## 使用例2：|でand検索
and検索の場合はバーティカルバーを用いて行います。
```sh
$ grep -e test test.txt
test1 111
test2 222
test3 333
test4 444
test5 555
$
$ grep -e test test.txt | grep -e 111
test1 111
```

## 使用例3：-vでNOT検索
-vで検索文字以外を出力できます。
```sh
$ grep -v -e 222 test.txt
test1 111
test3 333
test4 444
test5 555
```

## 使用例4：-cで行数のみ出力
-cで行数のみ出力することができます。
```sh
$ grep -c -e test test.txt
5
```

## 使用例5：-iで大文字と小文字を区別しないで検索
デフォルトの場合大文字と小文字を区別しますが、-iで大文字と小文字を区別しないで検索することができます。
```sh
$ grep -c -e TEST test.txt
0
$ grep -c -i -e TEST test.txt
5
```
## 使用例6：-Cで前後の行も表示
-Cで検索結果の上下数行を出力することができます。
```sh
$ grep -C 1 -e 333 test.txt
test2 222
test3 333
test4 444
```
ちなみに、-Aと-Bで前後どちらかのみを指定可能です。
```sh
$ grep -A 1 -e 333 test.txt
test3 333
test4 444
$ grep -B 1 -e 333 test.txt
test2 222
test3 333

```
## 使用例7：-nで何行目かを表示
-nで検索結果の行数を表示することができます。
```sh
$ grep -n -e 333 test.txt
3:test3 333
```
## 使用例8：-qで結果を標準出力しない
-qで標準出力に表示しないことができます。
一見使い道がないように思えますが、シェルスクリプトのif分岐など、出力の必要がない場合に使用できます。
```sh
$ grep -e test test.txt
test1 111
test2 222
test3 333
test4 444
test5 555
$ grep -q -e test test.txt
$
```
## 使用例9：-rでサブディレクトリも検索
検索対象にフォルダを指定した場合、-rでサブディレクトリのファイルまで検索対象にすることができます。
```sh
$ grep -r -e test ./
./test.txt:test1 111
./test.txt:test2 222
./test.txt:test3 333
./test.txt:test4 444
./test.txt:test5 555
./sub/test2.txt:test6 666
./sub/test2.txt:test7 777
```


# 終わりに
grepはオプションをつけることでさらに便利に利用することができます。
毎回調べることなく使えると便利そうなので、たくさん使って手になじませていきたいです。

ここまでご覧いただきありがとうございました！

# 参考
https://tech-blog.rakus.co.jp/entry/20220912/grep

https://qiita.com/LIB/items/6950acebedd576780ced
Flet、PyinstallerでWindowsアプリ作成時のアプリアイコンの設定

Flet、PyinstallerでWindowsアプリを作成する時、EXEのアイコンはPyinstallerで設定できるが、タスクバーのアイコンがFletの魚みたいなアイコンなのが、ちょっと嫌でした。
検索してみても、ぴったりな記述が見つからなかった・・・のは、もしかすると当たり前すぎて書かれていないだけなのかもしれませんが、私は少し困っていたので記しておきます。
## 結論
アイコンファイルがルートにあるとして、次のように書くとタスクバーのアイコンがEXE化後も設定されます。
specは、one fileにしないパターンです。

```python:flet.py

def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


page.window.icon=resource_path("icon.ico")
```
```python:flet.spec
# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['flet.py'],
    pathex=[],
    binaries=[],
    datas=[('icon.ico','.'),],     # <-- icon
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

splash = Splash('splash.png',binaries=a.binaries,datas=a.datas,)
exe = EXE(
    pyz,
    splash,                   # <-- splash target
    a.scripts,
    [],
    exclude_binaries=True,
    name='Fletexe',
    debug=False,     #
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False,   #
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='.\icon.ico',     # <-- exe icon
)
coll = COLLECT(
    exe,
    splash.binaries,     # <-- splash binaries
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='Fletexe',
)
```
resource_path については、下記の記事を参考にしています。

https://qiita.com/firedfly/items/f6de5cfb446da4b53eeb

挙動的には、EXE起動後、最初はFletの魚のようなアイコンでタスクバーに表示されますが、その後アイコンファイルに書き換わる、というような感じになります。
少し思っていたのとは違いますが、許容できるレベルかなと思っています。

### 確認したversion
flet 0.24.1
pyinstaller 6.10.0

## その他の方法
### Flet Pack
コマンドでのFletのexe化ツールで、```Flet pack```と始めることで、exe化できるということです。この時アイコンも設定できるようです。
ただ、Flet pack は、pyinstallerのラッパーのようなので、恐らくやっていることはpyinstallerと同じだと予想して試してません。

https://flet.dev/docs/cookbook/packaging-desktop-app

### Flet build
```Flet build```とすることで、アプリ化できるようです。Flutter SDKまでセットアップはしましたが、スムーズにいかなかったので、そこで諦めて最後まで試してません。

https://flet.dev/docs/publish
Microsoft 365(Office 365)の主なサービスの概要と使い道


シンプルにまとめてみた。

# 全般知識

## Microsoft 365？Office 365？
Ans: Microsoft 365

公式がそう言っている。

> Office 365 は Microsoft 365 になりました。

[Microsoft 365 とは? Office 365 との違い](https://www.microsoft.com/ja-jp/microsoft-365/what-is-microsoft-365)

## 公式によるサービス一覧は？
Ans: [Microsoft 365 の製品、アプリ、サービス | Microsoft 365](https://www.microsoft.com/ja-jp/microsoft-365/products-apps-services)

# ユースケース別

## チャットしたい
Teams

## メールしたい
Outlook

## データの保存や共有がしたい
OneDrive

## 予定を管理したい、予定を調整したい
Outlook

## タスク管理したい
- プロジェクトやチームで使うなら Planner
- グリッド形式で俯瞰したいなら Lists
- 個人で個人の分を管理したいなら Outlook, To-Do


## ノートを取りたい
OneNote, Loop

## 複数人でコラボレーションしたい
- 文書なら Word Online, Excel Online, Powerpoint Online
- ノートなら OneNote, Loop
- ホワイトボードなら Whiteboard

## 社内ウェブサイトをつくりたい
Sharepoint

## 動画共有したい
Stream

## 図をつくりたい
Visio

## アンケートを撃ちたい
Forms

## 自動化したい・ローコードしたい
- アプリケーション作成なら Power Apps
- ワークフロー作成なら Power Automate

# SaaS を知っているが、365 を使うことになった人向け

## Slack みたいなやつ
Teams

## Zoom や Google Meet みたいなやつ
Teams

## クラウドストレージ
OneDrive

## Miro みたいなやつ
Whiteboard

## Notion みたいなやつ
Loop

## Wiki
ありません

## Wix.com や Google サイトみたいなやつ
Sharepoint

## Cosense(Scrapbox) みたいなやつ
ありません

## GitHub Issues や Backlog みたいなやつ
- ありません
- 強いて言えば Lists でグリッドビュー的に俯瞰ベースでできないこともない

## IFTTT や Zapier みたいなやつ
Power Automate

## Excalidraw や Ziteboard みたいなやつ
Visio

## Dropbox paper, Google ドキュメント, Box Notes みたいな同時編集できるノート
OneNote, Loop

## Google フォームみたいなやつ
Forms

## Facebook みたいなやつ
Viva Engage

# 各サービスを3行で
- 順不同です
- （上述したものであっても）あまり使ったことがないサービスは取り上げていません

## Teams
- ビジネスチャット
- チーム（ワークスペース）つくって、その下にチャンネルをつくる感じ。DM や複数人 DM（グループチャット）もできる
- オンライン会議もここからやる

## Outlook
- メーラー
- メール送受信、アドレス帳、予定表（グループスケジュール）など
- 自他の予定を見て会議調整飛ばして、はこれを使ってやる

## OneDrive
- クラウドストレージ
- 公開範囲を設定して一部フォルダ内を公開したりもできる
- 365 で扱うデータは大体ここに集まるので、ポータルを使うと横断的にアクセスできて便利

## Planner
- タスク管理
- タスクをボード（カンバン的）、グラフチャート、スケジュールで俯瞰する
- ないよりはマシだが、巷の SaaS と比べると使いづらい、あえてこれを使う理由はない

## Lists
- 項目をグリッド状に並べて俯瞰する
- Excel ほど柔軟ではなく、Planner ほどタスク管理に寄ってはいない、中途半端な存在
- あえてこれを使う理由はない

## OneNote
- ノート
- ノートブック → セクション → ページという単位感で、ページは二次元空間にテキストボックスを配置する
- 気軽に見てもらうというよりは、ノートブックにアクセスしてもらい（しっかり入室してもらい）、外界と遮断して静かに編集するような世界観

## Loop
- ノート
- OneNote よりも共同編集しやすく、Notion や note のような感じで軽快に書け、コードブロックや YouTube など埋め込みにもある程度対応
- 機能面や品質面でアラが目立つ感じ、もう一押しという感じ

## Whiteboard
- 無限キャンバス
- Miro みたいなツールで、複数人で付箋貼ったりできる
- Miro 含め他製品よりショボいが、シンプルなので多機能にまどわされない

## Sharepoint
- 社内ウェブサイト作成
- GUI でページ構成や表示パーツをカスタマイズする感じ
- 訪問の動線はないので、見てもらうための宣伝は別途必要

## Forms
- フォーム作成
- 匿名で受け付けたり、集計結果を共有したりもできる
- アンケート用途であり、アプリ作成のポテンシャルはない

## Stream
- 動画共有
- YouTube みたいなやつだが、SNS の機能はほぼない
- 動画ファイルをストレージにアップして、見るときもダウンロードしてもらうかストレージ側の原始的なプレビュー機能で見てもらって……みたいな原始的なあり方から脱せる

## Microsoft (Excel | Word | Powerpoint) Online
- オフィス文書作成
- ブラウザだけで編集できるし、複数人同時編集もできる
- アプリ版ほど機能は高級ではない
オブジェクト指向Cコンパイラ、comelangをgithubで公開しています

題名の通りです。リファレンスカウントGCを持ちJavaやGoのように気楽にヒープを生成できます。

Hello Worldは以下です。

```C
#include <stdio.h>

int main(int argc, char** argv)
{
    puts("HELLO WORLD");
    return 0;
}
```

Cそのものです。Cプリプロセッサーが動きます。なので、Cのライブラリがそのまま使えます。

comelangらしいHelloWorldは

```C
#include <comelang.h>

int main(int argc, char** argv)
{
    puts("HELLO" + " WORLD");

    return 0;
}
```

です。"HELLO" + "WORLD"でヒープが生成されていますが、puts後に自動的にfreeされます。

追記可能なbufferというクラスを使うと


```C
#include <comelang.h>

int main(int argc, char** argv)
{
    var buf = new buffer();

    buf.append("HELLO").append(" WORLD");

    puts(buf.to_string());

    return 0;
}
```
です。

stringクラスを使うと


```C
#include <comelang.h>

int main(int argc, char** argv)
{
    string str = s"HELLO";
    string str2 = string("HELLO");

    puts(str + " " + str2);

    return 0;
}
```

となります。

クラスを使うと

```C
#include <comelang.h>

class HelloWorld
{
    new() {
        string self.str = string("HELLO");
        string self.str2 = string("WORLD");
    }

    void show() {
        puts(self.str + " " + self.str2);
    }
}

int main(int argc, char** argv)
{
    var h = new HelloWorld();

    h.show();

    return 0;
}
```

となります。

listを使うと

```C
#include <comelang.h>

int main(int argc, char** argv)
{
    var li = new list<string>();

    li.add(s"HELLO").add(s"WORLD");

    puts(li.join(" "));

    var li2 = [s"HELLO", s"WORLD"];

    puts(li2.join(" "));

    return 0;
}
```

となります。

comealngは標準Cライブラリにしか依存していないため、標準Cライブラリが動く環境ならどこでも動きます。

https://github.com/ab25cq/comelang

ドキュメントはREADMEにあります。

インストールは

```
> git clone https://github.com/ab25cq/comelang
> cd comelang
> sh fast_build.sh && sh clean-self-host.sh
```

で行えます。

```
> sh all_build.sh
```

でエディッターvin, シェルshsh, テキストインタプリタzedがコンパイルされます。

webサーバーとdatabaseサーバーは

```
> cd webweb;
> sh all_build.sh
```

で立ち上がります。localhostにhttpsでサイトが表示されます（CA認証を無視しないといけませんが）
Go言語(Golang)のGroutineとChannelの基本

### ゴルーチン (Goroutine)

ゴルーチンは、軽量なスレッドのようなもので、Go言語では `go` キーワードを使用して定義します。ゴルーチンを使用することで、関数を非同期に実行することができます。以下のように基本的に使用します。

```go
package main

import (
    "fmt"
    "time"
)

func sayHello() {
    fmt.Println("Hello, World!")
}

func main() {
    go sayHello() // ゴルーチンとして関数を非同期に実行
    time.Sleep(1 * time.Second) // 他のゴルーチンが実行される時間を確保するためにスリープ
}
```

上記の例では、`sayHello`関数がゴルーチンとして実行されるため、`main`関数は直ちに次の行に進みます。`time.Sleep`は、ゴルーチンが実行される時間を確保するために使われていますが、他の方法（チャネルを使った待機など）で同期をとることもできます。

### チャネル (Channel)

チャネルは、ゴルーチン間でデータを通信するための構造です。チャネルを使うことで、異なるゴルーチンが安全にデータをやりとりできます。

チャネルは以下のように宣言できます：

```go
ch := make(chan int) // 整数型のチャネルを作成
```

チャネルにデータを送信するには、`<-`演算子を使用します。また、データを受信するには、同様に`<-`を使用します。

以下にチャネルを使った例を示します。

```go
package main

import (
    "fmt"
)

func worker(ch chan int) {
    // チャネルからデータを受信
    num := <-ch
    fmt.Println("Received:", num)
}

func main() {
    ch := make(chan int)
    go worker(ch) // ゴルーチンを起動

    // チャネルにデータを送信
    ch <- 42
}
```

この例では、`worker` 関数が、`main` から送られたデータを受信し、それを出力します。

### 並行処理の基本の流れ

1. ゴルーチンを作成する。
2. チャネルを使用してデータを送受信し、ゴルーチン間で通信する。
3. 必要に応じて待機する。
【モチベーション】モチベーションを保つには

# はじめに
こんにちは、本日はプログラミングのことではなくモチベーションについての記事です。
いきなりどうした？と思われるかもしれませんが、私は現在アメリカに住んでおり、日中はずっと家にいてプログラミングと英語の勉強を続けています。

異国の地なのでまだまだ友達は少なく一人ですが、黙々と勉強を継続できている理由を自分なりに分析しました。
仕事をしながらだから、時間がないし君とは違うんだよ。と思う方もいると思います。
しかし、私が学習塾を起業した時間がない際にも、勉強や筋トレを継続できていたので参考になると思います。
なかなか目標を達成することができないという方の参考になれば幸いです。
# モチベーション管理の重要性
この記事を読んでいただいている方にも、大小違えど達成したい目標はあるのではないでしょうか。
* 体重を落として理想の身体を手に入れたい
* 英語を話せるようになりたい
* 昇進するためにたくさん本を読んで知識をつけたい
* 
わたしの場合は、プログラミングと英語の勉強を継続してどちらもできるようになりたいという中期目標があります。（よくばりですｗ）
これらの目標を達成するためには、皆さまも計画を立てる重要性は知っているのではないでしょうか。

体重を落とす例でいえば一日1時間は歩こう、英語の例でいえば1日1時間を勉強時間にあてよう。などといった計画です。
しかし、だいたいの場合はうまくいきません。なぜなのでしょうか。

計画を立てる重要性は言うまでもありません。
しかし、何かの目標を達成する際に<strong>モチベーション管理</strong>も考慮していますか？
人間は論理と感情をつかさどる生き物です。何をやるにも感情が付きまとう
のでモチベーション管理も計画とあわせて考えることが重要です。

# モチベーションを保つために
モチベーション管理の重要性がわかったと思いますので、これからは私が実践している3つのことを説明していきたいと思います。

以下の記事をみて「こんなの当たり前でしょ。」と思うかもしれませんが、意識的にするのとたまたまやっているのはまったく別物です。
意識的に取り入れて初めて効果が出ると思うで、斜に構えずフラットに見ていただけると嬉しいです。

※あくまでも私が実践していることです。モチベーション管理について体系的に書いてある本もあるので詳しく勉強したい方は書籍を見てみてください。

### 筋トレをする
筋トレの重要性を唄う書籍や動画を最近見る機会が多いと思います。
みんながおすすめするくらい筋トレから得られる効果は大きいのです。
私が体感している筋トレから得られる効果は以下の通りです
* 筋肉がつくことにより見た目に自信がつく
* 肩こりがなくなる（背中あたりの筋トレを取り入れる必要あり）
* テストステロンやセロトニン、ドーパミン分泌によるやる気の向上

モチベーション管理の観点で行ったらテストステロンやセロトニン、ドーパミンなどのホルモン分泌による影響が大きいです。
筋トレを継続もしくは始めていない方は「筋トレ苦手なんだよな」、「ジムを契約するお金がもったいない」、「ジムまで行くのがめんどくさい」
などやらない理由を探しているのではないでしょうか。

そんな私も筋トレを始める前まではそう思っていました。というか、社会人になるまで筋トレ苦手でしたｗ
筋トレ苦手とかジムめんどくさいとか私が当時思っていた感情ですが、このように向き合ってみました。

「筋トレ苦手なんだよな」→仕事モチベアップのために継続してみよう！
「ジムを契約するお金がもったいない」→家で筋トレして足りなくなったらジム行こう！
「ジムまで行くのがめんどくさい」→上と同じ

自宅筋トレについて、私は以下の動画をほぼ毎日継続しているのでよかったらやってみてください。
※初心者はだいぶきついと思うでしんどかったら、1~2分休憩を入れてやってみてください
[腕立て伏せ5分間トレーニング](https://youtu.be/No9m0A2tzLw)

### 習慣化する
モチベーション管理とすこしずれていると思うかもしれませんが、人間は感情的な生き物ということを踏まえて、モチベーションに振り回されないように習慣化するというのも一つの手です。

上で筋トレのメリットについて触れましたが、それでも好きじゃないものは続かないと思います。その場合は、カレンダーにその予定を抑えておくのも一つの手かもしれません。
もちろん、「仕事終わりは家でYoutubeやInstagramをみてゴロゴロしたい」といった感情もあると思います。
そのときは、あなたが達成したい目標の重要度について考えてみてください。

私の目標であるプログラミングや英語ができるようになることは、何としても成し遂げたい目標です。
すこし極端かもしれませんが、モチベーションを削ぐようなYoutubeとInstagramのアプリを消しましたｗ
ただし、YoutubeやInstagramも必要なツールなので、必要な場合はPCやiPadで見るという自分ルールもセットでやっています。

モチベーションが日によって上下するのは仕方のないことだと思います。
まずはそれを自覚して、目標達成までの勉強や運動などを習慣化していくことをおすすめします。

人間は予定が入っていればそれを遂行しようとします。学校や仕事がいい例です。
英語であれば時間の決まったクラス、筋トレならパーソナルなど時間が決まっているものは継続するのが苦手な方にとてもおすすめです。
モチベーション低下を助長するようなSNSとは縁をきり（スマホにアプリを入れない）目標に向かって努力を頑張りましょう。

### 遊びも行う
ここまで一見厳しいことをいったと思いますが、しっかり息抜きをすることも重要です。息抜きを行わないと、せっかく継続できていることに飽きがきてしまうように感じます（これは個人的な感想です）

私の場合は人生は常に楽しむべきであるということを念頭に入れて生きています。
目標達成はこれからの人生をより豊かにしてくれるための第一歩だと思いますが、それをする過程に飽きてしまったらもったいないと思います。
私は毎日8時間以上プログラミングや合間に英語の勉強をしているのですが、終わったら妻と一緒にピックルボールをやっています。

また、勉強や筋トレ自体を楽しむというのもひとつの選択肢です。
Qiitaというブログのほうにプログラミングの勉強の記録を載せているのは、ブログを書くことが好きなのと、自分の勉強した記録を後々見返すのも面白いと思って継続します。
noteもアメリカ生活を上げているのですが、それの一種だと思っています。
時間をとって遊びをするのも、勉強そのものを遊びとするのもどちらとも効果あると思うのでぜひ試してみてください。

# まとめ
本日はモチベーション管理についての記事でしたがいかがだったでしょうか。
当たり前のことでも、上記の事項をすべてもれなくできている方は少ない気がします。
こんな偉そうに記事を書きましたが現在進行形で目標に向かって努力を続けていますｗ
noteの記事も息抜きに挙げていきたいと思います。リクエストがあればとてもうれしいのでコメントで頂けると幸いです。
Visual Studio 2022 17.11.5 と Xcode 15.4 で MAUI を使う

## 要点

- Visual Studio 2022 を 17.11.5 にバージョンアップしたら、これまで使っていた Xcode 15.4 が使えなくなり、Xcode 16 の利用を強制された
- 原因は 17.11.5 と同時にインストールされる .NET SDK 8.0.403 が、 ios/mac の Xcode 16 用の MAUI workload をインストールしてしまうため
- .NET SDK 8.0.402 をインストールし、`dotnet workload restore` コマンドを実行することで Xcode 15.4 を利用する環境に修復可能
  - Xcode 16 は Xamarin が対応していない…

## 開発環境 (Visual Studio アップデート前)

Android / iOS マルチプラットフォームアプリ開発 (Xamarin 製アプリのマイグレーション)

- Windows 11
  - Visual Studio 2022 17.11.4
  - .NET SDK 8.0.402
  - Workload version: 8.0.402
- macOS 14.7
  - Xcode 15.4

### Visual Studio アップデート後

- Visual Studio 2022 17.11.4 -> 17.11.5
  - .NET SDK 8.0.402 -> 8.0.403
  - Workload version: 8.0.402 -> ? (控え忘れました…)

この状態で mac マシンとペアリング & iOS アプリをビルドすると、「Xcode 16 を使え」という旨のビルドエラーになる。

## 解決手順

### 1. .NET SDK 8.0.402 をインストールする

Visual Studio アップデート時に 8.0.403 以前のバージョンの SDK がアンインストールされてしまった場合、新たに 8.0.402 をインストールする (少なくとも 2 つのバージョンの SDK が共存する状態になる)。
```terminal:terminal
> dotnet --list-sdks
8.0.402 [C:\Program Files\dotnet\sdk]
8.0.403 [C:\Program Files\dotnet\sdk]
```

### 2. `global.json` を設置する

従来どおりに Xcode 15.4 を利用して開発したいソリューションよりも上の階層 (もしくはソリューションファイルと同じ階層) のディレクトリに下記内容の `global.json` ファイルを設置する。
```json:global.json
{
  "sdk": {
    "version": "8.0.402",
    "workloadVersion": "8.0.402"
  }
}
```
これで、この `global.json` ファイルよりも下層のディレクトリにあるソリューションでは .NET SDK 8.0.402 が利用されるようになる。

```terminal:global.json よりも上位階層のディレクトリで実行
> dotnet --version
8.0.403
```
```terminal:global.json と同じまたは下層のディレクトリで実行
> dotnet --version
8.0.402
```

### 3. 対象ソリューションのワークロードをリストアする

ターミナルで Xcode 15.4 を利用した開発を実施したいソリューションファイルの階層にカレントディレクトリを移動し、下記コマンドを実行する。
```terminal:terminal
> dotnet workload restore
```
当該階層に複数のソリューション or プロジェクトファイルがある場合は、 restore のターゲットを明示してコマンドを実行する。
```terminal:terminal
> dotnet workload restore <PROJECT | SOLUTION>
```
また、 `global.json` で `workloadVersion` を設定していない場合は、ワークロードのバージョンを指定して実行する必要がある。
```terminal:terminal
> dotnet workload restore  --version 8.0.402
```

以上の手順で、Visual Studio の新バージョンを使いつつ、Xcode 15.4 での iOS アプリ開発を続行できる…はず。



## 参考資料

- [stackoverflow: Cannot connect to Mac from Visual Studio 2022 after 17.11.4 update](https://stackoverflow.com/questions/78995784/cannot-connect-to-mac-from-visual-studio-2022-after-17-11-4-update)
- [GitHub xamarin/xamarin-macios: .NET 8.0.1xxx - Xcode 16.0 Support (8303)](https://github.com/xamarin/xamarin-macios/releases/tag/dotnet-8.0.1xx-xcode16.0-8303)
Mac(Apple Silicon)でWine-crossoverをインストールしてWindowsソフトを動かす  

# 下準備
macにhomebrewをインストールしていない人は公式サイトからインストールしよう。 
[HomeBrew公式サイト](https://brew.sh/ja/)
# Wine-crossoverのインストール
ターミナルに以下のコマンドを打ち、Wine-crossoverを入れる
```zsh
brew tap homebrew/cask-versions
```
```zsh
brew install --cask --no-quarantine gcenx/wine/wine-crossover
```
しかしこれだけだと日本語が文字化けしてしまうので、cjkfontsをいれて日本語化をする。
# winetricks + CJKFontsのインストール
winetrickを入れる
```zsh
arch -arm64 brew install winetricks
```
cjkfontsを入れる
```zsh
winetricks cjkfonts
```
wineを再起動する
```zsh
wineserver -k && wineboot
```
# 実行するとき
```zsh:32bit
wine ファイル名
```
```zsh:64bit
wine64 ファイル名
```
これでWindowsのexeファイルが動くようになります。   

# テスト環境
MacbookPro 14inch M2Pro 32GB 1TB
macOS Sequoia
【VScode】Python単体テストのカバレッジ表示が簡単にできるようになったよ

# はじめに

3年ほど前にVScode上でのPython単体テストのカバレッジ可視化に関する以下の記事を書きました。

https://qiita.com/moshi/items/21a6ff0a20cd840f71ea

↑記事の投稿時はVScodeで単体テストカバレッジを可視化するために新しく拡張機能をインストールしたり、設定ファイルを手動で編集する作業が必要でした。しかし、2024年10月にリリースされたVScodeのPython拡張機能([v2024.16.0](https://github.com/microsoft/vscode-python/releases/tag/v2024.16.0))から、カバレッジ可視化機能がネイティブサポートされるようになりました。

VScode上のPython開発プロジェクトでとても分かりやすくpytest単体テストのカバレッジ可視化ができるようになったので紹介します。

![vscode_coverage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/40586ba0-ddb1-526f-a981-a01de3bab5a2.png)
↑新しく追加された`Run Tests with Coverage`機能によるカバレッジ可視化画面

# 想定ユーザー

Pythonプロジェクトでpytest単体テスト実行方法を知っているユーザーを想定して説明します。またVScodeのPython拡張機能・単体テスト用のPythonライブラリpytestとpytest-covをインストール済であることを前提としています。

# VScode上での単体テストカバレッジ表示

自分のPython製OSSプロジェクトの[pyCirclize](https://github.com/moshi4/pyCirclize)ソースコードを例としてpytest単体テストカバレッジ表示の手順を説明します。

## 単体テスト用の環境準備

例題プロジェクトをクローンし、必要な依存ライブラリをインストールする。Pythonライブラリはvenvを利用して仮想環境にインストールするのを推奨します。

```shell
# pyCirclizeプロジェクトのソースコードをローカルにクローン 
git clone git@github.com:moshi4/pyCirclize.git
# 実行依存ライブラリと単体テスト用ライブラリをインストール
pip install -e . pytest pytest-cov
```

## VScode設定ファイル準備

:::note info
VScodeのテストエクスプローラー上でpytestの実行設定をしたことがある人はここに記載する準備はおそらく不要
:::

PythonプロジェクトをVScodeで開いてテストエクスプローラーで下の画面が出た人は、VScode設定ファイル(settings.json)にpytestでの単体テスト実行用の設定パラメーターを追加する必要がある。

![test_explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/e7849a24-a154-7617-c22a-a7dc4170e9e8.png)

`Configure Python Tests`を押下後に、`pytest` → `tests`と選択すると以下の設定ファイルが作成され、VScode上で単体テストを実行できるようになる。

```json:.vscode/settings.json
{
  "python.testing.pytestArgs": ["tests"],
  "python.testing.unittestEnabled": false,
  "python.testing.pytestEnabled": true
}
```

## 単体テスト実行＆カバレッジ表示

VScode上に開いたPythonプロジェクトのテストエクスプローラー上で`Run Tests with Coverage`を押下することで、カバレッジ表示付きの単体テスト結果が表示される。

![vscode_coverage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/40586ba0-ddb1-526f-a981-a01de3bab5a2.png)

テストエクスプローラーの下側にモジュール単位でそれぞれのカバレッジ率がバッテリー残量のようなわかりやすい形式で表示され、またソースコード上でも単体テストが実行された行・されていない行がそれぞれ緑・赤でハイライトされます。単体テストのカバレッジ確認がとてもやりやすくなったなと思います。

# 最後に

2024年3月頃、VScodeに単体テストカバレッジ表示をサポートするためのネイティブAPIが実装されたので、Pythonでも活用できるようになるのを待ってました。2024年10月についにPython拡張機能で今回紹介したグラフィカルにわかりやすい形のカバレッジ表示をサポートするようになり、実際に利用してみてとても便利だなと感じました。この機能は実装されたばかりでまだ見落としている人も多い気がするので、この記事を読んで興味を持った人は活用してみてください。
未経験が知識ゼロからSalesforce認定アドミニストレーターを1か月で取得した【合格体験記】

はじめに
----------------------------
新卒未経験から1か月（3週間？）でsalesforce認定アドミニストレーターに合格するための備忘録。
2024年6月受験時の情報で書いており、最新の情報とは異なる。

試験結果
-----------------
受験日：2024年6月24日
バージョン：’24
受験方法：オンサイト（テストセンター）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771726/fe6183a7-9901-b0ee-0ba3-52918904544c.png)

前提
-------------------------------
実務はもちろん、ユーザとしてもSalesforceを利用したことがなく、オブジェクトすらわからない状態からのスタート。

学習時間
----------------------------

トータルで140時間程度
(資格取得期間として3週間の期間があった）

学習方法
----------------------------
1週目：研修の一環で管理Ⅰを受講。
凄まじいスピードで進んでいくため理解できない部分も多かったがオブジェクト・プロファイル・フロー・レポート・ダッシュボードなど基本的な機能について(SFで何ができるのか）環境での操作も含めて知ることができた。
Salesforce 管理Ⅰ[前編] ( ADX201-1 )
https://trailheadacademy.salesforce.com/ja/classes/adx201-1-administrative-essentials-for-new-admins-in-lightning-experience

Salesforce 管理Ⅰ[後編] ( ADX201-2 )
https://trailheadacademy.salesforce.com/ja/classes/adx201-2-administrative-essentials-for-new-admins-in-lightning-experience


2週目:自習期間(トレイルヘッド・過去問演習）
管理Ⅰで理解が曖昧だったアクセス権周りをトレイルヘッドで復習。
(トレイルミックスで試験対策がまとめられているがアクセス権周り以外はほとんど実施せず）

以下の問題を周回し問題形式に慣れる。
https://qiita.com/Takaa/items/485dc2dd1e61f31f2ff9#4-%E8%8B%B1%E8%AA%9E%E3%81%AE%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

１問ずつ回答をチェックして間違えた問題をメモ→知らない単語が出てきたらヘルプで調べる→間違えた問題だけ繰り返し解くことで知識を定着。
最初は全く解けませんでしたが繰り返すことで知識として定着し７割程度まで解けるようになる。

3週目:過去問演習＆動画でのインプット
過去問を解きつつ、苦手分野をインプット

https://www.jpnshiken.com/exam/ADM-201-JPN-salesforce-certified-administrator-adm-201%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-8818.html

↑の問題を解きまくる。
難易度は高いが1番本番に近かった（数問程度全く同じ問題が出題された）


下記の記事を参考に苦手分野をインプット。(動画で見れるのでおすすめ）
https://qiita.com/Takaa/items/485dc2dd1e61f31f2ff9
　https://qiita.com/hayate5931/items/49b3274296f8cdc354af#%E7%9B%AE%E6%AC%A1

 本来は3週目に受験予定であったが試験申し込みをオンサイトではなく、オンラインで申し込んでおり、受けられず。。。
 *これから受験される皆様試験申し込みにはお気をつけください。

 4週目:過去問演習
 4週目から別の研修が始まり、時間確保が難しくなったがすき間時間に過去問演習を繰り返す。
 
感想
------------------------------------------------------
・3週間では厳しいかなと諦めかけていたが、動画でインプット→過去問演習→疑問点をヘルプなどで納得できるまで調べるを繰り返すことで合格する事ができた。

・全ての範囲を網羅的に行ったため、苦手分野などなく得点率を伸ばせた。

・翻訳が無茶苦茶で問題文を読み解くだけで疲れる。

・ネット上の過去問は答えが正確とは限らないため自分で納得するまで調べることで理解が深まる。

まとめ
---------------------
試験としては、エンジニアとしてスキルなどは問われないがとにかく試験範囲が広いため、知識ゼロからはがっつり勉強が必須。
試験問題に癖があるため、問題演習の数をこなして問題形式？Salesforce語？に慣れる必要がある。
試験申し込みを要確認！！

今回の資格受験でSalesforceについて知ることはできたので、今後は実環境での操作や構築を行いたい。
戻り値を返す、受け取る

```
public static Main {
    public static void main(String[] args) {
        // ③戻り値を受け取る
        String return = function(str: "ABC");
        // ④戻り値を出力する
        System.out.println(return);
    }

    // public static voidだと戻り値を返さないということ（返す時には型を指定する）
    public static String function(String str) {
        // ①戻り値を設定する
        str = "(" + str + ")";
        // ②戻り値を返す
        return str;
    }
}
```

結果
```
(ABC)
```

main（親）はreturn, function（子）はstrとなっていますが、
親と子の戻り値を受け取る／返す時の変数名は異なっていても問題ない。
GitHubのPull Request作成画面のAssignees,Milestone,Developmentの説明とReviewersとAssigneesの違い

# ①
GitHubのプルリクエスト（Pull Request）作成画面には、いくつかの便利なオプションがあります。これらのオプションは、プルリクエストを管理しやすくし、チーム内でのコミュニケーションやタスクの進行をスムーズにするためのものです。それぞれの意味を簡単に説明します。

### 1. Assign up to 10 people to this pull request
**意味:** このプルリクエストに最大10人まで担当者を割り当てることができます。 **詳細:** プルリクエストに対して、レビューを依頼したり、特定の人にチェックしてもらいたい場合に担当者を指定できます。例えば、コードのレビューをする役割の人や、その変更に詳しい人にアサインすることで、誰がそのプルリクエストを見るべきかを明確にします。

**例:** 「この変更はAさんとBさんにレビューしてほしい」という場合、AさんとBさんを担当者として割り当てることができます。

---
### 2. Set milestone
**意味:** このプルリクエストに対してマイルストーン（進行中のプロジェクトや特定のリリース目標）を設定することができます。 **詳細:** マイルストーンは、プロジェクトの進行を追跡するための機能です。プルリクエストを特定のマイルストーンに関連付けることで、そのプルリクエストがどのプロジェクトやリリースに関係しているかを明示します。これにより、リリース計画の進捗状況を一目で把握できるようになります。

**例:** 「バージョン1.2のリリースに向けた変更」であれば、そのリリースに関連するプルリクエストを「Version 1.2」マイルストーンに設定します。

---
### 3. Use Closing keywords in the description to automatically close issues
**意味:** プルリクエストの説明に「クローズ用キーワード」を使うことで、関連するIssueを自動的にクローズすることができます。 **詳細:** GitHubには、特定のキーワードを使うとプルリクエストがマージされたときに関連するIssueを自動的にクローズする機能があります。例えば、プルリクエストの説明に「Fixes #123」や「Closes #123」と書いておくと、そのプルリクエストがマージされた瞬間に、Issue #123が自動的にクローズされます。

**例:** バグ修正のプルリクエストで、そのバグに関連するIssueが「#123」であれば、「Fixes #123」と説明に書いておくことで、プルリクエストがマージされると同時にそのIssueも解決としてクローズされます。

---
### まとめ：
* Assign up to 10 people: 最大10人までプルリクエストの担当者を割り当てて、レビューや確認を依頼できる。
* Set milestone: プルリクエストを特定のプロジェクトやリリース目標（マイルストーン）に関連付けて進捗管理をしやすくする。
* Closing keywords: プルリクエストの説明に特定のキーワードを入れることで、関連するIssueを自動的にクローズできる。

# ②
GitHubのプルリクエスト作成画面にある「Request up to 15 reviewers」と「Assignees」の違いは、レビューを依頼する人と作業の責任者の違いです。簡単に言うと、それぞれの役割が異なります。

### 1. Request up to 15 reviewers（レビューアの指定）
**意味:** プルリクエストに対して、コードレビューを依頼する人を最大15人まで指定できます。 **詳細:** 「Reviewers」として指定された人は、プルリクエストの内容をレビューする役割を持ちます。彼らの役割は、コードの品質や正確性をチェックし、必要であればフィードバックを提供することです。このレビューが完了し、承認されると、プルリクエストが進行できます。

**例:** 「このコードをチェックして意見をください」と依頼する相手をレビューアとして指定します。チーム内の技術的なアドバイザーや他の開発者が該当します。

### 2. Assignees（担当者の指定）
**意味:** このプルリクエストやIssueに対して、担当者（責任者）を指定することができます。 **詳細:** 「Assignees」として指定された人は、そのプルリクエストやIssueを解決する責任を負う人です。実際にコードを変更したり、プルリクエストを作成した人が一般的に指定されます。担当者は、問題解決や機能の追加など、タスクを実行する役割です。

**例:** 「この作業を最終的に進めている人は誰か」という責任者を明示します。一般的には、プルリクエストを作成した人や、そのプルリクエストに関するタスクを担当する人がAssigneesとして割り当てられます。

### まとめ：
* Reviewers（レビューア）: プルリクエストをレビューし、フィードバックを提供する人たち。コードの品質や修正点などを確認し、コメントや承認を行います。
* Assignees（担当者）: プルリクエストやIssueの作業や解決を実行する責任者。主にコードを書いたり、タスクを遂行する役割を持ちます。
両者は協力して作業を進めますが、Reviewersはレビュー役、Assigneesは責任者という役割の違いがあります。
mainで定義した配列を関数に引数として渡して処理する

```
public class Main{
    public static void main(String[] args) {
        // 配列 int[] array を定義
        int[] array = new int[]{9, 10, 0, 2, 87, 1000};

        for(int i = 0; i <= array.length - 2; i++) {
            if(array[j] < array[j - 1]) {
                int temp = array[j];
                array[j] = array[j - 1];
                array[j - 1] = temp;
            }
        }
        // 関数 result を呼び出し
        result(array);
    }

    // mainで定義した int[] array を引数として渡す
    public static void result(int[] array) {
        for(int i = 0; i <= array.length - 1; i++) {
            System.out.println(array[i]);
        }
    }
}
```

結果
```
0
2
9
10
87
1000
```
Go言語の文字列を対象にしたイテレーションについての考察



```go:main.go
package main

import "fmt"

func main() {
	samples := []string{"hello", "apple_π!", "これは漢字文字列"} //liststart
	for _, sample := range samples {
		for i, r := range sample {
			fmt.Println(i, r, string(r))
		}
		fmt.Println()
	} 
} 
```
**1. コードの解説**

1. スライスの定義:
   ```go
   samples := []string{"hello", "apple_π!", "これは漢字文字列"}
   ```
   - `[]string`は文字列のスライスを表します。
   - `:=`は短縮変数宣言で、型推論を使用して変数を宣言と同時に初期化します。

2. 外部ループ:
   ```go
   for _, sample := range samples {
   ```
   - `range`キーワードを使用してスライスをイテレートします。
   - `_`はインデックスを無視するためのブランク識別子です。
   - `sample`は各イテレーションで現在の文字列を表します。

3. 内部ループ:
   ```go
   for i, r := range sample {
   ```
   - 文字列`sample`に対して`range`を使用します。
   - `i`はバイトインデックス、`r`は各文字（ルーン）を表します。

4. 出力:
   ```go
   fmt.Println(i, r, string(r))
   ```
   - `i`: バイトインデックス
   - `r`: 文字のUnicodeコードポイント
   - `string(r)`: コードポイントを文字列に変換

ポイント
- Goの文字列はUTF-8エンコードされたバイト列です。
- `range`で文字列をイテレートすると、Unicodeコードポイント（ルーン）単位で処理されます。
- `i`はバイトインデックスを表すため、マルチバイト文字では連続しない値になることがあります。
- `r`はint32型で、Unicodeコードポイントを表します。

出力結果の解釈
- ASCII文字（例：英語）は1バイトなので、インデックスは1ずつ増加します。
- 非ASCII文字（例：π、漢字）は複数バイトなので、インデックスは1以上増加します。
- コードポイントは各文字のUnicode値を示します。
- `string(r)`は実際の文字を表示します。



**2. 出力結果からの考察**

1. インデックス (i)
2. Unicode コードポイント (r)
3. 実際の文字 (string(r))

iの値がイレギュラーに見える理由は、Goの文字列がUTF-8エンコーディングを使用しているためです。具体的に説明すると：

1. ASCII文字（例：英語のアルファベット）:
   これらは1バイトで表現されるため、インデックスは1ずつ増加します。

2. マルチバイト文字（例：絵文字、漢字）:
   これらは複数バイトで表現されるため、インデックスが1つの文字に対して複数増加することがあります。

考察

1. "hello": 各文字が1バイトなので、インデックスは0から4まで順に増加します。

2. "apple_π!": 
   - "apple_"までは1バイト文字なので、インデックスは0から5まで順に増加。
   - "π"はUTF-8で3バイト使用するため、インデックスが5から6に飛び、次は8になります。
   - "!"は1バイト文字なので、インデックスは8のままです。

3. "これは漢字文字列":
   各文字が3バイトで表現されるため、インデックスは3ずつ増加します（0, 3, 6, 9, 12, 15, 18）。

このように、Goの`range`ループは文字列をUTF-8エンコードされたバイト列として扱い、各文字（ルーン）の開始バイトのインデックスを返します。そのため、マルチバイト文字を含む文字列では、インデックスが連続的に増加しないように見えるのです。

これは、Goが Unicode を完全にサポートしつつ、メモリ効率の良い UTF-8 エンコーディングを使用していることの結果です。
Go言語(Golang)のmapをrangeでループした際の出力についての考察



**１. ランダムされる例**

```go:main.go
package main

import "fmt"

func main() {
	m := map[string]int{ //liststart
		"a": 1,
		"c": 3,
		"b": 2,
	}

	for i := 0; i < 3; i++ {
		fmt.Println("ループ", i)
		for k, v := range m {
			fmt.Println(k, v)
		}
	} //listend
}
```
出力結果
```
ループ 0
a 1
c 3
b 2
ループ 1
a 1
c 3
b 2
ループ 2
a 1
c 3
b 2
```

**２. 昇順に出力される例**

```go:main.go
package main

import "fmt"

func main() {
	m := map[string]int{
		"a": 1,
		"c": 3,
		"b": 2,
	}

	for i := 0; i < 5; i++ {
		fmt.Println("ループ", i)
		fmt.Println(m)
	}
}
```
出力結果
```
ループ 0
map[a:1 b:2 c:3]
ループ 1
map[a:1 b:2 c:3]
ループ 2
map[a:1 b:2 c:3]
ループ 3
map[a:1 b:2 c:3]
ループ 4
map[a:1 b:2 c:3]
```

これらの実装の違いは以下の点にあります：

1. **マップのイテレーション vs 直接出力**:
   - 上の実装では、`for k, v := range m` を使ってマップの各要素をイテレートしています。
   - 下の実装では、`fmt.Println(m)` でマップ全体を直接出力しています。

2. **出力の順序**:
   - 上の実装：Go言語のマップは、イテレーション時に要素の順序を保証しません。そのため、毎回異なる順序で出力される可能性があります。
   - 下の実装：`fmt.Println(m)` はマップ全体を一度に出力します。Go 1.12以降、`fmt.Println` はマップをキーでソートして出力するため、常に同じ順序（昇順）で表示されます。

3. **パフォーマンスと一貫性**:
   - 上の実装は各要素を個別に処理するため、大きなマップの場合はより柔軟ですが、順序が一貫しません。
   - 下の実装は常に同じ順序で出力されるため、結果が予測可能です。ただし、大きなマップの場合、ソートのオーバーヘッドが発生する可能性があります。